學生資訊管理系統(c語言)
阿新 • • 發佈:2019-02-09
#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <string.h> #define LEN sizeof(STD) typedef struct student { char xh[12]; /*學號*/ char xm[12]; /*姓名*/ float sxcj; /*數學成績*/ float cxsj; /*程式設計成績*/ float zf; /*總分*/ struct student *next; /*指向下條記錄*/ }STD; int NUM = 0; /* 定義全域性變數,統計學生人數 */ STD *head = NULL; void mainmenu(); /* 主選單 */ void record(); /* 寫入學生資訊 */ void insert( struct student *p ); /* 插入學生資訊 */ void print( struct student *p ); /* 列印資訊 */ void display(); /* 檢視所有學生資訊 */ void query(); /* 建立查詢 */ void query_by_num(); /*按學號查詢 */ void query_by_name(); /*按姓名查詢 */ void query_by_sxcj(); /*按數學成績查詢 */ void query_by_cxsj(); /*按程式設計成績查詢 */ void query_by_zf(); /*按總分查詢 */ void readData(); /* 讀取資料 */ void writeData(); /* 寫入資料 */ void freeAll(); /* 釋放結點 */ void del(); /*刪除學生資訊 */ void change(); /* 修改學生資訊 */ void devise( struct student *p ); void main() { mainmenu(); } /* 主選單 */ void mainmenu() { int choice; readData(); do { printf( "\t\t\t +--------------------+\n" ); printf( "\t\t\t | 學生資訊管理系統 |\n" ); printf( "\t\t\t | [1]--建立學生資訊 |\n" ); printf( "\t\t\t | [2]--瀏覽學生資訊 |\n" ); printf( "\t\t\t | [3]--查詢學生資訊 |\n" ); printf( "\t\t\t | [4]--刪除學生資訊 |\n" ); printf( "\t\t\t | [5]--修改學生資訊 |\n" ); printf( "\t\t\t | [6]--退出系統 |\n" ); printf( "\t\t\t +--------------------+\n" ); printf( "請輸入操作選項:" ); scanf( "%d", &choice ); switch ( choice ) { case 1: record(); /* 讀入學生資訊 */ break; case 2: display(); /* 檢視學生資訊 */ break; case 3: query(); /* 查詢學生資訊 */ break; case 4: del(); /*刪除學生資訊 */ break; case 5: change(); /* 修改學生資訊 */ break; default: printf( "無效選項!\n" ); break; case 6: writeData(); /* 把學生資訊寫入檔案中 */ freeAll(); /* 釋放所有結點 */ exit( 0 ); /* 退出 */ } } while ( choice != 6 ); } /* 錄入學生資訊,每次只錄入一個學生資訊 */ void record() { struct student *p0; p0 = (STD *) malloc( LEN ); printf( "請輸入學生的學號:" ); scanf( "%s", &p0->xh ); printf( "請輸入學生的姓名:" ); scanf( "%s", p0->xm ); printf( "請輸入學生的數學成績:" ); scanf( "%f", &p0->sxcj ); printf( "請輸入學生的程式設計成績:" ); scanf( "%f", &p0->cxsj ); p0->zf = p0->sxcj + p0->cxsj; insert( p0 ); /* 每次錄入一個學生資訊後將其插入連結串列中 */ printf( "該學生的資訊為:\n" ); printf( "學號\t姓名\t數學\t程式\t總分\n" ); print( p0 ); /* 每次錄入一個學生資訊後輸出其資訊 */ } /* 插入學生資訊 */ void insert( STD *stu ) { STD *p0, *p1, *p2; p1 = head; p0 = stu; if ( head == NULL ) { head = p0; p0->next = NULL; }else { while ( (p0->xh > p1->xh) && (p1->next != NULL) ) { p2 = p1; p1 = p1->next; } if ( p0->xh <= p1->xh ) { if ( head == p1 ) head = p0; else p2->next = p0; p0->next = p1; }else { p1->next = p0; p0->next = NULL; } } NUM++; /* 累加統計學生人數 */ } /* 列印資訊 */ void print( struct student *p ) { printf( "%s\t%s\t%-5.2f\t%-5.2f\t%-5.2f\n", p->xh, p->xm, p->sxcj, p->cxsj, p->zf ); } /* 檢視學生資訊 */ void display() { struct student *p; printf( "學生總人數:%d\n", NUM ); p = head; if ( head != NULL ) { printf( "學號\t姓名\t數學\t程式\t總分\n" ); do { print( p ); p = p->next; } while ( p != NULL ); } printf( "\n" ); } /* 查詢學生資訊 */ void query() { int choice; do { printf( "+---------------------+\n" ); printf( "|[1]--按學號查詢 |\n" ); printf( "|[2]--按姓名查詢 |\n" ); printf( "|[3]--數學成績查詢 |\n" ); printf( "|[4]--程式設計成績查詢|\n" ); printf( "|[5]--總分查詢 |\n" ); printf( "|[6]--返回主選單 |\n" ); printf( "+---------------------+\n" ); printf( "請輸入操作選項:" ); scanf( "%d", &choice ); switch ( choice ) { case 1: query_by_num(); break; case 2: query_by_name(); break; case 3: query_by_sxcj(); break; case 4: query_by_cxsj(); case 5: query_by_zf(); default: printf( "操作選項錯誤!\n" ); break; case 6: return; } } while ( choice != 6 ); } /*按學號查詢學生資訊 */ void query_by_num() { char num[10]; struct student *p1; printf( "請輸入學生的學號:" ); scanf( "%s", num ); if ( head == NULL ) { printf( "沒有學生資訊!\n" ); return; } p1 = head; while ( strcmp( num, p1->xh ) != 0 && p1->next != NULL ) p1 = p1->next; if ( strcmp( num, p1->xh ) == 0 ) { printf( "學號\t姓名\t數學\t程式\t總分\n" ); print( p1 ); }else printf( "沒有找到該學生資訊!\n" ); } /*按姓名查詢學生資訊 */ void query_by_name() { char name[20]; STD *p1; printf( "請輸入學生的姓名:" ); scanf( "%s", name ); if ( head == NULL ) { printf( "沒有學生資訊!\n" ); return; } p1 = head; while ( strcmp( name, p1->xm ) != 0 && p1->next != NULL ) p1 = p1->next; if ( !strcmp( name, p1->xm ) ) { printf( "學號\t姓名\t數學\t程式\t總分\n" ); print( p1 ); }else printf( "沒有找到該學生資訊!\n" ); } /*按數學成績查詢 */ void query_by_sxcj() { float sxcj; STD *p1; printf( "請輸入學生的數學成績:" ); scanf( "%f", &sxcj ); if ( head == NULL ) { printf( "沒有學生資訊!\n" ); return; } p1 = head; while ( sxcj != p1->sxcj && p1->next != NULL ) p1 = p1->next; if ( sxcj == p1->sxcj ) { printf( "學號\t姓名\t數學\t程式\t總分\n" ); print( p1 ); }else printf( "沒有找到該學生資訊!\n" ); } /*按程式設計成績查詢 */ void query_by_cxsj() { float cxsj; STD *p1; printf( "請輸入學生的程式設計成績:" ); scanf( "%f", &cxsj ); if ( head == NULL ) { printf( "沒有學生資訊!\n" ); return; } p1 = head; while ( cxsj != p1->cxsj && p1->next != NULL ) p1 = p1->next; if ( cxsj == p1->cxsj ) { printf( "學號\t姓名\t數學\t程式\t總分\n" ); print( p1 ); }else printf( "沒有找到該學生資訊!\n" ); } /*按總分查詢 */ void query_by_zf() { float zf; STD *p1; printf( "請輸入學生的總分成績:" ); scanf( "%f", &zf ); if ( head == NULL ) { printf( "沒有學生資訊!\n" ); return; } p1 = head; while ( zf != p1->zf && p1->next != NULL ) p1 = p1->next; if ( zf == p1->zf ) { printf( "學號\t姓名\t數學\t程式\t總分\n" ); print( p1 ); }else printf( "沒有找到該學生資訊!\n" ); } /*刪除學生資訊 */ void del() { struct student *p1, *p2; char num[12]; if ( head == NULL ) { printf( "沒有學生資訊!\n" ); return; } printf( "請輸入您要刪除的學生的學號:" ); scanf( "%s", num ); p1 = head; while ( strcmp( num, p1->xh ) != 0 && p1->next != NULL ) { p2 = p1; p1 = p1->next; } if ( strcmp( num, p1->xh ) == 0 ) { if ( p1 == head ) head = p1->next; else p2->next = p1->next; free( p1 ); NUM--; }else printf( "沒有該學生的資訊!\n" ); } /* 修改學生資訊 */ void change() { STD *p1, *p2; char num[12]; if ( head == NULL ) { printf( "沒有學生的資訊!\n" ); return; } printf( "請輸入您要修改的學生的學號:" ); scanf( "%s", num ); p1 = head; while ( strcmp( num, p1->xh ) != 0 && p1->next != NULL ) { p2 = p1; p1 = p1->next; } if ( strcmp( num, p1->xh ) == 0 ) devise( p1 ); else printf( "沒有該學生的資訊!\n" ); } /* 修改學生資訊 */ void devise( struct student *p ) { int choice; do { printf( "+------------------------------+\n" ); printf( "|請選擇您要修改的學生的資訊內容|\n" ); printf( "|[1]--學號 |\n" ); printf( "|[2]--姓名 |\n" ); printf( "|[3]--數學成績 |\n" ); printf( "|[4]--程式設計成績 |\n" ); printf( "|[5]--總分 |\n" ); printf( "|[6]--取消 |\n" ); printf( "+------------------------------+\n" ); printf( "請輸入操作選項:" ); scanf( "%d", &choice ); switch ( choice ) { case 1: printf( "請輸入新學號:" ); scanf( "%s", p->xm ); break; case 2: printf( "請輸入新姓名:" ); scanf( "%s", p->xm ); break; case 3: printf( "請輸入新的數學成績:" ); scanf( "%f", p->sxcj ); break; case 4: printf( "請輸入新的程式設計成績:" ); scanf( "%f", p->cxsj ); break; case 5: printf( "請輸入新的總分:" ); scanf( "%f", p->zf ); break; case 6: return; default: printf( "選項錯誤!\n" ); break; } } while ( choice != 6 ); } /* 讀取檔案 */ void readData() { FILE *fp; STD *p1, *p2; fp = fopen( "students.txt", "r" ); /* 開啟檔案 */ if ( !fp ) { printf( "檔案開啟錯誤!\n" ); return; } fscanf( fp, "%d\n", &NUM ); head = p1 = p2 = (STD *) malloc( LEN ); fscanf( fp, "%s\t%s\t%f\t%f\t%f\n", p1->xh, p1->xm, &p1->sxcj, &p1->cxsj, &p1->zf ); /* */ while ( !feof( fp ) ) { p1 = (struct student *) malloc( LEN ); fscanf( fp, "%s\t%s\t%f\t%f\t%f\n", p1->xh, p1->xm, &p1->sxcj, &p1->cxsj, &p1->zf ); p2->next = p1; p2 = p1; } p2->next = NULL; fclose( fp ); } /* 寫入檔案 */ void writeData() { FILE * fp; /* 檔案指標 */ STD *p; fp = fopen( "students.txt", "w+" ); if ( !fp ) { printf( "檔案開啟錯誤!\n" ); return; } fprintf( fp, "%d\n", NUM ); for ( p = head; p != NULL; p = p->next ) { print(p); fprintf( fp, "%s\t%s\t%f\t%f\t%f\n", p->xh, p->xm, p->sxcj, p->cxsj, p->zf ); } fclose( fp ); } /* 釋放結點 */ void freeAll() { STD *p1, *p2; p1 = p2 = head; while ( p1 ) { p2 = p1->next; free( p1 ); p1 = p2; } }