本次上機對應的教學内容:第4章 遞歸函數、變量的作用域、存儲類型
第一部分 練習+上機驗證(不必送出上機報告)
閱讀下列程式,寫出程式的運作結果。上機時運作程式,與你的預期進行對照、了解。
提示:如果對運作結果不了解,請通過單步執行的手段跟蹤了解。
1. 兩個有遞歸函數的程式,要求按課堂示範,畫出調用過程
(1)
預計運作結果是:
實際運作結果是:
(2)
2. 兩個有靜态局部變量的程式,注意靜态局部變量的生存周期及存儲類型
實際運作結果是:
3.下面兩個程式中有全局變量,注意全局變量的生存周期及存儲類型
第二部分 上機任務
【項目1-fibnacci序列】
輸出fibnacci序列的第20個數。要求送出兩個程式,fib(int n)的實作分别用疊代方法與遞歸方法實作。
提示:如實作困難,先從講義看求階乘的疊代方法與遞歸方法實作,深入體會後再進行設計。
參考程式如下:
【項目2-二進制轉換】
輸入一個整數,要求輸出對應的二進制形式,請用遞歸函數實作。
提示1:二進制整數轉換為二進制的方法——除2取餘,由後到前将餘數“串”起來,即為對應的二進制。如右圖,38對應的二進制數為:100110。
提示2:搞清楚本周第一部分練習1(1)将有助于此項目的解決。
【項目2擴充(選做)——最大公約數】
分别用非遞歸函數和遞歸函數,用輾轉相除法求兩個正整數a和b的最大公約數,并體會疊代法和遞歸法在處理問題上各自的思路。
【項目3-漢諾塔】
漢諾塔(又稱河内塔)問題是源于印度一個古老傳說的益智玩具。古代有一個梵塔,塔内有三個座a、b、c,a座上有64個盤子,盤子大小不等,大的在下,小的在上。有一個和尚想把這64個盤子從a座移到b座,但每次隻能允許移動一個盤子,并且在移動過程中,3個座上的盤子始終保持大盤在下,小盤在上。在移動過程中可以利用b座,下面左圖給出了移動方法的提示。請編制遞歸函數輸出盤子數為4時(程式調試後,試試15個、20個,直至64個,看看會如何),移動的方案。右圖為盤子數為3時的輸出供參考。
參考代碼如下:
【項目3擴充】如果要求出盤子移動的次數呢?請改寫程式。
【項目4-多檔案程式組織】
按《c++程式設計題解與上機指導》p226第15.4節的提示,建立一個包含多個檔案的項目,将第12周“項目4-回文、素數”中所做工作用多檔案組織起來。其中,main()函數儲存在一個檔案中,所有自定義函數儲存到另外一個檔案中,運作程式并得到正确的結果,體會在實際的工程項目中(有很多的函數)這樣組織程式的好處。
【項目4擴充1(選做)】還記得函數版“打豆豆”嗎?找出那一段程式,用多檔案程式組起來。
【項目4擴充2(選做)】把第12周“太樂了”也用多檔案組織起來。
【項目5-銀行系統】
這是我們要做的一個真正的項目!涉及到的技術都用過了,隻不過,程式真的要長得多了。
在學習中,總是想要些成就感的。當你沒有做過一些事情的時候,總是不能知道所學知識究竟能幹些什麼。在學習過程中,完成一個像樣的項目,那是一件很酷的事情,也讓我們更有激情。做好心理準備,中間可能會有些困難,但相信沉下心來還是可以完成的。
要做項目的需求最好能和大家的生活實踐聯系起來,我們想得到。另外,還能和我們的課程同步上。兩廂結合,我們就開個銀行,做個自動取款機吧。
如果沒有用過自動取款機,先用你的銀行卡取一次錢去吧,權當作調研。
我們首先插卡,輸密碼。做純軟體模拟,我們沒有讀卡機,好吧,認為卡已經插好了。
為了讓大家一點一點地做出來,我試圖分解其中的工作,我們逐漸完善,“增量式”地完成工作。你可以每做完一個任務,就發一篇博文,将這樣一個成長的階段記錄下來。
【項目5任務1】你的程式要支援下面的工作:
用const定義全局的常量password,作為銀行卡的密碼(真銀行卡的密碼可不是這樣,它要分别記住各個帳戶的密碼,我們現在認為所有卡都這個密碼)。
螢幕輸出:xx銀行歡迎您(例如,賀氏銀行歡迎您,下輩子一定做夢開銀行。)
你的程式要支援下面的工作:
任務1的功能就這些。
想起一個關于銀行的段子分享:某人,貌似文化人的樣子,駐足,仰望,大聲念道“中國人民很行(hengxing)”。衆人聽得,好自豪,都覺得自己也行,大壯國威。再看,某人駐足在中國人民銀行門前。
寫完程式後,請将之釋出為博文(程式中的注釋自己加,程式前要有,中間也來些必要的)。
【項目5任務2】引入函數改善程式結構
1、在輸入密碼環節,實作有限次密碼輸入的限制,如果三次都沒有輸入正确,程式将直接退出,不允許使用者繼續操作。
查驗密碼功能做成一個函數。例如:
辦理業務也做成一個函數。例如:
相應地,對于main()函數,其結構為:
2、各項業務分别編制一個函數完成
使用者輸入功能選擇,根據給出的答複,用switch多分支完成對應的功能:
使用者選擇1-4功能(1.查詢、2.取款、3.存款、4.轉帳、0.退出)後,分别調用一個自定義函數,完成對應的功能。定義的函數可以隻輸出一句話提示即可。——我們的項目已經越來越大了,需要在程式結構上有所注意了。
【項目5任務3】補充功能,使銀行更職業一些
1、支援多個使用者
用變量account1以及pwd1分别表示客戶和他的密碼,balance1表示這兩個使用者的餘額(開始靠近真的銀行了,得為多個使用者服務,此任務完成後,将來改造成多個使用者的。學習了數組,我們會有好的解決辦法,學習結構體,還有更好的辦法,到學習檔案,接近最好的辦法了。當然,用面向對象技術,也将能有一個全新的視角看這個問題。現在我們就做兩個使用者的銀行,帳号、密碼還都用整型數,餘額可要浮點數了。)
2、增加修改密碼功能
密碼不再使用常量,而是定義為一個變量并在程式開始運作時初始化。在修改密碼功能時,輸入密碼,當然還要有确認密碼,如果兩次輸入不一緻,修改密碼無效。重複直到修改成功或使用者放棄修改。在整個過程中,通過資訊輸出,給使用者足夠友好的提示。
3、補充新功能
對于支援多個使用者的需求,程式作出的改變有:
(1)登入時,要求帳号、密碼都輸入,且輸入對了才可以。
(2)整個程式,包括登入、各項業務等均納入一個大循環中,允許在程式的一次運作中a使用者辦理了業務退出後,b使用者接着登入,或者a使用者再次登入,……,直到在等待使用者登入過程中,使用者在鍵盤上按了q或q(quit)才結束程式的執行;
在現實中,這兒所提及的需求是通過計算機網絡建構起了一個分布式系統處理的,很多使用者可以同時登入,分别完成各自的業務,而不是一個操作完了,另一個接着來。
(3)對于各項功能,完善相應的函數,正式開始“像樣”的業務(盡管還有待完善)
(4)将程式用多檔案組織
涉及密碼、帳戶的函數放在一個檔案中,完成各項功能的函數放在另一個檔案中,main函放也單獨一個檔案。這種結構就是實際項目要用的了。仔細品味!