用C++设计一个简单的学籍管理系统

一、面向对象程序设计课程设计的目的

本课程设计是在学习面向对象基本理论之后的实践教学环节。该实践教学是软件设计的综合训练,包括问题分析、总体结构设计、用户界面设计、程序设计基本技能和技巧。要求学生在设计中逐步提高程序设计能力,培养科学的软件工作方法。学生通过课程设计在下述各方面得到锻炼:

  • 能根据实际问题的具体情况,结合面向对象的基本理论和基本技巧,正确分析问题,并能设计出解决问题的有效算法与程序。
  • 提高程序设计和调试能力。学生通过上机实习,验证自己设计的算法和程序的正确性。学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改,进一步提高程序设计水平。

二、实验题目

使用下面的数据,用 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 年内的学习方向,同时也为自己积累很多宝贵的经验,而这些经验平时是很难得到的。

猜你喜欢

转载自blog.csdn.net/newlw/article/details/125145185
今日推荐