C语言综合实验报告
1.实验名称:学生成绩管理系统 2.班级:电气信息类091 3.学号:09570114 4.姓名:高宇 5.指导老师:林巧
1.实验内容
1-1.实验名称:学生成绩管理系统。 1-2.实验目的:
1) 利用所学的三种程序基本结构以及数组、用户自定义函数
进行一个简单系统的设计,进一步理解和掌握C语言的语法以及三种基本结构的综合应用。
2) 通过程序中涉及到的排序、查找、求和等操作加深对算法、程序设计思路、常用程序设计技巧的理解与掌握,逐步培养学生的程序开发能力。
1-3.实验要求:
A.实验基本功能要求
设某班有n位同学,每位同学的数据包括以下内容:学号(长整型或字符串型)、姓名(字符串)、数学成绩(整型)、程序设计成绩(整型)。设计程序完成以下五项功能:新建数据档案、添加数据、删除数据、对输入的数据进行排序和查询。 注意:
1) 输入数据时,要求学号不能相同,姓名可以相同。 2) 在学习“结构体”和“文件”之前也可以进行本项程序设计,
采用多个数组存储数据,同一学生信息对应的数组元素下标相同。
B.实验具体设计要求
(一).程序运行时,首先显示主菜单如下:
1.新建数据 2.添加数据 3.删除数据 4.排序 5.查询 6.退出
屏幕提示:请输入序号选择相应操作。
要求当用户输入任意序号后,程序都能进行相应操作。 (二). 在主菜单中选择序号4,弹出子菜单选择排序方
式,子菜单如下:
1.数学成绩排序 2.程序设计成绩排序 3.总分排序 4.返回主菜单
请按序号选择相应操作。
选择子菜单的序号后,程序能正确运行并在屏幕上显示按要求排序后的相关信息。
(三).在主菜单中选择序号5,弹出子菜单选择查询方式,子菜单如下:
1.学号查询 2.姓名查询 3.数学成绩查询
4.程序设计成绩查询 5.总分查询 6.返回主菜单
请按序号选择相应操作。
在子菜单中选择序号后,程序按以下方式运行:
1).学号查询:输入学号后,若该学号存在则显示与其相关的所有信息,否则显示找不到的提示信息;(提示:查询到满足条件的结果后,查询即可结束)
2).姓名查询:输入姓名后,若该姓名存在则显示与其相关的所有信息,否则显示找不到的提示信息;(提示:使用字符串比较函数进行比较)
3).按科目查询:输入指定分数,程序运行后显示该科目中考试成绩大于等于指定分数的同学的学号、姓名以及该科成绩并统计满足条件的人数;
4).总分查询:输入指定分数,程序运行后显示总分成绩大于等于指定分数的同学的学号、姓名以及各科成绩并统计满足条件的人数;
2.算法说明
Menu
S2.若cho1=1,则执行ned。 若cho1=2,则执行add 若cho1=3,则执行del 若cho1=4,则执行arr1 若cho1=5,则执行see
S1.输入cho1选择相应的操作。
若cho1=6,则输出“欢迎使用本程序!再见!”。 否则输出“请输入屏幕中所显示的序号”
Ned
S8.输入n,确定新建数据个数。执行data S9执行printe S10.执行menu Add
S11.输入m确定添加数据的个数。执行data. S12.执行printe S13.执行menu. Del
S14.输入要删除的学号。
S15.如果y=1,输出“已成功删除您所要求的学生”, 如果y=0,输出“不存在该学生”。
S16.执行printe S17执行nenu Arr1
S18输入cho2,选择相应操作。 S19若cho2=1或2或3,执行arr2, 若cho2=4,执行menu,
否则输出“请输入屏幕中所显示的学号”
Arr2
S20进行排序。 S21执行printe S22执行arr1 See
S24输入cho3,选择相应的序号。 S25若cho3=1或2,执行ch1, 若cho3=3或4或5,执行ch2, 若cho3=6,执行menu,
否则输出“请输入屏幕中所显示的序号”
Ch1
S26输出“请输入您要查询的人数”,输入k, S27输入学号或姓名。
S28若该学生学号和姓名存在则输出与其相关的所有信息,否则输出“不存在该学生”
S29执行see Ch2
S30输出“请输入您要查询的分数”
程序运行后显示该科目中考试成绩大于等于指定分数的同
学的学号、姓名以及该科成绩并统计满足条件的人数;
S31执行see Data
S32请输入学号 S33 a2=0
S34如果该学号已出现,输出“该学号已出现,请您重新输入”,
a2=1,执行S32。 否则,执行S35。 S35 输入姓名 S36输入数学成绩 S37输入程序设计成绩 Printe
S38执行zhuan S39输出结构体 Zhuan
S40把结构体转换为数组
3.程序清单
#include#include #include #define M 50 #define R printf #define F scanf#define N \"\\n\"
int n=0; /*存放新建的数据个数*/ int m=0; /*存放添加的数据个数*/ int w; /*存放总的数据个数*/ struct student {
char num[4]; char nam[4]; int mat;
int pro; int sum;
}stu[M],temp;
void menu(); /*主菜单*/ void ned(); /*新建数据*/ {
void add(); /*添加数据*/ void del(); /*删除数据*/
void zhuan(); /*转换*/ void arr1(); /*排序*/ void see(); /*查找*/
void data(int k,int q); /*新建和添加数据时用来输入输出数据*/
void arr2(int f[]); /*分别在data和arr1中担当排序程序*/
void print(int k); /*在arr2、ned、add、和del中担当输出数据*/ void ch1(char f[][4],char g[100]);
void ch2(int f[100],char g[100]); /*查找的子程序*/
void main()
menu();
}
void menu() { int cho1;
R(N\"\\\****************************************\"N); R(N\"\\\* 欢迎进入学生成绩管理系统 *\"N); R(N\"\\\* 1.新建数据 *\"N); R(N\"\\\* 2.添加数据 *\"N); R(N\"\\\* 3.删除数据 *\"N); R(N\"\\\* 4.排序 *\"N); R(N\"\\\* 5.查询 *\"N); R(N\"\\\* 6.退出 *\"N);
R(N\"\\\****************************************\"N); R(N\"请输入序号选择相应的操作:\");
while(1) { F(\"%d\ switch(cho1)
{ case 1: ned();break; case 2: add();break; case 3: del();break; case 4: arr1();break;
case 5: see();break;
case 6: R(\"欢迎使用本程序!再见!\"N);break;
default: R(N\"!!!!!!!!!!!!!!!!!!请输入屏幕中所显示的序号:\");continue;
} break; }system(\"cls\");
}
void ned()
{ system(\"cls\"); R(N\"请输入新建数据的个数:\"); }
F(\"%d\data(n,0); system(\"cls\"); print(n); w=m+n; menu();
void add() { }
system(\"cls\");
R(N\"请输入添加数据的个数;\"); F(\"%d\ w=m+n; data(n+m,n); system(\"cls\"); print(n+m); menu();
char a[50][4],b[50][4];int c[50],d[50],e[50]; void zhuan() {
int i,j;
for(i=0;ifor(j=0;j<4;j++) {}
a[i][j]=stu[i].num[j]; b[i][j]=stu[i].nam[j]; }
c[i]=stu[i].mat; d[i]=stu[i].pro; e[i]=stu[i].sum;
}
void del()
{ int h,i,j,y;char f[4];
w=m+n;
system(\"cls\"); R(N\"请输入要删除的学号(三位数字):\"N); F(\"%s\ for(j=0;jif(strcmp(stu[j].num,f)==0) { if(i==(w-1)){
w--;y=1;break;
} else {
for(h=j;h} } }if(y==1) R(N\"已成功删除您所要求的学生%s\"N,f); else R(N\"!!!!!!!!!!!!!!不存在学生%s\"N,f);
n=w; print(w); menu();
void arr1() { int cho2;
R(\"\\\-------------------------------\"N);
R(\"\\\- 排序 -\"N); R(\"\\\- 1.数学成绩排序 -\"N); R(\"\\\- 2.程序设计成绩排序 -\"N); R(\"\\\- 3.总分排序 -\"N);
R(\"\\\- 4.返回主菜单 -\"N); R(\"\\\-------------------------------\"N); R(N\"请按序号选择相应的操作\");
while(1) { F(\"%d\
switch(cho2) {
case 1: arr2(c);break; case 2: arr2(d);break; case 3: arr2(e);break;
case 4: menu();break;
default: R(N\"!!!!!!!!!!!!!!!!!!请输入屏幕中所显示的序号:\"N);continue;
}
}break;
}
void see()
{ int cho3; char f[5][100]={{\"学号\姓名\数学成绩\程序设计成绩\总分\
R(\"\\\------------------------------------\"N);
R(\"\\\- 查询 -\"N); R(\"\\\- 1.学号查询 -\"N); R(\"\\\- R(\"\\\- R(\"\\\- R(\"\\\-
2.姓名查询 3.数学成绩查询 5.总分查询 6.返回主菜单
-\"N); -\"N); -\"N); -\"N);
R(\"\\\------------------------------------\"N); R(\"请按序号选择相应的操作:\"); while(1) { F(\"%d\ }
switch(cho3) {
case 1: ch1(a,f[0]);break; case 2: ch1(b,f[1]);break;
case 3: ch2(c,f[2]);break; case 4: ch2(d,f[3]);break; case 5: ch2(e,f[4]);break;
case 6: menu();break;
default: R(N\"!!!!!!!!!!!!请输入屏幕中所显示的序号:\"N);continue;
}break;
}
void data(int k,int q) {
int t,i,j,a2;
for(i=q;i{ R(\"=====================================================================\"N);do
{
R(N\"请输入 第%d个学生的 学号 :\ a2=0;
F(\"%s\for(j=i-1;j>=0;j--) {
if(strcmp(stu[i].num,stu[j].num)==0) {R(N\"!!!!!!!!!!!该学号已出现,请您重新输入:\"N);a2=1; break;}
}
}while(a2);
R(\"请输入 第%d个学生的 姓名 :\ F(\"%s\ R(\"请输入 第%d个学生的 数学成绩 :\ F(\"%d\ R(\"请输入 第%d个学生的 程序设计成绩:\ F(\"%d\ }R(\"=====================================================================\"N); }
void arr2(int f[50]) { system(\"cls\"); int i,j,p,t;
for(i=0;ifor(j=i+1;jf[j]) p=j; t=f[p];f[p]=f[i];f[i]=t; }temp=stu[p];stu[p]=stu[i];stu[i]=temp;
print(w); arr1(); }
void print(int k) {
int i,j;
R(N\"\/////////////////////////////////////////////////////////////\"N);
R(\"\学号 姓名 数学成绩 程序设计成绩 总分\"N); for(i=0;ifor(j=0;j<3;j++) {}
a[i][j]=stu[i].num[j]; b[i][j]=stu[i].nam[j]; }
c[i]=stu[i].mat; d[i]=stu[i].pro; e[i]=stu[i].sum;
R(\"%11s%9s%10d%13d%15d\"N,stu[i].num,stu[i].nam,stu[i].mat,stu[i].pro, stu[i].sum=stu[i].mat+stu[i].pro);
R(\"\/////////////////////////////////////////////////////////////\"N);
}
void ch1(char f[][4],char g[100]) { system(\"cls\"); int i,j,p=0;char h[10]; R(\"请输入%s:\
F(\"%s\
for(i=0;iif(strcmp(h,f[i])==0){ p=1;
R(N\"\/////////////////////////////////////////////////////////////\"N);
R(\"\学号 姓名 数学成绩 程序设计成绩 总分\"N); R(\"%11s%9s%10d%13d%15d\"N,stu[i].num,stu[i].nam,stu[i].mat,stu[i].pro, stu[i].sum=stu[i].mat+stu[i].pro); R(\"\/////////////////////////////////////////////////////////////\"N); } } if(p==0) R(N\"!!!!!!!!!!!!!!!!!!!!!!!不存在%s同学\"N,h); }
see();
void ch2(int f[100],char g[100]) { system(\"cls\");
int i,t,p=0;
R(N\"请输入您要查询的分数:\"N);
F(\"%d\
R(\"\\^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\"N); R(\"\\\学号 姓名 %s\"N,g); for(i=0;i=t){
R(\"\\%11s%9s%8d\"N,stu[i].num,stu[i].nam,f[i]);
p++; }
R(\"\\^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\"N);
}
R(N\"\**********大于或等于该分数的人数为:%4d*****************\"N,p);
see();
4.运行结果
5.分析与思考
完成这个程序花了我一个星期的时间。看过题目后,感觉思路很清晰,本以为很简单。但在写完程序后,在VC上运行后,出现n多个错误,实在不敢一一列举。仅列举几个大错误,那些小错误、小疏漏就不在这里丢人现眼了。呵呵!
第一个大错误就是函数定义问题。在未定义的函数之前,我调用了这个函数,结果编译时出现错误。
第二个就是函数的形参和实参类型不一致。 第三个就是数组下标越界。
第四个就是老是出现死循环,这个很要命。
第五个就是在VC理运行不过,但在c-free里能通过编译。就是 a[i]=stu[i].nam这条语句存在毛病。其中a[i]是二维数组a[10][10]的第i行,但在VC里编译时显示这里出现错误。问题的大概意思就是不能整行的赋值,于是我改成了a[i][j]=stu[i].nam[j],让它一个一个的赋值,结果编译通过了,当时真的很高兴。
此次通过系统的编写这个大程序,我感受颇多,我发现自己对C语言掌握还不熟,还不能达到熟能生巧的地步,一些基本的算法还很生,如选择排序法,删除等等。反正这一个星期确实给了我一个不小的教训。今后只有通过多看书,多编程来逐步提高自己的编程能力,路还很长,况且我已经比别人满了好多了,有一些同学高中时就已经逐步掌握了最基本的编程了,为了不落后,只能自己为自己加油了!