1、计算机科学学院计算机科学与应用系C程序设计报告 成 绩 管 理 系 统 设 计 学生姓名:* * 学 号:1004681082 班 级:计 科102 指导老师:* * 报告日期:2011--02--16 1.题目与要求 1)问题提出 本人计划编写一个学生信息管理系统,主要用来管理学生基本信息及成绩信息。 2)本系统涉及的知识点 单链表、结构体、函数、循环、指针、选择 3)功能要求 (1)建立学生信息,每个学生的信息包括:学号、姓名、成绩。 (2)求出每个
2、学生的总分和平均分。 (3)查找:根据学号、姓名、成绩、总分、平均分中任一项查询该生的基本信息。 (4)排序:根据学号或总分将学生的信息按照一定的顺序进行排序。 (5)根据需要修改学生的基本信息。 (6)根据实际情况删除某生的信息。 (7)根据实际情况插入某生的信息。 (8)输出。 2.功能设计 1)算法设计 (1)利用switch语句设计如图所示的主菜单。 请输入选项编号 1——查 找 2——排 序 3——学生信息的修改 4——链表的删除 5——链表的插入 6——链表的
3、输出 7——退 出 图1 学生信息管理系统主菜单 (2)选择1后,调用查找函数search,进入查找函数后利用switch语句实现如图所示的查找子菜单。该菜单中每个选项调用一个函数(除选项10外)。 查找菜单 请输入选项编号 1——按学号查找 2——按姓名查找 3——按C语言分数查找 4——按高数分数查找 5——按英语分数查找 6——按总分查找 7——按平均分查找 8——总分前三名 9——不及格者 10——班级成绩情况 11——退出
4、 图2 查找子菜单 (3)选项2后, 调用排序函数arrange,进入查找函数后利用switch语句实现如图所示的查找子菜单。该菜单中每个每个选项调用一个函数(除3外)。 排序菜单 输入选项编号 1——按学号排序 2——按总分排序 3——退 出 图3 排序子菜单 (4)选择3后,调用修改函数correct,修改某个学生的信息。 (5)选择4后,
5、调用删除函数del,根据需要删除某个学生的信息。 (6)选择5后,调用插入函数insert,根据需要插入某个学生的信息。 (7)选择6后,调用输出函数output,将每个学生的信息全部输出。 (8)选择7后,退出学生信息管理系统。 (9)根据所选菜单编号编写相应代码。 (a)函数welcome:欢迎用户使用。 (b)函数about: 简要介绍本程序。 (c)函数create:创建单链表,采用循环输入的方式输入学生的基本信息。 (d)函数SnoSearch:根据学号查找,输出该生的基本信息。 (e)函数NameSearch:根据姓名查找,输出该生的基本信息。 (f)函数CYu
6、YanSearch:根据C语言成绩成绩查找,输出该生的基本信息。 (g)函数GaoShuSearch:根据高数成绩查找,输出该生的基本信息。 (h)函数YingYuSearch:根据英语成绩查找,输出该生的基本信息。 (i)函数ZongFenSearch:根据总分查找,输出该生的基本信息。 (j)函数AverageSearch:根据平均分查找,输出该生的基本信息。 (k)函数QSMSearch:查看班级前三名学生信息情况。 (l)函数BuJiGeSearch:查看班级不及格学生信息情况。 成绩菜单 输入选项编号 1——C语言不及格者 2——高数不及格者 3——英
7、语不及格者 4——不及格者 5——全不及格者 6——退出 图4 成绩子菜单 (m)函数ClassScore:查看班级成绩平均分整体情况。 (n)函数SnoArrange:按照学号将学生信息进行排序。 (o)函数ZongFenArrange:按照总分将学生信息进行排序。 (n)函数over:感谢用户使用。 2)画模块图 按学号查找 显示欢迎界 面 按姓名查找 显示程序介 绍 按C语言不及格者查 找 按成绩查找
8、 输 入 成 绩 按高数不及格者查 找 按总分查找 查 找 排 序 主 模块 按平均分查 找 修改学生信 息 按英语不及格者查 找 按前三名查 找 删除学生信 息 按不及格查 找 插入学生信 息 按不及格者查 找 按学号排序 输出学生信 息 按全不及格者查 找 按总分排序 显示结束界 面 图5 成绩管理系统模块图
9、 3)画部分模块的流程图 开始 输入学生信息 pnew->score=pnew->score1+pnew->score2+pnew->score3; pnew->avg=pnew->score/3 pnew->score=pnew->score1+pnew->score2+pnew->score3; pnew->avg=pnew->score/3 输入学生信息 结束 p->next=NULL Y N a==pnew->sno 图6 creat函数流程图
10、 开始 输入a t++ t==num+1 Y N a==p->sno p=p->next N Y 输出学生信息 结束 图7 SnoSearch函数流程图 开始 输入b t=0;flag=0;p=head; t++
11、
N
Y
t==num+1
k==0
Y
flag==0
N
Y
N
结束
flag=1
输出学生信息
p=p->next
图8 NameSearch函数流程图
开始
s=0;r=0;w=0;t=0
m=0;n=0;p=head;
N
Y
s!=num
p=head;s=0
s++
N
Y
s!=num
t
12、Y
t=p->score
t==p->score
N
p=p->next
Y
输出学生信息
p=head
p=p->next
……
结束
图9 QSMSearch函数流程图
开始
p=head
输入b
N
a==1
N
Y
a>1&&a
13、ext N Y n=3 i=0 j=0 N i!=a-2 N j!=a-2 Y Y p=p->next p=p->next i++ j++ p->next=NULL p->next=p->next->next num=num-1 结束 图10 del函数流程图 3.程序代码设计 1.main函数: (1)函数原型:void main() (2)功
14、能:分别调用 welcome函数、about函数、create函数、search函数、del函数、insert函数、output函数和over函数。 (3)变量及类型: int m,n; //switch选择变量 (4)说明:main函数中用到system("cls"),其作用是清除屏幕上的文字。 2.welcome函数: (1)函数原型:void welcome() (2)功能:显示欢迎用户使用界面。 (3)说明:getchar()函数用于使屏幕停止,按下Enter键后再执行下面程序。 3.about函数: (1)函数原型:vo
15、id about() (2)功能:简要介绍本程序。 (3)说明:getchar()函数用于使屏幕停止,按下Enter键后再执行下面程序。 4.create函数: (1)函数原型:void create() (2)功能:利用单链表、while循环和 scanf函数完成对学生信息的输入(学号、姓名、三门成绩),并计算出总分和平均分,再存入单链表中。 (3)变量及类型: int a=0; //判断学生信息输入是否结束(学号是否为0) struct student *p,*pnew; //结构体指针指向结点 (4)说明:学生的人数不
16、受限制,输入结束符号即可。 5.search函数: (1)函数原型:void search() (2)功能:通过选项来选择调用不同函数,完成不同的功能。 (3)变量及类型: int m,n; //switch选择变量 6.SnoSearch函数: (1)函数原型:void SnoSearch() (2)功能:通过学号来查找该生的基本信息。 (3)变量及类型: int a,t; //a用来存储学号;t用来计数,以便跳出循环 struct student *p; //
17、指针p用于指向头结点 7.NameSearch函数: (1)函数原型:void NameSearch() (2)功能:通过姓名来查找该生的基本信息。 (3)变量及类型: int k,t,flag; //k用于判断;t用于计数;flag起标记作用 char b[20]; //数组b用于存放姓名 struct student *p; //指针p用于指向头结点 8.CYuYanSearch函数: (1)函数原型:void CYuYanSearch() (2)功能:通过C语言成绩来查
18、找该生的基本信息。 (3)变量及类型: int t,flag; //t用于计数;flag起标记作用 float a; //a用于存放C语言成绩 struct student *p; //指针p用于指向头结点 9.GaoShuSearch函数: (1)函数原型:void GaoShuSearch() (2)功能:通过高数成绩来查找该生的基本信息。 (3)变量及类型: int t,flag; //t用于计数;flag起标记作用 float b;
19、 //b用于存放高数成绩 struct student *p; //指针p用于指向头结点 10.YingYuSearch函数: (1)函数原型:void YingYuSearch() (2)功能:通过英语成绩来查找该生的基本信息。 (3)变量及类型: int t,flag; //t用于计数;flag起标记作用 float c; //c用于存放英语成绩 struct student *p; //指针p用于指向头结点 11.Zongfen
20、Search函数: (1)函数原型:void ZongfenSearch() (2)功能:通过总分来查找该生的基本信息。 (3)变量及类型: int t,flag; //t用于计数;flag起标记作用 float d; //d用于存放总分 struct student *p; //指针p用于指向头结点 12.AverageSearch函数: (1)函数原型:void AverageSearch() (2)功能:通过平均分来查找该生的基本信息。 (3)变量及类型: int t,fla
21、g; //t用于计数;flag起标记作用 float e; //e用于存放平均分 struct student *p; //指针p用于指向头结点 13.QSMSearch函数: (1)函数原型:void QSMSearch() (2)功能:显示前三名的基本信息 (3)变量及类型: int s=0,r=0,w=0; //s,r,w均用做计数 float t=0,m=0,n=0; //t,m,n均用做记录最高分 struct student
22、p; //指针p用于指向头结点 14. BuJiGeSearch函数: (1)函数原型:void BuJiGeSearch() (2)功能:通过switch选择输出不及格情况。 (3)变量及类型: int n,m,r,s,t,k,h,flag; //n,m为switch选择变量;r,s,t,k,h用做计数;flag起标记作用 struct student *p; //指针p用于指向头结点 15.ClassScore函数: (1)函数原型:void ClassScore() (2)功能:查看班级成绩的整体情况。 (
23、3)变量及类型: int i; //i用于for循环 float a=0,b=0,c=0,d,e; //a,b,c,d,e均用于中间变量 struct student *p; //指针p用于指向头结点 16.arrange函数: (1)函数原型:void arrange() (2)功能:通过选项来选择调用不同函数,完成不同的功能。 (3)变量及类型: int a,m; //a,m均为switch选择变量; 17.SnoArrange函数: (1)函数
24、原型:void SnoArrange() (2)功能:将学生信息按照学号进行排序。 (3)变量及类型: int a,c,i,j; //a为switch选择变量;c用于计数;i,j用于for循环 struct student *p,*q,*k,*newp,*newhead; //指针p,q,k,newp,newhead均用于创建新链表 18.ZongFenArrange函数: (1)函数原型:void ZongFenArrange() (2)功能:将学生信息按照总分进行排序。 (3)变量及类型: int a,c,i,j;
25、 //a为switch选择变量;c用于计数;i,j用于for循环 struct student *p,*q,*k,*newp,*newhead; //指针p,q,k,newp,newhead均用于创建新链表 19. correct函数: (1)函数原型:void correct() (2)功能:修改某生的信息。 (3)变量及类型: int t,a,b,m,flag; // t用于计数;a用于判断;b,m为switch选择变量;flag起标记作用 struct student *p; //指针p用于指向头
26、结点 20.del函数: (1)函数原型:void del() (2)功能:删除单链表中某生的基本信息。 (3)变量及类型: int a,n,i,j; //a存放要删除的结点;n为switch选择变量;i,j用于for循环 struct student *p; //指针p用于指向头结点 21.insert函数: (1)函数原型:void insert() (2)功能:将某生的基本信息插入单链表中。 (3)变量及类型: int a,n,i,j; // a存放要插入的结点;n为swi
27、tch选择变量;i,j用于for循环 struct student *p,*q; //指针p用于指向头结点;指针q用于指向新生信息的结点 22.output函数: (1)函数原型:void output() (2)功能:输出每个学生的基本信息。 (3)变量及类型: int s=0; //s用于计数 struct student *p //指针p用于指向头结点 23.over函数: (1)函数原型:void over() (2)功能:显示感谢用户使用界面。
28、 4.C程序设计总结 (1)程序调试情况 在编写完程序后,执行时总会出现很多错误,便又重新检查程序,改写程序,再经过不断的调试,最终将程序改写完成。 (2)本人在程序中的感想 程序在编写时总是感觉非常难,而且还会出现很多小错误,从而导致出很多麻烦,最终经过耐心检查,才将问题解决。 5.结束语 由于本人完成此程序是在家中完成,又无网络可以查询,故只能参考课本,在本人的独立下完成此程序,在此须感谢白燕老师。 6.参考文献 [1]尹业安 白燕.C语言程序设计.国防科技大学出版社,2008.8
29、
7.附录:程序清单
#include
30、ch(); void QSMSearch(); void BuJiGeSearch(); void ClassScore(); void arrange(); void SnoArrange(); void ZongFenArrange(); void correct(); void del(); void insert(); void output(); void over(); struct student { int sno; char name[20]; float score1; float score2; float score3;
31、 float score; double avg; struct student *next; }; struct student *head; int num=0; void main() { int m,n; welcome(); about(); system("cls"); create(); system("cls"); Z: printf("1——查找\n"); printf("2——排序\n"); printf("3——学生信息的修改\n"); printf("4——链表的删除\n"); printf("5——链表的插入
32、\n"); printf("6——链表的输出\n"); printf("7——退出\n"); scanf("%d",&n); switch(n) { case 1: system("cls"); search(); system("cls"); goto Z; case 2: system("cls"); arrange(); system("cls"); goto Z; case 3: system("cls"); correct(); system("cls"); goto Z; c
33、ase 4: system("cls"); del(); system("cls"); goto Z; case 5: system("cls"); insert(); system("cls"); goto Z; case 6: system("cls"); output(); system("cls"); goto Z; case 7: system("cls"); F: printf("你真的想退出吗\n 1——是 2——否\n"); scanf("%d",&m); sw
34、itch(m) { case 1: break; case 2: goto Z; default: system("cls"); printf("你的输入有误\n"); goto F; } break; default: system("cls"); printf("你的输入有误\n"); goto Z; } system("cls"); over(); } void welcome() { printf("\n\n\n"); printf("
35、 【】————————————————————【】\n"); printf(" ||————————————————————||\n"); printf(" || 欢迎使用 ||\n"); printf(" || ||\n"); printf(" ||
36、 ||\n"); printf(" || 学 生 成 绩 管 理 系 统 ||\n"); printf(" || ||\n"); printf(" || ||\n"); printf(" ||
37、 ||\n"); printf(" || 制作人:** ||\n"); printf(" || 指导老师:** ||\n"); printf(" || ||\n"); printf(" ||———
38、—————————————————||\n"); printf(" 【】————————————————————【】\n"); getchar(); } void about() { system("cls"); printf("\n\n\n"); printf("\t\t\t关于学生管理系统的说明\n\n\n"); printf(" 本程序采用链表和函数编写完成,主要功能有查找,链表的删除,链表的插入和链表的输出.\n"); printf("程序中主要运用链表部分和函数的知识.程序优点是:学生人数可以根据实际情况进行更改;\
39、n缺点是:部分程序过于复杂,程序功能不太齐全;"); printf("本程序已经经过多次测试,尚未出现问题.\n\n若在使用中出现错误,还请谅解!"); getchar(); } void create() { int a=0; struct student *p,*pnew; head=pnew=p=(struct student *)malloc(sizeof(struct student)); printf("请依次输入每位同学的学号,姓名和3门成绩,按0键结束\n"); printf(" 学号 姓名 C语言 高数 英语\n") ; sc
40、anf("%d%s%f%f%f",&pnew->sno,pnew->name,&pnew->score1,&pnew->score2,&pnew->score3); pnew->score=pnew->score1+pnew->score2+pnew->score3; pnew->avg=pnew->score/3.0; pnew->avg=(double)( (int)(pnew->avg*100)*0.01 ); while(1) { num++; p->next=pnew; p=pnew; pnew=(struct student *)mall
41、oc(sizeof(struct student)); scanf("%d",&pnew->sno); if(a==pnew->sno) break; scanf("%s%f%f%f",pnew->name,&pnew->score1,&pnew->score2,&pnew->score3); pnew->score=pnew->score1+pnew->score2+pnew->score3; pnew->avg=pnew->score/3.0; pnew->avg=(double)( (int)(pnew->avg*100)*0.01 );
42、} p->next =NULL; } void search() { int m,n; A: printf("1——按学号查找\n"); printf("2——按姓名查找\n"); printf("3——按C语言分数查找\n"); printf("4——按高数分数查找\n"); printf("5——按英语分数查找\n"); printf("6——按总分查找\n"); printf("7——按平均分查找\n"); printf("8——总分前三名\n"); printf("9——不及格者\n"); printf("10——
43、班级成绩情况\n"); printf("11——退出\n"); scanf("%d",&n); switch(n) { case 1: SnoSearch(); goto A; case 2: NameSearch(); goto A; case 3: CYuYanSearch(); goto A; case 4: GaoShuSearch(); goto A; case 5: YingYuSearch(); goto A; case 6: ZongFenSearch(); goto
44、 A; case 7: AverageSearch(); goto A; case 8: QSMSearch(); goto A; case 9: BuJiGeSearch(); goto A; case 10: ClassScore(); goto A; case 11: system("cls"); D: printf("你真的想退出吗\n 1——是 2——否\n"); scanf("%d",&m); switch(m) { case 1: break; case 2
45、 goto A; default: system("cls"); printf("你的输入有误\n"); goto D; } break; default: system("cls"); printf("你的输入有误\n"); goto A; } } void SnoSearch() { int a,t; struct student *p; system("cls"); printf("请输入学号:"); S: scanf("%d",&a); t=0;p=head; printf
46、"\n学号为%d的成绩如下:\n",a); printf(" 学号 姓名 C语言 高数 英语 总分 平均分\n"); while(1) { t++; if(t==num+1) { system("cls"); printf("你输入的学号有误\n请重新输入学号:"); goto S; } if(a==p->sno) { printf("%d %s %.2f %.2f %.2f %.2f %.2lf\n",p->sno,p
47、>name,p->score1,p->score2,p->score3,p->score,p->avg); break; } p=p->next; } printf("\n\n\n"); } void NameSearch() { int k,t,flag; char b[20]; struct student *p; system("cls"); printf("请输入姓名:"); T: scanf("%s",b); t=0;flag=0;p=head; printf("\n姓名为%s的成绩如下:\n",b); prin
48、tf(" 学号 姓名 C语言 高数 英语 总分 平均分\n"); while(1) { t++; if(t==num+1) { if(flag==0) { system("cls"); printf("你输入的姓名有误\n请重新输入姓名:"); goto T; } else break; } k=strcmp(p->name,b); if(k==0) { flag=1; printf("%d
49、s %.2f %.2f %.2f %.2f %.2lf\n",p->sno,p->name,p->score1,p->score2,p->score3,p->score,p->avg); } p=p->next; } printf("\n\n\n"); } void CYuYanSearch() { int t,flag; float a; struct student *p; system("cls"); printf("请输入C语言成绩:"); U: scanf("%f",&a); t=0;flag=0;
50、p=head; printf("\nC语言成绩为%.2f的成绩如下:\n",a); printf(" 学号 姓名 C语言 高数 英语 总分 平均分\n"); while(1) { t++; if(t==num+1) { if(flag==0) { system("cls"); printf("你输入的C语言成绩有误\n请重新输入C语言成绩:"); goto U; } else break; } if(a==p->sc






