数据结构学生成绩管理系统Word格式.docx
《数据结构学生成绩管理系统Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构学生成绩管理系统Word格式.docx(45页珍藏版)》请在冰豆网上搜索。
1.3.4.程序编码:
把详细设计的结果进一步求精为程序设计语言程序。
同时加入一些注解和断言,使程序中逻辑概念清楚;
1.3.5.程序调试与测试:
采用自底向上,分模块进行,即先调试低层函数。
能够熟练掌握调试工具的各种功能,设计测试数据确定疑点,通过修改程序来证实它或绕过它。
调试正确后,认真整理源程序及其注释,形成格式和风格良好的源程序清单和结果;
2系统设计
2.1总体设计
按系统分析的功能要求将系统划分为以下几个主要功能模块:
1---学生记录录入
2---学生成绩查询:
按学号查询、按姓名查询
3---删除记录
4---排序
5---修改数据
6---显示全部学生记录
7---统计
8---更换用户
9---保存记录
0---退出系统
2.2详细设计
2.2.1界面设计
1、菜单设计
菜单主要有学生成绩录入、成绩查询、成绩排序、更换用户……设计时主要采用switch-case这个结构,从而选择调用相应的函数。
子菜单也是利用这个原理方法设计的
2、信息显示界面的设计
信息显示主要用了for(;
;
)循环,输出信息,并设置好输出格式,运行时如下:
2.2.2各功能模块的设计
主函数主要作用是控制调用其它函数协调工作。
其流程图如下:
查询窗口
排序窗口
按总分排序
修改窗口
删除窗口
统计窗口
统计结果
2.2.2系统编码设计
3.1预处理命令及结构体类型的声明
#include"
stdio.h"
stdlib.h"
string.h"
windows.h"
#defineM100
3.2main函数
voidmain()
{
welcome();
IO_ReadInfo();
Login();
}
3.3程序代码
voidLogin();
/*<
<
***定义学生结构体***>
>
*/
typedefstructstu{
charStuID[12];
charStudName[12];
floatScore[5];
floatAv;
floatSum;
inttag;
}Stud;
Studstud[M];
intnum=0;
***计算总分***>
*/
floatsum(Studstud)
intj;
floatsum=0;
for(j=0;
j<
5;
j++)
{
sum+=stud.Score[j];
}
returnsum;
***通过学号返回数组下标***>
intStudent_SearchByIndex(charid[])
{
inti;
for(i=0;
i<
num;
i++)
{
if(strcmp(stud[i].StuID,id)==0)
{returni;
}
}
return-1;
***通过姓名返回数组下标***>
intStudent_SearchByName(charname[])
if(strcmp(stud[i].StudName,name)==0)
return-1;
***解决学号冲突***>
intConflictID(Studstud[],intn,charID[])
for(i=0;
i++)
if(i!
=n)
if(strcmp(stud[i].StuID,ID)==0)
{
returnTRUE;
break;
}
if(i==num)
{returnFALSE;
***显示单条学生记录***>
voidStudent_DisplaySingle(intindex)
printf("
\n*◆◆◆◆◆◆◆◆◆◆◆◆学生成绩单◆◆◆◆◆◆◆◆◆◆*\n"
);
\t\t姓名:
%s>
\t学号:
"
stud[index].StudName,stud[index].StuID);
\n\t\t计算机操作系统:
%.2f>
(&
stud[index])->
Score[0]);
\n\t\t大学英语:
Score[1]);
\n\t\t基础会计:
Score[2]);
\n\t\t数据结构:
Score[3]);
\n\t\tJava语言设计:
Score[4]);
\n\t\t总分:
Sum);
\n\t\t平均分:
\n\n\n"
Av);
***显示学生信息***>
voidStudent_Display()
\n%-4s%s\t%-8s%-10s%-10s%-10s%-10s%-10s%-9s\n"
"
编号"
学号"
姓名"
操作系统"
大学英语"
会计基础"
数据结构"
Java设计"
总分"
-------------------------------------------------------------------------------\n"
%-4d%s\t%-8s%-10.2f%-10.2f%-10.2f%-10.2f%-10.2f%-9.1f\n"
i+1,(&
stud[i])->
StuID,(&
StudName,(&
Score[0],(&
Score[1],(&
Score[2],(&
Score[3],(&
Score[4],(&
***插入学生信息***>
voidStudent_Insert()
charc;
\n"
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n\n\n"
while
(1)
printf("
请输入学号:
scanf("
%s"
&
stud[num].StuID);
while(ConflictID(stud,num,stud[num].StuID))
getchar();
学号已经存在\2\n请重新输入学号:
"
scanf("
}getchar();
请输入学生姓名:
stud[num].StudName);
getchar();
请输入计算机操作系统成绩<
0~100>
:
%f"
stud[num].Score[0]);
while(stud[num].Score[0]>
100||stud[num].Score[0]<
0)
getchar();
输入有误\2请重新输入\n计算机操作系统成绩<
}
请输入大学英语成绩<
stud[num].Score[1]);
while(stud[num].Score[1]>
100||stud[num].Score[1]<
输入有误\2请重新输入\n大学英语成绩<
请输入基础会计成绩<
stud[num].Score[2]);
while(stud[num].Score[2]>
100||stud[num].Score[2]<
输入有误\2请重新输入\n基础会计成绩<
请输入数据结构基础成绩<
stud[num].Score[3]);
while(stud[num].Score[3]>
100||stud[num].Score[3]<
输入有误\2请重新输入\n数据结构基础成绩<
请输入Java语言设计成绩<
stud[num].Score[4]);
while(stud[num].Score[4]>
100||stud[num].Score[4]<
输入有误\2请重新输入\nJava语言设计成绩<
stud[num].Sum=sum(stud[num]);
stud[num].Av=stud[num].Sum/5;
num++;
是否继续?
(y/n)"
%c"
c);
getchar();
if(c=='
N'
||c=='
n'
)
{break;
***推排序***>
voidsift(Studr[],intt,intw,inttag)
if(tag==1)
inti1,j1;
Studx1;
i1=t;
x1=r[i1];
j1=2*i1+1;
while(j1<
=w)
if((j1<
w)&
&
(strcmp(r[j1].StuID,r[j1+1].StuID)>
0))
j1++;
if((strcmp(x1.StuID,r[j1].StuID))>
{
r[i1]=r[j1];
i1=j1;
j1=2*j1+1;
else
r[i1]=x1;
if(tag==2)
inti2,j2;
Studx2;
i2=t;
x2=r[i2];
j2=2*i2+1;
while(j2<
if((j2<
(r[j2].Sum>
r[j2+1].Sum))
j2++;
if(x2.Sum>
r[j2].Sum)
r[i2]=r[j2];
i2=j2;
j2=2*j2+1;
else
break;
r[i2]=x2;
voidheapsort(Studr[],intn,inttag)/*堆排序*/
inti,xx=0;
Studx;
for(i=n/2-1;
i>
=0;
i--)
sift(r,i,n-1,tag);
for(i=n-1;
0;
x=r[0];
r[0]=r[i];
r[i]=x;
sift(r,0,i-1,tag);
for(i=num-1;
i--)
{++xx;
%-4d%s\t%-8s%-10.2f%-10.2f%-10.2f%-10.2f%-10.2f%-10.1f\n"
xx,(&
***按学号修改学生信息***>
voidStudent_ModifyByID()
charid[20];
intindex;
请输入要修改的学生的学号:
id);
index=Student_SearchByIndex(id);
if(index==-1)
{printf("
学生不存在!
else
你要修改的学生信息为:
Student_DisplaySingle(index);
--请输入新值--\n"
stud[index].StuID);
请输入姓名:
stud[index].StudName);
是否要修改该学生的成绩?
Y/N>
if(c==121||c==89){
stud[index].Score[0]);
while(stud[index].Score[0]>
100||stud[index].Score[0]<
stud[index].Score[1]);
while(stud[index].Score[1]>
100||stud[index].Score[1]<
stud[index].Score[2]);
while(stud[index].Score[2]>
100||stud[index].Score[2]<
stud[index].Score[3]);
while(stud[index].Score[3]>
100||stud[index].Score[3]<
stud[index].Score[4]);
while(stud[index].Score[4]>
100||stud[index].Score[4]<
stud[index].Sum=sum(stud[index]);
stud[index].Av=stud[index].Sum/5;
if(getchar()=='
***按姓名修改学生信息***>
voidStudent_ModifyByName()
charname[20];
请输入要修改的学生的姓名:
name);
index=Student_SearchByName(name);