C語言實訓

在這裏插入圖片描述



C語言實訓


2020春C語言實訓


下面直接上代碼, 我用的是Dev-c編譯的。 不知道在VS2017上會不會跑起來, Dev-c是肯定可以的。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//定義一個學生
typedef struct _Student {
	char name[20];
	int age;
	int id;
	int score;
} Student;
//節點
typedef struct _Node {
	Student stu;
	struct _Node* pNext;//指向下一個元素
} Node;
Node *g_pHead = NULL;//頭節點 用來保存頭節點地址
int main() {
	while(1) {
		welcome();
		char ch=getch();
		switch(ch) {
			case '1': {//錄入學生信息
				InputStudent();
				break;
			}
			case '2': {//打印學生信息
				PrintStudent();
				break;
			}
			case '3': {//保存學生信息
				SaveStudent();
				break;
			}
			case '4': {//讀取學生信息
				ReadStudent();
				break;
			}
			case '5': {//統計學生信息
				int num=CountStudent();
				printf("學生總人數爲%d個學生\n",num);
				break;
			}
			case '6': {//查找學生信息
				FindStudent();
				break;
			}
			case '7': {//修改學生信息
				ModifyStudent();
				break;
			}
			case '8': {//刪除學生信息
				DeleteStudet();
				break;
			}
			case '0': {//錄入學生信息
				printf("Bye-Bye");
				return 0;
			}
			default: {
				printf("輸入有誤請重新輸入!");
				system("pause"); 
				system("cls"); 
				break;
			}
			break;
		}


	}


	return 0;

}

//刪除學生信息
void DeleteStudet() {
	//其實刪除學生就是刪除一個節點;
	printf("請輸入要刪除學生的學號:");
	int num;
	scanf("%d",&num);


	Node* p1,*p2; //定義的臨時變量 代表頭的節點
	//先判斷查找的學生的節點是不是位於頭節點。
	if(g_pHead->stu.id==num) {
		p1=g_pHead;
		//釋放那一個頭
		free(g_pHead);
		g_pHead=g_pHead->pNext;
		//然後再釋放中間變量p1
		free(p1);
		return;
	}

	//不是頭節點的化
	Node* p=g_pHead;
	while(p->pNext!=NULL) {
		if(p->pNext!=num) {
			p2=p->pNext;
			p->pNext=p->pNext->pNext;
			free(p2);
			return;
		}
		p=p->pNext;
		if(p->pNext==NULL) {
			break;
		}
	}
	if(p->pNext==NULL) {
		printf("沒有找到這個學生!\n");
	}

}
//修改信息
void ModifyStudent() {
	printf("請輸入要修改學生的學號:");
	int Num;
	scanf("%d",&Num);
	Node* p=g_pHead;
	while(p!=NULL) { //strcmp比較字符串
		if(p->stu.id==Num) {
			printf("請輸入要修改學生的姓名:");
			scanf("%s",p->stu.name);
			printf("請輸入要修改學生的年齡:");
			scanf("%d",&p->stu.age);
			printf("請輸入要修改學生的成績:");
			scanf("%d",&p->stu.score);
			printf("修改成功\n");
			break;
		}
		p=p->pNext;
	}
	if(p->pNext==NULL) {
		printf("沒有找到該學生信息!\n");
	}

	printf("*********************************************************\n");
	system("pause");
	//添加清屏
	system("cls");
}




