C語言第三次大作業(yè)_第1頁
C語言第三次大作業(yè)_第2頁
C語言第三次大作業(yè)_第3頁
C語言第三次大作業(yè)_第4頁
C語言第三次大作業(yè)_第5頁
已閱讀5頁,還剩34頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、C語言第三次大作業(yè)班級:機(jī)電*姓名:學(xué)號:題目一:利用數(shù)組編寫一個簡單的成績管理系統(tǒng),要求有效依據(jù)至少150條,利用程 序設(shè)計模塊化思想,自定義函數(shù)不少于5個。其他要求:1、班級的人數(shù)由用戶鍵 盤輸入;2、錄入學(xué)生學(xué)號和考試成績3、數(shù)據(jù)分析功能包括計算課程總分和平 均分、按成績由高到低排出成績表、按學(xué)號由小到大排出成績表、可按學(xué)號查詢 學(xué)生成績及排名、按優(yōu)秀(90100),良好(8089),中等(7079),及格(6069), 不及格(60) 5個類別統(tǒng)計成績并計算百分比和輸出每個學(xué)生的學(xué)號、成績及 課程總分和平均分。1、題意及算法分析根據(jù)題目要求,結(jié)合程序設(shè)計模塊化思想,可自定義79個函數(shù),

2、分別實(shí)現(xiàn) 相應(yīng)的功能。根據(jù)題目要求可定義學(xué)號數(shù)組為整形數(shù)組,平均分、成績數(shù)組為float 類型;定義宏常量N,使得數(shù)組足夠大;成績和學(xué)號的排序可采用交換法、選擇 法、插入排序、冒泡法、快速排序法等,本題采用交換法排序,在采用交換法排 序的時候可以通過定義一個標(biāo)志變量(中間變量)實(shí)現(xiàn);通過學(xué)號查找成績可通 過線性查找(順序查找)或折半查找,本題采用的是順序查找,采用順序查找可 以用for循環(huán)語句實(shí)現(xiàn),查找次數(shù)最多為總?cè)藬?shù)n。統(tǒng)計等級時,利用整數(shù)除法 (區(qū)別于實(shí)數(shù)除法),結(jié)合switch語句和計數(shù)控制循環(huán)語句即可得到不同等級所 占百分比。菜單功能選擇是可使用switch-case條件結(jié)構(gòu)。要注意的

3、是數(shù)組的下 標(biāo)從0開始;只能逐個引用數(shù)組元素,不能一次引用整個數(shù)組;數(shù)組做函數(shù)形式 參數(shù)時,數(shù)組的大小可以不出現(xiàn)在數(shù)組名后面的方括號內(nèi);被調(diào)用函數(shù)的實(shí)際參 數(shù)用數(shù)組名或數(shù)組定義式。2、NS流程圖傳統(tǒng)流程圖:功能2:按成績由高到低排出名次表功能3:按學(xué)號也小到大排出成績表 功能4:按學(xué)號查詢學(xué)生排名及其成績功能5:統(tǒng)計各等級所占的百分比功能6:輸出每個學(xué)生的學(xué)號、成績,課程總分和平均分功能7:輸出“對不起,沒有該功能選項!”3、調(diào)試及改錯1、缺少取地址運(yùn)算符“&”寫好程序后,解決ERROR后會情不自禁的執(zhí)行程序,一執(zhí)行便彈出如下對 話框,回過頭看程序,發(fā)現(xiàn) int read (long

4、numberLfloat score)函數(shù)中“printf(" 請輸入學(xué)生總?cè)藬?shù):");ret=scanf(“d“,n);”的語句中出現(xiàn)一個明顯的低級錯誤,缺 少取地址運(yùn)算符“&”。 *DzVC4-+6.OMSDffv9BMyPrc>jects8_ExperimentDeb<jg8_Experiment.ffXe,2、交換法排序邏輯錯誤解決了上述錯誤后,程序運(yùn)行時執(zhí)行功能2,出現(xiàn)如下錯誤,并沒有達(dá)到預(yù) 期交換成績的目的,但是學(xué)號卻排序正確,可以初步確定錯誤出現(xiàn)在void sort (long numberJloat score, int n)函數(shù)中。檢查

