课程设计:c++实现学生成绩管理系统

    学生成绩管理系统课程设计,作为计算机科学专业学生的一门必修课,印象非常深刻,上机,编码,写报告,答辩,最后很多人勉强完成了功课,但是却很少能学到东西,算是一种遗憾吧,即使我们毕业了,仍然会想回去再做一遍。

    今天就来复习一遍这个课题,也让自己学习学习。

    学生成绩管理系统,对于刚学编程的人来说,是有一些难度的,有循环要考虑,还需要注意界面打印,菜单管理,输入输出控制,文件读写操作,排序算法等等技巧。

    学生成绩管理系统,可以分为如下几个功能:

     

    系统菜单:首先进入系统,我们会看见我们的系统菜单,根据提示,我们可以选择我们需要的操作编号:

    

    输入学生成绩:该功能是每次录入都会将新录入信息替换原来的学生成绩信息,仅限初次使用,后续慎用,类似新增,但是它是每次都会擦除原来学生信息。

    

    统计学生成绩:将学生成绩按照平均分显示,是一个简单的输出。

    

    查找学生成绩:按照学生学号查询。

    

    修改学生成绩:这里只是将对应学号的学生成绩修改,而不是连班级、学号、姓名也改变。

    

    修改之后:

    

    删除学生成绩:按照学号删除对应学生成绩信息记录。

    

    删除之后,学号为3的成绩记录就没有了:

    

    新增学生成绩:在原来学生成绩的基础上,新增学生成绩信息。

    

    按平均分排序:按照平均分降序排序,这里使用了简单的冒泡排序算法。

    

    显示学生成绩:遍历所有学生成绩,然后打印出来。

    

    退出管理系统: 退出菜单。

    学生成绩管理系统,主要是管理学生成绩信息的,这里可以简单的理解有这么一个对象,包含班级、学号、姓名、电子成绩、C++成绩、多媒体成绩、英语成绩、数学成绩、大学物理成绩、体育成绩、政治成绩,平均分这几项属性。这样我们可以定义这样的一个学生Student结构体或者类:

class Student{
private:
  char class_0[20]; //班级,因为class是关键字,我们用了class_0来表示班级
  int num;          //学号
  char name[8];     //姓名  姓名定义的长度是8,如果输入拼音或者英文,很有可能超出这个范围,要小心处理。
  float elec;       //电子
  float c_program;  //C++
  float media;      //多媒体
  float english;    //大学英语
  float math;       //高等数学
  float sport;      //体育
  float polity;     //政治
  float average;    //平均分  
}stu[100];

    课程分数实际上都是整数,很难有小数点,但是平均分大概率是一个浮点数,所以必须用浮点数表示。但是使用浮点数表示分数也没有问题。 

    因为数据来源于文本文件,所以这里对文件读写操作非常频繁,涉及到读写操作的:1:输入,4:删除,5:修改,6:新增,7:排序。这些操作都有一个共同的特点,就是需要写入操作(Write)。这里因为是文件系统,没有办法做到增量修改,每次只能是覆盖式的写入。为了保留原来的纪录,可能还需要读取操作(Read)。

    这个程序,如果第一次运行,没有进行学生信息录入,即菜单项中的[1]输入学生成绩,默认如果执行[8]显示所有学生成绩,会报错,因为没有score.txt文件生成,只有进行了[1]操作之后,才会生成这个文件,所以为了避免程序报错,我们可以在项目路径下创建一个score.txt文件。

    默认,我们手动创建的这个文件中如果有中文,编码默认是UTF-8,保存之后,显示在界面上,会显示乱码,因为cmd终端默认的编码是ANSI格式,所以这个文件我们需要保存为ANSI格式,才能正确显示中文。

    初始文件score.txt格式如下:

2

