一、面向对象程序设计课程设计的目的
本课程设计是在学习面向对象基本理论之后的实践教学环节。该实践教学是软件设计的综合训练,包括问题分析、总体结构设计、用户界面设计、程序设计基本技能和技巧。要求学生在设计中逐步提高程序设计能力,培养科学的软件工作方法。学生通过课程设计在下述各方面得到锻炼:
- 能根据实际问题的具体情况,结合面向对象的基本理论和基本技巧,正确分析问题,并能设计出解决问题的有效算法与程序。
- 提高程序设计和调试能力。学生通过上机实习,验证自己设计的算法和程序的正确性。学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改,进一步提高程序设计水平。
二、实验题目
使用下面的数据,用 C++ 设计一个简单的学籍管理系统,实现出最基本的功能。
学生基本信息文件(A.TXT)及其内容:
A.TXT文件内容可以不通过编程录入数据,可用文本编辑工具直接生成(也可通过编程录入)
学号 姓名 性别 宿舍号码 电话号码
01 张成成 男 501 87732111
02 李成华 女 101 87723112
03 王成凤 女 101 87723112
04 张明明 男 502 87734333
05 陈东 男 501 87732111
06 李果 男 502 87734333
07 张园园 女 102 87756122
… …. … … …………
学生成绩基本信息文件(B.TXT)及其内容:
学号 课程编号 课程名称 学分 平时成绩 实验成绩 卷面成绩 综合成绩 实得学分
01 A01 大学物理 3 66 78 82
02 B03 高等数学 4 78 -1 90
01 B03 高等数学 4 45 -1 88
02 C01 VF 3 65 76 66
功能要求及说明:
(1)数据录入功能: 对 B.TXT 进行数据录入,只录入每个学生的学号、课程编号、课程名称、学分、平时成绩、实验成绩、卷面成绩共 7 个数据. 综合成绩、学分由程序根据条件自动运算。
综合成绩的计算:如果本课程的实验成绩为-1,则表示无实验,综合成绩=平时成绩 30%+ 卷面成绩 70%; 如果实验成绩不为-1,表示本课程有实验,综合成绩=平时成绩15%+ 实验成绩.15%+ 卷面成绩*70% .
实得学分的计算: 采用等级学分制.
综合成绩在 90-100 之间 ,应得学分=学分100% 综合成绩在 80-90 之间 ,应得学分=学分80%
综合成绩在 70-80 之间 ,应得学分=学分75% 综合成绩在 60-70 之间 ,应得学分=学分60%
综合成绩在 60 以下 ,应得学分=学分*0%
(2)查询功能:分为学生基本情况查询和成绩查询两种
A:学生基本情况查询:
----输入一个学号或姓名(可实现选择),查出此生的基本信息并显示输出。
—输入一个宿舍号码,可查询出本室所有的学生的基本信息并显示输出。
B:成绩查询:
B1:输入一个学号时,查询出此生的所有课程情况,格式如下:
学 号:xx 姓 名:xxxxx
课程编号:xxx 课程名称:xxxxx 综合成绩:xxxx 实得学分: xx
课程编号:xxx 课程名称:xxxxx 综合成绩:xxxx 实得学分: xx
课程编号:xxx 课程名称:xxxxx 综合成绩:xxxx 实得学分: xx
… … … … ……… … …
共修:xx科,实得总学分为: xxx
(3)删除功能:当在 A.TXT 中删除一个学生时,自动地在 B.TXT 中删除此人所有信息。
(4)排序功能:能实现选择按综合成绩或实得学分升序或降序排序并显示数据。
三、实验思路
1. 需求分析
根据题目需要,要实现的功能有对数据的录入、查询、排序、删除,要实现的类别有,学生基本信息(学号 姓名 性别 宿舍号码 电话号码)、学生成绩基本信息文件(学号 课程编号 课程名称 学分 平时成绩 实验成绩 卷面成绩 综合成绩 实得学分)。
因此,设计出类和成员为:
类名:person (基类,实现录入学号 姓名 性别 宿舍号码 电话号码)
student(派生类,实现录入、查询、排序、删除)
函数成员:
- Person:: add();录入 A.txt 的数据
- Student:: add2();录入 B.txt 的数据
- Student:: grade();录入学生成绩等
- Student:: menue();显示主菜单
- Student:: reader();显示查询功能的选择项
- Student:: searchname();按姓名查询
- Student:: searchroom();按宿舍号码查询
- Student:: searchnumber();按学号查询
- Student:: disp();显示查询学生的基本信息
- Student:: room1(){return room;};宿舍号
- Student:: number1(){return number;};学号
- Student:: searchgrade();按学分查询
- Student:: gradedisp();显示分数
- Student:: dispname();显示按姓名查询的结果
- Student:: paixu();排序
数据成员:
char name[10];姓名 char* sex;性别 int number;学号 int room;宿舍号 char tel[20]; 电话号码 char cnum[5];课程号 char cname[15]; 课程名 int xuefen;学分 int pingshif;平时分 int shiyanf ;实验分 int juanmianf ;卷面分
通过调用不同函数成员,运用类的继承多态,实 现各种数据的增删查改。
2. 功能模块设计
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C7ld1L5D-1654494264191)(https://www.writebug.com/myres/static/uploads/2022/6/5/fe4a449e8788104fa87b901de21db393.writebug)]
录入分数数据模块的流程图
以下是查找模块的流程图:
四、实现过程
#include "stdafx.h"
#include"iostream"
#include"fstream"
#include"iomanip"
using namespace std;
class person//基本信息
{
public:
void add();
protected:
char name[10];
char* sex;
};
class student:public person//继承 person 类
{
public:
void add();
void add2();
void grade();
void menue();
void reader();
void searchname();
void searchroom();
void searchnumber();
void disp();
int room1(){return room;};
int number1(){return number;};
void searchgrade();
double gradedisp();
void dispname();
void paixu();
private:
int number;
int room;
char tel[20];//定义学号 宿舍号 电话号码
char cnum[5];
char cname[15];
int xuefen;
int pingshif;
int shiyanf;
int juanmianf;
double totalxuefen;
double score;//定义课程号 课程名 学分 平时成绩 实验成绩 卷面成绩 综合分 总学分
};
bool comp(char s1[],char s2[]); //比较两个字符串相等
void person::add()
{
char choose;
cout<<"请输入姓名: ";
cin>>name;
cout<<endl;
label1:cout<<"请选择性别:"<<"\t";
cout<<"A、男"<<"\t"<<"B、女"<<endl;
cout<<"请输入你的选择:";
cin>>choose;
if(choose=='a'||'A')
sex="男";
else if(choose=='b'||'B')
sex="女";
else {cout<<"输入有误,请重新选择!"<<endl;
goto label1;};
}
void student::disp()//显示
{
cout<<endl<<" 姓 名: "<<name<<endl;
cout<<" 学 号: "<<number<<endl;
cout<<" 性 别: "<<sex<<endl;
cout<<" 电话号码: "<<tel<<endl<<endl;
}
void student::dispname()
{cout<<name;}
void student::add()
{
cout<<"*******************************录入学生信息*******************************"<<endl;
cout<<"请输入学号: ";
cin>>number;
cout<<endl;
person::add();
cout<<"请输入宿舍号: ";
cin>>room;
cout<<endl;
cout<<"请输入电话号码: ";
cin>>tel;
cout<<endl;
}
void student::add2()//写入函数
{
student a;
a.add();
fstream file("a.txt",ios::out|ios::app); //打开文件,指针指向文件尾
file.write((char*)&a,sizeof(a));//把类信息写入文件
file.close(); //关闭文件
cout<<"信息已经被保存"<<endl;
}
void student::searchname()//按姓名查询
{
cout<<"请输入所要查询的学生姓名: ";
char name2[10];
cin>>name2;
student a;
fstream file("a.txt",ios::in);//打开文件,指针在文件头
file.read((char*)&a,sizeof(a)); //读取类信息
while(!file.eof()) //判断文件指针是否到文件尾
{
if(comp(a.name,name2)) //判断输入的字符是否与文件中的一样
a.disp(); //如一样的话,显示信息
file.read((char*)&a,sizeof(a));//如果指针没到文件尾,继续读取
}
file.close(); //关闭文件
}
void student::searchroom()
{
cout<<"请输入所要查询的宿舍号: ";
int roomnum;
cin>>roomnum;
student a; //第一个学生类的对象
fstream file("a.txt",ios::in); //打开文件,指针在文件头
file.read((char*)&a,sizeof(a)); //读取类信息
while(!file.eof()) //判断指针是否在文件尾
{
if(a.room1()==roomnum) //判断输入宿舍号是否与文件中的宿舍号一样
a.disp(); //如果一样的话,显示信息
file.read((char*)&a,sizeof(a)); //如果指针没到文件尾,继续读取
}
file.close(); //关闭文件
}
void student::searchnumber()//按学号查询
{
cout<<"请输入所要查询的学号:";
int number2;
cin>>number2; //输入学号
student a; //第一个学生类的对象
fstream file("a.txt",ios::in); //二进制打开文件。指针在文件头
file.read((char*)&a,sizeof(a)); //读取类信息
while(!file.eof()) //判断指针是否在文件尾
{
if(a.number1()==number2) //判断输入的学号是否与文件中的一样
a.disp();
file.read((char*)&a,sizeof(a));//如果指针没到文件尾,继续读取
}
file.close(); //关闭文件
}
void student::menue()
{
cout<<" *******************学生管理系统************************* "<<endl;
cout<<" * *"<<endl;
cout<<" * 1、 添加学生信息 *" <<endl;
cout<<" * 2、 添加学生成绩 * "<<endl;
cout<<" * 3、 查询学生信息 *"<<endl;
cout<<" * 4、 查询学生成绩 *"<<endl;
cout<<" * 5、 学生成绩排序 *"<<endl;
cout<<" * 6、 退出系统 *"<<endl;
cout<<" * *"<<endl;
cout<<" ******************************************************** "<<endl;
}
void student::reader()
{
cout<<" *******************查询学生信息************************* "<<endl;
cout<<" * *"<<endl;
cout<<" * 1、 按姓名查询 *"<<endl;
cout<<" * 2、 按学号查询 *"<<endl;
cout<<" * 3、 按宿舍号查询 *"<<endl;
cout<<" * 4、 返回主菜单 * "<<endl;
cout<<" ********************************************************"<<endl;
}
bool comp(char s1[],char s2[]) //比较文件中字符和输入的字符是否相同
{
int i=0;
while(s1[i]!='\0'&&s2[i]!='\0'&&s1[i]==s2[i])
i++;
if(s1[i]=='\0' &&s2[i]=='\0')
return 1;
else
return 0;
};
void student::grade()
{
cout<<"*******************************录入学生成绩*******************************"<<endl;
cout<<"请输入学号: ";
cin>>number;
cout<<endl;
cout<<"请输入课程号: ";
cin>>cnum;
cout<<endl;
cout<<"请输入课程名: ";
cin>>cname;
cout<<endl;
label2:cout<<"请输入学分: ";
cin>>xuefen;
if(!(xuefen>=0&&xuefen<=10))
{cout<<"输入错误,请输入0到10的整数:"<<endl;
goto label2;}
cout<<endl;
label3:cout<<"请输入平时成绩: ";
cin>>pingshif;
if(!(pingshif>=0&&pingshif<=100))
{cout<<"输入错误,请输入0到100的整数:"<<endl;
goto label3;}
cout<<endl;
label4:cout<<"请输入实验成绩: ";
cin>>shiyanf;
if(!(shiyanf>=-1&&shiyanf<=100))
{cout<<"输入错误,范围是-1到100的整数:"<<endl;
goto label4;}
cout<<endl;
cout<<"请输入卷面成绩: ";
cin>>juanmianf;
cout<<endl;
};
void student::searchgrade()
{
cout<<"请输入所要查询的学号: ";
int gradenum,i;
double t;
totalxuefen=0;
i=0;
cin>>gradenum;
student b;//定义一个学生类的对象
fstream file("b.txt",ios::in);
file.read((char*)&b,sizeof(b));//打开文件。指针在文件头
//读取类信息
while(!file.eof()) //判断指针是否在文件尾
{
if(b.number1()==gradenum) //判断输入学号是否与文件中的学号一样
{
t=b.gradedisp(); //如果一样的话,显示信息
i++;
totalxuefen=totalxuefen+t;
}
file.read((char*)&b,sizeof(b));
//如果指针没到文件尾,继续读取
}
file.close();
cout<<"共 修:"<<i<<"科"<<"\t"<<"\t"<<"实得总学分:"<<totalxuefen<<endl;
};
double student::gradedisp()
{
double p;
student a;
if(shiyanf==-1)
p=pingshif*0.3+juanmianf*0.7;
else p=pingshif*0.15+shiyanf*0.15+juanmianf*0.7;
if(p>=90&&p<=100)
score=xuefen*1;
else if(p>=80&&p<90)
score=xuefen*0.8;
else if(p>=70&&p<80)
score=xuefen*0.75;
else if(p>=60&&p<70)
score=xuefen*0.6;
else score=xuefen*0;
cout<<endl;
cout<<"学 号:"<<number<<"\t"<<"姓 名:";
fstream file("a.txt",ios::in); //打开文件,指针在文件头
file.read((char*)&a,sizeof(a)); //读取类信息
while(!file.eof()) //判断指针是否在文件尾
{
if(a.number1()==number) //判断输入学号是否与文件中的学号一样
{a.dispname(); //如果一样的话,显示信息
break;}
file.read((char*)&a,sizeof(a)); //如果指针没到文件尾,继续读取
}
file.close(); //关闭文件
cout<<endl;
cout<<"课程编号:"<<cnum<<"\t"<<"课程名称:"<<cname<<"\t"<<"综合成绩:" <<p<<"\t"<<"实得学分:"<<score<<endl;
return score;
}
void student::paixu()
{
int n;
int t,m;
student dd[30];
ifstream file;
file.open("b.txt",ios_base::in|ios_base::binary);
for(n=0;n<30;n++)
{
file.read(reinterpret_cast<char*>(&dd[n]),sizeof(student));
}
file.close();
for(int i=0;i<30;i++)
for(int j=0;j<30;j++)
{
if(dd[i].xuefen>dd[j].xuefen)
{
t=dd[i].xuefen;
dd[i].xuefen=dd[j].xuefen;
dd[j].xuefen=t;
m=dd[i].number;
dd[i].number=dd[j].number;
dd[j].number=m;
}
}
cout<<"学号:"<<" "<<"学分:"<<endl;
for(int i=0;i<30;i++)
cout<<dd[i].number<<" "<<dd[i].xuefen<<endl;
};
void main() //主程序
{
student a;
int x1,x2;
do
{
a.menue();//主菜单
cout<<"请选择你的操作:";
cin>>x1;//输入选项
switch(x1)//主菜单选择
{
case 1:
a.add2 ();
break;
case 2:
{
a.grade();
fstream file("b.txt",ios::out|ios::app); //打开文件,指针指向文件尾
file.write((char*)&a,sizeof(a));//把类信息写入文件
file.close();
cout<<"信息已经保存"<<endl;
break;
}
case 3:
do
{
a.reader();
cout<<"请输入操作号:";
cin>>x2;
switch(x2)
{
case 1:
a.searchname();
break;
case 2:
a.searchnumber();
break;
case 3:
a.searchroom();
break;
}
}while(x2!=4);break;
case 4:
a.searchgrade();
break;
case 5:
a.paixu();
break;
}
}while(x1!=6);
cout<<"************************ 成功退出本系统!!!********************************";
cout<<endl;
}
五、程序运行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qlgQLSFE-1654494264195)(https://www.writebug.com/myres/static/uploads/2022/6/5/cadde6272edc6d8fc5fd52fd48bb3349.writebug)]
六、实验总结
在程序在录入数据和查询方面还是比较成功的,问题主要出现在排序和删除功能上面,对排序而言,只实现了对学分的排序,而没有实现对综合分和是的学分的排序。而删除则是因为没有了解文件的储存读取过程,无法实现对 2 个文件的同步操作。原因是缺少对课本第 11 章的了解,对文件的录入还缺少理解。不过通过实验发现自己的不足,我会去不断学习,加深对不足之处的理解。
七、实验心得
课程设计给了我一个很好的提高动手能力的机会,平常只是在头脑中去抽象的记忆、理解那些课本上的理论知识。有的理论知识很好懂,但是有的理论知识确是晦涩难懂的,甚至只是靠自己的死记硬背去记住。
有关 C++ 课程设计的心得体会,总的来说,受益匪浅。在这些天中,我学到了许多关于 C++ 的知识,关于文件读取、录入,建立结构体、类的继承与派生的一系列对自己来说还是懵懂的知识。也逐渐体会到了这门学科的深奥与庞大。并且对它产生了浓厚的兴趣,也认真去读书本的知识,并上网查阅了不少资料。虽然现在懂的还不是很多,但起码会编写一些简单的代码。并且感觉到创造思维在其中也起到不小的作用。希望在今后的生活中,C++ 能给我更多的帮助。
通过本次的课程设计我学到了学多的知识,学会了类的一些基本使用方法,培养了独立思考问题解决问题的能力,加深了对 C++ 知识的理解,巩固了学习知识,有助于今后的学习。总之,在这次的课程设计过程中,我收获了很多,即为我的以后学习设计有很大的帮助,也为将来的人生之路做好了一个很好的铺垫。认识到了将来 2 年内的学习方向,同时也为自己积累很多宝贵的经验,而这些经验平时是很难得到的。
的理解。
七、实验心得
课程设计给了我一个很好的提高动手能力的机会,平常只是在头脑中去抽象的记忆、理解那些课本上的理论知识。有的理论知识很好懂,但是有的理论知识确是晦涩难懂的,甚至只是靠自己的死记硬背去记住。
有关 C++ 课程设计的心得体会,总的来说,受益匪浅。在这些天中,我学到了许多关于 C++ 的知识,关于文件读取、录入,建立结构体、类的继承与派生的一系列对自己来说还是懵懂的知识。也逐渐体会到了这门学科的深奥与庞大。并且对它产生了浓厚的兴趣,也认真去读书本的知识,并上网查阅了不少资料。虽然现在懂的还不是很多,但起码会编写一些简单的代码。并且感觉到创造思维在其中也起到不小的作用。希望在今后的生活中,C++ 能给我更多的帮助。
通过本次的课程设计我学到了学多的知识,学会了类的一些基本使用方法,培养了独立思考问题解决问题的能力,加深了对 C++ 知识的理解,巩固了学习知识,有助于今后的学习。总之,在这次的课程设计过程中,我收获了很多,即为我的以后学习设计有很大的帮助,也为将来的人生之路做好了一个很好的铺垫。认识到了将来 2 年内的学习方向,同时也为自己积累很多宝贵的经验,而这些经验平时是很难得到的。