天天看點

C++程式設計-第十一周循環結構程式設計上機實踐項目

  本次上機對應的教學内容:第3章   c++程式設計初步

【項目1:學會單步執行和調試程式】

  利用你上周編過的求1000以内所有偶數的和的程式,練習:(1)單步執行功能(掌握step over(f10)、step into(f11)、step out和run to cursor功能);(2)在程式中設定和取消斷點,然後用go指令(f5)執行,觀察變量及程式流程的變化;(3)選擇一個你以前做的程式,請你的同學在你的程式中作兩處改動(改動者要想辦法使壞才是,或者幹脆請你的同學将他/她以前做過的程式改兩處),使其文法正确,但可能會造成邏輯錯誤(如兩數交換的程式中将a=b;和b=t;兩條語句換一下順序),你利用自己的思考和調試工具将程式改正過來。

【項目2:窮舉法解決組合問題】

  先閱讀例題,領會窮舉法(意為“窮盡式列舉”,也稱枚舉)的思想,然後自行選題進行解決,掌握這種程式設計的一般方法。

  例題:小明有五本新書,要借給a,b,c三位小朋友,若每人每次隻能借一本,則可以有多少種不同的借法?

  問題分析與算法設計:本問題實際上是一個排列問題,即求從5個中取3個進行排列的方法的總數。首先對五本書從1至5進行編号,然後使用窮舉的方法。假設三個人分别借這五本書中的一本,當三個人所借的書的編号都不相同時,就是滿足題意的一種借閱方法。

  下面是程式及其注釋,要注意利用三重循環“窮舉”

  程式:

  任務:利用窮舉的方法解決下面的問題(選做一道即算完成任務,其他可以抽時間自由安排,多做會使你更聰明。)

  (1)百錢百雞問題:中國古代數學家張丘建在他的《算經》中提出了著名的“百錢買百雞問題”:雞翁一,值錢五,雞母一,值錢三,雞雛三,值錢一,百錢買百雞,問翁、母、雛各幾何?

  提示:設雞翁、雞母、雞雛的個數分别為x,y,z,題意給定共100錢要買百雞,若全買公雞最多買20隻,顯然x的值在0~20之間;同理,y的取值範圍在0~33之間,可得到下面的不定方程:

  5x+3y+z/3=100

  x+y+z=100

  是以此問題可歸結為求這個不定方程的整數解。

  由程式設計實作不定方程的求解與手工計算不同。在分析确定方程中未知數變化範圍的前提下,可通過對未知數可變範圍的窮舉,驗證方程在什麼情況下成立,進而得到相應的解。

  引申:這類求解不定方程的實作,各層循環的控制變量直接與方程未知數有關,且采用對未知數的取值範圍上窮舉群組合的方法來涵蓋可能得到的全部各組解。如果要采取技巧,往往是根據題意,更合理地設定循環控制條件來減少這種窮舉群組合的次數,提高程式的執行效率,需要具體問題具體分析。

  (2)換分币:用一進制人民币兌換成1分、2分和5分硬币,有多少種不同的兌換方法?

  提示:根據題意設i,j,k分别為兌換的1分、2分、5分硬币的枚數,則i,j,k的值應滿足:i+j*2+k*5=100,根據取值範圍構造循環解題即可。

  (3)年齡幾何:張三、李四、王五、劉六的年齡成一等差數列,他們四人的年齡相加是26,相乘是880,求以他們的年齡為前4項的等差數列的前20項。

  提示:設數列的首項為a,則前4項之和為"4*n+6*a",前4 項之積為"n*(n+a)*(n+a+a)*(n+a+a+a)"。同時"1<=a<=4","1<=n<=6"。可采用窮舉法求出此數列。

  (4)三色球問題:若一個口袋中放有12個球,其中有3個紅的。3個白的和6個黒的,問從中任取8個共有多少種不同的顔色搭配?

  提示:設任取的紅球個數為i,白球個數為j,則黒球個數為8-i-j,根據題意紅球和白球個數的取值範圍是0~3,在紅球和白球個數确定的條件下,黒球個數取值應為8-i-j<=6。

  (5)委派任務:某偵察隊接到一項緊急任務,要求在a、b、c、d、e、f六個隊員中盡可能多地挑若幹人,但有以下限制條件:

 a和b兩人中至少去一人;

a和d不能一起去;

a、e和f三人中要派兩人去;

b和c都去或都不去;

c和d兩人中去一個;

若d不去,則e也不去。

  問應當讓哪幾個人去?

  提示:用a、b、c、d、e、f六個變量表示六個人是否去執行任務的狀态,變量的值為1,則表示該人去;變量的值為0,則表示該人不參加執行任務,根據題意可寫出表達式:

a+b>1   //a和b兩人中至少去一人;

a+d!=2     //a和d不能一起去;

a+e+f==2   // a、e、f三人中要派兩人去;

b+c==0或b+c==2   // b和c都去或都不去;

c+d==1     //c和d兩人中去一個;

