?? stu_sys.c
字號:
#include<string.h>
#include<stdio.h>
/*控制學生記錄的容量*/
#define N 50
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
{
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");
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -