第一篇:學(xué)生檔案管理系統(tǒng)c語言[小編推薦]
學(xué)生檔案管理系統(tǒng) 內(nèi)容與要求
【問題描述】
設(shè)計(jì)一個(gè)學(xué)生檔案管理系統(tǒng),對(duì)學(xué)生檔案進(jìn)行管理。每個(gè)學(xué)生的信息包括:學(xué)號(hào)、姓名、性別、出生年月、是否黨員、手機(jī)號(hào)碼、家庭住址、各門課成績(jī)(每門課包括課程名與成績(jī))。系統(tǒng)要求包含如下功能:
1。創(chuàng)建功能:初始輸入每個(gè)學(xué)生的信息(學(xué)號(hào)、姓名、性別、出生年月、是否黨員、手機(jī)號(hào)碼、家庭住址)并保存。
2。顯示功能:顯示全部學(xué)生的信息(包括各門課的成績(jī))。
3。輸入某課程成績(jī)功能:按學(xué)號(hào)、成績(jī)輸入選修某門課的所有學(xué)生的成績(jī)(說明:并不是所有學(xué)生都選同一門課,每個(gè)學(xué)生選的課可不一樣)。
4。統(tǒng)計(jì)平均成績(jī)功能:計(jì)算每個(gè)學(xué)生的平均成績(jī)。5。查找功能:按姓名或?qū)W號(hào)查找學(xué)生記錄,并顯示。6。排序功能:按學(xué)號(hào)或平均成績(jī)進(jìn)行排序,并顯示。7。插入功能:插入一條學(xué)生記錄。8。刪除功能:刪除指定學(xué)生的記錄。
要求提供一個(gè)界面來調(diào)用各個(gè)功能,界面應(yīng)盡可能清晰美觀?!揪唧w要求】
1。系統(tǒng)應(yīng)以菜單方式工作,舉例如下:
程序運(yùn)行后顯示如下主界面:
****************************************
1--------------創(chuàng)建
2--------------顯示
3--------------輸入成績(jī)
4--------------統(tǒng)計(jì)成績(jī)
5--------------查找
6--------------排序
7--------------插入
8--------------刪除
9--------------退出
****************************************
通過選擇1-9來確定要做哪一個(gè)操作。
若選5,則出現(xiàn)如下界面:
****************************************
1----------按學(xué)號(hào)查詢
2----------按姓名查詢
**************************************** 2。要求采用順序存儲(chǔ)結(jié)構(gòu)存儲(chǔ)學(xué)生基本信息,每個(gè)學(xué)生的信息是一個(gè)數(shù)據(jù)元素,而其中每個(gè)學(xué)生各門課的成績(jī)用單鏈表存儲(chǔ)結(jié)構(gòu)存儲(chǔ)。【實(shí)現(xiàn)提示】
順序表每個(gè)數(shù)據(jù)元素包括學(xué)號(hào)、姓名、性別、出生年月、是否黨員、手機(jī)號(hào)碼、家庭住址、成績(jī)鏈表的頭指針;成績(jī)鏈表每個(gè)結(jié)點(diǎn)的數(shù)據(jù)域包括課程名與成績(jī)。
【測(cè)試數(shù)據(jù)】
自己設(shè)計(jì),報(bào)告上要求給出各種情況的數(shù)據(jù)測(cè)試結(jié)果?!緦?shí)現(xiàn)說明】
有能力的同學(xué)在完成上述功能的基礎(chǔ)上,可以充分發(fā)揮自己的想象力增加并完善該系統(tǒng)的功能,如采用文件來存儲(chǔ)學(xué)生信息,增加輸出某門課的成績(jī)記錄單功能等等。總體設(shè)計(jì)
一、設(shè)計(jì)步驟
分析問題,給出數(shù)學(xué)模型,設(shè)計(jì)相應(yīng)的數(shù)據(jù)結(jié)構(gòu)。
(1)按照課程要求,可以將學(xué)生基本信息以順序存儲(chǔ)方式存放在一數(shù)組中,而學(xué)生基本信息由于有多個(gè)項(xiàng)目,可以將單個(gè)學(xué)生的信息以結(jié)構(gòu)體的方式存儲(chǔ);
(2)輸入的成績(jī)可以在每個(gè)通過在結(jié)構(gòu)體中加入一鏈表來實(shí)現(xiàn)存儲(chǔ)多門課程的目的,為避免每插入一門課程就需要遍歷一次鏈表,此處應(yīng)以隊(duì)列的方式來存儲(chǔ)課程;
(3)統(tǒng)計(jì)成績(jī)計(jì)算出成績(jī)之后為方便后續(xù)的顯示平均成績(jī)及排序須在每個(gè)學(xué)生的信息中再加入平均成績(jī)一項(xiàng); 二.功能模塊及調(diào)用關(guān)系說明
(1)創(chuàng)建基本信息:通過fopen()以讀的方式打開“basedata.dat”文件,再用fscanf()將文檔中的基本信息存儲(chǔ)到p1數(shù)組中;
(2)顯示學(xué)生信息:可以通過遍歷數(shù)組p1來進(jìn)行輸出,若基本信息為空,則提示先創(chuàng)建信息,若學(xué)生課程信息未存入則不進(jìn)行顯示,若課程信息已存入,則在遍歷數(shù)組的基礎(chǔ)上再對(duì)每個(gè)數(shù)組元素中的鏈表進(jìn)行遍歷輸出;
(3)輸入成績(jī):先輸入課程代號(hào),通過strcmp()字符串比較判斷再同(1)打開相應(yīng)文件并將信息寫入一中間變量里,再通過中間變量中寫入的學(xué)號(hào)查找到該學(xué)生,并將這條課程信息用EnQueue()存到該學(xué)生的課程鏈表中,若該課程已存在與該學(xué)生的課程鏈表中則不進(jìn)行重復(fù)寫入,其中用isExitcNo()判斷是否存在該課程;
(4)統(tǒng)計(jì)成績(jī):通過遍歷每個(gè)學(xué)生的課程鏈表計(jì)算并存儲(chǔ)每個(gè)學(xué)生的平均成績(jī),若未錄入基本信息則提示先創(chuàng)建基本信息,若課程鏈表為空,則提示先輸入成績(jī);
(5)查找:1.按學(xué)號(hào)查詢:建立一個(gè)for循環(huán),通過輸入的學(xué)號(hào)找到相應(yīng)的學(xué)生,并輸出該學(xué)生的信息,2.按姓名查詢:建立一個(gè)for循壞,通過輸入的姓名找到相應(yīng)學(xué)生,并輸出該學(xué)生的信息,若并未創(chuàng)建基本信息,則提示先創(chuàng)建基本信息;
(6)排序:1.按學(xué)號(hào)排序:先將學(xué)號(hào)用sscanf()轉(zhuǎn)化為int型,再用插入排序法對(duì)數(shù)組進(jìn)行排序;
2.按平均成績(jī)排序:利用插入排序法對(duì)數(shù)組元素中的平均值比較從而對(duì)數(shù)組進(jìn)行排序;
若并未創(chuàng)建基本信息,則提示先創(chuàng)建基本信息;(7)插入:
先輸入一個(gè)學(xué)號(hào),用isNo()判斷輸入的是否為數(shù)字,若輸入的并不為數(shù)字,則提示其重新輸入,輸入學(xué)號(hào)后,若該學(xué)號(hào)已經(jīng)存在,則提示重新輸入;
在學(xué)號(hào)輸入正確無誤的前提下,再輸入姓名,再輸入性別,用isGender()判斷輸入的是否是性別,若不為性別,則提示重新輸入,再輸入出生日期,用isNo判斷是否為數(shù)字,若不為數(shù)字則提示重新輸入,再輸入是否為黨員用isYN()判斷格式是否正確,若格式錯(cuò)誤則提示重新輸入,再輸入手機(jī)號(hào)碼,并用isNo()判斷是否為數(shù)字,若不為數(shù)字則提示重新輸入,最后再輸入地址; 學(xué)生基本信息輸入完成后再輸入課程信息,課程信息記錄到數(shù)組元素的課程鏈表中;
輸入完成后再用InsertFile()將學(xué)生信息寫回到學(xué)生基本信息文檔及課程文檔中;
(8)刪除:
若學(xué)生信息為空,則提示先創(chuàng)建學(xué)生信息,學(xué)生信息不為空,則輸入學(xué)號(hào),再通過輸入的學(xué)號(hào)查找到相應(yīng)的學(xué)生并刪除數(shù)組中該條學(xué)生信息,若無法找到該學(xué)號(hào)則提示無該學(xué)生,要求其重新輸入;
刪除成績(jī)后再用reWFile()將數(shù)組中的信息重新寫回到學(xué)生基本信息文檔及課程文檔中;
(9)退出程序。詳細(xì)設(shè)計(jì) 1)實(shí)現(xiàn)概要設(shè)計(jì)中定義數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu) struct student{ char No[10];
char name[10];
//學(xué)生信息 //學(xué)生學(xué)號(hào) //學(xué)生姓名
char gender[5];//學(xué)生性別
char brithday[8];//學(xué)生生日
char tpartym[5];//是否為黨員
char phoneNo[15];//手機(jī)號(hào)碼
char addr[20];
//學(xué)生地址
courses *front;//學(xué)生課程隊(duì)列的隊(duì)首
courses *rear;int average;} struct courses{ char cNo[15];char sNo[10];int degree;
//課程信息 //課程代號(hào) //課程中學(xué)生學(xué)號(hào) //相應(yīng)學(xué)號(hào)學(xué)生的成績(jī) //學(xué)生課程隊(duì)列的隊(duì)首 //學(xué)生所有課程的平均成績(jī)
courses *next;} 2)函數(shù)的算法實(shí)現(xiàn)
(1)InitQueue(student &Q)函數(shù)的實(shí)現(xiàn)(初始化隊(duì)列)
形參為隊(duì)列名稱;在函數(shù)中將用new生成新的節(jié)點(diǎn),并將隊(duì)頭和對(duì)位指向此節(jié)點(diǎn),再將頭節(jié)點(diǎn)的指針域置空。
(2)EnQueue(student &Q,courses e)入隊(duì)函數(shù)的實(shí)現(xiàn)
形參一個(gè)為隊(duì)列名稱,另一個(gè)為插入元素;先為入隊(duì)元素分配節(jié)點(diǎn)空間并用指針p指向該節(jié)點(diǎn),再將節(jié)點(diǎn)的數(shù)據(jù)域置為e然后將新節(jié)點(diǎn)插入到隊(duì)尾并修改隊(duì)尾指針,使隊(duì)尾指針指向下一個(gè)節(jié)點(diǎn)。
(3)GetLine(student Q)輸出隊(duì)列函數(shù)的實(shí)現(xiàn)
形參為隊(duì)列名稱;先設(shè)一個(gè)中間變量r作為節(jié)點(diǎn)指針,當(dāng)對(duì)首與隊(duì)尾相等時(shí),即隊(duì)列為空,則提示課程信息為空,當(dāng)對(duì)列不為空時(shí),將r賦值為隊(duì)首所指向的指針域,在while循環(huán)中當(dāng)r不為空時(shí)分別輸出課程名稱及對(duì)應(yīng)課程的成績(jī),再將r指向下一個(gè)節(jié)點(diǎn),當(dāng)r為空時(shí)即遍歷對(duì)列完成則結(jié)束循環(huán)。
(4)CalculateAve(student &Q)計(jì)算平均成績(jī)的實(shí)現(xiàn) 形參為隊(duì)列名稱,即為單個(gè)數(shù)組元素;設(shè)置一個(gè)變量n并置初值為0用于課程數(shù)的計(jì)數(shù),設(shè)一個(gè)中間變量r作為節(jié)點(diǎn)指針,將r賦值為隊(duì)首所指向的指針域,在while循環(huán)中當(dāng)r不為空時(shí)將每門課程成績(jī)相加,加完所有成績(jī)之后再將總成績(jī)除以課程數(shù)并將所得平均成績(jī)賦值給數(shù)組元素。
(5)isExitcNo(student Q,char *cNo)判斷該課程是否存在于數(shù)組元素隊(duì)列中
設(shè)一個(gè)flag做為標(biāo)志值設(shè)置初值為0,在for循環(huán)中對(duì)每個(gè)數(shù)組元素進(jìn)行遍歷,在循環(huán)過程中用strcmp()將該數(shù)組元素中已有課程代號(hào)與輸入課程代號(hào)進(jìn)行比較,若有相等的課程,則將flag值置為1,并直接結(jié)束循環(huán),最后返回flag(6)isNo(char *No)判斷是否為數(shù)字
若字符串全為數(shù)字,則函數(shù)返回1,若字符串中有一個(gè)不為數(shù)字,則返回0.(7)isGender(char *gender)判斷是否為性別
若字符串判斷為“男“或”女“,則函數(shù)返回1,反之則返回0.(8)InsertFile(student Q)插入文件
將文件用fopern()以添加的方式打開,用fprintf()將插入的信息寫入文件(9)reWFile(student *p1,int i)寫回文件
將文件用fopen()以寫的方式打開,用fprintf()將刪除信息后的數(shù)組重新寫回到文件中
3)創(chuàng)建基本信息的算法實(shí)現(xiàn)
先用fopen()以讀方式打開學(xué)生基本信息文檔,并將返回地址賦值給文件指針型變量fp,若打開文件錯(cuò)誤則提示文件打開錯(cuò)誤,用feof()判斷是否為文件結(jié)尾,用fscanf()將文檔中讀出的信息賦值分別賦值給p1[i]中的各項(xiàng)數(shù)據(jù)項(xiàng),用fscanf()!=EOF防止讀入文件中的回車空白行,讀入信息后用isExistNo()判斷該學(xué)號(hào)是否已經(jīng)存在,若存在則不讀入該行信息,若不重復(fù)則用InitQueue()初始化每個(gè)數(shù)組元素的隊(duì)列,讀完所有信息后提示創(chuàng)建成功并用fclosef()關(guān)閉前面打開的基本信息文件; 4)顯示學(xué)生信息的算法實(shí)現(xiàn)
先通過判斷數(shù)組長(zhǎng)度i來判斷學(xué)生信息數(shù)組是否為空,若i為0,即數(shù)據(jù)為空,則提示“信息為空,請(qǐng)先創(chuàng)建基本信息“,若數(shù)據(jù)不為空,則利用for循環(huán)對(duì)每個(gè)數(shù)組元素的數(shù)據(jù)信息進(jìn)行輸出,分別輸出p1[j].No,p1[j].name,p1[j].gender p1[j].brithday,p1[j].phoneNo,p1[j].tpartym,p1[j].addr,再在每次循環(huán)中用GetLine(p1[j])對(duì)該學(xué)生的各門課程名及成績(jī)進(jìn)行輸出;若還未存儲(chǔ)成績(jī)則 不對(duì)課程成績(jī)進(jìn)行輸出; 5)輸入成績(jī)的算法實(shí)現(xiàn) 先通過判斷數(shù)組長(zhǎng)度i來判斷學(xué)生信息數(shù)組是否為空,若i為0,即數(shù)據(jù)為空,則提示“請(qǐng)先創(chuàng)建基本信息”,若數(shù)據(jù)不為空,先定義一個(gè)courses類型的中間變量e,并將e的next指針域設(shè)置為空,之后輸入課程代號(hào),將輸入的課程代號(hào)存入e.cNo中,在通過strcmp(_)去與已知的課程代號(hào)相比較,找到滿足條件的課程代號(hào)后用fopen()打開對(duì)應(yīng)的課程文件并將文件地址賦值給fp1,打開文件后用fscanf()將文件中的數(shù)據(jù)賦值給e.sNo,e.degree,賦值完成后通過e.sNo找到對(duì)應(yīng)的數(shù)組元素,并用isExitcNo()判斷該門課程是否存在于該數(shù)組元素的隊(duì)列中,若不存在則用EnQueue(p1[j],e)將該課程的信息存入數(shù)組元素的隊(duì)列中,若已經(jīng)存在該門課程的信息,則不將該課程信息存入數(shù)組元素的隊(duì)列中,存入所有成績(jī)完成后用fclose(fp1)關(guān)閉相應(yīng)的文件; 6)統(tǒng)計(jì)成績(jī)的算法實(shí)現(xiàn)
先通過判斷數(shù)組長(zhǎng)度i來判斷學(xué)生信息數(shù)組是否為空,若i為0,即數(shù)據(jù)為空,則提示“請(qǐng)先創(chuàng)建基本信息“,若數(shù)據(jù)不為空,則通過建立一個(gè)for循環(huán),在循環(huán)過程中先判斷成績(jī)信息是否為空,若成績(jī)信息為空則提示先輸入成績(jī),反之則用CalculateAve(p1[j])計(jì)算每個(gè)學(xué)生所有課程成績(jī)的平均值,并將函數(shù)返回值賦值給p1[j].average;7)查找學(xué)生信息的算法實(shí)現(xiàn)
先通過判斷數(shù)組長(zhǎng)度i來判斷學(xué)生信息數(shù)組是否為空,若i為0,即數(shù)據(jù)為空,則提示“請(qǐng)先創(chuàng)建基本信息”,若數(shù)據(jù)不為空,通過輸入一選擇值來選擇進(jìn)行學(xué)號(hào)搜索或按姓名搜索,若該值為1,先輸入一個(gè)學(xué)號(hào)存儲(chǔ)于r中,再通過建立一個(gè)for循環(huán)來對(duì)數(shù)組進(jìn)行遍歷(設(shè)立一個(gè)flag值用于判斷是否能找到該條學(xué)生信息,flag初值定為0),每次循環(huán)將數(shù)組元素中的學(xué)號(hào)與r進(jìn)行比較,若學(xué)號(hào)相等,則對(duì)該學(xué)生的信息進(jìn)行輸出,并將flag賦值為1,若結(jié)束循環(huán)后flag值仍為0,即數(shù)組中無該條學(xué)生的信息,則提示“查無此人”
若選擇值為2則先輸入一個(gè)姓名存儲(chǔ)于r中,再通過建立一個(gè)for循環(huán)來對(duì)數(shù)組進(jìn)行遍歷(設(shè)立一個(gè)flag值用于判斷是否能找到該條學(xué)生信息,flag初值定為0),每次循環(huán)將數(shù)組元素中的姓名與r進(jìn)行比較,若相等,則對(duì)該學(xué)生的信息進(jìn)行輸出,并將flag賦值為1,若結(jié)束循環(huán)后flag值仍為0,即數(shù)組中無該條學(xué)生的信息,則提示“查無此人” 8)排序的算法實(shí)現(xiàn)
先通過判斷數(shù)組長(zhǎng)度i來判斷學(xué)生信息數(shù)組是否為空,若i為0,即數(shù)據(jù)為空,則提示“請(qǐng)先創(chuàng)建基本信息“,若數(shù)據(jù)不為空,則通過輸入一選擇值來選擇進(jìn)行學(xué)號(hào)排序或按平均成績(jī)排序,若該值為1,則進(jìn)行按學(xué)號(hào)排序,因此處的學(xué)號(hào)為字符型,故無法直接進(jìn)行大小比較,因此需用sscanf()將字符型變量轉(zhuǎn)化為int型變量再進(jìn)行大小比較,此處以插入法排序?qū)?shù)組進(jìn)行排序
若選擇值為2,則通過比較數(shù)組中平均值的大小對(duì)數(shù)組進(jìn)行排序,若成績(jī)信息為空則提示先輸入成績(jī),若不為空則以插入法排序?qū)?shù)組進(jìn)行排序;
總結(jié)
1.在一周的時(shí)間里,不斷地對(duì)程序及各模塊進(jìn)行修改、編譯、調(diào)試、運(yùn)行,其間遇到很 多問題,但通過自己的努力及詢問同學(xué)的幫助都一一解決了。2.程序是寫出來的,不是想出來的。開始階總是在想,總感覺很困難做不了,但是真正 投入其中之后才發(fā)覺其實(shí)只要用心,只要有克服一切的勇氣和信心就可以把程序做好,錯(cuò)誤總是越改越少的。
3.要用愉悅的心情去做,從編程的過程中體會(huì)樂趣,興趣是最好的老師就是這么回事
4.要善于利用編程軟件的調(diào)試功能調(diào)試自己的程序,通過程序的調(diào)試我發(fā)現(xiàn)并解決了許多問題
5.通過課程設(shè)計(jì),自己通過系統(tǒng)分析、系統(tǒng)設(shè)計(jì)、編程調(diào)試,寫實(shí)驗(yàn)報(bào)告等環(huán)節(jié),進(jìn)一 步掌握應(yīng)用系統(tǒng)設(shè)計(jì)的方法和步驟,靈活運(yùn)用并深刻理解典型數(shù)據(jù)結(jié)構(gòu)在軟件開發(fā)中的應(yīng)用。
6.通過實(shí)踐,我也發(fā)現(xiàn)我的很多不足之處,首先是自己平時(shí)上機(jī)練習(xí)太少,知識(shí)的積壓給編程帶來了一定的麻煩。另外我對(duì)數(shù)據(jù)結(jié)構(gòu)的一些標(biāo)準(zhǔn)庫函數(shù)還不太了解,如開始進(jìn)入系統(tǒng)后發(fā)現(xiàn)操作的界面很亂,如果能夠及時(shí)的清屏那樣就會(huì)變的很明了。查閱了相關(guān)的資料和問同學(xué)后我知道只要在程序中調(diào)用庫函數(shù)system(”cls“)就可以了,知道了這個(gè)函數(shù)的基本用法;還有對(duì)數(shù)據(jù)結(jié)構(gòu)中經(jīng)常出現(xiàn)的錯(cuò)誤也不了解,通過實(shí)踐,使我獨(dú)自處理錯(cuò)誤的能力也有了很大的提高。
7.編寫程序需要考慮到程序運(yùn)行的各種狀況,這樣才能使程序使用的長(zhǎng)久,不易出現(xiàn)bug。
附錄
[單擊此處添加程序源代碼] 主程序: #include
do{
cout<<”*******************************************************************************“< cout<<” 1--------------創(chuàng)建“< cout<<” 2--------------顯示“< cout<<” 3--------------輸入成績(jī)“< cout<<” 4--------------統(tǒng)計(jì)成績(jī)“< cout<<” 5--------------查找“< cout<<” 6--------------排序“< cout<<” 7--------------插入“< cout<<” 8--------------刪除“< cout<<” 9--------------退出“< cout<<”*******************************************************************************“< cin>>choice; system(”CLS“); switch(choice){ case 1:{ if(!(fp=fopen(”e:mysbasedata.dat“,”r“))){ cout<<”打開文件錯(cuò)誤“< exit(0);} while(!feof(fp)) if((fscanf(fp,”%s %s %s %s %s %s %s“,p1[i].No,p1[i].name,p1[i].gender,p1[i].brithday,p1[i].phoneNo,p1[i].tpartym,p1[i].addr))!=EOF){ if(isExistNo(p1,p1[i].No,i)) continue; else{ InitQueue(p1[i]); i++; p1[i].average=0; }} if(i==0) cout<<”文件為空,請(qǐng)檢查文件“< else cout<<”創(chuàng)建成功“< fclose(fp); break;} case 2: if(i==0) cout<<”信息為空,請(qǐng)錄入信息“< else for(int j=0;j cout< p1[j].name<<” “<< p1[j].gender<<” “<< p1[j].brithday<<” “<< p1[j].phoneNo<<” “<< p1[j].tpartym<<” “<< p1[j].addr< GetLine(p1[j]); } break; case 3: if(i==0) cout<<”請(qǐng)先創(chuàng)建基本信息“< else{ char c[10]; FILE *fp1; courses e; e.next=0; //student Q; //InitQueue(Q); cout<<”請(qǐng)輸入課程代號(hào),若要返回上層請(qǐng)輸入0“< do{ //cout<<”請(qǐng)輸入課程代號(hào),若要返回上層請(qǐng)輸入0“< cin>>c; if(strcmp(c,”c01“)!=0&&strcmp(c,”c02“)!=0&&strcmp(c,”c03“)!=0&&strcmp(c,”c04“)!=0&&strcmp(c, ”0“)!= 0){ cout<<”課程代號(hào)出錯(cuò),請(qǐng)重新輸入“< continue; } if(strcmp(c,”c01“)==0){ strcpy(e.cNo,”c01“); strcpy(e.cname,”原理基礎(chǔ)“); if(!(fp1=fopen(”e:mysc01.txt“,”r“))){ cout<<”打開文件錯(cuò)誤“< exit(0); } else{ while(!feof(fp1)) if((fscanf(fp1,”%s %d“,e.sNo,&e.degree))!=EOF){ for(int j=0;j if((strcmp(e.sNo,p1[j].No)==0)&&(isExitcNo(p1[j],e.cNo)==0)) EnQueue(p1[j],e); } } fclose(fp1); } else if(strcmp(c,”c02“)==0){ strcpy(e.cNo,”c02“); strcpy(e.cname,”數(shù)據(jù)結(jié)構(gòu)“); if(!(fp1=fopen(”e:mysc02.txt“,”r“))){ cout<<”打開文件錯(cuò)誤“< exit(0);} else{ while(!feof(fp1)) if((fscanf(fp1,”%s %d“,e.sNo,&e.degree))!=EOF){ for(int j=0;j if((strcmp(e.sNo,p1[j].No)==0)&&(isExitcNo(p1[j],e.cNo)==0)) EnQueue(p1[j],e); } } fclose(fp1); } else if(strcmp(c,”c03“)==0){ strcpy(e.cNo,”c03“); strcpy(e.cname,”數(shù)學(xué)建模“); if(!(fp1=fopen(”e:mysc03.txt“,”r“))){ cout<<”打開文件錯(cuò)誤“< exit(0);} else{ while(!feof(fp1)) if((fscanf(fp1,”%s %d“,e.sNo,&e.degree))!=EOF){ for(int j=0;j if((strcmp(e.sNo,p1[j].No)==0)&&(isExitcNo(p1[j],e.cNo)==0)) EnQueue(p1[j],e); } } fclose(fp1); } else if(strcmp(c,”c04“)==0){ strcpy(e.cNo,”c04“); strcpy(e.cname,”微觀經(jīng)濟(jì)“); if(!(fp1=fopen(”e:mysc04.txt“,”r“))){ cout<<”打開文件錯(cuò)誤“< exit(0);} else{ while(!feof(fp1)) if((fscanf(fp1,”%s %d“,e.sNo,&e.degree))!=EOF){ for(int j=0;j if((strcmp(e.sNo,p1[j].No))==0&&(isExitcNo(p1[j],e.cNo)==0)) EnQueue(p1[j],e); } } fclose(fp1); } //else // cout<<”請(qǐng)輸入正確的課程代號(hào)“< }while((strcmp(c,”0“))!=0);} break; case 4: if(i==0) cout<<”信息為空,請(qǐng)先創(chuàng)建基本信息“< else{ for(int j=0;j cout< p1[j].name<<” “; if(!(p1[j].front->next)) cout<<”成績(jī)?yōu)榭眨?qǐng)先輸入成績(jī)“< else{ CalculateAve(p1[j]); cout< cout< } } break; case 5: if(i==0) cout<<”信息為空,請(qǐng)先創(chuàng)建信息“< else{ int a; do{ system(”CLS“); cout<<”****************************************“< cout<<”1----------按學(xué)號(hào)查詢“< cout<<”2----------按姓名查詢“< cout<<”0----------返回上層“< cout<<”****************************************“< cin>>a; system(”CLS“); char r[10]; if(a==1)do{ strcpy(r,”1“); int flag=0; cout<<”請(qǐng)輸入學(xué)號(hào),返回上層請(qǐng)按0“< cin>>r; for(int j=0;j if(strcmp(p1[j].No,r)==0){ cout< p1[j].name<<” “<< p1[j].gender<<” “<< p1[j].brithday<<” “<< p1[j].phoneNo<<” “<< p1[j].tpartym<<” “<< p1[j].addr< GetLine(p1[j]); flag=1;} if(!flag) cout<<”查無此人,請(qǐng)重新輸入“< }while(strcmp(r,”0“)!=0); else if(a==2) do{ strcpy(r,”1“); int flag=0; cout<<”請(qǐng)輸入姓名,返回上層請(qǐng)按0“< cin>>r; for(int j=0;j if(strcmp(p1[j].name,r)==0){ cout< p1[j].name<<” “<< p1[j].gender<<” “<< p1[j].brithday<<” “<< p1[j].phoneNo<<” “<< p1[j].tpartym<<” “<< p1[j].addr< GetLine(p1[j]); flag=1;} if(!flag) cout<<”查無此人,請(qǐng)重新輸入“< }while(strcmp(r,”0“)!=0); else if(a==0) break; else{ cout<<”請(qǐng)重新選擇“< system(”pause“);} }while(1);} break; case 6: if(i==0) cout<<”信息為空,請(qǐng)先創(chuàng)建基本信息“< else{ int r; do{ cout<<”****************************************“< cout<<”1----------按學(xué)號(hào)排序“< cout<<”2----------按平均成績(jī)排序“< cout<<”0----------返回上層“< cout<<”****************************************“< cin>>r; if(r==1){ for(int k=1;k { int a,b; sscanf(p1[k].No,”%d“,&a); student temp=p1[k];//temp標(biāo)記為未排序第一個(gè)元素 int j=k; 元素 sscanf(p1[j-1].No,”%d“,&b);while(j>=0&&b>a){ p1[j]=p1[j-1];j--;sscanf(p1[j-1].No,”%d“,&b);} p1[j]=temp;} for(int j=0;j cout< } } else if(r==2){ for(int k=1;k int a; a=p1[k].average;student temp=p1[k];//temp標(biāo)記為未排序第一個(gè) int j;for(j=k;j>0&&p1[j-1].average>temp.average;j--){ p1[j]=p1[j-1];} p1[j]=temp;} for(int j=0;j cout< next)) cout<<”成績(jī)信息為空,請(qǐng)輸入該學(xué)生成績(jī)“;else{ if(p1[j].average==0) cout<<”請(qǐng)先計(jì)算平均成績(jī)“; else cout< cout< } } else if(r==0) break; else{ cout<<”請(qǐng)重新選擇“< system(”pause“);} }while(1);} break;case 7:{ int a=-1; do{ cout << ”請(qǐng)輸入學(xué)號(hào)“ << endl; while(1){ cin >> p1[i].No; if(isNo(p1[i].No)) break; else cout<<”格式錯(cuò)誤,請(qǐng)重新輸入“< } if(isExistNo(p1,p1[i].No,i)){ cout<<”該學(xué)號(hào)已存在“< continue;} cout << ”請(qǐng)輸入姓名“ << endl; cin >> p1[i].name; cout << ”請(qǐng)輸入性別“ << endl; while(1){ cin >> p1[i].gender; if(isGender(p1[i].gender)==1) break; else cout<<”格式錯(cuò)誤,請(qǐng)重新輸入“< } cout << ”請(qǐng)輸入出生年月“ << endl; while(1){ cin >> p1[i].brithday; if(isNo(p1[i].brithday)) break; else cout<<”格式錯(cuò)誤,請(qǐng)重新輸入“< } cout << ”是否為黨員“ << endl;while(1){ cin >> p1[i].tpartym;if(isYN(p1[i].tpartym)) break;else cout<<”格式錯(cuò)誤,請(qǐng)重新輸入“< cout << ”請(qǐng)輸入手機(jī)號(hào)碼“ << endl;while(1){ cin >> p1[i].phoneNo;if(isNo(p1[i].phoneNo)) break;else cout<<”格式錯(cuò)誤,請(qǐng)重新輸入“< cout << ”請(qǐng)輸入地址“ << endl;cin >> p1[i].addr;InitQueue(p1[i]);p1[i].average=0; //if(!(fp=fopen(”e:mysbasedata.dat“,”a“)))//cout<<”打開文件錯(cuò)誤“< cout << ”請(qǐng)輸入課程代號(hào),輸0結(jié)束“ << endl;cin >> e.cNo; //if(isExitcNo(p1[i],e.cNo)) // cout<<”該課程已存在,請(qǐng)勿重新輸入“< if(strcmp(e.cNo,”c01“)==0) strcpy(e.cname,”原理基礎(chǔ)“);else if(strcmp(e.cNo,”c02“)==0) strcpy(e.cname,”數(shù)據(jù)結(jié)構(gòu)“);else if(strcmp(e.cNo,”c03“)==0) strcpy(e.cname,”數(shù)學(xué)建?!?;else if(strcmp(e.cNo,”c04“)==0) strcpy(e.cname,”微觀經(jīng)濟(jì)“);else if(strcmp(e.cNo, ”0“)== 0) break;else { cout<<”課程代號(hào)出錯(cuò),請(qǐng)重新輸入“< continue;} cout << ”請(qǐng)輸入該課程成績(jī)“ << endl; cin >> e.degree; if(exiscNoreassign(p1[i],e.cNo,e.degree)==0) EnQueue(p1[i], e); //} } InsertFile(p1[i]); cout << ”1.繼續(xù)添加“ << endl; cout<<”0.返回“< cin >> a; i++; } while(a!=0);} break;case 8:{ int a=-1;do{ int flag=0;if(i==0){ cout<<”信息為空,請(qǐng)先創(chuàng)建基本信息“< a=0; } else{ char c[10]; student temp; cout<<”請(qǐng)輸入要?jiǎng)h除的學(xué)號(hào)“< cin>>c; for(int j=0;j { if(strcmp(p1[j].No,c)==0) { i--; for(int k=j;k p1[k]=p1[k+1]; flag=1; break; } } if(flag==0) cout<<”該學(xué)號(hào)不存在或已被刪除“< else reWFile(p1,i); cout<<”1.繼續(xù)刪除“< cout<<”0.返回上層“< cin>>a; } }while(a!=0);} break; case 9:break; defalult: cout<<”請(qǐng)輸入1-9的數(shù)字:“< system(”pause“); break;} system(”pause“);system(”CLS“);}while(choice!=9);return 0;} 頭文件: typedef struct courses{ char cNo[15];char cname[20];char sNo[10];int degree;courses *next;}courses;typedef struct student{ char No[10];char name[10];char gender[5];char brithday[8];char tpartym[5];char phoneNo[15];char addr[20];//courses a;courses *front;courses *rear;int average;}student;/*typedef struct{ courses *front;courses *rear;}LinkQueue;*/ Status InitQueue(student &Q){ Q.front=Q.rear=new courses;Q.front->next=0;return OK;} Status EnQueue(student &Q,courses e){ courses *r;r=new courses;strcpy(r->cNo,e.cNo);strcpy(r->cname,e.cname);r->degree=e.degree;r->next=0;Q.rear->next=r;Q.rear=r;return OK;} Status DeQueue(student &Q,courses &e){ courses *r;if(Q.front==Q.rear)return ERROR;r=Q.front->next;strcpy(e.sNo,r->sNo);e.degree=r->degree;Q.front->next=r->next;if(Q.rear=r) Q.rear=Q.front;delete r;return OK;} Status GetLine(student Q){ courses *r;if(Q.front==Q.rear) cout<<”課程信息為空,請(qǐng)先輸入課程信息“;else{ r=Q.front->next; while(r){ //strcpy(e.cNo,Q.front->next->cNo); //e.degree=Q.front->next->degree; cout< r=r->next;}} cout< Q.average+=r->degree; r=r->next; n++;} Q.average/=n;return OK;} int isExitcNo(student Q,char *cNo){ int flag=0;courses *r;if(Q.front==Q.rear)return ERROR;r=Q.front->next;while(r){ if(strcmp(r->cNo,cNo)==0){ flag=1; break;} r=r->next;} return flag;} int isExistNo(student *p1,char *No,int i=0){ int j=0,flag=0;for(j=0;j if(strcmp(p1[j].No,No)==0) { flag=1; break; } return flag;} int exiscNoreassign(student &Q,char *cNo,int degree){ int flag=0;courses *r;if(Q.front==Q.rear)return ERROR;r=Q.front->next;while(r){ if(strcmp(r->cNo,cNo)==0){ r->degree=degree; flag=1; break;} r=r->next;} return flag;} int isNo(char *No){ int j,flag=1;for(j=0;No[j]!='