对学生信息管理系统,要求完成以下基本任务:
1.改写程序为良好程序风格(文档注释,函数注释,语句注释)。
2.将功能补充完全(基于文件处理,完成刷新和保存功能)。
3.将学生信息改为更好的数据组织,而非离散形式(结构体)。
提高要求:
可将程序中的不足(如数据验证)等根据自己的能力与理解完成。
1.1实现最基本的增删改查
1.2实现文件读入和文件保存功能
1.3利用结构体将学生信息改为更好的数据组织
1.4添加数据验证功能和文件刷新
2.1数据结构
利用结构体存储学生信息
数组存储学生的三门课成绩
String存储学号,姓名,性别
2.2算法流程图
2.2.2部分关键算法流程图
下面展示一些 内联代码片
。
// A code block
var foo = 'bar';
#include<stdio.h> /*I/O函数*/
#include<stdlib.h> /*其它说明*/
#include<string.h> /*字符串函数*/
#include<iostream>
#include<fstream>
using namespace std;
#define LEN 15 /*
学号和姓名最大字符数,实际请更改*/
#define N 50 /*
最大学生人数,实际请更改*/
int k = 1, m = 0;/* n代表当前记录的学生人数*/
int n=0;
//函数声明
void seek();//查找学生信息
void modify();//修改学生信息
void insert();//增加学生信息
void del();//删除学生信息
void display();//显示当前信息
void save();//保存信息
void menu();//菜单
void read();//文件读入
//结构体保存学生信息
struct student{
string StudentId;//学号
string
StudentName;//姓名
int
StudentAge;//年龄
string
StudentSex;//性别
float
score[3];//成绩数组,分别记录C语言成绩,高等数学,学英语成绩
}stu[N];//结构体数组
//主函数
int main()
{
read(); //从文件读入学生信息
while (k)
{
menu();
}
return 0;
}
void read()
{
int i=0;
ifstream in("in.txt");//从"in.txt"文件中读入信息
while(in.peek()!=EOF)
{
i++;
printf("读入第%d位学生的学号:\n", i );
in>>stu[i].StudentId;
printf("读入第%d 个学生的姓名:\n",i);
in>>stu[i].StudentName;
printf("读入第%d 个学生的年龄:\n",i);
in>>stu[i].StudentAge;
printf("读入第%d 个学生的性别:\n",i);
in>>stu[i].StudentSex;
printf("读入第%d 个学生的C语言成绩\n",i);
in>>stu[i].score[0];
printf("读入第%d 个学生的高等数学成绩:\n",i);
in>>stu[i].score[1];
printf("读入第%d 个学生的大学英语成绩:\n",i);
in>>stu[i].score[2];
}
n=i+1;
in.close();//读入结束,关闭文件
}
//系统帮助函数
void help()
{
cout<<"\n0.欢迎使用系统帮助!"<<endl;
cout<<"\n1.初次进入系统后,请先选择增加学生信息;"<<endl;
cout<<"\n2.按照菜单提示键入数字代号;"<<endl;
cout<<"\n3.增加学生信息后,切记保存;"<<endl;
cout<<"\n4.谢谢您的使用!"<<endl;
}
//刷新文件
int flush(){
char filename[LEN
+ 1];//文件名
int i = 0;
cout<<"请输入要刷新学生信息的文件名:"<<endl;
cin>>
filename;//输入文件名
int j = 0;
FILE * fp;
if ((fp =
fopen(filename, "r")) == NULL) return 0;
//从文件读取信息
while
(fscanf(fp, "%s %s %s %d %d %d %d ", &stu[j].StudentId,
&stu[j].StudentName, &stu[j].StudentAge, &stu[j].StudentSex,
&stu[j].score[0], &stu[j].score[1], &stu[j].score[2]) == 7) {
j++;
}
n = j;
cout<<"刷新成功!!!"<<endl;
return n;
}
//查找学生信息
void seek() /*查找*/
{
int i,
item, flag;int p=n;
string s1;
/* 以姓名和学号最长长度+1为准*/
cout<<"------------------"<<endl;
cout<<"-----1.按学号查询-----"<<endl;
cout<<"-----2.按姓名查询-----"<<endl;
cout<<"-----3.退出本菜单-----"<<endl;
cout<<"------------------"<<endl;
while (1)
{
cout<<"请选择子菜单编号:";
cin>>item;
flag
= 0;
switch
(item)
{
case
1://按学号查询
{
cout<<"请输入要查询的学生的学号:"<<endl;
cin>>s1;
for
(i = 1; i<=p; i++)
if
(stu[i].StudentId==s1)//字符串比较,如果两个学号相等
{
flag
= 1;
//输出该学号的学生的信息
cout<<"学生学号\t学生姓名\t年龄\t性别\tC语言成绩\t高等数学\t大学英语成绩\n";
cout<<"--------------------------------------------------------------------\n"<<endl;
cout<<stu[i].StudentId<<"\t"<<stu[i].StudentName<<"\t"<<stu[i].StudentAge<<"\t"<<stu[i].StudentSex<<"\t"<<stu[i].score[0]<<"\t"<<stu[i].score[1]<<"\t"<<stu[i].score[2]<<endl;
}
if
(0 == flag)//学号不存在时给出提示
cout<<"该学号不存在!"<<endl;break;}
case
2://按姓名查询
cout<<"请输入要查询的学生的姓名:"<<endl;
cin>>s1;
for
(i = 1; i<=p; i++)
if
(stu[i].StudentName==s1)
{
flag
= 1;
//输出该学号的学生的信息
cout<<"学生学号\t学生姓名\t年龄\t性别\tC语言成绩\t高等数学\t大学英语成绩"<<endl;
cout<<"--------------------------------------------------------------------"<<endl;
cout<<stu[i].StudentId<<"\t"<<stu[i].StudentName<<"\t"<<stu[i].StudentAge<<"\t"<<stu[i].StudentSex<<"\t"<<stu[i].score[0]<<"\t"<<stu[i].score[1]<<"\t"<<stu[i].score[2]<<endl;
}break;
if
(0 == flag)//姓名不存在时给出提示
printf("该姓名不存在!\n");
case
3:return;
default:printf("请在1-3之间选择\n");
}
}
}
//修改学生信息
void modify() /*修改信息*/
{
int i,
item, num = -1;
int p=n;
string
s1,s2; /* 以姓名和学号最长长度+1为准*/
cout<<"请输入要要修改的学生的学号:"<<endl;
cin>>
s1;//输入要要修改的学生的学号
for (i =
1; i <=p; i++){
if
(stu[i].StudentId==s1){/*比较字符串是否相等*/
num
= i;
cout<<"------------------"<<endl;
cout<<"1.修改姓名"<<endl;
cout<<"2.修改年龄"<<endl;
cout<<"3.修改性别"<<endl;
cout<<"4.修改C语言成绩"<<endl;
cout<<"5.修改高等数学成绩"<<endl;
cout<<"6.修改大学英语成绩"<<endl;
cout<<"7.退出本菜单"<<endl;
cout<<"------------------"<<endl;
while
(1)
{
cout<<"请选择子菜单编号:";
cin>>item;//输入子菜单编号
switch
(item)
{
case
1:
cout<<"请输入新的姓名:"<<endl;
cin>>stu[num].StudentName;//输入的新的姓名
break;
case
2:
cout<<"请输入新的年龄:"<<endl;
cin>>stu[num].StudentAge;//输入新的年龄
break;
case
3:
cout<<"请输入新的性别:"<<endl;
cin>>stu[i].StudentSex
;//输入的新的性别
break;
case
4:
cout<<"请输入新的C语言成绩:"<<endl;
cin>>stu[num].score[0]
;//输入的新的C语言成绩
break;
case
5:
cout<<"请输入新的高等数学成绩:"<<endl;//输入的新的高等数学成绩
cin>>stu[num].score[1];
break;
case
6:
cout<<"请输入新的大学英语成绩:"<<endl;//输入的新的大学英语成绩
cin>>stu[num].score[2];
break;
case
7: return;
default:cout<<"请在1-7之间选择"<<endl;
}
}
cout<<"修改完毕!请及时保存!"<<endl;
}
else{
cout<<"没有该学生学号!!!"<<endl;
}
}
}
void sort()//按学号排序
{
int i, j,
k, *p, *q, s;
string
temp, ctemp;int itemp=0;
float
ftemp;
for (i =
1; i<=n - 1; i++)
{
for
(j = n - 1; j>i; j--)
if
(stu[j - 1].StudentId> stu[j].StudentId)//如果前一个学号比后一个学号大
{
//交换学号
temp=stu[j
- 1].StudentId;
stu[j -
1].StudentId=stu[j].StudentId;
stu[j].StudentId=temp;
//交换姓名
temp=stu[j
- 1].StudentName;
stu[j
- 1].StudentName=stu[j].StudentName;
stu[j].StudentName=
temp;
//交换性别
ctemp
= stu[j - 1].StudentSex;
stu[j
- 1].StudentSex = stu[j].StudentSex;
stu[j].StudentSex
= ctemp;
//交换年龄
itemp
= stu[j - 1].StudentAge ;
stu[j
- 1].StudentAge = stu[j].StudentAge;
stu[j].StudentAge
= itemp;
//交换三科成绩
for
(k = 0; k<3; k++)
{
ftemp
= stu[j - 1].score[k];
stu[j
- 1].score[k] = stu[j].score[k];
stu[j].score[k]
= ftemp;
}
}
}
}
//添加学生信息函数
void insert()
{
int i = n,
j, flag;
cout<<"请输入待增加的学生数:"<<endl;
cin>>m;
if(m>0)
{
for(int
i=n-1;i<n+m;i++)
{
flag
= 1;
while
(flag)
{
flag = 0;
printf("请输入第%d位学生的学号:\n", i + 1);
cin>>
stu[i].StudentId;
for
(j = 0; j <= i; j++){
if
(stu[i].StudentId==stu[j].StudentId){//如果学号已经存在
cout<<"该学号已存在,请重新输入!"<<endl;
flag
= 1;
break;
}
}
}
printf("请输入第%d 个学生的姓名:\n",i+1);
cin>>stu[i].StudentName;
printf("请输入第%d 个学生的年龄:\n",i+1);
cin>>stu[i].StudentAge;
printf("请输入第%d 个学生的性别:\n",i+1);
cin>>stu[i].StudentSex;
printf("请输入第%d 个学生的C语言成绩\n",i+1);
cin>>stu[i].score[0];
if(stu[i].score[0]<0||stu[i].score[0]>100)//对输入的成绩进行判错,成绩应该在0-100之间
{
cout<<"输错了,请重新输入成绩" <<endl;
cin>>stu[i].score[0];
}
printf("请输入第%d 个学生的高等数学成绩:\n",i+1);
cin>>stu[i].score[1];
if(stu[i].score[0]<0||stu[i].score[0]>100)
{
cout<<"输错了,请重新输入成绩" <<endl;
cin>>stu[i].score[1];
}
printf("请输入第%d 个学生的大学英语成绩:\n",i+1);
cin>>stu[i].score[2];
if(stu[i].score[0]<0||stu[i].score[0]>100)
{
cout<<"输错了,请重新输入成绩" <<endl;
cin>>stu[i].score[2];
}
}
}
n
+= m;//学生数增加
cout<<"学生信息增加完毕!!!"<<endl;
}
//删除学生信息函数
void del()
{
int i, j,
flag = 0;
char
s1[LEN + 1];
printf("请输入要删除学生的学号:\n");
scanf("%s",
s1);
for (i =
0; i < n; i++){
if
(stu[i].StudentId==s1){
flag
= 1;
//要删除学生后面的学生往前移一位
for
(j = i; j <=n - 1; j++){
stu[j]
= stu[j + 1];//
}
}
}
//查找失败
if
(0 == flag){
printf("该学号不存在!!!\n");
}
if
(1 == flag){
printf("删除成功!!!");
//删除成功,学生人数减1
n--;
}
system("pause");
}
//显示全部数据信息
void display()
{
int i;
printf("学生学号 \t学生姓名 \t年龄 \t性别
\tC语言成绩\t高等数学 \t大学英语成绩\n");
printf("--------------------------------------------------------------------\n");
for
(i = 0; i<=n; i++)
{
cout<<stu[i].StudentId<<"\t"<<stu[i].StudentName<<"\t"<<stu[i].StudentAge<<"\t"<<stu[i].StudentSex<<"\t"<<stu[i].score[0]<<"\t"<<stu[i].score[1]<<"\t"<<stu[i].score[2]<<endl;
}
}
void save(){
int i;
sort();
FILE *fp;
ofstream
out("in.txt");
for (i =
1; i < n; i++){
out<<stu[i].StudentId<<"\t"<<stu[i].StudentName<<"\t"<<stu[i].StudentAge<<"\t"<<stu[i].StudentSex<<"\t"<<stu[i].score[0]<<"\t"<<stu[i].score[1]<<"\t"<<stu[i].score[2]<<endl;
}
printf("保存成功!!!\n");
out.close();
}
void menu()/* 界面*/
{
int num;
printf("
\n\n \n\n");
printf("
******************************************************\n\n");
printf(" * 学生信息管理系统 *\n \n");
printf("
******************************************************\n\n");
printf("*********************系统功能菜单************************* \n");
printf(" ---------------------- ---------------------- \n");
printf("
********************************************* \n");
printf(" * 0.系统帮助及说明 * * 1.刷新学生信息 * \n");
printf("
********************************************* \n");
printf(" * 2.查询学生信息 * * 3.修改学生信息 * \n");
printf("
********************************************* \n");
printf(" * 4.增加学生信息 * * 5.按学号删除信息 * \n");
printf("
********************************************* \n");
printf(" * 6.显示当前信息 * * 7.保存当前学生信息* \n");
printf(" **********************
********************** \n");
printf(" * 8.退出系统 * \n");
printf(" ********************** \n");
printf(" ---------------------- ---------------------- \n");
printf("请选择菜单编号:");
scanf("%d",
&num);
switch (num)
{
case
0:help(); break;
case
1:flush(); break;
case
2:seek(); break;
case
3:modify(); break;
case
4:insert(); break;
case
5:del(); break;
case
6:display(); break;
case
7:save(); break;
case 8:
k =
0;
printf("即将退出程序!\n");
break;
default:printf("请在0-8之间选择\n");
}
}