5、發(fā)現(xiàn)標(biāo)志變量temp為起 到作用,交換法語句中出現(xiàn)邏輯錯誤。;678398x 6790,45 67V1.78C UUUUWtJU, (. (HSUS。,. "D:VC 6.0MSDe%,9B,MyPrcjects8_ExperimffntXDebug8_Experiment.exe-o 月IF >1»1¥- , UMW CTD 方吉吉工X2 381 1 r 文女文 - 一 - Sa 3成成成 -D D D9 S 9:6V«9 ”,刊工 :c?9a9H.HH.0-10737176.0內(nèi)”;總高小詢繳學(xué)項 程由由杏里點(diǎn) 一0千卅出鈍 注技落輸績, 表表

6、成尊 分名地及分.北 均出出番號ci 架大生廟按課程總分和平均分錯誤的程序語句及修改如下:void sort(long number,float score,int n)(int ij;float temp;long m;for(i=l;i<n;i+)for(j=0;j<n-i;j+)if(scorej<scorej+l)(scorej=temp;/ 應(yīng)改為"temp=scorej;”m=numberj;scorej=scorej+l;numberj=numberj+l;scorej+l=temp;numberj+l=m;)printf("n")

7、;for(i=0;i<n;i+)printf("成績第(1 名成績:%ldt%.lfn,i+Lnumberi,scorei);)3、數(shù)據(jù)類型錯誤解決了以上問題,再次編譯組建執(zhí)行時,統(tǒng)計各等級所占百分比出現(xiàn)失真。各成績等級均為0.00%o如下圖所示:exe一開始并未發(fā)現(xiàn)問題,step into void analysis (float score,int n)函數(shù)調(diào)oooo< 缸 9876 M 4琴格及春節(jié)菱 51中及不免火中及干 ««««« H£££ff££f£&

8、#163; C七七七ctttt七 t nnnnnnnnnnn 1 i 1 i i -1 i i i 4* i rrttrrr-rrl-t ppppppppppv%4dnM.a): %4dn",b)i %4dn * . c ) %4dn*.d> %4dnH.e)試,輸入3位學(xué)生成績分別是98,93和67,調(diào)試時查看數(shù)據(jù),如下圖:s g ,阻 9 先 tI 79)的人敖為;69 的人效為:059)的人數(shù)為:%. 2£%nw.<lOO*a)/n) %. 2£%nw. <lOO*b) /n)%. (LOO*c) /n)%. 2£%n”. ClO

9、O*d)/n) :%(lOO*e>/n), b16 C 0d 1(100*a) /10的值并非為0,但是輸出結(jié)果卻是0.00%。錯誤的程序語句及修改:void analysis(float score,int n)(int a=0/b=0,c=0,d=0,e=0/i;for(i=0;i<n;i+)(switch(int)scorei/10)(case 10:case 9:a=a+l;break;case 8:b=b+l;break;case 7:c=c+l;break;case 6:d=d+l;break;default:e=e+l;)printf("n");p

10、rintf(”優(yōu)秀(90-100)的人數(shù)為:%4dn",a);printf("良好(8089)的人數(shù)為:%4dn",b);printf(”中等(70- 79)的人數(shù)為:%4dn",c);printf("及格(6069)的人數(shù)為:4dn,d);printf("不及格(059)的人數(shù)為:4dn",e);printf("優(yōu)秀率:%.2f%n",float(100*a)/n); 紅色為修改后添加語句printf(“良好率:%.2f%n",float(100*b)/n); 因?yàn)?ae,n 已被定義為 in

11、t printf(”中等率:%.2f%n",float(100*c)/n); 而輸出卻是 float 類型 printf("及格率:%.2f%n",float(100*d)/n); 因此必須把(100*a) /a printf("不及格率:.2f%n,float(100*e)/n);轉(zhuǎn)化為強(qiáng)制轉(zhuǎn)化為 float 型 )4、源程序#include <stdio.h>#include <conio.h>#include <windows.h>#define N 100void screen(char c);int read

12、flong number,float score);void totaLaverageffloat score,int n);void sort(long number,float score,int n);void sortnumberflong number,float score,int n);void searchflong number,float score,int n);void analysisffloat score,int n);void listrecordflong number,float score,int n);void main(void)(int n=0;ch

13、ar choose;char ch="簡單的學(xué)生成績管理系統(tǒng)by施芳輝"long numberN;float scoreN;screen(ch);n=read(number/score);數(shù)組名做函數(shù)實(shí)參調(diào)用函數(shù)read ()while(l)(printf("n");printf("l,計算課程總分和平均分n”);printf("2、按成績由高到低排出名次表n“);printf("3.按學(xué)號由小到大排出成績表n”);printf("4、按學(xué)號查詢學(xué)生排名及其成績n”);printf("5,統(tǒng)計各等級所占的

14、百分比n“);printf("6,輸出每個學(xué)生的學(xué)號、成績,課程總分和平均分n");printf("請選擇分析功能(按ESC退出choose=getche();if(choose=27)break;else(switch(choose)(case 49:printf("n");total_average(score,n); 調(diào)用計算課程總分和平均分的函數(shù) break;case 50:printf("n");sort(number,score,n); 調(diào)用成績排序函數(shù)break;case 51:printf("n&q

15、uot;);sortnumbermumbecscoren); 調(diào)用 學(xué)號排序函數(shù)break;case 52:printf("n");search(number,score,n); 調(diào)用查詢函數(shù) research ()break;case 53:printf("n");analysis(score,n); 調(diào)用統(tǒng)計等級函數(shù) analysis ()break;case 54:printf("n");listrecord(number,score,n);break;default:printf("n");printf(&

16、quot;對不起,沒有該功能選項!");break;)void delay(void)(int a;for(a=0;a<2000;a+);)void gotoxy(int x,int y)(COORD c=x,y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);)void screen(char c)(int i;gotoxy(20,l);for(i=0;i<5;i+)(printf("37");Sleep(200);delay();)輸出字符串?dāng)?shù)組ch中的內(nèi)容pintf(&quo

17、t;%s,c);for(i=0;i<5;i+)printfCW1');Sleep(200);delay();)putcharfXn1);)int read(long number,float score口)錄入學(xué)生成績,返回學(xué)生人數(shù)供后續(xù)函數(shù)使用int n,i,ret;printf(“n)記錄scanf函數(shù)的返回值此處輸入數(shù)據(jù)個數(shù)或格式是否錯誤printf(“請輸入學(xué)生總?cè)藬?shù) ret=scanf("%d",&n);while(ret!=l)while(getchar()!=,n,);清除輸入緩沖區(qū)中錯誤數(shù)據(jù)printf(”請輸入學(xué)生總?cè)藬?shù):"

18、);ret=scanf(,%d,&n);記錄 scanf 函數(shù)的返回值)for(i=0;i<n;i+)(printf("請輸入第d位學(xué)號和成績:如(0000000, 90.0): "J+1);ret=scanf("%ld%*c%f",&numberi,&scorei); / * 為忽略輸入修飾符,此處*c使得輸入學(xué)號與成績之間可用任意一個字符隔開while(ret!=2) 此處while語句與上述作用一樣while(getchar()!='n');printf(”請輸入第d位學(xué)號和成績:如(0000000,

19、90.0): "J+1);ret=scanf(,%ld%*c%f,&numberi,&scorei);return n;)void totaLaverageffloat score,int n)int i;float sum=0;for(i=0;i<n;i+)總分計數(shù)循環(huán)語句sum=sum+scorei;printfCV1');printf("該課程的總分為:.2fn,sum);/ “.2”對于float類型,限定其小數(shù)點(diǎn)位數(shù)為2位print"1課程的平均分為% 2fn,sum/n);)void sort(long number,fl

20、oat score,int n)mt ij;float temp;long m;for(i=l;i<n;i+)for(j=0;j<n-i;j+)if(scorej<scorej+l)(temp=scorej;m=numberj;scorej=scorej+l;numberj=numberj+l;scorej+l=temp;定義一個標(biāo)志變量,用于排序此段程序用于成績/的排序,/并交換相應(yīng)的學(xué)號numberj+l=m;)printf("n");for(i=0;i<n;i+)printf("成績第£| 名成績:%ldt%.lfn,i+l

21、,numberiLscorei);)void sortnumberflong number,float score,int n) 此函數(shù)與上述 sort () 函數(shù)類似,關(guān)鍵是排序(int i,j;float temp;long m;for(i=l;i<n;i+)for(j=0;j<n-i;j+)if(numberj>numberj+l)(m=numberj;temp=scorej;numberj=numberj+l;scorej=scorej+l;numberj+l=m;scorej+l=temp;)printf("n");for(i=0;i<n;

22、i+)printf("學(xué)號由小到大排序:ldt%.lfn",numberiLscorei);)void searchflong number,float score,int n)(int i;long sort;printf("請輸入要查詢的學(xué)生學(xué)號:");scanf("ld”,&sort);printf("n");for(i=0;i<n;i+)利用for循環(huán)語句,實(shí)現(xiàn)順序查找(if(numberi=sort)printf("查詢學(xué)生的學(xué)號ld,成績?yōu)?.lfn",sort,scorei);

23、)void analysisffloat score,int n)(int a=0/b=0,c=0,d=0,e=0/i;for(i=0;i<n;i+)(switch(int)scorei/10)數(shù)據(jù)類型的強(qiáng)制轉(zhuǎn)換,因?yàn)閟core數(shù)組的數(shù)據(jù)類型是float,而這里算等級利用整數(shù)。(case 10:case 9:a=a+l;break;case 8:b=b+l;break;case 7:c=c+l;break;case 6:d=d+l;break;default:e=e+l;)printf("n");printf(”優(yōu)秀(90-100 )的人數(shù)為:%4dn",a

24、);printf("良好(8089 )的人數(shù)為:%4dn",b);printf("中等(70- 79 )的人數(shù)為:%4dn",c);printf("及格(60 69 )的人數(shù)為:4dn",d);printf("不及格(059)的人數(shù)為:4dn",e);printf("優(yōu)秀率:.2f%n,float(100*a)/n);同樣的,a,n 均定義為 int類型,要得到精確2位小數(shù)點(diǎn),要把(100*a) /n)強(qiáng)制轉(zhuǎn)換為float類型。printf("良好率:%.2f%n",float(100

25、*b)/n);printf("中等率:%. 2f%n ",f I oat (100 * c)/n);printf("及格率:%.2f%n",float(100*d)/n);printf("不及格率:%.2f%n",float(100*e)/n);)void listrecord(long number,float score,int n)(int i;printf("n");for(i=0;i<n;i+)printf("學(xué)生學(xué)號為"的成績是:%.lfn",numberi,scor

26、ei);total_average(score,n);5、心得體會要寫好一個程序并不容易,就像這么一個并不是特別復(fù)雜的程序,剛寫好時 錯誤百出,就連最低級的錯誤如缺少“;”,取地址運(yùn)算符“&”,數(shù)據(jù)的定義(特 別是數(shù)據(jù)類型),數(shù)據(jù)的初始化都會出錯,原因只有一個:不細(xì)心、少實(shí)踐、少 留心!程序?qū)懚嗔?,改多了,自然在寫的時候就會多留一份心,自然會在寫到容 易出錯的地方提醒自己。本次特別加強(qiáng)了程序流程圖的學(xué)習(xí)。題目二:基于V2寫一個鍵控的簡單的菜單功能選擇程序,可以計時、可以定時、可 以搖號(搖號范圍自定)。定時、計數(shù)要求使用外部晶振(約12M),結(jié)合定時 器/計數(shù)器原理,精確到0.01秒、

