总体需求

假设每位学生必须完成基础课50学分,专业课50学分,选修课24学分,人文类课程8学分,实践性课程20学分才能够毕业
因此,在管理学分时,要考虑每个学分所属于的课程类别。

功能需求

1)能够通过键盘输入某位学生的学分。//该需求涵盖在下面的需求中。所以不单独在菜单中设置选项
2) 给定学号,显示某位学生的学分完成情况。
3) 给定某个班级的班号,显示该班所有学生学分完成情况。
4) 给定某位学生的学号,修改该学生的学分信息。
5) 按照某类课程的学分高低进行排序。

界面样式

输入:
程序正常运行后屏幕上显示一个文字菜单(根据序号选定相应的操作项目),当用户选定操作项目所对应的序号时,根据应用程序的提示信息,从键盘上输入相应的数据。
输出:

  1. 应用程序正常运行后,要在屏幕上显示一个文字菜单。
  2. 要求用户输入数据时,要给出清晰、明确的提示信息,包括输入的数据内容、格式及结束方式等

类设计

设计Student类
private:

姓名name,学号sid,班号cid,课程信息类Course

public:

空构造函数:给所有私有属性赋默认值,string全部为“null”,int全部为0
Student(){name="null";sid="null";cid="null";course.setBasicCla(0);course.setCultureCla(0);course.setPracticeCla(0);course.setProfessionCla(0);course.setSelectCla(0);}
setRecord(int,int ,int,int,int);//重新设置课程学分
Course* getCourse()//返回课程信息对象指针
私有属性的set,get方法
void setName(string name)
void setSid(string sid)
void setCid(string cid)
string getName()
string getSid()
string getCid()

设计Course类
private:

 int basicCla//基础课程学分int professionCla//专业课程学分int selectCla//选修课程学分int cultureCla//人文课程学分int practiceCla//实践课程学分

public:

空构造函数,默认初始化int型为0
Course(){this->basicCla=0;this->professionCla=0;this->selectCla=0;this->cultureCla=0;this->practiceCla=0;}
set,get方法:int getBasicCla()//获取基础课程学分int getProfessionCla()//获取专业课程学分int getSelectCla()//获取选修课程学分int getCultureCla()//获取人文课程学分int getPracticeCla()//获取实践课程学分void setBasicCla()//设置基础课程学分void setProfessionCla()//设置专业课程学分void setSleectCla()//设置选修课程学分void setCultureCla()//设置人文课程学分void setPracticeCla()//设置实践课程学分

程序编写流程:

void ViewBySid(string sid,Student *students);//根据学号查询学生信息
void ViewCidAll(string cid,Student *students); //根据班号查询全班信息
void changeRecord(string sid,Student *students,int basicCla,int professionCla,int selectCla,int cultureCla,int practiceCla);//重新设置课程分数
void setStudents(Student* students);//文件数据读入
void updateStudents(Student *students);//文件数据更新
void sortByRecord(int num,Student *students);//按照分数排序

业务逻辑

创建一个对象数组用来读取文件中的数据。
setStudents中进行文件流的操作,对象数组的指针传到该方法中,将文件中的数据存储到这个对象数组中
输出功能菜单,if else,else if实现对应功能的调用

设计功能菜单

1.给定学号,显示某位学生的学分完成情况。
用户界面输入学号,拿到学号后通过循环Student对象数组,该学号与Student[i].couse->getSid()比对,若比对成功,输出该学生的信息
2.给定某个班级的班号,显示该班所有学生学分完成情况。
同需求1一样,拿到班号后循环Student对象数组,然后将对应班号Student类的信息全部输出,即该班级所有学生信息
3.给定某位学生的学号,修改该学生的学分信息。
同需求1,拿到学号和学分修改信息(暂且功能为不能单独设置学分,必须传入所有课程学分),
循环数组找到对象,通过set方法更改
4.按照某类课程的学分高低进行排序。
定义一个指针数组,里边的指针元素一一指向对象数组中的对象,用排序算法(冒泡)进行排序,改变指针数组中指针的指向,然后遍历输出该数组

编写中可能遇到的问题**

问题1:c++输入和输出的问题
解决方案:
输入:

char filename[]="D://student.txt";char buff[1024]= {0};ifstream fin;fin.open(filename,ios::in);fin.getline(buff,1024);                //通过getline函数读取字符串cout<<buff<<endl;        fin.close();

