天天看點

2014秋C++ 第12周項目 C++函數新特征與遞歸函數

【項目1- 閱讀程式】閱讀下列程式,寫出程式的運作結果。上機時運作程式,與你的預期進行對照、了解。如果對運作結果和其背後的原理仍不了解,請通過單步執行的手段跟蹤了解。

(1)閱讀下面兩個有靜态局部變量的程式,閱讀中畫出其中各變量的變化過程,以掌握靜态變量的存儲特征,對照實際運作結果檢驗學習成果。必要時記得看書及課件。

預計運作結果是:__________________

實際運作結果是:__________________

  (2)閱讀下面兩個有全局變量的程式,閱讀中畫出其中各變量的變化過程,以掌握全變量的存儲特征,對照實際運作結果檢驗學習成果。必要時記得看書及課件。

(3)閱讀下面兩個包含有遞歸函數的程式,要求按課堂示範,畫出調用過程,并列出運作結果。對照實際運作結果檢驗學習成果。必要時記得看書及課件。

實際運作結果是:__________________ 

(4)了解函數的預設參數:運作程式,利用調試功能,觀察變量和函數參數的值,結合課堂講解,品味預設參數的作用。

① 去掉第4行的“=6.5”試試,出錯的原因是____________________;

② 将第14行改為“float area(float r=6.5)”,出錯的原因是__________________;

③ 将第5行“float h,float r=6.5”改為“float h=1,float r”,出錯的原因是_____________;

④ 将第5行改為“float volume(float h=0,float r=6.5)”,帶來的改變将是____________________。

(5)了解函數模闆:運作程式,結合課堂講解,品味函數模闆的意義。利用codeblocks中的debug功能,step into到函數内部,觀察每次調用時函數的參數值,體會類型參數t每次調用時被不同實際類型替代。

提示1:在單步執行中,采用step into後,可以将t像待觀察的變量一樣,放在watch視窗中進行察看,如圖所示,可以發現t取不同的類型。

2014秋C++ 第12周項目 C++函數新特征與遞歸函數

提示2:若這個程式編譯時出錯,原因是命名空間std中已經定義過了max,進而産生了沖突。修改的方法有兩種:(1)将程式中的max函數名改為mymax,避免這種沖突;或者(2)取消using namespace std;一行,但需要在程式中,将cout、cin、endl前加上std::,如std::cout<<...<<....<<std::endl;

【項目2-oj平台題目中多種輸入形式的處理】

看教學視訊或“oj平台題目中不同形式輸入的處理”,完成平台中的一組題目,分别對應不同輸入的形式的問題。

a: 求n組數的最大公約數

description

計算一組數的最大公約數

input

第一行是資料的組數n,從第二行是n組由兩個整數(a和b)構成的輸入,a和b之間用空格隔開,每組輸入單獨占一行

output

每組的兩個整數(a和b)的最大 公約數,每個結果獨占一行

sample input

3

98 72

80 36

12 144

sample output

2

4

12

b:分離正整數中的各位數

輸出正整數的各位數

若幹個用空格隔開的正整數(輸入個數不确定,鍵盤輸入時,以ctrl-z結束)

每個正整數的各位數字,個位數在前,十位數緊随,最高位在最後,每位數後面有一個空格。每個正整數對應的輸出占一行。

123 9523 89

3 2 1 

3 2 5 9 

9 8

c:刑警的射擊成績

刑警教育訓練結束,進行了射擊科檢驗。教官要對學員射擊的成績進行分析,得出各分數段人數統計。

輸入若幹個0-10間的整數(最高10環,脫靶為0)表示成績,人數不确定,輸入以一個0-10以外的數作為。

各分數段(a:9環以上,b:7環以上,c:5環以上,d:不足5環)的人數,每項成績占一行

9 7 3 5 8 5 6 7 9 10 0 6 99

a:3

b:3

c:4

d:2

【項目3-用遞歸方法求解】

(1)編寫遞歸函數求出n的階乘(自定義main函數,調用定義的遞歸函數)

(2)寫出求1*3*...*n的遞歸式,并編寫出遞歸函數求解。

(3)程式設計式,用遞歸函數求出兩個數的最大公約數。(包括編main函數,調用定義的遞歸函數)

(4)編制遞歸函數fib(int n)傳回第n個fibnacci數,以此輸出fibnacci序列的第20個數。

(5)輸入一個整數n,要求輸出對應的二進制形式,請用遞歸函數實作。

提示:二進制整數n轉換為二進制的方法是“除2取餘法”,即将n除以2後得到的餘數,由後到前“串”起來,得到對應的二進制數,如圖。

2014秋C++ 第12周項目 C++函數新特征與遞歸函數

(6)漢諾塔

漢諾塔(又稱河内塔)問題是源于印度一個古老傳說的益智玩具。古代有一個梵塔,塔内有三個座a、b、c,a座上有64個盤子,盤子大小不等,大的在下,小的在上。有一個和尚想把這64個盤子從a座移到c座,但每次隻能允許移動一個盤子,并且在移動過程中,3個座上的盤子始終保持大盤在下,小盤在上。在移動過程中可以利用b座,下面左圖給出了移動方法的提示。請編制遞歸函數輸出盤子數為4時(程式調試後,試試15個、20個,直至64個,看看會如何),移動的方案。圖為盤子數為3時的輸出供參考。

