C語言教學講義

 

引言:

        這本教材是專門為麗山高中學生所設計的講義,內容盡量深入淺出,而所有的概念都會先用故事表達,再附上技術性說明,希望能使每一位同學都能夠體會程式語言的奧妙,讓程式不再難以親近,讓會寫程式不再是少部份人的專利‧希望各位同學能夠用心學習,那麼,我們開始吧‧

 

導論:

        故事背景是在西元3000年,人類早已脫離地球的束縛,向外太空發展,而這本書裡的主角喬治,住在離銀河係不遠的織女星系裡面的MAYA-1002號星球上,他是一個17歲的男孩,有許多的兄弟姊妹,一家人相處融洽,而他的雙親事業有成,分別在星際資訊界中享有名聲‧

在12月17號,喬治和父母決定到獵戶作去欣賞壯觀的星雲,由於當地所使用的語言他從來沒接觸過,所以喬治在放學後去了語言學習所一趟...

到了語言學習所,一位美麗的生化人走了過來,說到:先生,您好,歡迎來到爾曼星際連鎖店,請問您要學習哪種語言呢? 喬治回答到:呃.. 我不太清楚耶,我只知道我要去獵戶座玩‧ 生化人說:喔..獵戶座..那是馬爾尼薩語,請跟我來‧喬治隨著生化人到一台機器前面,生化人說:請坐好,眼睛面向這板子,你將會進入十分鐘的無意識狀態,準備好了就按這個紅色的紐,帳單我會從你的帳戶扣除,感謝您的使用‧喬治深呼吸了一下,按下了紅鈕,一道強光從前面射入了他眼睛..十分鐘過後,喬治醒了過來,生化人走了過來說到:我要做一個測試,請聽以下的對話:1!@##@##%︿&&(&%@%*︿&*%%︿&%&,您聽的懂嗎?‧喬治說:沒問題,看來我已經學會了馬爾尼薩語了,

喬治離開了語言學習所,回到了家中,喬治把生活用品膠囊和現代服飾膠囊放到口袋中,期待著獵戶座之旅‧

故事先到一段落,我們來說正經事吧,電腦,對我們來說也算是一個陌生的國度,想要到那邊玩的盡興,就必須懂的那邊的語言,也就是電腦的語言,電腦只懂得0與1也就是通電和不通電,所以在一開始和電腦溝通的語言就是由0與1組成的,也就是所謂的機械語言(Machine Language),但是,用0與1寫程式實在是太麻煩了,一道簡單的指令可能要數百行

 

010101010101

011111100010

000111110000

100001100000

100100011110

001000100011

100001110001

你看懂嗎?

 

 

 

第一課 印出在銀幕上

 

終於,我們要開始寫程式了,我們先學在銀幕上印出我們想要的東西好了,這是程式的第一步,如果你要想跑步,那你一定要先會走嘛!這道理誰都知道,如果電腦不顯示出東西,你怎麼知道結果是啥或是發生了什麼事?

所以,我們先學習如何在銀幕上印出東西吧。

我先來個示範:

列印( Hello World! )

天阿,會不會太簡單了? 沒錯,就是這樣,只差一點點就對了,程式就是這樣,你要告訴電腦要幹麻,一步一步教他做,電腦就像是小孩一樣,你要他幹麻,一定要先跟他說才行,否則他就根本不會動了,現在,你叫他列印Hello World!他就會乖乖的列印出來。

注意! 這個觀念很重要,在你還沒懂程式之前,你一定認為程式很可怕看都看不懂,其實根本沒什麼,就是那些字,都是要電腦怎樣怎樣,一點都不複雜,寫程式最重要的就是把電腦當成白痴,記住這句話,你以後會了解的。

我們再來看之前的程式碼,他是中文耶,程式是外國人發明的所以我們要把它變成英文‧

 

printf( “Hello World” );

嗯.. printf就是印出來意思,蠻好記的吧?你可能會想說後面那些括號和雙引號是幹麻啊? 那就是語法,語法??? 啥是語法?好複雜...

語法你就把他看成是英文文法吧。 例如 I should +原型動詞,你不會問為啥吧?就是那樣啊,同樣的,列印的語法就是:

ptintf( “你想印出的東西” );

記住,有三大要點:

1. printf不要忘了f

2. 句尾要加上分號,你一定會忘記,相信我。

3. 』是雙括號喔,有兩個,字要放在裡面,小心錯!

基本上來說,這樣就差不多了,但是要編譯(不知道是啥嗎,編譯器所做的動作叫做編譯,翻翻前吧)出來還差一點,完整版見下:

include <stdio.h>

int main

{

   printf( “Hello World!” );

   return 0;

   system("PAUSE");

}

 

好像多了好多看不懂的東西,沒關係,先不要理,後面會再做說明。不要以為列印就這樣結束了,其實他很複雜,很多功能,我到後面會再提一次。