写出:

 char fname[] = "d:/file1.txt";char buff[1024]= {0};/***********  写文件  *************///方式1 输出流ofstream对象调用fopen函数ofstream fout;fout.open(fname,ios::out);if(!fout){cout<<"打开文件失败"<<fname<<endl;}fout<< "hello world !";  //通过左移运算符写入字符串fout.flush();fout.close();

问题2:根据课程分数进行排序

for(int i=0;i<size-1;i++){for(int j=0;j<size-i-1;j++){Course *course=stus[j]->getCourse();Course *course2=stus[j+1]->getCourse();if(course->getProfessionCla() > course2->getProfessionCla()){Student *temp;temp=stus[j];stus[j]=stus[j+1];stus[j+1]=temp;}}}

问题3:Student类中Course还是Course*属性:
必须是course属性,因为临时在方法中创建的对象给course指针,方法的消亡,对象也会消亡,每一次调用就会创建新的对象,所以应该将Course对象作为属性,而不是它的指针。
另外,getCourse类应该返回指针,实现引用传递

问题4:文件编码格式和输入流读入编码格式不同
解决方案:文件读入时是GBK编码格式,将txt文件中的数据转为GBK格式
使用工具notePad++

问题5:提取文件中的数字字符串转换为整型数据进行存储,比如basicCla为整型,但文件是字符串。
解决方案:basicStr是字符串 int basicCla=atoi(basicStr.c_str());

完整代码

Student类

#include <string>
#include "Course.h"
using namespace std;
class Student{private:string name;string sid;string cid;Course course;public:Student(){name="null";sid="null";cid="null";}void setRecord(int basicCla,int professionCla,int selectCla,int cultureCla//重新设置课程学分 ,int practiceCla){course.setBasicCla(basicCla);course.setProfessionCla(professionCla);course.setSelectCla(selectCla);course.setCultureCla(cultureCla);course.setPracticeCla(practiceCla);}Course* getCourse(){//返回课程信息对象 return &course;}void setName(string name){this->name=name;}void setSid(string sid){this->sid=sid;}void setCid(string cid){this->cid=cid;}string getName(){return name;}string getSid(){return sid;}string getCid(){return cid;}};

Course类

#include <string>
using namespace std;class Course{private:int basicCla;//基础课程学分50int professionCla;//专业课程学分50int selectCla;//选修课程学分24int cultureCla;//人文课程学分8int practiceCla;//实践课程学分20public:Course(){this->basicCla=0;this->professionCla=0;this->selectCla=0;this->cultureCla=0;this->practiceCla=0;}int getBasicCla(){//获取基础课程学分return basicCla;}int getProfessionCla(){//获取专业课程学分return professionCla;}int getSelectCla(){//获取选修课程学分return selectCla;}int getCultureCla(){//获取人文课程学分return cultureCla;}int getPracticeCla(){//获取实践课程学分return practiceCla;}void setBasicCla(int basicCla){//设置基础课程学分this->basicCla=basicCla;}void setProfessionCla(int professionCla){//设置专业课程学分this->professionCla=professionCla;}void setSelectCla(int selectCla){//设置选修课程学分this->selectCla=selectCla;}void setCultureCla(int cultureCla){//设置人文课程学分this->cultureCla=cultureCla;}void setPracticeCla(int practiceCla){//设置实践课程学分this->practiceCla=practiceCla;}};

main.cpp逻辑代码

#include <iostream>
#include <string>
#include "fstream"
#include "Student.h"
#include "fstream"
#include <sstream>
#include<stdlib.h>//数组长度函数  int sizeof(array)
using namespace std;
const int size=5;int main(){//函数声明 void ViewBySid(string sid,Student *students);void ViewCidAll(string cid,Student *students); void changeRecord(string sid,Student *students,int basicCla,int professionCla,int selectCla,int cultureCla,int practiceCla);void setStudents(Student* students);void updateStudents(Student *students);void sortByRecord(int num,Student *students);//将文件中的数据存入对象数组中 Student students[size];setStudents(students);string strNum="";cout<<"菜单"<<endl;cout<< "1.查询某个学生信息"<<endl;cout<< "2.查询班级学生信息" <<endl;cout<< "3.修重置某个学生学分"<<endl;cout<< "4.根据学分排序" <<endl; cout<<"请输入序号选择对应功能:" ;strNum=cin.get();while(strNum!="esc") {int num=atoi(strNum.c_str());//输入 if(num==1){cout<<"请输入学生的学号"<<endl;string sid;cin>>sid;ViewBySid(sid,students);}else if(num==2){cout<<"请输入班级"<<endl;string cid;cin>> cid;ViewCidAll(cid,students);}else if(num==3){cout<<"请输入学号"<<endl;string sid;int basicCla;int professionCla;int selectCla;int cultureCla;int practiceCla;cin>>sid;cout<<"请输入基础课学分"<<endl;cin>>basicCla;cout<<"请输入专业课学分"<<endl;cin>>professionCla;cout<<"请输入选修课学分"<<endl;cin>>selectCla;cout<<"请输入文体课学分"<<endl;cin>>cultureCla;cout<<"请输入实践课学分"<<endl;cin>>practiceCla;changeRecord(sid,students,basicCla,professionCla,selectCla,cultureCla,practiceCla);}else if(num==4){cout<<"输入下列序号选择排序的种类"<<endl; cout<<"1.按照基础课程学分进行排序"<<endl;cout<<"2.按照专业课程学分进行排序"<<endl;cout<<"3.按照选修课程学分进行排序"<<endl;cout<<"4.按照文体课程学分进行排序"<<endl;cout<<"5.按照实践课程学分进行排序"<<endl;string orderNum;cin>>orderNum;int num=atoi(orderNum.c_str());sortByRecord(num,students);}updateStudents(students);cout<<endl;cout<<"继续输入序号使用其他功能,输入esc退出程序"<<endl; cin.get();cin>>strNum;}cout<<"谢谢使用!"<<endl; return 0;
}//传入学号,显示该学生的信息
void ViewBySid(string sid,Student *students){for(int i=0;i<size;i++){if(sid==students[i].getSid()){Course *course=students[i].getCourse();cout<<students[i].getName()<<"  ";cout<<students[i].getSid()<<"  ";cout<<students[i].getCid()<<"  ";cout<<course->getBasicCla()<<"  ";cout<<course->getProfessionCla()<<"  ";cout<<course->getSelectCla()<<"  ";cout<<course->getCultureCla()<<"  ";cout<<course->getPracticeCla()<<"  ";break;}}
}//传入班号,显示所有学生的信息
void ViewCidAll(string cid,Student *students){for(int i=0;i<size;i++){if(cid==students[i].getCid()){Course *course=students[i].getCourse();cout<<students[i].getName()<<"  ";cout<<students[i].getSid()<<"  ";cout<<students[i].getCid()<<"  ";cout<<course->getBasicCla()<<"  ";cout<<course->getProfessionCla()<<"  ";cout<<course->getSelectCla()<<"  ";cout<<course->getCultureCla()<<"  ";cout<<course->getPracticeCla()<<"  "<<endl;}}
}// 传入学号,修改学分信息
void changeRecord(string sid,Student *students,int basicCla,int professionCla,int selectCla,int cultureCla,int practiceCla){for(int i=0;i<size;i++){if(sid==students[i].getSid()){Course *course=students[i].getCourse();course->setBasicCla(basicCla);course->setProfessionCla(professionCla);course->setSelectCla(selectCla);course->setCultureCla(cultureCla);course->setPracticeCla(practiceCla);}}}
//将文件中信息存储到students对象数组中 void setStudents(Student* students){char filename[]="D://student.txt";ifstream fin;fin.open(filename,ios::in);if(!fin){cout<<"文件打开失败"; }for(int i=0;i<size;i++){string str;fin>>str;students[i].setName(str);fin>>str;students[i].setSid(str);fin>>str;students[i].setCid(str);fin>>str;students[i].getCourse()->setBasicCla(atoi(str.c_str()));fin>>str;students[i].getCourse()->setProfessionCla(atoi(str.c_str()));fin>>str;students[i].getCourse()->setSelectCla(atoi(str.c_str()));fin>>str;students[i].getCourse()->setCultureCla(atoi(str.c_str()));fin>>str;students[i].getCourse()->setPracticeCla(atoi(str.c_str()));}fin.close();}
//将数组信息更新到文件中 void updateStudents(Student *students){char filename[] = "D://student.txt";char buff[1024]= {0};/***********  写文件  *************///输出流ofstream对象调用fopen函数ofstream fout;fout.open(filename,ios::out);if(!fout){cout<<"打开文件失败"<<filename<<endl;}for(int i=0;i<size;i++){if(students[i].getName()==""){fout<<"null"<<" ";}else{fout<<students[i].getName()<<" ";}if(students[i].getSid()==""){fout<<"null"<<" ";}else{fout<<students[i].getSid()<<" ";}if(students[i].getCid()==""){fout<<"null"<<" ";}else{fout<<students[i].getCid()<<" ";}Course * course =students[i].getCourse();fout<<course->getBasicCla()<<" ";fout<<course->getProfessionCla()<<" ";fout<<course->getSelectCla()<<" ";fout<<course->getCultureCla()<<" ";fout<<course->getPracticeCla()<<endl;}fout.flush();fout.close();}//对某类课程的分数进行排序    通过switch让用户进行数字选择,对应相应的课程
void sortByRecord(int num,Student *students){Student *stus[5];for(int i=0;i<size;i++){stus[i]=&students[i];}if(num==1){//根据基础课程进行排序 for(int i=0;i<size-1;i++){for(int j=0;j<size-i-1;j++){Course *course=stus[j]->getCourse();Course *course2=stus[j+1]->getCourse();if(course->getBasicCla() > course2->getBasicCla()){Student *temp;temp=stus[j];stus[j]=stus[j+1];stus[j+1]=temp;}}}}else if(num==2){//根据专业课程进行排序 for(int i=0;i<size-1;i++){for(int j=0;j<size-i-1;j++){Course *course=stus[j]->getCourse();Course *course2=stus[j+1]->getCourse();if(course->getProfessionCla() > course2->getProfessionCla()){Student *temp;temp=stus[j];stus[j]=stus[j+1];stus[j+1]=temp;}}}}else if(num==3){//根据 选修课程进行排序 for(int i=0;i<size-1;i++){for(int j=0;j<size-i-1;j++){Course *course=stus[j]->getCourse();Course *course2=stus[j+1]->getCourse();if(course->getSelectCla() > course2->getSelectCla()){Student *temp;temp=stus[j];stus[j]=stus[j+1];stus[j+1]=temp;}}}}else if(num==4){//根据文体课程进行排序 for(int i=0;i<size-1;i++){for(int j=0;j<size-i-1;j++){Course *course=stus[j]->getCourse();Course *course2=stus[j+1]->getCourse();if(course->getCultureCla() > course2->getCultureCla()){Student *temp;temp=stus[j];stus[j]=stus[j+1];stus[j+1]=temp;}}}}else if(num==5){//根据实践课程进行排序 for(int i=0;i<size-1;i++){for(int j=0;j<size-i-1;j++){Course *course=stus[j]->getCourse();Course *course2=stus[j+1]->getCourse();if(course->getPracticeCla() > course2->getPracticeCla()){Student *temp;temp=stus[j];stus[j]=stus[j+1];stus[j+1]=temp;}}}}else{}for(int i=0;i<size;i++){Student stu=*stus[i];Course *course=stu.getCourse();cout<<stu.getName()<<"  ";cout<<stu.getSid()<<"  ";cout<<stu.getCid()<<"  ";cout<<course->getBasicCla()<<"  ";cout<<course->getProfessionCla()<<"  ";cout<<course->getSelectCla()<<"  ";cout<<course->getCultureCla()<<"  ";cout<<course->getPracticeCla()<<"  "<<endl;}
} 

c++课程设计(学生课程学分信息管理)相关推荐

  1. 数据库课程设计----学生信息与选课、成绩评价管理系统

    目录 一.需求分析 4 二.概念设计 5 2.1 概念模型(E-R图) 6 2.2 数据字典 6 三.逻辑结构设计 5 3.1 关系模式 6 3.2 系统结构图 6 四.物理设计 5 4.1 存储安排 ...

  2. 学生选课管理系统c语言程序报告,c语言课程设计学生选课管理系统实验报告.doc...

    课程设计报告 课程设计题目:学生选课管理系统 学 号 姓 名:李唐松 专 业:软件工程 班 级: 091107 指导老师:谢小林 2009年1月5 *实验题目: 学分管理程序 *实验时间与地点:200 ...

  3. 数据库课程设计——学生宿舍信息管理系统

    数据库课程设计--学生宿舍信息管理系统 目录 1.设计目的... 2 2.任务与要求... 2 3.学生宿舍管理系统课程设计... 2 3.1 引言... 2 3.2需求分析... 2 3.2.1. ...

  4. java学生选课系统课程设计报告_Java语言程序设计课程设计-学生选课系统

    <Java语言程序设计课程设计-学生选课系统>由会员分享,可在线阅读,更多相关<Java语言程序设计课程设计-学生选课系统(23页珍藏版)>请在人人文库网上搜索. 1.10届 ...

  5. c语言课程设计查找分数与删除元素,c语言课程设计学生成绩管理系统

    <c语言课程设计学生成绩管理系统>由会员分享,可在线阅读,更多相关<c语言课程设计学生成绩管理系统(31页珍藏版)>请在人人文库网上搜索. 1.河南理工大学计算机科学与技术学院 ...

  6. C语言成绩统计源代码,C语言课程设计学生成绩管理系统+源码

    <C语言课程设计学生成绩管理系统+源码>由会员分享,可在线阅读,更多相关<C语言课程设计学生成绩管理系统+源码(25页珍藏版)>请在人人文库网上搜索. 1.简易教学管理系统的设 ...

  7. ASP.NET程序设计课程设计——学生信息管理系统

    点击查看详细信息 ASP.NET程序设计课程设计--学生信息管理系统 一.实验目的 综合运用们所学的ASP.NET知识,开发学生信息管理系统,完成相关功能: (1)教师管理 (2)学生信息 (3)课程 ...

  8. oracle学生信息管理系统课程设计,数据库课程设计-学生信息管理系统的设计与实现.doc...

    数据库课程设计-学生信息管理系统的设计与实现 2011-2012课程设计II 学生信息管理系统的设计与实现 一 设计内容 建立一个简单的在校学生信息查询系统,可以让使用者查询到学生的一些简单的个人信息 ...

  9. java查询学生信息_分别显示女生_女生学生基本信息的代码_java课程设计学生信息管理系统_毕业论文.doc...

    java课程设计学生信息管理系统_毕业论文 学 号: 课 程 设 计 题 目学生信息管理系统学 院计算机科学与信息工程学院专 业金融信息化服务外包班 级学生姓名指导教师 2015年12月28日 课程设 ...

  10. 课程设计————学生信息管理系统(包含历代思路和代码)

    课程设计----学生管理系统(包含历代思路和代码) 一.前言 学生信息管理系统是我第一个独立完成的比较长的代码,也算是花费了一些心血,这个系统是我一点点把它从几百行的代码逐渐优化到上千行,功能从简单到 ...

最新文章

  1. 【大话设计模式】——浅谈设计模式基础
  2. kb-07线段树-12--二分查找区间边界
  3. python3对urllib和urllib2进行了重构
  4. 美国政府牵头6家公司开发新一代超算 与中国竞争
  5. 日照油库系统推荐_生产车间用什么地坪好?这款地面硬化系统使用一年后获车间主任点赞:太省心!| 项目回访...
  6. 给Source Insight做个外挂系列之四--分析“Source Insight”
  7. 利用微信登录掘金网站的HTTP请求分析
  8. python leetcode_leetcode 刷题经验,主力 python
  9. ext 浅谈类的实例
  10. ul、li列表简单实用代码实例
  11. datatype未定义是什么意思_vue.js一直提示未定义
  12. 获取ajax传过来的数据_大数据编辑问题
  13. sap原因代码配置路径_使用Visual Studio Code编写和激活ABAP代码 (上)
  14. PADS layout 显示叉X怎么回事?
  15. IOS 本地图片加载
  16. apache-hive-3.1.0-bin.tar.gz 下载
  17. android nexus 刷机工具包,Android Nexus 6p刷机及root
  18. 学术会议论文查重吗_会议论文会不会进行摘要查重?
  19. ajax加载图片使用,Lightbox–Ajax加载下图片灯箱的使用
  20. Symbol的基本使用

热门文章

  1. SQL的约束作用,创建与删除
  2. 实现PMO价值的若干经验
  3. LED灯关灯时微亮问题原因及解决办法
  4. npm基本使用--npm淘宝镜像设置、常用命令
  5. linux泛目录,首页—泛目录站群程序—首页
  6. 03 K近邻法——读书笔记
  7. oracle修改表名
  8. mysql修改表名几种方式_Oracle数据库中修改表名的几种方式
  9. python画图goto的意思_在python中怎么实现goto功能
  10. C语言关键字:goto