<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了C語言實現學生管理系統的具體程式碼,供大家參考,具體內容如下
學生資訊管理系統是一個基於C語言開發的系統,其中有用到氣泡排序、指標、結構體、二位陣列等知識。通過模組化的方法編寫各個函數,其中在主介面函數呼叫各個模組的函數的實現以下具體功能:
1、學生資訊的增刪改查
2、學生成績的排序
3、統計學生人數
4、顯示所有學生的資訊。
5、對學生資訊存檔
本實驗通過在main函數開啟儲存資料結果的檔案和呼叫主介面函數;在主介面函數welcom()中實現邊框的繪製,以及顯示各個功能及各個功能對應的函數實現方法。
錄入資訊函數addInfo():此函數通過結構體student來儲存錄入的資訊,其中為了確保資料的後續操作的準確性,通過學號的唯一性來標識每個學生的資訊,通過編寫及呼叫一個isIdSame()函數,該函數通過遍歷所有學號確認學號來保障學號的唯一性,學號重複會提示使用者需要重新輸入函數。
查詢學生資訊函數:通過學號查詢學生的資訊,編寫並呼叫一個findIndex()函數,該函數會遍歷結構體的學號資訊,查詢到會返回該學號的座標,沒有找到該學號則返回-1;通過變數target來儲存返回的結果。如果target不等於-1,則程式找到了該學號,通過編寫並呼叫一個showInfo()函數來輸出所有該學生的資訊;否則輸出查詢此人,因為下標不可能為負數。
更新學生資訊函數update():通過學號來找到該學生,呼叫findIndex()函數來確定該學生的位置,如果返回結果是小於0則函數結束,查無此人;若大於0則找到該學生,通過do…while函數switch選擇語句的巢狀來進行使用者需要求改某一項的內容。
刪除函數del():查詢學生的步驟跟更新學生資訊函數的流程一樣,如果findIndex()函數小於0則函數結束,否則通過一個for迴圈把結構體的陣列從遊標開始往前覆蓋從而達到刪除效果。
插入學生資訊函數inserInfo():通過要求使用者輸入位置來定位插入到位置,輸入使用者輸入的大於結構體陣列的總數則插入到最後一個陣列。否則通過一個for迴圈,把陣列從最後開始往後移一位,把使用者輸入的位置的結果移到後一陣列就編寫並呼叫插入函數inserCurrentInfo()對當前位置陣列進行覆蓋插入。inserCurrentInfo()函數只負責對接收到的該位置的元素所有資訊的寫入。
排序函數sortTotal():建立一個臨時變數提供元素與元素之間交換資訊。通過雙迴圈巢狀結構進行結構體的分數進行大小對比、交換位置來進行氣泡排序。最後排序完成之後輸出分數由高到低排序的所有學生的資訊。
顯示學生資訊函數showAllInfo():該函數通過全域性變數count(該變數記錄了所有新增、插入或刪除過的學生資訊,能準確記錄學生的總人數)通過for迴圈去遍歷student結構體,從而輸出所有的所生資訊。
學生資料存檔函數writeData():該函數定義一個指標,以寫入方式開啟”stu.txt文字”,並把該文字的地址賦給指標fp。通過一個for迴圈遍歷結構體裡的元素,把結構體裡的元素的屬性輸入到”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);//展示學生資訊 int findIndex(struct Student student[],int id);// 根據學號 返回對應下標 void del(); //刪除 void search();// 查詢學生資訊 void updata();//更新 void sortTotal();//按總分排序 void writeData();//資料寫入檔案中 void initData();//初始化資料 從檔案中讀取資料,初始化陣列 void showCount(); // 展示儲存學生個數 void inserInfo();//插入學生資訊 void inserCurrentInfo(int site); //當前位置插入 void con();//按任意鍵繼續 int find1(struct Student student[],int id); //判斷學號是否有重複 重複返回1 不重複返回0 void isIdSame(int x); //校驗所輸入學號是否重複 void gotoxy(int x,int y);//遊標定位 int color(int c); //設定顏色輸出 struct Student{ int id; char name[20]; int _math; int _chinese; int _english; int total;// 總分 } student[500]; int count=0;// 記錄當前陣列中儲存學生個數 //主函數 int main(){ initData(); welcom(); return 0; } // 遊標定位 void gotoxy(int x, int y) { COORD pos; pos.X = x; //橫座標 pos.Y = y; //縱座標 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); } //設定顏色輸出 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++) //迴圈y軸座標,列印輸出上下邊框=== { for (j = 10; j <= 57; j++) //迴圈x軸座標,列印輸出左右邊框|| { gotoxy(j, i); if (i == 5 || i == 35) printf("="); //輸出上下邊框=== else if (j == 10 || j == 56) printf("||"); //輸出左右邊框|| } } color(15);//白色 gotoxy(25,8); printf("學生資訊管理系統"); color(14); //設定字型顏色為黃色 gotoxy(15, 12); printf("1:錄入學生資訊"); gotoxy(35, 12); printf("2.查詢學生資訊"); gotoxy(15, 16); printf("3.刪除學生資訊"); gotoxy(35,16); printf("4.修改學生資訊"); gotoxy(15, 20); printf("5.插入學生資訊"); gotoxy(35,20); printf("6.按照學生成績排序"); gotoxy(15, 24); printf("7.統計學生總數"); gotoxy(35,24); printf("8.顯示所有學生資訊"); gotoxy(15, 28); printf("9.學生資料存檔並退出"); gotoxy(25,32); int choose; printf("請選擇:[ ]bb"); //b 遊標回退一格 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新增學生資訊n"); printf("請輸入學號n"); isIdSame(count); printf("請輸入姓名n"); scanf("%s",&student[count].name); printf("請輸入語文成績n"); scanf("%d",&student[count]._chinese); printf("請輸入數學成績n"); scanf("%d",&student[count]._math); printf("請輸入英語成績n"); scanf("%d",&student[count]._english); student[count].total=student[count]._chinese+student[count]._english+student[count]._math; printf("%s的資訊錄入成功nn",student[count].name); int choose; printf("1繼續 2返回主介面n"); count++; scanf("%d",&choose); if(choose==1){ addInfo(); } system("cls"); } // 查詢 展示結果 void search(){ system("cls"); int id; printf("請輸入你想查詢學生的學號n"); scanf("%d",&id); int target = findIndex(student,id); //目標下表 int flag=1;//是否存在要查詢的學號 //for迴圈對比 if(target != -1) { printf("nt查詢結果nn"); showInfo(student[target]); con(); } else{ // 輸出查詢結果 printf("n查無此人n"); con(); } } // 更新 void updata(){ system("cls"); int id; printf("請輸入你要修改學生的學號n"); scanf("%d",&id); int target = findIndex(student,id); if(target<0){ printf("查無此人"); con(); }else{ int flag=1; do{ int choose=0; printf("請輸入需要修改的選項t(1.學號t2.姓名t3.語文t4.數學t5.英語):n"); scanf("%d",&choose); switch (choose) { case 1: printf("請輸入學號n"); // scanf("%d",&student[target].id); isIdSame(target); break; case 2: printf("請輸入姓名n"); scanf("%s",&student[target].name); break; case 3: printf("請輸入語文成績n"); scanf("%d",&student[target]._chinese); break; case 4: printf("請輸入數學成績n"); scanf("%d",&student[target]._math); break; case 5: printf("請輸入英語成績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繼續 按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;//目標元素的下標 printf("n請輸入你想刪除學生的學號n"); scanf("%d",&id); target=findIndex(student, id); if(target<0){ printf("n查無此人n"); con(); } else{ for(int i=target;i<count;i++){ student[i]=student[i+1]; //刪除操作 後一位元素覆蓋前一位元素 } printf("刪除成功n"); con(); count--; } } //插入學生資訊 void inserInfo(){ system("cls"); int site; //位置 printf("請輸入你要插入學生資訊的位置(從0開始):n"); scanf("%d",&site); //插入位置大於總數,則插入在陣列最後一位 if ( site > count){ inserCurrentInfo(count); printf("%s的資訊插入成功n", student[count].name); }else{ //不是最後一位 從當前位置 陣列全部後移一位 for (int i = count; i >= site; i--){ student[i + 1] = student[i]; } //在當前位置新增學員 inserCurrentInfo(site); printf("%s同學的資訊插入成功n", student[site].name); con(); } } //當前位置插入 void inserCurrentInfo(int site){ printf("請輸入學號n"); isIdSame(site); printf("請輸入姓名n"); scanf("%s", student[site].name); printf("請輸入語文成績n"); scanf("%d", &student[site]._chinese); printf("請輸入數學成績n"); scanf("%d", &student[site]._math); printf("請輸入英語成績n"); scanf("%d", &student[site]._english); student[site].total= student[site]._chinese+student[site]._english+student[site]._math; count++; con(); } // 判斷學號是否重複 重複返回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; } //校驗所新增學號是否重複 void isIdSame(int x){ int inputId; scanf("%d",&inputId); do{ if(find1(student,inputId)){ printf("學號有重複,請重新輸入n"); scanf("%d",&inputId); } else { student[x].id=inputId; break; } }while(1); } // 根據學號 返回下標 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;// 元素與元素交換的臨時容器 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(); } //按任意鍵繼續 void con(){ printf("n按任意鍵繼續n"); getch(); }; //展示學生總個數 void showCount(){ system("cls"); printf("nt學生總個數為:%d個n",count); con(); } //初始化資料 void initData(){ FILE * fp = NULL; fp = fopen("stu.txt", "r"); if (!fp){ printf("檔案開啟失敗n"); exit(0);// 退出程式 } while (1){ //讀取資料 賦值給陣列 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)){ //檔案末尾 跳出迴圈 break; } count++; } } //資料寫入檔案中 void writeData(){ FILE * fp = NULL; fp = fopen("stu.txt", "w"); for (int i = 0; i < count; i++){ fprintf(fp, "%dt%st%dt%dt%dt%dn", student[i].id, student[i].name, student[i]._chinese, student[i]._math, student[i]._english,student[i].total); } printf("資料儲存成功n"); } // 展示所有資訊 void showAllInfo(){ system("cls");//清屏 for(int i=0;i<count;i++){ showInfo(student[i]); } con(); } // 展示學生資訊 void showInfo(struct Student stu){//傳入陣列裡的元素 printf("學號:%dt姓名:%st語文:%dt數學:%dt英語:%dt總分:%d",stu.id,stu.name,stu._chinese,stu._math,stu._english,stu.total); printf("n-----------------分割線-----------------------n"); }
主介面
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45