2014秋C++ 第12周項目 C++函數新特征與遞歸函數

參考代碼如下:

【項目4 - 銀行系統】

這是我們要做的一個真正的項目!涉及到的技術都用過了,隻不過,程式真的要長得多了。

  在學習中,總是想要些成就感的。當你沒有做過一些事情的時候,總是不能知道所學知識究竟能幹些什麼。在學習過程中,完成一個像樣的項目,那是一件很酷的事情,也讓我們更有激情。做好心理準備,中間可能會有些困難,但相信沉下心來還是可以完成的。

  要做項目的需求最好能和大家的生活實踐聯系起來,我們想得到。另外,還能和我們的課程同步上。兩廂結合,我們就開個銀行,做個自動取款機吧。

  如果沒有用過自動取款機,先用你的銀行卡取一次錢去吧,權當作調研。

  我們首先插卡,輸密碼。做純軟體模拟,我們沒有讀卡機,好吧,認為卡已經插好了。

  為了讓大家一點一點地做出來,我試圖分解其中的工作,我們逐漸完善,“增量式”地完成工作。你可以每做完一個任務,就發一篇博文,将這樣一個成長的階段記錄下來。

任務1——搭一個架構

  你的程式運作後的界面如圖:

  

2014秋C++ 第12周項目 C++函數新特征與遞歸函數

用const定義全局的常變量password,作為銀行卡的密碼(真銀行卡的密碼可不是這樣,它要分别記住各個帳戶的密碼,我們現在認為所有卡都這個密碼)。

判斷輸入的密碼是否正确,如果不正确,提示:“你這個笨腦瓜!”并退出程式,(注意,真銀行可不敢罵人,你的銀行這樣寫寫無妨。)否則,繼續下面的工作。

使用者如圖輸入功能選擇,根據給出的答複,用switch多分支完成下面的顯示:

a. 輸入1,顯示“您的餘額是xxxx.xx元。”(想過瘾,用你覺得足夠大的數當餘額)

b. 輸入2-4的提示自編;

c. 輸入0,顯示“謝謝,歡迎下次再來!”(好有禮貌)

d. 輸入不是0-4,提示“輸錯,不要急!”

  隻要輸入不是0,循環處理業務。

  寫完程式後,請将之釋出為博文(程式中的注釋自己加,程式前要有,中間也來些必要的)。

任務2——引入函數改善程式結構

  1、資料

  仍然隻支援一位使用者,是以使用者帳号不必存儲。

  要用全局變量存儲:(1)使用者密碼(由于支援改密碼功能,是以用變量,暫先用整型,聲明時賦初值);(2)帳戶餘額(用浮點數表示,聲明時賦初值)

  2、在輸入密碼環節,實作有限次密碼輸入的限制,如果三次都沒有輸入正确,程式将直接退出,不允許使用者繼續操作。

查驗密碼功能做成一個函數。例如:

  3、main()函數的結構将如下所示,work函數用于處理業務。

  4、辦理業務的函數work的結構如下:

  其中,各項業務分别編制一個函數完成。提示功能菜單(1.查詢、2.取款、3.存款、4.轉帳、5.改密、0.退出)後,由使用者輸入功能選擇,用switch多分支完成對應的功能(有的功能依然隻輸出一句話提示即可)。圖示給出建議(鼓勵在合理範圍内别出心裁):

2014秋C++ 第12周項目 C++函數新特征與遞歸函數

輸入1(查詢),調用函數showbalance(),顯示“您的餘額是xxxx.xx元。”

輸入2(取款),調用drawmoney(),完成取款。要求輸入取款金額,若餘額不夠,提示不能取款,否則,帳戶餘額減少。取款後給出提示:“你的餘額還有xxx.xx元”。

在實際業務中,還涉及到計算的問題。本題暫不考慮,作為拓展建議,可以在此處考慮計息。

輸入3(存款):調用deposit(),完成存款,餘額增加(過瘾吧,想存多少存多少)。存款後給出提示:“你的餘額是xxx.xx元”。

輸入4(轉帳):調用transferaccounts(),完成轉帳,隻支援轉出功能。要求輸入對方帳号和轉帳金額,若金額充足,完成轉帳,目前帳戶的餘額減少,對方帳戶餘額增加。由于本題隻有一個帳号,故對方帳戶增加的操作先不做了。

輸入5(改密):調用updatepassword()改變密碼。要求先輸入舊密碼,對了以後才能改密。新密碼要輸入兩次,隻有兩次完全相同時才可以完成修改。

輸入0,顯示“謝謝,歡迎下次再來!”退出循環,傳回調用函數。

輸入不是0-5,提示“輸錯了,不要急!”

  以後我們再做支援多個帳戶的銀行系統。

任務3——将程式用多檔案組織

  将任務2中的代碼,涉及密碼、帳戶的函數放在一個檔案中,完成各項功能的函數放在另一個檔案中,main函放也單獨一個檔案。

繼續閱讀