C語言程式的架構是由被稱為是函式(function)的構建方塊(building block)所組成。撰寫C語言程式的步驟是先撰寫函式,然後再將函式組合成程式。函式組合的方式是透過上層呼叫下層以及下層結束再到上層的方式來互動。其中最上層,最早開始上班,最晚下班的函式,是一個名叫main()的主函式。為了讓C編譯器能夠認得,主函式的名稱唯一而且永遠不變。
做為構建方塊,每一個函式,會有一個名稱以備讓其它函式呼叫,可能會有輸入參數,以備接收呼叫函式提供的輸入資料或輸出入記憶體位置,可能有回傳值,以備在結束執行回到呼叫它的函式時,順帶傳送執行狀況訊息給呼叫它的函式。函式的標準原型如下
return_type function_name(parameter list)
{
body of the function
}
其中為return_type回傳值的資料型態(詳見後面Data Type),function_name 為函式名稱,parameter list 為在呼叫這個函式時必需要先準備的輸入參數列表。大括號{...} 所包涵的各行則為函式的主體,會由多行C指令共同組成。後面會有更具體的範例。
Hello 程式
絕大多數人的第一個C語言程式,都是簡單的以程式把Hello顯示到主控台(Console)。此處主控台是指可供人觀看以及在操作的平台。透過這個程式,學習者可以實際體驗並了解C程式的基本架構。
範例:
/* Program #1 -Show Hello On Console */
#include "c4mlib.h"
int main(void)
{
C4M_STDIO_init();//Setting UART0 as standard IO port
while(1)
{
printf("Hello! I can write program now.\n");
}
return 0;
}
當程式跑完之後,在主控台的的顯示器上會顯示
Hello! I can write program now.
此程式中包含了幾個重要元素,以下將會各位介紹
程式第一行
/* Program #1 -Show Hello On Console */
為程式註解,程式註解是給程式設計者看,關於該行或則該段落程式的說明,編譯器不會去處理這一段。在C語言中註解會由/* 開始,*/結束,兩者所包的內容即為註解。
#include "c4mlib.h"
#include是前置處理器指令(Preprocessor directive)這一行會引入在 < > 內標頭檔(header files),標頭檔的內容會告訴C編譯器我這個程式需要那些外部資源。這個程式需要 stdio.h所指示的資源,這些資源本來就附在C編譯器做為附件,但當程式設計師需要時仍然要用引入指令告訴編譯器。
int main(void)
所有的C語言,都是由被稱為函式(Function)的基磚組建起來的。每一個程式由一個(含)以上的函式組成。每一個函式都有它自己的名稱,而且這程式名稱必而唯一不能有同名的函式出現在同一支程式。 有一個特殊的函式是每一個程式都需要的,那就是主函式main()。所有程式的執行,都由主程式的頭開始,並結束於主程式的尾巴。在main()之後由大括號{ } 所包含的各行內容即為主函式內容。
while(1)
{
//此處放重覆執行的其他程式碼
}
為永久迴路,後面專題將有詳細說明,此處暫請照用。
本範例主函式永久迴路內只有一行,
printf(“Hello! I can write program now.”);
這行造成螢幕顯示Hello! I can write program now.訊息。實際上主函式是呼叫印出函式printf()來執行這個顯示動作。印出函式為C編譯器附屬的函式館內的函式,它可以印出雙引號 “...”內的字串。這一行的尾巴有一個符號 『;』 表示前面為一行指令。許多行沒有『;』 斷尾的文字串,C語言會視為同一行。
main()之後的大括號 『{』雖然沒做什麼,但可視為程式的開頭,『}』雖然也沒做什麼,但它會結束這個函式以及程式。
輸出函式printf()
能夠看得到程式的結果,對於學習C會有很大的幫助。基於這個原理,C語言提供了printf(),輸出函式讓程式設計者,得以透過標準輸出裝置,如前面所講的主控台,與他自己所寫的程式互動,借由這個函式偵測程式是否照自己的意思在執行。
AVR微控器C 可以將標準輸出入裝置預設為RS232埠,則RS232的輸出訊息會由模擬器輸出到模擬畫面,也就是說模擬器的輸出入即擔任前述主控台的角色。因此如要使用AVR微控器C 可時,在程式使用printf()要先以
C4M_DEVICE_set();
執行配合本課程用微電腦ASA_M128的初始設定,即會將標準輸出入裝置預設為RS232埠。
原版C的這個函式是存放在C語言的標準輸出入函式庫中(STanDar IO),我們必需要引入將這個函式庫啟用的前置動作指令檔stdio.h來指示編譯器及連接器如何執行相關準備動作。其指令行如下:
#include <stdio.h>
ASA-M128,除了提供將上述stdio.h 所提供的資源外,額外提供了一些其他資源,其資源的前置動作指令檔為,"C4MLib.h" 。為了精簡前置動作指令檔的引入, C4MLib.h內部已包含了引入stdio.h。故我們可以用
#include "C4MLib.h"
取代
#include <stdio.h>
printf() 可以利用格式指定字元format specifier來設定輸出資料的格式。其格式指定字元及對應格式如下表:
程式呼叫輸出函式printf() 的標準格式如下
printf(“control string”, argument list);
其中控制字串control string內容,即為要顯示印出的字串,字串包含一般的文字,以及控制字元如%f,/n,等。一般文字會直接顯示,而控制字元則會參考後面緊接著的參數列argument list 依序擷取。
範例:(本範例需開啟浮點數)
#include "C4MLib.h"
int main(void)
{
C4M_DEVICE_set();
while(1)
{
printf("Character %c's ASCII code is %d\n",'A',(short int)'A');
printf("The ASCII code %d represents the Character %c \n",(short int)66, 66);
printf("Decimate number %d in Hexadecimal is %x\n",(short int)15,(short int)15);
printf("The scientific form of %f is %E\n", 0.001234,0.001234);
}
return 0;
}
其中, "Character %c's ASCII code is %d\n" 這行中 的%c,%d,\n三個均是控制碼,其他非控制碼會直接印出來,而%c,%d各自會依序取用後續的2個'A',做為資料來源並依字元及十進制數值印出。結果在模擬RS232接收畫面應該可以看到
Charater A's ASCII code is 65 The ASCII code 66 represents character B Decimate number 15 in Hexadecimal form is F The scientific form of 0.001234 is 1.234000e-003 |
格式碼一欄表
輸入函式scanf()
程式要與主控台互動,除了需要printf()來讓程式可以將訊息顯示到主控台上,也要需主控台得以向程式送出控制訊息。C語言提供了scanf()資料輸入函式讓程式得以接受主控台的訊息。
AVR C 將標準輸出入裝置預設為RS232埠,而且模擬環境中,也會接RS232的輸入接到電腦鍵盤上,同時也會將鍵盤的輸入同步顯示在畫面的RS232輸入視窗上。 因此如要使用時,在AVR C環境中必需開啟RS232的模擬畫面來與監視鍵盤經經由RS232送往程式的訊息。這個函式也是存放在C語言的標準輸出入函式庫中。
程式呼叫鍵盤掃瞄式scanf() 的標準格式如下
scanf(“control string”, argument list);
其中控制字串control string內容,為控制字元串由%f,%d,%s組成。會由主控台依序接收訊息並照控制字元解譯格式再依參數列argument list 中列出的各個變數記憶體位址存入內容。只要在要存放的變數名稱之前加一個『& 』號,即是指出向一估變數的記憶體位址。例如A變數的位址即&A。
範例:
#include "c4mlib.h"
int main(void)
{
C4M_DEVICE_set();
while(1)
{
int input;
printf("Pleas keyin a number:");
scanf("%d", &input);
printf("The number you keyined is: %d\n", input);
}
return 0;
}
執行結果螢幕會先顯示
Please Keyin a number:
以提醒使用者輸入一個數值,scanf()會提持續等待,當使用者先後鍵入1,2,3則依序會看到螢幕顯示
Please Keyin a number: 1
Please Keyin a number: 12
Please Keyin a number: 123
輸入完畢,這些123只仍只顯示在主控台上,當使用者再按enter之後,主控台即將完整的123值送給程式。這時scanf()會完成輸入掃瞄,進入下一行程式執行 printf() 得到以下結果
Please Keyin a number: 123
The number you keyined is 123
前述的一問一答,都是用英文,有些編輯器支援中文功能,那麼它就能夠正確的使用中文做為提示,若編輯器不支援中文,則在提示字串中出現中文會出現什麼樣的結果則很難說。