成绩管理系统.docx
《成绩管理系统.docx》由会员分享,可在线阅读,更多相关《成绩管理系统.docx(14页珍藏版)》请在冰豆网上搜索。
成绩管理系统
源程序代码
成绩管理系统
#ifndefsms_stuct_INCLUDED//防止下面的内容被重复包含
#definesms_stuct_INCLUDED
#include//printf()、scanf()等函数
#include//strlen()、strcpy()等函数
#include//atoi()函数
//定义常数
#defineN3
//定义结构体
typedefstructstudent
{
charno[11];
charname[15];
floatscore[N];
floatsum;
floataverage;
intorder;
}STUDENT;
//函数声明
intInput(STUDENT*stud,intn);//输入记录
voidprint(STUDENT*stud,intn);//显示记录
voidsort(STUDENT*stud,intn);//排序记录
voidsearch(STUDENT*stud,intn);//查找记录
intinsert(STUDENT*stud,intn);//插入记录
intdelete1(STUDENT*stud,intn);//删除记录
voidsave(STUDENT*stud,intn);//存储记录
intload(STUDENT*stud);//导入记录
voidcount(STUDENT*stud,intn);//统计
#endif
#include"sms_struct.h"
/*菜单函数,返回值为整数*/
#include"stdio.h"
intmenu_select()
{
chars[3];
intc;
printf("\n***************主菜单**************\n");
printf("1.输入记录\n");
printf("2.显示所有记录\n");
printf("3.对所有记录进行排序\n");
printf("4.按姓名查找记录并显示\n");
printf("5.插入记录\n");
printf("6.删除记录\n");
printf("7.将所有记录保存到文件\n");
printf("8.从文件中读入所有记录\n");
printf("9.统计区间内成绩\n");
printf("10.退出\n");
printf("***********************************\n\n");
do
{
printf("请选择操作(1-10):
");
scanf("%s",s);
c=atoi(s);
}while(c<0||c>10);/*选择项不在~9之间重输*/
return(c);/*返回选择项,主程序根据该数调用相应的函数*/
}
/******主函数开始*******/
main()
{
intn=0;
STUDENTstudent[20];/*定义结构数组*/
//system("color5e");/*清屏*/
for(;;)/*无限循环*/
{
switch(menu_select())/*调用主菜单函数,返回值整数作开关语句的条件*/
{
case1:
n=Input(student,n);break;/*新建记录*/
case2:
print(student,n);break;/*显示全部记录*/
case3:
sort(student,n);break;/*排序*/
case4:
search(student,n);break;/*查找记录*/
case5:
n=insert(student,n);break;/*插入记录*/
case6:
n=delete1(student,n);break;/*删除记录*/
case7:
save(student,n);break;/*保存文件*/
case8:
n=load(student);break;/*读文件*/
case9:
count(student,n);break;/*统计*/
case10:
exit(0);/*程序结束*/
}
}
}
#include"sms_struct.h"
/*创建结构体数组,完成数据录入功能*/
intInput(STUDENT*stud,intn)
{
inti,j;
floats;
charsign;
i=0;
while(sign!
='n'&&sign!
='N')
{
printf("\n请按如下提示输入相关信息.\n\n");
printf("输入学号:
");
scanf("%s",stud[n+i].no);/*输入学号*/
printf("输入姓名:
");
scanf("%s",stud[n+i].name);/*输入姓名*/
printf("输入%d个成绩:
\n",N);/*提示开始输入成绩*/
s=0;/*计算每个学生的总分,初值为*/
for(j=0;j{
do{
printf("score[%d]:
",j);/*提示输入第几门课程*/
scanf("%f",&stud[n+i].score[j]);/*输入成绩*/
/*确保成绩在~100之间*/
/*出错提示信息*/
}while(stud[n+i].score[j]>100||stud[n+i].score[j]<0);
s=s+stud[n+i].score[j];/*累加各门课程成绩*/
}
stud[n+i].sum=s;/*将总分保存*/
stud[n+i].average=(float)s/N;/*求出平均值*/
stud[n+i].order=0;/*未排序前此值为*/
printf("该学生的总分为:
%4.2f\n\t平均分为:
%4.2f\n",stud[n+i].sum,stud[n+i].average);
printf("=====>提示:
继续添加记录?
(Y/N)");
getchar();/*把键盘缓冲区中的前面输入的回车键给读掉,不然下面sign读到的是回车符*/
scanf("%c",&sign);
i++;
}
return(n+i);
}
#include"sms_struct.h"
/*显示模块*/
#include"stdio.h"
voidprint(STUDENT*stud,intn)
{
inti=0;/*统计记录条数*/
if(n==0)
{
printf("\n很遗憾,空表中没有任何记录可供显示!
\n");
}
else
{
printf("**********************************STUDENT****************************************\n");
printf("记录号 学号姓名科目1 科目2 科目3总分平均分名次\n");
printf("-----------------------------------------------------------------------------------\n");
while(i{
printf("%-4d%-11s%-15s%5.2f%7.2f%7.2f%9.2f%6.2f%3d\n",i+1,stud[i].no,stud[i].name,stud[i].score[0],stud[i].score[1],
stud[i].score[2],stud[i].sum,stud[i].average,stud[i].order);
i++;
}
printf("***********************************************************************************\n\n");
}
}
#include"sms_struct.h"
#include"stdio.h"
voidswap(STUDENT*stud1,STUDENT*stud2)
{
inti;
chartemp1[15];
floattemp2;
floattemp3;
strcpy(temp1,stud1->no);strcpy(stud1->no,stud2->no);strcpy(stud2->no,temp1);
strcpy(temp1,stud1->name);strcpy(stud1->name,stud2->name);strcpy(stud2->name,temp1);
for(i=0;i<3;i++)
{
temp2=stud1->score[i];
stud1->score[i]=stud2->score[i];
stud2->score[i]=temp2;
}
temp3=stud1->sum;stud1->sum=stud2->sum;stud2->sum=temp3;
temp3=stud1->average;stud1->average=stud2->average;stud2->average=temp3;
}
/*排序模块,实现根据总分sum的值按降序排列*/
voidsort(STUDENT*stud,intn)
{
inti,j;
intmaxPosition;
for(i=0;i{
maxPosition=i;
for(j=i+1;j{
if(stud[j].sum>stud[maxPosition].sum)
{
maxPosition=j;
}
}
if(maxPosition!
=i)
{
swap(&stud[i],&stud[maxPosition]);
}
}
i=0;
while(i{
stud[i].order=i+1;
i++;
}
printf("按总分从高到低排名成功!
!
!
\n");/*排序成功*/
}
#include"sms_struct.h"
/*查找记录模块*/
#include"stdio.h"
voidsearch(STUDENT*stud,intn)
{
inti=0;
chars[15];/*存放姓名的字符数组*/
printf("请输入您要查找的学生姓名:
\n");
scanf("%s",s);/*输入姓名*/
while(i{
i++;
}
if(i==n)/**/
printf("\n您要查找的是%s,很遗憾,查无此人!
\n",s);
else/*显示找到的记录信息*/
{
printf("***********************************Found*****************************************\n");
printf("学号姓名科目1 科目2 科目3总分平均分名次\n");
printf("-----------------------------------------------------------------------------------\n");
printf("%-11s%-15s%5.2f%7.2f%7.2f%9.2f%6.2f%3d\n",stud[i].no,stud[i].name,stud[i].score[0],stud[i].score[1],
stud[i].score[2],stud[i].sum,stud[i].average,stud[i].order);
printf("***********************************************************************************\n");
}
}
#include"sms_struct.h"
/*在指定位置插入记录*/
#include"stdio.h"
intinsert(STUDENT*stud,intn)
{
inti=0,j;
floats;
intposition;
printf("请输入插入记录的位置:
\n");/*显示提示信息*/
scanf("%d",&position);/*输入插入记录的位置*/
while(position<0||position>n)
{
printf("输入位置有误,请重新输入插入记录的位置:
\n");/*显示提示信息*/
}
//将插入位置开始的所有记录向后移动
for(i=n-1;i>=position;i--)
{
strcpy(stud[i+1].no,stud[i].no);
strcpy(stud[i+1].name,stud[i].name);
stud[i+1].score[0]=stud[i].score[0];
stud[i+1].score[1]=stud[i].score[1];
stud[i+1].score[2]=stud[i].score[2];
stud[i+1].sum=stud[i].sum;
stud[i+1].average=stud[i].average;
stud[i+1].order=stud[i].order;
}
//录入记录并插入
i=position;
printf("\n请按如下提示输入相关信息.\n\n");
printf("输入学号:
");
scanf("%s",stud[i].no);/*输入学号*/
printf("输入姓名:
");
scanf("%s",stud[i].name);/*输入姓名*/
printf("输入%d个成绩:
\n",N);/*提示开始输入成绩*/
s=0;/*计算每个学生的总分,初值为*/
for(j=0;j{
do{
printf("score[%d]:
",j);/*提示输入第几门课程*/
scanf("%f",&stud[i].score[j]);/*输入成绩*/
if(stud[i].score[j]>100||stud[i].score[j]<0)/*确保成绩在~100之间*/
printf("非法数据,请重新输入!
\n");/*出错提示信息*/
}while(stud[i].score[j]>100||stud[i].score[j]<0);
s=s+stud[i].score[j];/*累加各门课程成绩*/
}
stud[i].sum=s;/*将总分保存*/
stud[i].average=(float)s/N;/*求出平均值*/
stud[i].order=0;/*未排序前此值为*/
printf("\n已经在位置成功插入新记录!
\n",position);
returnn+1;
}
#include"sms_struct.h"
/*删除记录模块*/
#include"stdio.h"
intdelete1(STUDENT*stud,intn)
{
inti=0;
chark[5];/*定义字符串数组,用来确认删除信息*/
chars[15];/*存放学号*/
printf("请输入要删除学生的姓名:
\n");/*显示提示信息*/
scanf("%s",s);/*输入要删除记录的姓名*/
while(i{
i++;
}
if(i==n)/**/
printf("\n您要删除的是%s,很遗憾,查无此人!
\n",s);
else/*显示找到的记录信息*/
{
printf("***********************************Found*****************************************\n");
printf("学号姓名科目1 科目2 科目3总分平均分名次\n");
printf("-----------------------------------------------------------------------------------\n");
printf("%-11s%-15s%5.2f%7.2f%7.2f%9.2f%6.2f%3d\n",stud[i].no,stud[i].name,stud[i].score[0],stud[i].score[1],
stud[i].score[2],stud[i].sum,stud[i].average,stud[i].order);
printf("***********************************************************************************\n");
do{
printf("您确实要删除此记录吗?
(y/n):
");
scanf("%s",k);
}while(k[0]!
='y'&&k[0]!
='n');
if(k[0]!
='n')/*删除确认判断*/
{
for(;i{
strcpy(stud[i].no,stud[i+1].no);
strcpy(stud[i].name,stud[i+1].name);
stud[i].score[0]=stud[i+1].score[0];
stud[i].score[1]=stud[i+1].score[1];
stud[i].score[2]=stud[i+1].score[2];
stud[i].sum=stud[i+1].sum;
stud[i].average=stud[i+1].average;
stud[i].order=stud[i+1].order-1;
}
printf("\n已经成功删除姓名为%s的学生的记录!
\n",s);
}
}
returnn-1;
}
#include"sms_struct.h"
/*保存数据到文件模块*/
#include"stdio.h"
voidsave(STUDENT*stud,intn)
{
FILE*fp;/*定义指向文件的指针*/
inti=0;
charoutfile[20];/*保存输出文件名*/
printf("请输入导出文件名,例如:
G:
\\f1\\score.txt:
\n");
scanf("%s",outfile);
if((fp=fopen(outfile,"wb"))==NULL)/*为输出打开一个二进制文件,如没有则建立*/
{
printf("Cannotopenfile\n");
exit
(1);
}
while(i{
fwrite(&stud[i],sizeof(STUDENT),1,fp);/*写入一条记录*/
i++;
}
fclose(fp);/*关闭文件*/
printf("-----所有记录已经成功保存至文件%s中!
-----\n",outfile);/*显示保存成功*/
}
#include"sms_struct.h"
/*导入信息模块*/
#include"stdio.h"
intload(STUDENT*stud)
{
inti;
FILE*fp;/*定义指向文件的指针*/
charinfile[20];/*保存文件名*/
printf("请输入导入文件名,例如:
G:
\\f1\\score.txt:
\n");
scanf("%s",infile);/*输入文件名*/
if((fp=fopen(infile,"rb"))==NULL)/*打开一个二进制文件,为读方式*/
{
printf("文件打开失败!
\n");
return0;
}
i=0;
while(!
feof(fp))/*循环读数据直到文件尾结束*/
{
if(1!
=fread(&stud[i],sizeof(STUDENT),1,fp))
break;/*如果没读到数据,跳出循环*/
i++;
}
fclose(fp);/*关闭文件*/
printf("已经成功从文件%s导入数据!
!
!
\n",infile);
returni;
}
#include"sms_struct.h"
#include"stdio.h"
voidcount(STUDENT*stud,intn)//统计区间内数据
{
inta,b,c,d=0;
inti=0;
intleap[50];
printf("请输入要查找的科目,例如:
1\n");
scanf("%d",&c);
printf("请输入要查找的区间,例如:
6070\n");
scanf("%d%d",&a,&b);
for(i=0;i{
leap[i]=0;
if(stud[i].score[c-1]>=a&&stud[i].score[c-1]
{leap[i]=1;d++;}
}
printf("***********************************Found**************