你應該學會了吧? 我們來寫一寫小東西吧!

習題:

(1)        在銀幕上印出麗山萬歲四個字。

(2)        在銀幕上印出我愛C語言。

 

 

第一章 步上神秘之旅

嗡.. 喬治的父母從傳送門回到家了,喬治興奮的跑過去問道:我們什麼時候出發啊? 喬治的爸爸里昂回答說:喬治,抱歉了,我們臨時發現一種新型電腦病毒,他已在星際資訊網中傳播開來了,我們必須趕緊去處理,這是紅色狀況呢!

喔... 喬治失望的說道;不過,你已經夠大了,我相信你一定可以完成這次旅行的,喬治的母親安慰道;喬治又有精神了,他高興的說:我真的可以自己去嗎?太棒了!隨即,他跑到自己房間去準備東西。寶貝,我們走了,碟片在桌上,不要忘了,要小心喔!掰掰!喬治的父母們走進傳送們,一瞬間就不見了。

喬治走出房間,把碟片放進手錶裡,天啊,是六點的波動,我要來不及了。他匆匆忙忙的走進傳送門,設定好目的地,按下啟動,一陣閃光過後,他已身在MAYA 1002星際國際機場。一陣悅耳的聲音:各位旅客您好,前往獵戶座的星際波動即將在六點發生,請還沒登機的在204登機。喬治聽到了,趕緊跑到204登機口,但是他赫然發現,他還沒有位子!喬治快急瘋了,跑到櫃檯說:我要劃位子,這是我的碟片! 機器人把碟片放到眼睛前,說到:喬治先生,您的機位是A12,請問你有行李嗎,行李也要登記位子喔! 有,我有行李。喬治把行李交給了機器人,機器人說:您的行李編號是U9300,請記住。喬治拿了碟片就跑向登機門,進入了球型的機艙,他坐上自己的位子,期待著一個人的旅行。

 

故事又到一個段落了,切入正題。現在要講變數宣告,何謂變數宣告呢?就是告訴電腦說:我要借一個地方放東西,譬如說放一些數據、放一些文字等等。有點難懂嗎?我換一個方法說好了,喬治之前不是不能登機嗎?因為他沒劃位嘛,機上沒有他的位子所以他進不去,好,我們把我們要存入的東西看成喬治,宣告看成是劃位,如果你沒先跟電腦要一個位子來放東西(那個位子的名子叫變數),你就不能放東西進去了,就好像是不能登機一般,了?

怎麼樣做變數宣告呢?

include <stdio.h>

 

void main()

{

   int a;

   a = 3;

}

int 是啥啊,他是變數型態,就像是行李有行李的位置,喬治有喬治的位置一樣,是放不同的東西。 以下是變數型態列表,記起來!

int : 整數資料型態,存放整數資料值。

long : int但是範圍比較大。

float : 存放浮點數資料型態,存放有小數的數值。

double : 倍精數資料型態,存放的小數位數比float多。

char : 字元資料型態,存放如’a’, ‘b’, ‘!’等字元。

以上是基本的資料型態,每一個資料型態都適合不同的資料來存入。

講解一下之前的程式碼:

include <stdio.h>

 

void main()

{

   int a; 宣告說:把a用來存放整數

   a = 3; 讓a的值等於三

}

你也可以這樣宣告 int a, b, c; 這樣的話就是說a,b,c都是用來存放整數,你就可以使用三個空間來存放整數了。

a = 3這句話是什麼意思呢? 就是把3放到a的位子裡。

b = a-3 因為之前a已經是3了,所以3減3等於0,b等於0。

了解嗎?

那...我要怎麼把變數裡面的東西印出來呢?

記得之前的printf嗎?就是他!

include <stdio.h>

 

void main()

{

   int a;

   a = 3; 

  printf( “%d\n”, a );

printf( “a=%d\n”, a );

}

執行結果

3

a=3

天阿printf( “%d\n”, a );這句就不懂,那個%d幹麻啊,為什麼沒有印出來呢?

原來a之值會取代%d所以會印出3而不是%d;那那個\n是幹麻啊?喔.那是換行的意思,你看執行結果不是在3後面換行了?

printf( “你想要的東西”,變數名稱 );

變數名稱是取代前面的%d,如果有多個%d,會依變數名稱的順序依序填入。

如:

void main()

{

    int a,b,c;

    a = 3;

    b = 4;

    c = a+b;

    printf( “%d+%d=%d\n”,a,b,c );

}

執行結果

3+4=7

看到了printf( “%d+%d=%d\n”,a,b,c );中的a,b,c依序填入%d了解了吧?

關於%d,其實是跟資料型態關,也就是在變數宣告前面打的東西有關,見下表。

int a   a要用%d表示

