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

下載本文檔

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

文檔簡介

1、C語言第三次大作業(yè)班級:機電 *姓名: *學(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è)計模塊化思想, 可自定

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

3、case 條件結(jié)構(gòu)。要注意的是數(shù)組的下標(biāo)從 0 開始;只能逐個引用數(shù)組元素, 不能一次引用整個數(shù)組; 數(shù)組做函數(shù)形式參數(shù)時,數(shù)組的大小可以不出現(xiàn)在數(shù)組名后面的方括號內(nèi); 被調(diào)用函數(shù)的實際參數(shù)用數(shù)組名或數(shù)組定義式。2、 NS流程圖輸入學(xué)生人數(shù)錄入各個學(xué)生的學(xué)號和成績無限循環(huán)是否按 ESC鍵退出否是相等常量 1常量 2不等不等相等相等常量 3常量不等4不等相等相等計按按按統(tǒng)退算成學(xué)學(xué)計出課績各號號等循程由由查級總高小詢所占環(huán)分到到學(xué)的和低大百生分平排排成比均出出績分成成及績績其表表成績常量 5不等相等常量 6不等輸其他常量不等相等出每個輸學(xué)出生“的對學(xué)不號起成,績沒及有重新選擇功能課該程功的能總選

4、分項和!平均”分傳統(tǒng)流程圖:開始輸入學(xué)生總?cè)藬?shù)錄入各個學(xué)生的學(xué)號和成績是否按ESC鍵退出Y結(jié)束NN輸入是否為數(shù)字Y功能 1常量 1常量 2功能 2常量 3功能 3常量 4功能 4常量 5功能 5功能 6常量 6default功能 7注:功能 1: 計算課程總分和平均分功能 2: 按成績由高到低排出名次表功能 3:按學(xué)號由小到大排出成績表功能 4:按學(xué)號查詢學(xué)生排名及其成績功能 5:統(tǒng)計各等級所占的百分比功能 6:輸出每個學(xué)生的學(xué)號、成績,課程總分和平均分功能 7:輸出“對不起,沒有該功能選項! ”breakbreakbreakbreakbreakbreakbreak3、調(diào)試及改錯1、缺少取地址

5、運算符“ &”寫好程序后,解決 ERROR后會情不自禁的執(zhí)行程序,一執(zhí)行便彈出如下對話框,回過頭看程序, 發(fā)現(xiàn) int read(long number,float score )函數(shù)中 “printf( 請輸入學(xué)生總?cè)藬?shù) :); ret=scanf(%d,n);”的語句中出現(xiàn)一個明顯的低級錯誤, 缺少取地址運算符“ &”。2、交換法排序邏輯錯誤解決了上述錯誤后,程序運行時執(zhí)行功能2,出現(xiàn)如下錯誤,并沒有達到預(yù)期交換成績的目的,但是學(xué)號卻排序正確,可以初步確定錯誤出現(xiàn)在void sort( longnumber,floatscore, intn)函數(shù)中。檢查發(fā)現(xiàn)標(biāo)志變量temp 為起到作用,交

6、換法語句中出現(xiàn)邏輯錯誤。錯誤的程序語句及修改如下:void sort(long number,float score,int n)int i,j;float temp;long m;for(i=1;in;i+)for(j=0;jn-i;j+)if(scorejscorej+1)scorej=temp;m=numberj;/應(yīng)改為“ temp=scorej;”scorej=scorej+1;numberj=numberj+1;scorej+1=temp;numberj+1=m;printf(n);for(i=0;in;i+)printf( 成績第 %d 名成績 :%ldt%.1fn,i+1,nu

7、mberi,scorei);3、數(shù)據(jù)類型錯誤解決了以上問題,再次編譯組建執(zhí)行時,統(tǒng)計各等級所占百分比出現(xiàn)失真。各成績等級均為0.00%。如下圖所示:一開始并未發(fā)現(xiàn)問題, step into試,輸入 3 位學(xué)生成績分別是98,93 和void analysis(float score,int n)函數(shù)調(diào)67,調(diào)試時查看數(shù)據(jù),如下圖:( 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;in;i+)switch(int)scor

8、ei/10)case 10:case 9:a=a+1;break;case 8:b=b+1;break;case 7:c=c+1;break;case 6:d=d+1;break;default:e=e+1;printf(n);printf( 優(yōu)秀( 90100)的人數(shù)為: %4dn,a);printf( 良好( 80 89)的人數(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

9、)/n);/ 紅色為修改后添加語句printf( 良好率:%.2f%n,float (100*b)/n);/ 因為ae,n 已被定義為intprintf( 中等率:%.2f%n,float(100*c)/n);/ 而輸出卻是float類型printf( 及格率 :%.2f%n,float(100*d)/n);/ 因此必須把(100*a )/aprintf( 不及格率:%.2f%n,float(100*e)/n); /轉(zhuǎn)化為強制轉(zhuǎn)化為float型4、源程序#include #include #include #define N 100void screen(char c);int read(lo

