一、题目要求
对学生信息管理系统,要求完成以下基本任务:
1.改写程序为良好程序风格(文档注释,函数注释,语句注释)。
2.将功能补充完全(基于文件处理,完成刷新和保存功能)。
3.将学生信息改为更好的数据组织,而非离散形式(结构体)。
提高要求:
可将程序中的不足(如数据验证)等根据自己的能力与理解完成。
题目所给代码
#include<stdio.h> /*I/O函数*/
#include<stdlib.h> /*其它说明*/
#include<string.h> /*字符串函数*/
#define LEN 15 /* 学号和姓名最大字符数,实际请更改*/
#define N 50 /* 最大学生人数,实际请更改*/
char* code[N]; /* 学号*/
char* name[N]; /* 姓名*/
int age[N]; /* 年龄*/
char sex[N]; /* 性别*/
float score[N][3]; /* 3门课程成绩*/
int k=1,n=0, m=0;/* n代表当前记录的学生人数*/
void seek();
void modify();
void insert();
void del();
void display();
void menu();
int main()
{
while(k)
{
menu();
}
system("pause");
return 0;
}
void help()
{
printf("\n0.欢迎使用系统帮助!\n");
printf("\n1.初次进入系统后,请先选择增加学生信息;\n");
printf("\n2.按照菜单提示键入数字代号;\n");
printf("\n3.增加学生信息后,切记保存;\n");
printf("\n4.谢谢您的使用!\n");
}
void seek() /*查找*/
{
int i,item,flag;
char s1[21]; /* 以姓名和学号最长长度+1为准*/
printf("------------------\n");
printf("-----1.按学号查询-----\n");
printf("-----2.按姓名查询-----\n");
printf("-----3.退出本菜单-----\n");
printf("------------------\n");
while(1)
{
printf("请选择子菜单编号:");
scanf("%d",&item);
flag=0;
switch(item)
{
case 1:
printf("请输入要查询的学生的学号:\n");
scanf("%s",s1);
for(i=0;i<n;i++)
if(strcmp(code[i],s1)==0)
{
flag=1;
printf("学生学号 学生姓名 年龄 性别 C语言成绩 高等数学 大学英语成绩\n");
printf("--------------------------------------------------------------------\n");
printf("%6s %7s %6d %6c %9.1f %10.1f %10.1f\n",code[i],name[i],age[i],
sex[i],score[i][0],score[i][1],score[i][2]);
}
if(0==flag)
printf("该学号不存在!\n"); break;
case 2:
printf("请输入要查询的学生的姓名:\n");
scanf("%s",s1);
for(i=0;i<n;i++)
if(strcmp(name[i],s1)==0)
{
flag=1;
printf("学生学号 学生姓名 年龄 性别 C语言成绩 高等数学 大学英语成绩\n");
printf("--------------------------------------------------------------------\n");
printf("%6s %7s %6d %6c %9.1f %10.1f %10.1f\n",code[i],name[i],age[i],
sex[i],score[i][0],score[i][1],score[i][2]);
}
if(0==flag)
printf("该姓名不存在!\n"); break;
case 3:return;
default:printf("请在1-3之间选择\n");
}
}
}
void modify() /*修改信息*/
{
int i,item,num;
char sex1,s1[LEN+1],s2[LEN+1]; /* 以姓名和学号最长长度+1为准*/
float score1;
printf("请输入要要修改的学生的学号:\n");
scanf("%s",s1);
for(i=0;i<n;i++)
if(strcmp(code[i],s1)==0) /*比较字符串是否相等*/
num=i;
printf("------------------\n");
printf("1.修改姓名\n");
printf("2.修改年龄\n");
printf("3.修改性别\n");
printf("4.修改C语言成绩\n");
printf("5.修改高等数学成绩\n");
printf("6.修改大学英语成绩\n");
printf("7.退出本菜单\n");
printf("------------------\n");
while(1)
{
printf("请选择子菜单编号:");
scanf("%d",&item);
switch(item)
{
case 1:
printf("请输入新的姓名:\n");
scanf("%s",s2);
strcpy(name[num],s2); break;
case 2:
printf("请输入新的年龄:\n");
scanf("%d",age[num]);break;
case 3:
printf("请输入新的性别:\n");
scanf("%c",&sex1);
sex[num]=sex1; break;
case 4:
printf("请输入新的C语言成绩:\n");
scanf("%f",&score1);
score[num][0]=score1; break;
case 5:
printf("请输入新的高等数学成绩:\n");
scanf("%f",&score1);
score[num][1]=score1; break;
case 6:
printf("请输入新的大学英语成绩:\n");
scanf("%f",&score1);
score[num][2]=score1; break;
case 7: return;
default:printf("请在1-7之间选择\n");
}
}
}
void sort()/*按学号排序*/
{
int i,j,k,*p,*q,s;
char temp[LEN+1],ctemp;
float ftemp;
for(i=0;i<n-1;i++)
{
for(j=n-1;j>i;j--)
if(strcmp(code[j-1],code[j])>0)
{
strcpy(temp,code[j-1]);
strcpy(code[j-1],code[j]);
strcpy(code[j],temp);
strcpy(temp,name[j-1]);
strcpy(name[j-1],name[j]);
strcpy(name[j],temp);
ctemp=sex[j-1];
sex[j-1]=sex[j];
sex[j]=ctemp;
p=&age[j-1];
q=&age[j];
s=*q;
*q=*p;
*p=s;
for(k=0;k<3;k++)
{
ftemp=score[j-1][k];
score[j-1][k]=score[j][k];
score[j][k]=ftemp;
}
}
}
}
void insert() /*插入函数*/
{
int j=n;
printf("请输入待增加的学生数:\n");
scanf("%d",&m);
do
{
code[j]=(char *)malloc(10);
name[j]=(char *)malloc(15);
printf("请输入第%d 个学生的学号:\n",j-n+1);
scanf("%s",code[j]);
printf("请输入第%d 个学生的姓名:\n",j-n+1);
scanf("%s",name[j]);
printf("请输入第%d 个学生的年龄:\n",j-n+1);
scanf("%d",&age[j]);
printf("请输入第%d 个学生的性别:\n",j-n+1);
scanf(" %c",&sex[j]);
printf("请输入第%d 个学生的C语言成绩\n",j-n+1);
scanf("%f",&score[j][0]);
printf("请输入第%d 个学生的高等数学成绩:\n",j-n+1);
scanf("%f",&score[j][1]);
printf("请输入第%d 个学生的大学英语成绩:\n",j-n+1);
scanf("%f",&score[j][2]);
j++;
}while(j<n+m);
n+=m;
printf("信息增加完毕!\n\n");
sort();
}
void del()
{
int i,j,flag=0;
char s1[LEN+1];
printf("请输入要删除学生的学号:\n");
scanf("%s",s1);
for(i=0;i<n;i++)
if(strcmp(code[i],s1)==0)
{
flag=1;
for(j=i;j<n-1;j++)
code[j]=code[j+1];
name[j]=name[j+1];
age[j]=age[j+1];
sex[j]=sex[j+1];
score[j][0]=score[j+1][0];
score[j][1]=score[j+1][1];
score[j][2]=score[j+1][2];
}
if(flag==0)
printf("该学号不存在!\n");
if(flag==1)
{
printf("删除成功,显示结果请选择菜单\n");
n--;
}
}
void display()
{
int i;
printf("共有%d位学生的信息:\n",n);
if(0!=n)
{
printf("学生学号 学生姓名 年龄 性别 C语言成绩 高等数学 大学英语成绩\n");
printf("--------------------------------------------------------------------\n");
for(i=0;i<n;i++)
{
printf("%7s %7s %6d %6c %9.1f %10.1f %10.1f\n",code[i],name[i],age[i],sex[i],score[i][0],score[i][1],score[i][2]);
}
}
}
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 2:seek();break;
case 3:modify();break;
case 4:insert();break;
case 5:del();break;
case 6:display();break;
case 8:k=0;break;
default:printf("请在0-8之间选择\n");
}
}
二、算法构造
1、算法流程图
2、算法N-S图:
三、算法实现
data.h文件:
#include <iostream>
#include <cstdlib>
#include <string.h>
#define LEN 15 /* 学号和姓名最大字符数,实际请更改*/
#define N 50
using namespace std;
class Data {
protected:
char* code[N]; /* 学号*/
char* name[N]; /* 姓名*/
int age[N]; /* 年龄*/
char sex[N]; /* 性别*/
float score[N][3]; /* 3门课程成绩*/
int k; //用于控制菜单桌面
int n;
int m;/* n代表当前记录的学生人数*/
public:
Data() {
k = 1;
n = 0;
m = 0;
}
int getK() {
return k;
}
};
method.h文件:
#include "data.h"
#include <fstream>
class Method : public Data {
public:
ofstream outfile;
void help(); //help 菜单显示
void seek(); //查询信息函数
void modify(); //修改信息函数
void insert(); //插入信息函数
void del(); //删除信息函数
void display();//统计信息数函数
void menu(); //菜单界面
void sort(); //排序函数
void preservation(); //保存函数
void refresh(); //刷新函数
};
method.cpp文件
#include "method.h"
void Method::help() {
//帮助输出
cout << "\n0.欢迎使用系统帮助!\n";
cout << "\n1.初次进入系统后,请先选择增加学生信息;\n";
cout << "\n2.按照菜单提示键入数字代号;\n";
cout << "\n3.增加学生信息后,切记保存;\n";
cout << "\n4.谢谢您的使用!\n";
}
void Method::seek() {
int i, item, flag;
char s1[21]; /* 以姓名和学号最长长度+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 = 0; i < n; i++)//寻找学号为是s1的同学并输出信息
if (strcmp(code[i], s1) == 0)
{
flag = 1;
cout << "学生学号 学生姓名 年龄 性别 C语言成绩 高等数学 大学英语成绩" << endl;
cout << "--------------------------------------------------------------------" << endl;
/*printf( "%6s %7s %6d %6c %9.1f %10.1f %10.1f\n", code[i], name[i], age[i],
sex[i], score[i][0], score[i][1], score[i][2]);*/
cout << code[i] << " " << name[i] << " " << age[i] << " " << sex[i] << " "
<< score[i][0] << " " << score[i][1] << " " << score[i][2];
}
if (0 == flag)
cout << "该学号不存在!" << endl;
break;
case 2://选择按姓名查询
cout << "请输入要查询的学生的姓名:" << endl;
cin >> s1;
for (i = 0; i < n; i++)//寻找姓名为是s1的同学并输出信息
if (strcmp(name[i], s1) == 0)
{
flag = 1;
cout << "学生学号 学生姓名 年龄 性别 C语言成绩 高等数学 大学英语成绩" << endl;
cout << "--------------------------------------------------------------------" << endl;
/*printf( "%6s %7s %6d %6c %9.1f %10.1f %10.1f\n", code[i], name[i], age[i],
sex[i], score[i][0], score[i][1], score[i][2]);*/
cout << code[i] << " " << name[i] << " " << age[i] << " " << sex[i] << " "
<< score[i][0] << " " << score[i][1] << " " << score[i][2];
}
if (0 == flag)
cout << "该姓名不存在!" << endl;
break;
case 3:
return;
default:
cout << "请在1-3之间选择" << endl;
}
}
}
void Method::modify() {
int i, item, num;
char sex1, s1[LEN + 1], s2[LEN + 1]; /* 以姓名和学号最长长度+1为准*/
float score1;
cout << "请输入要要修改的学生的学号:" << endl;
cin >> s1;
for (i = 0; i < n; i++)
if (strcmp(code[i], s1) == 0) /*比较字符串是否相等*/
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 >> s2;
strcpy(name[num], s2); //将新的姓名替换原来的姓名
break;
case 2:
cout << "请输入新的年龄:" << endl;
cin >> age[num]; //直接更换年龄
break;
case 3:
cout << "请输入新的性别:" << endl;
cin >> sex1; //更换性别
sex[num] = sex1;
break;
//case 4,case 5,case 6均为修改成绩
case 4:
cout << "请输入新的C语言成绩:" << endl;
cin >> score1; //更改成绩
score[num][0] = score1;
break;
case 5:
cout << "请输入新的高等数学成绩:" << endl;
cin >> score1;
score[num][1] = score1;
break;
case 6:
cout << "请输入新的大学英语成绩:" << endl;
cin >> score1;
score[num][2] = score1;
break;
case 7:
return;
default:
cout << "请在1-7之间选择" << endl;
}
}
}
void Method::sort()/*按学号排序*/
{
int i, j, k, *p, *q, s;
char temp[LEN + 1], ctemp;
float ftemp;
for (i = 0; i < n - 1; i++)
{
for (j = n - 1; j > i; j--)
if (strcmp(code[j - 1], code[j]) > 0)
{
strcpy(temp, code[j - 1]);
strcpy(code[j - 1], code[j]);
strcpy(code[j], temp);
strcpy(temp, name[j - 1]);
strcpy(name[j - 1], name[j]);
strcpy(name[j], temp);
ctemp = sex[j - 1];
sex[j - 1] = sex[j];
sex[j] = ctemp;
p = &age[j - 1];
q = &age[j];
s = *q;
*q = *p;
*p = s;
for (k = 0; k < 3; k++)
{
ftemp = score[j - 1][k];
score[j - 1][k] = score[j][k];
score[j][k] = ftemp;
}
}
}
}
void Method::insert() /*插入函数*/
{
int j = n;
cout << "请输入待增加的学生数:" << endl;
cin >> m;
do
{
code[j] = (char *)malloc(10);
name[j] = (char *)malloc(15);
cout << "请输入第" << j - n + 1 << "个学生的学号:" << endl;
cin >> code[j];
cout << "请输入第" << j - n + 1 << " 个学生的姓名:" << endl;
cin >> name[j];
cout << "请输入第" << j - n + 1 << " 个学生的年龄:" << endl;
cin >> age[j];
cout << "请输入第" << j - n + 1 << " 个学生的性别:" << endl;
cin >> &sex[j];
cout << "请输入第" << j - n + 1 << " 个学生的C语言成绩" << endl;
cin >> score[j][0];
cout << "请输入第" << j - n + 1 << " 个学生的高等数学成绩:" << endl;
cin >> score[j][1];
cout << "请输入第" << j - n + 1 << " 个学生的大学英语成绩:" << endl;
cin >> score[j][2];
j++;
} while (j < n + m);
n += m;
cout << "信息增加完毕!" << endl << endl;
sort();
}
void Method::del()
{
int i, j, flag = 0;
char s1[LEN + 1];
cout << "请输入要删除学生的学号:" << endl;
cin >> s1;
for (i = 0; i < n; i++)
if (strcmp(code[i], s1) == 0)//寻找学号
{
flag = 1;
//删除信息并且将下一位置的信息补上来
for (j = i; j < n - 1; j++)
code[j] = code[j + 1];
name[j] = name[j + 1];
age[j] = age[j + 1];
sex[j] = sex[j + 1];
score[j][0] = score[j + 1][0];
score[j][1] = score[j + 1][1];
score[j][2] = score[j + 1][2];
}
if (flag == 0)
cout << "该学号不存在!" << endl;
if (flag == 1)
{
cout << "删除成功,显示结果请选择菜单" << endl;
n--;
}
}
void Method::refresh() {
outfile.open("./Student_information.txt", ios::app);
cout << "正在刷新学生信息,并保存(详见Student_information.txt文件)" << endl;
cout << "............" << endl;
cout << "............" << endl;
cout << "............" << endl;
cout << "............" << endl;
cout << "............" << endl;
outfile << "共有" << n << "位学生的信息:" << endl;
if (0 != n)
{
outfile << "学生学号 学生姓名 年龄 性别 C语言成绩 高等数学 大学英语成绩" << endl;
outfile << "--------------------------------------------------------------------" << endl;
for (int i = 0; i < n; i++)
{
outfile << code[i] << " " << name[i] << " " << age[i] << " " << sex[i] << " "
<< score[i][0] << " " << score[i][1] << " " << score[i][2];
}
}
cout << "刷新成功!" << endl;
}
void Method::preservation() {
outfile.open("./Student_information.txt", ios::app);
cout << "正在录入学生信息,并保存(详见Student_information.txt文件)" << endl;
cout << "............" << endl;
cout << "............" << endl;
cout << "............" << endl;
cout << "............" << endl;
cout << "............" << endl;
outfile << "共有" << n << "位学生的信息:" << endl;
if (0 != n)
{
outfile << "学生学号 学生姓名 年龄 性别 C语言成绩 高等数学 大学英语成绩" << endl;
outfile << "--------------------------------------------------------------------" << endl;
for (int i = 0; i < n; i++)
{
outfile << code[i] << " " << name[i] << " " << age[i] << " " << sex[i] << " "
<< score[i][0] << " " << score[i][1] << " " << score[i][2] << endl;
}
}
outfile.close();
cout << "保存成功!" << endl;
cout << "是否打开?(Y/N)" << endl;
char falg = 'N';
cin >> falg;
switch (falg){
case 'Y':
cout << "请打开'Student_information.txt'查看!" << endl;
break;
case 'N':
return;
default:
cout << "输入错误,默认退出!" << endl;
return;
}
}
void Method::display()
{
int i;
cout << "共有" << n << "位学生的信息:" << endl;
if (0 != n)
{
cout << "学生学号 学生姓名 年龄 性别 C语言成绩 高等数学 大学英语成绩" << endl;
cout << "--------------------------------------------------------------------" << endl;
for (i = 0; i < n; i++)
{
/*printf( "%7s %7s %6d %6c %9.1f %10.1f %10.1f\n", code[i],
name[i], age[i], sex[i], score[i][0], score[i][1], score[i][2]);*/
cout << code[i] << " " << name[i] << " " << age[i] << " " << sex[i] << " "
<< score[i][0] << " " << score[i][1] << " " << score[i][2];
}
}
}
void Method::menu()/* 界面*/
{
int num;
//菜单打印
cout << " \n\n \n\n";
cout << " ******************************************************\n\n";
cout << " * 学生信息管理系统 *\n \n";
cout << " ******************************************************\n\n";
cout << "*********************系统功能菜单************************* \n";
cout << " ---------------------- ---------------------- \n";
cout << " ********************************************* \n";
cout << " * 0.系统帮助及说明 * * 1.刷新学生信息 * \n";
cout << " ********************************************* \n";
cout << " * 2.查询学生信息 * * 3.修改学生信息 * \n";
cout << " ********************************************* \n";
cout << " * 4.增加学生信息 * * 5.按学号删除信息 * \n";
cout << " ********************************************* \n";
cout << " * 6.显示当前信息 * * 7.保存当前学生信息* \n";
cout << " ********************** ********************** \n";
cout << " * 8.退出系统 * \n";
cout << " ********************** \n";
cout << " ---------------------- ---------------------- \n";
cout << "请选择菜单编号:";
cin >> num;
//菜单选择
switch (num)
{
case 0:
help();
break;
case 1:
refresh();
break;
case 2:
seek();
break;
case 3:
modify();
break;
case 4:
insert();
break;
case 5:
del();
break;
case 6:
display();
break;
case 7:
preservation();
break;
case 8:
k = 0;
break;
default:
cout << "请在0-8之间选择\n";
}
}
main.cpp文件
#include "method.h"
#include <direct.h>
int main()
{
Method metho;
while (metho.getK())
{
metho.menu();
}
system("pause");
system("del Student_information.txt");
return 0;
}
四、总结
对于学生管理系统的开发已经非常熟悉,在结构化原来的代码过程中基本没有遇见什么问题,
所以本次上机其实并不难,主要是逻辑和数据存储上的细心.