亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言實現(xiàn)學生管理系統(tǒng)的源碼分享

 更新時間:2022年07月27日 14:47:55   作者:草木之花  
這篇文章主要為大家詳細介紹了如何利用C語言實現(xiàn)學生管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

注意:沒有用到數(shù)據(jù)庫使用鏈表完成此系統(tǒng)!

多文件實現(xiàn)

正式開始

代碼都可以直接使用

不想看的,直接復(fù)制代碼塊里面的內(nèi)容就行!

我用的visual studio 2019   有些使用了 _s  如果是用別的編譯器,可以自行修改!

功能介紹

增,刪,改,查,退出,保存,以至于格式化!

1.錄入學生信息

2.查看錄入的學生信息(全部學生信息)

3.修改已錄入的學生信息(以學號)

4.刪除已錄入的學生信息(以學號)

5.保存信息到文件

6.指定查找(以學號)

7.隱藏選項(格式化鏈表--清空)

'q'退出系統(tǒng)

實現(xiàn)功能

創(chuàng)建源文件main.c 函數(shù)部分

//不一一介紹,不懂得去查就行,要學會Google!
#include "myList.h"  //引入自己寫得一個頭文件


//菜單界面
void menu(void);//函數(shù)聲明,菜單顯示函數(shù).
//按鈕互動
void keydown(struct Node* List);

int main(void) {
	
	struct  Node* List = createrList();//創(chuàng)建一個叫List的鏈表
	readInfoFromFile(List, "student.txt");//讀取在student.txt的文件  然后寫入List鏈表中


	while (true) {//一直循環(huán),知道用戶不用這個程序后,輸入'q' 退出程序!


		//顯示菜單
		menu(); 

		//然后讀取用戶輸入的值,進行操作!
		keydown(List);
		

		system("pause");//暫停程序用的
		system("cls");//執(zhí)行完一次,就清屏一次,看起來比較舒服
	}


	system("pause");//不閃退!同上面作用

	return 0;
}



//這里是用一個結(jié)構(gòu)體,到時用來儲存我們的提示信息
 //結(jié)構(gòu)體  把菜單要輸入的內(nèi)容都放進這里面
