问题描述

某班开设有英语、数学、程序设计三门课程,该班同学不多于50人。编写具有下列功能的菜单驱动的程序。

(1)添加学生信息

(2)显示所有学生信息

(3)删除学生信息 让操作者输入要删除学生的名字,将其删除

(4)查询学生信息 让操作者输入要查询学生的名字,显示其信息或提示无

(5)保存当前输入数据

(6)载入先前数据

(0)退出系统

程序代码
#include<bits/stdc++.h>
using namespace std;
#define max_len 51		//根据问题描述,最多50个学生
struct Student
{
	double english;
	double math;
	double program;
	double sum;
	char name[20];
	bool isexist;	//用该bool型变量来标记学生是否被删除
} list_student[max_len];	//学生列表

int pos = 0; //指向学生列表的位置
int show_Control()
{
	cout<<"请选择你要的功能:
";
	cout<<"   1---添加学生信息
";
	cout<<"   2---显示所有学生信息
"; 
	cout<<"   3---删除学生信息
";
	cout<<"   4---查询单个学生信息
";
	cout<<"   5---保存当前学生信息到文件中去
";
	cout<<"   6---载入先前保存进度
";
	cout<<"   0---退出系统
";
	int n;
	cin>>n;
	return n;
}	//展示操作菜单并返回用户选择的数字 

void add_student()
{
	cout<<"请输入学生的名字   ";
	cin>>list_student[pos].name;	
	cout<<"请输入学生的英语成绩   ";
	cin>>list_student[pos].english;
	cout<<"请输入学生的数学成绩   ";
	cin>>list_student[pos].math;
	cout<<"请输入学生的程序设计成绩   ";
	cin>>list_student[pos].program;
	list_student[pos].sum = list_student[pos].english + list_student[pos].math + list_student[pos].program;
	list_student[pos].isexist = true;
	pos++;		//指针加一
	cout<<endl; 
}	//添加学生信息

void sortbysum()
{
	for(int i=0;i<pos;i++)
		for(int j=0;j<pos-i;j++)
		{
			if(list_student[i].isexist && list_student[j].isexist && list_student[j].sum>list_student[j+1].sum)
			{
				struct Student tmp = list_student[i];
				list_student[i] = list_student[j];
				list_student[j] = tmp;
			}
		}
}//冒泡排序,根据学生的总成绩进行排序

void show_all__information()
{
	cout<<"你是否想对学生的总成绩进行排序后输出?(y/n)";
	char tmp[10];
	cin>>tmp;
	if(tmp[0]=='y') sortbysum();
	cout<<"学生姓名	英语成绩	数学成绩	程序设计成绩	总成绩
";
	for(int i=0;i<pos;i++)
	{
		if(list_student[i].isexist)
		{
			cout<<list_student[i].name << "		";
			cout<<list_student[i].english << "		";
			cout<<list_student[i].math << "		";
			cout<<list_student[i].program << "		";
			cout<<list_student[i].sum << "
";
		}
	}
	cout<<endl;
}//展示学生信息,提供选项是否要排序

void delete_student()
{
	cout<<"请输入你要删除的学生的名字
";
	char student_name[20];
	cin>>student_name;
	for(int i=0;i<pos;i++)
	{
		if(strcmp(student_name,list_student[i].name)==0 && list_student[i].isexist)		//如果找到指定的学生
		{
			list_student[i].isexist = false;	//置为false就是删除
			cout<<"删除成功!
";
			cout<<endl;
			return;
		}
	}
	cout<<"查无该学生信息
";
	cout<<endl;
}//删除某个学生

void get_student()
{
	cout<<"请输入你要查询的学生的名字
";
	char student_name[20];
	cin>>student_name;
	for(int i=0;i<pos;i++)
	{
		if(strcmp(student_name,list_student[i].name)==0)		//如果找到指定的学生
		{
			if(!list_student[i].isexist)
			{
				cout<<"查无该学生信息
";
				cout<<endl;
				return;
			}
			else
			{
				cout<<"这位学生的英语成绩是:  " << list_student[i].english << endl;
				cout<<"这位学生的数学成绩是:  " << list_student[i].math << endl;
				cout<<"这位学生的程序设计成绩是:  " << list_student[i].program << endl;
				cout<<"这位学生的总成绩是:  " << list_student[i].sum<< endl;
				cout<<endl;
				return;
			}
		}
	}
	cout<<"查无该学生信息
";
	cout<<endl;
}//查询单个学生信息

void savedate()
{
	FILE *fp;
	fp = fopen("data.txt","w");
	for(int i=0;i<pos;i++)
	{
		if(list_student[i].isexist)
		{
			fprintf(fp,"%s %.2lf %.2lf %.2lf %.2lf
",list_student[i].name,list_student[i].english,list_student[i].math,list_student[i].program,list_student[i].sum);
			printf("写入成功!
");
		}
	}
	fclose(fp);
}//保存当前输入数据

void loaddata()
{
	FILE *fp;
	if((fp=fopen("data.txt","r"))==NULL)//打开输入文件
	{
		cout<<"无法打开该文件
";
		return;
	}
	char tmp[100];
	int line_length = 0;
	
	while(fgets(tmp,100,fp)!=0) line_length++;	//统计行数,也是统计学生个数
	rewind(fp);		//将光标移回文件开头
	for(int i=0;i<line_length;i++)
	{
		fscanf(fp,"%s%lf%lf%lf%lf",&list_student[i].name,&list_student[i].english,&list_student[i].math,&list_student[i].program,&list_student[i].sum);
		list_student[i].isexist = true;
	}
	pos = line_length;
	fclose(fp);
}//载入先前数据

int main()
{
	int choice = show_Control();
	while(choice!=0)
	{
		switch(choice)
		{
			case(0): 
                {
                    cout<<"是否要保存并退出(y/n)";
                    char tmp[5];
                    cin>>tmp;
                    if(tmp[0]=='y')
                        savedate();
                    return 0;	
                }//退出
			case(1): add_student();break;		//添加学生信息
			case(2): show_all__information();break;		//展示所有学生信息
			case(3): delete_student();break;	//删除学生信息
			case(4): get_student();break;		//获取单个学生信息
			case(5): savedate();break;		//保存当前所有学生信息
			case(6): loaddata();break;		//载入先前数据
		}
		choice = show_Control(); //更新用户选项 
         if(choice == 0)
		{
			cout<<"是否要保存并退出(y/n)";
                    char tmp[5];
                    cin>>tmp;
                    if(tmp[0]=='y')
                        savedate();
                    return 0;
		}
	}
	return 0;
}

测试用例

张三 154.00 15.00 59.00 228.00
李四 489.00 15.00 49.00 553.00
老王 156.00 155.00 156.00 467.00
李子 156.00 114.00 236.00 506.00

结果展示

学生信息管理系统-风君雪科技博客
学生信息管理系统-风君雪科技博客