2. C/C++程式設計
2.1 編寫 C/C++的程式
(1). 主要程式架構
範例程式
#include<stdio.h>
main( ) {
int i;
i = 12;
printf(“It is %d \n”,i);
}
¾ main( )為主程式的進入點 (程式最先會先進入本 Function)
¾ 每一行的最後皆要加“;"
¾ printf(..)以指定的格式印出文字
標頭檔
c:\Progra~1\Visua~1\vc98\include\stdio.h ...
_CRTIMP int __cdecl printf(const char *, ...);
...
¾ 在 C 的主程式中並沒有函數的定義,所有的函數皆須經過定義,為了便於維護,
故將其寫於 .h 的檔案中。
¾ 宣告的部分,最後要加“;"。
註解
¾ // : 單行的註解
¾ /* … */ : 整個區塊的註解
(2). 產生執行檔
程式編譯的流程
*.h
*.cpp
*.obj
compilier *.lib
其他程式的
*.obj
Linker *.exe
¾ 程式編譯的相關檔案 Preprocessor 處理 *.h
Compiler 處理 *.cpp 並產生 *.obj
Link 連結相關的 *.Lib , *.obj 產生 *.exe
變數的宣告 int i,j,k;
...
i = 4;
j = 12;
int ind;
...
¾ 前面為所要宣告的變數型態,可能為 int, float, char,...。
¾ 接著才是變數名稱。
¾ 同一個區域(block)內的變數名稱不可重複。
(3). 範例練習
範例 2.1-1:
C++的程式進入點為
(1) Main() (2) main (3) class (4) start Ans: (2)
範例 2.1-2:
在 C/C++的程式中,下列何者用來作為輸出?
(1) printf() (2) scanf() (3) int (4) #include Ans: (1)
範例 2.1-3:
在 C/C++中,每一行的最後皆要加上何種符號作為行與行的區隔?
(1) : (2) , (3) {} (4) ; Ans: (4)
範例 2.1-4: 下面的程式中,程式的註解放在第 _4_ 行 1 main( )
2 {
3 int i;
4 i = 12; // Initialize the i 5 printf(“It is %d \n”,i);
6 }
範例 2.1-4:
如果要印出 Hello World!,則用 C 的程式要如何寫?
Ans: printf(“Hollo World!”);
2.2 變數的基本觀念
(1). 變數型態
Integer
可分成下面不同長度的資料型態(與範圍)
¾ int --- 2 bytes (16bit) -32768 ~ 32767
¾ short int --- 2 bytes
¾ long int --- 4 bytes
¾ unsigned int --- 2 bytes 0 ~ 65535
float (4 bytes, Single-Precision Floating point)
double (8 bytes, Double-Precision Floating point)
char (1 bytes)
¾ 表示 0 ~ 255 的符號
¾ 特殊字元
\n – new line \b – back space
\t – Tab \f – feed (page)
\” – 雙引號 \\ – 倒斜線
\xdd – 16h \ddd – decimal
\r – return \’ – 單引號
\0 – 空格
const (常數)
¾ 可用來宣告常數的變數,如:
const int myvar = 15;
¾ 在程式編譯中會將其轉為數字,如:
10 進位: 13 16 進位: ox13 8 進位: o13 long : 13L float: 13.4 char : `A', `1', `a',…
char[?]: (字串)“ABC", “A123", … (?表示所要儲存的字元數)
(2). 運算元
遞增:
¾ i++ (i--) 執行該行敘述後,再加上 1
¾ ++i (--i) 先加上 1,再執行該行敘述
¾ 下面的程式會印出 3 int i = 3;
printf(“%d”, i++);
¾ 下面的程式會印出 4 int i = 3;
printf(“%d”, ++i);
比較: >, <, >=, <=, ==, !=
¾ 下面的程式會印出 1 (true) int a = 3, b = 4;
printf(“%d”, (a<b));
¾ 下面的程式會印出 0 (false) int a = 3, b = 4;
printf(“%d”, (a==b));
邏輯: && (and), || (or), ! (not)
¾ 下面的程式會印出 1 (true)
int a = 3, b = 4, c = 5;
printf(“%d”, ((a<b) && (a<c)));
¾ 下面的程式會印出 0 (false) int a = 3, b = 4, c = 5;
printf(“%d”, ((a>b) && (a>c)));
算數: * (mul), / (div), % (mod)
¾ 下面的程式會印出 0 (false) int a = 3, b = 4;
printf(“%d”, (!(a<b));
¾ 下面的程式會印出 1 (true) int a = 3, b = 4;
printf(“%d”, ((a*3)>(b+3)));
(3). 型別轉換
自動轉換
¾ 依照運算結果來轉型:
int a = 1;
float b =1.2;
float c = a+b; // c=2.200000
強制轉換
¾ 指定所要轉換的型別 c = (int)a + (int)b; // c = 2 (4). 範例練習
範例: (變數宣告)
要宣告一個整數的變數 myvar,則要用下面哪一個敘述?
(1) float myvar; (2) char myvar; (3) int myvar; (4) double myvar;
Ans: (3)
範例: (變數宣告)
要宣告一個小數的變數 myvar,則要用下面哪一個敘述?
(1) float var; (2) char myvar; (3) int myvar; (4) long myvar;
Ans: (1)
範例: (變數宣告)
要宣告一個字元的變數 myvar,則要用下面哪一個敘述?
(1) float var; (2) char myvar; (3) int myvar; (4) double myvar;
Ans: (2)
範例: (變數宣告)
請指出下面程式的錯誤(寫出行數與正確寫法) 1 int myvar = 12;
2 int y2b = 13;
3 myvar = y2b+5;
4 int myvar = 10;
5 printf(“%d %f”, y2b, myvar);
Ans: 第 4 行錯誤(重複宣告),正確寫法分別為為 myvar = 10;
範例: (運算元)
請寫一個程式印出兩個 int 相加 Ans: int i = 3;
int j = 5;
printf(“%d + %d = %d ”,i , j, i+j)
範例: (運算元)
請指出下面程式的錯誤(寫出行數與正確寫法) 1 int a;
2 int b;
3 int a = 63;
4 int b = 72.5;
5 printf(“%f”, a+b);
Ans: 第 3, 4 行錯誤(重複宣告),正確寫法分別為為 a = 63;與 b = 72.5;
範例: (運算元)
要寫一個程式來計算兩人體重的和,請指出下面程式的錯誤(寫出行數與正確寫法) 1 int a;
2 int b;
3 a = 63;
4 b = 72.5;
5 printf(“%f”, a+b);
Ans: 第 1, 2 行錯誤,正確寫法分別為為 float a;與 float b;
範例: (運算元)
要寫個程式計算兩間教室的人數和,請指出下面程式的錯誤(寫出行數與正確寫法) 1 int a;
2 float b;
3 a = 23;
4 b = 42;
5 printf(“%d”, a+b);
Ans: 第 2 行錯誤,正確寫法分別為為 int b;
範例: (運算元)
下面程式執行後的結果為何?
1 int a = 2;
2 int b = 4;
3 a++;
4 b--;
5 a = a + b;
5 printf(“%d - %d”, a, b);
Ans: 6 - 3
範例: (運算元 & 註解) 下面程式執行後的結果為何?
1 int a = 2;
2 int b = 4;
3 // a++;
4 b = b + a;
5 /*
6 b++;
7 */
8 printf(“%d - %d”, a, b);
Ans: 2 - 6
範例: (運算元)
下面程式執行後的結果為何?
1 int a = 2, b = 4;
2 printf(“%d - %d”, a++, ++b);
Ans: 2 - 5
範例: (邏輯比較)
下面程式執行後的結果為何?
1 int a = 2, b = 4;
2 printf(“%d”, (a>b));
Ans: 0
範例: (邏輯比較)
下面程式執行後的結果為何?
1 int a = 2, b = 4;
2 printf(“%d”, (!(a>b)));
Ans: 1
範例: (邏輯比較)
下面程式執行後的結果為何?
1 int a = 2, b = 4, c = 6;
2 printf(“%d”, ((a*3)>=(b*2)));
Ans: 0
範例: (邏輯比較)
下面程式執行後的結果為何?
1 int a = 2, b = 4, c = 6;
2 printf(“%d”, ((a<3) && (c>4)));
Ans: 1
範例: (邏輯比較)
下面程式執行後的結果為何?
1 int a = 2, b = 4, c = 6;
2 printf(“%d”, ((a<2) || (b>4)));
Ans: 0
範例: (邏輯比較)
下面程式執行後的結果為何?
1 int a = 2, b = 4, c = 6;
2 printf(“%d”, ((a+b)<3 || (b+c)>10));
Ans: 0
範例:
下面程式執行後的結果為何?
1 int i = 2,j = 3, k = 4;
2 k++;
3 i++;
4 j--;
5 k = i+j;
6 printf(“%d - %d - %d”, i, j, k);
Ans: 3 – 2 - 5
範例: (型別轉換)
下面程式執行後的結果為何?
int a = 1;
float b =1.2;
float c = a+b;
printf(“%3.2f”, c);
Ans: 2.20
範例: (型別轉換)
下面程式執行後的結果為何?
int a = 1;
float b =1.2;
float c = (int)a+(int)b;
2 printf(“%3.2f”, c);
Ans: 2.00
範例: (常數)
下面為計算圓面積的程式,請指出下面程式的錯誤與正確寫法 1 const float pi; // 元周率
2 int j; // 半徑 3 pi = 3.14;
4 j = 2;
5 printf(“面積為: %3.2f” , j*j*pi);
Ans: 第 1, 3 行錯誤,正確寫法為去掉第 3 行,第 1 行改為 const float pi = 3.14;
2.3 基本輸入輸出
(1). printf( formatting string, var1, var2, ..);
格式化字串: formatting string
¾ 為所要格式化的 string 型式。
¾ 該型式依不同的變數型態而有不同的表示,如:
% [-][+][long][.fixed][f/e]
- : 向左靠齊 +: 正數印出正號
%d – Decimal
%u – Unsign Integer
%f – Float (fixed) i.e. %-12.2f
%e – Float (Exp)
%c – Char
所要印出的變數: var1 .. varn
¾ 所要印出的變數。
¾ 也可以為常數。
¾ 變數不數目需要和格式數目相同 (如%d 的個數)
(2). scanf(formatting string, &var1, &var2, …);
作為輸入資料之用
formatting string 的設定方式和 printf 相同,只是資料的傳輸方向不同。
int, float 的輸入
int a,b;
scanf("%d %d",&a,&b);
printf("%s %d \n","a+b",a+b);
¾ 由於資料輸入需要對應到 Memory Address,故需加上”&”的符號。
¾ 使用者在輸入多個資料時,以’空白’隔開不同的資料,並在資料輸入完成後按 下[Enter]鍵。
¾ 12 13 [Enter]
¾ 接下來在程式取用該變數時,只需要直接使用變數名即可,不需加”&”的符號。
¾ float 的輸入方式相同,只是使用%f 而已。"
char 的輸入 char a,b;
scanf("%c %c",&a,&b);
printf("%s %c %c \n","Result=",a,b);
¾ 字元的輸入方式相同。
¾ 若在“%"的後面加上“*"則表示要略過該資料項。
¾ scanf("%c %*c %c",&a,&b);
¾ 只會讀取第一個及第三個。
string 的輸入
char a[20],b[20];
scanf("%c %c",&a,&b);
printf("%s \n",a);
printf("%s \n",b);
¾ 字元的輸入方式相同,仍然以空白作為 string 的分隔。
¾ a[20]代表宣告一個長度為 20 的 String。
(3). getche() & getchar()
主要功能
¾ 兩者皆是用來讀取使用者所按下的 Key。
¾ getwchar()不需按 [Enter] (without echo)
¾ getchar()需要按 [Enter] (with echo)..
使用方式
¾ 如下面的範例 char c1, c2;
c1 = getche(); // No [Enter] needed c2 = getchar(); // Need [Enter]
printf(" %c -- %c \n",c1,c2);
Visual C++
char c1, c2;
c1 = _getch(); // Without Echo c2 = _getche(); // With Echo putchar(c1);
putchar(c2);
¾ 此函數需要 #include <conio.h>
¾ User Input “12"結果為 212
(4). putchar(`a')
輸出一個字元。
使用方式 char c1;
c1 = getche(); // No [Enter] needed putchar(c1);
(5). 範例練習
範例: (printf 格式化)
有兩個變數 int i = 35;與 int j = 123; 要將它們印出如下結果,則程式要如何寫?
***
35 123
***
Ans:
printf("***\n");
printf("%3d\n", i);
printf("%3d\n", j);
printf("***\n");
範例: (scanf)
有變數 int i = 35;要在程式中改為 42,請指出下面程式錯誤處(寫出行數與正確寫法) 1 int i = 35;
2 i++;
3 i = 42;
4 scanf(“%d”, i);
Ans: 第 4 行,正確為 scanf(“%d”, &i);
範例: (char)
要在程式中輸入整數 12 與字元 a,請指出下面程式錯誤處(寫出行數與正確寫法) 1 int a = 45;
2 char b = ‘a’;
3 printf(“a=%d, b=%c\n”, a, b);
4 scanf(“%d %d”, &a, &b);
Ans: 第 4 行,正確為 scanf(“%d %c”, &a, &b);
範例: (char)
要在程式中輸入整數 12 與字串 mary,請指出下面程式錯誤處(寫出行數與正確寫法) 1 int a = 45;
2 char b = “”;
3 printf(“a=%d, b=%s\n”, a, b);
4 scanf(“%d %s”, &a, &b);
Ans: 第 2 行,正確為 char b[5] = “”;
範例: (char[])
請指出下面程式錯誤處(寫出行數與正確寫法) 1 int a = 45, c = 68;
2 char b[4] = “good”;
3 a++;
4 printf(“the number a is %d\n”, a);
5 ++a;
6 printf(“the results b is %s\n”, b);
Ans: 第 2 行,正確為 char b[5] = “good”;
範例: (char[])
請寫出下面程式執行的結果 1 int a = 45, b = 20;
2 char name[10] = “after10”;
3 a = a + b;
4 printf(“%d - %c\n”, a, name[1]);
Ans: 65 - f
範例: (char[])
請寫出下面程式執行的結果 printf("%d", (‘a’>’Z’);
Ans: 1
範例: (char[])
請寫出下面程式執行的結果 printf("%d", (‘z’>’D’);
Ans: 1
範例: (char[])
請寫出下面程式執行的結果 1 char a = 'b';
2 char name[10] = "after10";
3 printf("%d", (a>name[1]));
Ans: 0
範例: (char[])
請寫出下面程式執行的結果 1 char a = 'b';
2 char name[10] = "after10";
3 printf("%d", (a>name[0]));
Ans: 1
範例: (char[])
請寫出下面程式執行的結果 1 char name[20] = "It is my dog";
2 printf("%c%c", name[1], name[3]);
Ans: ti
範例: (char[])
請寫出下面程式執行的結果 1 char name[20] = "abcdef";
2 printf("%c%c", name[3], name[0]);
Ans: da
範例: (char[])
請寫出下面程式執行的結果 1 char name[20] = "boy and mary";
2 printf("%c%c", name[3], name[6]);
Ans: d
範例: (char[])
要在程式中輸入姓名(name)與年齡(age),請指出下面程式錯誤處(行數與正確寫法) 1 int age;
2 char name[10] = “”;
3 printf(“請輸入姓名與年齡:”);
4 scanf(“%c %d”, &name, &age);
Ans: 第 4 行,正確為 scanf(“%s %d”, &name, &age);
範例: (char[])
要在程式中輸入姓名(name)與年齡(age),並將其印出,請完成下面程式 1 int age; // 年齡
2 char name[10] = “”; // 姓名 3 printf(“請輸入姓名與年齡:”);
Ans: scanf(“%s %d”, &name, &age);
printf(“姓名:%s 年齡:%d”, name, age);
範例:
請寫一個程式可輸入學生姓名(name), 數學成績(math), 英文成績(english), 國文成 績(chinese),將上述成績平均,並印出。
Ans:
char name[10];
float math;
float english;
float chinese;
printf(“請輸入姓名, 數學成績, 英文成績, 國文成績:”);
scanf(“%s %f %f %f”, &name, &math, &English, &chinese);
printf(“平均: %f”, (math+english+chinese)/3);
範例:
加強前述程式功能,不允許輸入非數字的分數(輸入的分數需介於 0 ~ 100) Ans: (參考第三章練習-錄影帶出租管理程式)
2.4 程式撰寫規則
(1). 結構化程式撰寫的重要性
提高撰寫程式的效率
提供程式的可讀性
提高程式的可修改性
(2). 結構化程式撰寫的原則
適當的分行 char c1, c2;
c1 = _getch(); // Without Echo c2 = _getche(); // With Echo putchar(c1);
putchar(c2);
¾ 未分行
char c1, c2; c1 = _getch(); // Without Echo
c2 = _getche(); // With Echo putchar(c1); putchar(c2);
適當的合併成一行
char c1, c2; c1 = _getch();
適當縮排 main( ) {
int i;
i = 12;
printf(“It is %d \n”,i);
}
¾ 有些人習慣空 2 或 4 格,也有人是直接用 Tab 鍵來做縮排。
程式碼的註解
¾ 幫助瞭解程式
¾ 盡量使用“//"來標示註解,除非是多行的連續註解,才使用 /* 與 */。
¾ 當註解太長時需要換行時,新的一行也必須在 /* 與 */ 之間。
¾ 註解越詳細越好,但也不要浮濫,程式充斥一堆非程式的文字,反而影響閱讀。
2.5 綜合練習
(1). 簡易成績管理程式 (02-01)
程式需求:
¾ 預先儲存 3 位學生姓名(“mary”, “james”, “jason”)與學號(101, 102, 103)
¾ 每個人分別有程設成績(prog1~3)、計概成績(comp1~3)、英文成績(English1~3)
¾ 功能包含
(1) 輸入通行密碼(*選作) (2) 輸入成績或修改成績 (3) 查詢成績(不可修改) (4) 顯示成績與平均
¾ 輸入成績方式:
(1) 當輸入姓名第一字時,畫面要列出相同開頭的學生姓名 (2) 使用者可以選擇輸入完整姓名或是按數字鍵來選取
(3) 選定姓名後,分別輸入各科成績
¾ 特殊檢查功能
(1) 姓名輸入不允許輸入數字 (2) 成績輸入不允許輸入字元 (3) 成績輸入只允許 0~100 的數字 (4) 輸入錯誤需要顯示錯誤訊息
(2). 公司各部門人員管理程式 (02-02)
練習項目
¾ 變數宣告(int, float, char[])
¾ 變數的運算 (加法、除法、型別轉換)
¾ 輸出函式 – printf(…)
¾ 輸入函式 – scanf(…) (合併成同一行)
¾ 分支(goto)與標籤(label)
¾ 等待鍵盤輸入 – getche()
¾ 條件式敘述 – if (選擇性)
本練習要撰寫一個公司各部門人數的管理程式,程式需求如下:
¾ 共有 3 個部門
¾ 程式需要能提供使用者輸入各部門的人數
¾ 程式需要能自動計算
(1) 每個部門的平均人數(精確到小數以下 2 位) (2) 公司總人數
¾ 本程式需要提供多個公司連續輸入的功能
¾ 參考:
(1) goto 敘述容易破壞程式的結構性, 故應避免使用 …
goto LAB1;
… LAB1:
…