程序員必須挑戰(zhàn)的七大編程項(xiàng)目,你能挑戰(zhàn)幾個(gè)?
1)Sums
提示:針對(duì)這道題目,你需要采用一種技術(shù),即使你已經(jīng)擁有幾十年的編程經(jīng)驗(yàn)。從數(shù)據(jù)文件開(kāi)始,列出每個(gè)年級(jí)、每個(gè)學(xué)校、每個(gè)城市、每個(gè)州中紅發(fā)學(xué)生的數(shù)量。你的任務(wù)是按數(shù)據(jù)進(jìn)行排列,每個(gè)州(第一),城市(第二),學(xué)校(第三),最后按年級(jí)(K to 6)
- IDENTIFICATION DIVISION.{.js .plain}
- PROGRAM-ID. SUMS.{.js .plain}
- ENVIRONMENT DIVISION.{.js .plain}
- INPUT-OUTPUT SECTION.{.js .plain}
- FILE-CONTROL.{.js .plain}
- SELECT StudentFile ASSIGN TO {.js .plain}'input.txt'{.js .string}
- {.js .spaces}ORGANIZATION IS LINE SEQUENTIAL.{.js .plain}
- DATA DIVISION.{.js .plain}
- FILE SECTION.{.js .plain}
- FD StudentFile.{.js .plain}
- 01 StudentCount.{.js .plain}
- {.js .spaces}02 State PIC X(12).{.js .plain}
- {.js .spaces}02 City PIC X(18).{.js .plain}
- {.js .spaces}02 School PIC X(20).{.js .plain}
- {.js .spaces}02 Grade PIC X.{.js .plain}
- {.js .spaces}02 RedHaired PIC 9999.{.js .plain}
- WORKING-STORAGE SECTION.{.js .plain}
- […]{.js .plain}
- PROCEDURE DIVISION.{.js .plain}
- Begin.{.js .plain}
- {.js .spaces}OPEN INPUT StudentFile.{.js .plain}
- {.js .spaces}READ StudentFile{.js .plain}
- {.js .spaces}AT END MOVE HIGH-VALUES TO StudentCount{.js
- .plain}
- {.js .spaces}END-READ.{.js .plain}
- {.js .spaces}[…]{.js .plain}
- STOP RUN.{.js .plain}
下面是個(gè)輸入文件案例:
NY NYC PS 122 K1000{.js .plain}
NY NYC PS 122 12000{.js .plain}
NY NYC PS 122 43000{.js .plain}
NY NYC St-Judes 40043{.js .plain}
NY NYC St-Judes 50057{.js .plain}
NY Albany Green Acres K0003{.js .plain}
NY Albany Green Acres 20005{.js .plain}
NY Albany Green Acres 30010{.js .plain}
NY Albany Blue Hills 30123{.js .plain}
NY Albany Blue Hills 40302{.js .plain}
NY Albany Blue Hills 50067{.js .plain}
NY Rochester Happy Trails 50076{.js .plain}
- <b>Gives:</b>{.js .plain}
- {.js .spaces}PS 122 6000{.js .plain}
- {.js .spaces}St-Judes 100{.js .plain}
- {.js .spaces}NYC 6100{.js .plain}
- {.js .spaces}Green Acres 18{.js .plain}
- {.js .spaces}Blue Hills 492{.js .plain}
- {.js .spaces}Albany 510{.js .plain}
- {.js .spaces}Happy Trails 76{.js .plain}
- {.js .spaces}Rochester 76{.js .plain}
- {.js .spaces}NY 6686{.js .plain}
在這個(gè)例子中我采用了COBOL,使用固定的長(zhǎng)度字段,數(shù)值填充為0。你可能會(huì)認(rèn)為tab-
or comma-separated
input,當(dāng)然這個(gè)值不一定非要為0。這個(gè)題目旨在增加正確值并在正確的時(shí)間顯示,而不是為了證明你可以輸入解析局部變量。請(qǐng)注意,這里的數(shù)據(jù)都是虛構(gòu)的。
2) Fibonacci Sequence(斐波那契序列)
0, 1, 1, 2, 3, 5, 8, 13, 21…{.js .plain}
寫(xiě)個(gè)函數(shù)返回到第n^th^的序列。這題應(yīng)該是很容易。
3) Drawing with a Turtle
TurtleArt是創(chuàng)建該程序的其中一個(gè),
其適合繪制各種圖片。你可以將“pen”移動(dòng)至一個(gè)新的位置,改變畫(huà)筆的顏色,前進(jìn)或者后退,隨意改變方向。此外,你還可以添加繪畫(huà)路徑,改變整個(gè)方形或者圓形色彩。這個(gè)挑戰(zhàn)就是利用TurtleArt來(lái)畫(huà)花。
下載TurtleArt:
- Microsoft Windows
- Mac OS X
- GNU/Linux (需要點(diǎn)擊 Java. Adjust進(jìn)行設(shè)置)
你可以參照這幅圖片來(lái)進(jìn)行繪制,當(dāng)然你也可以自由創(chuàng)建。如果你認(rèn)為這個(gè)很簡(jiǎn)單,你還以嘗試?yán)L制Michelle Deschênes:
4) 16-Puzzle
有時(shí)我們也稱(chēng)其為15-puzzle拼圖,這個(gè)通常是由塑料制作而成的小玩具,采用4×4網(wǎng)格被分成15塊,每一塊都有圖片。游戲的目標(biāo)是重新組合圖片以形成一個(gè)完成的圖像。
參考Wikipedia上9-puzzle的相關(guān)示例。
我們可以通過(guò)Scratch來(lái)編寫(xiě)16-puzzle游戲。它與TurtleArt相類(lèi)似,但不要你安裝軟件。你可以在線使用Scratch。
先不要急著挑戰(zhàn)高難度,由簡(jiǎn)入繁,你可以先從2×2 puzzle開(kāi)始,成功創(chuàng)建后再進(jìn)行3×3,一步一步逐級(jí)增加,直到最終獲得完成16-puzzle。
5) Pascal Triangle(帕斯卡三角)
對(duì)于這個(gè)挑戰(zhàn),通常會(huì)采用SQL來(lái)計(jì)算每一行的帕斯卡三角。
這個(gè)題目可能在我們童年時(shí)期見(jiàn)過(guò),從1開(kāi)始,1在頂部,第一個(gè)和最后一個(gè)都是1;接著每一行中間數(shù)字是由相鄰兩個(gè)數(shù)字之和,呈現(xiàn)金字塔形狀。
我們先定義一個(gè)表,這里使用MySQL語(yǔ)法,也可以采用任意SQL數(shù)據(jù)庫(kù)引擎:
- create table pascal ({.js .plain}
- {.js .spaces}row int not {.js .plain}null{.js .keyword},{.js .plain}
- {.js .spaces}entry int not {.js .plain}null{.js .keyword},{.js
- .plain}
- {.js .spaces}val int not {.js .plain}null{.js .keyword},{.js .plain}
- {.js .spaces}primary key (row, entry){.js .plain}
- );{.js .plain}
先初始化前兩行,從技術(shù)上來(lái)講,你只真正需要第一個(gè),從第三行開(kāi)始變得很容易,實(shí)際上你已經(jīng)從上一行開(kāi)始計(jì)算值。
- insert into pascal values (1, 1, 1);{.js .plain}
- insert into pascal values (2, 1, 1);{.js .plain}
- insert into pascal values (2, 2, 1);{.js .plain}
你可以使用存儲(chǔ)過(guò)程( stored
procedure)來(lái)填寫(xiě) n^th^行,或者你也可以使用宿主語(yǔ)言(host
language)比如PHP或Java來(lái)調(diào)用數(shù)據(jù)庫(kù)。記住,不要使用任何(flow control
)流量控制(比如ifs, loops等),不要調(diào)用遞歸函數(shù),你可以采用insert
statements。
mysql> select * from pascal where row = 10;{.js .plain}
當(dāng)然,只要你愿意,你也可以采用NoSQL數(shù)據(jù)庫(kù)。
6) Sierpiński Triangle (謝爾賓斯基三角形 )
這個(gè)得名來(lái)源于波蘭數(shù)學(xué)家 Wacław Franciszek Sierpiński(波蘭語(yǔ),謝爾賓斯基),有三個(gè)著名的分形是以他的名字命名(Sierpinski三角形,Sierpinski地毯,Sierpinski曲線),創(chuàng)建于1915年。
繪制這個(gè),你需要從一個(gè)等邊三角形(equilateral triangle)開(kāi)始,然后給其填充顏色,然后挖空三角形中間部分,這樣中間的三角形是其他三個(gè)三角形的邊。從9個(gè)三角形增加至27個(gè),以此類(lèi)推。
你也可以在HTML5 canvas中繪制,首先你要決定canvas的形狀及大小以及三角形坐標(biāo)。
如果每個(gè)邊有長(zhǎng)度x,長(zhǎng)度h,那么就可通過(guò)從頂點(diǎn)畫(huà)線,這樣使它底部的邊緣交叉成直角,可以采用應(yīng)用勾股定理找到h至x的比例。
如果你不想采用數(shù)學(xué)原理,那么你還可以使用canvas設(shè)定寬220,高195,三角形頂點(diǎn) (10, 185),(210, 185),(110,
10)。當(dāng)你完成一個(gè)基本的三角形工作,添加一個(gè)小動(dòng)畫(huà)。使其呈現(xiàn)出不同的效果,你可以看到它是如何一步一步實(shí)現(xiàn)的。
完成三角形后,你還可以嘗試 Sierpiński carpet(Sierpinski地毯)。
道理是同樣的,從一個(gè)正方形開(kāi)始,把它分成9個(gè)正方形。挖空中間,和其他8個(gè)正方形構(gòu)成carpet。
7) Project Euler
Project Euler由Colin Hughes(也被人稱(chēng)為euler) 在2001年10月創(chuàng)建,一開(kāi)始時(shí)作為mathschallenge網(wǎng)站的一個(gè)子欄目。它是一個(gè)具有挑戰(zhàn)性的不僅僅需要具備數(shù)學(xué)能力的“數(shù)學(xué)/計(jì)算機(jī)編程”問(wèn)題集合。
Project Euler致力于鼓勵(lì)、挑戰(zhàn)并且發(fā)展解題技巧,并且為那些對(duì)迷人的數(shù)學(xué)世界有興趣的人提供樂(lè)趣。
Project Euler提供的問(wèn)題集有不同的難度以及多種解題經(jīng)驗(yàn),可以進(jìn)行連續(xù)的啟發(fā)式的學(xué)習(xí)。也就是說(shuō),通過(guò)解決一個(gè)問(wèn)題,提供給解題者一個(gè)新的概念,使解題者可以接觸之前無(wú)法涉及的問(wèn)題。因此,有毅力的參與者將會(huì)逐一完成每一個(gè)題目。
最后:
試試你能挑戰(zhàn)幾個(gè)吧?希望這些挑戰(zhàn)能夠激發(fā)你的好奇心,通過(guò)它們擴(kuò)大視野,幫助你創(chuàng)造性的思考問(wèn)題,因?yàn)檐浖_(kāi)發(fā)本身就是個(gè)創(chuàng)造性的過(guò)程。