C 語言的基本語法

 

  Contents






1. 前處理器指令 (preprocessor directives)

2. 函數/函式 (function)

3. 變數 (variables)

4. 設定運算式 (assignment expression)

5. 運算的優先順序 (precedence and parenthesis)

6. 格式化輸出 (formatted output)

7. 輸入與輸出的重新導向 (input/output redirection)

8. 簡易的檔案輸出及輸入 (simple file input/output)

1

前處理器指令 (preprocessor directive): #include <...>

1. 請在系統中找到標頭檔案(引入檔) stdio.h, 這個檔案放在哪一個目錄中, 可以在 dev C++ 工具/編譯器選項 中看到, 如下圖

如果你的程式副檔名是 .cpp, 編譯器會使用 C++ 引入檔, 如果你的程式副檔名是 .c, 編譯器會使用上圖中的 C 引入檔

2. 請在 devC++ 編輯器中打開 stdio.h

3. 在檔案中搜尋 printf(...), 請注意不要更改任何內容

這些都是標準的輸出輸入函數, 提供給你使用, 讓你可以很快很有效率地完成程式中資料輸出和輸入的設計

運用下面的前處理器指令, 你可以很快地把 stdio.h 檔案裡的內容合併到你的程式中

#include <stdio.h>

2

前處理器指令 (preprocessor directive): #define PI 3.141593

你覺得下面這兩個敘述哪一個比較清楚?

area = 3.141593 * radius * radius;

vs.

area = PI * radius * radius;

也許你的回答是 "一樣" 啊!! 3.141593 不就是圓周率嗎? (或是前者較佳, PI 是什麼?)

不過如果這個常數是一個你不熟悉的數字, 例如 6.62606896, 在程式裡直接出現這樣的魔術數字是不好的, 是會讓很多人看不懂的, 這個是所謂的普朗克常數 (Planck constant), 給個名字對很多人來說就熟悉多了

#define Planck 6.62606896

再回到剛剛的圓周率 PI, 如果這個常數在程式裡出現很多次, 你還願意每次都打 3.141593 嗎? 萬一有一次打錯變成 3.14193 (不過才錯一點點而已), 你能夠很快找到嗎? 萬一你希望把精確度提高成 3.14159265359, 你要把每一次出現的數字都換掉才會一致喔!!

area = 3.141593 * radius * radius;
perimeter = 2 * 3.141593 * radius;

vs.

area = PI * radius * radius;
perimeter = 2 * PI * radius;

在寫程式的時候常常大家都盡量遵循這樣的法則: No magic constants!!

ANSI-C (C89, C90, C99, C11) 中有另外一種更好的方法來解決上述的問題: "const 變數", 例如:

const double PI = 3.141593;

area = PI * radius * radius;
perimeter = 2 * PI * radius;

3

程式的基本單元: 函數/函式 (function)

你認得的第一個函數/函式

int main(void)
{
    return 0;
} 
printf(), scanf(), system() 都是 C/C++ 函數庫裡面的函數, 再一個自己定義的函數
int square(int x)
{
    printf("doing something in fun() with parameter x=%d\n", x);
    return x*x;
}
怎樣運用一個自己定義的函數呢? 呼叫它, 請注意 CPU 控制權的移轉 (程式碼執行的順序)
int square(int);
int main(void)
{
    int result; 
    printf("before calling fun()\n");
    result = square(123);
    printf("after fun() returns, result=%d\n", result);
    return 0;
}

4

記憶體 (memory): 程式在執行時記錄部份結果或是使用者輸入以供後續運算使用的地方,在程式中給它一個名字以方便存取 -- 變數 (variable)

int count, large;
double x;
double y, z;
char first_initial;
char ans;

設定運算式 (assignment expression): 把等號右手邊的算式數值計算出來存放到左手邊的變數裡面

count = 10;
x = 12.34 * 567.8 + 9.0;
ans = 'a';

請注意, 在 C 的語法 中 (除了指標語法之外), 等號左手邊出現的基本上就是變數, 不會出現運算式或是函數呼叫

5

整數除法和浮點數除法的差別:

在 dev C++ 中計算並且列印下列整數除法運算式 (integer arithmetic expression) 的結果

3 / 15
15 / 3
16 / 3
17 / 3
18 / 3
16 / -3
0 / 4
4 / 0

例如 :

整數的除法

int x;
x = 3 / 15;
printf("x=%d\n", x);
再試試浮點數的除法
double x;
x = 3.0 / 15;
printf("x=%f\n", x);
或是 3 / 15.0 或是 3.0 / 15.0 或是
dobule x=3;
x = x / 15;
printf("x=%f\n", x);
請比較一下:
dobule x;
x = 3 / 15;
printf("x=%f\n", x);

請問這個是浮點數的除法還是整數的除法?

最後請比較一下:

double x;
x = ((double)3) / 15;
printf("x=%f\n", x);
請問這個是浮點數的除法還是整數的除法?

6

運算式 (expressions): 算術運算式

運算子的優先順序 (precedence): 例如先乘除後加減, 可以用小括號更改運算的順序

operator precedence table

請練習運用 +,-,*,/ 以及小括號撰寫一個 C 的運算式來完成下列公式的計算 (其中 1, k, A, T1, T2, L 都是變數)

7

格式化輸出

假設整數變數 a 及浮點數變數 b, c 裡的資料分別是 504, 302.558, 和 -12.31, 請運用 printf 函數寫一個敘述以下列格式來列印這三個變數:

注意: 一個方格代表一個空格