10601	2	刘莹	86	84	90	80	88	82	85	85
10601	1	吴昊	89	90	91	90	89	91	90	90

    该文件第一行,表示学生成绩总数,这个数字需要我们手动写入到文件里面,后面换行才是学生成绩,没有列标题,依次对应:班级、学号、姓名、电子成绩、C++成绩、多媒体成绩、英语成绩、数学成绩、大学物理成绩、体育成绩、政治成绩、平均分。一条记录占一行。

     读的时候,首先读取记录数,然后按行读取学生成绩信息,所以有这样的代码:

    

    同理,写入文件的时候,我们也要先写入记录数,然后依次写入学生成绩信息:

     

    我们没有使用很复杂的数据结构,这里就是利用了数组来操作学生成绩,涉及到修改的操作,基本就是先将文本文件中的数据读入数组,然后操作数组来实现新增,修改,删除,排序操作,最后将新的数组写入文件成为新的文件。 

     下面给出源码:

#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE)
#define _CRT_SECURE_NO_DEPRECATE
#endif
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
class Student{
public:
	friend void Input(Student stu[]);
	friend void Statistic(Student stu[]);
	friend void Lookup(Student stu[]);
	friend void Modify(Student stu[]);
	friend void Delete(Student stu[]);
	friend void Output(Student stu[]);
	friend void Insert(Student stu[]);
	friend void Sort(Student stu[]);
	friend void Write(Student stu[],int n);
	friend int Read(Student stu[]);
private:
	int num;
	char name[8];
	char class_0[20];
	float elec;
	float c_program;
	float english;
	float math;
	float media;
	float sport;
	float polity;
	float average;
	int order;
}stu[100];

void Write(Student stu[], int n) {
	fstream myFile;
	myFile.open("score.txt", ios::out | ios::binary);
	if (!myFile) {
		cout << "score.txt can't open!" << endl;
		abort();
	}
	int count = n;
	myFile << count << endl<<endl;
	for (int i = 0; i < count; i++) {
		myFile << stu[i].class_0  << "\t"
			   << stu[i].num      << "\t"
			   << stu[i].name     << "\t"
			   << stu[i].elec     << "\t"
			   << stu[i].c_program<< "\t"
			   << stu[i].media    << "\t"
			   << stu[i].english  << "\t"
			   << stu[i].math     << "\t"
			   << stu[i].sport    << "\t"
			   << stu[i].polity   << "\t"
			   << stu[i].average  << endl;
	}
	myFile.close();
}

int Read(Student stu[]) {
	fstream myFile;
	myFile.open("score.txt", ios::in | ios::binary);
	if (!myFile) {
		cout << "score.txt can't open!" << endl;
		abort();
	}
	int count;
	myFile.seekg(0);
	myFile >> count;
	for (int i = 0; i <= count; i++) {
		myFile >> stu[i].class_0 >> stu[i].num       >> stu[i].name 
			   >> stu[i].elec    >> stu[i].c_program >> stu[i].media 
			   >> stu[i].english >> stu[i].math      >> stu[i].sport 
			   >> stu[i].polity  >> stu[i].average;
	}
	myFile.close();
	return count;
}