long a  a要用%ld表示

float a  a要用%f表示

double  a要用%lf表示

char a   a要用%c表示

了解嗎?

來一下重點整理吧。

1.      變數宣告:跟電腦借一塊位子用。

2.      如何定義變數? 使用『=』,例如:a=3;這樣a的位置裡就放著3這個數字了,記得加分號喔!

3.      把變數裡的東西印出來使用printf(“%d(or other)”, 變數名稱);,記得加分號喔!%之後接的東西查查上面的表吧!

 

 

 

 

 

第二章  入境

即將進入星際波動,倒數:三、二、一、出發!只見到一陣強烈的白光湧進了機艙,雖然說是光,但是卻有液體的光澤,雖然看的到,但是喬治怎麼摸也摸不到,只感覺皮膚溫溫的,當他赫然發現其他人已消失在明亮中時,四周的景物又回復正常,每個人都看起來像大夢初醒的樣子,一陣親切的聲音從耳邊響起:歡迎來到獵戶座,由於星際病毒的氾濫請各位乘客依照指示行動,謝謝您的配合。MAYA航空公司感謝您的搭乘。喬治從傳送台取出了自己的行哩,接著移動到入境口。哇!獵戶座的入境管理果然嚴密,不同條件的人必須進入不同的門接受檢查,喬治搭乘著光圈駛向看不見盡頭的長廊,差不多每隔十公尺就有一個檢查站,如果符合檢查站的要求,就可以進入該檢查站接受詳細的調查,光圈開著開著,到了第一個檢查站,18歲以上男性請進入,喬治心想:我才17歲而已,下一個吧。開著開又到了下一個檢查站,十八歲以下,且為女性者。喬治是男的所以他當然沒進去嘍!又到了下一站,男性或行李超過一百公斤者。喬治想:我是男的,雖然我行李只有十公斤但是是『或』嘛,我就進這個檢查站好了。喬治深呼吸了一下,就進入了第三號檢查站,才剛剛進入了三號檢查站,一道刺眼的綠色閃光,讓喬治睜不開眼睛,等視力慢慢的恢復後映入眼簾的是一座又一座離子光屏,每座光屏上面寫著不同的物種,喬治找到了喬治找到了“地球人”的標示,深深吸了一口氣,進入了光屏,一陣輕柔的聲音響起: 歡迎來到獵戶座三號檢查站,我將會擷取您腦皮質表面的部分思緒來判斷您是否合格,請不要亂動‧

相同的綠色閃光又出現了,過了數十秒,前面的光屏突然從白色轉成淡藍色,『您已經通過了,祝您旅途愉快』,喬治遲疑了一下,就踏進了淡藍色的光屏中了,一出了光屏,他就被那炫麗的星空深深吸引住了……

 

故事又到一段落了,這裡我們將會談到C語言的條件判斷,其實條件判斷最主要的就是檢查的部分,喬治不是經過了許多的檢查站嗎,那就是一種條件判斷,在程式語言中我們用到 if else 進行所謂的條件判斷,什麼是條件判斷呢,你可以把他想程式每個檢查站的進入條件,像是第一檢查站,須滿18歲方才進入,喬治沒有18歲,所以他不符合,只能到下一個檢查站去,請特別注意且和或的用法,當喬治通過第二個檢查站的時候,該站規定“十八歲以下,為女性者”, 注意!雖然喬治是18歲以下,但是他可不是女的,在““的前提下,喬治當然不能進去了‧終於,喬治到了第三站“男性行李超過一百公斤者”,在“”前提下,雖然喬治的行李沒有超過一百公斤但是他是男的,所以他就順理成章的進入第三檢查站了,哇!說了那麼多,來談談程式吧,我現在把喬治通關的過程用程式語言表示出來:

假如 (喬治是18歲以上的男性)

{

      喬治進入第一檢查站

}

不然 假如(喬治為十八歲以下,且為女性)

     {

    喬治進入第二檢查站

}

不然 假如(喬治為男性或行李超過一百公斤者)

{

     喬治進入第三檢查站

}

注視口語化的程式語言,真實的寫法也沒差多少,我現在就來好好介紹完整的條件判斷的正確語法

if( 條件 )     就是假設一個條件,如果為真,就執行大括號裡的程式碼

{             

              PS. 大括號喔,小心打錯

}

else if( 條件 )  如果不符合上面的條件,但是還有其他的判斷條件,用else

{         連接,如果沒有就不用了,可以不斷的接下去,到你滿意為止

          PS. else後面還是要用if

}

 

條件部份的語法:

1.      判斷等於情況 使用”==”,注意!是==不是=,千萬不能搞錯

if( a==3 )            //a等於三的時候

{

   printf( “a is 3\n” );  //印出 a is 3 在螢幕上

}

2.      判斷大於、小於、大於等於、小於等於