10、ng number,float score);void total_average(float score,int n);void sort(long number,float score,int n);void sortnumber(long number,float score,int n);void search(long number,float score,int n);void analysis(float score,int n);void listrecord(long number,float score,int n);void main(void)int n=0;char

11、choose;char ch=簡單的學(xué)生成績管理系統(tǒng)by 施芳輝 ;long numberN;float scoreN;screen(ch);n=read(number,score);/ 數(shù)組名做函數(shù)實參調(diào)用函數(shù)while(1)read()printf(n);printf(1、計算課程總分和平均分n);printf(2、按成績由高到低排出名次表n);printf(3、按學(xué)號由小到大排出成績表n);printf(4、按學(xué)號查詢學(xué)生排名及其成績n);printf(5、統(tǒng)計各等級所占的百分比n);printf(6、輸出每個學(xué)生的學(xué)號、成績,課程總分和平均分n);printf( 請選擇分析功能(按 E

12、SC退出 ):);choose=getche();if(choose=27)break;elseswitch(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);sortnumber(number,score,n);/ 調(diào)用學(xué)號排序函數(shù)break;case 52:printf(n);search(number,score,n); / 調(diào)用查詢函數(shù) resear

13、ch()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( 對不起,沒有該功能選項!);break;void delay(void)int a;for(a=0;a2000;a+);void gotoxy(int x,int y)COORD c=x,y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE

14、),c);void screen(char c)int i;gotoxy(20,1);for(i=0;i5;i+)printf(37);Sleep(200);delay();printf(%s,c);/ 輸出字符串?dāng)?shù)組ch中的內(nèi)容for(i=0;i5;i+)printf(37);Sleep(200);delay();putchar(n);int read(long number,float score) / 錄入學(xué)生成績,返回學(xué)生人數(shù)供后續(xù)函/ 數(shù)使用int n,i,ret;printf(n);printf( 請輸入學(xué)生總?cè)藬?shù):);ret=scanf(%d,&n);/ 記錄scanf 函數(shù)的返

15、回值while(ret!=1)/ 此處輸入數(shù)據(jù)個數(shù)或格式是否錯誤while(getchar()!=n);/ 清除輸入緩沖區(qū)中錯誤數(shù)據(jù)printf( 請輸入學(xué)生總?cè)藬?shù):);ret=scanf(%d,&n);/ 記錄scanf 函數(shù)的返回值for(i=0;in;i+)printf( 請輸入第 %d 位學(xué)號和成績 :如( 0000000,90.0):,i+1); ret=scanf(%ld%*c%f,&numberi,&scorei); / * 為忽略輸入修/ 飾符,此處 %*c 使得輸入學(xué)號與成績之間可用任意一個字符隔開while(ret!=2)/ 此處 while 語句與上述作用一樣while(

16、getchar()!=n);printf( 請輸入第 %d 位學(xué)號和成績 :如( 0000000,90.0): ,i+1);ret=scanf(%ld%*c%f,&numberi,&scorei);return n;void total_average(float score,int n)int i;float sum=0;for(i=0;in;i+)/ 總分計數(shù)循環(huán)語句sum=sum+scorei;printf(n);printf( 該課程的總分為 :%.2fn,sum);/“.2” 對于 float 類型,限/ 定其小數(shù)點位數(shù)為2 位printf( 課程的平均分為:%.2fn,sum/n)

17、;void sort(long number,float score,int n)int i,j;float temp;/ 定義一個標(biāo)志變量,用于排序long m;for(i=1;in;i+)for(j=0;jn-i;j+)if(scorejscorej+1)temp=scorej;m=numberj;scorej=scorej+1;/ 此段程序/ 用于成績/的排序,/并交換/ 相應(yīng)的/ 學(xué)號numberj=numberj+1;scorej+1=temp;numberj+1=m;printf(n);for(i=0;in;i+)printf( 成績第 %d 名成績 :%ldt%.1fn,i+1,

18、numberi,scorei);void sortnumber(long number,float score,int n)/ 此函數(shù)與上述 sort()/ 函數(shù)類似,關(guān)鍵是排序int i,j;float temp;long m;for(i=1;in;i+)for(j=0;jnumberj+1)m=numberj;temp=scorej;numberj=numberj+1;scorej=scorej+1;numberj+1=m;scorej+1=temp;printf(n);for(i=0;in;i+)printf( 學(xué)號由小到大排序 :%ldt%.1fn,numberi,scorei);vo

