【期末作业】学生成绩管理系统

【期末作业】学生成绩管理系统

需求分析

某班有最多不超过30人(具体人数由键盘输入)参加期末考试,最多不超过6门(具体门数由键盘输入)。

  • 可以定义一个结构体来储存这些数据
  • 对于本程序,每次运行程序时,学生的学号、姓名、成绩等信息都需要重新输入,因为这些数据都是存储在掉电即失的内存中的,程序一旦运行结束,这些信息也就丢失了。这对于一个实际系统而言,显然是不实用的。只有在输入这些信息之后,将其以文件的形式保存在永久性磁盘中,每次运行程序都可以从这些磁盘文件中读出相应的数据信息,那么这个系统才是算是实用的。

代码思路

代码多采用函数编程,需要储存学生的id,名字,各科成绩,以及考多少科,总分多少分,方便代码实现

结构体定义

//结构体
struct Student {
	string id;
	string name;
	int sorce[8] = { 0 };
	Student* next;
};

输入规范性检查

录入数据的时候也要对输入的合法性检查,尽量避免一些错误。

//输入规范性检查
int input() {
	string a;
	int i;

	while (1) {
		try {
			cout << "请输入选择:";
			cin >> a;
			i = stoi(a);
			break;
		}
		catch (exception& invalid_argument) {
			cout << "输入错误,请重新输入" << endl;
			continue;
		}
	}

	return i;
}

此代码如果输入错误会抛出异常处理

数据的保存加载

我们肯定不希望每次进入程序的时候都需要重新录入数据,我们需要一个可以储存的函数,对此我采用简单的以文件的形式保存在永久性磁盘中,每次进入程序时加载,运行程序时写入

//读取函数
int duqu(Student* a) {
	fstream file;
	int i = 0;

	file.open("data.txt", ios::in);
	
	for (i = 0;file >> a[i].id >> a[i].name; i++) {
		for (int j = 0; j < 8; j++) {
			file >> a[i].sorce[j];
		}
	}

	file.close();

	return i;
}

//写入函数
void xieru(Student* a, int p) {
	fstream file;
	file.open("data.txt", ios::out);
	for (int i = 0;i < p ; i++) {
		file << a[i].id << " " << a[i].name << " ";
		for (int j = 0; j < 8; j++) {
			file << a[i].sorce[j] << " ";
		}
		file << endl;
	}
	file.close();
}

每次读取写入完成记得要关闭文件哦!

功能实现

主函数创建一个Student结构体数组,并且调用函数,增强代码可读性

int main() {
	Student a[MAX_STUDENT];
	int student_nums = duqu(a);

	while (1) {
		ShowMemu();
		int choice = input();
		switch (choice)
		{
		case 1:
			choice1(a, student_nums);
			break;
		case 2:
			choice2(a, student_nums);
			break;
		case 3:
			choice3(a, student_nums);
			break;
		case 4:
			choice4(a, student_nums);
			break;
		case 5:
			choice5(a, student_nums);
			break;
		case 6:
			choice6(a, student_nums);
			break;
		case 7:
			choice7(a, student_nums);
			break;
		case 8:
			choice8(a, student_nums);
			break;
		case 9:
			choice9(a, student_nums);
			break;
		case 10:
			choice10(a, student_nums);
			break;
		case 11:
			choice11(a, student_nums);
			break;
		case 0:
			xieru(a, student_nums);
			return 0;
		default:
			cout << "输入错误,请重新输入" << endl;
			break;
		}

	}

	xieru(a, student_nums);
	return 0;
}

根据选择进入指定功能函数,完成查询,写入文件

函数部分

在代码头部声明,并未采用多文件编程,目前c++还不会用这个,暂时把所有代码塞在一个文件里面

//函数声明
int duqu(Student* a);
void xieru(Student* a, int p);
void ShowMemu();
int input();
void paixu(Student* a, int student_nums);
void choice1(Student* a,int& student_nums);
void choice2(Student* a, int student_nums);
void choice3(Student* a, int student_nums);
void choice4(Student* a, int student_nums);
void choice5(Student* a, int student_nums);
void choice6(Student* a, int student_nums);
void choice7(Student* a, int student_nums);
void choice8(Student* a, int student_nums);
void choice9(Student* a, int student_nums);
void choice10(Student* a, int student_nums);
void choice11(Student* a, int student_nums);

