这是我初学C时的期末作业,贴出来。
#include
#include
#include
//成绩结构体
struct score
{
char snum[9];
char sname[11];
int chinese;
int math;
int english;
int sumcj;//成绩总数
int rank;//排名
};
//函数声明
void showmenu(void);//菜单
int xg(int);//修改成绩
void lr(int);//录入成绩
void cx(int);//查询成绩
void xhcx(int);//学号查询
void xmcx(int n);//姓名查询
void rankcx(int);//排名查询
void showcxmenu(void);//二级菜单,查询菜单
void xs(int);//成绩显示
void jspm(int);//计算排名
int sc(int);//删除成绩
void bccj(void);//保存成绩并退出
//main函数
int main()
{
int flag,n=0,count=0;//flag标志位,count计数,当前总人数
//-------------判断文件里面有多少条记录--------------------//
FILE *fp;
fp=fopen("cj.txt","a+");
if(fp==NULL)
{
printf("打开文件失败,请重试!\n");
getch();
fclose(fp);
exit(0);
}
int c = 0;
while(!feof(fp))
{
char cc = fgetc(fp);
if(cc==EOF)
{
break;
}
//输出字符
// putchar(cc);
c++;
}
count = c/14;
// printf("%d", count);
// getch();
fclose(fp);
//---------------------------------//
do
{
showmenu();
scanf("%d",&flag);//录入
switch(flag)
{
case 1: printf("请输入您要录入的人数:");
scanf("%d",&n);
lr(n);
count += n;break;
case 2: count=sc(count);break;
case 3: xg(count);break;
case 4: cx(count);break;
case 5: jspm(count);break;
case 6: xs(count);break;
case 0: bccj();break;
default:printf("输入错误,请重试!\n");getch();
}
}while(flag!=0);
getch();
return 0;
}
//0显示菜单
void showmenu()
{
system("cls");
printf("*----------------------------------------------------*\n");
printf("* 欢迎使用**成绩管理系统 *\n");
printf("*----------------------------------------------------*\n");
printf("* 1: 录入成绩 *\n");
printf("* 2: 删除成绩 *\n");
printf("* 3: 修改成绩 *\n");
printf("* 4: 成绩查询 *\n");
printf("* 5: 成绩计算并排名 *\n");
printf("* 6: 显示成绩信息 *\n");
printf("* 0: 保存信息并退出系统 *\n");
printf("*----------------------------------------------------*\n");
printf("选择操作<0-6> \n");
return;
}
//1录入成绩
void lr(int n)
{
struct score stu[100];
FILE *fp;
fp=fopen("cj.txt","a+");
if(fp==NULL)
{
printf("打开文件失败,请重试!\n");
getch();
fclose(fp);
exit(0);
}
printf("请输入全部学生的学号,姓名,语文成绩,数学成绩,英语成绩;\n");
int i;
for(i=0;i<n;i++)
{
printf("----第%d个学生----\n", i+1);
printf("学号:");
scanf("%s",&stu[i].snum);
printf("姓名:");
scanf("%s,",&stu[i].sname);
printf("语文成绩:");
scanf("%d",&stu[i].chinese);
printf("数学成绩:");
scanf("%d",&stu[i].math);
printf("英语成绩:");
scanf("%d",&stu[i].english);
stu[i].sumcj=0;
stu[i].rank=0;
//写入数据
fprintf(fp,"%s %s %d %d %d %d %d\n",stu[i].snum,stu[i].sname,stu[i].chinese,stu[i].math,stu[i].english,stu[i].sumcj,stu[i].rank);}
fclose(fp);
printf("添加学生成功,请按任意键返回\n");
getch();
}
//2删除成绩
int sc(int n)
{
struct score stu[100];
struct score sub[99];//删除后的结构体数组
char stnum[9];//学号
int find=0;
printf("请输入你要删除的学生学号:");
scanf("%s", &stnum);
FILE *fp;
fp=fopen("cj.txt","r");
if(fp==NULL)
{
printf("打开文件失败,请联系管理员\n");
getch();
return -1;
}
int c=0;
int index=0;//用于记录目标序号
while(!feof(fp))//不为空
{
fscanf(fp,"%s %s %d %d %d %d %d\n", &stu[c].snum,&stu[c].sname,&stu[c].chinese,&stu[c].math,&stu[c].english,&stu[c].sumcj,&stu[c].rank);
if(strcmp(stnum,stu[c].snum)==0)
{
find = 1;//根据学号查找,找到赋值为1
index = c;//记录编号
}
c++;
}
fclose(fp);
if(n==0)
{
printf("已经没有学生成绩信息了,请按任意键返回\n");
getch();
showmenu();
return n;
}
if(find==0)
{
printf("没有该学生成绩信息,请按任意键返回\n");
getch();
showmenu();
return n;
}
else
{
int i;
//删除
for(i=0;i<c;i++)
{
if(i < index)
{
sub[i] = stu[i];
}
else
{
sub[i] = stu[i+1];
}
}
fp=fopen("cj.txt","w");
//写入数据
for(i=0;i<c-1;i++)
{
fprintf(fp,"%s %s %d %d %d %d %d\n",sub[i].snum,sub[i].sname,sub[i].chinese,sub[i].math,sub[i].english,sub[i].sumcj,sub[i].rank);
}
fclose(fp);
printf("学号为%s的学生成绩删除成功,请按任意键返回\n",stnum);
getch();
showmenu();
return n-1;
}
}
//3修改成绩
int xg(int n)
{
struct score stu[100];
FILE *fp;
char stnum[9];
int find=0;
printf("请输入要修改的学生学号:");
scanf("%s",stnum);
fp=fopen("cj.txt","r");
if(fp==NULL)
{
printf("文件打开失败,请联系管理员\n");
getch();
return -1;
}
int c=0;
while(!feof(fp))
{
fscanf(fp,"%s %s %d %d %d %d %d\n",&stu[c].snum,&stu[c].sname,&stu[c].chinese,&stu[c].math,&stu[c].english,&stu[c].sumcj,&stu[c].rank);
if(strcmp(stnum,stu[c].snum)==0)
{
find=1;
//修改操作
printf("找到你要修改成绩的同学,请输入他的成绩:\n");
printf("语文成绩: %d,新成绩为:",stu[c].chinese);
scanf("%d",&stu[c].chinese);
printf("数学成绩: %d,新成绩为:",stu[c].math);
scanf("%d",&stu[c].math);
printf("英语成绩: %d,新成绩为:",stu[c].english);
scanf("%d",&stu[c].english);
}
c++;
}
fclose(fp);
if(find==0)
{
printf("没有找到要删除的学生记录,请按任意键退出\n");
getch();
}
else
{
fp=fopen("cj.txt","w");
int i;
for(i=0;i<n;i++)
{
//更新数据
fprintf(fp,"%s %s %d %d %d %d %d\n",stu[i].snum,stu[i].sname,stu[i].chinese,stu[i].math,stu[i].english,stu[i].sumcj,stu[i].rank);
}
fclose(fp);
printf("学号为%s同学的成绩已经修改成功,请按任意键返回",stnum);
getch();
}
showmenu();
return 1;
}
//4成绩查询
void cx(int n) //n全班人数
{
int k;
do
{
showcxmenu();
scanf("%d",&k);
switch(k)
{
case 1:xhcx(n);break;//学号查询
case 2:xmcx(n);break;//姓名查询
case 3:allrankcx(n);break;//全班排名查询
case 0:break;
default:printf("输入错误,请重新选择\n");getch();
}
}while(k!=0);
return;
}
//4.0查询菜单
void showcxmenu()
{
system("cls");
printf("*----------------------------------------------------*\n");
printf("* 根据制定查询的内容 *\n");
printf("*----------------------------------------------------*\n");
printf("* 1: 按学号查询 *\n");
printf("* 2: 按姓名查询 *\n");
printf("* 3: 全班排名查询 *\n");
printf("* 0: 退出查询系统,返回主系统 *\n");
printf("*----------------------------------------------------*\n");
printf("选择操作<0-3> \n");
}
//4.1学号查询
void xhcx(int n)
{
struct score stu[100];
char snum[9];
printf("请输入你要查询学生的学号:");
scanf("%s",&snum);
FILE *fp;
fp=fopen("cj.txt ","r");
if(fp==NULL)
{
printf("打开文件失败!\n");
getch();
exit(0);
}
int c = 0;
while(!feof(fp)){
fscanf(fp,"%s %s %d %d %d %d %d\n",&stu[c].snum,&stu[c].sname,&stu[c].chinese,&stu[c].math,&stu[c].english,&stu[c].sumcj,&stu[c].rank);
c++;
}
int i;
for(i=0;i<n;i++)
{
if(strcmp(snum,stu[i].snum)==0)
{
printf("学号\t姓名\t语文\t数学\t英语\t总分\t名次\n");
printf("%s\t%s\t%d\t%d\t%d\t%d\t%d\n",stu[i].snum,stu[i].sname,stu[i].chinese,stu[i].math,stu[i].english,stu[i].sumcj,stu[i].rank);
printf("按任意键返回\n");
getch();
fclose(fp);
return;
}
}
printf("未找到要查询学生的成绩,请重试!\n");
getch();
fclose(fp);
return;
}
//4.2姓名查询
void xmcx(int n)
{
struct score stu[100];
char sname[11];
printf("请输入你要查询学生的姓名:");
scanf("%s",&sname);
FILE *fp;
fp=fopen("cj.txt ","r");
if(fp==NULL)
{
printf("打开文件失败!\n");
getch();
exit(0);
}
int c = 0;
while(!feof(fp)){
fscanf(fp,"%s %s %d %d %d %d %d\n\n",&stu[c].snum,&stu[c].sname,&stu[c].chinese,&stu[c].math,&stu[c].english,&stu[c].sumcj,&stu[c].rank);
c++;
}
int i;
for(i=0;i<n;i++)
{
if(strcmp(sname,stu[i].sname)==0)
{
printf("学号\t姓名\t语文\t数学\t英语\t总分\t名次\n");
printf("%s\t%s\t%d\t%d\t%d\t%d\t%d\n",stu[i].snum,stu[i].sname,stu[i].chinese,stu[i].math,stu[i].english,stu[i].sumcj,stu[i].rank);
printf("按任意键返回\n");
getch();
fclose(fp);
return;
}
}
printf("未找到要查询学生的成绩,请重试!\n");
getch();
fclose(fp);
return;
}
//4.3全班排名查询
void allrankcx(int n)
{
struct score stu[100];
struct score temp;
FILE *fp;
fp=fopen("cj.txt ","r");
if(fp==NULL)
{
printf("打开文件失败!\n");
getch();
exit(0);
}
int c = 0;
while(!feof(fp)){
fscanf(fp,"%s %s %d %d %d %d %d\n",&stu[c].snum,&stu[c].sname,&stu[c].chinese,&stu[c].math,&stu[c].english,&stu[c].sumcj,&stu[c].rank);
c++;
}
int i,j;
for(i=0;i<n;i++)
{
if(stu[i].rank == NULL){
printf("请先进行成绩计算进行排名!!\n");
getch();
fclose(fp);
return;
}
stu[i].sumcj = stu[i].chinese + stu[i].math + stu[i].english;
//冒泡排序算法:进行 n-1 轮比较
for(i=0; i<n-1; i++){
//每一轮比较前 n-1-i 个,也就是说,已经排序好的最后 i 个不用比较
for(j=0; j<n-1-i; j++){
if(stu[j].sumcj > stu[j+1].sumcj){
temp = stu[j];
stu[j] = stu[j+1];
stu[j+1] = temp;
}
}
}
printf("学号\t姓名\t语文\t数学\t英语\t总分\t名次\n");
for(i=0;i<n;i++)
{
printf("%s\t%s\t%d\t%d\t%d\t%d\t%d\n",stu[i].snum,stu[i].sname,stu[i].chinese,stu[i].math,stu[i].english,stu[i].sumcj,stu[i].rank);
}
printf("按任意键返回\n");
getch();
fclose(fp);
return;
}
printf("查询失败,请重试!\n");
getch();
fclose(fp);
return;
}
//5计算排名函数
void jspm(int n)
{
struct score stu[100];
int i,j,temp;
int count;
FILE *fp;
fp=fopen("cj.txt","r");
if(fp==NULL)
{
printf("打开文件失败!\n");
getch();
exit(0);
}
int c = 0;
while(!feof(fp)){
fscanf(fp,"%s %s %d %d %d %d %d\n",&stu[c].snum,&stu[c].sname,&stu[c].chinese,&stu[c].math,&stu[c].english,&stu[c].sumcj,&stu[c].rank);
stu[c].sumcj = stu[c].chinese + stu[c].math + stu[c].english;
c++;
}
fclose(fp);
//计算排名并存储
for(i=0;i<n;i++)
{
temp=1;//第1名
for(j=0;j<n;j++){
if(stu[i].sumcj<stu[j].sumcj) temp++;//如果较小,排名下降1名
}
stu[i].rank=temp;
}
//更新记录
fp=fopen("cj.txt","w");
for(i=0;i<n;i++)
{
fprintf(fp,"%s %s %d %d %d %d %d\n",stu[i].snum,stu[i].sname,stu[i].chinese,stu[i].math,stu[i].english,stu[i].sumcj,stu[i].rank);
}
fclose(fp);
printf("数据重新计算和排名成功,请按任意键返回主菜单。\n");
getch();
return;
}
//6显示成绩信息
void xs(int n)
{
struct score stu[100];
int i;
printf("成绩信息如下:\n");
FILE *fp;
fp=fopen("cj.txt","r");
if(fp==NULL)
{
printf("打开文件失败,请重试!\n");
getch();
fclose(fp);
exit(0);
}
printf("学号\t姓名\t语文\t数学\t英语\t总分\t名次\n");
int c = 0;
while(!feof(fp))
{
fscanf(fp,"%s %s %d %d %d %d %d\n",&stu[c].snum,&stu[c].sname,&stu[c].chinese,&stu[c].math,&stu[c].english,&stu[c].sumcj,&stu[c].rank);
c++;
}
if(n!=0){//人数不为0
for(i=0;i<c;i++)
{
printf("%s\t%s\t%d\t%d\t%d\t%d\t%d\n",stu[i].snum,stu[i].sname,stu[i].chinese,stu[i].math,stu[i].english,stu[i].sumcj,stu[i].rank);
}
}
fclose(fp);
printf("显示完毕 ,请按任意键返回\n");
getch();
return;
}
//0保存信息并退出系统
void bccj()
{
printf("感谢您的使用,欢迎下次使用!\n");
getch();
return;
}
链接:https://pan.baidu.com/s/1NxYJb83VKlTB6igDFNLeTw
提取码:yz24
操作系统:Windows10
开发工具:Dev-C++
PS:限于本人水平,如有不足还请批评、指出。源码?拿走,拿走。
提醒:由于网友反馈,经过自己的调试,发现诸多问题,部分代码不规范,逻辑错误等等,不堪入目,绝不是个良好的程序,但因近期忙于答辩,代码的修改估计在本月月底。在这之前我可能无暇关注博客,对此给大家造成困扰,深感抱歉。——2020.5.18
更新:已对代码进行优化,经过简单调试,没有发现大问题,相信能够满足部分同学的期末作业要求了。源码文件已更新。——2020.5.29
修复BUG:修复删除成绩后,查询成绩信息异常的问题。源码已更新,请重新下载。——2020.6.19
PS:C学得真的是太菜了,请大家多多包涵!!/抱拳/抱拳。。