2013年11月24日 星期日

寫給初學者的簡易程式設計概念

寫給初學者的簡易程式設計概念- by Chen-Hai, Teng 

前言

沒有學過程式語言的人,往往會把寫程式想得很艱深。
初學者常會問以下幾個問題:
我想學程式語言,要從那裡開始?
我想學Java(或者是C, C++, VB, Ruby...),要先學那部分?
我想學程式,要先學C好還是C++好?(或者是Java 對 C#, MFC 對 .Net...)
如何學好程式?
我是個新手,我要怎樣增進程式功力?
...
諸如此類的問題,其實背面的心理,大半可歸結如下:
程式設計看起來好難,有沒有比較容易入手的方式?

事實上,不論你想學的是C/C++, Java, Python, Obj-C 等等程式語言,或是MFC, .Net, JDK, Cocoa函式庫的使用, 程式設計的本質可是一點都不難!

基本程式邏輯

試著想像一下,你每天起床後,開始安排一天的生活,你想著:
現在是9:00,等下10:00要到公司,所以我要先花20分鐘梳洗換裝,出門去買個早餐,然後搭車到公司。到了公司後,我要先看一下mail,確認一下今天要作那些事,之後11:00要跟老闆開會.....

像這樣子,將要做的事照著時間順序排下來,其實就是最基礎的程式!
我們如果把上面的例子轉換成程式碼,看起來會像下面這樣:

行號    敍述
1        起床;
2        梳洗;
3        換裝;
4        出門;
5        買早餐;
6        坐車;
7        看mail;
8        開會;
.
.
.

看起來是否很像每天使用的筆記?
像上面這種照著時間順序,把事情一件一件列出的寫法,在程式設計中,我們給了一個聽起來相當專業的名程:循序 -- 說穿了也不過就是流水帳而已!

再舉一個例子,當我們到早餐店,要買早餐時,會有很多選擇:
西式:漢堡,薯條,三明治...
中式:飯糰,燒餅,蘿蔔糕...
買完可能還會加個紅茶,奶茶,豆漿,米漿之類的。
喜歡變化的人在選擇要買什麼時,可能會這樣想:
昨天早上吃過西式的,今天就換個中式的。
飯糰上次吃過了,今天就點個燒餅。
決定了後,店員可能順口問你一句:要不要加個豆漿或米漿?
你看了看自己的口袋,還有些零錢,便加點了一份豆漿...
像這樣子,依據不同的條件,決定自己要做什麼事(如果...那我就...),就是另一程式設計的方法 -- 選擇。
我們把上面的例子也寫成程式如下:

行號    敍述
1        如果 昨天早餐是西式的
2            今天就買中式的
3                如果 之前吃過飯糰
4                    如果 之前吃過燒餅
6                    否則
7                        買燒餅
8                否則
9                    買飯糰
10          如果 剩下的錢超過30
11              買一杯豆漿
12      否則
13          買西式的
14          如果 ...
.
.
.
            
基本上,所有的程式,都是用循序與選擇所構成的,寫程式,其實就跟我們平常所在作的事情沒有什麼兩樣。
寫程式,其實就是將想要做的事情,以另一種語言表達出來而己。
有注意到嗎? 我們可以將第一個例子的第五行 --  早餐 -- 用上面的例子代換掉。
反過來說,我們可以把一堆複雜的事情,先用一個很簡單的名稱代替,然後在別的地方再詳細描述。
這其實就是一個基本的函式的概念。

除了循序與選擇之外,一般的程式設計書藉,也會把"重覆"(也就是"迴圈")當作另一種基本的設計方法。
就如同字面上的意思一樣,重覆就是不斷的執行同一件事。
以上班為例子,將每個星期上班的過程寫成程式,看起來可能就像下面一樣:

行號    敍述
1        每個星期一~星期五做以下的事情
2            起床;
3            梳洗;
4            換裝;
5            出門;
6            買早餐;
7            坐車;
8            看mail;
9            開會;
.
.
.

如果仔細考慮迴圈的意義,會發現迴圈其實也是循序與選擇的組合如下:

行號    敍述
1        如果 日曆是 星期一~星期五
2            起床;
3            梳洗;
4            換裝;
5            出門;
6            買早餐;
7            坐車;
8            看mail;
9            開會;
.
.
.
20          回家;
21          撕掉日曆;
22          回到第一行;

程式設計很難嗎?其實程式設計的思考方式,就跟我們每天生活的思考方式是一樣的,沒有什麼特別困難的!

更進一步
你也許會說:"你把程式設計說得那麼簡單,可是我就是學不起來啊!"
你也許搞不懂為什麼C/C++要先宣告一個變數,為什麼要有函式,我們常用的函式是那裡來的...?????
你有一個又一個的疑問,而我,一個已經有好幾年程式設計經驗的人,在不同平台上開發過許多不同軟體的人,居然說程式設計很簡單?
這就有如武功蓋世的大俠,跟一個初學功夫的小毛頭說:「打狗棍法超簡單的,你只要棍子拿起,東揮一下,西揮一下,跟你平常打路旁的小狗一樣,就能把歐陽鋒打回白駝山去!」!?

有兩個最大的問題:
1. 你,一個初學者,即使完全了解前一段所說的概念,但你無法用"程式語言"表達出來。
2. 你也不懂如何將程式語言轉換成執行檔,好讓你心中構思的漂亮的UI,簡潔的流程在別人的面前呈現出來。

第一個問題的關鍵在於,初學者不了解程式的語法。就好比一個沒有學過英文的人,若是要你用英文將你一天的生活表達出來,你必定是開始抓頭搔腮,不知如何開始?
即便給你一台電子辭典,你也只能玩玩內建的小遊戲,然後宣告放棄,聲稱自已完全沒有語言方面的天分。
然而,事實上,你已經可以用中文,將你的想法完整而簡錬的表達出來,你所需要做的,只是去了解英文的文法規則,有那些字可用
用程式的說法,你必需要了解程式語言的語法以及有那些函式可用。

而第二個問題旳徵結在於,你不了解如何使用你的工具。你可能會做的只是打幾個字,將想法變成程式碼,卻不知道如何將程式碼再進一步變成執行檔;
你看著開發工具中豐富的功能,卻不知道下一步該怎麼走?要按下那個按鈕才會有反應? 就像是張三丰剛學會九陽神功,手上卻沒有半點招式,完全發揮不出九陽神功的威力。
要解決這個處境,你只有想辦法去學一套伏虎拳,或是有幸遇到像楊過一樣的大俠,點撥你兩下,才能再進一步。
用現在的說法,你得想法子,去熟悉你的開發環境

好了,現在你應該了解程式設計的基本想法了,接下來你要做的事:
1. 瞭解想要用的程式語言語法 以及 可用的函式庫。
2. 熟悉你的開發環境。

以此為基礎,你將可以順利的踏出程式設計的第一步。

Say "Hello!" to World!

對任何程式語言來說,有一個不成文的規定,初學者的第一隻程式一定是「Hello! World!」
下面列出幾種不同的Hello! World!
C
#include <stdio.h>

int main(int argc, char *argv[])
{
printf("Hello! World!");
return 0;
}

C++
#include <iostream>
int main(int argc, char *argv[])
{
cout<<"Hello! World!"<<endl;
return 0;
}
Java
package MyFirstProject;
public class HelloWorld
{
public static void main(String args[]) throws Exception
{
System.out.println ("Hello world!");
System.in.read();
}
}
Obj-C
#import <Cocoa/Cocoa.h>
int main(int argc, char*argv[])
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
NSLog(@"Hello! World!");
[pool release];
return 0;
}