19、id search(long number,float score,int n)int i;long sort;printf( 請輸入要查詢的學(xué)生學(xué)號:);scanf(%ld,&sort);printf(n);for(i=0;in;i+)/ 利用for循環(huán)語句,實現(xiàn)順序查找if(numberi=sort)printf( 查詢學(xué)生的學(xué)號 %ld,成績?yōu)?%.1fn,sort,scorei);void analysis(float score,int n)int a=0,b=0,c=0,d=0,e=0,i;for(i=0;in;i+)switch(int)scorei/10)/ 數(shù)據(jù)類型的強制轉(zhuǎn)換

20、,因為score 數(shù)組/ 的數(shù)據(jù)類型是 float ,而這里算等級利用整數(shù)。case 10: case 9:a=a+1;break;case 8: b=b+1; break;case 7: c=c+1;break;case 6:d=d+1;break;default:e=e+1;printf(n);printf( 優(yōu)秀( 90100)的人數(shù)為: %4dn,a);printf( 良好( 80 89)的人數(shù)為:%4dn,b);printf( 中等( 70 79)的人數(shù)為:%4dn,c);printf( 及格( 60 69)的人數(shù)為: %4dn,d);printf( 不及格( 059)的人數(shù)為 :

21、%4dn,e);printf( 優(yōu)秀率:%.2f%n,float(100*a)/n);/ 同樣的, a,n 均定義為 int/ 類型,要得到精確 2 位小數(shù)點,要把 (( 100*a)/n) 強制轉(zhuǎn)換為 float 類型。 printf( 良好率: %.2f%n,float(100*b)/n);printf( 中等率: %.2f%n,float(100*c)/n);printf( 及格率 :%.2f%n,float(100*d)/n);printf( 不及格率 :%.2f%n,float(100*e)/n);void listrecord(long number,float score,int

22、 n)int i;printf(n);for(i=0;in;i+)printf( 學(xué)生學(xué)號為 %ld 的成績是 :%.1fn,numberi,scorei);total_average(score,n);5、心得體會要寫好一個程序并不容易, 就像這么一個并不是特別復(fù)雜的程序,剛寫好時錯誤百出,就連最低級的錯誤如缺少“; ”,取地址運算符“ &”,數(shù)據(jù)的定義(特別是數(shù)據(jù)類型),數(shù)據(jù)的初始化都會出錯,原因只有一個:不細心、少實踐、少留心!程序?qū)懚嗔耍亩嗔?,自然在寫的時候就會多留一份心,自然會在寫到容易出錯的地方提醒自己。本次特別加強了程序流程圖的學(xué)習(xí)。題目二:基于 V2 寫一個鍵控的簡單的菜單功

23、能選擇程序,可以計時、可以定時、可以搖號(搖號范圍自定) 。定時、計數(shù)要求使用外部晶振(約12M),結(jié)合定時器 / 計數(shù)器原理,精確到 0.01 秒,最長計時 99.99 秒。顯示格式形如“ 00.00”。同時,秒表可以記錄多個時間點, 并在數(shù)碼管輪流顯示; 定時器定時時間可通過按鍵調(diào)整,定時范圍自定。1、算法及題意分析菜單可以利用 K2 鍵選擇功能“ 1”“2”或“ 3”,鍵控秒表可以使用 K2 鍵開始,每按 K3 鍵記錄一次,再按 K2 鍵把記錄的成績依次在數(shù)碼管上顯示。 0.01 秒精確度,可使用定時器 T0 定時 0.01 秒(初始值 TH0=( 65535-10000)/256,TL

24、0=(65536-10000)%256),可采用中斷法或查詢法,每定時完成一次數(shù)碼管顯示一次。定時器可以設(shè)置K2 鍵沒按一次,定時時間增加相應(yīng)的量(10S),K3 鍵暫停,再按 K2 鍵繼續(xù)。搖號可利用Rand()函數(shù), K2 鍵按下時獲得搖號數(shù)字,K3 鍵重新?lián)u號。每個功能在初始態(tài)通過按K3 鍵返回功能選擇菜單。2、源程序#include #include #include #define N 40/ 秒表計時器最多可記錄40 個數(shù)據(jù)void dis_init(void);void display(unsigned int qian,unsigned int bai,unsigned int

25、 shi,unsigned int ge);void second(void);void jsq(void);void random(void);/ 秒表函數(shù)的說明/ 定時器函數(shù)的說明/ 搖號函數(shù)的說明sbit k1=P26;sbit k2=P37;sbit k3=P27;sbit k4=P21;sbit dp=P20;sbit key3=P24;/ 數(shù)碼管小數(shù)點位定義/ 按鍵的位定義sbit key2=P25;unsigned char codediscode=0x84,0x9F,0xd0,0x91,0x8B,0xA1,0xA0,0x97,0x80,0x81;/ 數(shù)碼管字型碼, 09unsi

