版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
《數(shù)據(jù)結(jié)構(gòu)c》課程設(shè)計(jì)報(bào)告課程設(shè)計(jì)概述本次數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)共完成5個(gè)題目:成績(jī)分析問(wèn)題,哈夫曼編碼器,迷宮問(wèn)題,八皇后問(wèn)題,農(nóng)夫過(guò)河問(wèn)題的求解。使用環(huán)境:C語(yǔ)言。編譯環(huán)境:VisualStudio2022。課程設(shè)計(jì)題目實(shí)驗(yàn)內(nèi)容:成績(jī)分析問(wèn)題。問(wèn)題描述:設(shè)計(jì)并實(shí)現(xiàn)一個(gè)成績(jī)分析系統(tǒng),能夠?qū)崿F(xiàn)錄入,保存一個(gè)班級(jí)學(xué)生多門課程的成績(jī),并對(duì)成績(jī)進(jìn)行分析等功能。需求分析:經(jīng)過(guò)分析,本系統(tǒng)需完成的主要功能如下:通過(guò)鍵盤輸入各學(xué)生的多門課程的成績(jī),建立相應(yīng)的文件input.dat。對(duì)文件input.dat中的數(shù)據(jù)進(jìn)行處理,要求具有如下功能:按各門課程成績(jī)排序,并生成相應(yīng)的文件輸出。計(jì)算每個(gè)人的平均成績(jī),按平均成績(jī)排序,并生成文件。求出各門課程的平均成績(jī),最高分,最低分,不及格人數(shù),60~69分人數(shù),70~79分人數(shù),80~89分人數(shù),90分以上人數(shù)。根據(jù)姓名或?qū)W號(hào)查詢某人的各門課程成績(jī),重名也要能處理。概要設(shè)計(jì):--=ADT=--{Student*SearchByName(Student*head,char*name)//根據(jù)姓名查詢學(xué)生信息Student*SearchById(Student*head,char*id)//根據(jù)學(xué)號(hào)查詢學(xué)生信息voidAdd(Student**head)//添加一個(gè)學(xué)生voidRead(Student**head)//讀取文件中的學(xué)生信息voidSave(Student*head)//保存學(xué)生信息到文件voidSortAndOutput(Student*head)//按三門課程成績(jī)排序并輸出voidCalculateAverage(Student*head)//計(jì)算每人三門課程的平均成績(jī)并輸出voidSortByAverageScoreAndOutput(Student*head)//按三門課程平均成績(jī)排序并輸出voidStatistics(Student*head)//統(tǒng)計(jì)三門課程各自的平均成績(jī),最高分,最低分,不及格人數(shù),60~69分人數(shù),70~79分人數(shù),80~89分人數(shù),90分以上人數(shù)voidShowMenu()//顯示菜單}存儲(chǔ)結(jié)構(gòu):typedefstructstudent{
charid[20];//學(xué)號(hào)
charname[20];//姓名
floatmath_score;//數(shù)學(xué)成績(jī)
floatenglish_score;//英語(yǔ)成績(jī)
floatcomputer_score;//計(jì)算機(jī)成績(jī)
floataverage;//平均成績(jī)
structstudent*next;//指向下一個(gè)學(xué)生的指針}Student;設(shè)計(jì)思路:鏈表數(shù)據(jù)結(jié)構(gòu):使用鏈表來(lái)存儲(chǔ)學(xué)生信息,每個(gè)節(jié)點(diǎn)表示一個(gè)學(xué)生。鏈表的好處是可以動(dòng)態(tài)地添加和刪除節(jié)點(diǎn),靈活處理不同數(shù)量的學(xué)生信息。-學(xué)生結(jié)構(gòu)體:定義一個(gè)學(xué)生結(jié)構(gòu)體,包含以下字段:學(xué)號(hào)、姓名、數(shù)學(xué)成績(jī)、英語(yǔ)成績(jī)、計(jì)算機(jī)成績(jī)、平均成績(jī)和指向下一個(gè)學(xué)生節(jié)點(diǎn)的指針。這樣可以方便地存儲(chǔ)和訪問(wèn)每個(gè)學(xué)生的相關(guān)信息。-功能函數(shù):實(shí)現(xiàn)各種功能函數(shù),如添加學(xué)生、讀取文件、保存文件、排序等。這些函數(shù)通過(guò)操作鏈表來(lái)完成相關(guān)操作。關(guān)鍵算法:-冒泡排序算法:用于將學(xué)生根據(jù)指定的排序規(guī)那么〔如成績(jī)〕進(jìn)行排序。冒泡排序算法的根本思想是比擬相鄰的兩個(gè)元素,如果它們的順序錯(cuò)誤就交換位置,繼續(xù)比擬直到完成排序。在學(xué)生信息管理系統(tǒng)中,可以根據(jù)數(shù)學(xué)成績(jī)、英語(yǔ)成績(jī)或計(jì)算機(jī)成績(jī)來(lái)排序?qū)W生信息。-遍歷鏈表:通過(guò)使用循環(huán)遍歷鏈表的每個(gè)節(jié)點(diǎn),可以實(shí)現(xiàn)對(duì)鏈表中的數(shù)據(jù)進(jìn)行訪問(wèn)、處理和輸出等操作。遍歷鏈表是獲取每個(gè)學(xué)生信息、計(jì)算平均成績(jī)以及輸出結(jié)果的關(guān)鍵步驟。-文件讀寫:通過(guò)使用二進(jìn)制文件讀寫方式,可以將學(xué)生信息保存到文件中,或從文件中讀取學(xué)生信息。在學(xué)生信息管理系統(tǒng)中,可以將學(xué)生信息以二進(jìn)制形式寫入文件,并在需要時(shí)從文件中讀取,并重新構(gòu)建鏈表。使用鏈表作為數(shù)據(jù)結(jié)構(gòu),結(jié)合冒泡排序算法、鏈表遍歷和文件讀寫等算法,可以實(shí)現(xiàn)學(xué)生信息的管理、排序和存儲(chǔ)等功能詳細(xì)設(shè)計(jì):#include<stdio.h>#include<stdlib.h>#include<string.h>//定義學(xué)生結(jié)構(gòu)體typedefstructstudent{
charid[20];//學(xué)號(hào)
charname[20];//姓名
floatmath_score;//數(shù)學(xué)成績(jī)
floatenglish_score;//英語(yǔ)成績(jī)
floatcomputer_score;//計(jì)算機(jī)成績(jī)
floataverage;//平均成績(jī)
structstudent*next;//指向下一個(gè)學(xué)生的指針}Student;//根據(jù)姓名查詢學(xué)生信息Student*SearchByName(Student*head,char*name){
Student*p=head;
while(p!=NULL){
if(strcmp(p->name,name)==0){//找到該學(xué)生
returnp;
}
p=p->next;
}
returnNULL;//沒有找到該學(xué)生}//根據(jù)學(xué)號(hào)查詢學(xué)生信息Student*SearchById(Student*head,char*id){
Student*p=head;
while(p!=NULL){
if(strcmp(p->id,id)==0){//找到該學(xué)生
returnp;
}
p=p->next;
}
returnNULL;//沒有找到該學(xué)生}//添加一個(gè)學(xué)生voidAdd(Student**head){
Student*p=(Student*)malloc(sizeof(Student));
printf("請(qǐng)輸入學(xué)生的學(xué)號(hào):");
scanf("%s",p->id);
printf("請(qǐng)輸入學(xué)生的姓名:");
scanf("%s",p->name);
printf("請(qǐng)輸入學(xué)生的數(shù)學(xué)成績(jī):");
scanf("%f",&p->math_score);
printf("請(qǐng)輸入學(xué)生的英語(yǔ)成績(jī):");
scanf("%f",&p->english_score);
printf("請(qǐng)輸入學(xué)生的計(jì)算機(jī)成績(jī):");
scanf("%f",&p->computer_score);
p->average=(p->math_score+p->english_score+p->computer_score)/3;//計(jì)算平均成績(jī)
//插入到鏈表中
Student*temp=NULL;
Student*cur=*head;
while(cur&&p->average<cur->average){//按平均成績(jī)排序插入
temp=cur;
cur=cur->next;
}
if(temp==NULL){
p->next=*head;
*head=p;
}else{
temp->next=p;
p->next=cur;
}
printf("添加成功\n");}//讀取文件中的學(xué)生信息voidRead(Student**head){
FILE*fp=fopen("input.dat","rb");
if(fp==NULL){
printf("文件翻開失敗\n");
return;
}
Student*p=(Student*)malloc(sizeof(Student));
fread(p,sizeof(Student),1,fp);
while(!feof(fp)){
//插入到鏈表后面
p->next=*head;
*head=p;
p=(Student*)malloc(sizeof(Student));
fread(p,sizeof(Student),1,fp);
}
printf("讀取成功\n");
fclose(fp);}//保存學(xué)生信息到文件voidSave(Student*head){
FILE*fp=fopen("input.dat","wb");
if(fp==NULL){
printf("文件翻開失敗\n");
return;
}
Student*p=head;
while(p!=NULL){
fwrite(p,sizeof(Student),1,fp);
p=p->next;
}
printf("保存成功\n");
fclose(fp);}//按三門課程成績(jī)排序并輸出voidSortAndOutput(Student*head){
Student*p=head;
intcount=0;
while(p!=NULL){
count++;
p=p->next;
}
Student**array=(Student**)malloc(sizeof(Student*)*count);//存儲(chǔ)指針的數(shù)組
p=head;
for(inti=0;i<count;i++){
array[i]=p;
p=p->next;
}
for(inti=0;i<count-1;i++){//冒泡排序
for(intj=0;j<count-1-i;j++){
if(array[j]->math_score+array[j]->english_score+array[j]->computer_score<array[j+1]->math_score+array[j+1]->english_score+array[j+1]->computer_score){
Student*temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
}
FILE*fp=fopen("sorted_by_score.dat","w");
fprintf(fp,"%-20s%-20s%-20s%-20s%-20s%-20s\n","學(xué)號(hào)","姓名","數(shù)學(xué)成績(jī)","英語(yǔ)成績(jī)","計(jì)算機(jī)成績(jī)","平均成績(jī)");
for(inti=0;i<count;i++){
fprintf(fp,"%-20s%-20s%-20.1f%-20.1f%-20.1f%-20.1f\n",array[i]->id,array[i]->name,array[i]->math_score,array[i]->english_score,array[i]->computer_score,array[i]->average);
}
printf("排序成功并已保存到sorted_by_score.dat文件中\(zhòng)n");
fclose(fp);}//計(jì)算每人三門課程的平均成績(jī)并輸出voidCalculateAverage(Student*head){
FILE*fp=fopen("average_score.dat","w");
fprintf(fp,"%-20s%-20s%-20s%-20s%-20s%-20s\n","學(xué)號(hào)","姓名","數(shù)學(xué)成績(jī)","英語(yǔ)成績(jī)","計(jì)算機(jī)成績(jī)","平均成績(jī)");
Student*p=head;
while(p!=NULL){
fprintf(fp,"%-20s%-20s%-20.1f%-20.1f%-20.1f%-20.1f\n",p->id,p->name,p->math_score,p->english_score,p->computer_score,p->average);
p=p->next;
}
printf("每人三門課程的平均成績(jī)已計(jì)算并保存到average_score.dat文件中\(zhòng)n");
fclose(fp);}//按三門課程平均成績(jī)排序并輸出voidSortByAverageScoreAndOutput(Student*head){
Student*p=head;
intcount=0;
while(p!=NULL){
count++;
p=p->next;
}
Student**array=(Student**)malloc(sizeof(Student*)*count);//存儲(chǔ)指針的數(shù)組
p=head;
for(inti=0;i<count;i++){
array[i]=p;
p=p->next;
}
for(inti=0;i<count-1;i++){//冒泡排序
for(intj=0;j<count-1-i;j++){
if(array[j]->average<array[j+1]->average){
Student*temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
}
FILE*fp=fopen("sorted_by_average_score.dat","w");
fprintf(fp,"%-20s%-20s%-20s%-20s%-20s%-20s\n","學(xué)號(hào)","姓名","數(shù)學(xué)成績(jī)","英語(yǔ)成績(jī)","計(jì)算機(jī)成績(jī)","平均成績(jī)");
for(inti=0;i<count;i++){
fprintf(fp,"%-20s%-20s%-20.1f%-20.1f%-20.1f%-20.1f\n",array[i]->id,array[i]->name,array[i]->math_score,array[i]->english_score,array[i]->computer_score,array[i]->average);
}
printf("排序成功并已保存到sorted_by_average_score.dat文件中\(zhòng)n");
fclose(fp);}//統(tǒng)計(jì)三門課程各自的平均成績(jī),最高分,最低分,不及格人數(shù),60~69分人數(shù),70~79分人數(shù),80~89分人數(shù),90分以上人數(shù)voidStatistics(Student*head){
floatmath_total=0;
floatenglish_total=0;
floatcomputer_total=0;
intmath_count=0;
intenglish_count=0;
intcomputer_count=0;
intfail_count=0;
intsixty_nine_count=0;
intseventy_nine_count=0;
inteighty_nine_count=0;
intninety_count=0;
floatmath_max=0;
floatenglish_max=0;
floatcomputer_max=0;
floatmath_min=100;
floatenglish_min=100;
floatcomputer_min=100;
Student*p=head;
while(p!=NULL){
math_count++;
math_total+=p->math_score;
if(p->math_score>math_max)math_max=p->math_score;
if(p->math_score<math_min)math_min=p->math_score;
english_count++;
english_total+=p->english_score;
if(p->english_score>english_max)english_max=p->english_score;
if(p->english_score<english_min)english_min=p->english_score;
computer_count++;
computer_total+=p->computer_score;
if(p->computer_score>computer_max)computer_max=p->computer_score;
if(p->computer_score<computer_min)computer_min=p->computer_score;
if(p->math_score<60||p->english_score<60||p->computer_score<60){
fail_count++;
}elseif(p->math_score>=60&&p->math_score<=69&&p->english_score>=60&&p->english_score<=69&&p->computer_score>=60&&p->computer_score<=69){
sixty_nine_count++;
}elseif(p->math_score>=70&&p->math_score<=79&&p->english_score>=70&&p->english_score<=79&&p->computer_score>=70&&p->computer_score<=79){
seventy_nine_count++;
}elseif(p->math_score>=80&&p->math_score<=89&&p->english_score>=80&&p->english_score<=89&&p->computer_score>=80&&p->computer_score<=89){
eighty_nine_count++;
}elseif(p->math_score>=90&&p->english_score>=90&&p->computer_score>=90){
ninety_count++;
}
p=p->next;
}
printf("數(shù)學(xué)平均成績(jī):%f\n",math_total/math_count);
printf("數(shù)學(xué)最高分:%f\n",math_max);
printf("數(shù)學(xué)最低分:%f\n",math_min);
printf("英語(yǔ)平均成績(jī):%f\n",english_total/english_count);
printf("英語(yǔ)最高分:%f\n",english_max);
printf("英語(yǔ)最低分:%f\n",english_min);
printf("計(jì)算機(jī)平均成績(jī):%f\n",computer_total/computer_count);
printf("計(jì)算機(jī)最高分:%f\n",computer_max);
printf("計(jì)算機(jī)最低分:%f\n",computer_min);
printf("不及格人數(shù):%d\n",fail_count);
printf("60~69分人數(shù):%d\n",sixty_nine_count);
printf("70~79分人數(shù):%d\n",seventy_nine_count);
printf("80~89分人數(shù):%d\n",eighty_nine_count);
printf("90分以上人數(shù):%d\n",ninety_count);}//顯示菜單voidShowMenu(){
printf("\n\n");
printf("請(qǐng)輸入數(shù)字選擇對(duì)應(yīng)功能:\n");
printf("1.添加一個(gè)學(xué)生\n");
printf("2.讀取文件中的學(xué)生信息\n");
printf("3.保存學(xué)生信息到文件\n");
printf("4.按三門課程成績(jī)排序并輸出\n");
printf("5.計(jì)算每人三門課程的平均成績(jī)并輸出\n");
printf("6.按三門課程平均成績(jī)排序并輸出\n");
printf("7.統(tǒng)計(jì)各門課程成績(jī)情況\n");
printf("8.根據(jù)姓名查詢?cè)搶W(xué)生各門課成績(jī)\n");
printf("9.根據(jù)學(xué)號(hào)查詢?cè)搶W(xué)生各門課成績(jī)\n");
printf("0.退出程序\n");
printf("\n\n");}intmain(){
intchoice=-1;
Student*head=NULL;//鏈表頭指針
while(choice!=0){
ShowMenu();
scanf("%d",&choice);
switch(choice){
case1:
Add(&head);
break;
case2:
Read(&head);
break;
case3:
Save(head);
break;
case4:
SortAndOutput(head);
break;
case5:
CalculateAverage(head);
break;
case6:
SortByAverageScoreAndOutput(head);
break;
case7:
Statistics(head);
break;
case8:
{
charname[20];
printf("請(qǐng)輸入學(xué)生的姓名:");
scanf("%s",name);
Student*p=SearchByName(head,name);
if(p!=NULL){
printf("%-20s%-20s%-20s%-20s%-20s\n","數(shù)學(xué)成績(jī)","英語(yǔ)成績(jī)","計(jì)算機(jī)成績(jī)","平均成績(jī)","總成績(jī)");
printf("%-20.1f%-20.1f%-20.1f%-20.1f%-20.1f\n",p->math_score,p->english_score,p->computer_score,p->average,p->math_score+p->english_score+p->computer_score);
}else{
printf("沒有找到該學(xué)生\n");
}
break;
}
case9:
{
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度河北省高校教師資格證之高等教育學(xué)模擬考核試卷含答案
- 2024年度江西省高校教師資格證之高等教育心理學(xué)題庫(kù)附答案(基礎(chǔ)題)
- 2024年度江西省高校教師資格證之高等教育法規(guī)全真模擬考試試卷A卷含答案
- 綠色建筑通風(fēng)空調(diào)系統(tǒng)設(shè)計(jì)方案
- 2024年中國(guó)紡織印染原材料市場(chǎng)調(diào)查研究報(bào)告
- 2024年中國(guó)油炸鍋網(wǎng)籃市場(chǎng)調(diào)查研究報(bào)告
- XX鎮(zhèn)數(shù)字化婚禮服務(wù)方案
- 升壓站土建施工與周邊環(huán)境協(xié)調(diào)方案
- 紀(jì)念918活動(dòng)線上直播方案
- 深圳醫(yī)院VIP患者滿意度提升方案
- 2022年《江蘇省機(jī)動(dòng)車維修費(fèi)用結(jié)算清單》格式
- 數(shù)字媒體技術(shù)專業(yè)群建設(shè)方案
- 裝配式混凝土結(jié)構(gòu)吊裝安全技術(shù)交底
- 機(jī)械畢業(yè)設(shè)計(jì)(PLC的恒溫箱控制系統(tǒng)設(shè)計(jì))
- 非哺乳期乳腺炎診治專家共識(shí)解讀及體會(huì)供參考
- 實(shí)驗(yàn)二 油菜考種
- 汽車交貨方案及質(zhì)保措施
- 06竣工財(cái)務(wù)決算審計(jì)工作底稿(試行)
- 某公司審計(jì)財(cái)務(wù)舞弊案例分析報(bào)告
- 放射性物質(zhì)安全使用和防護(hù)
- 植物體的結(jié)構(gòu)層次通用課件
評(píng)論
0/150
提交評(píng)論