成績(jī)分析問(wèn)題課程設(shè)計(jì)-_第1頁(yè)
成績(jī)分析問(wèn)題課程設(shè)計(jì)-_第2頁(yè)
成績(jī)分析問(wèn)題課程設(shè)計(jì)-_第3頁(yè)
成績(jī)分析問(wèn)題課程設(shè)計(jì)-_第4頁(yè)
成績(jī)分析問(wèn)題課程設(shè)計(jì)-_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論