C語言實(shí)現(xiàn)學(xué)生管理系統(tǒng)的源碼分享
注意:沒有用到數(shù)據(jù)庫使用鏈表完成此系統(tǒng)!
多文件實(shí)現(xiàn)
正式開始
代碼都可以直接使用
不想看的,直接復(fù)制代碼塊里面的內(nèi)容就行!
我用的visual studio 2019 有些使用了 _s 如果是用別的編譯器,可以自行修改!


功能介紹
增,刪,改,查,退出,保存,以至于格式化!
1.錄入學(xué)生信息
2.查看錄入的學(xué)生信息(全部學(xué)生信息)
3.修改已錄入的學(xué)生信息(以學(xué)號)
4.刪除已錄入的學(xué)生信息(以學(xué)號)
5.保存信息到文件
6.指定查找(以學(xué)號)
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í)行完一次,就清屏一次,看起來比較舒服
}
system("pause");//不閃退!同上面作用
return 0;
}
//這里是用一個(gè)結(jié)構(gòu)體,到時(shí)用來儲(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請輸入你的選項(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請輸入要錄入的學(xué)生:學(xué)號\t姓名\t性別\t年齡\t電話\t\n");
printf("\t\t\t\t請輸入學(xué)號:");
scanf_s("%s",info.number, (unsigned int)sizeof(info.number));
printf("\t\t\t\t請輸入姓名:");
scanf_s("%s",info.name,(int)sizeof(info.name));
printf("\t\t\t\t請輸入%s的性別:",info.name);
scanf_s("%s",info.gender,(int)sizeof(info.gender));
printf("\t\t\t\t請輸入%s的年齡:", info.name);
scanf_s("%hd", &info.age);
printf("\t\t\t\t請輸入%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請輸入需要修改的學(xué)生學(xué)號:");
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請輸入需要?jiǎng)h除的學(xué)生學(xué)號:");
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請輸入想要查找的學(xué)生學(xué)號:");
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********此操作無法撤回!**********\n");
printf("\t\t\t\t(確認(rèn)請輸入[Y] 取消請選擇[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)請輸入[Y] 取消請選擇[q]):");
break;
}
break;
case 'q':
printf("\t\t\t\t正常退出系統(tǒng)成功\n");
exit(0);
break;
default:
printf("\n\t\t\t\t請重新輸入(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++) {//如果超過誤輸入超過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;
}重頭戲來咯
創(chuàng)建頭文件 myList.h
#pragma once
//前面沒有引用是應(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é)號
char tel[12];//電話號碼
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é)號\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表中沒有參數(shù)\n");
}
else {
while (strcmp(posNode->data.number,number)!=0) {//如果不是的話
posFrontNode = posNode;
posNode = posNode->next;
if (posNode == NULL) {//找到最后一個(gè)也沒有找到
printf("\t\t\t\t\t\t表中沒有該學(xué)號的學(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無法修改,該表里面沒有內(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該表中沒有此學(xué)號的學(xué)生,無法修改\n");
return;
}
}
while (true) {
printf("\t\t\t\t\t\t請輸入要修改什么選項(xiàng):"
"\n\t\t\t\t\t\t(1.學(xué)號\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請輸入需要更改的學(xué)生信息:\n");
printf("\t\t\t\t\t\t請輸入學(xué)號:");
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請輸入需要更改的學(xué)生信息:\n");
printf("\t\t\t\t\t\t請輸入姓名:");
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請輸入%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請輸入%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請輸入%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請重新輸入(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該表為空\n");
}else {
while (strcmp(posNode->data.number,number)!=0) {
posFrontNode = posNode;
posNode = posNode->next;
if (posNode == NULL) {
printf("\t\t\t\t\t\t沒有找到該學(xué)生\n");
return;
}
}
printf("\t\t\t\t\t\t學(xué)號\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;
}
//求鏈表長度
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該表為空\n");
}
else {
while (headNode != NULL) {
posNode = headNode->next;
free(headNode);
headNode = posNode;
}
}
}以上就是C語言實(shí)現(xiàn)學(xué)生管理系統(tǒng)的源碼分享的詳細(xì)內(nèi)容,更多關(guān)于C語言學(xué)生管理系統(tǒng)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
c語言同名標(biāo)靶點(diǎn)自動(dòng)匹配算法實(shí)現(xiàn)實(shí)例代碼
這篇文章主要介紹了c語言同名標(biāo)靶點(diǎn)自動(dòng)匹配算法實(shí)現(xiàn)實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02
C++執(zhí)行shell命令的多種實(shí)現(xiàn)方法
在linux系統(tǒng)下,用C++程序執(zhí)行shell命令有多種方式,主要介紹了3中方法,具有一定的參考價(jià)值,感興趣的可以了解一下2021-11-11
Species Tree 利用HashTable實(shí)現(xiàn)實(shí)例代碼
這篇文章主要介紹了Species Tree 利用HashTable實(shí)現(xiàn)實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-01-01
C/C++中關(guān)于std::string的compare陷阱示例詳解
這篇文章主要給大家介紹了關(guān)于C/C++中關(guān)于std::string的compare陷阱的相關(guān)資料,文中先對C/C++中的std::string進(jìn)行了簡單的介紹,通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
C語言數(shù)據(jù)結(jié)構(gòu)之單鏈表存儲(chǔ)詳解
鏈表是一種物理存儲(chǔ)結(jié)構(gòu)上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的。本文將和大家一起聊聊C語言中單鏈表的存儲(chǔ),感興趣的可以學(xué)習(xí)一下2022-07-07
C/C++高精度運(yùn)算(大整數(shù)運(yùn)算)詳細(xì)講解
高精度算法的本質(zhì)是把大數(shù)拆成若干固定長度的塊,然后對每一塊進(jìn)行相應(yīng)的運(yùn)算,下面這篇文章主要給大家介紹了關(guān)于C/C++高精度運(yùn)算(大整數(shù)運(yùn)算)的相關(guān)資料,需要的朋友可以參考下2022-11-11

