学生成绩管理系统实验报告
一、实验内容
实验名称:学生成绩管理系统
实验目的:
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
#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 fscanf(np,"%s",code[i]); cp=fopen("d:name.txt","r"); for(i=0;i fscanf(cp,"%s",name[i]); mp=fopen("d:math.txt","r"); for(i=0;i fscanf(mp,"%d",&math[i]); dp=fopen("d:design.txt","r"); for(i=0;i fscanf(dp,"%d",&design[i]); for(i=0;i total[i]=math[i]+design[i]; char select; printf("学号姓名数学程序设计总分\n"); for(i=0;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]