//查找學生信息
void FindStudent() {
	//因爲是要查看這個學生所以要返回這個學生的節點
	int nStuNum;
	char szName[20];
	printf("請輸入要查找學生的學號:");
	scanf("%d",&nStuNum);
	printf("請輸入要查找學生的姓名:");
	scanf("%s",szName);

	Node* p=g_pHead;
	while(p!=NULL) { //strcmp比較字符串
		if(p->stu.id==nStuNum||0==strcmp(p->stu.name,szName)) {
			break;
		}
		p=p->pNext;
	}

	if(p!=NULL) {
		printf("*學號\t*姓名\t*\t年齡\t*\t成績\t\t*\n");
		printf("*%d\t*%s\t*\t%d\t*\t%d\t\t*\n",
		       p->stu.id,
		       p->stu.name,
		       p->stu.age,
		       p->stu.score
		      );
	} else {
		printf("沒有找到!\n");
	}

	printf("*********************************************************\n");
	system("pause");
	//添加清屏
	system("cls");


}
//統計學生信息
int CountStudent() {
	int nCount=0;
	//遍歷循環
	Node* p=g_pHead;
	//因爲指針域最後爲空
	while(p!=NULL) {
		nCount++;
		p=p->pNext;
	}
	return nCount;
}
//讀取文件
void ReadStudent() {
	//打開文件
	FILE *fp=fopen("D:\\stuinfo.bat","r");
	if(fp==NULL) {
		printf("文件打開失敗\n");
		return;
	}
	//讀取文件
	Student stu;
	while(fread(&stu,1,sizeof(Student),fp)) { //如果不是結束文件就繼續讀
		//創建一個新的節點
		Node* pNewNode=(Node*)malloc(sizeof(Node));
		pNewNode->pNext=NULL;

		memcpy(pNewNode,&stu,sizeof(Student));

		if(g_pHead==NULL) {
			g_pHead	= pNewNode;
		} else {
			pNewNode->pNext=g_pHead;
			g_pHead=pNewNode;
		}
	}


	//關閉wenjian
	fclose(fp);
	printf("讀取成功\n");
	printf("*********************************************************\n");
	system("pause");
	//添加清屏
	system("cls");

}
//保存信息
void SaveStudent() {
	//打開文件
	FILE* fp=fopen("D:\\stuinfo.bat","w");
	if(fp==NULL) {
		printf("文件打開失敗\n");
		return;
	}
	Node* p=g_pHead;
	//只要不爲空就往下走
	while(p!=NULL) {
		fwrite(&p->stu,1,sizeof(Student),fp);
		p=p->pNext;//輸入完把下一個當作頭,
	}

	printf("文件保存成功\n");
	//關閉wenjian
	printf("*********************************************************\n");
	system("pause");
	//添加清屏
	system("cls");
}
void PrintStudent() {
	printf("*********************************************************\n");
	printf("\t歡迎學生使用高效學生成績管理系統v1.0\t\t*\n");
	printf("*********************************************************\n");
	printf("*學號\t*姓名\t*\t年齡\t*\t成績\t\t*\n");
	printf("*********************************************************\n");
	//遍歷鏈表
	Node* p=g_pHead;
	//只要不爲空就往下走
	while(p!=NULL) {
		//*       23      *       馬志勇  *       23      *       32*
		printf("*%d\t*%s\t*\t%d\t*\t%d\t\t*\n",
		       p->stu.id,
		       p->stu.name,
		       p->stu.age,
		       p->stu.score
		      );
		p=p->pNext;//輸入完把下一個當作頭,

	}
	printf("*********************************************************\n");
	system("pause");
	//添加清屏
	system("cls");

}
//錄入學生信息
//錄入學生信息
void InputStudent() {
	//創建一個新節點
	//保存內容
	Node* pNewNode=(Node*)malloc(sizeof(Node)); //分配內存
	pNewNode->pNext=NULL;
	if(g_pHead==NULL) {
		g_pHead	= pNewNode;
	} else {
		pNewNode->pNext=g_pHead;
		g_pHead=pNewNode;
	}



	printf("請輸入學生姓名:");
	scanf("%s",pNewNode->stu.name);//數據存到新的節點裏面
	printf("請輸入學生年齡:");
	scanf("%d",&pNewNode->stu.age);
	printf("請輸入學生學號:");
	scanf("%d",&pNewNode->stu.id);
	printf("請輸入學生成績:");
	scanf("%d",&pNewNode->stu.score);
	printf("錄入完成\n");
	system("pause");
	//添加清屏
	system("cls");
}
//歡迎界面
void welcome() {
	printf("*********************************************************\n");
	printf("*\t\t歡迎使用高校學生管理系統\t\t*\n");
	printf("*********************************************************\n");
	printf("*\t\t請選擇功能選項:\t\t\t\t*\n");
	printf("*********************************************************\n");
	printf("*\t\t1.錄入學生信息\t\t\t\t*\n");
	printf("*\t\t2.打印學生信息\t\t\t\t*\n");
	printf("*\t\t3.保存學生信息\t\t\t\t*\n");
	printf("*\t\t4.讀取學生信息\t\t\t\t*\n");
	printf("*\t\t5.統計學生信息\t\t\t\t*\n");
	printf("*\t\t6.查找學生信息\t\t\t\t*\n");
	printf("*\t\t7.修改學生信息\t\t\t\t*\n");
	printf("*\t\t8.刪除學生信息\t\t\t\t*\n");
	printf("*\t\t0.退出管理系統\t\t\t\t*\n");
	printf("*********************************************************\n");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章