学生成绩管理系统Word文档格式.docx
《学生成绩管理系统Word文档格式.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统Word文档格式.docx(27页珍藏版)》请在冰点文库上搜索。
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"
stdlib.h"
string.h"
#defineN3
voidinputs(char*prompt,char*s,intcount);
main()
inti;
STUDENT*head;
head=init();
secret();
for(;
;
)
{
switch(menu_select())
case0:
head=init();
break;
case1:
head=create();
case2:
save(head);
case3:
print(head);
case4:
search1(head);
case5:
head=del(head);
case6:
sort(head);
case7:
search2(head);
case8:
exit(0);
}
}
voidsecret()
while
(1)
inta;
charf;
charch[10];
charnum[20]={"
12345"
};
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欢迎进入学生成绩管理系统!
f=getchar();
getchar();
break;
else
\n这个密码是错误的!
"
\n请输入正确的密码:
"
intmenu_select()
char*menu[]={"
************菜单************"
0.初始化链表"
1.输入学生成绩"
2.保存学生记录"
3.显示学生记录"
4.按学号查找学生信息"
5.删除指定学号的学生信息"
6.按某一门课对学生成绩排序"
7.按姓名查找学生信息"
8.退出系统"
chars[3];
intc,i;
=9;
%s\n"
menu[i]);
do
\n请选择0~10中的某一个选项\n"
scanf("
%s"
s);
c=atoi(s);
}while(c<
0||c>
8);
returnc;
STUDENT*init()
returnNULL;
STUDENT*create()
ints;
STUDENT*h=NULL,*info;
info=(STUDENT*)malloc(sizeof(STUDENT));
if(!
info)
\n内存不足"
inputs("
输入学号:
info->
no,11);
if(info->
no[0]=='
@'
)break;
输入姓名:
name,15);
开始输入%d门课的成绩\n"
N);
s=0;
N;
do{
第%d门分数:
i+1);
%d"
&
info->
score[i]);
score[i]>
100||info->
score[i]<
0)
输入成绩错误,请重新输入:
}while(info->
0);
s=s+info->
score[i];
info->
sum=s;
average=(float)s/N;
order=0;
next=h;
h=info;
returnh;
voidinputs(char*prompt,char*s,intcount)
charp[255];
printf(prompt);
p);
if(strlen(p)>
count)
\n太长了!
}while(strlen(p)>
count);
strcpy(s,p);
voidprint(STUDENT*h)
inti=0;
STUDENT*p;
p=h;
\n\n\n***********************学生***********************\n"
|序号|学号|姓名|数学|英语|计算机|总分|平均分|名次|\n"
|---|-------|---------|------|------|-------|------|-------|---|\n"
while(p!
=NULL)
i++;
|%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;
***********************end***********************\n"
STUDENT*del(STUDENT*h)
STUDENT*p,*q;
chars[11];
请输入要删除的学生的学号\n"
q=p=h;
while(strcmp(p->
no,s)&
&
p!
q=p;
if(p==NULL)
\n链表中没有学号为%s的学生\n"
else
\n\n\n***********************找到了***********************\n"
|学号|姓名|数学|英语|计算机|总分|平均分|名次|\n"
|----------|-----------|------|------|-------|------|-------|---|\n"
|%-7s|%-9s|%6d|%6d|%6d|%6.2f|%6.2f|%3d|\n"
p->
请按任意键删除\n"
getchar();
if(p==h)
h=p->
elseq->
next=p->
free(p);
\n已经删除学号为%s的学生\n"
不要忘了保存数据\n"
voidsearch1(STUDENT*h)
请输入你要查找的同学的学号\n"
'
n没有学号为%s的学生\n"
|----------|------------|------|------|-------|------|------|---|\n"
voidsearch2(STUDENT*h)
请输入你要查找的同学的姓名\n"
name,s)&
\n没有姓名为%s的学生\n"
|----------|-----------|------|------|-------|------|------|---|\n"
voidsave(STUDENT*h)
FILE*fp;
charoutfile[10];
请输入保存文件的文件名,例如c:
\\f1\\te.txt:
outfile);
if((fp=fopen(outfile,"
wt"
))==NULL)
不能打开文件\n"
exit
(1);
\n正在保存......\n"
fprintf(fp,"
|%-7s|%-9s|%4d|%4d|%4d|%5.2f|%5.2f|%3d|\n"
fclose(fp);
------保存成功!
!
------\n"
voidsort(STUDENT*h)
STUDENT*p,*q,*t;
intdata;
p=q=t=(STUDENT*)malloc(sizeof(STUDENT));
\n\n\n\n\n\t\t1.按数学排序\n\n\t\t2.按英语排序\n\n\t\t3.按计算机排序\n\n\t\t请选择:
data);
if(data==1)
for(p=h->
p->
next!
=NULL;
p=p->
next)
{
for(q=p->
q!
q=q->
{
if(q->
score[0]>
score[0])
{
*t=*q;
*q=*p;
*p=*t;
p->
next=q->
q->
next=t->
}
}
}
elseif(data==2)
for(p=h->
for(q=p->
if(q->
score[1]>
score[1])
{
*t=*q;
*q=*p;
*p=*t;
p->
q->
}
elseif(data==3)
for(p=h->
for(q=p->
if(q->
score[2]>
score[2])
{
*t=*q;
*q=*p;
*p=*t;
p->
q->
}
i=0;
p->
order=i;
print(h);
printf("
排序成功\n\n"