27、,最長計時99.99秒。顯示格式形如“00.00”。 同時,秒表可以記錄多個時間點(diǎn),并在數(shù)碼管輪流顯示;定時器定時時間可通過 按鍵調(diào)整,定時范圍自定。工、算法及題意分析菜單可以利用K2鍵選擇功能“1” “2”或“3”,鍵控秒表可以使用K2鍵開 始,每按K3鍵記錄一次,再按K2鍵把記錄的成績依次在數(shù)碼管上顯示。0.01 秒精確度,可使用定時器T0定時0.01秒(初始值THO= (65535-10000) 56, TLO= (65536-10000) %256),可采用中斷法或查詢法,每定時完成一次數(shù)碼管顯 示一次。定時器可以設(shè)置K2鍵沒按一次,定時時間增加相應(yīng)的量(10S), K3鍵 暫停,再按

28、K2鍵繼續(xù)。搖號可利用Rand ()函數(shù),K2鍵按下時獲得搖號數(shù)字, K3鍵重新?lián)u號。每個功能在初始態(tài)通過按K3鍵返回功能選擇菜單。2、源程序#include <stcl2C5410ad.h>#include <intrins.h>#include <stdlib.h>#define N 40秒表計時器最多可記錄40個數(shù)據(jù)void disjnit(void);void displayfunsigned int qian,unsigned int bai,unsigned int shi,unsigned int ge);void second(void);v

