有哪些最經典有趣的編程通用習題可以給零基礎的人循序漸進地練習寫代碼?


如果是 C++ 入門的話,C++ Primer 的習題很符合 "零基礎的人循序漸進地練習寫代碼"。


https://github.com/karan/Projects


私以為有意思的題目分兩類,一類是題目本身比較有意思,鍛煉邏輯思維,或是鍛煉基本的程序思維,一類是比較獨立的業務問題,鍛煉思考業務的全面性。

先說鍛煉邏輯思維的,題目大致按照從易到難進行排序

1. 水仙花數:

列印出100-999之間所有的"水仙花數",所謂"水仙花數"是指一個三位數,其各位數字立方和等於該數本身。 例如:153是一個"水仙花數",因為153=1的三次方+5的三次方+3的三次方。

2.循環輸出菱形

*

***

*****

***

*

3.循環輸出乘法口訣表

1×1=1

1×2=2 2×2=4

1×3=3 2×3=6 3×3=9

1×4=4 2×4=8 3×4=12 4×4=16

1×5=5 2×5=10 3×5=15 4×5=20 5×5=25

1×6=6 2×6=12 3×6=18 4×6=24 5×6=30 6×6=36

1×7=7 2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=49

1×8=8 2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=64

1×9=9 2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=81

4.求斐波那契數列前n項和:

在數學上,斐波納契數列以如下被以遞歸的方法定義:F0=0,F1=1,Fn=Fn-1+Fn-2(n&>=2,n∈N*),用文字來說,就是斐波那契數列列由 0 和 1 開始,之後的斐波那契數列係數就由之前的兩數相加。

5.輸出一個本月的日曆

例如:這是2016年4月日曆

星期一 星期二 星期三 星期四 星期五 星期六 星期日

1 2 3

4 5 6 7 8 9 10

……

24 25 26 27 28 29 30

6.抽獎程序:

假設獎池是50個數字,編寫一個程序從其中抽出6個數字作為中獎數字(撲克牌發牌邏輯也相似)

7.給定一個字元串,找到最長的子串的長度不重複的字元,例如,不重複字母「 abcabcbb 」最長子串是「ABC」 ,其長度為3為「 BBBBB 」最長子串為「b」 ,長度為1。

8.括弧匹配程序:檢驗符號是否匹配. "["和"]", "("和")"成對出現時字元串合法. 例如"[][]()", "[[([]([])()[])]]"是合法的; "([(])", "[())"是不合法的.

6,7,8 的難度大約是leetcode上easy的難度

================================分隔線=========================

然後是一些對工作比較有用的小功能。說不上題目了,但是能夠做出來也是很不錯的。不需要寫底層信息,會使用第三方類庫/jar包/控制項這些封裝好的東西就行。

我自己是做web的,因此比較偏重web。想到哪裡寫到哪裡,順序與難度無關。

1.計算器(基本算是科班程序員的第一個程序吧),以java為例,可以從最簡單的控制台計算器,最終到使用GUI生成一個有界面的計算器,或者搭配web頁面做成網上常見的「XX稅率計算器」這個程度就算做完了。

2.文件操作,兩段程序,第一段從文件中把內容讀到程序,第二段從程序把數據寫到文件。

3.實現一個頁面抓取程序。抓取一個固定的url,輸出到控制台或文件。

4.寫一個程序,連接資料庫,進行增刪改查操作

5.寫一個程序,把程序中的數據導出成excel

6.寫一個程序,把程序中的數據導出成PDF

7.從網上下載一個標準的json例子(w3cschool),扔到一個記事本里,用程序把這個json傳遞的信息讀出來

8.自己寫一個html+css形式的個人簡歷

9.寫一個html頁面,在其中使用JavaScript做一個計算器

10.寫一個程序,使用正則表達式檢測一個字元串是不是規範的email地址.

11.寫一個網頁,可以把圖片存儲到指定的位置

================================分隔線=========================

然後夾帶幾個我自己念念不忘的題目(java):

農夫果園:

一個農場,專門種植銷售各類水果,在這個系統中需要描述下列水果:

葡萄:Grape

草莓:Strawberry

蘋果:Apple

水果與其他的植物有很大的不同,水果最終是可以採摘食用的。那麼一個自然的做法就是建立一個各種水果都適用的介面,以便與農場里的其他植物區分開。水果介面規定出所有的水果都必須實現的介面,包括任何水果必須具備的方法:種植plant(),生長grow(),收穫harvest()。

Apple類是水果中的一種,因此它實現了水果介面所聲明的所有方法。另外,由於蘋果是多年生植物,因此多出一個treeAge性質,描述蘋果樹的樹齡。

Grape類是水果類的一種,也實現Fruit介面中所聲明的所有方法。但由於葡萄分為有籽和無籽的兩種,因此比通常的水果多出一個seedless性質。

Strawberry類也是水果的一種,也實現了Fruit介面。

農場的園丁也是系統的一部分,自然要由一個合適的類來代表。這個類就是FruitGardener,它會根據農場老闆的要求,使用factory()方法創建出不同的水果對象,比如蘋果(Apple),葡萄(Grape)或草莓(Strawberry)的實例。而如果接到不合法的要求,會提示錯誤。

農場的市場調查員也是系統的一部分,也需要一個類代表,這個類是MarketInquirer,它通過inquire()調查今年市場上哪一種水果熱銷。

農場的老闆也是系統的一部分,仍需要一個類來代表,這個類是FruitBoss,他會根據市場調查員的反饋信息,通知農場的園丁今年種植哪種水果。

要求:請你根據上述系統需求,用Java語言設計這個農場系統,發揮你的想像力吧!

夏日麽麽茶:

設計題目:夏日麽麽茶

在一個茶莊(TeaStall)所使用的系統里,有各種風味的名茶。

茶(Tea)在系統中要用一個類代表,它有一個屬性(Flavor)。茶莊的菜單(TeaMenu)在系統中以用類來表示,也可用介面來實現。其中包含了茶莊中可供顧客點的茶。比如"西湖龍井","洞庭碧螺春","白毫銀針","君山銀針","黃山毛峰 ","武夷岩茶","安溪鐵觀音","信陽毛尖","廬山雲霧","六安瓜片"等。茶莊的沏茶員(InfuseMan)是系統中的一個類,他可以根據侍者(Waitor)所下的單,沖泡各種風味的茶,如果訂單中風味的茶已沏好,就直接為侍者提供(getTea())茶;如果還沒沏好則先沖泡再給侍者提供。沏茶員負責維護茶壺櫃(teapotCabinet)和沖泡好的風味數(totalFlavors),這些都可作為沏茶員的屬性來維護。由於一個茶莊所能提供的風味數是沒有限制的,所以茶壺櫃(teapotCabinet)應該能動態調整大小,以容納下未知數量的茶壺,這可以由一個向量Vecotor來實現。閉店時,沏茶員可以統計(getTotalFlavors())一天沖泡的風味數。

茶客(TeaClient)也是系統中的一個類,他最喜歡的風味(favoriteFlavor)是一個屬性。茶客每天根據菜單點(whatIsYourFavoriteFlavor())適合自己心情的茶。

侍者(Waitor)也是一個類,他擔負著茶客和沏茶員之間的橋樑。他詢問茶客最喜歡的風味,並根據顧客的要求下單(takeOrder())給沏茶員,從沏茶員那裡接過茶杯放於茶盤(TeacupTray)上,茶盤也可以用一個向量Vector來表示,作為侍者的一個屬性由侍者維護。侍者將茶盤上的茶杯端給(serveTeacup())顧客。侍者會在一天中,統計自己招

待過的訂單數(totalOrders),這可作為侍者的一個屬性實現,並在閉店時,統計(getTotalOrders())服務的訂單數。

