📄 051150008.cpp
字号:
#include<dos.h> /*dos接口函数*/
#include<stdio.h> /*I/O函数*/
#include<string.h> /*字符串函数*/
#define N 66 /*控制学生记录的容量*/
struct student /*定义结构体数组用于缓存数据*/
{char num[11]; /*学号*/
char name[20]; /*姓名*/
int score[3]; /*成绩分数*/
float ave;
}stu[N];
/*全新保存函数*/
save(int n) /*保存函数,保存n个记录*/
{FILE *fp;
int i;
if((fp=fopen("score.txt","wb"))==NULL) /*以输出打开方式,在此前的记录被覆盖*/
{printf("\nCannot open file\n");
return NULL;
}
for(i=0;i<n;i++)
if(stu[i].ave!=0) /*stu[i].ave=0表此记录已删除*/
if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
printf("file write error\n");
fclose(fp);
}
/*加载记录或可以计算记录个数的函数*/
load() /*加载记录或可以计算记录个数的函数*/
{FILE *fp;
int i;
if((fp=fopen("score.txt","rb"))==NULL) /*以输出打开方式,在此前的记录被覆盖*/
{printf("\nCannot open file\n");
return NULL;
}
for(i=0;!feof(fp);i++)
fread(&stu[i],sizeof(struct student),1,fp);
fclose(fp);
return(i-1); /*返回记录个数*/
}
/*一个任务结束时的选择浏览还是返回的函数*/
void printf_back() /*一个任务结束时的选择浏览还是返回*/
{int k,w;
printf("\n\n\tSuccessful. ^_^\n\n");
printf("What do you want to do? \n\n\t1).Browse all now\t2).Back: [ ]\b\b");
scanf("%d",&w);
if(w==1) browse();
else menu();
}
/*显示数据结构项目函数*/
void printf_face() /*显示数据结构项目*/
{printf("\n\tNO. name score1 score2 score3 average\n");
}
average(int i) /*对第i个记录的分数求平均值*/
{int j,sum;
for(sum=0,j=0;j<3;j++)
sum+=stu[i].score[j];
stu[i].ave=sum/3.0;
}
/*学号输入函数*/
no_input(int i,int n) /*i表示第i个的学生信息,n表示比较到第n个学生*/
{int j,k,w1;
do
{w1=0;
printf("NO.:");
scanf("%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("Input error! Only be made up of (0-9).Please reinput!\n");
w1=1;break;
}
if(w1!=1)
for(k=0;k<n;k++) /*比较到第n个学生*/
/*排除第i个学生记录即你要修改的*/
if(k!=i&&strcmp(stu[k].num,stu[i].num)==0) /*判断学号是否有雷同*/
{puts("This record is exist. please reinput!\n");
w1=1;break;
}
}
while(w1==1);
}
/*对分数输入*/
score_input(int i)
{int j;
for(j=0;j<3;j++)
{printf("score %d:",j+1);
scanf("%d",&stu[i].score[j]);
}
}
/*输入一个记录函数*/
input(int i) /*输入一个记录函数*/
{
no_input(i,i); /*调用学号输入函数*/
printf("name:");
scanf("%s",stu[i].name);
score_input(i); /*调用分数输入函数*/
average(i); /*调用求平均值函数*/
}
/*显示一个记录的函数*/
printf_one(int i) /*显示一个记录的函数*/
{int j;
printf("%11s %-17s",stu[i].num,stu[i].name);
for(j=0;j<3;j++)
printf("%9d",stu[i].score[j]);
printf("%9.2f\n",stu[i].ave);
}
void puts___() /*显出---函数*/
{puts("\n--------------------------------------------------------------------");
}
/*修改记录函数*/
modify_data(int i,int n) /*修改数据函数,修改第i个记录*/
{int c,w1;
do /*输入选择作个判断*/
{puts("\nmodify by =>\n\n 1).NO. 2).name 3).score1 4).score2\n 5).score3 6).all score 7).all data 8).cancel and back");
printf("Which you needed?: [ ]\b\b");
scanf("%d",&c);
if(c>8||c<1)
{puts("\nChoice error! Please again!"); /*判断选择是否错误,若是则重新选择性*/
getchar(); /*当输入是字符时可以防止死循环*/
}
}
while(c>8||c<1);
do
{switch(c) /*选择要修改的项目*/
{case 1:no_input(i,n);break; /*调用学号输入函数*/
case 2:printf("name:");scanf("%s",stu[i].name);break;
case 3:printf("score1:");scanf("%d",&stu[i].score[0]);break;
case 4:printf("score2:");scanf("%d",&stu[i].score[1]);break;
case 5:printf("score3:");scanf("%d",&stu[i].score[2]);break;
case 6:score_input(i);break; /*调用分数输入函数*/
case 7:input(i);break; /*调用输入整条学生记录*/
case 8:menu(); /*直接返回主介面*/
}
if(c>2&&c<7)
average(i); /*调用求平均值函数*/
puts("\nNow:\n");
printf_face(); /*调用显示数据结构项目函数*/
printf_one(i); /*修改后的记录让用户确认*/
printf("\nAre you sure?\n\n\t1).Sure 2).No and remodify 3).Back without save in this time [ ]\b\b"); /*是否确定*/
scanf("%d",&w1); /*选择2则表示这次修改错误要重新修改*/
}
while(w1==2);
return(w1); /*返回控制值*/
}
/****************输入模块****************/
enter() /*输入模块*/
{int i,n;
printf("How many students(0-%d)?:",N);
scanf("%d",&n); /*要输入的记录个数*/
printf("\nEnter data now\n\n");
for(i=0;i<n;i++)
{printf("\nInput %dth student record.\n",i+1);
input(i); /*调用输入函数*/
}
if(i!=0) save(n); /*调用保存函数*/
printf_back(); /*一个任务结束时让用户选择是浏览还是返回*/
}
/****************追加模块****************/
add() /*追加模块*/
{int i,n,m,k;
FILE *fp;
n=load();
printf("How many students are you want to add(0-%d)?:",N-n);
scanf("%d",&m); /*输入要追加的记录个数*/
k=m+n;
for(i=n;i<k;i++)
{printf("\nInput %dth student record.\n",i-n+1);
input(i); /*调用输入函数*/
}
if((fp=fopen("score.txt","ab"))==NULL) /*以ab方式打开文件,追加保存*/
{printf("cannot open file\n");
return;
}
for(i=n;i<k;i++) /*输入出到文件*/
if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
printf("file write error\n");
fclose(fp);
printf_back(); /*一个任务结束时的选择浏览还是返回*/
}
/****************修改模块****************/
modify() /*修改模块*/
{struct student s;
FILE *fp;
int i,n,k,w0=1,w1,w2=0;
n=load();
do
{clrscr();
k=-1;
/*给用户看全部记录以便确认要修改的记录*/
puts___(); /*显示-----*/
printf_face(); /*调用显示数据结构项目函数*/
for(i=0;i<n;i++)
{if((i!=0)&&(i%10==0)) /*目的是分屏显示*/
{printf("\n\nRemember NO.which needed modify. pass any key to contiune . . .");
getch();
puts("\n\n");
}
printf_one(i); /*调用显示一个记录的函数*/
}
puts___();
do
{printf("\n\nEnter NO. that you want to modify! NO.:");
scanf("%s",s.num); /*输入要修改的数据的学号*/
for(i=0;i<n;i++) /*查找要修改的数据*/
if(strcmp(s.num,stu[i].num)==0)
{k=i; /*找到要修改的记录*/
s=stu[i]; /*把stu[i](即当次修改的学生记录)备份给s,以便用户反悔时恢复名誉*/
}
if(k==-1) printf("\n\nNO exist! please again");
}
while(k==-1); /*当K=-1表示没有找到*/
printf_face(); /*调用显示数据结构项目函数*/
printf_one(k); /*调用显示一个记录的函数*/
w1=modify_data(k,n); /*修改学生记录并且返回保存控制值w1,w1=1则表示用户已确认修改*/
if(w1==1) /*W1等于1时则表示用户确定这次修改*/
{printf("\nSuccessful ^_^.\n\nAre you modify another?\n\n\t1).Yes 2).Back with save\t[ ]\b\b");
scanf("%d",&w0);
w2=1; /*来控制保存,使w2=1是标记已有过修改*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -