亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言實現學生成績管理系統實戰教學

2020-01-26 13:34:03
字體:
來源:轉載
供稿:網友

趁著放假無事,開始用C語言開發一些小的項目,鞏固基礎知識的同時學習新的知識。

學生成績管理系統實現的功能有:成績錄入、學生成績查詢、刪除、修改、通過文件保存等。

開發這樣一個系統需要具備的知識:線性表(鏈表)、文件操作、排序(如果需要成績排序)。

開發環境為VS2015;在Linux下沒有conio.h的頭文件,需要修改與getch()函數相關的代碼。

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <conio.h> /*學生信息結構體*/typedef struct Node{	char Name[10];		//學生姓名	char ID[15];		//學生學號	int Score[3];	//三科成績(數學、英語、數據結構)	float Ave_Sco;	struct Node *next;}Lnode; void Display();  /*界面顯示函數*/void GetScore(Lnode *&h); /*成績錄入函數*/void PrintScore(Lnode *h); /*成績打印函數*/void ModifyScore(Lnode *h); /*成績修改函數*/void FindInf(Lnode *h);  /*查找信息*/void Delete(Lnode *h);  /*刪除函數*/void Quit(Lnode *h);  /*退出函數*/void SaveInf(Lnode *h);void LoadInf(Lnode *h); /*初始化鏈表*/void InitList(Lnode *&head) {	head = (Lnode *)malloc(sizeof(Lnode));	if (head == NULL)	{		printf("error!");		exit(1);	}	head->next = NULL;  //使頭節點指針域為空} int main(){	Lnode *ScoreList;  //建立成績鏈表,所有學生信息存放在此鏈表	int Function;	char flag; 	int t = 0;	InitList(ScoreList);	LoadInf(ScoreList); 	while (1)	{		Display();		printf("請選擇操作: ");		scanf("%d", &Function);		switch (Function)		{		case 1: while (1)		{			GetScore(ScoreList);			printf("是否繼續輸入 (Y/N)");			scanf("%s", &flag);			if (flag == 'N' || flag == 'n')break;		} 	system("cls"); break;		case 2: PrintScore(ScoreList);	_getch(); system("cls"); break;		case 3: ModifyScore(ScoreList);	system("cls"); break;		case 4: FindInf(ScoreList); _getch(); system("cls"); break;		case 5: Delete(ScoreList); _getch(); system("cls"); break;		case 6: Quit(ScoreList); break; 		default: printf("Error?。?! 請重新輸入:");			break;		} //switch結束	}		return 0;} /*系統界面顯示*/void Display(){	printf("/t/t**********************************************/n");	printf("/t/t*************歡迎使用成績管理系統*************/n");	printf("/t/t**********************************************/n");	printf("/t/t/t/t1、錄入成績/n");	printf("/t/t/t/t2、打印成績/n");	printf("/t/t/t/t3、修改成績/n");	printf("/t/t/t/t4、查找學生信息/n");	printf("/t/t/t/t5、刪除學生信息/n");	printf("/t/t/t/t6、退出系統/n");	printf("/n/n/n/n/n/n");} /*成績錄入*/void GetScore(Lnode *&h){	Lnode *p, *q = h;	char name[10], id[15];	int Math, English, Datastruct;	p = (Lnode *)malloc(sizeof(Lnode));		//為學生信息申請節點	printf("請依次輸入學生信息:/n");	printf("姓名 學號 數學 英語 數據結構/n");	scanf("%s %s %d %d %d", &name, &id, &Math, &English, &Datastruct); 	for (; q->next != NULL; q = q->next){;}  //移動到尾節點		strcpy(p->Name, name);	strcpy(p->ID, id);	p->Score[0] = Math;	p->Score[1] = English;	p->Score[2] = Datastruct;	p->Ave_Sco = ((float)((p->Score[0] + p->Score[1] + p->Score[2]) - 150)) / 30; 	p->next = NULL;	q->next = p;	q = p;} /*成績打印*/void PrintScore(Lnode *h){ 	Lnode *p = h->next;	printf("%-14s%-8s%-8s%-8s%-8s%-8s/n","排名", "學號", "姓名", "數學", "英語", "數據結構", "平均績點");	while (p != NULL)	{		printf("%-14s%-8s%-8d%-8d%-8d%.2f/n", p->ID, p->Name, p->Score[0], p->Score[1], p->Score[2], p->Ave_Sco);		p = p->next;	}} /*成績修改*/void ModifyScore(Lnode *h){	Lnode *p = h->next;	char name[10], id[15];	int Math, English, Datastruct;	printf("請輸入學生姓名:");	scanf("%s", name);	printf("請輸入學生學號:");	scanf("%s", id); 	while (p)	{		if (strcmp(p->Name, name)==0 && strcmp(p->ID, id)==0)		{			printf("當前學生信息:/n");			printf("%-14s%-8s%-8s%-8s%-8s/n", "學號", "姓名", "數學", "英語", "數據結構");			printf("%-14s%-8s%-8d%-8d%-8d/n", p->ID, p->Name, p->Score[0], p->Score[1], p->Score[2]);			printf("請輸入更正后的數學成績:");			scanf("%d", &Math);			printf("請輸入更正后的英語成績:");			scanf("%d", &English);			printf("請輸入更正后的數據結構成績:");			scanf("%d", &Datastruct);			p->Score[0] = Math;			p->Score[1] = English;			p->Score[2] = Datastruct;			break;		}		else		{			p = p->next;		}	}//while循環結束} /*信息查找*/void FindInf(Lnode *h){	Lnode *p = h->next;	char name[10], id[15];	printf("請輸入學生姓名:");	scanf("%s", name);	printf("請輸入學生學號:");	scanf("%s", id); 	while (p)	{		if (strcmp(p->Name, name) == 0 && strcmp(p->ID, id) == 0)		{			printf("當前學生信息:/n");			printf("%-14s%-8s%-8s%-8s%-8s/n", "學號", "姓名", "數學", "英語", "數據結構");			printf("%-14s%-8s%-8d%-8d%-8d/n", p->ID, p->Name, p->Score[0], p->Score[1], p->Score[2]);			break;		}		else		{			p = p->next;		}	}//while循環結束} /*刪除*/void Delete(Lnode *h){	Lnode *p = h, *q;	q = p->next;	char name[10], id[15];	printf("請輸入學生姓名:");	scanf("%s", name);	printf("請輸入學生學號:");	scanf("%s", id); 	while (q)	{		if (strcmp(q->Name, name) == 0 && strcmp(q->ID, id) == 0)		{			p->next = q->next;			free(q);  //刪除p節點					printf("刪除成功/n");			break;		}		else		{			p = p->next;			q = q->next;		}	}//while循環結束} /*退出系統*/void Quit(Lnode *h){	SaveInf(h);  //退出時保存信息	exit(0);} /*打開文件*/void LoadInf(Lnode *h){	Lnode *p = h;	Lnode *q;  //臨時變量 用于保存從文件中讀取的信息	FILE* file = fopen("./Information.dat", "rb");	if (!file)	{		printf("文件打開失敗!");		return ;	} 	/*		使用feof判斷文件是否為結束要注意的問題:			當讀取文件結束時,feof函數不會立即設置標志符為-1,而是			需要再讀取一次后,才會設置。所以要先讀一次。	*/	q = (Lnode *)malloc(sizeof(Lnode));	fread(q, sizeof(Lnode), 1, file);	while (!feof(file))  //一直讀到文件末尾	{		p->next = q;		p = q;		q = (Lnode *)malloc(sizeof(Lnode));		fread(q, sizeof(Lnode), 1, file);	} //while循環結束 	p->next = NULL;	fclose(file);} /*保存信息到文件中*/void SaveInf(Lnode *h){	Lnode *p = h->next;	int flag;	FILE* file = fopen("./Information.dat", "wb");	if (!file)	{		printf("文件打開失敗!");		return;	}	while (p != NULL)	{		flag = fwrite(p, sizeof(Lnode), 1, file);  //將p的內容寫到文件中		if (flag != 1)		{			break;		}		p = p->next;	}	fclose(file);}

雖然是很簡單的小項目,還是有很多問題。

一:鏈表相關

在寫成績錄入和成績打印功能時,發現始終只能保存(沒加入文件保存)最后一個數據,確定鏈表的相關操作沒有問題,仔細判斷邏輯關系后,發現是每次在頭節點傳到GetScore()函數,為新節點申請內存后,直接將數據保存在了新申請的節點里面,沒有將鏈表移動到尾節點,導致每次錄入成績,都會覆蓋前一次輸入的數據。解決辦法是鏈表傳到函數后,先移動到最后一個節點,將新申請的節點掛接在最后一個節點之后。

/*成績錄入*/void GetScore(Lnode *&h){	Lnode *p, *q = h;	char name[10], id[15];	int Math, English, Datastruct;	p = (Lnode *)malloc(sizeof(Lnode));		//為學生信息申請節點	printf("請依次輸入學生信息:/n");	printf("姓名 學號 數學 英語 數據結構/n");	scanf("%s %s %d %d %d", &name, &id, &Math, &English, &Datastruct); 	for (; q->next != NULL; q = q->next){;}  //移動到尾節點	//保存數據	strcpy(p->Name, name);	strcpy(p->ID, id);	p->Score[0] = Math;	p->Score[1] = English;	p->Score[2] = Datastruct;	p->Ave_Sco = ((float)((p->Score[0] + p->Score[1] + p->Score[2]) - 150)) / 30;        //始終指向最后一個節點	p->next = NULL;	q->next = p;	q = p;}

二、文件操作

用文件保存遇到的問題主要是每次打印數據時除正常數據外,始終多一行亂碼。判斷方法是while(!feof(file))。排除錯誤時確定了兩種可能性:多保存了一行;多讀取了一行。經過某度feof()與EOF的關系后,確定是多讀取了一行數據。

用feof()函數進行文件尾判斷時,當文件已經到達尾部后,還需要在讀取一次后,feof()函數才會返回-1,所以會出現多讀一次的情況;解決辦法時,在循環讀取之前先將第一個數據讀取出來,然后在正常讀取。即注意多讀一次的問題。

/*打開文件*/void LoadInf(Lnode *h){	Lnode *p = h;	Lnode *q;  //臨時變量 用于保存從文件中讀取的信息	FILE* file = fopen("./Information.dat", "rb");	if (!file)	{		printf("文件打開失?。?);		return ;	} 	/*		使用feof判斷文件是否為結束要注意的問題:			當讀取文件結束時,feof函數不會立即設置標志符為-1,而是			需要再讀取一次后,才會設置。所以要先讀一次。	*/	q = (Lnode *)malloc(sizeof(Lnode));	fread(q, sizeof(Lnode), 1, file);	while (!feof(file))  //一直讀到文件末尾	{		p->next = q;		p = q;		q = (Lnode *)malloc(sizeof(Lnode));		fread(q, sizeof(Lnode), 1, file);	} //while循環結束	p->next = NULL;	fclose(file);}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩一区二区免费在线观看| 欧美综合第一页| 日韩电影免费在线观看| 日韩av免费看网站| 久久91超碰青草是什么| 国产亚洲欧美另类中文| 亚洲男女自偷自拍图片另类| 国产精品99免视看9| 色老头一区二区三区| 高跟丝袜欧美一区| 亚洲国产成人久久综合| 日韩成人在线视频| 国产精品99久久久久久久久| 久久亚洲综合国产精品99麻豆精品福利| 欧美亚洲国产另类| 浅井舞香一区二区| 91免费精品国偷自产在线| 欧美激情一区二区三区高清视频| 九九久久国产精品| 亚洲一品av免费观看| 欧美多人爱爱视频网站| 亚洲国产成人91精品| 日本精品性网站在线观看| 欧美日韩国产影院| 欧美xxxx14xxxxx性爽| 日韩成人中文字幕| 久久精品视频va| 亚洲free性xxxx护士白浆| 国产精品人成电影| www.亚洲免费视频| 亚洲免费视频观看| 国产精品久久久久久久app| 一区二区三区国产视频| 亚洲第一视频在线观看| 亚洲欧洲在线免费| 国产日韩在线看| 欧美影院成年免费版| 亚洲桃花岛网站| 17婷婷久久www| 国产日韩换脸av一区在线观看| 91在线视频一区| 日韩视频免费看| 青青在线视频一区二区三区| 精品中文字幕在线| 伊人久久五月天| 国产精品7m视频| 国产精品高清在线观看| 国产精品白丝jk喷水视频一区| 91精品国产色综合| 国产精品久久久久免费a∨大胸| 成人欧美一区二区三区在线湿哒哒| 成人妇女淫片aaaa视频| 91香蕉嫩草神马影院在线观看| 亚洲福利视频久久| 欧美精品videos性欧美| 欧美极品少妇xxxxx| 国产成人在线亚洲欧美| 欧美性做爰毛片| 欧美性猛交xxxxx水多| 在线看国产精品| 国产不卡av在线免费观看| 黑人精品xxx一区| 欧美亚洲午夜视频在线观看| 精品久久中文字幕久久av| 亚洲最大成人免费视频| 国产精品成人久久久久| 精品久久久久久国产| 久久久999精品免费| 亚洲综合一区二区不卡| 福利一区福利二区微拍刺激| 欧美日韩一区二区在线| 隔壁老王国产在线精品| 亚洲在线视频福利| 国产亚洲福利一区| 国产亚洲免费的视频看| 日韩电影中文字幕一区| 亚洲乱码一区二区| 午夜精品视频在线| 欧美激情乱人伦| 亚洲美女自拍视频| 26uuu另类亚洲欧美日本一| 久久精品国产欧美亚洲人人爽| 亚洲综合精品一区二区| 国产精品视频精品| 久久亚洲私人国产精品va| 国产主播喷水一区二区| 亚洲天堂av图片| 国产精品网址在线| 国产精品久久999| 91高潮在线观看| 亚洲精品色婷婷福利天堂| 亚洲午夜未满十八勿入免费观看全集| 日韩三级成人av网| 91高清免费在线观看| 91精品久久久久久久久中文字幕| 日韩欧美国产成人| 亚洲精品福利免费在线观看| 26uuu亚洲伊人春色| 欧美成人第一页| 最近2019年好看中文字幕视频| 国产综合在线观看视频| 亚洲第一区第二区| 国产精品av在线| 国产精品欧美亚洲777777| 狠狠色香婷婷久久亚洲精品| 亚洲综合小说区| 欧美大全免费观看电视剧大泉洋| 中文字幕久久亚洲| 久久久久久免费精品| 高潮白浆女日韩av免费看| 欧美国产日本高清在线| 91国内揄拍国内精品对白| 欧美国产激情18| 精品久久久视频| 成人免费xxxxx在线观看| 91精品视频专区| 精品国产91久久久久久| 国产在线视频2019最新视频| 97视频在线免费观看| 国产精品三级美女白浆呻吟| 国产精品免费小视频| 5278欧美一区二区三区| 欧美在线一区二区视频| 色综合天天狠天天透天天伊人| 国产精品白丝jk喷水视频一区| 日韩a**中文字幕| 国产成人精品免高潮费视频| 亚洲国产精品中文| 亚洲精品乱码久久久久久按摩观| 综合av色偷偷网| 久久理论片午夜琪琪电影网| 日韩欧美a级成人黄色| 性欧美亚洲xxxx乳在线观看| 在线性视频日韩欧美| 国产视频在线一区二区| 亚洲男人天堂网站| 国产精品视频久久久| 久久久精品国产网站| 精品爽片免费看久久| 亚洲天堂第二页| 久久久精品免费视频| 亚洲摸下面视频| 91亚洲va在线va天堂va国| 国产视频999| 亚洲综合一区二区不卡| 日韩欧美中文在线| 国产欧美 在线欧美| 精品久久久久久亚洲精品| 国产在线播放91| 日韩欧美在线国产| 亚洲欧洲国产伦综合| 色偷偷偷亚洲综合网另类| 亚洲第一av网| 欧美日韩另类字幕中文| 在线丨暗呦小u女国产精品| 亚洲天堂网在线观看| 日韩欧美一区二区三区久久| 精品福利一区二区| 欧洲成人午夜免费大片| 成人av资源在线播放| 国产经典一区二区| 欧美高清理论片| 欧美成人免费一级人片100| 91在线观看免费高清完整版在线观看|