在完成一学期的C++语言学习之后,写一个学生信息管理系统来丰富自己的实战经验。
课设内容的要求有主菜单模块、输入模块、查询模块、更新模块、排序模块、统计模块和输出模块,并且通过主菜单模块调用各个子模块。
主菜单模块须有循环嵌套语句实现用户不断对功能进行选择,并实现首次使用系统有录入信息的功能。
输入模块需要通过键盘输入信息并能输出到文件,说明程序必须包括文件操作流。
查询模块可分为两个子模块,分别通过姓名查询和学号查询并显示相应查询结果。
更新模块不仅更新还要确认是否保存到文件,要有if语句的运用。这样就可以结合输入模块运用同一个函数确认是否保存到文件。
排序模块可选择冒泡排序或者选择排序法,也需要将排序结果输出到屏幕,此时可以与其他有关的需要输出到屏幕上的模块调用同一个输出函数。
统计模块用if语句实现对各个区间的分数段实现输出到屏幕。
输出模块需要对所有信息进行输出,主要在排版问题上,要注意排版问题。用setw控制长度,在主函数里用switch()-case来控制用户的选择功能,调用相应函数,应用清屏函数相应美化界面会使用户获得较好的系统使用体验值。
源码如下所示
#include
#include
#include //调用getch()的头文件
#include //对字符串的操作函数调用的头文件
#include
#include //调节颜色头文件
using namespace std;
struct student
{
char number[30];
char name[30];
char sex[3];
double score[4];
}Stu[1000];
void input(); //输入学生信息
void save(); //保存学生信息
void readfile(); //读取学生信息
void search(); //查找学生信息
void search_number(); //按学号查找
void search_name(); //按姓名查找
void print(int i); //单个输出函数
void output(); //输出学生信息
void clean(); //清屏
void add(); //添加学生信息
void del(); //删除学生信息
void change(); //修改学生信息
void order(); //排序
void Norder(int type); //排序小函数
void no(); //统计各科各分数段以及不及格人数
int N=0;
int main()
{
system("color F0");
cout<<" 欢迎来到学生成绩管理系统!!!\n"<<endl;
{
cout<<" --请输入任意键继续,进入个人信息页面--\n"<<endl;
getch();
//以下为输入学生信息模块
system("color 1E");
readfile();//从文件读取数据
cout << "文件已经录入了" << N << "组数据,若仍需要增加,请您在管理系统中使用添加功能继续添加:\n";
cout << "--请按任意键继续--\n";
getch();
system("CLS");
//以下为管理功能模块
int n;//n为功能选择参数
while (true)
{
system("color 1E");
cout <<" 欢迎来到学生管理系统!!!\n"<<endl;
cout << " 共有" << N << "名学生" << endl;
cout << " 请选择所需要的功能0-8" << 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;
cin >> n;
system("cls");
switch (n)
{
case 1:
{
input();
clean();
break;
}
case 2:
{
output();
clean();
break;
}
case 3:
{
search();
break;
}
case 4:
{
del();
clean();
break;
}
case 5:
{
change();
clean();
break;
}
case 6:
{
add();
clean();
break;
}
case 7:
{
order();
clean();
break;
}
case 8:
{
no();
clean();
break;
}
case 0:
{
system("cls");
cout<<"****************************************************"<<endl;
cout<<"————老师您辛苦了,谢谢老师!————"<<endl;
cout<<"****************************************************"<<endl;
return 0;
}
default:
{
system("color FB");
cout<<"输入错误,请重新输入!\n"<<endl;
system("CLS");
break;
}
}
}
}
return 0;
}
//输入学生信息
void input()
{
system("color 20");
cout<<"-------------输入学生信息-----------"<<endl;
int n;
cout << "首次输入学生信息个数为" << endl;
cin >> n;
for(int i=0;i<n;i++)
{
cout<<"-------------输入学生信息-----------"<<endl;
cout<<"请输入学生的学号:"<<endl;
cin>>Stu[i].number;
cout<<"请输入学生的姓名:"<<endl;
cin>>Stu[i].name;
cout<<"请输入学生的性别:"<<endl;
cin>>Stu[i].sex;
cout<<"请输入学生的高等数学成绩:"<<endl;
cin>>Stu[i].score[0];
cout<<"请输入学生的英语成绩:"<<endl;
cin>>Stu[i].score[1];
cout<<"请输入学生的计算机成绩:"<<endl;
cin>>Stu[i].score[2];
Stu[i].score[3] = (Stu[i].score[0] + Stu[i].score[1] + Stu[i].score[2]) / 3;
N++;
save();
system("cls");
}
}
//读取学生信息
void readfile()
{
fstream fcin;
fcin.open("zxl.txt",ios::in);
N=0;
for(int i=0;!fcin.eof();i++)//eof是文件末尾,文件没读到文件末尾
{
fcin>>Stu[i].number;
fcin>>Stu[i].name;
fcin>>Stu[i].sex;
fcin>>Stu[i].score[0];
fcin>>Stu[i].score[1];
fcin>>Stu[i].score[2];
Stu[i].score[3]=(Stu[i].score[0]+Stu[i].score[1]+Stu[i].score[2])/3;
if((Stu[i].number[0]>='0')&&(Stu[i].number[0]<='9'))
N++;
}
fcin.close();
}
//输出学生信息
void output()
{
int i;
system("color B4");
cout << "查看学生信息\n";
cout << left;//左对齐
cout << "---------------------------------------------长大学生登记信息表-----------------------------------\n";
cout << "|学号 |姓名 |性别 |数学 |英语 |计算机 |平均分 " << endl;
cout << "--------------------------------------------------------------------------------------------------------------\n";
for (i = 0; i<N; i++)
{
cout << "|" << setw(14) << Stu[i].number << "|" << setw(14) << Stu[i].name << "|" << setw(14) <<Stu[i].sex
<< "|" << setw(14) <<Stu[i].score[0] << "|" << setw(14) << Stu[i].score[1] << "|" << setw(14) << Stu[i].score[2] << "|"
<< setw(14) <<Stu[i].score[3] << endl;
cout << "--------------------------------------------------------------------------------------------------------------\n";
}
clean();
}
//保存学生信息
void save()
{
ofstream fcout("zxl.txt", ios::trunc);//ios::trunc是覆盖原有内容(课本236页)
int i;
for (i = 0; i<N; i++)
{
fcout <<Stu[i].number << "\t" << Stu[i].name << "\t" <<Stu[i].sex << "\t" <<Stu[i].score[0] << "\t"
<<Stu[i].score[1] << "\t" <<Stu[i].score[2] <<endl;
}
fcout.close();
}
//查找学生信息
void search()
{
system("color 82");
int n;
while (true)
{
cout << "1 通过学号查找;" << endl;
cout << "2 通过姓名查找;" << endl;
cout << "0 返回上一级;" << endl;
cin >> n;
system("cls");
switch (n)
{
case 1:
{
search_number();
getch();
break;
}
case 2:
{
search_name();
getch();
break;
}
case 0:
{
return;
}
default:
{
cout << "输入错误!请重新输入" << endl;
getch();
continue;
}
}
}
}
//按学号查找
void search_number()
{
int i;
char number[30];
int flag = 0;
cout << "请输入学号:" << endl;
cin >> number;
for (i = 0; i < N; i++)
{
if (strcmp(Stu[i].number ,number)==0)
{
flag = 1;
print(i);
}
}
if (flag==0)
cout << "没有该生!" << endl;
}
//按姓名查找
void search_name()
{
int i;
int flag = 0;
char name[30];
cout << "请输入姓名" << endl;
cin >> name;
for (i = 0; i < N; i++)
{
if (strcmp( Stu[i].name , name)==0)
{
print(i);
flag = 1;
}
}
if(flag==0)
cout << "没有该生!" << endl;
}
//输出单个学生信息
void print(int i)
{
cout << "找到该生!(顺序为:学号、姓名、性别、高数成绩、英语成绩、计算机成绩、平均成绩)"<<endl;
cout << Stu[i].number << "\t" << Stu[i].name << "\t" << Stu[i].sex
<< "\t" << Stu[i].score[0] << "\t" << Stu[i].score[1] << "\t" <<
Stu[i].score[2] <<"\t"<<(Stu[i].score[0]+ Stu[i].score[1]+ Stu[i].score[2])/3<<endl;
}
//添加学生信息
void add()
{
system("color 4B");
N=N+1;
cout<<"-------------添加学生信息-----------"<<endl;
cout<<"请输入添加学生的学号:"<<endl;
cin>>Stu[N-1].number;
cout<<"请输入添加学生的姓名:"<<endl;
cin>>Stu[N-1].name;
cout<<"请输入添加学生的性别:"<<endl;
cin>>Stu[N-1].sex;
cout<<"请输入添加学生的高等数学成绩:"<<endl;
cin>>Stu[N-1].score[0];
cout<<"请输入添加学生的英语成绩:"<<endl;
cin>>Stu[N-1].score[1];
cout<<"请输入添加学生的计算机成绩:"<<endl;
cin>>Stu[N-1
].score[2];
Stu[N - 1].score[3] = (Stu[N - 1].score[0] + Stu[N - 1].score[1] + Stu[N - 1].score[2]) / 3;
cout<<"是否保存?(1是0否)"<<endl;
int z;
cin>>z;
if(z==1)
save();
else
{
N--;
cout << "未存入原\"zxl.txt\"文件" << endl;
}
}
//删除学生信息
void del()
{
system("color 60");
int n, x;
while (true)
{
cout << "1 按学号查找并删除" << endl;
cout << "2 按姓名查找并删除" << endl;
cout << "0 返回上一级 " << endl;
cin >> n;
switch (n)
{
case 1:
{
int i;
char number[30];
int flag = 0;
cout << "请输入学号:" << endl;
cin >> number;
for (i = 0; i < N; i++)
{
flag = i;
if (strcmp(Stu[i].number , number)==0)
{
print(i);
for (int a = flag-1; a < N-1; a++)//flag-1是因为i++导致最后多了一个
{
Stu[a] = Stu[a + 1];
N--;
}
cout << "是否保存本次删除?(1是,0否)" << endl;
cin >> x;
if (x==1)
{
cout << "已添加到文件" << endl;
save();
}
else
{
readfile();
break;
}
}
else
{
cout << "输入错误!" << endl;
break;
}
}
break;
}
case 2:
{
int i;
int flag = 0;
char name[30];
cout << "请输入姓名" << endl;
cin >> name;
for (i = 0; i < N; i++)
{
flag=i;
if (strcmp(Stu[i].name, name) == 0)
{
print(i);
for (int a = flag-1; a < N; a++)//flag-1是因为i++导致最后多了一个
{
Stu[a] = Stu[a + 1];
N--;
}
cout << "是否保存本次删除?(1是,0否)" << endl;
cin >> x;
if (x==1)
{
cout << "已添加到文件" << endl;
save();
}
else
{
readfile();
break;
}
}
else
{
cout<<"输入错误!"<<endl;
break;
}
}
break;
}
case 0:
{
return;
}
default:
{
cout << "输入错误!请重新输入" << endl;
continue;
}
}
}
}
//修改学生信息
void change()
{
system("color 37");
int n, x, m;
while (true)
{
getch();
system("cls");
cout << "1 按学号查找并修改" << endl;
cout << "2 按姓名查找并修改" << endl;
cout << "0 返回上一级 " <<endl;
cin >> n;
switch (n)
{
case 1:
{
int i,x;
char number[30];
int flag = 0;
cout << "请输入学号:" << endl;
cin >> number;
for (i = 0; i < N; i++)
{
if (strcmp(Stu[i].number , number)==0)
{
flag = i;
print(i);
cout<<"修改该生的 1-高数成绩 2-英语成绩 3-计算机成绩" << endl;
cin >> m;
if (m == 1)
{
cout << "将该科成绩修改为" << endl;
cin >> Stu[flag].score[0];
}
else if (m == 2)
{
cout << "将该科成绩修改为" << endl;
cin >> Stu[flag].score[1];
}
else if (m == 3)
{
cout << "将该科成绩修改为" << endl;
cin >> Stu[flag].score[2];
}
else
{
cout << "输入有误!请重新输入" << endl;
continue;
}
cout << "是否确认保存修改?(1是,0否)" << endl;
cin >> x;
if (x == 1)
{
cout << "已保存修改" << endl;
save();
}
else
{
readfile();
}
clean();
}
else
{
cout<<"按任意键返回"<<endl;
continue;
}
}
break;
}
case 2:
{
int i;
int flag = 0;
char name[30];
cout << "请输入姓名" << endl;
cin >> name;
for (i = 0; i < N; i++)
{
if (strcmp(Stu[i].name, name) == 0)
{
flag = i;
print(i);
cout << "修改该生的 1-高数成绩 2-英语成绩 3-计算机成绩" << endl;
cin >> m;
if (m == 1)
{
cout << "将该科成绩修改为" << endl;
cin >> Stu[flag].score[0];
}
else if (m == 2)
{
cout << "将该科成绩修改为" << endl;
cin >> Stu[flag].score[1];
}
else if (m == 3)
{
cout << "将该科成绩修改为" << endl;
cin >> Stu[flag].score[2];
}
else
{
cout << "输入有误!请重新输入" << endl;
continue;
}
cout << "是否确认保存修改?(1是,0否)" << endl;
cin >> x;
if (x == 1)
{
cout << "已保存修改" << endl;
save();
}
else
{
readfile();
}
clean();
}
else
{
cout<<"按任意键返回"<<endl;
continue;
}
}
break;
}
case 0:
return;
default:
{
cout<<"输入错误,请重新输入!"<<endl;
continue;
}
}
}
}
//清屏 没错误
void clean()
{
cout << "--请按任意键返回--\n"<<endl;
getch();
system("CLS");
}
//排序 没错误
void order()
{
system("color A8");
cout<<"请输入排序方式(1-4):"<<endl;
cout<<"1————按高数成绩排序"<<endl;
cout<<"2————按英语成绩排序"<<endl;
cout<<"3————按计算机成绩排序"<<endl;
cout<<"4————按平均成绩排序"<<endl;
int x;
cin>>x;
if(x==1||x==2||x==3||x==4)
{
Norder(x-1);
output();
int b;
cout << "是否将排序结果存入文件?(1是,0否)" << endl;
cin >> b;
if (b==1)
save();
else
{
readfile();
cout << "未存入原\"zxl.txt\"文件" << endl;
}
}
else
cout<<"输入错误,";
}
void Norder(int type)//排序小函数(冒泡排序)
{
int i, j;
student t;
int flag;
for (i = 0; i<N; i++)
{
flag = 0;
for (j = 0; j<N - i - 1; j++)
if (Stu[j + 1].score[type]> Stu[j].score[type])
{
t =Stu[j + 1];
Stu[j + 1] = Stu[j];
Stu[j] = t;
flag = 1;
}
if (flag == 0)break;
}
}
//统计各科各分数段以及不及格人数
void no()
{
system("cls");
cout<<"请输入统计方式(1-4)"<<endl;
cout<<"1——平均分\n"<<"2——高数\n"<<"3——英语\n"<<"4——计算机\n"<<endl;
int p;
cin>>p;
int i;
int a=0,b=0,c=0,d=0,e=0;
switch(p)
{
case 1:
{
for(i=0;i<N;i++)
{
if(Stu[i].score[3]>=90)
a++;
else if(Stu[i].score[3]>=80)
b++;
else if(Stu[i].score[3]>=70)
c++;
else if(Stu[i].score[3]>=60)
d++;
else
e++;
}
break;
}
case 2:
{
for(i=0;i<N;i++)
{
if(Stu[i].score[0]>=90)
a++;
else if(Stu[i].score[0]>=80)
b++;
else if(Stu[i].score[0]>=70)
c++;
else if(Stu[i].score[0]>=60)
d++;
else
e++;
}
break;
}
case 3:
{
for(i=0;i<N;i++)
{
if(Stu[i].score[1]>=90)
a++;
else if(Stu[i].score[1]>=80)
b++;
else if(Stu[i].score[1]>=70)
c++;
else if(Stu[i].score[1]>=60)
d++;
else
e++;
}
break;
}
case 4:
{
for(i=0;i<N;i++)
{
if(Stu[i].score[2]>=90)
a++;
else if(Stu[i].score[2]>=80)
b++;
else if(Stu[i].score[2]>=70)
c++;
else if(Stu[i].score[2]>=60)
d++;
else
e++;
}
break;
}
default:
{
cout<<"输入错误,请重新输入!"<<endl;
}
}
cout<<"该科成绩:"<<endl;
cout<<"九十分以上的有"<<a<<"个"<<endl;
cout<<"八十分以上的有"<<b<<"个"<<endl;
cout<<"七十分以上的有"<<c<<"个"<<endl;
cout<<"六十分以上的有"<<d<<"个"<<endl;
cout<<"不及格的有"<<e<<"个"<<endl;
}
`
实现效果图如下
程序运行主页面效果图
首页先显示当前学生数据
程序功能选择页面
这个程序是在刚学完c++的时候写的,现在看有很多不足之处,在学完Javaweb之后,我使用Javaweb又开发了一个学生信息管理系统,基于Javaweb的学生信息管理系统连接了数据库,功能也较为齐全可以供初学者参考。
Javaweb学生信息管理系统