资源描述
C语言课程设计学生成绩管理系统完整版
33
2020年4月19日
文档仅供参考
#include<stdio.h>
#include<stdlib.h>
#include<io.h>
#include<string.h>
/* strcmp函数原型包含*/
#define N 100
/*定义最大学生人数为100*/
struct student /*学生结构体定义*/
{
char no[11]; /*学号,10位*/
char name[10];/*姓名,3个汉字*/
char grade[10];/*班级*/
char pro[20];/*专业*/
float score[5];/*储存5门功课的成绩*/
float ave;/*储存平均分*/
int year;/*入年*/
}stu[N];
int num;
void panduani(int); /*经过i的值,判断信息要查找的信息是否存在*/
void output(); /*输出学生成绩函数(公共函数)*/
void init(); /*系统初始化函数*/
void newfile(); /*建立新的数据文件*/
void read1(); /*从数据文件中读取数据*/
void weihu(); /*维护界面函数*/
void new1(); /*新增一个学生成绩函数*/
void xiugai(); /*修改学生成绩*/
void xgcj(int); /*修改成绩*/
void delete1(); /*删除学生信息函数*/
void tongji(); /*统计界面函数*/
void tongji1(); /*计算每个学生平均分*/
void tongji2(); /*计算每门课程的平均分*/
void paixu1(); /*排序函数*/
void paino(); /*按学号排序*/
void paiave(); /*按平均分排序*/
void paidkcj(); /*按单科成绩排序*/
void change(int,int); /*交换结构体数组中的两个记录*/
void outputx(int); /*选择输出单科成绩*/
void find1(); /*查找界面函数*/
int find(char sno[]); /*按学号查找*/
int findname(char cname[]);/*按姓名查找*/
void findyear(int cyear); /*按入年查找*/
void save(); /*保存文件*/
void stop(); /*停顿函数*/
void stop() /*停顿函数 (公共函数)*/
{
printf("Press Any Key To Continue...\n");
getchar();
}
void output() /*输出学生成绩函数(公共函数)*/
{
int i,j;
printf("===================================================================\n");
printf("学号 姓名 班级 专业 入年 C语言 高数 大物 电路 模电\n");
printf("===================================================================\n");
for(i=0;i<num;i++)
{
printf("%s %s %s %s %d",stu[i].no,stu[i].name,stu[i].grade,stu[i].pro,stu[i].year);
for(j=0;j<5;j++)
printf(" %.1f",stu[i].score[j]);
printf("\n");
}
stop();
}
void init() /*系统初始化函数 */
{
if(access("stu.dat",0)) /*判断文件是否存在*/
newfile(); /*若不存在,新建数据文件*/
else
read1(); /*若存在,读取数据*/
}
void newfile() /*建立新的数据文件 */
{
int i;
FILE *fp;
if((fp=fopen("stu.dat","wb"))==NULL) /*创立二进制文件*/
{
printf("创立文件失败,请重新运行程序.\n"); /*显示"创立文件失败,请重新运行程序"*/
exit(0); /*终止程序*/
}
printf("初次运行,进行数据初始化...\n");/*显示"初次运行,进行数据初始化..."*/
stop();
printf("请输入学生人数:");/*显示"请输入学生人数:"*/
scanf("%d",&num);
for(i=0;i<num;i++)
{
printf("请输入第 %d个学生的学号:",i+1); /*显示"请输入第i+1个学生的学号:"*/
getchar(); /*吃回车*/
gets(stu[i].no);
printf("姓名:"); /*显示"姓名:"*/
gets(stu[i].name);
printf("班级:"); /*显示"班级:"*/
gets(stu[i].grade);
printf("专业:"); /*显示"专业:"*/
gets(stu[i].pro);
printf("入年n:");/*显示"入年"*/
scanf("%d",&stu[i].year);
printf("C语言成绩:");/*显示"C语言成绩"*/
scanf("%f",&stu[i].score[0]);
printf("高数成绩:");/*显示"高数成绩"*/
scanf("%f",&stu[i].score[1]);
printf("大物成绩:");/*显示"大物成绩"*/
scanf("%f",&stu[i].score[2]);
printf("电路成绩:");/*显示"电路成绩"*/
scanf("%f",&stu[i].score[3]);
printf("模电成绩:");/*显示"模电成绩"*/
scanf("%f",&stu[i].score[4]);
fwrite(&stu[i],1,sizeof(struct student),fp); /*把第i+1名学生成绩写入文件*/
}
fclose(fp);
printf("========================\n");
printf(" 刚才输入的 %d 个数据为:\n",num); /*显示"刚才输入的 num 个数据为:"*/
printf("========================\n\n");
output();
}
void read1() /*从数据文件中读取数据 */
{
FILE *fp;
num=0; /*num为数据文件中实际存储的学生人数*/
fp=fopen("stu.dat","r");
if(fp==NULL) /*数据文件不存在*/
{
printf("文件打开失败!重新运行程序\n"); /*显示"文件打开失败!重新运行程序"*/
exit(0);
}
while(!feof(fp)) /*文件结束检测"*/
{
fread(&stu[num],1,sizeof(struct student),fp);
num++;
}
num--;
fclose(fp);
printf("\t\t\t=======================================\n");
printf(" \t\t\t现有 %d 个学生的成绩:\n",num); /*显示"现有 NUM个学生的成绩:"*/
printf("\t\t\t=======================================\n\n");
output();
}
void weihu() /*维护界面函数 */
{
char c1;
while(1)
{
printf("\n\n\n\t\t\t************************\n");
printf("\t\t\t* 维护 *\n");
printf("\t\t\t* 1. 新增 *\n"); /*新增*/
printf("\t\t\t* 2. 删除 *\n"); /*删除(按学号)*/
printf("\t\t\t* 3. 修改 *\n"); /*修改*/
printf("\t\t\t* 9. 返回 *\n"); /*返回*/
printf("\t\t\t************************\n");
printf("\t\t\t 请选择:\n");/*请选择:*/
c1=getchar();
getchar();
if(c1=='9')
break;
switch(c1)
{
case '1':
new1();
break;
case '2':
delete1();
case '3':
xiugai();
break;
default:
printf("选择有误,请重选!\n");/*"选择有误,请重选!"*/
}
}
}
void new1() /*新增一个学生成绩函数 */
{
printf("请输入学号:"); /*显示"请输入学号:"*/
gets(stu[num].no);
printf("姓名:"); /*显示"姓名:"*/
gets(stu[num].name);
printf("班级:"); /*显示"班级:"*/
gets(stu[num].grade);
printf("专业:"); /*显示"专业:"*/
gets(stu[num].pro);
printf("入年:");/*显示"入年"*/
scanf("%d",&stu[num].year);
printf("C语言成绩:");/*显示"C语言成绩"*/
scanf("%f",&stu[num].score[0]);
printf("高数成绩:");/*显示"高数成绩"*/
scanf("%f",&stu[num].score[1]);
printf("大物成绩:");/*显示"大物成绩"*/
scanf("%f",&stu[num].score[2]);
printf("电路成绩:");/*显示"电路成绩"*/
scanf("%f",&stu[num].score[3]);
printf("模电成绩:");/*显示"模电成绩"*/
scanf("%f",&stu[num].score[4]);
num++;
printf("\n======================================\n");
printf("现有 %d个学生的成绩:\n",num); /*显示"现有 NUM个学生的成绩:"*/
printf("======================================\n\n");
output();
}
void xiugai() /*修改学生成绩*/
{
char xg[11];
int i;
printf("\n请输入要修改学生的学号:\n\n");
gets(xg);
for(i=0;i<num;i++)
if(strcmp(stu[i].no,xg)==0)break;
if(i==num)
{
printf("\n数据文件无该生信息!\n\n请重新输入学号.\n\n");
stop();
return;
}
xgcj(i);
}
void xgcj(int x) /*修改成绩*/
{
char xueke[5][10]={"C语言","高数","物理","电路","模电"};
char (*p)[10],c;
int j,k;
p=xueke;
for(;;)
{
printf("\n");
printf("\t\t\t************************************\n\n");
printf("\t\t\t 成绩 \n");
printf("\t\t\t 1.C 语言 \n"); /*C语言*/
printf("\t\t\t 2.高数 \n"); /*高数*/
printf("\t\t\t 3.物理 \n"); /*大学物理*/
printf("\t\t\t 4.电路 \n"); /*电路*/
printf("\t\t\t 5.模电 \n"); /*模电*/
printf("\t\t\t 9.返回 \n\n"); /*返回上级*/
printf("\t\t\t************************************\n\n");
printf("\t请选择要修改的成绩(按 1.2.3.4.5.9):\n");
c=getchar();
getchar();
if(c=='9')break;
else if (c>='1'&&c<='5')
{
k=c-49;
printf("\n请输入 %s 成绩:\n",p+k);
scanf("%f",&stu[x].score[k]);
printf("\n修 息为:\n");
printf("学号 姓名 班级 专业 入年 C语言 高数 大物 电路 模电\n");
printf("===================================================================\n");
printf("%s %s %s %s %d",stu[x].no,stu[x].name,stu[x].grade,stu[x].pro,stu[x].year);
for(j=0;j<5;j++)
printf(" %.1f",stu[x].score[j]);
printf("\n");
}
else printf("\n选择有误,请重选!\n\n");
stop();
}
}
int find(char sno[]) /*按学号查找 */
{
int i;
for(i=0;i<num;i++)
if(strcmp(stu[i].no,sno)==0) /*判断两个字符串相等*/
return i;/*查找成功*/
return -1;/*查找失败*/
}
void delete1() /*删除学生信息函数*/
{
char cno[11];
int i,j;
printf("请输入要删除的学生学号:"); /*"请输入要删除的学生学号"*/
gets(cno);
i=find(cno);
if(i!=-1)
{for(j=i;j<num;j++)
stu[j]=stu[j+1];
num--;
printf("现有%d 个学生的成绩:\n",num); /*显示"现有 NUM个学生的成绩:"*/
output();}
else {printf("请输入正确的学号. \n");
stop();}
}
void tongji() /*统计界面函数 */
{
int i;
char c2;
while(1)
{
printf("\n\n\n\t\t\t*******************************\n");
printf("\t\t\t* 统计 *\n");
printf("\t\t\t* 1. 学生平均分 *\n"); /*计算学生平均分*/
printf("\t\t\t* 2. 课程平均分 *\n"); /*计算每门课程平均分*/
printf("\t\t\t* 9. 返回 *\n"); /*返回*/
printf("\t\t\t*******************************\n");
printf("\t\t\t请选择:\n");/*请选择:*/
c2=getchar();
getchar();
if(c2=='9') break;
switch(c2)
{
case '1':
tongji1();
printf("\n\n学生平均分为:\n");
printf("===========================================\n");
printf("学号 姓名 入年 平均分\n");
printf("===========================================\n");
for(i=0;i<num;i++)
printf("%s %s %d %.2f\n",stu[i].no,stu[i].name,stu[i].year,stu[i].ave);
stop();
break;
case '2':
tongji2();
break;
default:
printf("选择有误,请重选\n");/*"选择有误,请重选!"*/
}
}
}
void tongji1() /*计算每个学生平均分*/
{
int i,j;
for(i=0;i<num;i++)
{
stu[i].ave=0;
for(j=0;j<5;j++)
stu[i].ave+=stu[i].score[j];
stu[i].ave=stu[i].ave/5;
}
}
void tongji2() /*计算每门课程的平均分*/
{
int i,j;
float sum;
float avec[5]; /*储存每门课的平均分*/
for(j=0;j<5;j++)
{
sum=0;
for(i=0;i<num;i++)
sum+=stu[i].score[j];
avec[j]=sum/num;
}
printf("\n\n各科平均分:\n");/*"各科平均分:"*/
printf("===================================\n");
printf("C语言 高数 大物 电路 模电\n");
printf("===================================\n");
for(i=0;i<5;i++)
printf("%-7.1f",avec[i]);
printf("\n");
stop();
}
void paixu1() /*排序界面*/
{
char c3;
for(;;)
{
printf("\n\n\n");
printf("\t\t\t***********************************\n");
printf("\t\t\t* 排序 * \n");
printf("\t\t\t* 1. 按学号排序 * \n"); /*按学号排序*/
printf("\t\t\t* 2. 按平均分排序 * \n"); /*按平均分排序*/
printf("\t\t\t* 3. 按单科成绩排序 * \n"); /*按单科成绩排序*/
printf("\t\t\t* 9. 返回 * \n"); /*返回*/
printf("\t\t\t***********************************\n\n");
printf("\t请选择:(按1.2.3.9):\n");/*请选择:*/
c3=getchar();
getchar();
if(c3=='9') break;
switch(c3)
{
case '1':paino();break;
case '2':paiave();break;
case '3':paidkcj();break;
default:
printf("\n选择有误,请重选!\n\n");/*选择有误,请重选!*/
stop();
}
}
}
void paino() /*按学号排序*/
{ /*按学号从低到高冒泡法排序*/
int i,j;
for(i=0;i<num;i++)
for(j=0;j<num-1-i;j++)
if(strcmp(stu[j].no,stu[j+1].no)>0)
change(j,j+1);
printf("\n排序后为:\n"); /*"排序后为:"*/
output();
}
void paiave() /*按平均分排序 */
{ /*按平均分从高到低冒泡法排序*/
int i,j;
tongji1(); /*计算平均成绩*/
for(i=0;i<num;i++)
for(j=0;j<num-i-1;j++)
if(stu[j].ave<stu[j+1].ave)
change(j,j+1);
printf("\n\t排序后为:\n"); /*"排序后为:"*/
printf("\t===============================================\n");
printf("\t学号 姓名 入年 平均分 排名\n");
printf("\t===============================================\n");
for(i=0;i<num;i++)
printf("\t%s %s %d %.2f %4d\n",stu[i].no,
stu[i].name,stu[i].year,stu[i].ave,i+1);
stop();
}
void paidkcj() /*按单科成绩排序*/
{
char c;
int i,j,k;
while(1)
{
printf("\n");
printf("\t\t\t************************************\n\n");
printf("\t\t\t 单科成绩 \n");
printf("\t\t\t 1.C 语言 \n"); /*C语言*/
printf("\t\t\t 2.高数 \n"); /*高数*/
printf("\t\t\t 3.物理 \n"); /*大学物理*/
printf("\t\t\t 4.电路 \n"); /*电路*/
printf("\t\t\t 5.模电 \n"); /*模电*/
printf("\t\t\t 9.返回 \n\n"); /*返回上级*/
printf("\t\t\t************************************\n\n");
printf("\t请选择:(按1.2.3.4.5.9):\n");
c=getchar();
getchar();
if(c=='9')break;
else if (c>='1'&&c<='5')
{
k=c-49;
for(i=0;i<num;i++)
for(j=0;j<num-1-i;j++)
if(stu[j].score[k]<stu[j+1].score[k])
change(j,j+1);
outputx(k);
}
else printf("\n选择有误,请重选!\n\n");
stop();
}
}
void change(int i,int j) /*交换结构体数组中的两个记录*/
{
struct student temp;
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
void outputx(int k) /*选择输出单科成绩*/
{
char xueke[5][10]={"C语言","高数","物理","电路","模电"};
char (*p)[10]; /*定义一个指向包含10个字符型元素的一维数组的指针变量*/
int i;
p=xueke;
printf("\n\t排序后为:\n");
printf("\t===============================================\n");
printf("\t学号 姓名 入年 %s 排名\n",p+k);
printf("\t===============================================\n");
for(i=0;i<num;i++)
printf("\t%-11s% -10s%-11d%-6.1f%5d\n",stu[i].no,
stu[i].name,stu[i].year,stu[i].score[k],i+1);
}
void find1() /*查找界面函数*/
{
char c4;
char cno[11],cname[10];
int i,cyear;
while(1)
{
printf("\t\t\t*************************************\n");
printf("\t\t\t* 查找 *\n");
printf("\t\t\t* 1. 按学号查找 *\n"); /*按学号查找*/
printf("\t\t\t* 2. 按姓名查找 *\n"); /*按姓名查找*/
printf("\t\t\t* 3. 按入年查找 *\n"); /*按入年查找*/
printf("\t\t\t* 9. 返回 *\n"); /*返回*/
printf("\t\t\t*************************************\n");
printf("\t\t\t请选择:\n");/*请选择:*/
c4=getchar();
getchar();
if(c4==57) break;
switch(c4)
{
case '1':
printf("输入学号:\n");/*"输入学号:"*/
gets(cno);
i=find(cno);
panduani(i);
break;
case '2':
printf("输入姓名:\n");/*"输入姓名:"*/
gets(cname);
i=findname(cname);
panduani(i);
break;
case '3':
printf("输入入年:\n");/*"输入入年"*/
scanf("%d",&cyear);
findyear(cyear);
stop();
break;
default:
printf("选择有误,请重选!\n");/*"选择有误,请重选!"*/
}
}
}
int findname(char cname[]) /*按姓名查找*/
{
int i;
for(i=0;i<num;i++)
if(strcmp(stu[i].name,cname)==0) /*判断两个字符串相等*/
return i; /*查找成功*/
return -1; /*查找失败*/
}
void findyear(int cyear)
{
int i,j,flag=0;
for(i=0;i<num;i++)
if(stu[i].year==cyear)
{ flag=1;break;}
if(flag==0)
{printf("要查找的学生不存在\n");stop(); }
else
{
printf("查找到的学生信息为:\n");/*"查找到的学生信息为:"*/
printf("学号 姓名 班级 专业 入年 C语言 高数 大物 电路 模电\n");
printf("===================================================================\n");
for(i=0;i<num;i++)
{
if(stu[i].year==cyear) /*判断两个数值相等*/
{
printf("%s %s %s %s %d",stu[i].no,stu[i].name,stu[i].grade,stu[i].pro,stu[i].year);
for(j=0;j<5;j++)
printf(" %.1f",stu[i].score[j]);
printf("\n");
}
}
}
}
void panduani(int i) /*经过i的值,判断信息要查找的信息是否存在*/
{
int j;
if(i==-1)
{
pri
展开阅读全文