【题目】学生成绩管理程序(增删改查)

  • 文件名:[作业]
  • 作者:〈漆黑〉
  • 描述:〈 本周项目:
    假设一个小组有5位同学,成绩薄上记录了每位同学每一次考试成绩的排名,
    设计一个成绩薄程序,要有以下功能:
    1、程序首先提示录入每个同学的成绩排名。步骤如下
    1)提示录入同学姓名
    2)提示录入同学排名(注意5个人的名次只能在1~5之间,这里要有数字范围验证,最好也有字符验证)
    3)按照上述步骤录入下一位同学的信息。直至录入完所有同学的信息。
    2、录入成绩排名完成之后,程序应该提供一个菜单
    1)打印各位同学的排名(按照名次顺序,正序/倒序都可以)
    2)删除一位同学的信息(注意删除一位同学的信息之后,要把后面同学的名次也要更改。)
    3)增加一位同学的信息(仍然注意他对其他同学的影响,最多可能增加5位同的信息,如果使用动态内存分配则不用考虑增加人数的限制)
    3、额外功能加分(如提供一个存档功能,将当前同学的成绩和姓名信息以txt格式保存在本地等) 〉
/****************************
* 文件名:[作业]
* 作者:〈漆黑〉
* 描述:〈	本周项目:
			假设一个小组有5位同学,成绩薄上记录了每位同学每一次考试成绩的排名,
			设计一个成绩薄程序,要有以下功能:
			1、程序首先提示录入每个同学的成绩排名。步骤如下
				1)提示录入同学姓名
				2)提示录入同学排名(注意5个人的名次只能在1~5之间,这里要有数字范围验证,最好也有字符验证)
				3)按照上述步骤录入下一位同学的信息。直至录入完所有同学的信息。
			2、录入成绩排名完成之后,程序应该提供一个菜单
				1)打印各位同学的排名(按照名次顺序,正序/倒序都可以)
				2)删除一位同学的信息(注意删除一位同学的信息之后,要把后面同学的名次也要更改。)
				3)增加一位同学的信息(仍然注意他对其他同学的影响,最多可能增加5位同的信息,如果使用动态内存分配则不用考虑增加人数的限制)
			3、额外功能加分(如提供一个存档功能,将当前同学的成绩和姓名信息以txt格式保存在本地等)	〉
* 创建时间:2019.6.9
****************************/
#include<iostream>
#include <fstream>
using namespace std;

/* 学生结构体 */
struct student
{
	string name;//姓名
	int rank;	//排名
};
void faultinfo();//报告清除错误信息
void sort(student s[], int n);	//对学生进行排序
void prints(student s[], int n);//打印学生信息
void deletes(student s[], int n, int num);//增加学生信息

int main() {
	int num = 0;//存储已记录总人数
	student students[10];//学生数组
	for (int i = 0; i < 5; i++) {//录入5个同学成绩
		cout << "请输入同学姓名:";
		while (!(cin >> students[i].name)) {//输入错误
			faultinfo();
		}
		cout << "请输入同学排名:";
	loop:
		while (!(cin >> students[i].rank) || students[i].rank > 5 || students[i].rank < 1) {//输入错误
			faultinfo();
		}
		for (int j = 0; j < i; j++) {
			if (students[i].rank == students[j].rank) {//跟之前的排名比较,不能一样
				faultinfo();
				goto loop;
			}
		}
		num++;
	}
	sort(students, num);//排序
	while (1)
	{
		system("cls");//清屏
		cout << "请选择功能:\n1、打印学生成绩\n2、删除学生信息\n3、增加学生信息\n4、保存到本地\n5、结束\n请选择:";
		int choice;
		while (!(cin >> choice) || choice > 5 || choice < 1) {//输入错误
			faultinfo();
		}
		switch (choice)
		{
		case 1://打印学生成绩
			prints(students, num);
			system("pause");
			break;
		case 2://删除学生信息
			if (num < 1) {//无学生信息
				cout << "已没有学生信息。";
				system("pause");
				break;
			}
			int rank;
			prints(students, num);
			cout << "请选择删除的同学排名为:";
			while (!(cin >> rank) || rank > num || rank < 1) {//输入错误
				faultinfo();
			}
			deletes(students, rank, num);//删除学生信息
			cout << "删除成功。" << endl;
			num--;
			sort(students, num);//排序
			system("pause");
			break;
		case 3://增加学生信息
			prints(students, num);
			if (num >= 10) {//达到10人满人
				cout << "人数已满。";
				system("pause");
				break;
			}
			cout << "请输入增加的同学姓名:";
			while (!(cin >> students[num].name)) {//输入错误
				faultinfo();
			}
			cout << "请输入增加的同学排名:";
			while (!(cin >> students[num].rank) || students[num].rank > num + 1 || students[num].rank < 1) {//输入错误
				faultinfo();
			}
			cout << "增加成功。"<<endl;
			num++;
			sort(students, num);//排序
			system("pause");
			break;
		case 4://保存到本地
		{
			ofstream fout;//ofstream类型的fout
			fout.open("学生成绩单.txt");//创建打开文件
			fout << "姓名\t排名" << endl;//输入文件
			for (int i = 0; i < num; i++) {//循环输入学生信息
				fout << students[i].name << "\t" << students[i].rank << endl;
			}
			fout.close();//关闭文件
			cout << "保存成功。";
			system("pause");
			break;
		}
		case 5://结束
			return 0;
		default:
			break;
		}
	}
}

/* 报告清除错误信息 */
void faultinfo() {
	cout << "输入错误,请重新输入:";
	cin.clear();//清除错误信息
	cin.ignore(1024, '\n');//清空cin内容
}

/* 对学生进行排序 */
void sort(student s[], int n) {//排序
	for (int i = 0; i < n - 1; i++) {
		for (int j = i + 1; j < n; j++) {
			if (s[i].rank >= s[j].rank) {
				student temp = s[i];
				s[i] = s[j];
				s[j] = temp;
			}
		}
	}
	for (int i = 0; i < n; i++) {//排名
		s[i].rank = i + 1;
	}
}

/* 打印学生信息 */
void prints(student s[], int n) {
	for (int i = 0; i < n; i++) {
		cout << s[i].name << ":" << s[i].rank << endl;
	}
}

/* 删除学生信息 */
void deletes(student s[], int n, int num) {
	for (n; n < num; n++) {
		s[n - 1] = s[n];
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值