實習內容 | ||
目標: |
1. main 函數 (函式) 2. 顯示一些文字在螢幕上: 運用 stdio.h 裡的 printf 函數, 練習運用字串常數 (string constant) 3. 變數定義, 變數型態, 與設定運算式 (assignment expression) |
|
Step 1 |
在 Dev-C++ (下面圖片是版本 4.9.9.2 的輸出, 不同版本會有一點差異) 中嘗試下面的程式
int main(void) { return 0; } 選擇 檔案/儲存 (或按 Ctrl+S) 成為 test01.cpp 選擇 執行/編譯 (或按 Ctrl+F9) 編譯, 應該可以看到一個編譯成功的視窗如下
選擇 執行/執行 (或按 Ctrl+F10) 執行, 如果你是用 4.9.9.2 版本的話, 應該沒有看到任何結果, 其實是執行的太快了, 畫面一閃就過去了! 如果你是用 5.x 版本的, 應該就看得到畫面了, 不過你還是需要看一下下面的描述, 因為如果沒有照下面方式做的話, 當你產生一個可以執行的程式, 在資料匣裡你用滑鼠點兩下去執行的時候, 會發現程式一執行完就視窗就關掉了, 看不到畫面上的東西 請參考上課講義, 嘗試在 int main之前加入 #include <stdlib.h>, 並且用 system("pause"); 來暫停程式的執行 #include <stdlib.h> int main(void) { system("pause"); return 0; } 再編譯執行一次就可以看到下面的畫面
另一種暫停畫面的方法是 #include <conio.h>, 呼叫 getch(); 函數由鍵盤讀取任意字元如下 #include <conio.h> int main(void) { getch(); return 0; } 執行上面這個程式時, 程式執行過以後會暫停下來, 但是視窗裡沒有顯示任何訊息, 操作的人會有點不知道該如何繼續下去! 再修改一點點, 在視窗裡列印一列訊息出來: #include <conio.h> #include <stdio.h> int main(void) { printf("請按任意鍵繼續 . . . "); getch(); return 0; } 注意: 程式裡要使用 printf 函數的話, 使用之前一定要有 #include <stdio.h> 的敘述, 如果使用多次 printf 的話, 檔案裡還是只需要出現一次 #include <stdio.h> 試試下面這個程式 void main() { } dev C++ 編譯時會看到編譯的錯誤, 在下方 "編譯器記錄" 窗格裡可以看到如下的訊息:
上面第一列是 dev C++ 運用 GNU 的 g++ 這個編譯器的命令列, (由於程式檔案 test01.cpp 的副檔名為 cpp, 所以 dev C++ 用 g++ 來編譯, 如果你存檔為 test01.c 則 dev C++ 用 gcc 來編譯, 前者是 C++ 的編譯器, 後者是 ANSI C 的編譯器, C++ 在語法上和 C 有一點點的差異, 不過目前應該對你沒有太大的影響) 第二列的 error 代表編譯時的語法錯誤, 有語法的錯誤必須先修改, 否則編譯器並不會產生可以執行的機器指令檔案 test01.exe 在下方 "編譯器訊息" 窗格裡可以看到錯誤和警告訊息的列表:
你可以用滑鼠點兩下那一個錯誤, 上方的編輯視窗會自動跳到發生錯誤的地方讓你可以修改程式。訊息的內容雖然是英文, 不要不理它, 覺得它沒有跟你講同一國的話..., 請運用你多年練習的英文能力, 盡量去瞭解訊息所代表的意義, 通常都是告訴你為什麼你的寫法違背 C 的語法, 盡量不要忽視它, 下次看到類似的訊息, 才知道編譯器想告訴你什麼事, 遇見一樣的狀況, 才能夠很快地修改程式, 不要盲目地嘗試錯誤。 如果你安裝的是 Dev-C++ 5.x.x 上面的 system("pause"); 或是 getch() 是不需要的, 程式執行過後會自己暫停下來讓你看到程式輸出的結果 |
|
Step 2 |
接下來請練習下列程式:
#include <stdio.h> #include <stdlib.h> int main(void) { printf("Hello World!"); system("pause"); return 0; } 上面程式在螢幕上顯示 Hello World 訊息。 請修改程式使得程式可以在執行的時候印出兩列的Hello World: #include <stdio.h> #include <stdlib.h> int main(void) { printf("Hello World!"); printf("Hello World!"); system("pause"); return 0; } 都印在同一列上了?! 你需要加上一個特別的換列字元 '\n' 來使得兩次的 Hello World 顯示在不同列上, 請嘗試改成 printf("Hello World!\n") 試試看是否需要 #include <stdio.h> 這一列? 理論上你有用 printf 這個函數的話, 你就應該要在檔案最前端加入 #include <stdio.h>, 但是 dev C++ 允許你省掉這一列 (因為你以後不見得一定使用 dev C++ 或是 GNU C/C++, 我建議你不要貪圖方便而省掉它, 錯的事情多做幾次以後, 會很容易以為自己做的是對的!!) 接下來修改程式, 在螢幕視窗裡顯示下列資料: **** ** *************** ******** *********************** * * *************** * **** * * * **上面程式中雙引號括起來的 "Hello World" 稱為字串常數 (string constant)。 中文的字串 "請按任意鍵繼續 . . . " 也是字串常數 |
|
Step 3 |
變數:int x; x 是一個程式裡定義的變數, 存放的資料型態是 int, 也就是 32位元有正負號的整數 (範圍是 -231 到 231-1) 一旦在程式裡定義一個變數以後, 你可以運用 = 把指定的資料存放在變數裡面, 例如 x = 123; 把整數 123 存放在變數 x 裡面, 存放在變數裡面的資料會一直保留在變數裡面不變, 直到另一個 = 把其它資料存放在這個變數裡, 才會覆蓋掉剛才存放的資料。下面這個例子就是解釋這個概念: x = 123; printf("x=%d\n", x); printf("doing something else\n"); printf("doing something else\n"); printf("doing something else\n"); printf("doing something else\n"); printf("x=%d\n", x); printf("the value stays unchanged in the variable x, until you change it explicitly\n"); x = 321; printf("x=%d\n", x);上面程式片段中, printf() 函數是標準輸出入函數庫 (stdio) 中所謂的 "格式化輸出函數", 我們會在第四章裡比較詳細地說明, 目前你只需要知道像 printf("x=%d\n", x) 函數呼叫敘述裡面, "x=%d\n" 和 x 是給 printf 函數的兩個參數, 其中第一個參數是一個字串常數, 第二個參數是一個整數數值, 第一個參數裡字串中的 %d 是指定轉換第二個參數的格式指令, 將 123 這個整數資料由內部的二進位格式轉換為十進位格式輸出在螢幕上 再試試下面的程式碼, 看看印出來的東西是什麼? x = 123.456; printf("x=%d\n", x); 編譯時有錯誤或是警告訊息嗎? 在 Dev C++ 中如果你用 C++ 的編譯器 (程式的副檔名用 .cpp) 則你會得到以下的警告訊息 [Warning] converting to 'int' from 'double' 警告訊息是告訴你這個語法有可能有危險, 希望你多留意, 但是編譯器還是會翻譯成機器可以執行的 .exe 檔案, 以這個範例來說, 警告訊息是說當你要電腦把有小數點的資料 123.456 存放在整數型態的變數 x 裡時, 資料會有損失, 小數點以後的資料會損失掉... 這個訊息希望你重新檢視它, 如果你確定可以接受這樣子的處理方式, 你就直接執行剛才的 .exe 檔案, 否則就要修改程式了 (以後你會學到如何讓編譯器不要對一個你已經檢視過的敘述發出這樣的警告訊息) 請注意在 Dev C++ 中如果你用 ANSI C 的編譯器 (副檔名用 .c) 編譯上面這段程式, 你不會得到任何警告訊息, 你可以運用程式檔案的副檔名來挑選編譯器, 不同的編譯器有不同的語法規則 為什麼在一個程式需要定義一些變數? 你能夠想像如果你自己沒有任何記憶能力的話, 你能夠做的或是能夠計算的是不是大受限制呢? 實際上記憶體的數量是否有限制? 記憶體的存取方式是否有限制? 都會影響到一個程式的能力。 |