大多數人,將Hello! World!當成一個單純的範例,給初學者的一個練習,然而仔細看看Hello!World!往往也可以解掉許多初學者的疑問。
對初學者而言,Hello! World! 中有下列有用的資訊:
1. 程式從什麼地方開始執行?何時結束?
2. 最基本的程式語法怎麼寫?
a. 怎樣表示資料及字串?
b. 如何呼叫函式?
3. 如何將程式的結果展現在螢幕上?
在某些語言或範例中,Hello! World!可能還包括了以下資訊:
1. 如何引用函式庫?
2. 如何使用類別,物件?

這些資訊,可能不是最重要的,但往往卻是初學者在剛開始時,最感到困惑之處 -- 程式到底是怎麼跑起來的?

另外,除語言本身外,Hello! World!也是讓你熟悉開發環境的第一步 -- 程式寫完,總是要讓他跑起來試看看吧?
因此,在學習 Hello! World! 時,你不只是要照著教科書把程式打出來,你還得對每一行,每一字都仔細了解。
寫完後,更要學著怎麼讓程式跑起來?怎麼看程式的結果?
這一整段工作可以讓你:

1. 對所用的程式語言有初步的了解。
2. 對開發環境有初步的了解。

對一個初學者而言,完整了解Hello! World!,以後的學習之路,將更為平坦。

參考資料:
1. The Hello World Collection

沒有留言:

張貼留言

標籤