1. 程式人生 > 其它 >資料結構課設------學生管理系統

資料結構課設------學生管理系統

技術標籤:筆記

學生成績管理系統

現有學生成績資訊檔案1(1.txt),內容如下
姓名 學號 語文 數學 英語
張明明 01 67 78 82
李成友 02 78 91 88
張輝燦 03 68 82 56
王露 04 56 45 77
陳東明 05 67 38 47
…. … … … …
學生成績資訊檔案2(2.txt),內容如下:
姓名 學號 語文 數學 英語
陳果 31 57 68 82
李華明 32 88 90 68
張明東 33 48 42 56
李明國 34 50 45 87
陳道亮 35 47 58 77
…. … … … …
試編寫一管理系統,要求如下:

  1. 實現對兩個檔案資料進行合併,生成新檔案3.txt
  2. 抽取出三科成績中有補考的學生並儲存在一個新檔案4.txt
  3. 對合並後的檔案3.txt中的資料按總分降序排序(至少採用兩種排序方法實現)
  4. 輸入一個學生姓名後,能查詢到此學生的資訊並輸出結果(至少採用兩種查詢方法實現)
  5. 要求至少使用結構體實現上述要求,若增加其他實現方式更好.
  6. 採用多種方法且演算法正確者,可適當加分.

程式碼

#include <stdio.h>
#include <string.h>

typedef struct
{
	char id[10];
	char name[20];
	char score[10];
}student;

#define N 1024

void
menu(int *n) { printf("\t\t\t*********************************************\n"); printf("\t\t\t\t\t1.查詢學生資訊\n"); printf("\t\t\t\t\t2.按成績進行排序\n"); printf("\t\t\t\t\t3.合併資訊表\n"); printf("\t\t\t\t\t4.建立補考資訊表\n"); printf("\t\t\t\t\t0.退出\n"
); printf("\t\t\t*********************************************\n"); printf("請輸入運算元0-4:"); scanf("%d", n); }//建立選單 void Printfstudent(student p[N], int len) { int i; printf("學號\t\t姓名\t\t分數\n\n"); for (i = 0; i < len; i++) { printf("%s\t\t", p[i].id); printf("%c%c%c%c%c%c%c%c%c\t\t", p[i].name[0],p[i].name[1],p[i].name[2],p[i].name[3],p[i].name[4],p[i].name[5],p[i].name[6],p[i].name[7],p[i].name[8]); printf("%s\t\\t\n", p[i].score); } } int visit(student p[N],int len,int i) { int k=0; while(p[i].score[k] !='\0') k++; return k; } void Sort(student p[N], int len) { student st; int i,j,a,b; for(i=0;i<len-1;i++) { for(j=0;j<len-1-i;j++) { if(strcmp(p[j].score,p[j+1].score) < 0) { st = p[j]; p[j] = p[j+1]; p[j+1] = st; } a=visit(p,len,j); b=visit(p,len,j+1); if(a<b) { st = p[j]; p[j] = p[j+1]; p[j+1] = st; } } } Printfstudent(p, len); } void serch(student p[N], int len) { int i, j; int flat = 0; char num[100]; char name1[100]; printf("請輸入1或2,1按學號查詢,2按姓名查詢:"); scanf("%d", &i); if (i == 1) { printf("請輸入要查詢的學號:"); scanf(" %s", num); for (j = 0; j <len; j++) { if (strcmp(p[j].id, num) == 0) { flat++; break; } } if ( flat==0 ) { printf("學號出現錯誤!\n"); } else { printf("學號: %s,姓名: %c%c%c%c%c%c%c%c%c,得分: %s\n", p[j].id, p[j].name[0],p[j].name[1],p[j].name[2],p[j].name[3],p[j].name[4],p[j].name[5],p[j].name[6],p[j].name[7],p[j].name[8], p[j].score); } } else if (i == 2) { flat = 0; printf("請輸入要查詢的姓名:"); scanf(" %s", name1); for (j = 0; j <len; j++) { if (strcmp(p[j].name, name1) == 0) { flat++; printf("學號: %s,姓名: %c%c%c%c%c%c%c%c%c,得分: %s\n", p[j].id, p[j].name[0],p[j].name[1],p[j].name[2],p[j].name[3],p[j].name[4],p[j].name[5],p[j].name[6],p[j].name[7],p[j].name[8], p[j].score); break; } } if (!flat) { printf("姓名輸入有誤!\n"); } } } //檔案1.txt的讀入 int dos1(student p[N],int len) { int i,k; char a[200]; FILE *fp = fopen("1.txt", "r+"); if (fp == NULL) return 1; fgets(a,200,fp); fclose(fp); i=0; len=0; k=0; while (a[i] != '#') { while (a[i] != ',') { p[len].id[k]=a[i]; i++;k++; } i++; k=0; while (a[i] != ',') { p[len].name[k]=a[i]; i++; k++; } i++; k=0; while (a[i] != '&') { p[len].score[k]=a[i]; i++; k++; } i++; k=0; len++; } return len; } //檔案2.txt的讀入 int dos2(student p[N],int len) { int i,k; char b[200]; FILE *fp = fopen("2.txt", "r+"); if (fp == NULL) return 1; fgets(b,200,fp); fclose(fp); i=0; k=0; while ( b[i]!='#') { while (b[i] != ',') { p[len].id[k]=b[i]; i++;k++; } i++; k=0; while (b[i] != ',') { p[len].name[k]=b[i]; i++; k++; } i++; k=0; while (b[i] != '&') { p[len].score[k]=b[i]; i++; k++; } i++; k=0; len++; } return len; } //合併到檔案3.txt void dos3(student p[N],int len) { FILE *fp; int i; fp=fopen("3.txt","w+"); for(i=0;i<len;i++) { fprintf(fp,"%s,%c%c%c%c%c%c%c%c%c,%s &",p[i].id,p[i].name[0],p[i].name[1],p[i].name[2],p[i].name[3],p[i].name[4],p[i].name[5],p[i].name[6],p[i].name[7],p[i].name[8],p[i].score); } fclose(fp); } //將補考的人的名單輸出到檔案4.txt void dos4(student p[N],int len) { FILE *fp; int i=0,a; char b[2]="60"; fp=fopen("4.txt","w+"); while(i<len) { a=visit(p,len,i); if(a==3) i++; else if(strcmp(p[i].score,b) > 0) i++; else if(strcmp(p[i].score,b) < 0) { fprintf(fp," %s,%c%c%c%c%c%c%c%c%c,%s &",p[i].id,p[i].name[0],p[i].name[1],p[i].name[2],p[i].name[3],p[i].name[4],p[i].name[5],p[i].name[6],p[i].name[7],p[i].name[8],p[i].score); i++; } } fclose(fp); } void main() { int n,len; student p[N]={0}; len=dos1(p,len); len=dos2(p,len); while (1) { menu(&n); switch (n) { case 1:serch(p,len); break; case 2:Sort(p,len); break; case 3:dos3(p,len); printf("合併完成\n"); break; case 4:dos4(p,len); printf("建立完成\n"); break; case 0:printf("歡迎再次使用.\n"); break; default: printf("您的輸入有誤,請重新輸入.\n"); break; } } }