1、C 语言程序设计大型作业报告题目:学生信息管理 一、实践的目的和要求 加深对C 语言课程所学知识的理解,进一步巩固 C 语言语法规则。学会编制结构清晰、风格良好、数据结构适当的语言程序,从而具备解决综合性实际问题的能力。二、实践内容在熟练掌握 C 语言的基本知识:数据类型(整形、实型、字符型、指针、数组、结构等);运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);程序结构(顺序结构、判断选择结构、循环结构);大程序的功能分解方法(即函数的使用)等。进一步掌握各种函数的应用,包括时间函数、绘图函数,以及文件的读写操作等。三、实践任务现有学生成绩信息,内容如下姓名 学号 语文 数学 英语
2、张明明 01 67 78 82李成友 02 78 91 88张辉灿 03 68 82 56王露 04 56 45 77陈东明 05 67 38 47. 请用 C 编写一系统,实现学生信息管理,软件的入口界面应包括如下几个方面:(一)功能要求:(1)信息维护:要求:学生信息数据要以文件的形式保存,能实现学生信息数据的维护。此模块包括子模块有:增加学生信息、删除学生信息、修改学生信息(2)信息查询:要求:查询时可实现按姓名查询、按学号查询(3)成绩统计:要求:A 输入任意的一个课程名(如数学)和一个分数段(如 60-70),统计出在此分数段的学生情况。(4)排序:能对用户指定的任意课程名,按成绩升
3、序或降序排列学生数据并显示排序结果(使用表格的形式显示排序后的输出结果)(使用多种方法排序者,加分)(二)其它要求:(1)只能使用 C 语言,源程序要有适当的注释,使程序容易阅读(2)至少采用文本菜单界面(如果能采用图形菜单界面更好)(3)学生可自动增加新功能模块(视情况可另外加分)(4)写出课程设计报告,具体要求见相关说明文档四、相关程序#include “stdio.h“#include “stdlib.h“ #include “string.h“ int shoudsave=0; /* */ struct student char num10;/* 学号 */ char name20;
4、char sex4; int cgrade; int mgrade; int egrade; int totle; int ave; char neartime10;/* 最近更新时间 */ ; typedef struct node struct student data; struct node *next; Node,*Link; void menu() printf(“*“); printf(“t1 登记学生资料ttttt2 删除学生资料n“); printf(“t3 查询学生资料ttttt4 修改学生资料n“); printf(“t5 保存学生资料ttttt0 退出系统n“); pr
5、intf(“*n“); void printstart() printf(“-n“); void Wrong() printf(“n=提示:输入错误!n“); void Nofind() printf(“n=提示:没有找到该学生!n“); void printc() /* 本函数用于输出中文 */ printf(“ 学号t 姓名 性别 英语成绩 数学成绩 C 语言成绩 总分 平均分n“); void printe(Node *p)/* 本函数用于输出英文 */ printf(“%-12s%st%st%dt%dt%dt %dt %dn“,p-data.num,p-data.name,p-data
6、.sex,p-data.egrade,p-data.mgrade,p-data.cgrade,p-data.totle,p-data.ave); Node* Locate(Link l,char findmess,char nameornum) /* 该函数用于定位连表中符合要求的接点,并返回该指针 */ Node *r; if(strcmp(nameornum,“num“)=0) /* 按学号查询 */ r=l-next; while(r!=NULL) if(strcmp(r-data.num,findmess)=0) return r; r=r-next; else if(strcmp(n
7、ameornum,“name“)=0) /* 按姓名查询 */ r=l-next; while(r!=NULL) if(strcmp(r-data.name,findmess)=0) return r; r=r-next; return 0; void Add(Link l) /* 增加学生 */ Node *p,*r,*s; char num10; r=l; s=l-next; while(r-next!=NULL) r=r-next; /* 将指针置于最末尾 */ while(1) printf(“请你输入学号(以0返回上一级菜单:)“); scanf(“%s“,num); if(strc
8、mp(num,“0“)=0) break; while(s) if(strcmp(s-data.num,num)=0) printf(“=提示:学号为%s的学生已经存在,若要修改请你选择4 修改!n“,num); printstart(); printc(); printe(s); printstart(); printf(“n“); return; s=s-next; p=(Node *)malloc(sizeof(Node); strcpy(p-data.num,num); printf(“请你输入姓名:“); scanf(“%s“,p-data.name); getchar(); pri
9、ntf(“请你输入性别:“); scanf(“%s“,p-data.sex); getchar(); printf(“请你输入语文成绩:“); scanf(“%d“, getchar(); printf(“请你输入数学成绩:“); scanf(“%d“, getchar(); printf(“请你输入英语成绩:“); scanf(“%d“, getchar(); p-data.totle=p-data.egrade+p-data.cgrade+p-data.mgrade; p-data.ave=p-data.totle / 3; /* 信息输入已经完成 */ p-next=NULL; r-ne
10、xt=p; r=p; shoudsave=1; void Qur(Link l) /* 查询学生 */ int sel; char findmess20; Node *p; if(!l-next) printf(“n=提示:没有资料可以查询!n“); return; printf(“n=1 按学号查找n=2 按姓名查找n“); scanf(“%d“, if(sel=1)/* 学号 */ printf(“请你输入要查找的学号:“); scanf(“%s“,findmess); p=Locate(l,findmess,“num“); if(p) printf(“tttt 查找结果n“); prin
11、tstart(); printc(); printe(p); printstart(); else Nofind(); else if(sel=2) /* 姓名 */ printf(“请你输入要查找的姓名:“); scanf(“%s“,findmess); p=Locate(l,findmess,“name“); if(p) printf(“tttt 查找结果n“); printstart(); printc(); printe(p); printstart(); else Nofind(); else Wrong(); void Del(Link l) /* 删除 */ int sel; N
12、ode *p,*r; char findmess20; if(!l-next) printf(“n=提示:没有资料可以删除!n“); return; printf(“n=1 按学号删除n=2 按姓名删除n“); scanf(“%d“, if(sel=1) printf(“请你输入要删除的学号:“); scanf(“%s“,findmess); p=Locate(l,findmess,“num“); if(p) r=l; while(r-next!=p) r=r-next; r-next=p-next; free(p); printf(“n=提示:该学生已经成功删除!n“); shoudsave
13、=1; else Nofind(); else if(sel=2) printf(“请你输入要删除的姓名:“); scanf(“%s“,findmess); p=Locate(l,findmess,“name“); if(p) r=l; while(r-next!=p) r=r-next; r-next=p-next; free(p); printf(“n=提示:该学生已经成功删除!n“); shoudsave=1; else Nofind(); else Wrong(); void Modify(Link l) Node *p; char findmess20; if(!l-next) pr
14、intf(“n=提示:没有资料可以修改!n“); return; printf(“请你输入要修改的学生学号:“); scanf(“%s“,findmess); p=Locate(l,findmess,“num“); if(p) printf(“请你输入新学号(原来是%s):“,p-data.num); scanf(“%s“,p-data.num); printf(“请你输入新姓名(原来是%s):“,p-data.name); scanf(“%s“,p-data.name); getchar(); printf(“请你输入新性别(原来是%s):“,p-data.sex); scanf(“%s“,
15、p-data.sex); printf(“请你输入新的语文成绩(原来是 %d 分):“,p-data.cgrade); scanf(“%d“, getchar(); printf(“请你输入新的数学成绩(原来是 %d 分):“,p-data.mgrade); scanf(“%d“, getchar(); printf(“请你输入新的英语成绩(原来是 %d 分):“,p-data.egrade); scanf(“%d“, p-data.totle=p-data.egrade+p-data.cgrade+p-data.mgrade; p-data.ave=p-data.totle/3; print
16、f(“n=提示:资料修改成功!n“); shoudsave=1; else Nofind(); void Disp(Link l) int count=0; Node *p; p=l-next; if(!p) printf(“n=提示:没有资料可以显示!n“); return; printf(“tttt 显示结果n“); printstart(); printc(); printf(“n“); while(p) printe(p); p=p-next; printstart(); printf(“n“); void Tongji(Link l) Node *pm,*pe,*pc,*pt,*pa
17、; /* 用于指向分数最高的接点 */ Node *r=l-next; if(!r) printf(“n=提示:没有资料可以统计!n“); return ; pm=pe=pc=pt=pa=r; while(r!=NULL) if(r-data.cgrade=pc-data.cgrade) pc=r; if(r-data.mgrade=pm-data.mgrade) pm=r; if(r-data.egrade=pe-data.egrade) pe=r; if(r-data.totle=pt-data.totle) pt=r; if(r-data.ave=pa-data.ave) pa=r; r
18、=r-next; printf(“-统计结果-n“); printf(“总分最高者:t%s %d 分n“,pt-data.name,pt-data.totle); printf(“平均分最高者:t%s %d 分n“,pa-data.name,pa-data.ave); printf(“英语最高者:t%s %d 分n“,pe-data.name,pe-data.egrade); printf(“数学最高者:t%s %d 分n“,pm-data.name,pm-data.mgrade); printf(“c 语言最高者:t%s %d 分n“,pc-data.name,pc-data.cgrade)
19、; printstart(); void Sort(Link l) Link ll; Node *p,*rr,*s; ll=(Link)malloc(sizeof(Node); /* 用于做新的连表 */ ll-next=NULL; if(l-next=NULL) printf(“n=提示:没有资料可以排序!n“); return ; p=l-next; while(p) s=(Node*)malloc(sizeof(Node); /* 新建接点用于保存信息 */ s-data=p-data; s-next=NULL; rr=ll; while(rr-next!=NULL if(rr-next
20、=NULL) rr-next=s; else s-next=rr-next; rr-next=s; p=p-next; free(l); l-next=ll-next; printf(“n=提示:排序已经完成!n“); void Save(Link l) FILE* fp; Node *p; int flag=1,count=0; fp=fopen(“c:student“,“wb“); if(fp=NULL) printf(“n=提示:重新打开文件时发生错误!n“); exit(1); p=l-next; while(p) if(fwrite(p,sizeof(Node),1,fp)=1) p
21、=p-next; count+; else flag=0; break; if(flag) printf(“n=提示:文件保存成功.(有%d 条记录已经保存.)n“,count); shoudsave=0; fclose(fp); void main() Link l;/* 连表 */ FILE *fp; /* 文件指针 */ int sel; char ch; char jian; int count=0; Node *p,*r; printf(“tttt 学生成绩管理系统“); l=(Node*)malloc(sizeof(Node); l-next=NULL; r=l; fp=fopen
22、(“f:student“,“rb“); if(fp=NULL) printf(“n=提示:文件还不存在,是否创建?(y/n)n“); scanf(“%c“, if(jian=y|jian=Y) fp=fopen(“f:student“,“wb“); else exit(0); printf(“n=提示:文件已经打开,正在导入记录n“); while(!feof(fp) p=(Node*)malloc(sizeof(Node); if(fread(p,sizeof(Node),1,fp) /* 将文件的内容放入接点中 */ p-next=NULL; r-next=p; r=p; /* 将该接点挂
23、入连中 */ count+; fclose(fp); /* 关闭文件 */ printf(“n=提示:记录导入完毕,共导入%d 条记录.n“,count); while(1) menu(); printf(“请你选择操作:“); scanf(“%d“, if(sel=0) if(shoudsave=1) getchar(); printf(“n=提示:资料已经改动,是否将改动保存到文件中(y/n)?n“); scanf(“%c“, if(ch=y|ch=Y) Save(l); printf(“n=提示:你已经退出系统,再见!n“); break; switch(sel) case 1:Add(l);break; /* 增加学生 */ case 2:Del(l);break;/* 删除学生 */ case 3:Qur(l);break;/* 查询学生 */ case 4:Modify(l);break;/* 修改学生 */ case 5:Save(l);break;/* 保存学生 */ case 9:printf(“ttt=帮助信息=n“);break; default: Wrong();getchar();break;