29、oid jsq(void);void random(void);sbit kl=P2A6;sbit k2=P3A7;sbit k3=P2A7;sbit k4=P2Al;sbit dp=P2A0;sbit key3=P2A4;sbit key2=P2A5;unsigned char code秒表函數(shù)的說明定時器函數(shù)的說明搖號函數(shù)的說明數(shù)碼管小數(shù)點(diǎn)位定義按鍵的位定義discode=0x84,0x9F,0xd0/0x91,0x8B,0xAl/0xA0,0x97,0x80,0x81; 數(shù)碼管字型unsigned int temp2=0,temp3=0,qian=0,bai=0/shi=0/ge=0;v

30、oid delay(void)10ms,誤差 Ous(unsigned char a,b,c;for(c=l;c>0;c")for(b=38;b>0;b-)for(a=130;a>0;a-);)void delay2(void)(unsigned char a,b,c;for(c=243;c>0;c-)for(b=50;b>0;b-)for(a=15;a>0;a-);)void delay2s(void) 誤差 Ous(unsigned char a,b,c;for(c=127;c>0;c-)for(b=235;b>0;b-)for(a

31、=32;a>0;a-);_nop_(); /if Keil,require use intrins.h)void main(void)(int templ=l,i;while(l)(if(!key2)(delay2();按鍵消抖if(!key2)(switch(templ)case 1:templ+; i=l;kl=0;k2=l;k3=l;k4=l;Pl=0x9F;break;case 2:templ+; i=2;kl=l;k2=0;k3=l;k4=l;Pl=0xD0;break;case 3:templ=l; i=3;kl=l;k2=l;k3=0;k4=l;Pl=0x91;break;

32、)if(!key3)(delay2();延時去抖動if(!key3)/K3鍵按下選擇相應(yīng)功能(if(i=l)while(l)secondf);if(!key3)delay2();if(!key3)(kl=0;k2=l;k3=l;k4=l;Pl=0x9f;temp2=0;break;)if(i=2)while(l)jsq();if(!key3)delayf);if(!key3)(kl=l;k2=0;k3=l;k4=l;Pl=OxdO;temp3=0;break;)if(i=3)while(l)random();if(!key3)delay2();jf(!key3)kl=l;k2=l;k3=0;k

33、4=l;Pl=0x91;break;)void disjnit(void)秒表、定時器數(shù)碼管的初始化kl=l;k2=l;k3=l;k4=0;Pl=0x84;dp=l;delayf);kl=l;k2=l;k3=0;k4=l;Pl=0x84;dp=l;delayf);kl=l;k2=0;k3=l;k4=l;Pl=0x84;dp=0;delayf);kl=O;k2=l;k3=l;k4=l;Pl=0x84;dp=l;delayf);)數(shù)碼顯示函數(shù)void displayfunsigned int qian,unsigned int bai,unsigned int shi,unsigned int g