26、gned int temp2=0,temp3=0,qian=0,bai=0,shi=0,ge=0; void delay(void) /10ms, 誤差 0us unsigned char a,b,c;for(c=1;c0;c-)for(b=38;b0;b-)for(a=130;a0;a-);void delay2(void)unsigned char a,b,c;for(c=243;c0;c-)for(b=50;b0;b-)for(a=15;a0;a-);void delay2s(void)/ 誤差 0usunsigned char a,b,c;for(c=127;c0;c-)for(b=2

27、35;b0;b-)for(a=32;a0;a-);_nop_();/if Keil,require use intrins.hvoid main(void)int temp1=1,i;while(1)if(!key2)delay2();/ 按鍵消抖if(!key2)switch(temp1)case 1:temp1+;i=1;k1=0;k2=1;k3=1;k4=1;P1=0x9F;break;case 2:temp1+;i=2;k1=1;k2=0;k3=1;k4=1;P1=0xD0;break;case 3:temp1=1;i=3;k1=1;k2=1;k3=0;k4=1;P1=0x91;bre

28、ak;if(!key3)delay2();/ 延時去抖動if(!key3)/K3鍵按下選擇相應(yīng)功能if(i=1)while(1)second();if(!key3)delay2();if(!key3)k1=0;k2=1;k3=1;k4=1;P1=0x9f;temp2=0;break;if(i=2)while(1)jsq();if(!key3)delay();if(!key3)k1=1;k2=0;k3=1;k4=1;P1=0xd0;temp3=0;break;if(i=3)while(1)random();if(!key3)delay2();if(!key3)k1=1;k2=1;k3=0;k4=

29、1;P1=0x91;break;void dis_init(void)/ 秒表、定時器數(shù)碼管的初始化k1=1;k2=1;k3=1;k4=0;P1=0x84;dp=1;delay();k1=1;k2=1;k3=0;k4=1;P1=0x84;dp=1;delay();k1=1;k2=0;k3=1;k4=1;P1=0x84;dp=0;delay();k1=0;k2=1;k3=1;k4=1;P1=0x84;dp=1;delay();/ 數(shù)碼顯示函數(shù)void display(unsigned int qian,unsigned int bai,unsigned int shi,unsigned int

30、ge)k1=0;k2=1;k3=1;k4=1;P1=discodeqian;dp=1;delay();k1=1;k2=0;k3=1;k4=1;P1=discodebai;dp=0;delay();k1=1;k2=1;k3=0;k4=1;P1=discodeshi;dp=1;delay();k1=1;k2=1;k3=1;k4=0;P1=discodege;dp=1;delay();void second(void)int i=-1,j,k;unsigned int recordN;HEAD:dis_init();TMOD=0x01;/ 定時器T0,方式1TH0=(65536-10000)/256

31、;/ 定時1ms,并賦初值TL0=(65536-10000)%256;EA=1;EX0=1;ET0=1;temp2=0;if(key2=0)delay2();/ 按鍵消抖if(!key2)TR0=1;/ 定時器 T0 打開while(1)while(TF0)/采用查詢法TF0=0;/ 溢出標(biāo)志位軟件置0TH0=(65536-10000)/256;TL0=(65536-10000)%256;temp2+;if(temp2=10000)/計時范圍099.99stemp2=0;qian=temp2/1000;/ 利用整數(shù)除法得到千位bai=(temp2-(1000*qian)/100;/ 得到百位s

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

33、dj-(1000*qian)/100;shi=(recordj-qian*1000-100*bai)/10;ge=recordj%10;for(k=0;k300;k+)display(qian,bai,shi,ge);k1=k2=k3=k4=1;delay2s();goto HEAD;/ 轉(zhuǎn)到函數(shù)頭部,相當(dāng)于復(fù)位void jsq(void)/ 定時器函數(shù)與秒表原理相同top:temp3=0;while(1)dis_init();if(!key3)delay2();if(!key3)goto bottom;if(!key2)delay2();if(!key2)temp3=temp3+1000;w

34、hile(1)if(key2=0)delay2();if(!key2)temp3+=1000;/ 每按下K2 鍵一次,定時時/ 間增加 10 秒if(temp3=10000)/ 定時最長90 秒temp3=0;qian=temp3/1000;bai=temp3%1000/100;shi=temp3%100/10;ge=temp3%10;display(qian,bai,shi,ge);if(!key3)delay2();if(!key3)goto jishi;jishi:TMOD=0x01;TH1=(65536-10000)/256;TL1=(65536-10000)%256;EA=1;EX0=1;ET0=1;TR0=1;while(1)while(TF0)TF0=0;TH0=(65536-10000)/256;TL0=(65536-10000)%256;temp3-;if(tem

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論