每一个选择对应一个功能,传入参数结构体数组指针,和一个记录学生数量的变量,以便函数操作

其中用的最多的函数都是排序,各种各样的排序

//根据总分排序
void paixu(Student* a, int student_nums) {
	Student temp;
	for (int i = 0; i < student_nums - 1; i++) {
		for (int j = i + 1; j < student_nums; j++) {
			if (a[i].sorce[7] < a[j].sorce[7]) {
				temp = a[i];
				a[i] = a[j];
				a[j] = temp;
			}
		}
	}
}

其余代码都是类似的排序

一个比较不同的可能就是录入

//录入每个学生的学号、姓名和各科考试成绩
void choice1(Student* a, int& student_nums) {
	int nums = 0;
	int nums1 = 0;
	int sum = 0;
	cout << "当前学生数量:" << student_nums << "还可以输入" << MAX_STUDENT - student_nums << "个学生" << endl;
	cout << "请选择录入学生个数:" << endl;
	while (true)
	{
		if ((nums = input()) > (MAX_STUDENT - student_nums)) {
			cout << "学生数量超过最高限制" << endl;
		}
		else {
			break;
		}
	}
	
	cout << "请输入学生科目数量:" << endl;
	while (true)
	{
		if ((nums1 = input()) > 6) {
			cout << "科目数量超过最高限制" << endl;
		}
		else {
			break;
		}
	}
	for (int q = 0; q < nums; student_nums++, q++) {
		
		a[student_nums].sorce[6] = nums1;
		cout << "请输入每个学生的学号、姓名和各科考试成绩" << endl;
		cin >> a[student_nums].id >> a[student_nums].name;
		for (int i = 0; i < nums1; i++) {
			int temp = 0;
			cin >> temp;
			a[student_nums].sorce[i] = temp;
			sum += temp;
		}
		a[student_nums].sorce[7] = sum;
		sum = 0;
	}

	xieru(a, student_nums);
	cout << "录入成功" << endl;
	cout << "=====================" << endl;
	cout << "\n\n\n\n\n\n";
}

代码会自动检查学生数量,并且完成一个比较好的输入功能的实现,不会覆盖你前面录入的数据,而且还会计算出你的总分

代码功能展示

录入功能

Management for Students' scores
1.Input record
2.Caculate total and average score of every course
3.Caculate total and average score of every student
4.Sort in descending order by score
5.Sort in ascending order by score
6.Sort in ascending order by number
7.Sort in dictionary order by name
8.Search by number
9.Search by name
10.Statistic analysis
11.List record
0.Exit
请输入选择:1
当前学生数量:5还可以输入25个学生
请选择录入学生个数:
请输入选择:1
请输入学生科目数量:
请输入选择:6
请输入每个学生的学号、姓名和各科考试成绩
108 liu 90 90 90 90 90 90
录入成功
=====================

计算每门课程的总分和平均分

请输入选择:2
第1科总分为:420
平均分为:105
=====================
第2科总分为:330
平均分为:82
=====================
第3科总分为:330
平均分为:82
=====================
第4科总分为:390
平均分为:97
=====================

计算每个学生的总分和平均分

请输入选择:3
1400 xiaoming 总分为:240
平均分为:60
=====================
102 xi 总分为:330
平均分为:55
=====================
103 xai 总分为:360
平均分为:60
=====================
104 ii 总分为:90
平均分为:90
=====================
106 xu 总分为:540
平均分为:90
=====================
108 liu 总分为:540
平均分为:90
=====================

剩下的就不一一展示了,具体源码请移步到我的个人仓库链接: github

代码还有很多不足的地方,希望大家指出,帮忙点个赞,不要吝啬你的star,万分感谢
最后英语不好大部分用的拼英,请各位包涵,以后会好好学习英语的

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值