茶莊(TeaStall)也是系統中的一個類,它聚集了菜單、沏茶員、侍者、顧客,它在創建時會指定一個可容納的最多顧客數(CLIENT_MAX_NUM),每天開店(open())時,派出一位沏茶員和一位侍者,並接待最多數量的顧客。侍者迎接顧客,為顧客下單,沏茶員沏好茶後,侍者會用茶盤將茶端給顧客。每天閉店(close())後,會統計當天的訂單數和沏茶風味數。 要求:你可能玩過大富翁、主題公園、主題醫院等策略遊戲,這個茶莊系統,就是這類遊戲的一個原型,請你

根據上述腳本,用Java語言設計這個主題茶館,發揮你的想像力吧!

設計題目:國家寶藏

本·富蘭克林·蓋茨(尼古拉斯·凱奇飾)是一個喜愛考古的冒險家。從小就夢想要找到國家寶藏,二十年來這個秘密一直縈繞在他的心頭,現在他決定完成這一夢想。假設我們知道國家寶藏在哪裡,並且想設計一個系統,如果尼古拉斯碰觸國家寶藏中的每箱黃金,系統會自動通知寶藏的守護神。

系統中應該有一個抽象的寶藏類(Treature),寶藏類維護著一個聚集,用於對守護神的跟蹤,當寶藏被更動時,通知這些守護神,這個聚集可以用一個向量(Vector)作為寶藏類的Obs屬性來實現。該類提供一系列的保護神管理方法,可以增加(addObserver())和刪除(deleteObserver())寶藏保護神,以及當寶藏狀態被更動時,通知(notifyObservers())守護神。當然,寶藏類還要有一些輔助方法,比如探測寶藏狀態是否改變的方法(hasChanged()),標記寶藏狀態已更動的方法(setChanged())和複位狀態變化標誌(clearChanged()),以及返回寶藏守護神數目的方法(countObserver())。

具體的寶藏如黃金(Gold)也應是一個類,且是寶藏類的子類,維護著自己的狀態(State),這可以用String型變數來實現。當然還有獲得狀態(getState())和改變狀態(setState())的輔助方法,並且當重新設定的狀態與原狀態不同時,會通知看護該箱黃金的所有守護神。

你還可發揮想像力定義其他的具體寶藏類,比如鑽石(Diamond)類等等。

守護神(Eudemon)應是個抽象類或介面,為各種具體的守護神定義一個介面,在得到寶藏的通知時採取行動。這個介面中只包含一個方法update(),用於寶藏狀態改變時,具體的保護神所應採取的行動。

具體的守護神比如老虎(Tiger)就是一個實現了抽象守護神介面中update()方法的具體守護神。你還可發揮想像力定義其他的具體守護神類,比如獅子(Lion)類等等。

最後,尼古拉斯·凱奇(Cage)也是一個類,且是具體類,他將憑藉智慧和勇敢,更動(touchTreature())這些國家寶藏的狀態,這可要驚動寶藏的守護神呦......

要求:請根據上面的劇本陳述,設計一個國家寶藏的守護系統,並用Java語言實現你的設計方案。


http://tyvj.cn 的begin題庫


從未發現有趣的習題。

剛開始學習編程最滿足的時候是創造出東西的那一時刻,即使是只做了一個計算器這樣的簡單小玩意。

如果能夠直接看到練習的成果,同時又不需要去操心各種工具,SDK,這樣應該是能夠直接體會到創造的樂趣了。

在線學習編程:https://www.codecademy.com/

對編程來說經典,通用那只有「演算法與數據結構」了,但這一部分通常不顯得那麼有趣。

做演算法題:https://leetcode.com/

數據結構可視化:http://visualgo.net/

--------------------------

微信公眾號: CalfCircle


掃雷。


眾acm...你懂的挑幾個練完基本語法和數據結構之後...框架自擼


推薦閱讀:

能用30種編程語言寫』hello world『的人算見多識廣嗎?還是說程序員都能做到?
大家認為慕課,51學院,CSDN之類的it學習網站哪家質量最好?
如何寫一個讓人看不懂的優雅的「Hello World」?
如何優雅地編程?

TAG:編程語言 | 編程 | Java編程 | C | Python入門 |