题目来源:C语言程序设计实验与习题指导(第三版)颜晖 张泳 主编 P129
题目部分摘录:
基本功能:
(1)能够新增学生信息,并计算总分和平均分 (2)能够根据学号修改和删除某学生信息:
(3)能够显示所有学生的成绩信息;(4)能够分别按总分和学号进行排序;
(5)能够根据学号查询该学生的基本信息;(6)学生成绩数据最终保存在文件中,能够对文件读、写学生数据。
(由于在下写完程序才发现居然还要求了计算平均分功能,所以就没在程序里体现出来,聪明的大家自己完成就好了)
另外,考虑到如果要原模原样的按照原题目里一条指令一个功能,那么一开始使用程序就要输入“读取文件“的命令,程序输入完,又要输入“保存文件”的命令,这样过于繁琐。因此,在程序里对于“Write to a File”和“Read from File”的实现无需再输入“W”和“R”了
程序的数据全部保存在了同目录下的名为“123.txt”,文件下,记得先创建。编译环境是devcpp。
以下为源代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
FILE*fp;int base=0;
struct student{
int number;
char name[10];
int english,chinese,math,programme,sum;
}s[10];
//输出菜单供选择
void menu(){
printf("\tManagement for Student's scores\n");
printf("\t1.Append record\n");
printf("\t2.List record\n");
printf("\t3.Delete record\n");
printf("\t4.Modify record\n");
printf("\t5.Search record\n");
printf("\t6.Sort in descending order by sum\n");
printf("\t7.Sort in ascending order by sun\n");
printf("\t8.Sort in descending order by num\n");
printf("\t9.Sort in ascending order by num\n");
printf("\tW.Write to a file\n");
printf("\tR.Read from a File\n");
printf("\tO.Exit\n");
printf("\tPlease input your choice:\n");return;
}
//实现“Read from a File”
void read(){
char garbage[100];
if((fp=fopen("123.txt","r"))==NULL){
printf("Can not open file!\n");
exit(1);
}
fscanf(fp,"%[^\n]\n",garbage);
while(!feof(fp)){
fscanf(fp,"%d%s%d%d%d%d%d\n",
&s[base].number,s[base].name,&s[base].english,&s[base].chinese,&s[base].math,&s[base].programme,&s[base].sum);
base++;
}
fclose(fp);
return;
}
//实现“Write to a File”
void save(){
int i=0;
if((fp=fopen("123.txt","w"))==NULL){
printf("Can not open file\n");
exit(1);
}
fprintf(fp,"学号\t姓名\t英语成绩\t语文成绩\t数学成绩\t编程成绩\t总成绩\n");
for(i=0;i<=base-1;i++)
fprintf(fp,"%d\t%s\t%d\t%d\t%d\t%d\t%d\n",s[i].number,s[i].name,s[i].english,s[i].chinese,s[i].math,s[i].programme,s[i].sum);
fclose(fp);
return;
}
//实现“Append record”
void append(){
int i;
printf("Please input the number:");scanf("%d",&s[base].number);
//确保学号的唯一性
for(i=0;i<base;i++){
if(s[i].number==s[base].number){
printf("This number has occupied!\n");
return;}
}
printf("Please input the name:");scanf("%s",s[base].name);
printf("Please input the English grade:");scanf("%d",&s[base].english);
s[base].sum+=s[base].english;
printf("Please input the Chinese grade:");scanf("%d",&s[base].chinese);
s[base].sum+=s[base].chinese;
printf("Please input the Math grade:");scanf("%d",&s[base].math);
s[base].sum+=s[base].math;
printf("Please input the Programme grade:");scanf("%d",&s[base].programme);
s[base].sum+=s[base].programme;base++;
return;
}
//实现“List record”
void list(){
printf("学号\t姓名\t英语成绩\t语文成绩\t数学成绩\t编程成绩\t总成绩\n");
for(int i=0;i<base;i++)
printf("%d\t%s\t%d\t%d\t%d\t%d\t%d\n",
s[i].number,s[i].name,s[i].english,s[i].chinese,s[i].math,s[i].programme,s[i].sum);
return;
}
//实现“Delete record”
void del(){
int del_number,i,sign=0;
printf("Please input the number that you want to delete:");
scanf("%d",&del_number);
for(i=0;i<=base;i++)
if(s[i].number==del_number){
for(i;i<=base;i++){
s[i].number=s[i+1].number;
strcpy(s[i].name,s[i+1].name);
s[i].english=s[i+1].english;
s[i].chinese=s[i+1].chinese;
s[i].math=s[i+1].math;
s[i].programme=s[i+1].programme;
s[i].sum=s[i+1].sum;}
base--;sign=1;break;
}
if(sign==0)printf("Sorry,there are no this number.\n");
else printf("Have made it!\n");
return;
}
//实现“Modify record”
void modify(){
int modify_number,sign=0,j,i,modify_chose;
printf("Please input the number that you want to modify:");
scanf("%d",&modify_number);
for(i=0;i<=base;i++)
if(s[i].number==modify_number){
printf("\t1.number\t2.name\n");
printf("\t3.English grade\t4.Chinese grade\t5.Math grade\t6.Programme grade\n");
printf("Please chose what you want to modify:");
scanf("%d",&modify_chose);
switch(modify_chose){
case 1:{
printf("Please input the new number:");
scanf("%d",&s[i].number);
for(j=0;j<base;j++){
if(s[i].number==s[j].number)
printf("This number has occupied!\n");
return;}
break;
}
case 2:{
printf("Please input the new name:");
scanf("%s",s[i].name);
break;
}
case 3:{
printf("Please input the new English grade:");
s[i].sum-=s[i].english;
scanf("%d",&s[i].english);
s[i].sum+=s[i].english;
break;
}
case 4:{
printf("Please input the new Chinese grade:");;
s[i].sum-=s[i].chinese;
scanf("%d",&s[i].chinese);
s[i].sum+=s[i].chinese;
break;
}
case 5:{
printf("Please input the new Programme grade:");
s[i].sum-=s[i].programme;
scanf("%d",&s[i].programme);
s[i].sum+=s[i].programme;
break;
}
default:{printf("Please check your input!\n");return;}
}
printf("Have made it!\n");return;
}
if(sign==0)printf("Sorry,there are no this number.\n");
return; }
//实现“Search record”
void search(){
int search_number,i,sign;
printf("Please input the number:");
scanf("%d",&search_number);
for(i=0;i<=base;i++)
if(s[i].number==search_number){
sign=1;
printf("学号:%d,姓名:%s,英语成绩:%d,语文成绩:%d,数学成绩:%d,编程成绩:%d,总分:%d\n",
s[i].number,s[i].name,s[i].english,s[i].chinese,s[i].math,s[i].programme,s[i].sum);
break;}
if(sign==0)printf("Not found this person!\n");
return;
}
//实现“Sort in descending order by sum”
void sort_d_s(){
int i,j,change1;
char change[10];
for(i=0;i<base;i++)
for(j=0;j<base-i-1;j++)
if(s[j].sum<s[j+1].sum){
change1=s[j+1].sum;
s[j+1].sum=s[j].sum;
s[j].sum=change1;
change1=s[j+1].english;
s[j+1].english=s[j].english;
s[j].english=change1;
change1=s[j+1].chinese;
s[j+1].chinese=s[j].chinese;
s[j].chinese=change1;
change1=s[j+1].math;
s[j+1].math=s[j].math;
s[j].math=change1;
change1=s[j+1].programme;
s[j+1].programme=s[j].programme;
s[j].programme=change1;
change1=s[j+1].number;
s[j+1].number=s[j].number;
s[j].number=change1;
strcpy(change,s[j+1].name);
strcpy(s[j+1].name,s[j].name);
strcpy(s[j].name,change);
}
return;
}
void sort_a_s (){
int i,j,change1;
char change[10];
for(i=0;i<base;i++)
for(j=0;j<base-i-1;j++)
if(s[j].sum>s[j+1].sum){
change1=s[j+1].sum;
s[j+1].sum=s[j].sum;
s[j].sum=change1;
change1=s[j+1].english;
s[j+1].english=s[j].english;
s[j].english=change1;
change1=s[j+1].chinese;
s[j+1].chinese=s[j].chinese;
s[j].chinese=change1;
change1=s[j+1].math;
s[j+1].math=s[j].math;
s[j].math=change1;
change1=s[j+1].programme;
s[j+1].programme=s[j].programme;
s[j].programme=change1;
change1=s[j+1].number;
s[j+1].number=s[j].number;
s[j].number=change1;
strcpy(change,s[j+1].name);
strcpy(s[j+1].name,s[j].name);
strcpy(s[j].name,change);
}
return;
}
void sort_d_n(){
int i,j,change1;
char change[10];
for(i=0;i<base;i++)
for(j=0;j<base-i-1;j++)
if(s[j].number>s[j+1].number){
change1=s[j+1].sum;
s[j+1].sum=s[j].sum;
s[j].sum=change1;
change1=s[j+1].english;
s[j+1].english=s[j].english;
s[j].english=change1;
change1=s[j+1].chinese;
s[j+1].chinese=s[j].chinese;
s[j].chinese=change1;
change1=s[j+1].math;
s[j+1].math=s[j].math;
s[j].math=change1;
change1=s[j+1].programme;
s[j+1].programme=s[j].programme;
s[j].programme=change1;
change1=s[j+1].number;
s[j+1].number=s[j].number;
s[j].number=change1;
strcpy(change,s[j+1].name);
strcpy(s[j+1].name,s[j].name);
strcpy(s[j].name,change);
}
return;
}
void sort_a_n(){
int i,j,change1;
char change[10];
for(i=0;i<base;i++)
for(j=0;j<base-i-1;j++)
if(s[j].number<s[j+1].number){
change1=s[j+1].sum;
s[j+1].sum=s[j].sum;
s[j].sum=change1;
change1=s[j+1].english;
s[j+1].english=s[j].english;
s[j].english=change1;
change1=s[j+1].chinese;
s[j+1].chinese=s[j].chinese;
s[j].chinese=change1;
change1=s[j+1].math;
s[j+1].math=s[j].math;
s[j].math=change1;
change1=s[j+1].programme;
s[j+1].programme=s[j].programme;
s[j].programme=change1;
change1=s[j+1].number;
s[j+1].number=s[j].number;
s[j].number=change1;
strcpy(change,s[j+1].name);
strcpy(s[j+1].name,s[j].name);
strcpy(s[j].name,change);
}
return;
}
int main(){
char choice_char;
int choice;
read();
while(1){
menu();
scanf("%d",&choice);
switch(choice)
{
case 1:append();break;
case 2:list();break;
case 3:del();break;
case 4:modify();break;
case 5:search();break;
case 6:sort_d_s();break;
case 7:sort_a_s();break;
case 8:sort_d_n();break;
case 9:sort_a_n();break;
// case'W':{save();getchar();break;}
// case'R':{read();getchar();break;}
case 0:{save();exit(1);}break;
default:printf("输入了无效指令,请检查!\n");break;
} }
return 0;
}