版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第 2 章 程序員下午試題分析 與解答試題一閱讀以下說明和流程圖,填補流程圖中的空缺 (1)(5) 。【說明】某單位動態(tài)收集的數(shù)據(jù)中常包含重復的數(shù)據(jù),所以需要進行處理,使得重復的數(shù)據(jù)僅出現(xiàn)一次。下面流程圖的功能是:在 n(n 1)個數(shù)據(jù) D1、D2、 、 Dn 中,選出其中所有不重復的 k 個數(shù)據(jù),置于原來前 k個數(shù)據(jù)的位置上。該流程圖的算法如下:第 1 個數(shù)據(jù)必然被選出,然后從第 2 個數(shù)據(jù)開始,逐個考查其余的數(shù)據(jù)。假設(shè)D1、D2、 、Dm(m 1)是已經(jīng)選出的、 不重復的數(shù)據(jù),則對于數(shù)據(jù) Di(mi n),將其依次與 DmDm-1 、 、D1進行比較,若沒有發(fā)現(xiàn)與之相同者,則Di 被選出并
2、置于 Dm+1 的位置上;否則對Di 不做處理。例如,如下 10 個數(shù)據(jù):5,2,2,7,4, 4,7, 1,9, 1 (n=10)經(jīng)過上述算法處理后的結(jié)果為:5,2,7,4, 1,9 (k=m=6)【流程圖】注:循環(huán)開始的說明按照“循環(huán)變量名:循環(huán)初值,循環(huán)終值,增量”格式描述。答案(1)1 (2)2 (3)m (4)Dm+1(5)mm+1,或其等價表示試題一 分析 本題涉及信息處理工作中常用的算法。動態(tài)收集得到的一批記錄中,常包含有某些重復的記錄。在做進一步處理前,應當刪除這些重復記錄。所謂重復記錄,通常是指那些具有相同關(guān)鍵詞的記錄。注意,從經(jīng)驗上看,重復記錄往往出現(xiàn)在比較臨近的記錄中。為
3、了刪除重復記錄,可以采用本題中的算法思想。對于題中給出的例子,該算法執(zhí)行的動態(tài)情況如下表:D1 D2 D3 D4 D5 D6 D7 D8 D9 D105 2 2 7 4 4 7 1 9 15 2 7 4 1 9具體做法如下:逐個考查D1,D2, , D10 的內(nèi)容。首先,保留 D1 中的內(nèi)容 5,將其作為已經(jīng)選出的不重復數(shù)據(jù),此時m應是 1??疾镈2時,將其與 D1進行比較,發(fā)現(xiàn)不同,所以保留,形成不重復數(shù)據(jù) D1、D2,此時m=2。考查D3時,分別將其與 D2、D1進行比較,發(fā)現(xiàn)有重復,不做處理??疾镈4時,分別將其與 D2、D1進行比較,發(fā)現(xiàn)不同,將 D4 的內(nèi)容放到 D3 中,形成不重復
4、數(shù)據(jù) D1、D2、D3,此時m=3??疾镈5時,分別將其與 D3D1進行比較,發(fā)現(xiàn)不同, 將 D5 的內(nèi)容放到 D4 中,形成不重復數(shù)據(jù) D1D4,此時m=4。考查D6時,分別將其與 D4D1進行比較,發(fā)現(xiàn)有重復,不做處理??疾镈7時,分別將其與 D4D1進行比較,發(fā)現(xiàn)有重復,不做處理:考查D8時,分別將其與 D4 D1進行比較,發(fā)現(xiàn)不同,將 D8 的內(nèi)容放到 D5 中,形成不重復數(shù)據(jù) D1D5,此時m=5??疾镈9時,分別將其與 D5 D1進行比較,發(fā)現(xiàn)不同,將 D9 的內(nèi)容放到 D6 中,形成不重復數(shù)據(jù) D1D6,此時m=6??疾镈10時,分別將其與 D6D1進行比較,發(fā)現(xiàn)有重復,不做處理
5、。考查結(jié)束,形成不重復數(shù)據(jù) D1D6,此時m=6。對于一般的情況,就要逐個考查D1, D2, , Dn 的內(nèi)容。首先保留 D1 中的內(nèi)容,作為已選出的不重復數(shù)據(jù),此時設(shè)置 m=1。對于已經(jīng)選出的不重復數(shù)據(jù) D1,D2, , Dm ,考查Di(mi n),將其與 Dm,Dm-1, , D1 逐一比較。若發(fā)現(xiàn)有重復,則不做處理;發(fā)現(xiàn)完全不同時,應將 Di 的內(nèi)容放入 Dm+1 ,然后,將 m 增加 1。注意,在考查Di時,由于重復數(shù)據(jù)離它更近些,將其與 Dm,Dm-1, , D1 逐一比較可以節(jié)省時間;若與 D1,D2, , Dm 逐個比較,發(fā)現(xiàn)重復的時間會比較長一些。對于程序員來說,能在細節(jié)處適
6、當考慮程序的效率也是好的。因此,在本題的流程圖中, (1)處應填 1,表示初始時設(shè)置 m=1。對于 /2 個數(shù)據(jù) (n1)而言,接著應逐個考查D2 , , Dn 的內(nèi)容,因此循環(huán)應對i=2,n,1進行,所以 (2)處應填 2??疾镈i時,需要將其分別與 Dm ,Dm-1 , , D1 逐一比較,所以循環(huán)應對, j=m , 1,-1進行,從而 (3)處應填 m。若在比較過程中發(fā)現(xiàn)重復,則直接返回主程序 (不做處理 );若始終沒有發(fā)現(xiàn)重復數(shù)據(jù),則應將 Di 存入 Dm+1 ,所以 (4)處應填 Dm+1 。然后,應將重復數(shù)據(jù)數(shù)目加 1,所以 (5)處應填 mm+1(或 m+1m)。試題二閱讀以下說
7、明和 C語言函數(shù),將應填入 (n)處?!菊f明】已知 1900 年 1 月 1 日是星期一, 下面的函數(shù) count_5_13(int year) 用于計算給定的年份 year 中有幾個“黑色星期五” ?!昂谏瞧谖濉敝讣仁?13 日又是星期五的日期。函數(shù) count_5_13(int year) 首先算出年份 year 的 1 月 13 日是星期幾,然后依次計算每個月的 13 日是星期幾,若是星期五,則計數(shù)。程序中使用了函數(shù) isLeapYear(int year) ,其功能是判斷給定年份是否為閏年, 返回值為1(或 0)表示 year是(或不是 )閏年。【C語言函數(shù)】int count_5_
8、13(int year)int date; /*date為0 表示星期日,為1 6 分別表示星期一至星期六 */long days=0; /*days記錄天數(shù) */int m, y,c=0; /*c 用于表示黑色星期五的個數(shù) */if (year1900) return-1;/*計算從 1900 年 1 月 1 日起至給定年份 year 的 1 月 13 日間隔的天數(shù) */days=12;for (y= 1900 ; y year; y+) days +=365;if (isLeapYear(y) (1) ;date=(days%7) +1) %7; /* 算出給定年份 year 的 1 月
9、13 日是星期幾 */c=( (2) ) ?1:0;for(m=1 ; (3) ;m+) switch (m) case 1:case 3: case 5: case 7: case 8: case 1 0:case 12:days=31; break;case 4: case 6: case 9: case 11:days=30; break;case 2:days=28;if( (4) ) days=29;break;/*end of switch*/date=(days%7)+ (5) )%7;if (date=5) c+; /*end of for*/return c;答案(1)day
10、s+,days+=1,days=days+1,或其等價表示(2)date=5,或其等價表示(3)m12,或其等價表示(4)isLeapYear(year) ,或 year%4=0 && year%100!=0|year%400=0 ,或其等價表示(5)date試題二 分析 本題考查基本程序設(shè)計能力。題中程序用于計算給定年份中“黑色星期五” (既是 13 日又是星期五的日期 )的數(shù)目。 基本的常識為平年每年 365 天、閏年 366 天。若今天是星期三 (date),則7 天后的那天也是星期三,依此類推,可算出m 天后為星期幾 (date+m)%7 ,為0 表示星期日 )。題目中
11、給出了 1900 年 1 月 1 日是星期一,因此,對于給定的日期,首先需要算出其距離 的天數(shù),然后用上式計算該日期對應星期幾。要計算給定年份中有幾個“黑色星期五” ,可先計算出該年份的 1 月 13 日是星期幾,然后計算該年內(nèi)每月的 13 日是星期幾。 所以,程序中首先計算出 1900 年 1 月 1 日至給定年份的 1 月 13 日共有多少天 (days)。在計算給定日期段的天數(shù)時,需要考慮大、小月,對于 2 月份,則需要考慮當前年號是否為閏年。期間若跨年度,則按每年 365 天 (閏年 366 天)累加天數(shù)。對于以下代碼段:for (y = 1900 ; y year; y+) days
12、+=365;if(isLeapYear(y) (1) ;顯然,程序中空 (1)處應填入 days+或其等價表示形式。根據(jù)程序中的注釋,經(jīng)語句 date=(days%7)+1)%7 ;處理后, date 表示給定年份的 1 月 13 日是星期幾,而 c 用于表示“黑色星期五”的個數(shù),因此空 (2)處應填入 date=5。在下面的代碼中,計算給定年份 2 月份之后每個月的 13 日星期幾 (計算天數(shù)時需要考慮大、小月, 2月份要考慮是否為閏年 ),其中 m 表示月號。for(m=1 ; (3) ;m+) switch (m) case 1: case 3: case 5: case 7: case
13、 8: case 1 0: case 1 2:days=31; break;case 4: case 6: case 9: case 11:days=30; break;case 2:days=28;if( (4) ) days=29;break;/*end of switch*/由于 1 月 13 日已經(jīng)考慮過, 因此需要考慮的日期為2 月至 12 月的每個 13 日,當月份 m為12時,再計算出的日期就是下一年度的 1 月 13 日了,因此空 (3)處應填入 m12,空(4)處顯然是判斷當前年號是否為閏年,因此應填入 isLeapYear(year)或 isLeapYear(y) 。對于代
14、碼date(days%7)+ (5) %7;,之前已用 date 表示上個月 13 日是星期幾, days 表示間隔的天數(shù),因此空 (5)處應填入 date。試題三閱讀以下說明和 C語言程序,將應填入 (n) ?!菊f明】某電信公司記錄了每個用戶的詳細通話情況 (每次通話數(shù)據(jù)記錄在一行 ),現(xiàn)將某用戶某月的通話數(shù)據(jù)存入一個文本文件 dial.txt ,其數(shù)據(jù)格式如下:撥入或撥出標記通話開始時間通話結(jié)束時間對方號碼注 1:數(shù)據(jù)字段以一個空格作為分隔符。注 2:撥入和撥出標記均為小寫字母。撥入標記為i,表示其他用戶呼叫本機,本機用戶不需付費:撥出標記為o,表示本機呼叫其他用戶,此時本機用戶需要付費。
15、注 3:通話開始和結(jié)束時間的格式均為HH :MM :S S。其中 HH 表示小時,取值00 23;MM 表示分鐘,取值0059;SS 表示秒,取值0059。從通話開始到結(jié)束這段時間稱為通話時間,假定每次通話時間以秒為單位,最短為1 秒,最長不超過24 小時。注 4:跨月的通話記錄計入下個月的通話數(shù)據(jù)文件。例如“ o23:01: 1200:12:15 ”表示本次通話是本機呼叫其他用戶,時間從 23時01 分 12 秒至次日的 0時12 分 15 秒,通話時間為71 分 03 秒。下面程序的功能是計算并輸出該用戶本月電話費(單位:元 )。通話計費規(guī)則為:1月通話費按每次通話費累加;2每次的通話費按
16、通話時間每分鐘0.08 元計算,不足 1 分鐘時按 1 分鐘計費。對于每次的撥出通話,程序中先分別計算出通話開始和結(jié)束時間相對于當日 0 點 0 分 0 秒的時間長度(以秒為單位 ),然后算出本次通話時間和通話費。例如,若輸入文件 dial.txt 的數(shù)據(jù)如下所示,則輸出 fee=7.44。o 14:05:23 14:11:25 82346789i 15:10:00 16:01:15 o 10:53:12 11:07:05 63000123o 23:01:12 00:12:15 【C 程序代碼】#includestdio.hFILE *fin ;Int main()char str80 ;in
17、t h1,h2,m1, m2,s1,s2;long t_start,t_end,interval ;int c;double fee=0;fin=fopen("dial.txt" ,"r") ;if (!fin)return-1;while (!feof(fin) if (!fgets(str , 80,fin) break;if ( (1) ) continue;h1= (str2 -48) *10+str3 -48;m1= (str5 -48) *10+str6 -48;s1= (str8 -48) *10+str9 -48;h2= (str11 -
18、48) *10+str12 -48 ;m2= (str14 -48) *10+str15 -48 ;s2=(str17-48)*10+str18-48 ;t_start=h1*60*60+m1*60+s1 ; /* 通話開始時間*/t_end=h2*60*60+m2.60+s2 ; /*通話結(jié)束時間*/if( (2) ) /* 若通話開始和結(jié)束時間跨日 */interval; (3) -t_start+t_end ;elseinterval=t_end-t_start ;c= (4) ; /*計算完整分鐘數(shù)表示的通話時間*/if (interval % 60)(5) ;fee+=c*0.08
19、;fclose(fin) ;printf("fee=%.2lfn" ,fee);return 0;答案(1)str0='i' ,或 *str='i' ,或其等價表示(2)t endt start,或其等價表示(3)24*60*60 ,或 86400,或其等價表示(4)interval/60(5)c+ ,c+=1 ,c=c+1,或其等價表示試題三 分析 本題考查基本程序設(shè)計能力。對于讀入的每一條通話記錄,首先判斷其是 i還是 o,若是 i(撥入 ),則不計費,然后讀入下一條通話記錄,因此空 (1)處應填入 str0='i'( 或
20、*str='i') 。根據(jù)通話開始時間和結(jié)束時間的計算方式 (相對于當日 0 點 0 分 0 秒的時間長度 ),一般情況下,若通話的開始時間和結(jié)束時間在同一天內(nèi),則結(jié)束時間應大于開始時間。但是若通話從 0 點前卉始而結(jié)束于 0點之后,則會出現(xiàn)開始通話時間大于結(jié)束通話時間的情況,因此 0 點之前到 0 點整的通話長度就是全天的秒數(shù)減去以秒為單位的開始時間,即 24*60*60-t start。因此空, (2)處填入 t endt start,而空 (3)處填入24*60*60 或 86400。從程序中可知, interval 是以秒為單位的通話長度,而話費是以分鐘為單位計算的,所
21、以空 (4)處填入interval/60 ,剩余時間則按一分鐘計費,因此空 (5)處填入 c+。試題四閱讀以下說明和 C語言函數(shù),將應填入 (n) ?!菊f明】已知包含頭結(jié)點 (不存儲元素 )的單鏈表的元素已經(jīng)按照非遞減方式排序,函數(shù) compress(NODE*head)的功能是去掉其中重復的元素,使得鏈表中的元素互不相同。處理過程中,當元素重復出現(xiàn)時,保留元素第一次出現(xiàn)所在的結(jié)點。圖2-1(a)、(b)是經(jīng)函數(shù) compress()處理前后的鏈表結(jié)構(gòu)示例圖。鏈表的結(jié)點類型定義如下:typedef struct Nodeint data;struct Node *next ;NODE ;【C語
22、言函數(shù)】void compress(NODE *head) NODE *ptr ,*q ;ptr= (1) ; /*取得第一個元素結(jié)點的指針*/while( (2) && ptr- next) q=ptr-next;while(q&& (3) ) /*處理重復元素 */(4) q-next;free(q);q=ptr-next;(5) ptr-next;/*end of while */*end of compress*/答案(1)head-next(2)ptr(3)q-data = ptr-data或 ptr-next- data=ptr- data,或其等價
23、表示(4)ptr- next(5)ptr試題四 分析 本題考查基本程序設(shè)計能力。鏈表上的查找、插入和刪除運算是常見的考點。本題要求去掉鏈表中的重復元素,使得鏈表中的元素互不相同,顯然是對鏈表進行查找和刪除操作。對于元素已經(jīng)按照非遞減方式排序的單鏈表,刪除其中重復的元素,可以采用兩種思路。1順序地遍歷鏈表,對于邏輯上相鄰的兩個元素,比較它們是否相同,若相同,則刪除后一個元素的結(jié)點,直到表尾。代碼如下:ptr=head- next; /* 取得第一個元素結(jié)點的指針*/while (ptr && ptr- next) /* 指針ptr 指示出重復序列的第一個元素結(jié)點 */q=ptr-
24、next;while(q && ptr- data=q-data) /*處理重復元素 */ptr-next=q- next; /* 將結(jié)點從鏈表中刪除 */free(q);q=ptr-next; /*繼續(xù)掃描后繼元素 */ptr=ptr- next;2對于每一組重復元素,先找到其中的第一個結(jié)點,然后向后查找,直到出現(xiàn)一個相異元素時為止,此時保留重復元素的第一個結(jié)點,其余結(jié)點則從鏈表中刪除。ptr=head- next; /* 取得第一個元素結(jié)點的指針*/while (ptr && ptr- next) /* 指針ptr 指示出重復序列的第一個元素結(jié)點 */q=p
25、tr-next;while(q && ptr- data=q-data) /*查找重復元素 */q=q-next;s=ptr-next; /*需要刪除的第一個結(jié)點 */ptr-next=q; /* 保留重復序列的第一個結(jié)點,將其余結(jié)點從鏈表中刪除 */while (s && s!=q /* 逐個釋放被刪除結(jié)點的空間*/t = s-next; free(s); s = t;ptr=ptr-next;題目中采用的是第一種思路。試題五閱讀下列說明、圖和 C+代碼,回答問題1 至問題3?!菊f明】已知四個類之間的關(guān)系如圖2-2 所示,分別對每個類的方法進行編號,例如 Sh
26、ape 的 perimeter() 方法為1 號,表示為1:perimeter(),Rectangle類的 perimeter()為2 號,表示為2:perimeter(),依此類推,其中,每個類的 perimeter 方法都為虛函數(shù)且方法簽名相同?!綜+代碼】Triangle *tr=new Triangle() ;Square *sq=new Square();Shape *sh =tr;【問題1】 關(guān)于上述 C+代碼中 sh 和 tr 的以下敘述中,哪兩個是正確的 (寫出編號 )。sh 和 tr 分別引用同一個對象;sh 和 tr 分別引用同一類型的不同的對象:sh 和 tr 分別引用不
27、同類型的不同對象;sh 和 tr 分別引用同一個對象的不同備份:sh 和 tr 所引用的內(nèi)存空間是相同的?!締栴}2】 寫出下面消息對應的方法編號 (如果該消息錯誤或者沒有對應的方法調(diào)用,請?zhí)顚憽盁o”)。tr-height() (1)sh-perimeter() (2)sq-height() (3)sq-perimeter() (4)sh-height() (5)tr-perimeter() (6)【問題3】 不考慮內(nèi)存釋放問題,下列賦值語句中哪兩個是合法的 (寫出合法賦值語句的編號 )。sq=sh; sh=tr; tr=sq; sq=tr; sh=sq;答案問題1 問題2(1)3 (2)5 (
28、3)無 (4)4 (5)無 (6)5問題3 試題五 分析 根據(jù) C+ 代碼:Triangle *tr=new Triangle() ;Square *sq=new Square();Shape *sh=tr;可以得出下面的結(jié)論: tr 指向一個 Triangle對象,sq 指向一個 Square對象,sh 和 tr 指向同一個 Triangle對象。下面對問題1給出的論斷進行判斷,、正確,由于 sh 和 tr 指向同一個對象,因此其引用的內(nèi)存空間也是相同的,不存在不同的備份。、和錯誤。根據(jù)題目的描述,我們知道 perimeter 是虛擬函數(shù),所以所有通過sh調(diào)用的 perimeter 都將實際
29、調(diào)用Triangle類的 perimeter 方法。· tr-height() :因為tr 指向一個 Triangle對象,所以調(diào)用 Triangle類的 height 方法。· sh- perimeter():因為sh 指向的是一個 Trangle對象,所以調(diào)用 Triangle類的 perimeter 方法。· sq- height():因為sq 指向的是 Square對象, 但 Square類并沒有 height 方法,所以未對應任何方法調(diào)用。 · sq-perimeter() :因為sq 指向的是 Square對象,所以調(diào)用 Square類的 p
30、erimeter 方法。· sh- height():雖然 sh 指向的是一個 Trangle對象, sh 中并未定義height 方法,所以此調(diào)用錯誤。· tr-perimeter() :因為tr 指向一個 Triangle對象,所以調(diào)用 Triangle類的 perimeter 方法。問題3 主要考慮類型問題, 我們只能夠?qū)⒆宇愵愋偷膶嵗蛞觅x值給父類類型的變量或引用。 因此,賦值運算的左邊一定是右邊的父類或同一類型。正確的只有和。試題六閱讀以下應用說明以及 Visual Basic 程序代碼,將應填入 (n) 。【應用說明】某電視臺擬開發(fā)應用程序來顯示戲曲大賽中 1
31、4 號四位選手決賽的現(xiàn)場投票情況。該程序從現(xiàn)場觀眾中 (不超過2000 人)每 0.5 秒收集一次對這四位選手的支持票數(shù),并在屏幕上動態(tài)顯示這四位選手的票柱(以高度反映票數(shù) )與累計得票數(shù),如圖2-3 所示。投票過程限時30 秒,每名觀眾最多為1 名選手投票。投票結(jié)束后系統(tǒng)通過比較各位選手的累計得票數(shù),顯示決賽結(jié)果: “ *號勝出” (如有單個冠軍)或“繼續(xù)進行PK”(如有多人獲得相同的最高票數(shù) )。在開發(fā)該程序的過程中創(chuàng)建的主要控件及其初始屬性值說明如下:控件名類型 用途 初始屬性設(shè)置ShpM(1to4) 形狀數(shù)組顯示各選手得票情況 矩形,實心,高度 0txtM(1to4) 文本框數(shù)組顯示各
32、選手得票數(shù) 0cmdStatr 命令按鈕啟動計票標題:開始投票txtResult 文本框顯示決賽結(jié)果 空Timl計時器 每半秒收集處理一次間隔時間0.5 秒,關(guān)閉狀態(tài)該程序中設(shè)置公共變量 T動態(tài)記錄投票時間。四個形狀 ShpM(1 to 4)動態(tài)增長的底線固定。【Visual Basic 程序代碼】Dim T As Integer '聲明全局變量Private Sub Form_Load()For i=1 To 4ShpM(i).Top=2000 : ShpM(i).Height=0 '初始票柱高度為0TxtM(i).Text=0Next iTiml.Enabled=False
33、 : Timl.Interval=500 : T=0End SubPrivate Sub CmdStart Click()Timl.Enabled=True '開始投票CmdStart.Enabled=FalseEnd SubPrivate Sub Timl Timer()Dim n(1 To 4) As Integer 'n(1 to 4)為每次收集的票數(shù)Dim i As Integer ,j As IntegerDim G As Integer 'G 用于計算最高票數(shù)Dim ng As Integer 'ng 用于計算冠軍個數(shù)For i=1 To 4n(i)
34、=. '收集 i 號選手的票數(shù),此處省略TxtM(i).Text=TxtM(i).Text+n(i) '累計票 (VB 能進行自動轉(zhuǎn)換)ShpM(i).Top=ShpM(i).Top-n(i)ShpM(i).Height=ShpM(i).Height+ (1) '算出票柱高度Next iT=T+1 '計時If T=60 Then '投票時間到(2) '停止數(shù)據(jù)收集處理ng = 1G=TxtM(1).TextFor i=2 To 4If G TxtM(i).Text ThenG=TxtM(i).Textng= (3)j = iElseIf G=Tx
35、tM(i).Text Then ng= (4) '計算冠軍個數(shù)End IfNext iIf ng=1 ThentxtResult. Text= (5) '單個冠軍結(jié)果ElsetxtResult. Text="繼續(xù)進行 PK"End IfEnd IfEnd Sub答案(1)n(i) (2)Timl.Enabled=False (3)1(4)ng+1 (5)Str$(j)+ “號勝出”,或 Str(j)+ “號勝出”試題六 分析 本題是 VB應用程序設(shè)計題,涉及到文本框、命令按鈕、定時器、形狀和控件數(shù)組的設(shè)計方法。同一控件數(shù)組中的各個控件,具有相同的名、不同的下
36、標。采用控件數(shù)組有利于在程序中進行循環(huán)處理。在開發(fā)時,只要設(shè)計了一個控件,再用復制的方法就能形成控件數(shù)組。在本題的程序代碼中,一開始就設(shè)置 T為整數(shù)類型的全局變量,用于定時計數(shù) (以半秒為單位 )。因為初始加載主窗口的過程 Form Load時需要為它賦初始值0,而每次進入定時過程 Timl Timer時需要增 1,退出該過程后需要保留其值。主窗口的過程 Form Load 在每次啟動應用程序時都會自動加載并執(zhí)行,因此在該過程中需要設(shè)置 4 個票柱形狀的初始位置,還需要設(shè)置 4 個得票數(shù)文本框的初始內(nèi)容及定時器的初始參數(shù)。4 個票柱形狀 ShpM(1)ShpM(4) 在開發(fā)時就已設(shè)置成矩形 (
37、屬性 Shape=0)、實心 (屬性 Fillstyle=0) 、高度為0(屬性 Height=0) 。而在每次程序運行時,這幾個形狀的頂部位置 (屬性 Top值)及高度 (屬性 Height值)都會有變化,所以在過程 Form_Load 中,應該設(shè)置初始值,起到恢復作用。這是編程時應該養(yǎng)成的良好習慣。該過程中, 4 個票柱形狀的頂部位置都設(shè)置成像素 2000,而且高度為0,所以,初始時4 個票柱都呈現(xiàn)在同一水平線上。該過程中,各個得票數(shù)文本框 TxtM(i) 內(nèi)容均設(shè)置為0(系統(tǒng)會自動進行數(shù)值與字符的轉(zhuǎn)換 )。定時器的初始參數(shù)設(shè)置包括屬性 Enable=False(關(guān)閉)、屬性 Interv
38、al=5000(時間間隔設(shè)置為500ms,即半秒 )。在命令按鈕“開始投票” (CmdStart) 的單擊過程 (CmdStart Click) 中,需要將定時器設(shè)置成打開可用狀態(tài)(Timl.Enable=Tree) 。這時,定時器將按時間間隔屬性所確定的時間發(fā)出中斷,觸發(fā)Timl Timer過程。在該過程中,還需要將“開始投票”命令按鈕顏色變灰 (CmdStart.Enable=False),使其暫時不允許用戶使用。這也是程序員應養(yǎng)成的良好習慣。本題的重點是定時器的觸發(fā)過程 Timl Timer 。在該過程中,首先需要定義本過程內(nèi)部使用的整數(shù)類型的局部變量,包括動態(tài)收集的 4 個選手的票數(shù)n
39、(1)n(4),這幾個數(shù)中的最大值G,票數(shù)等于 G 的人數(shù) ng,以及過程內(nèi)部臨時用的變量 i 與 j。接著,對4 位選手進行循環(huán)計票處理:先收集在此時間間隔內(nèi)第 i 位選手得到的票數(shù) n(i) ,再在得票數(shù)文本框中進行累計(注意, VB 能自動將數(shù)值類型轉(zhuǎn)換成字符串類型 ),并動態(tài)顯示出來, 同時需要調(diào)整該選手的票柱形狀。形狀 ShpM(i) 的頂部位置在屏幕上應往上升,而 top 屬性值則應減少 (因為屬性 Top值是與屏幕頂部的距離,以像素為單位 )。本應用設(shè)計時考慮到現(xiàn)場最多 2000 人,票數(shù)還會分散給4 人。程序中 Top 的初始值設(shè)置為2000,并動態(tài)地每次減去得票數(shù) n(i)作
40、為新的票柱頂部位置。為維持票柱底部不變,該票柱形狀的高度顯然也應該增加 n(i) 。因此, (1)處應填寫 n(i) 。接著,對時間計數(shù)變量 T 增 1。由于規(guī)定投票限時為30s,而且每半秒動態(tài)收集票數(shù) 1 次(T 增 1),所以當 T=60時,應關(guān)閉定時器 timl ,結(jié)束投票,并進行投票結(jié)果的處理。在 T60時,上述定時過程就不需要這些處理了,這時就可以退出該過程了。因此在 If T=60 Then語句后,在 (2)處應填寫 Timl.Enable=False ,關(guān)閉定時器。隨后,還需要比較誰是冠軍。如有多個并列冠軍,則還需要繼續(xù)進行 PK。因此,需要在 TxtM(1) TxtM(4) 之
41、間尋找最大值,并求出其中達到最大值的個數(shù)。在比較之前,應設(shè)置冠軍個數(shù)的初始值ng=1 及最大值G 的初始值。由于后面有對選手 24 的循環(huán),所以 G 的初始值設(shè)置成 TxtM(1) 的內(nèi)容。對選手 24 的循環(huán)比較中,當某個選手的票數(shù)不超過G時,不需要做處理;當某個選手的票數(shù)等于G時,應將冠軍個數(shù) ng 增 1,因此 (4)處應填寫 ng+1。當某個選手的票數(shù)超過G時,應將選手號碼保留在j 中,并用該票數(shù)更新 G,同時需要再次設(shè)置冠軍個數(shù) ng=1。再次設(shè)置冠軍數(shù)非常重要,因為在此之前,冠軍數(shù) ng 可能已經(jīng)大于 1。當出現(xiàn)新的冠軍時, ng 必須調(diào)整為1,因此 (3)處應填寫 1。這是程序員最容易犯錯誤的地方,也是本題最難之處。最后,如果比賽的結(jié)果只有 1 個冠軍,則顯示決賽結(jié)果“ j 號勝出”。其中的 j應顯示其具體的值。在程序中應該用 str(j) 或 str$(j) 表示。所以 (5)處應填 str(j)+ “號勝出”,或 str$(j)+ “號勝出”。當出現(xiàn)多個冠軍時,屏幕顯示“繼續(xù)進行 PK”。試題七閱讀下列說明、圖和 Java代碼,回答問題1 至問題3?!菊f明】已知四個類之間的關(guān)系如圖2-4 所示,分別對每個類的方法進行編號,例如 Shape 的 perimeter()為1號,表示為1:perime
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《聲和超聲》課件
- 杭州市住宅小區(qū)前期物業(yè)服務合同模板
- 工程造價專用合同條款
- 《氨基丁酸養(yǎng)生的》課件
- 2025年陜西貨運從業(yè)資格證考試模擬試題
- 2025年博爾塔拉貨運從業(yè)資格證考試技巧
- 2025年拉薩貨運從業(yè)資格證模擬考試題下載
- 2025年東莞貨運從業(yè)資格考試
- 《民事案例實例分析》課件
- 文化產(chǎn)業(yè)招投標合同管理要點
- 高等數(shù)學教程 上冊 第4版 測試題及答案 共4套
- 太陽能路燈維護與保養(yǎng)方案
- 華南理工大學《自然語言處理》2023-2024學年期末試卷
- 照明設(shè)備課件教學課件
- 人生苦與樂課件
- 中國高血壓防治指南(2024年修訂版)要點解讀
- 堆載預壓施工方案
- 2024巡察整改方案和整改措施
- 醫(yī)院冬季防雪防凍工作應急預案
- 2024年公共管理學考試題庫及答案
- 借用資質(zhì)簽合同模板
評論
0/150
提交評論