C語(yǔ)言實(shí)現(xiàn)學(xué)生管理系統(tǒng)的源碼分享
注意:沒(méi)有用到數(shù)據(jù)庫(kù)使用鏈表完成此系統(tǒng)!
多文件實(shí)現(xiàn)
正式開始
代碼都可以直接使用
不想看的,直接復(fù)制代碼塊里面的內(nèi)容就行!
我用的visual studio 2019 有些使用了 _s 如果是用別的編譯器,可以自行修改!
功能介紹
增,刪,改,查,退出,保存,以至于格式化!
1.錄入學(xué)生信息
2.查看錄入的學(xué)生信息(全部學(xué)生信息)
3.修改已錄入的學(xué)生信息(以學(xué)號(hào))
4.刪除已錄入的學(xué)生信息(以學(xué)號(hào))
5.保存信息到文件
6.指定查找(以學(xué)號(hào))
7.隱藏選項(xiàng)(格式化鏈表--清空)
'q'退出系統(tǒng)
實(shí)現(xiàn)功能
創(chuàng)建源文件main.c 函數(shù)部分
//不一一介紹,不懂得去查就行,要學(xué)會(huì)Google! #include "myList.h" //引入自己寫得一個(gè)頭文件 //菜單界面 void menu(void);//函數(shù)聲明,菜單顯示函數(shù). //按鈕互動(dòng) void keydown(struct Node* List); int main(void) { struct Node* List = createrList();//創(chuàng)建一個(gè)叫List的鏈表 readInfoFromFile(List, "student.txt");//讀取在student.txt的文件 然后寫入List鏈表中 while (true) {//一直循環(huán),知道用戶不用這個(gè)程序后,輸入'q' 退出程序! //顯示菜單 menu(); //然后讀取用戶輸入的值,進(jìn)行操作! keydown(List); system("pause");//暫停程序用的 system("cls");//執(zhí)行完一次,就清屏一次,看起來(lái)比較舒服 } system("pause");//不閃退!同上面作用 return 0; } //這里是用一個(gè)結(jié)構(gòu)體,到時(shí)用來(lái)儲(chǔ)存我們的提示信息 //結(jié)構(gòu)體 把菜單要輸入的內(nèi)容都放進(jìn)這里面 //功能 struct hint_menu {//桌面菜單使用! char one_menu[25]; char two_menu[30]; char three_menu[30]; char four_menu[30]; char five_menu[25]; char six_menu[25]; char seven_menu[25]; }; //桌面菜單 void menu(void) { //使用指針 chosen 指向我們的結(jié)構(gòu)體 ,然后給它動(dòng)態(tài)分配空間 // 類型 分配的大小 struct hint_menu* chosen = (struct hint_menu*)malloc(sizeof(struct hint_menu)); if (chosen) {//這里的if()可寫可不寫,我寫了是劃分代碼塊好看點(diǎn) //存入要輸入內(nèi)容 //這里修改內(nèi)容即可 , 想添加就去結(jié)構(gòu)體那先添加一下數(shù)組 strcpy_s(chosen->one_menu, sizeof(chosen->one_menu), "1.錄入學(xué)生信息"); strcpy_s(chosen->two_menu, sizeof(chosen->two_menu), "2.查看已錄入的學(xué)生信息"); strcpy_s(chosen->three_menu, sizeof(chosen->three_menu), "3.修改已錄入的學(xué)生信息"); strcpy_s(chosen->four_menu, sizeof(chosen->four_menu), "4.刪除已錄入的學(xué)生信息"); strcpy_s(chosen->five_menu, sizeof(chosen->five_menu), "5.保存至文件"); strcpy_s(chosen->six_menu, sizeof(chosen->six_menu), "6.指定查找"); strcpy_s(chosen->seven_menu, sizeof(chosen->seven_menu), "q.退出系統(tǒng)"); //其實(shí)這樣比較麻煩 //你們可以直接定義一個(gè)字符串 //char inset[20] = "1.錄入學(xué)生信息"; 以此類推 //輸出你存入的內(nèi)容 printf("\n\n\n\n"); printf("\t\t\t\t******************歡迎進(jìn)入學(xué)生管理系統(tǒng)*******************\n"); printf("\t\t\t\t*\t\t %s\t\t\t\t*\n", chosen->one_menu); printf("\t\t\t\t*\t\t %s \t\t*\n", chosen->two_menu); printf("\t\t\t\t*\t\t %s \t\t*\n", chosen->three_menu); printf("\t\t\t\t*\t\t %s \t\t*\n", chosen->four_menu); printf("\t\t\t\t*\t\t %s \t\t\t\t*\n", chosen->five_menu); printf("\t\t\t\t*\t\t %s \t\t\t\t*\n", chosen->six_menu); printf("\t\t\t\t*\t\t %s \t\t\t\t*\n", chosen->seven_menu); printf("\t\t\t\t*********************************************************\n"); printf("\t\t\t\t請(qǐng)輸入你的選項(xiàng)1~6 and (q quit program):"); fflush(stdout);//刷新輸出緩沖流 } } //功能實(shí)現(xiàn) ,按鈕互動(dòng) void keydown(struct Node* List) { struct student info; char num[12]; char choose,ch; choose = enter(); switch (choose) { case '1': printf("\t\t\t\t******************錄入學(xué)生信息******************\n"); printf("\t\t\t\t請(qǐng)輸入要錄入的學(xué)生:學(xué)號(hào)\t姓名\t性別\t年齡\t電話\t\n"); printf("\t\t\t\t請(qǐng)輸入學(xué)號(hào):"); scanf_s("%s",info.number, (unsigned int)sizeof(info.number)); printf("\t\t\t\t請(qǐng)輸入姓名:"); scanf_s("%s",info.name,(int)sizeof(info.name)); printf("\t\t\t\t請(qǐng)輸入%s的性別:",info.name); scanf_s("%s",info.gender,(int)sizeof(info.gender)); printf("\t\t\t\t請(qǐng)輸入%s的年齡:", info.name); scanf_s("%hd", &info.age); printf("\t\t\t\t請(qǐng)輸入%s的電話:", info.name); scanf_s("%s", info.tel, (int)sizeof(info.tel)); insertNodeByHead(List, info); printf("\t\t\t\t錄入完成! Done!"); break; case '2': printf("\t\t\t\t***************查看已錄入學(xué)生信息************\n"); printfNode(List); printf("\t\t\t\t一共有%d個(gè)人\n", LengthNode(List)); break; case '3': printf("\t\t\t\t******************修改學(xué)生信息*******************\n"); printfNode(List); printf("\t\t\t\t請(qǐng)輸入需要修改的學(xué)生學(xué)號(hào):"); scanf_s("%s", num, (unsigned int)sizeof(num)); upDataNode(List,num); break; case '4': printf("\t\t\t\t******************刪除學(xué)生信息*******************\n"); printfNode(List); printf("\t\t\t\t請(qǐng)輸入需要?jiǎng)h除的學(xué)生學(xué)號(hào):"); scanf_s("%s",num,(unsigned int)sizeof(num)); deteleNodeAppoinNumber(List, num); break; case '5': printf("\t\t\t\t******************保存至文件*******************\n"); weiteInfoToFile(List, "use_stu.txt"); printf("\t\t\t\t備份完成\n"); printf("\t\t\t\tDone\n"); break; case '6': printf("\t\t\t\t******************指定位置查找*******************\n"); printf("\t\t\t\t請(qǐng)輸入想要查找的學(xué)生學(xué)號(hào):"); scanf_s("%s",num, (unsigned int)sizeof(num)); printfToInput(List,num); printf("\t\t\t\t\t\t\t\tDone\n"); break; case '7': printf("\t\t\t\t******************格式化鏈表*******************\n"); printf("\t\t\t\t*********************************\n"); printf("\t\t\t\t******************注意***********\n"); printf("\t\t\t\t********此操作無(wú)法撤回!**********\n"); printf("\t\t\t\t(確認(rèn)請(qǐng)輸入[Y] 取消請(qǐng)選擇[q]):"); ch = enter(); switch (ch) { case 'Y': formattedLinkedList(List); weiteInfoToFile(List, "student.txt"); break; case 'q': printf("\t\t\t\t退出成功"); return; break; default: printf("\t\t\t\t(確認(rèn)請(qǐng)輸入[Y] 取消請(qǐng)選擇[q]):"); break; } break; case 'q': printf("\t\t\t\t正常退出系統(tǒng)成功\n"); exit(0); break; default: printf("\n\t\t\t\t請(qǐng)重新輸入(1~5 and (q quit program))\n"); break; } weiteInfoToFile(List,"student.txt"); }
創(chuàng)建源文件頭文件 enter.h 部分
#pragma once //防止重復(fù)引用 #include "myList.h" //處理寫入 char enter(void); //函數(shù)聲明 char enter(void) { short count = 1;//次數(shù) char input = getchar(); // 讀取單個(gè)字符 fflush(stdin);//清空輸入緩存區(qū),防止讀取后,又讀取 for (int i = 1; i <= 12; i++) {//如果超過(guò)誤輸入超過(guò)13次,強(qiáng)制退出程序 if (input == '\n') {//如果讀取的一直是回車,就會(huì)執(zhí)行,否則返回該值 count++; scanf_s("%c", &input, 3); fflush(stdin); if (count == 5) { printf("\n\t\t\t\t\t\t別再調(diào)皮了!\n"); continue; } else if (count == 11) { printf("\n\t\t\t\t\t\t別在摁回車鍵了!最后一次機(jī)會(huì)了\n"); continue; } else if (count == 13) { printf("\n\t\t\t\t\t\t程序已強(qiáng)制退出!byebye"); exit(0); } } else { return input; } } return 0; }
重頭戲來(lái)咯
創(chuàng)建頭文件 myList.h
#pragma once //前面沒(méi)有引用是應(yīng)為這里都引用了,所以引用一次頭文件就歐克了 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h> #include <ctype.h> #include "enter.h" //定義一個(gè)學(xué)生類型的結(jié)構(gòu)體 struct student { char name[20]; //姓名 char gender[3];//性別 char number[12]; //學(xué)號(hào) char tel[12];//電話號(hào)碼 short age;//年齡 //需要可以在添加 }; //結(jié)點(diǎn) struct Node { struct student data; //數(shù)據(jù)域 struct Node* next; //指針域 }; //創(chuàng)建鏈表 struct Node* createrList(void) { struct Node* headNode = (struct Node*)malloc(sizeof(struct Node)); if (headNode) { //初始化 headNode->next = NULL; } return headNode; } //創(chuàng)建結(jié)點(diǎn) struct Node* createNode(struct student data) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); if (newNode) { //把數(shù)據(jù)存進(jìn)去 newNode->data = data; newNode->next = NULL; } return newNode; } //插入結(jié)點(diǎn) 參數(shù):插入哪個(gè)鏈表 插入結(jié)點(diǎn)的數(shù)據(jù)是多少 void insertNodeByHead(struct Node* headNode, struct student data) { //創(chuàng)建結(jié)點(diǎn) struct Node* newNode = createNode(data);//賦值 //使插入的結(jié)點(diǎn)接在 headNode后面 newNode->next = headNode->next; headNode->next = newNode; } //打印鏈表 也就是遍歷 void printfNode(struct Node* headNode) { struct Node* pMove = headNode->next; printf("\t\t\t\t\t學(xué)號(hào)\t姓名\t性別\t年齡\t電話\n"); while (pMove != NULL) { printf("\n\t\t\t\t\t%06s\t%s\t%s\t%hd\t%s", pMove->data.number, pMove->data.name, pMove->data.gender, pMove->data.age, pMove->data.tel); pMove = pMove->next; } printf("\n"); } //指定位置刪除 void deteleNodeAppoinNumber(struct Node* headNode, char number[12]) { struct Node* posNode = headNode->next; struct Node* posFrontNode = headNode; if (posNode == NULL) { printf("\t\t\t\t\t\t表中沒(méi)有參數(shù)\n"); } else { while (strcmp(posNode->data.number,number)!=0) {//如果不是的話 posFrontNode = posNode; posNode = posNode->next; if (posNode == NULL) {//找到最后一個(gè)也沒(méi)有找到 printf("\t\t\t\t\t\t表中沒(méi)有該學(xué)號(hào)的學(xué)生.\n"); return; } } //找到了 posFrontNode->next = posNode->next; free(posNode); printf("\t\t\t\t\t\tDone it!\n"); } } //更新已錄入內(nèi)容 void upDataNode(struct Node* headNode, char number[12]) { struct Node* posNode = headNode->next; struct Node* posFrontNode = headNode; struct student info; char chosen; if (posNode == NULL) { printf("\t\t\t\t\t\t無(wú)法修改,該表里面沒(méi)有內(nèi)容\n"); } else { while (strcmp(posNode->data.number,number)!=0) { posFrontNode = posNode; posNode = posNode->next; if (posNode == NULL) { printf("\t\t\t\t\t\t該表中沒(méi)有此學(xué)號(hào)的學(xué)生,無(wú)法修改\n"); return; } } while (true) { printf("\t\t\t\t\t\t請(qǐng)輸入要修改什么選項(xiàng):" "\n\t\t\t\t\t\t(1.學(xué)號(hào)\t2.姓名\t3.性別\t4.年齡\t5.電話)" "\n\t\t\t\t\t\t(如果不需要了選擇'Q')\n-->:"); chosen = enter(); fflush(stdin); switch (chosen) { case '1': printf("\t\t\t\t\t\t請(qǐng)輸入需要更改的學(xué)生信息:\n"); printf("\t\t\t\t\t\t請(qǐng)輸入學(xué)號(hào):"); scanf_s("%s", info.number,(int)sizeof(info.number)); strcpy_s(posNode->data.number, sizeof(posNode->data.number),info.number); printf("\t\t\t\t\t\tDone!\n"); break; case '2': printf("\t\t\t\t\t\t請(qǐng)輸入需要更改的學(xué)生信息:\n"); printf("\t\t\t\t\t\t請(qǐng)輸入姓名:"); scanf_s("%s", info.name, (int)sizeof(info.name)); fflush(stdin); strcpy_s(posNode->data.name, sizeof(posNode->data.name), info.name); printf("\t\t\t\t\t\tDone!\n"); break; case '3': printf("\t\t\t\t\t\t請(qǐng)輸入%s的性別:", posNode->data.name); scanf_s("%s", info.gender, (int)sizeof(info.gender)); fflush(stdin); strcpy_s(posNode->data.gender, sizeof(posNode->data.gender), info.gender); printf("\t\t\t\t\t\tDone!\n"); break; case '4': printf("\t\t\t\t\t\t請(qǐng)輸入%s的年齡:", posNode->data.name); scanf_s("%hd", &info.age); posNode->data.age = info.age; printf("\t\t\t\t\t\tDone!\n"); break; case '5': printf("\t\t\t\t\t\t請(qǐng)輸入%s的電話:", posNode->data.name); scanf_s("%s", info.tel, (int)sizeof(info.tel)); fflush(stdin); strcpy_s(posNode->data.tel, sizeof(posNode->data.tel), info.tel); printf("\t\t\t\t\t\tDone!\n"); break; case'Q': printf("\t\t\t\t\t\t退出此選項(xiàng)"); return; default: printf("\n\t\t\t\t\t\t請(qǐng)重新輸入(1~5 and (q quit ))\n"); break; } } } } //指定位置查看 void printfToInput(struct Node* headNode, char number[12]) { struct Node* posNode = headNode->next; struct Node* posFrontNode = headNode; if (posNode == NULL) { printf("\t\t\t\t\t\t該表為空\(chéng)n"); }else { while (strcmp(posNode->data.number,number)!=0) { posFrontNode = posNode; posNode = posNode->next; if (posNode == NULL) { printf("\t\t\t\t\t\t沒(méi)有找到該學(xué)生\n"); return; } } printf("\t\t\t\t\t\t學(xué)號(hào)\t姓名\t性別\t年齡\t電話\n"); printf("\n\t\t\t\t\t\t%06s\t%s\t%s\t%hd\t%s", posNode->data.number, posNode->data.name, posNode->data.gender, posNode->data.age, posNode->data.tel); } printf("\n"); } //讀文件 bool readInfoFromFile(struct Node* headNode, char* fileName) { struct student data; //打開文件 FILE* fp; fopen_s(&fp, fileName, "r"); if (fp == NULL) { fopen_s(&fp, fileName, "w+"); } //2操作 if (fp == NULL) { return EOF; } while (fscanf_s(fp, "%s\t%s\t%s\t%hd\t%s", data.number,(int)sizeof(data.number), data.name, (int)sizeof(data.name), data.gender, (int)sizeof(data.gender), &data.age, data.tel, (int)sizeof(data.tel)) != EOF) { insertNodeByHead(headNode, data); } //關(guān)閉文件 if (fp == NULL) { return EOF; } fclose(fp); return 0; } //寫文件 bool weiteInfoToFile(struct Node* headNode, char* fileName) { FILE* fp; fopen_s(&fp, fileName, "w"); struct Node* pMove = headNode->next; while (pMove) { if (fp == NULL) { return EOF; } fprintf_s(fp, "\n\t\t\t\t\t\t %s\t%s\t%s\t%hd\t%s", pMove->data.number, pMove->data.name, pMove->data.gender, pMove->data.age, pMove->data.tel); pMove = pMove->next; } if (fp == NULL) { return EOF; } fclose(fp); return 0; } //求鏈表長(zhǎng)度 int LengthNode(struct Node* headNode) { int lenth = 0; struct Node* pMove = headNode->next; while (pMove) { lenth++; pMove = pMove->next; } return lenth; } //格式化模式! void formattedLinkedList(struct Node* headNode) { struct Node* posNode ; if (headNode == NULL) { printf("\t\t\t\t\t\t該表為空\(chéng)n"); } else { while (headNode != NULL) { posNode = headNode->next; free(headNode); headNode = posNode; } } }
以上就是C語(yǔ)言實(shí)現(xiàn)學(xué)生管理系統(tǒng)的源碼分享的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言學(xué)生管理系統(tǒng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
c語(yǔ)言同名標(biāo)靶點(diǎn)自動(dòng)匹配算法實(shí)現(xiàn)實(shí)例代碼
這篇文章主要介紹了c語(yǔ)言同名標(biāo)靶點(diǎn)自動(dòng)匹配算法實(shí)現(xiàn)實(shí)例代碼,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02C++執(zhí)行shell命令的多種實(shí)現(xiàn)方法
在linux系統(tǒng)下,用C++程序執(zhí)行shell命令有多種方式,主要介紹了3中方法,具有一定的參考價(jià)值,感興趣的可以了解一下2021-11-11Species Tree 利用HashTable實(shí)現(xiàn)實(shí)例代碼
這篇文章主要介紹了Species Tree 利用HashTable實(shí)現(xiàn)實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-01-01C/C++中關(guān)于std::string的compare陷阱示例詳解
這篇文章主要給大家介紹了關(guān)于C/C++中關(guān)于std::string的compare陷阱的相關(guān)資料,文中先對(duì)C/C++中的std::string進(jìn)行了簡(jiǎn)單的介紹,通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之單鏈表存儲(chǔ)詳解
鏈表是一種物理存儲(chǔ)結(jié)構(gòu)上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過(guò)鏈表中的指針鏈接次序?qū)崿F(xiàn)的。本文將和大家一起聊聊C語(yǔ)言中單鏈表的存儲(chǔ),感興趣的可以學(xué)習(xí)一下2022-07-07C/C++高精度運(yùn)算(大整數(shù)運(yùn)算)詳細(xì)講解
高精度算法的本質(zhì)是把大數(shù)拆成若干固定長(zhǎng)度的塊,然后對(duì)每一塊進(jìn)行相應(yīng)的運(yùn)算,下面這篇文章主要給大家介紹了關(guān)于C/C++高精度運(yùn)算(大整數(shù)運(yùn)算)的相關(guān)資料,需要的朋友可以參考下2022-11-11