C語言版學生資訊管理系統
本文例項為大家分享了C語言版學生資訊管理系統的具體程式碼,供大家參考,具體內容如下
一.題目分析
1.功能概述
1)查詢學生資訊
2)新增學生資訊
3)修改學生資訊
4)刪除學生資訊
5)重新整理學生資訊
6)儲存學生資訊
7)輸出當前學生資訊
2.題目要求:
1)使用結構體建立學生資訊體制
2)實現七大基本功能
3)採用檔案儲存學生資訊
二.演算法構造
1.難點解析----對檔案的操作
1.1檔案讀取
FILE * fp; if ((fp = fopen(filename,"r")) == NULL) return 0; //從檔案讀取資訊 while (fscanf(fp,"%s %s %s %d %d %d %d ",&stu[j].StudentId,&stu[j].StudentName,&stu[j].StudentAge,&stu[j].StudentSex,&stu[j].score[0],&stu[j].score[1],&stu[j].score[2]) == 7) { j++; }
1.2檔案寫入
FILE * fp; fp = fopen(filename,"w"); for (i = 0; i < n; i++){ fprintf(fp,"%s%s%d%c%.lf%.lf%.lf\n",stu[i].StudentId,stu[i].StudentName,stu[i].StudentAge,stu[i].StudentSex,stu[i].score[0],stu[i].score[1],stu[i].score[2]); }
2.流程圖
3.七大基本功能----函式實現
3.1選單函式:通過選單建立使用者與程式之間的交流
void menu()/* 介面*/ { int num; printf(" \n\n \n\n"); printf(" ******************************************************\n\n"); printf(" * 學生資訊管理系統 *\n \n"); printf(" ******************************************************\n\n"); printf("*********************系統功能選單************************* \n"); printf(" ---------------------- ---------------------- \n"); printf(" ********************************************* \n"); printf(" * 0.系統幫助及說明 * * 1.重新整理學生資訊 * \n"); printf(" ********************************************* \n"); printf(" * 2.查詢學生資訊 * * 3.修改學生資訊 * \n"); printf(" ********************************************* \n"); printf(" * 4.增加學生資訊 * * 5.按學號刪除資訊 * \n"); printf(" ********************************************* \n"); printf(" * 6.顯示當前資訊 * * 7.儲存當前學生資訊* \n"); printf(" ********************** ********************** \n"); printf(" * 8.退出系統 * \n"); printf(" ********************** \n"); printf(" ---------------------- ---------------------- \n"); printf("請選擇選單編號:"); scanf("%d",&num); switch (num) { case 0:help(); break; case 1:flush(); break; case 2:seek(); break; case 3:modify(); break; case 4:insert(); break; case 5:del(); break; case 6:display(); break; case 7:save(); break; case 8: k = 0; printf("即將退出程式!\n"); break; default:printf("請在0-8之間選擇\n"); } }
3.2系統幫助與說明函式:適用於初次接觸學生資訊管理系統的使用者參考
void help() { printf("\n0.歡迎使用系統幫助!\n"); printf("\n1.初次進入系統後,請先選擇增加學生資訊;\n"); printf("\n2.按照選單提示鍵入數字代號;\n"); printf("\n3.增加學生資訊後,切記儲存;\n"); printf("\n4.謝謝您的使用!\n"); }
3.3重新整理學生資訊函式
功能:呼叫重新整理資訊函式後,檔案中再無學生資訊
int flush(){ char filename[LEN + 1]; int i = 0; printf("請輸入要重新整理學生資訊的檔名:\n"); scanf("%s",filename); int j = 0; FILE * fp; if ((fp = fopen(filename,&stu[j].score[2]) == 7) { j++; } n = j; printf("重新整理成功!!!"); return n; }
3.4查詢學生資訊函式
功能:通過輸入要查詢的學生學號或者姓名,與系統中的學生資訊進行對比,若相等,則輸出該學生的基本資訊;反之,則輸出該學生在該管理系統中不存在
查詢方式:
1)按照學號查詢
2)按照姓名查詢
void seek() /*查詢*/ { int i,item,flag; char s1[21]; /* 以姓名和學號最長長度+1為準*/ printf("------------------\n"); printf("-----1.按學號查詢-----\n"); printf("-----2.按姓名查詢-----\n"); printf("-----3.退出本選單-----\n"); printf("------------------\n"); while (1) { printf("請選擇子選單編號:"); scanf("%d",&item); flag = 0; switch (item) { case 1: printf("請輸入要查詢的學生的學號:\n"); scanf("%s",s1); for (i = 0; i<n; i++) if (strcmp(s1,stu[i].StudentId) == 0) { flag = 1; printf("學生學號\t學生姓名\t年齡\t性別\tC語言成績\t高等數學\t大學英語成績\n"); printf("--------------------------------------------------------------------\n"); printf("%s\t%s\t%d\t%6\t%.1f\t%.1f\t%.1f\n",stu[i].score[2]); } if (0 == flag) printf("該學號不存在!\n"); break; case 2: printf("請輸入要查詢的學生的姓名:\n"); scanf("%s",s1); for (i = 0; i<n; i++) if (strcmp(stu[i].StudentName,s1) == 0) { flag = 1; printf("學生學號\t學生姓名\t年齡\t性別\tC語言成績\t高等數學\t大學英語成績\n"); printf("--------------------------------------------------------------------\n"); printf("%s\t%s\t%d\t%c\t%.1f\t%.1f\t%.1f\n",stu[i].score[2]); } if (0 == flag) printf("該姓名不存在!\n"); break; case 3:return; default:printf("請在1-3之間選擇\n"); } } }
3.5修改學生資訊
功能:通過輸入學號來選擇要修改的該學號學生的資訊內容,從而完成修改資訊操作;
//修改學生資訊 void modify() /*修改資訊*/ { int i,num = -1; char sex1,s1[LEN + 1],s2[LEN + 1]; /* 以姓名和學號最長長度+1為準*/ float score1; printf("請輸入要要修改的學生的學號:\n"); scanf("%s",s1); for (i = 0; i < n; i++){ if (strcmp(stu[i].StudentId,s1) == 0){/*比較字串是否相等*/ num = i; printf("------------------\n"); printf("1.修改姓名\n"); printf("2.修改年齡\n"); printf("3.修改性別\n"); printf("4.修改C語言成績\n"); printf("5.修改高等數學成績\n"); printf("6.修改大學英語成績\n"); printf("7.退出本選單\n"); printf("------------------\n"); while (1) { printf("請選擇子選單編號:"); scanf("%d",&item); switch (item) { case 1: printf("請輸入新的姓名:\n"); scanf("%s",s2); strcpy(stu[num].StudentName,s2); break; case 2: printf("請輸入新的年齡:\n"); scanf("%d",stu[num].StudentAge); break; case 3: printf("請輸入新的性別:\n"); scanf("%s",&sex1); stu[i].StudentSex = sex1; break; case 4: printf("請輸入新的C語言成績:\n"); scanf("%f",&score1); stu[num].score[0] = score1; break; case 5: printf("請輸入新的高等數學成績:\n"); scanf("%f",&score1); stu[num].score[1] = score1; break; case 6: printf("請輸入新的大學英語成績:\n"); scanf("%f",&score1); stu[num].score[2] = score1; break; case 7: return; default:printf("請在1-7之間選擇\n"); } } printf("修改完畢!請及時儲存!\n"); } else{ printf("沒有該學生學號!!!"); } } }
3.6新增學生資訊函式
功能:新增學生資訊,並儲存至檔案中
//新增學生資訊函式 void insert() /*插入函式*/ { int i = n,j,flag; printf("請輸入待增加的學生數:\n"); scanf("%d",&m); if (m > 0){ do { flag = 1; while (flag) { flag = 0; printf("請輸入第%d位學生的學號:\n",i + 1); scanf("%s",stu[i].StudentId); for (j = 0; j < i; j++){ if (strcmp(stu[i].StudentId,stu[j].StudentId) == 0){ printf("該學號已存在,請重新輸入!\n"); flag = 1; break; } } } printf("請輸入第%d 個學生的姓名:\n",i+1); scanf("%s",stu[i].StudentName); printf("請輸入第%d 個學生的年齡:\n",i+1); scanf("%d",&stu[i].StudentAge); printf("請輸入第%d 個學生的性別:\n",i+1); scanf(" %c",&stu[i].StudentSex); printf("請輸入第%d 個學生的C語言成績\n",i+1); scanf("%f",&stu[i].score[0]); printf("請輸入第%d 個學生的高等數學成績:\n",&stu[i].score[1]); printf("請輸入第%d 個學生的大學英語成績:\n",&stu[i].score[2]); if (0 == flag){ i++; } } while (i<n + m); } n += m; printf("學生資訊增加完畢!!!\n"); system("pause"); }
3.7刪除學生資訊函式
功能:通過輸入要刪除學生資訊的學號,刪除該學生在該管理系統中的所有資訊;
//刪除學生資訊函式 void del() { int i,flag = 0; char s1[LEN + 1]; printf("請輸入要刪除學生的學號:\n"); scanf("%s",s1); for (i = 0; i < n; i++){ if (strcpy(stu[i].StudentId,s1) == 0){ flag = 1; //要刪除學生後面的學生往前移一位 for (j = i; j < n - 1; j++){ stu[j] = stu[j + 1]; } } } //查詢失敗 if (0 == flag){ printf("該學號不存在!!!\n"); } if (1 == flag){ printf("刪除成功!!!"); //刪除成功,學生人數減1 n--; } system("pause"); }
3.8顯示當前學生資訊
功能:可以輸出進行多種操作後的學生資訊管理系統中的所有學生資訊;
//顯示全部資料資訊 void display() { int i; printf("共有%d位學生的資訊:\n",n); if (0 != n) { printf("學生學號 \t學生姓名 \t年齡 \t性別 \tC語言成績\t高等數學 \t大學英語成績\n"); printf("--------------------------------------------------------------------\n"); for (i = 0; i<n; i++) { printf("%s \t%s \t%d \t%c \t%.1f\t%.1f \t%.1f\n",stu[i].score[2]); } } system("pause"); }
3.8儲存學生資訊
功能:將進行某些操作後的學生資訊儲存到指定檔案中
void save(){ int i; FILE *fp; char filename[LEN + 1]; printf("請輸入要儲存的檔名:\n"); scanf("%s",filename); fp = fopen(filename,stu[i].score[2]); } printf("儲存成功!!!\n"); fclose(fp); system("pause"); }
三.源程式程式碼
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> /*I/O函式*/ #include<stdlib.h> /*其它說明*/ #include<string.h> /*字串函式*/ #define LEN 15 /* 學號和姓名最大字元數,實際請更改*/ #define N 50 /* 最大學生人數,實際請更改*/ int k = 1,n = 0,m = 0;/* n代表當前記錄的學生人數*/ //函式宣告 void readfile(); void seek(); void modify(); void insert(); void del(); void display(); void save(); void menu(); //結構體儲存學生資訊 struct student{ char StudentId[LEN+1]; char StudentName[LEN+1]; int StudentAge; char StudentSex; float score[3]; }stu[N]; //主函式 int main() { while (k) { menu(); } system("pause"); return 0; } //系統幫助函式 void help() { printf("\n0.歡迎使用系統幫助!\n"); printf("\n1.初次進入系統後,切記儲存;\n"); printf("\n4.謝謝您的使用!\n"); } //重新整理檔案 int flush(){ char filename[LEN + 1]; int i = 0; printf("請輸入要重新整理學生資訊的檔名:\n"); scanf("%s",&stu[j].score[2]) == 7) { j++; } n = j; printf("重新整理成功!!!"); return n; } //查詢學生資訊 void seek() /*查詢*/ { int i,stu[i].score[2]); } if (0 == flag) printf("該姓名不存在!\n"); break; case 3:return; default:printf("請在1-3之間選擇\n"); } } } //修改學生資訊 void modify() /*修改資訊*/ { int i,&score1); stu[num].score[2] = score1; break; case 7: return; default:printf("請在1-7之間選擇\n"); } } printf("修改完畢!請及時儲存!\n"); } else{ printf("沒有該學生學號!!!"); } } } void sort()//按學號排序 { int i,k,*p,*q,s; char temp[LEN + 1],ctemp; float ftemp; for (i = 0; i<n - 1; i++) { for (j = n - 1; j>i; j--) if (strcmp(stu[j - 1].StudentId,stu[j].StudentId)>0) { strcpy(temp,stu[j - 1].StudentId); strcpy(stu[j - 1].StudentId,stu[j].StudentId); strcpy(stu[j].StudentId,temp); strcpy(temp,stu[j - 1].StudentName); strcpy(stu[j - 1].StudentName,stu[j].StudentName); strcpy(stu[j].StudentName,temp); ctemp = stu[j - 1].StudentSex; stu[j - 1].StudentSex = stu[j].StudentSex; stu[j].StudentSex = ctemp; p = &stu[j - 1].StudentAge; q = &stu[j].StudentAge; s = *q; *q = *p; *p = s; for (k = 0; k<3; k++) { ftemp = stu[j - 1].score[k]; stu[j - 1].score[k] = stu[j].score[k]; stu[j].score[k] = ftemp; } } } } //新增學生資訊函式 void insert() /*插入函式*/ { int i = n,&stu[i].score[2]); if (0 == flag){ i++; } } while (i<n + m); } n += m; printf("學生資訊增加完畢!!!\n"); system("pause"); } //刪除學生資訊函式 void del() { int i,s1) == 0){ flag = 1; //要刪除學生後面的學生往前移一位 for (j = i; j < n - 1; j++){ stu[j] = stu[j + 1]; } } } //查詢失敗 if (0 == flag){ printf("該學號不存在!!!\n"); } if (1 == flag){ printf("刪除成功!!!"); //刪除成功,學生人數減1 n--; } system("pause"); } //顯示全部資料資訊 void display() { int i; printf("共有%d位學生的資訊:\n",stu[i].score[2]); } } system("pause"); } void save(){ int i; FILE *fp; char filename[LEN + 1]; printf("請輸入要儲存的檔名:\n"); scanf("%s",stu[i].score[2]); } printf("儲存成功!!!\n"); fclose(fp); system("pause"); } void menu()/* 介面*/ { int num; printf(" \n\n \n\n"); printf(" ******************************************************\n\n"); printf(" * 學生資訊管理系統 *\n \n"); printf(" ******************************************************\n\n"); printf("*********************系統功能選單************************* \n"); printf(" ---------------------- ---------------------- \n"); printf(" ********************************************* \n"); printf(" * 0.系統幫助及說明 * * 1.重新整理學生資訊 * \n"); printf(" ********************************************* \n"); printf(" * 2.查詢學生資訊 * * 3.修改學生資訊 * \n"); printf(" ********************************************* \n"); printf(" * 4.增加學生資訊 * * 5.按學號刪除資訊 * \n"); printf(" ********************************************* \n"); printf(" * 6.顯示當前資訊 * * 7.儲存當前學生資訊* \n"); printf(" ********************** ********************** \n"); printf(" * 8.退出系統 * \n"); printf(" ********************** \n"); printf(" ---------------------- ---------------------- \n"); printf("請選擇選單編號:"); scanf("%d",&num); switch (num) { case 0:help(); break; case 1:flush(); break; case 2:seek(); break; case 3:modify(); break; case 4:insert(); break; case 5:del(); break; case 6:display(); break; case 7:save(); break; case 8: k = 0; printf("即將退出程式!\n"); break; default:printf("請在0-8之間選擇\n"); } }
四.除錯、測試以及實驗結果
1.除錯:
2.測試:
輸入資料型別與定義時不符合,程式執行過程中會出現錯誤
3.實驗結果:
(1)~(9)是一個連續的執行實驗結果
(1)執行選單
(2)新增學生資訊
(3)儲存學生資訊
(4)顯示全部資訊
(5)修改學生資訊
(6)顯示修改後全部資訊
(7)重新整理學生資訊
(8)儲存學生資訊
(9)顯示重新整理後的全部資訊
五、總結
編寫一個功能齊全的、方便使用者操作的學生管理系統,需要長期的實踐與積累。
實踐時檢驗的好辦法,學到的知識經過實踐的檢驗,才能更好的被自身吸收。檔案的操作的程式編寫應用對我來說,是一個沒有經過多次實踐的問題,所以我在寫這部分程式時,還是有些難度。該程式中還存在一個問題就是,當輸入一個與定義時不符的資料,程式在執行過程中會出現錯誤,修改辦法還在思考,歡迎大家來與我互相共勉。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。