void Input(Student stu[]) {
	system("cls");
	int i = 0;
	int flag;
	char sign = '0';
	cout << endl<<"======>>    请输入学生成绩    <<======"<<endl;
	while (sign != 'n' && sign != 'N') {
		cout << "班级:";
		cin >> stu[i].class_0;
	loop:
		cout << "学号:";
		cin >> stu[i].num;
		int c = 0;
		while (c < i) {
			c++;
			if (stu[i].num == stu[i - c].num) {
				cout << "您输入的学号已存在!请重新输入。" << endl;
				goto loop;
			}
		}
		cout << "姓名:";
		cin >> stu[i].name;
		do {
			flag = 0;
			cout << "电子技术成绩:";
			cin >> stu[i].elec;
			if (stu[i].elec > 100 || stu[i].elec < 1) {
				cout << " 对不起,请输入1-100之间的数字!!\n";
			}
			else {
				flag = 1;
			}
		} while (flag == 0);
		do {
			flag = 0;
			cout << "C++程序设计成绩:";
			cin >> stu[i].c_program;
			if (stu[i].c_program > 100 || stu[i].c_program < 1) {
				cout << " 对不起,请输入1-100之间的数字!!\n";
			}
			else {
				flag = 1;
			}
		} while (flag == 0);
		do {
			flag = 0;
			cout << "多媒体技术成绩:";
			cin >> stu[i].media;
			if (stu[i].media > 100 || stu[i].media < 1) {
				cout << " 对不起,请输入1-100之间的数字!!\n";
			}
			else {
				flag = 1;
			}
		} while (flag == 0);
		do {
			flag = 0;
			cout << "大学英语成绩:";
			cin >> stu[i].english;
			if (stu[i].english > 100 || stu[i].english < 1) {
				cout << " 对不起,请输入1-100之间的数字!!\n";
			}
			else {
				flag = 1;
			}
		} while (flag == 0);
		do {
			flag = 0;
			cout << "高等数学成绩:";
			cin >> stu[i].math;
			if (stu[i].math > 100 || stu[i].math < 1) {
				cout << " 对不起,请输入1-100之间的数字!!\n";
			}
			else {
				flag = 1;
			}
		} while (flag == 0);
		do {
			flag = 0;
			cout << "大学体育成绩:";
			cin >> stu[i].sport;
			if (stu[i].sport > 100 || stu[i].sport < 1) {
				cout << " 对不起,请输入1-100之间的数字!!\n";
			}
			else {
				flag = 1;
			}
		} while (flag == 0);
		do {
			flag = 0;
			cout << "马克思主义基本原理成绩:";
			cin >> stu[i].polity;
			if (stu[i].polity > 100 || stu[i].polity < 1) {
				cout << " 对不起,请输入1-100之间的数字!!\n";
			}
			else {
				flag = 1;
			}
		} while (flag == 0);
		stu[i].average = (stu[i].elec + stu[i].c_program + stu[i].media + stu[i].english + stu[i].math +
			stu[i].sport + stu[i].polity) / 7;
		cout << " 平均分为:" << stu[i].average<<endl;
		cout << "======>>    提示:是否继续写入学生成绩 ?(y/n)";
		cin >> sign;
		i++;
	}
	Write(stu, i);
}

void Statistic(Student stu[]) {
	system("cls");
	int n = Read(stu);
	cout << endl << "======>>    输出学生统计数据    <<======\n" << endl;
	cout << "---------------------------------------" << endl;
	cout << "班级" << "\t" << "学号" << "\t" << "姓名" << "\t" << "平均分" << endl;
	cout << "---------------------------------------" << endl;
	for (int i = 0; i < n; i++)
		cout << stu[i].class_0 << "\t" << stu[i].num << "\t" << stu[i].name << "\t" << stu[i].average << endl;
	cout << "---------------------------------------" << endl;
	system("pause");
}

void Lookup(Student stu[]) {
	system("cls");
	int n = Read(stu);
	int s;
	int i = 0;
	cout << endl << "======>>    查找学生成绩    <<======" << endl;
	cout << "请输入要查找学生的学号:";
	cin >> s;
	while ((stu[i].num - s) != 0 && i < n)i++;
	if (i == n) {
		cout << "======>>    对不起,无法找到该学生......    <<======" << endl;
	}
	else {
		cout << "----------------------------" << endl;
		cout << "班级:" << stu[i].class_0 << endl;
		cout << "学号:" << stu[i].num << endl;
		cout << "姓名:" << stu[i].name << endl;
		cout << "电子技术:" << stu[i].elec << endl;
		cout << "C++程序设计:" << stu[i].c_program << endl;
		cout << "多媒体技术:" << stu[i].media << endl;
		cout << "大学英语:" << stu[i].english << endl;
		cout << "高等数学:" << stu[i].math << endl;
		cout << "大学体育:" << stu[i].sport << endl;
		cout << "马克思主义基本原理:" << stu[i].polity << endl;
		cout << "平均分:" << stu[i].average << endl;
	}
}