printf 的格式控制碼:

  1. %d 可以印出十進位整數, %f 可以印出十進位浮點數
  2. %10d 是在 10 個字元的欄位中靠右印出十進位整數, 例如
    %-10d 是在 10 個字元的欄位中靠左印出十進位整數, 例如
    %8.4f 是在 8 個字元的欄位中靠右印出十進位浮點數, 其中小數點後有 4 個字元

8

命令列輸入輸出重新導向 (DOS, UNIX):

/*
 * Determines the value of a collection of coins.
 */
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
     char first, middle, last;  /* input - 3 initials              */
     int pennies, nickels;      /* input - count of each coin type */
     int dimes, quarters;       /* input - count of each coin type */
     int change;                /* output - change amount          */
     int dollars;               /* output - dollar amount          */
     int total_cents;           /* total cents                     */
 
     /* Get and display the customer's initials. */ 
     printf("Type in 3 initials and press return> "); 
     scanf("%c%c%c", &first, &middle, &last);
     printf("Hello %c%c%c, let's see what your coins worth.\n",
            first, middle, last);
 
     /* Get the count of each kind of coin. */ 
     printf("Number of quarters> "); 
     scanf("%d", &quarters); 
     printf("Number of dimes   > "); 
     scanf("%d", &dimes); 
     printf("Number of nickels > "); 
     scanf("%d", &nickels); 
     printf("Number of pennies > "); 
     scanf("%d", &pennies); 
 
     /* Compute the total value in cents. */
     total_cents = 25 * quarters + 10 * dimes +
                    5 * nickels + pennies;
 
     /* Find the value in dollars and change. */
     dollars = total_cents / 100; 
     change = total_cents % 100; 
 
     /* Display the value in dollars and change. */
     printf("\nYour coins are worth %d dollars and %d cents.\n",
            dollars, change);
 
     system("pause");
     return (0);
}

編輯檔案 coinConv.cpp, 拷貝上述程式進去, 編譯這個程式, 並且執行它手動測試一下

下載資料檔案 coinConv.dat, 這個檔案的內容如下:

---------
pyt
5
8
3
7
---------

現在我們要直接運用 coinConv.dat 檔案裡的資料當作輸入來執行上面的程式:

命令列視窗 (cmd.exe) 中鍵入 coinConv < coinConv.dat (或是 Unix 的命令列)

此時程式原本由鍵盤讀入資料, 改由 coinConv.dat 檔案中讀取資料, 輸出還是在螢幕上

如果希望輸出到 coinConv.log 檔案去, 可以用 coinConv < coinConv.dat > coinConv.log 的命令

9

簡易檔案輸入及輸出:

/* Converts distances from miles to kilometers.  	*/

#include <stdio.h>    /* printf, scanf, fprint, fscanf, fopen, fclose definitions        	*/

#define KMS_PER_MILE 1.609 /* conversion constant 	*/

int main(void)
{
      double miles, /* distance in miles	*/
             kms;   /* equivalent distance in kilometers	*/
      FILE   *inp,  /* pointer to input file	*/
             *outp; /* pointer to output file	*/

      /* Open the input and output files.    */
      inp = fopen("distance.dat", "r");  /* MS Windows */
      outp = fopen("distance.out", "w");

      /* Get and echo the distance in miles. */
      fscanf(inp, "%lf", &miles);
      fprintf(outp, "The distance in miles is %.2f.\n", miles);

      /* Convert the distance to kilometers. */
      kms = KMS_PER_MILE * miles;

      /* Display the distance in kilometers. */
      fprintf(outp, "That equals %.2f kilometers.\n", kms);

      /* Close files. */
      fclose(inp);
      fclose(outp);

      return (0);
}

輸入檔案 distance.dat 的內容如下:
112.0
程式執行完畢以後輸出檔案 distance.out 的內容如下:
The distance in miles is 112.00.
That equals 180.21 kilometers.

這個程式基本上不是一個和操作者互動的程式, 所有的輸出都不在螢幕上而在檔案裡, 所以就不需要寫 system("pause"); 了

請修改上一個實習, 程式開啟資料檔案 input.txt, 由檔案內讀入 a, b 兩個實數, 代表平面上一條直線方程式 a (x-1) - b y = 0, 程式輸出這條直線和橢圓 x2 + 4 y2 = 3 的兩個交點到另外一個資料檔案 output.txt

線上繳交

程式由開啟檔案 input.txt 輸入 a, b 兩個實數, 代表平面上一條直線方程式 a (x-1) - b y = 0
程式輸出這條直線和橢圓 x2 + 4 y2 = 3 的兩個交點

範例執行程式, 輸入資料檔案 input.txt (你需要用滑鼠右鍵下載 input.txt, 還有範例執行程式到桌面上 (或是同一個資料匣裡) 然後執行
完成以後, 請在 e-Tutor 線上繳交, e-Tutor 這種線上平台限制不能夠開啟檔案, 所以沒有辦法線上測試, 但是還是請你把程式提交出去, 助教可以檢查, 繳交截止時間 105/10/04 (二) 21:00

10

再試一個由檔案讀取資料的例子

ASCII graph (bw) (exe1, exe2 data2 資料和程式要下載在同一個資料匣裡才能正確執行)

程式設計課程 首頁

製作日期: 09/06/2012 by 丁培毅 (Pei-yih Ting)
E-mail: pyting@mail.ntou.edu.tw TEL: 02 24622192x6615
海洋大學 電機資訊學院 資訊工程學系 Lagoon