//功能
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)體 ,然后給它動態(tài)分配空間
// 									類型    						分配的大小
	struct hint_menu* chosen = (struct hint_menu*)malloc(sizeof(struct hint_menu));

	if (chosen) {//這里的if()可寫可不寫,我寫了是劃分代碼塊好看點

	//存入要輸入內(nèi)容
	//這里修改內(nèi)容即可  ,  想添加就去結(jié)構(gòu)體那先添加一下數(shù)組
	strcpy_s(chosen->one_menu, sizeof(chosen->one_menu), "1.錄入學生信息");
	strcpy_s(chosen->two_menu, sizeof(chosen->two_menu), "2.查看已錄入的學生信息");
	strcpy_s(chosen->three_menu, sizeof(chosen->three_menu), "3.修改已錄入的學生信息");
	strcpy_s(chosen->four_menu, sizeof(chosen->four_menu), "4.刪除已錄入的學生信息");
	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)");

	//其實這樣比較麻煩

	//你們可以直接定義一個字符串
	//char inset[20] = "1.錄入學生信息";  以此類推



	//輸出你存入的內(nèi)容
		printf("\n\n\n\n");
		printf("\t\t\t\t******************歡迎進入學生管理系統(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請輸入你的選項1~6  and  (q quit program):");

		fflush(stdout);//刷新輸出緩沖流
	}

	

}

                                                                                                                                //功能實現(xiàn)  ,按鈕互動                                                                      
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******************錄入學生信息******************\n");
		printf("\t\t\t\t請輸入要錄入的學生:學號\t姓名\t性別\t年齡\t電話\t\n");
		printf("\t\t\t\t請輸入學號:");

		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***************查看已錄入學生信息************\n");
		printfNode(List);
		printf("\t\t\t\t一共有%d個人\n", LengthNode(List));
		break;


	case '3':
		printf("\t\t\t\t******************修改學生信息*******************\n");
		printfNode(List);
		printf("\t\t\t\t請輸入需要修改的學生學號:");
		scanf_s("%s", num, (unsigned int)sizeof(num));
		upDataNode(List,num);
		break;


	case '4':
		printf("\t\t\t\t******************刪除學生信息*******************\n");
		printfNode(List);
		printf("\t\t\t\t請輸入需要刪除的學生學號:");
		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請輸入想要查找的學生學號:");
		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(確認請輸入[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(確認請輸入[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(); // 讀取單個字符
	fflush(stdin);//清空輸入緩存區(qū),防止讀取后,又讀取

	for (int i = 1; i <= 12; i++) {//如果超過誤輸入超過13次,強制退出程序
	
		if (input == '\n') {//如果讀取的一直是回車,就會執(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別在摁回車鍵了!最后一次機會了\n");
				continue;

			}
			else if (count == 13) {

				printf("\n\t\t\t\t\t\t程序已強制退出!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"


//定義一個學生類型的結(jié)構(gòu)體         
struct student {

	char name[20]; //姓名
	char gender[3];//性別
	char number[12]; //學號
	char tel[12];//電話號碼
	short age;//年齡

	//需要可以在添加

};

//結(jié)點
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é)點
struct Node* createNode(struct student data) {

	struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));

	if (newNode) {
		//把數(shù)據(jù)存進去
		newNode->data = data;
		newNode->next = NULL;
	}

	return newNode;	

}

//插入結(jié)點				參數(shù):插入哪個鏈表  插入結(jié)點的數(shù)據(jù)是多少
void insertNodeByHead(struct Node* headNode, struct student data) {
	//創(chuàng)建結(jié)點
	struct Node* newNode = createNode(data);//賦值
	//使插入的結(jié)點接在 headNode后面
	newNode->next = headNode->next;
	headNode->next = newNode;

}



//打印鏈表 也就是遍歷
void  printfNode(struct Node* headNode) {

	struct Node* pMove = headNode->next;

	printf("\t\t\t\t\t學號\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) {//找到最后一個也沒有找到

				printf("\t\t\t\t\t\t表中沒有該學號的學生.\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該表中沒有此學號的學生,無法修改\n");
				return;
			}

		}

		while (true) {
			printf("\t\t\t\t\t\t請輸入要修改什么選項:"
				"\n\t\t\t\t\t\t(1.學號\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請輸入需要更改的學生信息:\n");
				printf("\t\t\t\t\t\t請輸入學號:");
				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請輸入需要更改的學生信息:\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退出此選項");
				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沒有找到該學生\n");
				return;
			}
		
		}

		printf("\t\t\t\t\t\t學號\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語言實現(xiàn)學生管理系統(tǒng)的源碼分享的詳細內(nèi)容,更多關(guān)于C語言學生管理系統(tǒng)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • c語言同名標靶點自動匹配算法實現(xiàn)實例代碼

    c語言同名標靶點自動匹配算法實現(xiàn)實例代碼

    這篇文章主要介紹了c語言同名標靶點自動匹配算法實現(xiàn)實例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • C++執(zhí)行shell命令的多種實現(xiàn)方法

    C++執(zhí)行shell命令的多種實現(xiàn)方法

    在linux系統(tǒng)下,用C++程序執(zhí)行shell命令有多種方式,主要介紹了3中方法,具有一定的參考價值,感興趣的可以了解一下
    2021-11-11
  • C語言 socketpair用法案例講解

    C語言 socketpair用法案例講解

    這篇文章主要介紹了C語言 socketpair用法案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Species Tree 利用HashTable實現(xiàn)實例代碼

    Species Tree 利用HashTable實現(xiàn)實例代碼

    這篇文章主要介紹了Species Tree 利用HashTable實現(xiàn)實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • C/C++中關(guān)于std::string的compare陷阱示例詳解

    C/C++中關(guān)于std::string的compare陷阱示例詳解

    這篇文章主要給大家介紹了關(guān)于C/C++中關(guān)于std::string的compare陷阱的相關(guān)資料,文中先對C/C++中的std::string進行了簡單的介紹,通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。
    2017-11-11
  • C語言數(shù)據(jù)結(jié)構(gòu)之單鏈表存儲詳解

    C語言數(shù)據(jù)結(jié)構(gòu)之單鏈表存儲詳解

    鏈表是一種物理存儲結(jié)構(gòu)上非連續(xù)、非順序的存儲結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的。本文將和大家一起聊聊C語言中單鏈表的存儲,感興趣的可以學習一下
    2022-07-07
  • C/C++高精度運算(大整數(shù)運算)詳細講解

    C/C++高精度運算(大整數(shù)運算)詳細講解

    高精度算法的本質(zhì)是把大數(shù)拆成若干固定長度的塊,然后對每一塊進行相應(yīng)的運算,下面這篇文章主要給大家介紹了關(guān)于C/C++高精度運算(大整數(shù)運算)的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • C語言每日練習之字符串反轉(zhuǎn)

    C語言每日練習之字符串反轉(zhuǎn)

    這篇文章主要介紹了C語言字符串反轉(zhuǎn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-11-11
  • C語言實現(xiàn)繪制余弦曲線

    C語言實現(xiàn)繪制余弦曲線

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)繪制余弦曲線的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-01-01
  • c++超細致講解引用

    c++超細致講解引用

    引用(reference)就是C++對C語言的重要擴充。引用就是某一變量(目標)的一個別名,對引用的操作與對變量直接操作完全一樣
    2022-05-05

最新評論