void Modify(Student stu[]) {
	system("cls");
	int n = Read(stu);
	int s;
	int i = 0;
	cout << endl << "======>>    修改学生成绩    <<======" << endl;
	cout << "请输入要修改成绩学生的学号:";
	cin >> s;
	while ((stu[i].num - s) != 0 && i < n)i++;
	if (i == n) {
		cout << "======>>    对不起,无法找到该学生......    <<======" << endl;
	}
	else {
		cout << "------------------------------------------------------------------------------------" << endl;
		cout << "班级" << "\t" << "学号"  << "\t" << "姓名" << "\t"
			 << "电子" << "\t" << "C++"  << "\t" << "多媒体" << "\t"
			 << "英语" << "\t" << "数学"  << "\t" << "体育" << "\t"
			 << "政治" << "\t" << "平均分" << endl;
		cout << "------------------------------------------------------------------------------------" << endl;
		cout << stu[i].class_0 << "\t" << stu[i].num       << "\t" << stu[i].name  << "\t"
			 << stu[i].elec    << "\t" << stu[i].c_program << "\t" << stu[i].media << "\t"
			 << stu[i].english << "\t" << stu[i].math      << "\t" << stu[i].sport << "\t"
			 << stu[i].polity  << "\t" << stu[i].average   << endl;
		cout << endl << "请重新输入该学生成绩: " << endl;
		cout << "电子技术成绩:";
		cin >> stu[i].elec;
		cout << "C++成绩:";
		cin >> stu[i].c_program;
		cout << "多媒体技术成绩:";
		cin >> stu[i].media;
		cout << "大学英语成绩:";
		cin >> stu[i].english;
		cout << "高等数学成绩:";
		cin >> stu[i].math;
		cout << "大学体育成绩:";
		cin >> stu[i].sport;
		cout << "马克思主义基本原理成绩:";
		cin >> stu[i].polity;
		stu[i].average = (stu[i].elec + stu[i].c_program + stu[i].media +
			stu[i].english + stu[i].math + stu[i].sport + stu[i].polity) / 7;
		cout << "平均分:" << stu[i].average << endl;

		char c;
		cout << "======>>    是否保存数据 ?(y/n)";
		cin >> c;
		if (c != 'n' && c != 'N')
			Write(stu, n);
	}
}

void Delete(Student stu[]) {
	system("cls");
	int n = Read(stu);
	int s;
	int i = 0, j ;
	cout << endl << "======>>    删除学生成绩    <<======" << endl;
	cout << "请输入要删除的学生的学号:";
	cin >> s;
	while ((stu[i].num - s) != 0 && i < n)i++;
	if (i == n) {
		cout << "======>>    对不起,无法找到该学生......    <<======" << endl;
	}
	else {
		for (j = i; j < n - 1; j++) {
			strcpy(stu[j].class_0,stu[j + 1].class_0);
			stu[j].num = stu[j + 1].num;
			strcpy(stu[j].name, stu[j + 1].name);
			stu[j].elec = stu[j + 1].elec;
			stu[j].c_program = stu[j + 1].c_program;
			stu[j].media = stu[j + 1].media;
			stu[j].english = stu[j + 1].english;
			stu[j].math = stu[j + 1].math;
			stu[j].sport = stu[j + 1].sport;
			stu[j].polity = stu[j + 1].polity;
			stu[j].average = stu[j + 1].average;
		}
		cout << "======>>    提示:已成功删除!" << endl;
	}
	Write(stu, n - 1);
}

void Insert(Student stu[]) {
	system("cls");
	int n = Read(stu);
	char s='0';
	cout << endl << "=======>>    增加学生成绩    <<========" << endl;
	while (s != 'n' && s != 'N') {
		cout << "班级:";
		cin >> stu[n].class_0;
		cout << "学号:";
		cin >> stu[n].num;
		cout << "姓名:";
		cin >> stu[n].name;
		cout << "电子技术成绩:";
		cin >> stu[n].elec;
		cout << "C++成绩:";
		cin >> stu[n].c_program;
		cout << "多媒体技术成绩:";
		cin >> stu[n].media;
		cout << "大学英语成绩:";
		cin >> stu[n].english;
		cout << "高等数学成绩:";
		cin >> stu[n].math;
		cout << "大学体育成绩:";
		cin >> stu[n].sport;
		cout << "马克思主义基本原理成绩:";
		cin >> stu[n].polity;
		stu[n].average = (stu[n].elec + stu[n].c_program + stu[n].media +
			stu[n].english + stu[n].math + stu[n].sport + stu[n].polity) / 7;
		cout << "平均分:" << stu[n].average << endl;
		n++;
		cout << "======>>    是否继续插入(y/n)";
		cin >> s;
	}
	Write(stu, n);
}

