学生成绩管理系统.docx
- 文档编号:12392969
- 上传时间:2023-04-18
- 格式:DOCX
- 页数:27
- 大小:330KB
学生成绩管理系统.docx
《学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统.docx(27页珍藏版)》请在冰豆网上搜索。
学生成绩管理系统
西安郵電學院
C语言课程设计报告
题目:
学生成绩管理系统
院系名称:
计算机学院
专业名称:
计算机科学与技术
班级:
*****
学生姓名:
****
学号(8位):
*****
指导教师:
*****
设计起止时间:
2011年6月22日~2011年7月1日
一.设计目的
1.强化上机动手能力,在理论和实践的基础上进一步巩固《C语言程序设计》课程学习的内容,掌握工程化软件设计的基本方法
2.学会将知识应用于实际的方法,提高分析和解决问题的能力,增加综合能力
3.为后续各门计算机课程的学习打下坚实基础
二.设计内容
(1).通过键盘输入学生信息及成绩;
(2).给定学号或姓名,显示该学生的学生信息及成绩;
(3).显示全部的学生信息及成绩;
(4).给定某位学生的学号,修改该学生的学生信息及成绩;
(5).给定某位学生的学号,删除该学生的学生信息及成绩;
(6).给定要求科目,能够对该门成绩进行降序排序;
(7).用文件的形式将录入的数据进行存储。
三.概要设计
1.功能模块图;
2.各个模块详细的功能描述。
1.初始化链表,对原数据进行清空;
2.输入学生成绩,获得新的数据;
3.修改学生成绩,
4.保存学生记录",
5.显示学生记录,
6.按学号查找学生信息,
7.删除指定学号的学生信息,
8.按某一门课对学生成绩排序,
9.按姓名查找学生信息
四.详细设计
函数之间相互调用的示意图:
数据结构:
包括声明的数据类型(如结构体),程序中个变量的类型及其作用
typedefstructz1
{
charno[11];
charname[15];
intscore[N];
floatsum;
floataverage;
intorder;
structz1*next;
}STUDENT;
STUDENT*init();
STUDENT*create();
STUDENT*del(STUDENT*h);
voidprint(STUDENT*h);
voidsearch1(STUDENT*h);
voidsearch2(STUDENT*h);
voidsecret();
STUDENT*insert(STUDENT*h);
voidsort(STUDENT*h);
voidsave(STUDENT*h);
intmenu_select();
STUDENT*load();
五.测试数据及运行结果
1.正常测试数据和运行结果
(1).测试数据
|3|23|3|34|4|41.00|13.67|0|
|2|3|23|2|23|48.00|16.00|0|
|1|2|12|23|23|58.00|19.33|0|
运行结果
|3|23|3|34|4|41.00|13.67|1|
|2|3|23|2|23|48.00|16.00|2|
|1|2|12|23|23|58.00|19.33|3|
(2).测试数据
2.异常测试数据及运行结果
异常测试数据
|3|23|3|34|4|44.00|13.67|0|
|2|3|50|23|23|41.00|16.00|0|
|1|2|80|2|23|56.00|13.33|0|
运行结果
|3|23|3|34|4|44.00|13.67|5|
|2|3|50|23|23|41.00|16.00|3|
|1|2|80|2|23|56.00|13.33|1|
六.调试情况,设计技巧及体会
1、对自己设计进行评价
基本写出所写的函数。
1)不够细心,开始的时候出现很多错误
2)没有写登陆函数
3)写的过于简短,且大部分都是书上照抄的
写出登陆函数和密码函数,并多个角度调用函数。
2.调试程序时的体会:
程序是用数组实现的,调试过程中数组的有太多的变量很容易出现错误,因此定义一个宏数组和一个宏变量,在调用每一次函数时,数组的中元素个数和元素内容都会发上变化,因此,定义一个宏数组和宏变量,调用函数之后,自动的改变数组中的东西,因此,函数调用时不需要传递参数。
编写程序的时候,我每编写完一个模块,就编译一次,及时的将本模块内的语法等简单的错误改正,避免最后调试的时候出现麻烦。
在最后的调试过程中,发现有时候系统报错,指出了错误所在的具体位置,可是检查的时候发现该位置并未出错,这样的错误首先要查找前后几行,如果还未检查出错误,那就很有可能在该函数的首部或是主函数的调用语句中出现错误。
发现该部分并未出现语法错误,即编译不报错,程序运行后,有时候会出现意想不到的结果,会在想不到的地方跳出程序,甚至不知道程序的什么地方就跳出了,用在不同的地方加不必要的printf语句!
以检查是否运行到printf语句。
在文件中的保存时,回车见不能随便加,否则,在下次录入文件里的东西是,会在录入完最后的信息时,继续往下录入,用空格代替字符串,用0代替数字。
导致多录入一空信息.
3.设计上得到的体会:
在初步设计时要明确要使用的数据结构和类型,明确设计的基本思想,清楚所写程序的逻辑结构和执行顺序,在调试时才能在出现问题时及时的找到问题的所在.在完成了初步的设计并调试完成后,要进一步优化程序的结构,使程序更简洁,执行效率更高.
七.参考文献
《c语言程序设计》
八附录
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#defineN3
typedefstructz1
{
charno[11];
charname[15];
intscore[N];
floatsum;
floataverage;
intorder;
structz1*next;
}STUDENT;
STUDENT*init();
STUDENT*create();
STUDENT*del(STUDENT*h);
voidprint(STUDENT*h);
voidsearch1(STUDENT*h);
voidsearch2(STUDENT*h);
voidsecret();
voidsort(STUDENT*h);
voidsave(STUDENT*h);
intmenu_select();
STUDENT*load();
voidinputs(char*prompt,char*s,intcount);
STUDENT*load();
main()
{
inti;
STUDENT*head;
head=init();
secret();
for(;;)
{
switch(menu_select())
{
case0:
head=init();break;
case1:
head=create();break;
case2:
save(head);break;
case3:
print(head);break;
case4:
search1(head);break;
case5:
head=del(head);break;
case6:
sort(head);break;
case7:
search2(head);break;
case8:
exit(0);
}
}
}
voidsecret()
{
while
(1)
{
inta;
inti;
charf;
charch[10];
charnum[20]={"12345"};
printf("进入学生成绩管理系统需输入密码,谢谢合作!
\n");
printf("请输入密码:
\n");
for(i=0;i<10;i++)
{
ch[i]=getch();
if(ch[i]==13)
break;
putchar('*');
}
ch[i]='\0';
if(strcmp(num,ch)==0)
a=1;
if(a==1)
{
printf("\n欢迎进入学生成绩管理系统!
\n");
f=getchar();
getchar();
break;
}
else
{
printf("\n这个密码是错误的!
");
printf("\n请输入正确的密码:
");
}
}
}
intmenu_select()
{
char*menu[]={"************菜单************",
"0.初始化链表",
"1.输入学生成绩",
"2.保存学生记录",
"3.显示学生记录",
"4.按学号查找学生信息",
"5.删除指定学号的学生信息",
"6.按某一门课对学生成绩排序",
"7.按姓名查找学生信息",
"8.退出系统"};
chars[3];
intc,i;
for(i=0;i<=9;i++)
printf("%s\n",menu[i]);
do
{
printf("\n请选择0~10中的某一个选项\n");
scanf("%s",s);
c=atoi(s);
}while(c<0||c>8);
returnc;
}
STUDENT*init()
{
returnNULL;
}
STUDENT*create()
{
inti;ints;
STUDENT*h=NULL,*info;
for(;;)
{
info=(STUDENT*)malloc(sizeof(STUDENT));
if(!
info)
{
printf("\n内存不足");
returnNULL;
}
inputs("输入学号:
",info->no,11);
if(info->no[0]=='@')break;
inputs("输入姓名:
",info->name,15);
printf("开始输入%d门课的成绩\n",N);
s=0;
for(i=0;i { do{ printf("第%d门分数: ",i+1); scanf("%d",&info->score[i]); if(info->score[i]>100||info->score[i]<0) printf("输入成绩错误,请重新输入: \n"); }while(info->score[i]>100||info->score[i]<0); s=s+info->score[i]; } info->sum=s; info->average=(float)s/N; info->order=0; info->next=h; h=info; } returnh; } voidinputs(char*prompt,char*s,intcount) { charp[255]; do { printf(prompt); scanf("%s",p); if(strlen(p)>count) printf("\n太长了! \n"); }while(strlen(p)>count); strcpy(s,p); } voidprint(STUDENT*h) { inti=0; STUDENT*p; p=h; printf("\n\n\n***********************学生***********************\n"); printf("|序号|学号|姓名|数学|英语|计算机|总分|平均分|名次|\n"); printf("|---|-------|---------|------|------|-------|------|-------|---|\n"); while(p! =NULL) { i++; printf("|%3d|%-7s|%-9s|%6d|%6d|%6d|%5.2f|%7.2f|%3d|\n",i,p->no,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order); p=p->next; } printf("***********************end***********************\n"); } STUDENT*del(STUDENT*h) { STUDENT*p,*q; chars[11]; printf("请输入要删除的学生的学号\n"); scanf("%s",s); q=p=h; while(strcmp(p->no,s)&&p! =NULL) { q=p; p=p->next; } if(p==NULL) printf("\n链表中没有学号为%s的学生\n",s); else { printf("\n\n\n***********************找到了***********************\n"); printf("|学号|姓名|数学|英语|计算机|总分|平均分|名次|\n"); printf("|----------|-----------|------|------|-------|------|-------|---|\n"); printf("|%-7s|%-9s|%6d|%6d|%6d|%6.2f|%6.2f|%3d|\n",p->no,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order); printf("***********************end***********************\n"); printf("请按任意键删除\n"); getchar(); if(p==h) h=p->next; elseq->next=p->next; free(p); printf("\n已经删除学号为%s的学生\n",s); printf("不要忘了保存数据\n"); } returnh; } voidsearch1(STUDENT*h) { STUDENT*p; chars[11]; printf("请输入你要查找的同学的学号\n"); scanf("%s",s); p=h; while(strcmp(p->no,s)&&p! =NULL) p=p->next; if(p==NULL) printf("'n没有学号为%s的学生\n",s); else { printf("\n\n\n***********************找到了***********************\n"); printf("|学号|姓名|数学|英语|计算机|总分|平均分|名次|\n"); printf("|----------|------------|------|------|-------|------|------|---|\n"); printf("|%-7s|%-9s|%6d|%6d|%6d|%6.2f|%6.2f|%3d|\n",p->no,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order); printf("***********************end***********************\n"); } } voidsearch2(STUDENT*h) { STUDENT*p; chars[11]; printf("请输入你要查找的同学的姓名\n"); scanf("%s",s); p=h; while(strcmp(p->name,s)&&p! =NULL) p=p->next; if(p==NULL) printf("\n没有姓名为%s的学生\n",s); else { printf("\n\n\n***********************找到了***********************\n"); printf("|学号|姓名|数学|英语|计算机|总分|平均分|名次|\n"); printf("|----------|-----------|------|------|-------|------|------|---|\n"); printf("|%-7s|%-9s|%6d|%6d|%6d|%6.2f|%6.2f|%3d|\n",p->no,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order); printf("***********************end***********************\n"); } } voidsave(STUDENT*h) { FILE*fp; STUDENT*p; charoutfile[10]; printf("请输入保存文件的文件名,例如c: \\f1\\te.txt: \n"); scanf("%s",outfile); if((fp=fopen(outfile,"wt"))==NULL) { printf("不能打开文件\n"); exit (1); } printf("\n正在保存......\n"); p=h; while(p! =NULL) { fprintf(fp,"|%-7s|%-9s|%4d|%4d|%4d|%5.2f|%5.2f|%3d|\n",p->no,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order); p=p->next; } fclose(fp); printf("------保存成功! ! ! ------\n"); } voidsort(STUDENT*h) { STUDENT*p,*q,*t; inti; intdata; p=q=t=(STUDENT*)malloc(sizeof(STUDENT)); printf("\n\n\n\n\n\t\t1.按数学排序\n\n\t\t2.按英语排序\n\n\t\t3.按计算机排序\n\n\t\t请选择: "); scanf("%d",&data); if(data==1) for(p=h->next;p->next! =NULL;p=p->next) { for(q=p->next;q! =NULL;q=q->next) { if(q->score[0]>p->score[0]) { *t=*q; *q=*p; *p=*t; p->next=q->next; q->next=t->next; } } } elseif(data==2) for(p=h->next;p->next! =NULL;p=p->next) { for(q=p->next;q! =NULL;q=q->next) { if(q->score[1]>p->score[1]) { *t=*q; *q=*p; *p=*t; p->next=q->next; q->next=t->next; } } } elseif(data==3) for(p=h->next;p->next! =NULL;p=p->next) { for(q=p->next;q! =NULL;q=q->next) { if(q->score[2]>p->score[2]) { *t=*q; *q=*p; *p=*t; p->next=q->next; q->next=t->next; } } } p=h; i=0; while(p! =NULL) { i++; p->order=i; p=p->next; } print(h); printf("排序成功\n\n"); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学生 成绩管理系统