大於使用 “>”

小於使用 “<“

大於等於使用 “>=”      PS. 注意順序

小於等於使用 “<=”      PS. 注意順序

        If( a<3 )        //假如a小於3

{

   a = 4;       //4之值寫入a

}

  3. 判斷不的情況,使用”!”

     “!”可以使用到各種判斷裡,如不等於、不大於等…..

     if( a!=3 )        // 假如a不等於3

     {

        printf( “a is not 3\n” );   //在螢幕上輸出a is not 3

}

    4. 的判斷

       且,使用&&

           if( a>3 && a%2==0 )  // 如果a大於3且可被2整除

           {

              printf( “a is bigger than 3 and a can be divided by 2” );

}

       或,使用||

           if( a>3 || a%2==0 )    //如果a大於3或可以被2

           {

              printf( “……..”)

}

如果a等於9,在使用的情況下,不會執行在大括號裡面的程式碼,但是在或的情況下卻會執行,為什麼呢?請見下表:

所有條件都要成立方才為真

所有條件中對一即可

 

呼,終於說完了,不過,剛剛喬治不是進去了第3號檢查站嗎,在他進去後,又要選擇一作光屏以便通過,那麼換個角度看,是不是一個條件判斷裡可以再包一個條件判斷呢?沒錯!這就叫做if的巢狀結構,一個if裡面可以包含無線多個個if,如下:

If(…)                         //一個if裡面可以接無限多個if

{                             //當然,之前的規則一律適用

    if( … )   

{

   if( ... )

   {

        …………

}

}

else     

{

    ……..

}

}

這就是if的巢狀結構,我再舉一個例子好了

#include <stdio.h>

#include <iostream.h>

 

int main()

{

   int a;

   scanf( “%ld”, &a );           //讀入a

   if(a%2 == 0 )                //如果a是偶數

{ 

   if( a>10 )               //如果a大於十

{

   printf( “is even number and bigger than 10\n” )l

} 

else                   //不然,就執行下面的大括號

{

   printf( “is even number and smaller than 10\n” );

}

}

else                       //如果是基數,就執行下面的大括號

{

     printf( “is odd!!\n” );

}

}

終於告了一個段落了….. 我出一些作業給大家做吧

 

1.      輸入兩數,判斷兩數大小

2.      輸入三數,判斷三數大小(不包含等於)

3.      輸入三數,判斷三數大小(包含等於)

 

 

 

 

 

第三章、光能轉換中心

當喬治出了檢查站,哇,滿天星斗,奪目燦爛,喬治迫不及待的走到了獵戶作星際機場的觀景台,壯觀的星雲,伴著七彩的光芒,從間隙裡透出,產生了神秘多變的光圈,喔,對了,再這裡介紹一下這裡的星際環境,獵戶做是人類第30270個星際值民地,建立在X-10黑洞旁邊,利用黑洞的重力能產生能量,並產生大量的離子能,獵戶座殖民地為球型的殖民地,白天和晚上相隔12小時整,由於近年來時空科技大為盛行,獵戶座殖民地亦更加繁榮。由於喬治現在是在高一千公尺由碳奈管所建的觀景台,所以幾乎可以看遍半個殖民地,喬治轉了轉頭,再他的左前方有一座金色的三角型建築,再他的頂端有一顆銀藍色的光球,每隔五秒就有三道分別為白藍黃的射線射入,喬治看入迷了,忽然聽到旁邊的遊客說到:來獵戶座不去看看光能轉換中心就白來了,我們趕快去傳送門吧!此時喬治眼中一亮,於是也跟了過去。

    過了差不多5分鐘,喬治來到了光能轉換中心,抬頭向上一看,哇….. 剛剛那三道光芒現在更加明顯了,隨即他來到了介紹中心,介紹的“人”是一座雷射3D投影機,他慢慢的就開始光能轉換中心的用途,光能轉換中心是獵戶作一切能量的來源,由於獵戶座在強大重力場旁邊,必須以反物質振波方能達到平衡,而利用獵戶座星雲中豐富的等離子能和稀有的紫金礦石,產生光能互換,最後再利用宇宙中的黑暗物質交互作用後產生反物質振波,由座頂端的光球發出,一但本中心遭到損壞,獵戶座將立即產生重力崩解,這一切將不復存在,由於確保此中心的安全,我們將等離子能轉換場、紫金礦石提煉場、黑暗物質收集場分別至於獵戶座的三個地方,彼此成正三角形,各位剛剛見到的白光就是等離子能轉換後的產物,藍色光則是紫金礦十提煉後的成品,而黃色光自然就是宇宙中的黑暗物質了。聽完了簡介,就到處看看,不過他非常小心,深怕一不注意就把獵戶座毀了…….

 

 

 ( 第一屆學長李承達製 )