void Sort(Student stu[]) {
	system("cls");
	int i, j, k;
	float s;
	char t[20];
	cout << endl << "======>>    降序排列    <<======" << endl;
	int n = Read(stu);
	for (i = 0; i < n-1; i++) {
		for (j = 0; j < n - 1; j++) {
			if (stu[j].average < stu[j + 1].average) {
				//交换课程
				strcpy(t, stu[j + 1].class_0);
				strcpy(stu[j + 1].class_0, stu[j].class_0);
				strcpy(stu[j].class_0, t);
				//num
				k = stu[j + 1].num;
				stu[j + 1].num = stu[j].num;
				stu[j].num = k;

				//name
				strcpy(t, stu[j + 1].name);
				strcpy(stu[j + 1].name, stu[j].name);
				strcpy(stu[j].name, t);
				//elec
				s = stu[j + 1].elec;
				stu[j + 1].elec = stu[j].elec;
				stu[j].elec = s;
				//c_program
				s = stu[j + 1].c_program;
				stu[j + 1].c_program = stu[j].c_program;
				stu[j].c_program = s;
				//media
				s = stu[j + 1].media;
				stu[j + 1].media = stu[j].media;
				stu[j].media = s;
				//english
				s = stu[j + 1].english;
				stu[j + 1].english = stu[j].english;
				stu[j].english = s;
				//math
				s = stu[j + 1].math;
				stu[j + 1].math = stu[j].math;
				stu[j].math = s;
				//sport
				s = stu[j + 1].sport;
				stu[j + 1].sport = stu[j].sport;
				stu[j].sport = s;
				//polity
				s = stu[j + 1].polity;
				stu[j + 1].polity = stu[j].polity;
				stu[j].polity = s;
				//average
				s = stu[j + 1].average;
				stu[j + 1].average = stu[j].average;
				stu[j].average = s;
			}
		}
	}
	cout << "------------------------------------------------------------------------------------" << endl;
	cout << "班级" << "\t" << "学号" << "\t" << "姓名" << "\t"
		 << "电子" << "\t" << "C++" << "\t" << "多媒体" << "\t"
		 << "英语" << "\t" << "数学" << "\t" << "体育" << "\t"
		 << "政治" << "\t" << "平均分" << endl;
	cout << "------------------------------------------------------------------------------------" << endl;
	for (int i = 0; i < n; i++) {
		stu[i].order = i + 1;
		cout << stu[i].class_0 << "\t" << stu[i].num       << "\t" << stu[i].name << "\t"
			 << stu[i].elec    << "\t" << stu[i].c_program << "\t" << stu[i].media << "\t"
			 << stu[i].english << "\t" << stu[i].math      << "\t" << stu[i].sport << "\t"
			 << stu[i].polity  << "\t" << stu[i].average   << endl;
	}
	Write(stu, n);
}

void Output(Student stu[]) {
	system("cls");
	int n = Read(stu);
	cout << endl << "======>>    显示全部学生成绩    <<======" << endl;
	if (!stu) {
		cout << "没有记录";
	}
	else {
		cout << "------------------------------------------------------------------------------------" << endl;
		cout << "班级" << "\t" << "学号"  << "\t" << "姓名"  << "\t" 
			 << "电子" << "\t" << "C++"  << "\t" << "多媒体" << "\t" 
			 << "英语" << "\t" << "数学"  << "\t" << "体育"  << "\t" 
			 << "政治" << "\t" << "平均分" << endl;
		cout << "------------------------------------------------------------------------------------" << endl;
		for (int i = 0; i < n; i++) {
			cout << stu[i].class_0 << "\t" << stu[i].num       << "\t" << stu[i].name  << "\t"
				 << stu[i].elec    << "\t" << stu[i].c_program << "\t" << stu[i].media << "\t"
				 << stu[i].english << "\t" << stu[i].math      << "\t" << stu[i].sport << "\t"
				 << stu[i].polity  << "\t" << stu[i].average   << endl;
		}
		cout << "------------------------------------------------------------------------------------" << endl;
	}
}