34、e)kl=0;k2=l;k3=l;k4=l;Pl=discodeqian;dp=l;delayf);kl=l;k2=0;k3=l;k4=l;Pl=discodebai;dp=0;delayf);kl=l;k2=l;k3=0;k4=l;Pl=discodeshi;dp=l;delayf);kl=l;k2=l;k3=l;k4=0;Pl=discodege;dp=l;delayf);)void second(void)(int i=-lj,k;unsigned int recordN;HEAD:dis_init();定時器TO,方式1定時1ms,并賦初值TMOD=0x01;TH0=(65536-10

35、000)56;TL0=(65536-10000)%256;EA=1;EXO=1;ETO=l;temp2=O;if(key2=0)delay2();按鍵消抖if(!key2)TRO=1;while(l)定時器TO打開while(TFO)/采用查詢法 TFO=O;溢出標(biāo)志位軟件置0TH0=(65536-10000)/256; TL0=(65536-10000)%256; temp2+; if(temp2=lOOOO)/ 計時范圍 099.99stemp2=O; qian=temp/lOOO;利用整數(shù)除法得到千位bai=(temp2-(1000*qian)/100; 得到百位 shi=(temp2-

36、qian*1000-100*bai)/10; 得到十位 ge=temp2%10;利用求余運(yùn)算得到個位display(qian,bai,shi,ge);數(shù)碼管顯示相應(yīng)時間) if(!key3) delay2(); if(!key3) i+; recordi=temp2; 把記錄的時間所對應(yīng)的 /temp值存入數(shù)組record口中 ) ) if(!key2)delay2();delay2();if(!key2)TRO=O;再次按下K2鍵,關(guān)閉定時/計數(shù)器TO,break;跳出循環(huán),for(j=0;j<i+l;j+)依次顯示記錄好的時間if(!key3)qian=recordj/1000;ba

37、i=(recordj-(1000*qian)/100;shi=(recordj-qian*1000-100*bai)/10;ge=recordj%10;for(k=0;k<300;k+)display(qian,baizshi,ge);kl=k2=k3=k4=l;delay2s();)goto HEAD; 轉(zhuǎn)到函數(shù)頭部,相當(dāng)于復(fù)位)void jsq(void)定時器函數(shù)與秒表原理相同top:temp3=0;while(l)(dis_init();if(!key3)goto bottom;)if(!key2)(delay2();if(!key2)(temp3=temp3+1000;while(l)if(key2=O)delay2();if(!key2)temp3+=1000;每按下K2鍵一次,定時時間增加10秒if(temp3=10000)定時最長 90 秒temp3=0;)qian=tempV1000;bai=temp3%1000/100;shi=temp3%100/10;ge=temp3%10;display(qian,baizshi,ge);delay2();if(!key3)goto jishi;)jishi: TMOD=0x01;TH 1=(65536-10000)/256;TLl=(65536-10000)%256;EA=1;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論