资源描述
学生成绩管理系统实验报告
一、实验内容
实验名称:学生成绩管理系统
实验目的:
1)利用所学的三种程序基本结构以及数组、用户自定义函数进行一个简单管理系统的设计,进一步理解和掌握c语言的语法以及三种基本程序结构的综合应用。
2)通过程序中涉及的排序、查找、求和等操作加深对算法、程序设计思路、常用程序设计技巧的理解与掌握,逐步培养学生的程序开发能力。
实验的基本要求:学号(字符串)、姓名(字符串)、数学成绩(整型)、程序设计成绩(整型)。设计程序完成以下五项功能:新建数据档案、添加数据、删除数据、对输入的数据进行排序和查询。
二、算法说明
将数学成绩、程序设计成绩、姓名、学号分别设一个数组,其中姓名和学号是二维数组,其他是一维数组,并设为全局变量方便使用。
分别将各个功能以及菜单等功能设置为函数,介时调用。
主函数中运行菜单函数。菜单函数中提供选择用switch语句调用函数。
1、新建数据build()。用文档导入的方式导入数据。
2、添加数据add()。界面出现相应信息并提示输入。输入完成后用if语句选择是否再添加数据。如果选择是则继续调用add函数,否则调用print函数继续选择其他功能。用全局变量m来计算增加的次数。
3、删除数据rid()。用swith语句选择是按姓名删除还是按学号删除或者返回主菜单。按姓名则输入想要删除的对象,用for语句找到对象后,再用stremp赋值的方法将下一个信息往上一个位置移动,达到覆盖要删除的信息的效果。最后用for循环输出。按学号删除也是同理。用全局变量m来计算删除的次数
4、排序arrange()。用swith语句选择是按数学成绩arr_math(),程序设计成绩arr_design()还是总分arr_total()。按数学成绩排序时用冒泡排序的方法排列数学成绩,同时其他的姓名、学号的信息的下标也随着数学成绩的下标变动,最后用for语句一起输出。按程序设计以及总分的具体算法也是同理。每个程序后调用arrange()返回上级子菜单以便继续操作。
5、查询search()。也用switch语句选择是按学号s_code()、姓名s_name()、数学成绩s_math()、程序设计成绩s_design()、总分s_total()查找。
按学号则是输入学号,用if语句查找,输出该位置所对应的成绩以及姓名。按姓名、成绩查找也是同理。按成绩查找时用到flag=0标记,找到至少一个flag=1输出,否则flag=0时输出不存在。并重新调用search()函数返回上级子菜单。
6、退出。
三、程序清单
#include<stdio.h>
#define N 5
#define M 100
int i,j,m=N-1,k,choice; /*全局变量*/
int math[M];
int design[M];
char name[50][M];
char code[50][M];
int total[M];
void print() /*菜单函数*/
{ void build();
void add();
void arrange();
void search();
void rid();
printf(" 欢迎使用学生成绩管理系统!\n");
printf("1.新建数据\n2.添加数据\n3.删除数据\n4.排序\n5.查询\n6.退出\n请选择:");
scanf("%d",&choice);
switch(choice)
{
case 1: build();break;
case 2: add();break;
case 3: rid();break;
case 4: arrange();break;
case 5: search();break;
case 6:break;
}
}
void build() /*新建数据*/
{ FILE*cp;
FILE*np;
FILE*mp;
FILE*dp;
np=fopen("d:code.txt","r"); /*导入文件*/
for(i=0;i<N;i++)
fscanf(np,"%s",code[i]);
cp=fopen("d:name.txt","r");
for(i=0;i<N;i++)
fscanf(cp,"%s",name[i]);
mp=fopen("d:math.txt","r");
for(i=0;i<N;i++)
fscanf(mp,"%d",&math[i]);
dp=fopen("d:design.txt","r");
for(i=0;i<N;i++)
fscanf(dp,"%d",&design[i]);
for(i=0;i<N;i++)
total[i]=math[i]+design[i];
char select;
printf("学号 姓名 数学 程序设计 总分\n");
for(i=0;i<N;i++)
printf("%s %4s %4d %4d %4d\n",code[i],name[i],math[i],design[i],total[i]);
printf("成功!\n");
print();
}
void add() /*添加数据函数*/
{ char select;
m++;
printf("请输入信息");
printf("请输入学号:");
scanf("%s",code[m]);
printf("请输入姓名:");
scanf("%s",name[m]);
printf("请输入数学成绩:");
scanf("%d",&math[m]);
printf("请输入程序设计成绩:");
scanf("%d",&design[m]);
total[m]=math[m]+design[m];
for(i=0;i<=m;i++)
printf("%s %s %d %d %d\n",code[i],name[i],math[i],design[i],total[i]);
printf("是否继续Y/N?");
getchar();
scanf("%c",&select);
if(select=='y'||select=='Y') add();
else print();
}
void name_rid() /*按名字删除函数*/
{ void rid();
m--;
char name2[10],select;
printf("输入您要删除姓名:");
scanf("%s",name2);
for(i=0;i<=m+1;i++)
if(strcmp(name2,name[i])==0)
{ for(j=i;j<=m;j++)
{strcpy(code[j],code[j+1]);
strcpy(name[j],name[j+1]);
math[j]=math[j+1];
design[j]=design[j+1];}
}
for(i=0;i<=m;i++)
printf("%s %s %4d %4d %4d \n",code[i],name[i],math[i],design[i],total[i]);
printf("是否继续Y/N?");
getchar();
scanf("%c",&select);
if(select=='y'||select=='Y') name_rid();
else rid();
}
void code_rid() /*按学号删除函数*/
{ void rid();
m--;
char NO[10];
int select;
printf("输入您要删除的学号:");
scanf("%s",&NO);
for(i=0;i<=m+1;i++)
if(strcmp(NO,code[i])==0)
{ for(j=i;j<=m;j++)
{ strcpy(code[j],code[j+1]);
strcpy(name[j],name[j+1]);
math[j]=math[j+1];
design[j]=design[j+1];}
}
for(i=0;i<=m;i++)
printf("%s %s %4d %4d %4d \n",code[i],name[i],math[i],design[i],total[i]);
printf("是否继续Y/N?");
getchar();
scanf("%c",&select);
if(select=='y'||select=='Y') code_rid();
else rid();}
void rid() /*删除数据总函数*/
{
int select;
printf("1.按姓名\n2.按学号\n3.返回主菜单\n请选择:");
scanf("%d",&select);
switch(select)
{case 1: name_rid();break;
case 2:code_rid();break;
case 3:print(); break;
default:break;}
}
void arr_math() /*按数学成绩排序函数*/
{ void arrange();
int temp1;
char str1[100],str2[100];
for(j=0;j<=m-1;j++)
for(i=0;i<=m-1-j;i++)
if(math[i]<math[i+1])
{
temp1=math[i];
math[i]=math[i+1];
math[i+1]=temp1;
strcpy(str1,name[i]);
strcpy(name[i],name[i+1]);
strcpy(name[i+1],str1);
strcpy(str2,code[i]);
strcpy(code[i],code[i+1]);
strcpy(code[i+1],str2);
}
printf("按数学成绩排序\n");
for(i=0;i<=m;i++)
printf("%s %s %4d\n",code[i],name[i],math[i]);
arrange();
}
void arr_design() /*按程序设计成绩排序*/
{ void arrange();
int temp1;
char str1[100],str2[100];
for(j=0;j<=m-1;j++)
for(i=0;i<=m-1-j;i++)
if(design[i]<design[i+1])
{
temp1=design[i];
design[i]=design[i+1];
design[i+1]=temp1;
strcpy(str1,name[i]);
strcpy(name[i],name[i+1]);
strcpy(name[i+1],str1);
strcpy(str2,code[i]);
strcpy(code[i],code[i+1]);
strcpy(code[i+1],str2);
}
printf("按程序设计成绩排序\n");
for(i=0;i<=m;i++)
printf("%s %s %4d\n",code[i],name[i],design[i]);
arrange();
}
void arr_total() /*按总分排序*/
{ void arrange();
int temp1;
char str1[100],str2[100];
for(j=0;j<=m;j++)
for(i=0;i<=m-1-j;i++)
if(total[i]<total[i+1])
{
temp1=total[i];
total[i]=total[i+1];
total[i+1]=temp1;
strcpy(str2,code[i]);
strcpy(code[i],code[i+1]);
strcpy(code[i+1],str2);
strcpy(str1,name[i]);
strcpy(name[i],name[i+1]);
strcpy(name[i+1],str1);
}
printf("总分排序/n");
for(i=0;i<=m;i++)
printf("%s %s %4d\n",code[i],name[i],total[i]);
arrange();
}
void arrange() /*排序的总函数*/
{
int select;
printf("1.数学成绩排序\n2.程序设计成绩排序\n3.总分排序\n4.返回主菜单\n");
scanf("%d",&select);
switch(select)
{
case 1:arr_math();break;
case 2:arr_design();break;
case 3:arr_total();break;
case 4:print();break;
}
}
void s_code() /*按学号查找函数*/
{ void search();
char NO[10];int flag=0;
printf("请输入学号:");
scanf("%s",NO);
for(i=0;i<=m;i++)
if(strcmp(NO,code[i])==0){flag=1;
printf("%s %s %4d %4d %4d\n",code[i],name[i],math[i],design[i],total[i]);}
if(flag==0) {printf("不存在\n欢迎继续使用!\n");search();}
else {printf("欢迎继续使用!\n");search();}
}
void s_name() /*按姓名查找函数*/
{ void search();
char name2[10];int flag=0;
printf("请输入姓名:");
scanf("%s",name2);
for(i=0;i<=m;i++)
if(strcmp(name2,name[i])==0)
{flag=1;printf("%s %s %4d %4d %4d\n",code[i],name[i],math[i],design[i],total[i]);}
if(flag==1) {printf("欢迎继续使用!\n");search();}
else { printf("不存在\n欢迎继续使用!\n");search();}
}
void s_math() /*按数学成绩查找*/
{ void search();
int mark,flag=0;
printf("请输入数学成绩:");
scanf("%d",&mark);
for(i=0;i<=m;i++)
if(mark<=math[i])
{ flag=1;
printf("%s %s %4d %4d %4d\n",code[i],name[i],math[i],design[i],total[i]);}
search();
if(flag==0) { printf("不存在\n欢迎继续使用!\n");
search();}
}
void s_design() /*按程序设计成绩查找*/
{ void search();
int mark,flag=0;
printf("请输入程序设计成绩:");
scanf("%d",&mark);
for(i=0;i<=m;i++)
if(mark<=design[i])
{ flag=1;
printf("%s %s %4d %4d %4d\n",code[i],name[i],math[i],design[i],total[i]);}
search();
if(flag==0) { printf("不存在\n欢迎继续使用!\n");
search();}
}
void s_total() /*按总分查找*/
{ void search();
int mark,flag=0;
printf("请输入总分:");
scanf("%d",&mark);
for(i=0;i<=m;i++)
if(mark<=total[i])
{ flag=1;
printf("%s %s %4d %4d %4d\n",code[i],name[i],math[i],design[i],total[i]); }
search();
if(flag==0) {printf("不存在\n欢迎继续使用!\n");
search();}
}
void search() /*查找总函数*/
{
int select;
printf("1.学号查询\n2.姓名查询\n3.数学成绩查询\n4.程序设计成绩查询\n5.总分查询\n6.返回主菜单\n");
scanf("%d",&select);
switch(select)
{
case 1:s_code();break;
case 2:s_name();break;
case 3:s_math();break;
case 4:s_design();break;
case 5:s_total();break;
case 6:print();break;
}
}
void main() /*主函数*/
{ print();}
四、运行结果
运行界面,显示“欢迎您使用学生成绩管理系统”,并提供菜单,供选择。
1、新建数据:输出按序号排列的学生姓名、成绩。
2、添加数据:输入相关信息后,界面输出添加后的学号、姓名、成绩(数学,程序设计和总分)列表。并提示成功,要求选择是否继续,若继续则继续先前输出的提示信息,否则返回显示主菜单。
3、删除数据:输入相关信息后,界面输出删除后的学号、姓名、成绩(数学,程序设计和总分)列表。并提示成功,提供选择是否继续。若继续则继续先前输出的提示信息,否则返回上级子菜单。
4、排序。界面要求选择按数学成绩还是程序设计成绩排序,或者返回主菜单。选择数学成绩后,输入数学成绩,最后显示按数学成绩的、从高到低排列的各个学生的学号、姓名和数学成绩。程序设计也是类似。排序完成后,提示成功并返回上级子菜单,继续操作。
5、查询。界面要求选择按学号、姓名、数学成绩,程序设计成绩还是总分查询。输入学号后输出该学号所对应的学生姓名和各个成绩。姓名查找是类似的。按数学成绩查找则是输入数学成绩,则输出大与该分数的所有人的学号以及相应的姓名和成绩。程序设计成绩和总分查找类似。所有查找若找不到就显示“不存在”。最后提示成功,要求选择是否结束操作还是返回主菜单。
6、退出。退出后显示“感谢您使用学生成绩管理系统”。
五、分析与思考
刚开始拿到题目时,感觉很棘手。但是慢慢分析后,我发现一切都是可以解决的。
我和其他人不一样,别人是分步调试完成,而我是全部编好再进行调试,一运行大批的错误提示让我迷茫了。
首先第一个问题,函数调用时我写上了如build(math[],design[],total[],name[],code[]),发现是错的,查书之后才发现是不对的
应该是build(math,design,total,name,code)。而且设为全局变量更简洁;还有第93行中的 scanf("%ld",code[k]);运行的时候是对的,而调试时就不成功,原因是没有取地址符号。这些都是书本上的基础知识,我觉得基础知识非常重要不能小看,c语言是门严谨的学科,一点小错误都会导致全局的失败,应当十分小心。在第70行中的getchar()也是我找了好就才发现的重要问题。没有getchar()语句,前面的回车键就当作一个字符出入scanf中,运行时就直接显示 下面的操作,系统默认选了其他。所以用一个空的getchar()避开了这个问题。
一直坐在电脑前面调试是一件十分辛苦的事,但是调试成功的结果让人很欣慰忘记了劳累。
我觉得老师布置的这个作业是很有道理的,她让我们学会了自己摸索,自己尝试其中的滋味:找不出所时的泄气,求该成功时的喜悦;也让我们喜欢上了这门课!
展开阅读全文