int menu() {
	char c;
	do {
		system("cls");
		cout << "******************************************************" << endl;
		cout << "----------------欢迎使用学生成绩管理系统---------------" << endl;
		cout << "    *          【1】输入学生成绩                  *    " << endl;
		cout << "    *          【2】显示统计数据                  *    " << endl;
		cout << "    *          【3】查找学生成绩                  *    " << endl;
		cout << "    *          【4】修改学生成绩                  *    " << endl;
		cout << "    *          【5】删除学生成绩                  *    " << endl;
		cout << "    *          【6】插入学生成绩                  *    " << endl;
		cout << "    *          【7】按平均分排列                  *    " << endl;
		cout << "    *          【8】显示学生成绩                  *    " << endl;
		cout << "    *          【0】退出管理系统                  *    " << endl;
		cout << "******************************************************" << endl;
		cout << "请选择您的操作 (0-8):" << endl;
		c = getchar();
	} while (c < '0' || c > '8');
	return (c - '0');
}

int main() {
	for (;;) {
		switch (menu()) {
			case 1:
				Input(stu);
				break;
			case 2:
				Statistic(stu);
				break;
			case 3:
				Lookup(stu);
				system("pause");
				break;
			case 4:
				Modify(stu);
				system("pause");
				break;
			case 5:
				Delete(stu);
				system("pause");
				break;
			case 6:
				Insert(stu);
				system("pause");
				break;
			case 7:
				Sort(stu);
				system("pause");
				break;
			case 8:
				Output(stu);
				system("pause");
				break;
			case 0:
				cout << endl << "================感谢您使用学生成绩管理系统==============\n" << endl;
				exit(0);
		}
	}
	return 0;
}

    该代码在visual studio 2019上运行没有问题,不知道在别的IDE中有没有问题,这是一个纯c++实现的,没有参杂c的内容,但是如果用c来实现,也基本就是这个样子,就是前面的Student类换成结构体struct,输入输出改为scanf,printf ,文件读写改为c的,其他的没有太大的改变。

    如下所示,当我们一开始运行这个程序,没有录入学生成绩,直接点击【8】显示学生成绩,它会提示失败,并抛出错误:

    

    这就是前面提到的那个问题,我们需要手动创建一个score.txt文件并写入相关记录,文件格式以及数据在前面你已经提到,或者我们点击【1】输入学生成绩,创建这个文件也是可以的,后续反复运行这个程序也不会报错了。 

已标记关键词 清除标记
相关推荐
本次实验设计了一个学生管理系统学生管理系统对数据的存储可以是顺序结构,也可以是链式结构。由于顺序结构存储时用的是一段连续的存储空间,不适合存储大量的信息量,因此本人使用单链表的数据结构来对学生的信息进行管理。本次课程设计中,学生的信息分为了四大项,分别是学生的学号、姓名、年龄、成绩,这四项一起作为链表节点的数据部分。本次数据结构课程设计摒弃了传统的面向过程程序设计思想(如C程序设计),引进了当今比较流行的程序设计理念:面向对象(如C++程序设计)。这使得程序的各个功能更加模块化,系统化,用类把成员变量和成员方法封装起来,使开发变得更有效率,结构更加清晰。 关键词: 学生信息管理,链式存储结构,面向对象程序设计 Student Information Management System LIling (Oriental Institute of Science and Technology College,Class3) Abstract: The experimental design of a student management system. Student management system for data storage may be the order of the structure, it could be a chain structure. As the structure of the store when the order is for a period of storage space, not suitable for storing large amount of information, so I use a single list of the data structure to the students of information management. The curriculum design, student information has been divided into four categories, namely, students, name, age, the results of these four nodes together as a list of some of the data. The data structure of the curriculum design to abandon the traditional process-oriented programming ideas (such as the C programming), today introduced a more popular programming ideas: object-oriented (such as C + + programming). This program features all the more modular, systematic, with the members of the class of members of the variables and methods of packaging, so that the development of more efficient, more clear structure. Key words: student information management, chain store structure, object-oriented programming 导入语:学生信息管理分为了九大项:链表的创建、输出、插入、删除、查询、显示学生总数、按照成绩排序、显示不及格的人数、退出系统。 一、需求分析 学生信息管理系统是现实生活中比较常见的系统,它主要负责对学生信息的管理。 学生管理系统所要解决的问题是: (1)建立一个学生管理的链表 (2)数据的插入 (3)数据的删除 (4)信息的显示 (5)信息的查找 (6)学生总数的显示 (7)根据学生成绩进行排序 (8)统计不及格的人数并显示出来
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页