学生成绩管理系统C课设程序Word格式.docx
《学生成绩管理系统C课设程序Word格式.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统C课设程序Word格式.docx(15页珍藏版)》请在冰豆网上搜索。
load()/*加载记录或可以计算记录个数的函数*/
rb"
!
feof(fp);
fread(&
stu[i],sizeof(structstudent),1,fp);
return(i-1);
/*返回记录个数*/
/*一个任务结束时的选择浏览还是返回的函数*/
voidprintf_back()/*一个任务结束时的选择浏览还是返回*/
{intk,w;
\n\n\tSuccessful.^_^\n\n"
Whatdoyouwanttodo?
\n\n\t1).Browseallnow\t2).Back:
[]\b\b"
scanf("
%d"
&
w);
if(w==1)browse();
elsemenu();
/*显示数据结构项目函数*/
voidprintf_face()/*显示数据结构项目*/
{printf("
\n\tNO.namescore1score2score3average\n"
average(inti)/*对第i个记录的分数求平均值*/
{intj,sum;
for(sum=0,j=0;
j<
3;
j++)
sum+=stu[i].score[j];
stu[i].ave=sum/3.0;
/*学号输入函数*/
no_input(inti,intn)/*i表示第i个的学生信息,n表示比较到第n个学生*/
{intj,k,w1;
do
{w1=0;
NO.:
"
%s"
stu[i].num);
for(j=0;
stu[i].num[j]!
='
\0'
;
j++)/*学号输入函数,作了严格规定*/
if(stu[i].num[j]<
'
0'
||stu[i].num[j]>
9'
)/*判断学号是否为数字*/
{puts("
Inputerror!
Onlybemadeupof(0-9).Pleasereinput!
\n"
w1=1;
break;
if(w1!
for(k=0;
k<
k++)/*比较到第n个学生*/
/*排除第i个学生记录即你要修改的*/
if(k!
=i&
&
strcmp(stu[k].num,stu[i].num)==0)/*判断学号是否有雷同*/
Thisrecordisexist.pleasereinput!
while(w1==1);
/*对分数输入*/
score_input(inti)
{intj;
score%d:
j+1);
stu[i].score[j]);
/*输入一个记录函数*/
input(inti)/*输入一个记录函数*/
{
no_input(i,i);
/*调用学号输入函数*/
name:
stu[i].name);
score_input(i);
/*调用分数输入函数*/
average(i);
/*调用求平均值函数*/
/*显示一个记录的函数*/
printf_one(inti)/*显示一个记录的函数*/
%11s%-17s"
stu[i].num,stu[i].name);
%9d"
stu[i].score[j]);
%9.2f\n"
stu[i].ave);
voidputs___()/*显出---函数*/
{puts("
\n--------------------------------------------------------------------"
/*修改记录函数*/
modify_data(inti,intn)/*修改数据函数,修改第i个记录*/
{intc,w1;
do/*输入选择作个判断*/
\nmodifyby=>
\n\n1).NO.2.name3).score14).score2\n5).score36).allscore7).alldata8).cancelandback"
Whichyouneeded?
:
c);
if(c>
8||c<
1)
\nChoiceerror!
Pleaseagain!
/*判断选择是否错误,若是则重新选择性*/
getchar();
/*当输入是字符时可以防止死循环*/
while(c>
1);
{switch(c)/*选择要修改的项目*/
{case1:
no_input(i,n);
case2:
printf("
scanf("
case3:
score1:
stu[i].score[0]);
case4:
score2:
stu[i].score[1]);
case5:
score3:
stu[i].score[2]);
case6:
score_input(i);
case7:
input(i);
/*调用输入整条学生记录*/
case8:
menu();
/*直接返回主介面*/
2&
c<
7)
puts("
\nNow:
printf_face();
/*调用显示数据结构项目函数*/
printf_one(i);
/*修改后的记录让用户确认*/
\nAreyousure?
\n\n\t1).Sure2).Noandremodify3).Backwithoutsaveinthistime[]\b\b"
/*是否确定*/
w1);
/*选择2则表示这次修改错误要重新修改*/
while(w1==2);
return(w1);
/*返回控制值*/
/****************输入模块****************/
enter()/*输入模块*/
{inti,n;
Howmanystudents(0-%d)?
N-1);
n);
/*要输入的记录个数*/
\nEnterdatanow\n\n"
\nInput%dthstudentrecord.\n"
i+1);
input(i);
/*调用输入函数*/
if(i!
=0)save(n);
/*调用保存函数*/
printf_back();
/*一个任务结束时让用户选择是浏览还是返回*/
/****************追加模块****************/
add()/*追加模块*/
{inti,n,m,k;
FILE*fp;
n=load();
Howmanystudentsareyouwanttoadd(0-%d)?
N-1-n);
m);
/*输入要追加的记录个数*/
k=m+n;
for(i=n;
k;
i-n+1);
ab"
))==NULL)/*以ab方式打开文件,追加保存*/
cannotopenfile\n"
return;
i++)/*输入出到文件*/
/*一个任务结束时的选择浏览还是返回*/
/****************修改模块****************/
modify()/*修改模块*/
{structstudents;
inti,n,k,w0=1,w1,w2=0;
{//clrscr();
k=-1;
/*给用户看全部记录以便确认要修改的记录*/
puts___();
/*显示-----*/
{if((i!
=0)&
(i%10==0))/*目的是分屏显示*/
\n\nRememberNO.whichneededmodify.passanykeytocontiune..."
getch();
\n\n"
/*调用显示一个记录的函数*/
\n\nEnterNO.thatyouwanttomodify!
NO.:
s.num);
/*输入要修改的数据的学号*/
i++)/*查找要修改的数据*/
if(strcmp(s.num,stu[i].num)==0)
{k=i;
/*找到要修改的记录*/
s=stu[i];
/*把stu[i](即当次修改的学生记录)备份给s,以便用户反悔时恢复名誉*/
if(k==-1)printf("
\n\nNOexist!
pleaseagain"
while(k==-1);
/*当K=-1表示没有找到*/
printf_one(k);
w1=modify_data(k,n);
/*修改学生记录并且返回保存控制值w1,w1=1则表示用户已确认修改*/
if(w1==1)/*W1等于1时则表示用户确定这次修改*/
\nSuccessful^_^.\n\nAreyoumodifyanother?
\n\n\t1).Yes2).Backwithsave\t[]\b\b"
w0);
w2=1;
/*来控制保存,使w2=1是标记已有过修改*/
else
{w0=0;
if(w2==1)
stu[k]=s;
}/*走到这里是由于用户没有确认这次修改(在调用修改函数w1=modify_data(k,n);
时没有确认).使W0=0,为了让终止循环,
stu[k]=s,则把备份的s恢复给stu[k](即当次修改的),这样的好处是确保在此之前修改过的成功保存,而本次(用户没有确认的)不修改*/
if(w0!
=1&
w2==1)/*W0不等于1则表示正常返回,w2=1表示在此之前有过修改,这时就保存用户已确认修改的并返回*/
save(n);
/*w2不等于1表示在此次之前没有修改过(即:
第一次),而又反悔这次修改,则不保存返回*/
while(w0==1);
menu();
/****************删除模块****************/
del()/*删除模块*/
inti,j,n,k,c,w0=1;
/*给用户看全部记录以便确认要删除的记录*/
=0)
(i%10==0))/*目的是分屏显示,每10个一屏*/
\n\nRememberNO.whichneededdel.passanykeytocontiune..."
\n\nEnterNO.thatyouwanttoDelete!
/*找到要修改的记录的下标赋给K*/
/*K=-1,表示没有找到相同之的*/
\n\t1).sure2).noanddelanother3).backwithoutsaveall[]\b\b"
if(c==1)
{stu[k].ave=0;
/*stu[k].ave=0用来标识这个记录是要删除的.保存时则不保存stu[k].ave=0的数据*/
\n\nSuccessful^_^.\n\nAreyouagain?
\n\t1).again2).backtomenu\t[]\b\b"
/*问是否继续*/
if(c==3)w0=0;
/*w0=0不删除直接返回*/
c!
=3)/*只有当确认删除后返回才保存,不删除直接返回则不保存,且不保存在此之前删除过的记录*/
/*返回主介面*/
/****************浏览(全部)模块****************/
browse()/*浏览(全部)模块*/
{inti,j,n;
/*加载记录*/
//clrscr();
\n\nPassanykeytocontiune..."
\tThereare%drecord.\n"
n);
\nPassanykeytoback..."
/*按任意健*/
/****************查找模块****************/
search()/*查找模块*/
{inti,n,k,w1=1,w2,w3,w4;
structstudents;
{
{k=-1;
\n\nEnternamethatyouwanttosearch!
name:
s.name);
if(strcmp(s.name,stu[i].name)==0)
if(k==-1)
please"
\n\nAreyouagain?
\n\t1).again2).NOandback[]\b\b"
w2=0;
//保证在第一次找到的基础上再查找找不到时能退出
while(k==-1&
w1==1);
/*如果w1不等于1则直接返回*/
w4=0;
w3=0;
=-1)/*k不等于-1表示找到,如果找到则选择操作*/
\n\nWhatdoyouwanttodo?
\n\t1).Searchanother2).Modify3).Delete4).Backmenu[]\b\b"
w2);
switch(w2)
{case2:
w3=modify_data(k,n);
/*调用修改数据函数*/
\n\t1).Sure2).Noandback[]\b\b"
w4);
if(w4==1)
stu[k].ave=0;
/*表示删除*/
break;
if(w3==1||w4==1)
{save(n);
\n\nSuccessful.^_^."
\n\t1).Searchanother2).Back[]\b\b"
while(w2==1);
/****************插入模块****************/
insert()/*插入模块*/
{inti,j,n,c;
\nInputonedata.\n"
{input(n);
/*输入到第n个记录,即插入到最后*/
printf_one(n);
\n\nAreyousure?
\n\n\t1).Sure\t2).cancelsndagain\t3).Backwithuotsave[]\b\b"
{for(j=0;
j++)/*用起泡法排序*/
i>
j;
i--)
if(stu[i].ave>
stu[i-1].ave)
{s=stu[i-1];
stu[i-1]=stu[i];
stu[i]=s;
save(n+1);
elseif(c!
=2)menu();
while(c==2);
/****************排序模块(按平均成绩)****************/
order()/*排序模块(按平均成绩)*/
{inti,j,k,n;
n-1;
i++)/*选择法排序*/
for(j=i+1;
if(stu[j].ave>
stu[k].ave)k=j;
stu[i]=stu[k];
stu[k]=s;
/****************主界面****************/
menu()/*主界面*/
{intn,w1;
/*清屏*/
\t\t*********************MENU*********************\n\n"
\t\t\t\t1