d+e==0或d==1     //若d不去,則e也不去(都不去;或d去e随便)。

  上述各表達式之間的關系為“與”關系。窮舉每個人去或不去的各種可能情況,代入上述表達式中進行推理運算,使上述表達式均為“真”的情況就是正确的結果。

  (6)警察局抓住了a、b、c、d四名盜竊嫌疑犯,其中隻有一人是小偷。在審問時,a說:“我不是小偷”;b說:“c是小偷”;c說:“小偷肯定是d”;d說:“c在冤枉好人”。現在已經知道這四人中有三人說的是真話,一人說的是假話。請問到底誰是小偷?

  提示:設4個變量a,b,c,d,為0時表示不是小偷,為1時表示是小偷,用四重循環窮舉a,b,c,d可能的取值的組合,對每一種組合判斷其是否符合題目中給出的限制。最後結論:c是小偷。

  (7)在下面的加法算式中,不同的符号代表不同的數字,相同的符号代表相同的數字。請設計程式求出"都、要、學、c"4個符号分别代表的數字。

  提示:讓計算機解奧數題。窮舉"都、要、學、c"4個符号分别代表的數字(從0到9),然後進行組合,如果組合起來符合規則(不同的符号代表不同的數字,相同的符号代表相同的數字,且使等式成立),則為正解。

  (8)下列乘法算式中:每個漢字代表1個數字(1~9)。相同的漢字代表相同的數字,不同的漢字代表不同的數字。試程式設計确定使得整個算式成立的數字組合,如有多種情況,請給出所有可能的答案。

  (9)有等式[※×(※3+※)]^2=8※※9,其中※處為1個數字,滴上了墨水無法辨認。請程式設計找出※表示哪個數字。(^指乘方)

  拓展:有等式[※×(※3○※)]^2=8※※9,其中※處為1個數字,○處為+、-、×、÷四個運算符之一,現滴上了墨水無法辨認。請程式設計找出※表示哪個數字,○表示哪個運算符。

【項目3- 有趣的數字】

  先閱讀例題,體會處理數字的一般方法,然後自行選題進行解決,掌握這種類型程式設計的一般方法。

  例題:求滿足條件n=a!+b!+c!的所有三位數n并輸出,其中a,b,c分别為n的百、十、個位數。

  分析:就是将每個三位數逐個處理(用循環),對于每個數(循環體内要幹的事),分離出個十百位,計算其階乘和,然後和目前的三位數比較即可得出結論。

  參考程式如下:(此處用了while循環,實際上在此處for循環更合适,計數型的嘛)

  方法歸納:在這一類題目中,常要對某一範圍内的所有數進行考察,以便列出其中符合某條件的所有數。需要逐個考察相應範圍内的每一個數字。是以,程的頂層結構是:

例如,要處理的數是所有三位數中的偶數,對應的代碼是:

  任務:解決下面的問題(同樣,選做一道即算完成任務)

  (1)輸入一個正整數,判斷其是否為一個素數。

  (2)輸出1000以内的所有素數。

  (3)輸入一個正整數,判斷其是否為一個回文數(例1221、12321都是回文數)。

  (4)輸出10000以内的所有回文數。

  (5)輸出10000以内的所有回文素數(提醒:某數是素數後再判斷是否也是回文數。);

  (6)若一個素數的反序數仍為素數,則稱為可逆素數。求10000以内的所有可逆素數。

  (7)求1000000以内的正整數n,9n是n的反序數(例如,123是321的反序數)。

  (8)阿姆斯特朗數:如果一個正整數等于其各個數字的立方和,則稱該數為阿姆斯特朗數(亦稱為自戀性數)。如 407=43+03+73就是一個阿姆斯特朗數。試程式設計求1000以内的所有阿姆斯特朗數。

  (9)親密數:如果整數a的全部因子(包括1,不包括a本身)之和等于b;且整數b的全部因子(包括1,不包括b本身)之和等于a,則将整數a和b稱為親密數。求3000以内的全部親密數。(提示:按照親密數定義,要判斷數a是否有親密數,隻要計算出a的全部因子的累加和為b,再計算b的全部因子的累加和為n,若n等于a則可判定a和b是親密數。)

  (10)很有趣的一個題目:2011年11月02日是一個回文日:2011 1102,在2011級同學做這道題時我們剛剛度過這一天!請列出近80年和近60年還有多少個回文日(假如我們能活到百歲,你和我的……)。注意:一年隻有12個月。

【項目4:大獎賽計分】

  在歌星大獎賽中,有10個評委為參賽的選手打分,分數為1~100分。選手最後得分為:去掉一個最高分和一個最低分後其餘8個分數的平均值。請編寫一個程式實作。

  【項目4擴充1(選做)】大獎賽編的計分程式,成績在0-10之間,輸入錯誤時要能馬上重新輸入,選手最後得分為:去掉一個最高分和一個最低分。評委人數(圖中為7)需要在在程式開始運作時輸入(這比固定10個評委的程式更有适應性了)。

  【項目4擴充2(選做)】在擴充1基礎上,輸出目前選手的最後得分後,提示“按任意鍵計算下一位選手的成績,退出請選擇n:”如果輸入的不是n或n,可以為下一位選手計算成績。運作結果如圖所示。

  

C++程式設計-第十一周循環結構程式設計上機實踐項目

  如果完成了擴充2,再次體會:如果一個“複雜”任務難于直接完成,可以先完成核心的“簡單”任務,再逐漸擴充、完善。

【項目5-體驗檔案操作】

C++程式設計-第十一周循環結構程式設計上機實踐項目

  提示:本任務完成困難,可以考慮預做下面的練習

  練習1:從檔案中讀出學生的成績,輸出最高、最低,以及平均成績(平均成績為小數)。

  練習2:從檔案中讀出學生的成績,統計90分以上學生的人數并輸出。

  拓展1:将輸出界面改良下,顯示成下面的樣子(僅變輸出方式)

C++程式設計-第十一周循環結構程式設計上機實踐項目

  拓展2:将統計結果儲存到資料檔案statictic.dat中(提示:要寫入檔案了)

附:本文後附100個資料,自行複制粘貼到記事本中儲存為檔案english.dat,以便于完成練習。

66

77

97

65

69

79

74

90

73

64

71

83

96

87

88

62

76

51

78

52

75

60

56

68

61

57

67

86

55

81

85

72

84

91

82

70

59

繼續閱讀