C/C++ 基礎程式設計 流程控制敘述 講師 : 張傑帆 CSIE, NTU 追隨我的好奇與直覺, 大部分我所投入過的事務, 後來都成了無比珍貴的經歷 Much of what I stumbled into by following my curiosity and intuition turned out to be priceless later on. -Steve Jobs
課程大綱 選擇控制 ( 流程控制 ) IF-ELSE SWITCH-CASE 重覆控制 ( 迴圈 ) FOR WHILE 迴圈中的流程控制 : break, continue 巢狀迴圈 作業
選擇結構簡介
人會做判斷
選擇敘述 if-else 敘述 程式中的選擇結構有如口語中的 如果.. 就 否則. 在 C 語言中是使用 if-else 敘述來達成 如語法 若條件成立時 則執行接在 if 後面的敘述區段 1 否則 ( 條件不成立 ) 執行接在 else 後面的敘述區段 2
IF-ELSE 用途 : 程式執行時根據條件情況選擇要執行的程式碼 語法 : if( 條件判斷式 ) { 條件成立的話要做的程式碼 ; 縮排 else { 條件不成立的話要做的程式碼 ; 縮排 註 :else 可視情況省略不寫 ; 當 { 中程式只有一行 ( 敘述 ), 可省略 {
想判斷分數是否及格 Start 輸入分數 yes 分數是否 < 60 分 no 不及格 及格 End 7
IF-ELSE 範例 : 寫個程式, 判斷一個人的成績是否及格 ( 及格分數為 60 分 ) Start #include <stdio.h> int main() { int score; printf(" 輸入您的分數 :"); scanf("%d",&score); if ( score < 60 ) { 縮排 printf(" 不及格 \n"); else { 縮排 printf(" 及格 \n"); return 0; 不及格 輸入分數 分數 < 60 yes End 及格 no
IF-ELSE 邏輯判斷可以使用的運算符號如下 運算符號 意義 > 大於 < 小於 >= 大於或等於 <= 小於或等於 == 等於!= 不等於 用來連結邏輯判斷的符號有 符號 && 意義 和 = ( 指定運算子 ) 不同! " 而且 ", 所有的條件都要成立, 整個判斷才會成立 " 或 ", 只要有任何一個條件成立, 整個判斷就會成立! 非, 條件不成立時, 整個判斷就會成立
1 1 1 1 1 1 1 1 1 1 1
邏輯運算子使用範例 5>3 && 3==4 ( 結果為 false) a==6 a>=12 ( 如果變數 a 的值等於 6 或是大於等於 12, 結果就會是 true)! (a==6) ( 當變數 a 等於 6 以外的其他值時, 結果就會是 true)
IF-ELSE IF 若我們要判斷的條件不只是做 對 或 錯 的二分法時, 可以在 if 後增加 else if 來做多重判斷 語法 : if( 條件判斷式 1 ){ 條件 1 成立的話要做的程式碼 ; else if ( 條件判斷式 2 ) { 條件 2 成立的話要做的程式碼 ; else{ 以上條件都不成立的話要做的程式碼 ;
IF-ELSE IF 範例 : 寫個程式, 判斷一個人的成績是否及格 ( 大學部及格分數為 60 分, 研究所為 70 分 ) #include <stdio.h> int main() { int score, n; printf("(1) 大學部 (2) 研究所 :"); scanf("%d",&n); printf(" 輸入您的分數 :"); scanf("%d",&score); if ( score < 60 && n == 1) { printf(" 不及格 \n"); else if ( score < 70 && n == 2) { printf(" 不及格 \n"); else { printf(" 及格 \n"); return 0;
小練習 修改上頁程式, 若使用者輸入值不合下列格式則不做任何輸出, 並提示使用者輸入分數錯誤 只能輸入 1 或 2 代表大學部或研究所 成績只能輸入 0~100 0 100 score < 0 score >=0 && score <= 100 score >100
If else 大刮號 { 的恩怨情仇 if else 用大刮號 { 表示其程式碼範圍 當 { 中程式只有一行 ( 敘述 ), 可省略 { if( 條件判斷式 ) 裡面只可以寫一行 行但請務必記得改成多行時要加上 { 不然. 就會變成爆肝工程師!
課程大綱 選擇控制 ( 流程控制 ) IF-ELSE SWITCH-CASE 重覆控制 ( 迴圈 ) FOR WHILE 迴圈中的流程控制 : break, continue 巢狀迴圈 作業
SWITCH-CASE 用途 : 程式執行時根據資料數值選擇要執行的程式 語法 : ( 註 :default: 可有可無 ) switch( 變數或運算式 ) { case 值 1: 程式碼 ; break; // 可不加, 結果不同! case 值 2: 程式碼 ; break; default: 程式碼 ; break;
SWITCH-CASE 範例, 輸入兩個數字, 再輸入 +,-,*,/ 任一鍵, 根據輸入的鍵內容顯示兩數計算結果 #include <stdio.h> //#include <conio.h> int main() { double a, b, ans; char key; printf("input two number:"); scanf("%lf %lf", &a, &b); printf("press +, -, *, / : "); //key = getch(); scanf( %c, &key); switch( key ) { case '+': ans = a + b; break; case '-': ans = a - b; break; case '*': ans = a * b; break; case '/': ans = a / b; break; default: printf("undefined key\n"); return 0; printf( "%lf %c %lf = %lf \n",a,key,b,ans ); return 0;
課程大綱 選擇控制 ( 流程控制 ) IF-ELSE SWITCH-CASE 重覆控制 ( 迴圈 ) FOR WHILE 迴圈中的流程控制 : break, continue 巢狀迴圈 作業
印出 10 行 hello? printf("hello %d\n",i); printf("hello %d\n",i); printf("hello %d\n",i); printf("hello %d\n",i); printf("hello %d\n",i); printf("hello %d\n",i); printf("hello %d\n",i); printf("hello %d\n",i); printf("hello %d\n",i); printf("hello %d\n",i); 那 100 行呢?
重複結構簡介 C 語言允許將需要連續重複執行的敘述區段改用 迴圈敘述, 不但可縮短程式的長度, 而且程式易維護及增加程式可讀性 此種程式架構稱為 重複結構 或 迴圈 (Loop)
下圖是密碼檢查的流程圖, 若密碼正確, 則進入系統繼續往下執行 ; 反之, 密碼輸入錯誤, 重新輸入密碼, 一直詢問到輸入的密碼正確為止
for 迴圈敘述 C 語言提供三種迴圈敘述 :for while do-while 敘述 若迴圈的次數可以預知,for 敘述是最好的選擇 若迴圈次數無法確定, 則可使用 while do-while 敘述來達成
FOR 迴圈 用途 : 當程式需要來回重複執行某一段程式碼時 for 通常用在已知重覆執行次數時 語法 : for ( 進入迴圈前要做的事 ; 繼續執行迴圈的條件 ; 每跑完一次迴圈會做的事 ) { 要被重覆執行的程式碼 ; for 迴圈會重複執行數次 { 中所包含的程式碼, 至於是執行幾次則由 for ( ; ; ) 當中的東西來決定
for 迴圈 for( i=1; i<=3; i++ )
FOR 迴圈 範例 : 印出 10 行 hello 所以在下面的例子中, 進入迴圈前會令 i=0; 當 i 還是 <10 的時候, 迴圈會繼續跑 迴圈每跑完一圈, 就會做 i++ 的動作 執行程式時可以看到 i 由一開始的 0 會每次都累加上 1, 到最後變成 10 之後就結束程式 #include <stdio.h> int main() { int i; for ( i=0; i<10; i++ ) { printf("hello %d\n",i); return 0; printf("hello %d\n",i); printf("hello %d\n",i); printf("hello %d\n",i);?
FOR 迴圈 範例 : 算出 1+2+3+...+9+10 #include <stdio.h> int main() { int i; int sum=0; for ( i=1; i<=10; i++ ) { sum+=i; printf("%d\n",sum); return 0;
練習 一 輸入一個大於 0 的整數 n 印出 1 加到 n 的結果 二 輸入一個大於 0 的整數 n 印出 "1+2+3+ +n = 結果 例如 : 輸入 5, 印出 1+2+3+4+5 = 15 列出加總過程中的數字 ( 控制變數 i ) 想在中間的數字加上 + 號該怎麼做呢?
課程大綱 選擇控制 ( 流程控制 ) IF-ELSE SWITCH-CASE 重覆控制 ( 迴圈 ) FOR WHILE 迴圈中的流程控制 : break, continue 巢狀迴圈 作業
WHILE 迴圈 ( 前測式 ) 用途 : 當程式需要來回重複執行某一段程式碼時 while 通常用在未知重覆執行次數時 語法 : while( 繼續執行迴圈的條件 ) { 條件成立的話要做的程式碼 ; 把 for 中的進入迴圈前要做的事與每跑完一次迴圈會做的事拿掉, 就是 while 迴圈
WHILE 迴圈 ( 前測式 ) 範例 : 輸入鍵盤按鍵, 直到輸入 q 後程式結束 #include <stdio.h> //#include <conio.h> // 只有 windows 能用 int main() { char key=0; while(key!='q') { //key=getche(); // 只有 windows 能用 scanf( %c, &key); printf("\n%c\n", key); return 0;
DO-WHILE 迴圈 ( 後測式 ) 用途 : 當程式需要先做一次某一段程式碼再判斷是否要重複執行該一段程式碼時 語法 : do { 條件成立的話要做的程式碼 ; while( 繼續執行迴圈的條件 ); // 記得加 ; 號 while 迴圈中的判斷式可以放在迴圈的最後端, 形成一個 do-while 迴圈這樣子的迴圈至少會跑一次
DO-WHILE 迴圈 範例 : 輸入鍵盤按鍵, 直到輸入 q 後程式結束 #include <conio.h> int main() { char key; do { key=getche(); printf("\n%c\n", key); while(key!='q'); return 0;
動動腦 while(exp){ 與 do{ while(exp); 兩者在應用上有什麼不同? 剛才的例子是按下 q 離開程式, 但 假如我想要讓使用者按下 y 才重覆執行程式呢? char key; do { key=getche(); printf("\n%c\n", key); while(key== y'); return 0; char key; key=getche(); printf("\n%c\n", key); while(key== y') { key=getche(); printf("\n%c\n", key); return 0;
練習 寫個程式, 判斷一個人的成績是否及格 ( 及格分數為 60 分 ) Start 每次判斷完成績後可輸入 'y': 繼續 其他 : 離開 不及格 輸入分數 分數 < 60 yes 及格 no 輸入字元 yes 是否繼續? End no End
課程大綱 選擇控制 ( 流程控制 ) IF-ELSE SWITCH-CASE 重覆控制 ( 迴圈 ) FOR WHILE 迴圈中的流程控制 : break, continue 巢狀迴圈 作業
迴圈中的流程控制 在迴圈中, 有兩個指令可方便做控制 : break: 直接結束迴圈 continue: 直接跳到迴圈開頭處繼續下一次執行 用途 : 常用來設定在迴圈中某些情形下, 選擇做結束 (break) 或回頭 (continue)
迴圈中的流程控制 : break 範例 : 輸入鍵盤按鍵, 直到輸入 q 後程式結束 #include <conio.h> int main() { char key; while(1) //while 中條件為 1 稱為無窮迴圈 { key=getche(); if ( key=='q' ) break; return 0;
迴圈中的流程控制 : continue 範例 : 假如有一棟大樓沒有 4 樓這個樓層, 寫一個程式顯示從 1 樓坐電梯到 10 樓所經過的樓層 #include <stdio.h> int main() { int i; for ( i=1; i<=10; i++ ){ // 若是 4 樓就跳過, 回到迴圈開頭繼續執行 if ( i==4 ) continue; printf("floor %d\n",i); return 0;
課程大綱 選擇控制 ( 流程控制 ) IF-ELSE SWITCH-CASE 重覆控制 ( 迴圈 ) FOR WHILE 迴圈中的流程控制 : break, continue 巢狀迴圈 作業
巢狀迴圈 迴圈中的迴圈 下面範例中, i 每加三次, j 才加一次, 試著觀察輸出結果 #include <stdio.h> int main() { int i, j; for ( j=0; j<3; j++ ) { for ( i=0; i<3; i++ ) { printf("* "); printf("\n"); return 0;
練習 輸入一個整數, 印出 n 列 * 號, 每列各含 1~n 個 * 例如 : 輸入 5 輸出 :
課程大綱 選擇控制 ( 流程控制 ) IF-ELSE SWITCH-CASE 重覆控制 ( 迴圈 ) FOR WHILE 迴圈中的流程控制 : break, continue 巢狀迴圈 作業
回家作業 : 印出下列九九乘法表 : 提示 : 在印星號的例子中, 將迴圈控制變數 i, j 印出
作業 ( 加分題 ): 中文大寫數字輸出 輸入一個金額 1~99999 整數, 印中文大寫數字金額 中文大寫 1~9: 壹, 貳, 參, 肆, 伍, 陸, 柒, 捌, 玖 需要印出單位 : 萬, 仟, 佰, 拾 不需輸出 " 零 " 最後要印出 " 元整 " 輸入錯誤數值範圍, 顯示錯誤後程式直接結束 輸入輸出格式 ( 格式必須與下面程式結果一致 )