陳維魁 博士 wkchen@pchome.com.tw 儒林圖書公司 陳維魁 博士 wkchen@pchome.com.tw 儒林圖書公司
大綱 程式結構 資料型態 控制字元 運算子 控制結構 函式 參數傳遞法 檔案處理 變數類別 精選習題
簡介 1970年代由貝爾實驗室發展而成 採用區塊結構(block structure) 程式是由一群函式(function)所組成命 令式程式語言 利用C語言製作之程式具有很高的可攜性,即機器獨立(machine independent)性,非常適合發展系統程式
簡介 C語言會將大小寫符號視為不相同 複合敘述以“{ }”區隔 C語言的識別字由大小寫英文字母,數字或底線所構成,但第一個字元不得為數字 main、Main、MAIN在C語言中是被視為不同的符號敘述以分號做為結束,但前置處理指令例外 複合敘述以“{ }”區隔 C語言的識別字由大小寫英文字母,數字或底線所構成,但第一個字元不得為數字
簡介 C語言是不具 I/O 能力的程式語言 因為C語言所提供的輸出入功能(如printf())並非C語言本身的指令,而是定義在程式庫(library)中的函式 C語言的編譯器(compiler)並不會在編譯時處理這些輸出入的動作而是在Linking時交由Linker來處理這些輸出入的動作 當硬體的設備改變時,由於C語言的編譯器不處理I/O動作因此原則上不需要修改
程式結構 C語言的程式結構 前置處理指令(preprocessor directive) 函式
前置處理指令 #include 其功能是告知編譯程式,將"include"後面的檔案含括到程式中。此類檔案通常稱為表頭檔(header file),表頭檔一般是以功能來分類 stdio.h:基本輸出入作業及檔案。 math.h:數學計算。 memory.h:與記憶體相關。
前置處理指令 #define 功能是定義常數。 語法: #define 常數名稱 常數值 如 #define PI 3.14159
前置處理指令 “#include”及“#define”皆非C語言之命令,因此敘述後方不加分號做為結束
函式 函式分為main()函式及其他函式 函式理論上應有傳回值,但若無傳回值則必須以“void”型態來加以宣告,若省略傳回值型態則內定為整數 在函式執行的過程中,當執行到return敘述時會結束函式執行的動作,並以return後之值做為函式的傳回值 C程式的開始執行點為main()敘述,但main()敘述並未規定必須擺放在程式的第一條敘述的位置 有一點要特別注意 函式之中不得再定義函式
資料型態 C語言中資料型態的宣告敘述屬於不可執行敘述,語言允許在宣告變數時設定變數之初值 語法 型態 變數名稱=初值;如,int a=1; 型態 變數名稱(初值);如,int b(2);
純量資料型態 最常見的純量資料型態有以下四種 整數 實數 字元 指標 不帶小數點之數值,可為正、負、零值。其格式又可分為int (2 bytes),short (2 bytes)與long (4 bytes)三種。宣告方式為:int整數變數名稱; 實數 帶小數點之數值,可分為float (4 bytes)及double (8 bytes)二種。宣告方式為:float實數變數名稱; 字元 字元(char)佔1 byte的空間。宣告方式為:char字元變數名稱; 指標
For types with n bits in their memory allocation, the signed encoding can represent any of the 2n integers in the range [-2n-1, 2n-1 - 1], and the unsigned encoding can represent any of the 2n integers in the range [0, 2n - 1].
指標 指標用來存放變數的位址(address) 語法 型態 *符號; 範例 型態 *符號; 範例 int *i; // i代表一個指向整數值之指標 char *j; // j代表一個指向字元值之指標
Pointer examples int * xp; int i=2; *xp = i; printf(“%d\n”, *xp); printf(“%d\n”, i);
Pointer examples int a[]={1,2,3,4}; int *p=a; Printf(“%d\n”, a[0]); Printf(“%d\n”, p); Printf(“%d\n”, p[2]); Printf(“%d\n”, *(p+1));
陣列 語法格式 其中,“型態”代表陣列元素的型態,“名稱”代表陣列的名稱,而“[size i]”則代表陣列第i個維度的大小,1≦i≦n 範例 型態 陣列名稱 [size 1][size 2][size 3]....[size n]; 其中,“型態”代表陣列元素的型態,“名稱”代表陣列的名稱,而“[size i]”則代表陣列第i個維度的大小,1≦i≦n 範例 int arr1[10]; 陣列之註標由0開始計算,範例中arr1中包含了10個元素,分別是arr1[0],arr1[1],...,arr1[9]且元素之型態為整數
陣列 C語言允許在宣告陣列時順便設定初值,如 int arr2[5]={0,1,2,3,4}; 幾個限制必須被遵守 初值之數目不得較陣列元素個數多 若初值之元素個數小於陣列元素個數則未分配到初值的陣列元素其初值自動被設定為0 允許不設定元素個數,只指定初值,編譯器會自動計算求出元素之個數,如 int arr3[]={0,1,2,3,4} 代表arr3之元素個數為5
陣列 C語言並不會對陣列做範圍之檢查工作 範例 int arr4[]={0,1,2,3,4} //5個元素 a=arr4[5]; //語法正確,邏輯錯誤 宣告一個名稱為arr4之陣列,元素的個數為5個,合法註標值為0~4 企圖存取註標為10及5之陣列元素 由於C語言並不會對陣列元素做範圍之檢查工作,因此以上敘述並沒有語法錯誤且通常可執行,但結果可能有誤
結構 語法格式 struct 結構名稱 { 型態 1 元件名稱 1; 型態 2 元件名稱 2; .... 型態 n 元件名稱 n; } “結構名稱”代表此結構之名稱 “型態i”代表結構中元件的型態類別 ”名稱i”則代表結構中元件的名稱,1≦i≦n
結構 範例 struct StudentData { char name〔20〕; int score; } student; C語言的結構資料型態與Pascal語言的記錄(record)資料型態相同均屬於「限定名稱格式」 資料欄位的存取採用如下之方法 student.name, student.score;
控制字元 %d:十進位整數 %o:八進位整數 %x:十六進位整數 %c:字元 %s:字串 %f:浮點數
運算子 常用的運算子有三類 算術運算子 關係運算子 邏輯運算子 運算優先順序 算術運算子>關係運算子>邏輯運算子
算術運算子 +:加法 -:減法 *:乘法 /:除法 (5/2=?) %:求餘數 ++: x++ or ++x 表 x=x+1
範例 執行下列運算式,並計算其執行之結果值。 a=b=c=d=e=50; (1)a+=10; (2)b-=20; (3)c*=3;
範例 執行下列片段C語言後,輸出結果為何? int i=0 printf("%d",i++); printf("%d",++i); printf("%d\n",++i);
範例 有一C程式段如下:請問printf(…)敘述之輸出為何? main() { int a,b,c; a=1; b=2; c=a++- - - b; printf("c=%d\n",c); }
關係運算子 常見的關係運算子有 等於: = = 不等於: != 小於: < 大於: > 小於或等於: <= 大於或等於 : >=
邏輯運算子 常見的邏輯運算子 ! && ||
範例 底下的C程式會讓變數X的值為何? if (((3>2) && (2<2) || (5==6) || ((5>4) && 3)) X=3; else X=4;
範例 如下圖所示之 C 語言程式,二個 printf 輸出的結果為何? #include <stdio.h> main<> { int i,j; i= 2 && (j=2); printf("%d %d\n",i,j); (i=3)||(j=3); printf("%d %d\n",i,j); }
精選習題