不管有沒有能力寫點有秩序的文章,總之我沒打算這樣做。

  最近在設計程式課的教材,很基礎的那種(很基礎並且沒有打算要往深的方向走的那種(驚)),就介紹了一些概念,指令(函式)、宣告、if判斷式、運算子、for迴圈。

  大概就這些吧(?)。

  底下就用通俗的口吻講一下這些概念。(換句話說就是隨性地提提)

 

  指令(函式):

  這大概是學程式設計的第一個重點,基本上也通常是第一個學到的東西。

  如果是學C語言的話,第一個實作就會是讓電腦在畫面上印出"Hello World"的字。

  而程式碼裡是怎麼寫的呢?就是用一個指令--printf()

  (一般來說都會講函式而非指令,這裡講指令只是比較貼合現實世界中的比喻,也比較好理解,當然有些情況並不適合用"指令"來稱呼某些函式就是了。)

  這個printf()的指令可以讓電腦在螢幕上顯示出括弧裡的字串。嗯……所以它是怎麼做到的?

  是因為電腦裡面住著一個人,他知道printf是要印東西的意思,所以把對應的東西畫在螢幕上給我們看嗎?當然不是。

  所謂的指令,就是「我們不知道它是怎麼做到的也沒關係,我只要會使用,知道用出來的結果是什麼就好了」。

  電腦螢幕是怎麼顯示畫面的?我不需要知道。

  程式碼是怎麼讓電腦做出對應事件的?我不需要知道。

  我只要會用這個指令,就能讓電腦做出我想要它做的事情。

 

  這跟我們使用現實生活中絕大多數的科技產品很像,手機撥號為什麼對方能收到?能接聽?我不知道。

  咖啡機怎麼樣磨碎咖啡粉泡成咖啡的?我不知道。

  為什麼倒車快撞到東西時,雷達會發出逼逼逼的聲音?我不知道。

  即使我們絕大多數的事情都不知道其原理、原因,我們還是能好好地活在這個世界上。

  我們就是有這種「封裝」的能力,可以把很複雜的東西包裝起來,天才做的東西,普通人都能用。

  我們只需要知道怎麼用、會有什麼結果,就可以了,就足夠生存了。

 

  程式語言裡提供的指令也是這樣,控制電路板、執行機械語言是很複雜的,但大多數的高階程式語言都做了很好的「封裝」,我們只要透過這些指令,就能讓電腦做到我們要它做的事情。

  當然這些程式語言的背後,都有一些高人,他們把那些複雜的操作都藏了起來,而這些指令就像電視機的遙控器一樣,簡單易懂怎麼使用。當然程式設計的指令更好一些,因為我們可以透過諸多指令的結合實踐各種效果,而非像電視機的遙控器每個鈕就對應特定操作了。

 

  不過也不能說是完全不用了解,學程式學得越深,就會/得瞭解得更多。

 

  -----

 

  宣告:

  如果只會用指令的話,能讓程式做的事情大概不算多。

  第二個重要的概念是宣告,例如我希望電腦幫我存著一個數字,當我想使用這個數字的時候,我就能透過某種方法,讓電腦把這個數字給我用,這該怎麼辦呢?

  如果是在現實中的話,可能是找一張紙,把這個數字寫在上面;找一個人,請他幫我記得一下;或是拿起手機在記事本上輸入(其實就相當於請電腦幫我記錄啦)。

  等到我需要這個數字時,我就去找「那個人」、「那張紙」,或是手機裡的「那份檔案」。

  我就能得到我要的數字。

  要把一個東西存下來,就要有「可供存取東西的東西」,形象化的比喻就是--一個箱子。

  我如果想在程式運行中將某些東西存下,待會再取用,我就需要這樣的一個箱子。

  我可以在想要的時候把東西放進箱子裡,而後在需要的時候取出箱子裡的東西來用。

  所謂的「宣告」可以想成是跟電腦要一個箱子,那電腦就會從它的儲存空間中撥出一些位置給你當箱子用。

  那宣告箱子時,當然要取一個「名子」,這樣當我想要使用這箱子裡的東西時,我只要呼叫這個名子就可以了。

  除此之外,宣告箱子時也要告訴電腦「類型」--也就是我要在這個箱子裡裝什麼東西,為什麼電腦會需要知道這件事情呢?主要是兩個理由。

  一、根據你裝的東西大小不同,需要的箱子大小(儲存空間量)也不同,電腦要知道你想裝什麼東西,他才能決定要給你多大的箱子。當然你也可以故意要很大的箱子,來裝很小的東西,但這就是在浪費你的程式佔用的的記憶體。

  二、當電腦讀取到你要取用箱子裡的東西時,它可以判斷你有沒有拿錯東西(程式碼寫錯),可能你要拿的東西,並不是箱子裡提供給你的東西。例如你想拿件衣服,結果你打開的箱子寫著類型是褲子,那就錯啦。

  (當然上述這兩件事情並不是絕對的,比較近期的程式語言似乎有放寬限制的跡象,可能是因為它可以直接根據你放進箱子裡的東西來決定箱子大小之類的。不過比較早期的程式語言都還是有嚴格的限制宣告時必須指出「類型」。)

  宣告出了這樣的箱子後,我們就能用這個箱子來存放東西了。

  在程式語言裡面有個符號,和數學裡的用法差異很大,那就是「=」,等號在數學裡是指左右兩式相等的意思。

  在程式裡的意思則是--將右邊的東西整理完、算完,放進左邊的箱子裡。

  例如假如我有一個箱子a,我寫a=3,那就是把3丟進a這個箱子裡,以後我呼叫a時就可以得到3這個數。

  講到這裡你可能會有點苟且地說:「這跟數學的等號還是很像啊,我讓a變成3,這等式不就是成立了嗎?」

  那就繼續往下看個例子,現在a是3了,如果我寫:

  a=a+1

  嗯……這在數學上是一個不可能成立的運算(考慮一般情況的)。

  那在程式裡是什麼意思呢?很簡單,我們先看右邊的東西,右邊是a+1,這個算式裡用到了a,所以就要取出a裡的值來用,此刻a裡的值是3,所以這個算式其實是3+1,計算一下就是4。

  右邊整理出來是4,接著要把它放到左邊嘛,那就是把4丟進a這個箱子裡,a裡面原本裝著什麼就別管它了,把它丟掉吧(原本裡面的3拜拜啦~),總之現在a裡面就變成4了。

  所以這行程式碼做完以後,a裡裝的東西就變成了4。

  

  這種可以在程式運作中改變其值的東西(一般來說稱為「變數」),可以發揮的用處很大,例如可以用來記錄遊戲角色當前的血量,或是要記錄一段字串(就像記事本那樣),或者也可以記錄使用者按過哪些按鍵,做過哪些操作,例如許多軟體中都提供的一個功能--「回復上一動」,它總是記錄著你最靠近當前的幾次行動做了什麼。

  

  當然,宣告不是只能宣告變數,也可以宣告其他東西,概念上是差不多的,就是我跟電腦要一個箱子來裝某種類型的東西,其中一種類型就是--指令(函式),程式語言的創作者將東西封裝成許多個指令,他也提供了我們「自己創造指令」的方法,就是透過宣告,我們也可以自己宣告指令,當然這時候指令的內容要執行什麼,就要我們自己來寫了,透過宣告指令的方式可以簡化許多程式運作的流程與程式碼,好處很多。

  一般來說我自己寫程式時就是,寫到一半發現需要某種指令,那我就當作「這個指令我有了」,當即為它取個名子,然後繼續寫下去。寫到後來再慢慢把那些自己創造出來的指令補上內容。這種寫法就可以讓主程式的結構非常簡潔,邏輯較為清楚易讀。

  

  宣告還可以再更進一步地談,就是連類型都可以自己創造,不限於只能使用程式語言本身提供的類型。在物件導向的程式寫法中,自行創造類型、宣告物件是習以為常的事情。

 

  -----

 

  if判斷式:

  做判斷是我們平常一直在做的事情,根據情況、條件,做不同的決定。例如若紅綠燈是紅色的,我們就停下;是綠色的就通過;如果口袋有錢就去買晚餐,沒錢就回家睡覺之類的(誤)。

  我們當然也希望自己寫出來的程式,有這種能適情況變通的智慧。要做到這件事情,最重要的就是"判斷"的功能,在程式裡面就是if(for、while之類的也是)這樣的判斷式。

  那當然要有可判斷的東西,才有辦法做判斷,而且通常要是非常具體可化為數值的東西才能判斷,化為數值以後,就可以利用「==(相等)」、「>(大於)」、「<(小於)」這些方式做判斷。例如我要判斷a和b是否相等,程式碼可以這樣寫a==b,這行式子會得出一個真假值,如果a和b相等的話就會回傳true(真),不然就會回傳false(假),在滿多程式語言中真假值也是一個數字,分別表示1(真)、0(假),但寫程式碼的時候遇到判斷真假值時,我們一般還是寫true跟false,這樣我們比較容易讀懂,畢竟寫成1跟0可能會誤解成是在計算數字的結果。

 

  前面宣告的時候提過,「=」的意思已經跟數學上的意思不太一樣了,這邊在判斷相等時又是一個需要用到等號的地方,但是由於單個等號已經有特殊意義了,所以判斷式中的「相等」就不能用單個等號,而是要用雙個等號「==」。

  在C語言中的判斷式格式大致如下:

  if(條件){條件為真時要做的事情}

  在if後面的小括號()裡放條件,後面的大括號{}裡放條件為真時要做的事情。

  要做的事情可以不只一件,總之C語言中的程式碼會以左右大括號來決定範圍。

  例如:

  if(條件){

    要做的第一件事

    要做的第二件事

    ……

    }

  不同的程式語言幾乎都有if判斷式的功能,但格式上可能有出入,某些較新的程式語言放棄了用大括號來決定範圍的方式,而改成用"縮排"來決定,所謂的縮排就是像上面那種開頭空兩格的寫法,空同樣多格的東西,視為放在同個大括號裡。寫起來可能就像這樣:

  if 條件

    要做的第一件事

    要做的第二件事

    ……

  不縮排後就回到上一層(視同大括號結束)。

 

  而有時候除了符合條件時要做特定的事情外,不符合條件時也有對應的事情要做。

  這時候就要用到else(其他、否則)的功能。

  格式大概是這樣:

  if(條件){

    條件為真時要做的事A

    }

  else{

    條件為假時要做的事B

    }

  如果條件為真,就做A;否則就做B。

  if判斷式可以放在程式碼中的各種地方,if的括號裡面也可以接if,else後面也可以接if,就一個條件一個條件一路判斷下來這樣。如果X條件為真,就做A,否則如果Y條件為真,就做B,否則做C。

  總之用法變化萬千(?),重點還是你要想好要判斷什麼(邏輯要清楚),順序如何。

 

  -----

  運算子:

  運算子可以想成是一台機器,把一些數值丟進去這台機器裡,而後這台機器會吐出一個數值。

  如果你覺得這個比喻似曾相識,沒錯這跟數學上的「函數」幾乎是一樣的概念。

  那什麼東西是運算子呢?其實四則運算的+-x/都是運算子,它們都是「將兩個數值依序丟入,而後得出一個數值」。

  而在程式設計中要特別提這件事情,是因為我們還有很多其他常用的運算子。

  例如「取餘數」,在C語言中是用「%」這個符號,所以9%2會得到1。

 

  除了運算以外,還有關於「判斷」的運算子,像是大於「>」、小於「<」,這些運算子會回傳一個真假值,如果式子成立就回傳「真」,式子不成立就回傳「假」。

  像是3>5會回傳假,因為3並不大於5;

  而1>0會回傳真,因為1確實大於0。

  剛才說「輸入數值,回傳數值」,真假值不是數值啊?其實在C語言中真假值是數值,真(true)就是數字1,而假(false)就是數字0,所以如果你寫一行:

  true > false 這個式子會回傳真(true),因為1>0。

 

  而除了大於小於以外,還有另個數學上也很常見的東西--「等於」。

  寫法當然不是「=」,這邊再講一次,「=」的意義並不是數學上的等於,而是將右邊的東西丟到左邊的箱子裡面。

  在C語言中,如果想判斷兩個數值是否相等,要寫「==」(兩個等號連在一起),這就是判斷左右兩式是否相等的運算子。例如你寫:

  2 == 5-3 這個式子就會回傳真(true)。

  

  除了數值比較的判斷之外,還有邏輯判斷的運算子,它可以將兩個陳述連結在一起得出一個真假值。

  例如需要兩者同時成立才算真的運算子(這稱為「且」),以及兩者至少一個成立就算真(這稱為「或」)。

 

  在C語言中的「且」是「&&」,而「或」是「||」,舉個例子:

  3==5-2 && 2 == 1+1 左右兩邊的式子都會回傳真,所以用「且」串在一起後,就會回傳真。

  而3 > 5 || 2>1 左邊是假,右邊是真,用「或」串在一起的結果是真(只要有一邊是真就回傳真)。

 

  最後再舉一個常見的運算子:「非(真假對調,0變1,1變0)」

  在C語言中是「!」,這個運算子只有在後面輸入一個數值,就會得出一個值,如果輸入的是0就會得到1,輸入的是0以外的數值就會得到0。例如 :

  !3 會得到0

  !false 會得到true(實際上是數值1)

 

   那當然還有許許多多其他類型的運算子,只是以初學的角度來說不常見也不常用。

  而不同的程式語言,運算子的寫法可能會有些差異,但上述提到的這些運算子都算滿通俗的,絕大多數的程式語言中都是用這些寫法,比起形式上的符號怎麼寫,有沒有理解背後的概念其實更重要,尤其是邏輯判斷的那部分。

    

 

  -----

  for迴圈:

  「迴圈」是指「可能要重複執行的程式碼區塊」,而「for」可以理解成「對於某些情況」或是「在某些情況下」。

  連在一起的意思就是,在某些情況下,將一段程式碼重複執行。

  與之類似的還有while迴圈或其他類型的迴圈,結構跟寫法會有些差異,但概念基本上都是相同的。

  你希望電腦幫你重複執行同一段程式碼,而你要告訴電腦執行到什麼時候要停止。

 

  執行同一段程式碼並不表示要做同樣的事情數次,例如我可以要求電腦幫我印出同一句話「HelloWorld」100次,但我也可以要求電腦幫我從數字「100」印到「1」,每次印的數字都不一樣。

  為什麼執行同一段程式碼可以得出不同的結果?這是因為前提可能不同,例如宣告一個箱子裡面裝著數字100,然後我在迴圈的過程中將箱子的數字印出,然後把箱子裡的數字減1,這樣每次印出的值就會越來越小。

  for迴圈在C語言中的格式如下:

  for(初始值;條件;更新){

   要重複執行的內容

   }

  小括號中的三件事情,就表達了「在哪些情況下重複執行」。

 

  單純的用法就是用初始值、條件、更新來重複執行相同的事情特定次數,這時初始值中宣告的數不會在迴圈內使用到,單純只是拿來計算次數,例如 :

  for(i = 0; i<10; i++){

   印出HelloWorld;

   }

  就是重複印出10次HelloWorld。每次執行完迴圈後就會執行更新讓 i 加1,直到 i 等於 10的時候,不滿足條件,for迴圈就結束了。

 

  那如果想要每次執行的效果都不同,可能就會在迴圈中使用到宣告的變數,例如印出100到1的例子:

  初始值例如設一個數字為100,待會執行的內容就將這個數字印出;

  更新就是每執行一次迴圈後要做的事情,這裡是讓這個數字減1,這樣每次印出來才會不同;

  而條件是「何時停止」的判斷式,例如我只希望印到1的話,條件就是這個數字大於0才印。

  實際的寫法大概像是這樣:

  for(int i = 100; i >0 ; i--){

   印出i;  

   }

  這樣電腦進入for迴圈時,就會重複執行底下的「印出i」100次,而i從100跑到1。

  當印完最後一個1的時候,更新會讓 i 再減1變成0,這時條件就不滿足了,for迴圈就會結束。

  

  在已知執行次數與內容時,for迴圈只有節省程式碼的功能(也就是類似的程式碼你不需要重複寫好幾行)。

  但在執行次數未知時,for迴圈的用處就更大了,因為「條件」的地方也可以寫變數,例如如果我想讓使用者輸入一個正整數,然後印出1加到這個數的結果,這種次數未定的情況就沒辦法事先寫好同樣的程式碼要執行幾次。

  但利用for迴圈就很簡單,先宣告一個變數number去裝使用者輸入的數值,接著for迴圈寫:

  for(int i = 1; i<=number ; i++){

   將當前總和加上 i ;

   }

  就可以了。


 

arrow
arrow

    東東 發表在 痞客邦 留言(0) 人氣()