• 沒有找到結果。

2.4 程式撰寫規則

N/A
N/A
Protected

Academic year: 2022

Share "2.4 程式撰寫規則 "

Copied!
13
0
0

加載中.... (立即查看全文)

全文

(1)

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

(2)

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

(3)

¾ 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)

(4)

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;

„ 範例: (運算元)

(5)

請寫一個程式印出兩個 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 */

(6)

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);

(7)

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 的個數)

(8)

(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);

(9)

„ 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;

(10)

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

(11)

„ 範例: (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). 結構化程式撰寫的重要性

„ 提高撰寫程式的效率

„ 提供程式的可讀性

(12)

„ 提高程式的可修改性

(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) 使用者可以選擇輸入完整姓名或是按數字鍵來選取

(13)

(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:

參考文獻

相關文件

(2)選修 C.學習領導模組者,請以「有效學習策略」為主題,規劃 1 份教學 活化與課程創新之教學方案(請以整個單元撰寫為原則)

(2)選修 C.學習領導模組者,請以「有效學習策略」為主題,規劃 1 份教學 活化與課程創新之教學方案(請以整個單元撰寫為原則)

E-C1具備個人生 活道德的知 識與 是非判斷的能 力,理解 並遵守 社會道德規範, 培養 公民意識,

5、「選課系統資料庫」APP 程式撰寫與分析(8 小時) 6、「雲端電子書城」APP 程式撰寫與分析(8 小時) 7、「多益 TOEIC 單字學習系統」APP

2.熟 悉 Microsoft Windows Server 作 業 系 統 、 Microsoft SQL Server 資料庫伺服器及網 頁伺服器等環境。. 3.具撰寫 JAVA

以第一人稱的敘事立場,運用下文對你∕妳有用的提示,詳細地回憶 每段自傲經驗的內容,包括:在什麼樣的時空中發生什麼事、有哪些

[r]

What is the length of the shortest ladder that will reach from the ground over the fence to the wall of the