1. 程式人生 > >C語言 學生成績管理系統

C語言 學生成績管理系統

功能: 輸入若干個學生資訊(比如:學號,姓名及三門課成績),能實現 學生資訊的錄入、查詢、插入、排序等功能。 要求: 用資料檔案儲存學生資訊。利用選單可以迴圈完成各個操作。 進一步要求: 能夠實現對成績的修改更好。 (檔案函式 、結構陣列,排序等)

輸入學生資料存放在“stu.dat”檔案中,不能輸入重複的學號,否則將會判斷重複,要求重新輸入,但第二次必須輸入正確,會直接錄入檔案“stu.dat”,排序之後的資料存放在“stu.sort”中,修改可按照學號和姓名修改,若有姓名重複的同學,自動修改學號的學生資訊。修改是全部讀出再錄入,而不是覆蓋寫入,覆蓋寫入還沒有學會。程式碼還有問題,就不公佈了

# include <stdio.h>
# include<stdlib.h>
# include<string.h>
# define N 100
# define Swap    {k=s[i];s[i]=s[min];s[min]=k;}


typedef struct student
{
  char num[20];
  char name[20];
  float score1;
  float score2;
  float score3;
  float aver;
  float sum; 
}stu;

int main()
{

    void input();
    void search();
    void output();
    void insert();
    void sort
(); void swap(); void update(); int n; while(1) { printf(" ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n"); 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("\n"); printf(" 執行操作:"); scanf("%d",&n); switch(n) { case 1: input();break; case 2: search();break; case 3: output();break; case 4: insert();break; case 5: sort();break; case 6:update();break; case 0: exit(0);break; default: printf("\n 輸入錯誤\n\n");break; } } } /* // 用資料檔案儲存學生成績資訊(不能判斷學號是否重複 void input() { stu s[N]; int i,n; printf("輸入學生個數:\n"); scanf("%d",&n); FILE *fp; fp=fopen("stu.dat","a+"); //要考慮覆蓋問題 if (fp==NULL) { printf("Can't open the file %s.\n","stu.date"); exit(0); } printf("輸入學生資訊:\n"); printf("學號姓名 英語 數學 C語言\n"); for(i=0;i<n;i++) { scanf("%s%s%f%f%f",s[i].num,s[i].name,&s[i].score1,&s[i].score2, &s[i].score3); } //fprintf(fp," 學號 名字 英語 數學 C語言 平均分 總分\n"); for (i=0;i<n;i++) { s[i].sum=s[i].score1+s[i].score2+s[i].score3; s[i].aver=(s[i].sum)/3; fprintf(fp,"%10ld %10s %8.2f %8.2f %8.2f%8.2f %8.2f\n",s[i].num,s[i].name, s[i].score1,s[i].score2, s[i].score3,s[i].aver, s[i].sum); } fclose(fp); }*/ // 用資料檔案儲存學生成績資訊 void input() { stu s[N],a[N],t,w[N]; //a[N]為檔案中的,s[N]為輸入的學生資訊 int i,n,j,k=0,flag=0; printf("輸入學生個數:\n"); scanf("%d",&n); FILE *fp; fp=fopen("stu.dat","r"); if (fp==NULL) { fclose(fp); fp=fopen("stu.dat","a+"); //要考慮覆蓋問題 if (fp==NULL) { printf("Can't open the file %s.\n","stu.date"); exit(0); } printf("輸入學生資訊:\n"); printf("學號姓名 英語 數學 C語言\n"); scanf("%s%s%f%f%f",s[0].num,s[0].name,&s[0].score1,&s[0].score2, &s[0].score3); s[0].sum=s[0].score1+s[0].score2+s[0].score3; s[0].aver=(s[0].sum)/3; fprintf(fp,"%10s %10s %8.2f %8.2f %8.2f%8.2f %8.2f\n",s[0].num,s[0].name, s[0].score1,s[0].score2, s[0].score3,s[0].aver, s[0].sum); //寫入第一個學生資料 fclose(fp); i=1; while(i<n) { flag=0; fp=fopen("stu.dat","r"); if (fp==NULL) { printf("Can't open the file %s.\n","stu.date"); exit(0); } scanf("%s%s%f%f%f",s[i].num,s[i].name,&s[i].score1,&s[i].score2, &s[i].score3); s[i].sum=s[i].score1+s[i].score2+s[i].score3; s[i].aver=(s[i].sum)/3; for(j=0;j<N;j++) //判斷是否重複(必須保證第二次輸入正確的學號) { fscanf(fp,"%s%s%f%f%f%f%f\n",a[i].num,a[i].name,&a[i].score1, &a[i].score2,&a[i].score3, &a[i].aver,&a[i].sum); if(strcmp(a[i].num,s[i].num)==0) { printf("該學號已經存在,請重新輸入(請確認第二次輸入的學號不重複)\n"); scanf("%s%s%f%f%f",w[k].num,w[k].name,&w[k].score1,&w[k].score2, &w[k].score3); w[k].sum=w[k].score1+w[k].score2+w[k].score3; w[k].aver=(w[k].sum)/3; t=w[k];w[k]=s[i];s[i]=t; //正確地學號等資訊,替換錯的 fclose(fp); fp=fopen("stu.dat","a+"); fprintf(fp,"%10s %10s %8.2f %8.2f %8.2f%8.2f %8.2f\n",s[i].num,s[i].name, s[i].score1,s[i].score2, s[i].score3,s[i].aver, s[i].sum); fclose(fp); k++;flag=1; //有重複的學號 i++; break; } } if(!flag) { fclose(fp); fp=fopen("stu.dat","a+"); fprintf(fp,"%10ld %10s %8.2f %8.2f %8.2f%8.2f %8.2f\n",s[i].num,s[i].name, s[i].score1,s[i].score2, s[i].score3,s[i].aver, s[i].sum); i++; } } } else //能正常開啟文件 { fclose(fp); for(i=0;i<n;i++) { fp=fopen("stu.dat","r"); flag=0; printf("輸入學生資訊:\n"); printf("學號姓名 英語 數學 C語言\n"); scanf("%s%s%f%f%f",s[i].num,s[i].name,&s[i].score1,&s[i].score2, &s[i].score3); s[i].sum=s[i].score1+s[i].score2+s[i].score3; s[i].aver=(s[i].sum)/3; flag=0; for(j=0;j<N;j++) //判斷是否重複(必須保證第二次輸入正確的學號) { fscanf(fp,"%s%s%f%f%f%f%f\n",a[i].num,a[i].name,&a[i].score1, &a[i].score2,&a[i].score3, &a[i].aver,&a[i].sum); if(strcmp(a[i].num,s[i].num)==0) { printf("該學號已經存在,請重新輸入\n"); scanf("%s%s%f%f%f",w[k].num,w[k].name,&w[k].score1,&w[k].score2, &w[k].score3); w[k].sum=w[k].score1+w[k].score2+w[k].score3; w[k].aver=(w[k].sum)/3; t=w[k];w[k]=s[i];s[i]=t; //正確地學號等資訊,替換錯的 fclose(fp); fp=fopen("stu.dat","a+"); fprintf(fp,"%10s %10s %8.2f %8.2f %8.2f%8.2f %8.2f\n",s[i].num,s[i].name, s[i].score1,s[i].score2, s[i].score3,s[i].aver, s[i].sum); fclose(fp); k++;flag=1; i++; break; } } if(!flag) { fclose(fp); fp=fopen("stu.dat","a+"); /* if (fp==NULL) {printf("Can't open the file %s.\n","stu.date");exit(0);}*/ fprintf(fp,"%10s %10s %8.2f %8.2f %8.2f%8.2f %8.2f\n",s[i].num,s[i].name, s[i].score1,s[i].score2, s[i].score3,s[i].aver, s[i].sum); fclose(fp); } } } return; } //按學號查詢 void search() { // 補充按姓名(相同名字的)查詢 FILE *fp; stu s[N]; char ch[20]; float m; int i,flag=0,t,n; fp=fopen("stu.dat","r"); if(fp==NULL) { printf("the file open error\n"); exit(0); } while(1) { printf(" ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n"); printf(" ◆◆◆◆◆◆◆學生成績管理系統◆◆◆◆◆◆◆◆◆◆\n"); printf(" ◆ ◆\n"); printf(" ◆ 排序選單 ◆\n"); printf(" ◆ 選項1:按學號查詢 ◆\n"); printf(" ◆ 選項2:姓名查詢 ◆\n"); printf(" ◆ 選項0:退出 ◆\n"); printf(" ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n"); printf("\n 執行操作:"); scanf("%d",&t); for(i=0;i<N;i++) { fscanf(fp,"%s%s%f%f%f%f%f\n",s[i].num,s[i].name,&s[i].score1, &s[i].score2,&s[i].score3, &s[i].aver,&s[i].sum); } n=i; switch(t) { case 1:printf("輸入想要查詢的學號:"); scanf("%s",&ch); for(i=0;i<n;i++) { if(strcmp(ch,s[i].num)==0) { printf("%10s %10s %8.2f %8.2f %8.2f %8.2f %8.2f\n",s[i].num,s[i].name, s[i].score1,s[i].score2, s[i].score3,s[i].aver, s[i].sum); flag=1; break; } } break; case 2:printf("輸入想要查詢的姓名:"); scanf("%s",ch); for(i=0;i<n;i++) { if(strcmp(ch,s[i].name)==0) { printf("%10s %10s %8.2f %8.2f %8.2f %8.2f %8.2f\n",s[i].num,s[i].name, s[i].score1,s[i].score2, s[i].score3,s[i].aver, s[i].sum); flag=1; } } break; case 0:break; default:printf("\n\n輸入錯誤\n\n"); return; } if(!flag) { printf(" 查無此人\n"); break; } return; } fclose(fp); } //輸出 void output() { stu s[N]; FILE *fp; int i=0; fp=fopen("stu.dat","r"); if(fp==NULL) { printf("can not open this file\n"); exit(0); } printf("\n學生資訊:\n"); printf("次序 學號 姓名 英語 數學 C語言 平均分 總分\n"); while(!feof(fp)) { fscanf(fp,"%s%s%f%f%f%f%f\n",s[i].num,s[i].name,&s[i].score1,&s[i].score2, &s[i].score3,&s[i].aver,&s[i].sum); printf("%3d %10s %10s %8.2f %8.2f %8.2f %8.2f %8.2f\n",i+1,s[i].num,s[i].name, s[i].score1,s[i].score2, s[i].score3,s[i].aver, s[i].sum); i++; } fclose(fp); } void sort() //任意排序 { stu s[N],k; FILE *fp1,*fp2; int i=0,j,min,count=0,n; fp1=fopen("stu.dat","r"); fp2=fopen("stu.sort","w"); if(fp1==NULL) { printf("the file can not open.\n"); exit(0); } if(fp2==NULL) { printf("the file write error\n"); exit(0); } while(!feof(fp1)) { fscanf(fp1,"%s%s%f%f%f%f%f\n",s[i].num,s[i].name,&s[i].score1, &s[i].score2,&s[i].score3, &s[i].aver,&s[i].sum); i++; } count=i; //總人數 fclose(fp1); printf("\n"); while(1) { printf(" ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n"); printf(" ◆◆◆◆◆◆◆學生成績管理系統◆◆◆◆◆◆◆◆◆◆\n"); printf(" ◆ ◆\n"); printf(" ◆ 排序選單 ◆\n"); printf(" ◆ 選項1:按學號排序 ◆\n"); printf(" ◆ 選項2:姓名的音序排序 ◆\n"); printf(" ◆ 選項3:按score1(英語成績)排序 ◆\n"); printf(" ◆ 選項4:按score2(數學成績)排序 ◆\n"); printf(" ◆ 選項5:按score3(C語言)排序 ◆\n"); printf(" ◆ 選項6:按總分或者平均分排序 ◆\n"); printf(" ◆ 選項0:退出 ◆\n"); printf(" ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n"); printf("\n 執行操作:"); scanf("%d",&n); printf("\n"); for(i=0;i<count;i++) { min=i; switch(n) { case 1: for(j=i+1;j<count;j++) //按學號排序 if(strcmp(s[j].num,s[min].num)<0) min=j; if(min!=i) Swap; break; case 2: for(j=i+1;j<count;j++) if(strcmp(s[j].name,s[min].name)<0) min=j; if(min!=i) Swap; break; case 3: for(j=i+1;j<count;j++) if(s[j].score1<s[min].score1) min=j; if(min!=i) Swap; break; case 4: for(j=i+1;j<count;j++) if(s[j].score2<s[min].score2) min=j; if(min!=i) Swap; break; case 5: for(j=i+1;j<count;j++) if(s[j].score3<s[min].score3) min=j; if(min!=i) Swap; break; case 6: for(j=i+1;j<count;j++) if(s[j].sum<s[min].sum) min=j; if(min!=i) Swap; break; case 0:break; default:printf(" 輸入錯誤\n");return; } } printf("名次 學號 姓名 英語 數學 C語言 平均分 總分\n"); for(i=0;i<count;i++) { printf("%d %10s %10s %8.2f %8.2f %8.2f %8.2f %8.2f\n",i+1,s[i].num,s[i].name, s[i].score1,s[i].score2,s[i].score3, s[i].aver,s[i].sum); fprintf(fp2,"%10s %10s %8.2f %8.2f %8.2f %8.2f %8.2f\n",s[i].num,s[i].name, s[i].score1,s[i].score2,s[i].score3, s[i].aver,s[i].sum); } printf("\n"); fclose(fp2); return; } } //插入學生 void insert() { printf("插入後請選擇排序方式\n"); printf("\n輸入需要插入的學生人數\n"); input(); sort(); } // 修改按學號 //要求補充按姓名 void update() { FILE *fp; stu temp,s[N]; int i=0,count,n,flag=0,k=0; fp=fopen("stu.sort","r"); if(fp==NULL) { printf("the file can not open\n"); exit(0); } while(!feof(fp)) { fscanf(fp,"%s%s%f%f%f%f%f\n",s[i].num,s[i].name,&s[i].score1, &s[i].score2,&s[i].score3, &s[i].aver,&s[i].sum); i++; } fclose(fp); fp=fopen("stu.sort","w"); count=i; while(1) { printf(" ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n"); printf(" ◆◆◆◆◆◆◆學生成績管理系統◆◆◆◆◆◆◆◆◆◆\n"); printf(" ◆ ◆\n"); printf(" ◆ 排序選單 ◆\n"); printf(" ◆ 選項1:按學號修改 ◆\n"); printf(" ◆ 選項2:姓名修改 ◆\n"); printf(" ◆ 選項0:退出 ◆\n"); printf(" ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n"); printf("提示:按姓名查詢時若有同名,自動修改學號相同的同學\n\n"); printf("\n 執行操作:"); scanf("%d",&n); printf(" 輸入需要修改學生資訊:\n"); printf("學號姓名英語數學C語言\n"); scanf("%s%s%f%f%f",&temp.num,temp.name,&temp.score1,&temp.score2,&temp.score3); temp.sum=temp.score1+temp.score2+temp.score3; temp.aver=temp.sum/3; switch(n) { case 1: for(i=0;i<count;) { if(strcmp(s[i].num,temp.num)==0) { s[i]=temp;flag=1; break; } else i++; } break; case 2:for(i=0;i<count;i++) { if(strcmp(s[i].name,temp.name)==0) { s[i]=temp;flag=1;k++; } } if(k!=1) { printf("有姓名相同的同學,自動修改學號相同的同學的資訊\n\n") for(i=0;i<count;i++) { if(strcmp(s[i].name,temp.name)==0) { s[i]=temp;flag=1; } } } break; case 0:break; default:printf("\n 選擇錯誤\n");return; } if(!flag) { printf(" 查詢無果\n"); break; } for(i=0;i<count;i++) { printf("%10s %10s %8.2f %8.2f %8.2f %8.2f %8.2f\n",s[i].num,s[i].name, s[i].score1,s[i].score2, s[i].score3,s[i].aver, s[i].sum); fprintf(fp,"%10s %10s %8.2f %8.2f %8.2f %8.2f %8.2f\n",s[i].num,s[i].name, s[i].score1,s[i].score2, s[i].score3,s[i].aver, s[i].sum); } printf("\n 修改成功\n"); fclose(fp); return; } }