您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么用C語(yǔ)言編寫(xiě)實(shí)現(xiàn)學(xué)生管理系統(tǒng)”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“怎么用C語(yǔ)言編寫(xiě)實(shí)現(xiàn)學(xué)生管理系統(tǒng)”文章能幫助大家解決問(wèn)題。
學(xué)生信息管理系統(tǒng)是一個(gè)基于C語(yǔ)言開(kāi)發(fā)的系統(tǒng),其中有用到冒泡排序、指針、結(jié)構(gòu)體、二位數(shù)組等知識(shí)。通過(guò)模塊化的方法編寫(xiě)各個(gè)函數(shù),其中在主界面函數(shù)調(diào)用各個(gè)模塊的函數(shù)的實(shí)現(xiàn)以下具體功能:
1、學(xué)生信息的增刪改查
2、學(xué)生成績(jī)的排序
3、統(tǒng)計(jì)學(xué)生人數(shù)
4、顯示所有學(xué)生的信息。
5、對(duì)學(xué)生信息存檔
本實(shí)驗(yàn)通過(guò)在main函數(shù)打開(kāi)保存數(shù)據(jù)結(jié)果的文檔和調(diào)用主界面函數(shù);在主界面函數(shù)welcom()中實(shí)現(xiàn)邊框的繪制,以及顯示各個(gè)功能及各個(gè)功能對(duì)應(yīng)的函數(shù)實(shí)現(xiàn)方法。
錄入信息函數(shù)addInfo():此函數(shù)通過(guò)結(jié)構(gòu)體student來(lái)保存錄入的信息,其中為了確保數(shù)據(jù)的后續(xù)操作的準(zhǔn)確性,通過(guò)學(xué)號(hào)的唯一性來(lái)標(biāo)識(shí)每個(gè)學(xué)生的信息,通過(guò)編寫(xiě)及調(diào)用一個(gè)isIdSame()函數(shù),該函數(shù)通過(guò)遍歷所有學(xué)號(hào)確認(rèn)學(xué)號(hào)來(lái)保障學(xué)號(hào)的唯一性,學(xué)號(hào)重復(fù)會(huì)提示用戶需要重新輸入函數(shù)。
查找學(xué)生信息函數(shù):通過(guò)學(xué)號(hào)查找學(xué)生的信息,編寫(xiě)并調(diào)用一個(gè)findIndex()函數(shù),該函數(shù)會(huì)遍歷結(jié)構(gòu)體的學(xué)號(hào)信息,查詢(xún)到會(huì)返回該學(xué)號(hào)的坐標(biāo),沒(méi)有找到該學(xué)號(hào)則返回-1;通過(guò)變量target來(lái)保存返回的結(jié)果。如果target不等于-1,則程序找到了該學(xué)號(hào),通過(guò)編寫(xiě)并調(diào)用一個(gè)showInfo()函數(shù)來(lái)輸出所有該學(xué)生的信息;否則輸出查詢(xún)此人,因?yàn)橄聵?biāo)不可能為負(fù)數(shù)。
更新學(xué)生信息函數(shù)update():通過(guò)學(xué)號(hào)來(lái)找到該學(xué)生,調(diào)用findIndex()函數(shù)來(lái)確定該學(xué)生的位置,如果返回結(jié)果是小于0則函數(shù)結(jié)束,查無(wú)此人;若大于0則找到該學(xué)生,通過(guò)do…while函數(shù)switch選擇語(yǔ)句的嵌套來(lái)進(jìn)行用戶需要求改某一項(xiàng)的內(nèi)容。
刪除函數(shù)del():查找學(xué)生的步驟跟更新學(xué)生信息函數(shù)的流程一樣,如果findIndex()函數(shù)小于0則函數(shù)結(jié)束,否則通過(guò)一個(gè)for循環(huán)把結(jié)構(gòu)體的數(shù)組從光標(biāo)開(kāi)始往前覆蓋從而達(dá)到刪除效果。
插入學(xué)生信息函數(shù)inserInfo():通過(guò)要求用戶輸入位置來(lái)定位插入到位置,輸入用戶輸入的大于結(jié)構(gòu)體數(shù)組的總數(shù)則插入到最后一個(gè)數(shù)組。否則通過(guò)一個(gè)for循環(huán),把數(shù)組從最后開(kāi)始往后移一位,把用戶輸入的位置的結(jié)果移到后一數(shù)組就編寫(xiě)并調(diào)用插入函數(shù)inserCurrentInfo()對(duì)當(dāng)前位置數(shù)組進(jìn)行覆蓋插入。inserCurrentInfo()函數(shù)只負(fù)責(zé)對(duì)接收到的該位置的元素所有信息的寫(xiě)入。
排序函數(shù)sortTotal():創(chuàng)建一個(gè)臨時(shí)變量提供元素與元素之間交換信息。通過(guò)雙循環(huán)嵌套結(jié)構(gòu)進(jìn)行結(jié)構(gòu)體的分?jǐn)?shù)進(jìn)行大小對(duì)比、交換位置來(lái)進(jìn)行冒泡排序。最后排序完成之后輸出分?jǐn)?shù)由高到低排序的所有學(xué)生的信息。
顯示學(xué)生信息函數(shù)showAllInfo():該函數(shù)通過(guò)全局變量count(該變量記錄了所有添加、插入或刪除過(guò)的學(xué)生信息,能準(zhǔn)確記錄學(xué)生的總?cè)藬?shù))通過(guò)for循環(huán)去遍歷student結(jié)構(gòu)體,從而輸出所有的所生信息。
學(xué)生數(shù)據(jù)存檔函數(shù)writeData():該函數(shù)定義一個(gè)指針,以寫(xiě)入方式打開(kāi)”stu.txt文本”,并把該文本的地址賦給指針fp。通過(guò)一個(gè)for循環(huán)遍歷結(jié)構(gòu)體里的元素,把結(jié)構(gòu)體里的元素的屬性輸入到”stu.txt文本”。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> #include <windows.h> void addInfo();// 添加 void welcom(); //主界面 void showAllInfo();//展示所有信息 void showInfo(struct Student student);//展示學(xué)生信息 int findIndex(struct Student student[],int id);// 根據(jù)學(xué)號(hào) 返回對(duì)應(yīng)下標(biāo) void del(); //刪除 void search();// 查找學(xué)生信息 void updata();//更新 void sortTotal();//按總分排序 void writeData();//數(shù)據(jù)寫(xiě)入文件中 void initData();//初始化數(shù)據(jù) 從文件中讀取數(shù)據(jù),初始化數(shù)組 void showCount(); // 展示存儲(chǔ)學(xué)生個(gè)數(shù) void inserInfo();//插入學(xué)生信息 void inserCurrentInfo(int site); //當(dāng)前位置插入 void con();//按任意鍵繼續(xù) int find1(struct Student student[],int id); //判斷學(xué)號(hào)是否有重復(fù) 重復(fù)返回1 不重復(fù)返回0 void isIdSame(int x); //校驗(yàn)所輸入學(xué)號(hào)是否重復(fù) void gotoxy(int x,int y);//光標(biāo)定位 int color(int c); //設(shè)置顏色輸出 struct Student{ int id; char name[20]; int _math; int _chinese; int _english; int total;// 總分 } student[500]; int count=0;// 記錄當(dāng)前數(shù)組中存儲(chǔ)學(xué)生個(gè)數(shù) //主函數(shù) int main(){ initData(); welcom(); return 0; } // 光標(biāo)定位 void gotoxy(int x, int y) { COORD pos; pos.X = x; //橫坐標(biāo) pos.Y = y; //縱坐標(biāo) SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); } //設(shè)置顏色輸出 int color(int c) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); //更改文字顏色 return 0; }; // 主界面 void welcom() { while(1){ system("cls"); int n; int i,j = 1; color(10); //淡綠色邊框 for (i = 5; i <= 35; i++) //循環(huán)y軸坐標(biāo),打印輸出上下邊框=== { for (j = 10; j <= 57; j++) //循環(huán)x軸坐標(biāo),打印輸出左右邊框|| { gotoxy(j, i); if (i == 5 || i == 35) printf("="); //輸出上下邊框=== else if (j == 10 || j == 56) printf("||"); //輸出左右邊框|| } } color(15);//白色 gotoxy(25,8); printf("學(xué)生信息管理系統(tǒng)"); color(14); //設(shè)置字體顏色為黃色 gotoxy(15, 12); printf("1:錄入學(xué)生信息"); gotoxy(35, 12); printf("2.查找學(xué)生信息"); gotoxy(15, 16); printf("3.刪除學(xué)生信息"); gotoxy(35,16); printf("4.修改學(xué)生信息"); gotoxy(15, 20); printf("5.插入學(xué)生信息"); gotoxy(35,20); printf("6.按照學(xué)生成績(jī)排序"); gotoxy(15, 24); printf("7.統(tǒng)計(jì)學(xué)生總數(shù)"); gotoxy(35,24); printf("8.顯示所有學(xué)生信息"); gotoxy(15, 28); printf("9.學(xué)生數(shù)據(jù)存檔并退出"); gotoxy(25,32); int choose; printf("請(qǐng)選擇:[ ]\b\b"); //\b 光標(biāo)回退一格 color(15); // 顏色變回白色 scanf("%d", &choose); switch (choose){ case 1:addInfo(); break; case 2:search(); break; case 3:del(); break; case 4:updata(); break; case 5:inserInfo();break; case 6:sortTotal(); break; case 7:showCount(); break; case 8:showAllInfo(); break; case 9:writeData();exit(0); } } } // 添加 void addInfo(){ system("cls"); printf("\t添加學(xué)生信息\n"); printf("請(qǐng)輸入學(xué)號(hào)\n"); isIdSame(count); printf("請(qǐng)輸入姓名\n"); scanf("%s",&student[count].name); printf("請(qǐng)輸入語(yǔ)文成績(jī)\n"); scanf("%d",&student[count]._chinese); printf("請(qǐng)輸入數(shù)學(xué)成績(jī)\n"); scanf("%d",&student[count]._math); printf("請(qǐng)輸入英語(yǔ)成績(jī)\n"); scanf("%d",&student[count]._english); student[count].total=student[count]._chinese+student[count]._english+student[count]._math; printf("%s的信息錄入成功\n\n",student[count].name); int choose; printf("1繼續(xù) 2返回主界面\n"); count++; scanf("%d",&choose); if(choose==1){ addInfo(); } system("cls"); } // 查找 展示結(jié)果 void search(){ system("cls"); int id; printf("請(qǐng)輸入你想查找學(xué)生的學(xué)號(hào)\n"); scanf("%d",&id); int target = findIndex(student,id); //目標(biāo)下表 int flag=1;//是否存在要查詢(xún)的學(xué)號(hào) //for循環(huán)對(duì)比 if(target != -1) { printf("\n\t查詢(xún)結(jié)果\n\n"); showInfo(student[target]); con(); } else{ // 輸出查詢(xún)結(jié)果 printf("\n查無(wú)此人\n"); con(); } } // 更新 void updata(){ system("cls"); int id; printf("請(qǐng)輸入你要修改學(xué)生的學(xué)號(hào)\n"); scanf("%d",&id); int target = findIndex(student,id); if(target<0){ printf("查無(wú)此人"); con(); }else{ int flag=1; do{ int choose=0; printf("請(qǐng)輸入需要修改的選項(xiàng)\t(1.學(xué)號(hào)\t2.姓名\t3.語(yǔ)文\t4.數(shù)學(xué)\t5.英語(yǔ)):\n"); scanf("%d",&choose); switch (choose) { case 1: printf("請(qǐng)輸入學(xué)號(hào)\n"); // scanf("%d",&student[target].id); isIdSame(target); break; case 2: printf("請(qǐng)輸入姓名\n"); scanf("%s",&student[target].name); break; case 3: printf("請(qǐng)輸入語(yǔ)文成績(jī)\n"); scanf("%d",&student[target]._chinese); break; case 4: printf("請(qǐng)輸入數(shù)學(xué)成績(jī)\n"); scanf("%d",&student[target]._math); break; case 5: printf("請(qǐng)輸入英語(yǔ)成績(jī)\n"); scanf("%d",&student[target]._english); break; } student[target].total=student[target]._chinese+student[target]._english+student[target]._math; printf("%s的信息修改成功\n",student[target].name); printf("\n按1繼續(xù) 按2退出修改\n"); int choose2; scanf("%d",&choose2); if(choose2==1){ flag=1; }else{ flag=0; } }while(flag); } } //刪除 void del(){ system("cls"); int id; int target;//目標(biāo)元素的下標(biāo) printf("\n請(qǐng)輸入你想刪除學(xué)生的學(xué)號(hào)\n"); scanf("%d",&id); target=findIndex(student, id); if(target<0){ printf("\n查無(wú)此人\n"); con(); } else{ for(int i=target;i<count;i++){ student[i]=student[i+1]; //刪除操作 后一位元素覆蓋前一位元素 } printf("刪除成功\n"); con(); count--; } } //插入學(xué)生信息 void inserInfo(){ system("cls"); int site; //位置 printf("請(qǐng)輸入你要插入學(xué)生信息的位置(從0開(kāi)始):\n"); scanf("%d",&site); //插入位置大于總數(shù),則插入在數(shù)組最后一位 if ( site > count){ inserCurrentInfo(count); printf("%s的信息插入成功\n", student[count].name); }else{ //不是最后一位 從當(dāng)前位置 數(shù)組全部后移一位 for (int i = count; i >= site; i--){ student[i + 1] = student[i]; } //在當(dāng)前位置添加學(xué)員 inserCurrentInfo(site); printf("%s同學(xué)的信息插入成功\n", student[site].name); con(); } } //當(dāng)前位置插入 void inserCurrentInfo(int site){ printf("請(qǐng)輸入學(xué)號(hào)\n"); isIdSame(site); printf("請(qǐng)輸入姓名\n"); scanf("%s", student[site].name); printf("請(qǐng)輸入語(yǔ)文成績(jī)\n"); scanf("%d", &student[site]._chinese); printf("請(qǐng)輸入數(shù)學(xué)成績(jī)\n"); scanf("%d", &student[site]._math); printf("請(qǐng)輸入英語(yǔ)成績(jī)\n"); scanf("%d", &student[site]._english); student[site].total= student[site]._chinese+student[site]._english+student[site]._math; count++; con(); } // 判斷學(xué)號(hào)是否重復(fù) 重復(fù)返回1 否則返回0 int find1(struct Student student[],int id) { int temp = 0; for(int i=0;i<count;i++) { if(student[i].id==id) { temp=1; break; } } return temp; } //校驗(yàn)所添加學(xué)號(hào)是否重復(fù) void isIdSame(int x){ int inputId; scanf("%d",&inputId); do{ if(find1(student,inputId)){ printf("學(xué)號(hào)有重復(fù),請(qǐng)重新輸入\n"); scanf("%d",&inputId); } else { student[x].id=inputId; break; } }while(1); } // 根據(jù)學(xué)號(hào) 返回下標(biāo) int findIndex (struct Student student[],int id){ int temp; for(int i=0;i<count;i++){ if(student[i].id==id){ temp=i; break; } else { temp = -1; } } return temp; } //按總分排序 void sortTotal(){ //冒泡排序 struct Student temp;// 元素與元素交換的臨時(shí)容器 for (int i = 0; i < count - 1; i++){ for (int j = 0; j < count - 1 - i; j++){ if (student[j].total<student[j+1].total){ temp = student[j + 1]; student[j + 1] = student[j]; student[j]= temp; } } } printf("排序完成"); showAllInfo(); } //按任意鍵繼續(xù) void con(){ printf("\n按任意鍵繼續(xù)\n"); getch(); }; //展示學(xué)生總個(gè)數(shù) void showCount(){ system("cls"); printf("\n\t學(xué)生總個(gè)數(shù)為:%d個(gè)\n",count); con(); } //初始化數(shù)據(jù) void initData(){ FILE * fp = NULL; fp = fopen("stu.txt", "r"); if (!fp){ printf("文件打開(kāi)失敗\n"); exit(0);// 退出程序 } while (1){ //讀取數(shù)據(jù) 賦值給數(shù)組 fscanf(fp, "%d%s%d%d%d%d", &student[count].id, student[count].name, &student[count]._chinese, &student[count]._math, &student[count]._english, &student[count].total); if (feof(fp)){ //文件末尾 跳出循環(huán) break; } count++; } } //數(shù)據(jù)寫(xiě)入文件中 void writeData(){ FILE * fp = NULL; fp = fopen("stu.txt", "w"); for (int i = 0; i < count; i++){ fprintf(fp, "%d\t%s\t%d\t%d\t%d\t%d\n", student[i].id, student[i].name, student[i]._chinese, student[i]._math, student[i]._english,student[i].total); } printf("數(shù)據(jù)保存成功\n"); } // 展示所有信息 void showAllInfo(){ system("cls");//清屏 for(int i=0;i<count;i++){ showInfo(student[i]); } con(); } // 展示學(xué)生信息 void showInfo(struct Student stu){//傳入數(shù)組里的元素 printf("學(xué)號(hào):%d\t姓名:%s\t語(yǔ)文:%d\t數(shù)學(xué):%d\t英語(yǔ):%d\t總分:%d",stu.id,stu.name,stu._chinese,stu._math,stu._english,stu.total); printf("\n-----------------分割線-----------------------\n"); }
主界面
關(guān)于“怎么用C語(yǔ)言編寫(xiě)實(shí)現(xiàn)學(xué)生管理系統(tǒng)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。