Class 2 流程控制-選擇敘述與迴圈
復習1 資料形態 printf(“%d %f %c”,int_num,float_num,char_num); scanf(“%d”,&int_num); 2
復習2 強制轉換 其他例子 int a=5,b=11; float c=a/b; printf(“%f”,c); //結果印出0.000000??? 改成 float c=(float)a/(float)b; 其他例子 float c=11.0011; printf(“%d”,(int)c);
何謂流程控制? 程式設計師自由控制程式的流向 某段程式碼在某些情況下跳過 選擇敘述 某段程式碼需要重複執行好幾次 迴圈
選擇敘述 單向選擇 if… 雙向選擇 if…else… 逐一過濾選擇 if…else if…else… 多重選擇 switch…case…
單向選擇 if… 語法 流程圖
條件式中的邏輯判斷式 邏輯判斷式可以使用的運算符號 運算符號 意義 > 大於 < 小於 >= 大於等於 <= 小於等於 = = 等於 != 不等於
範例練習 使用者輸入一個分數 如果該分數為60分以上 顯示”及格”
課堂練習 練習1 練習2 試寫一個程式,讓使用者由鍵盤輸入一個數字,如果大於1000,電腦會印出"大於1000" 偶數(奇數)確認 由使用者由鍵盤輸入數字,如果是偶數,電腦會印出"偶數" 利用%運算
條件式 條件式可以同時利用多個判斷式 連結邏輯判斷的符號 && 而且 || 或 if((score1>=60 )&& (score2>=60)) printf(“兩科都及格”); || 或 if((score1>=60 )|| (score2>=60)) printf(“至少一科及格”);
雙向選擇 if…else… 語法 流程圖
範例練習 使用者輸入一個分數 如果該分數為60分以上 顯示”及格” 否則 顯示”不及格”
課堂練習 練習1 試寫一個程式,讓使用者由鍵盤輸入一個數字,如果大於1000,電腦會印出“大於1000” ,否則印出”小於等於1000” 練習2 偶數(奇數)確認 由使用者由鍵盤輸入數字,如果是偶數,電腦會印出“偶數” ,否則印出”奇數”
課堂練習3 判斷閏年 提示並接受使用者輸入一個西元的年份,處理過後輸出該年是否為閏年 判斷規則 假如該年份可被4整除,又不可被100整除,則為閏年 假如該年份可被400整除則為閏年 否則皆不為閏年
判斷閏年 if (x%4==0) { if ((x%100!=0)||(x%400==0)) { printf(“是閏年\n”); } else { printf(“不是閏年\n”);
判斷閏年 if ((x%400==0) || (x%4==0 && x%100 !=0)) { printf(“是閏年\n”); } else { printf(“不是閏年\n”);
逐一過濾選擇 if…else if…else… 語法 流程圖
課堂練習 請設計一個可以讓使用者輸入分數,並依照分數輸出等級A(90~100)、B(80~89)、C(70~79)、D(60~69)、E(0~59)的程式。 小提示:可以在if的條件式中,利用&&連結兩個邏輯判斷式
多重選擇 switch…case… 資料或運算式用來比對下面每一個case的常數值 跳至第一個比對成功(數值相等)的地方繼續執行 遇見 break; 敘述,結束整個switch敘述 若沒有比對成功,則會執行 default: 後的敘述區塊 語法
範例練習 利用switch改寫剛才課堂練習程式 讓使用者輸入分數,依照分數輸出等級 A(90~100)、 B(80~89)、 D(60~69)、 E(0~59)的程式。
課堂練習 修改上面的範例,以防止使用者輸入不合理的分數(大於100、小於0) if ((points>100)||(points<0)) { printf(“請輸入一個正確的分數:0~100”); return 0; }
補充 (判斷式 ? x : y); 判斷式成立,則執行x,反之執行y 以下兩種寫法是相同結果 (score>=60 ? printf("及格!\n") : printf("不及格!\n"));
作業二 請利用課堂學到的if…else if…else…敘述和switch分別撰寫計算機程式 使用者可以選擇一種運算(+、-、×、/),並輸入兩個數字,程式將計算並輸出結果。(HW2_1_if.cpp、HW2_1_switch.cpp )
過重:24≦BMI<27 輕度肥胖:27≦BMI<30 中度肥胖:30≦BMI<35 重度肥胖:BMI≧35 作業二-2 身體質量指數(BMI) (kg/m2) 體重過輕 BMI < 18.5 正常範圍 18.5≦BMI<24 異常範圍 過重:24≦BMI<27 輕度肥胖:27≦BMI<30 中度肥胖:30≦BMI<35 重度肥胖:BMI≧35 請利用所附左表,修改上一個作業,使之成為附有評語的BMI計算器 (HW2_2.cpp)
複習 If(條件判斷1){ //滿足條件判斷1 } else if(條件判斷2){ //不滿足條件判斷1, 滿足條件判斷2 //不滿足條件判斷1, 不滿足條件判斷2 ,滿足條件判斷3 else{ //不滿足條件判斷1, 不滿足條件判斷2 ,不滿足條件判斷3
複習 switch(要判斷的變數){ case 變數值1: //變數==變數值1 時要做什麼 break; case 變數值2: //變數==變數值2 時要做什麼 default: //變數== 其他數值 時要做什麼 }
複習 If(條件判斷1){ if(條件判斷2){ //滿足條件判斷1和條件判斷2會執行 } else{ //滿足條件判斷1但不滿足條件判斷2會執行 //滿足條件判斷1就會執行 //不滿足條件判斷1 會執行
補充 什麼時候要用fflush(stdin);//清除輸入緩衝區 讀取字元 or 字串之前 Why??? scanf(“%d”,&int_num); fflush(stdin); scanf(“%c”,&char_num); 讀取字元 or 字串之前 Why??? 輸入數字時,除了數字外還輸入了一個enter enter=‘\n’ (可視為一個char)
迴圈 當程式需要來回重複執行某一段程式碼時, 就可以使用迴圈 迴圈又可以分為以下三種: while迴圈 do…while迴圈 for迴圈
while迴圈 語法 流程圖 while(條件判斷) while之後的敘述 敘述 成立 不成立
範例練習 利用while敘述 計算1+2+3+…+100的數值 進階題 計算2+4+6+…+100的數值
增減變數值 運算子 運算 x=val 將值val指定到變數x(基本指定) x += val 等同於x=x+val x -= val
課堂練習 練習1 讓使用者輸入數字,若輸入-1則結束輸入,否則一直輸入直到-1為止 當使用者輸入-1後,將使用者輸入的錯誤數字加總並計算平均輸出 Int input=0,sum=0,num=0; While(input!=-1){ //目前為止的加總+使用者輸入的值 //讓使用者輸入數字到input //輸入的次數+1 } //算平均時,要避免除以0的情況
課堂練習 練習2 有一個聚寶盆,一開始裡面只有一塊錢,但每隔一天會多一倍(總錢數=2天數) 請讓使用者選擇1或2 1 使用者輸入放置天數,系統輸出聚寶盆最後的錢數 2 使用者輸入想賺到的錢數,系統輸出需要多少天 Int day=0,money=1; While(day<day_input){ //錢 * 2 //天數加一 } 34
do…while迴圈 和while的作用相同,只是判斷的先後不同 至少執行一次 語法 流程圖 do{ 進入do迴圈 敘述區塊 成立 } 不成立 離開迴圈
課堂練習 請改寫剛剛的程式,利用do…while敘述計算1+2+3+…+100的數值 進階題
for迴圈 確定想要重複執行的次數 語法 初始運算式 條件式 運算式 設定計次變數的初始值,只在進入迴圈時會執行 計次變數的限制條件式,每次進入迴圈前檢查 運算式 執行完敘述區塊後,利用運算式更新計次變數
流程圖 範例練習 1+2+3+…+100 敘述區塊 條件式 for迴圈 初始運算式 for迴圈之後的敘述區塊 不成立 成立 計次運算式 更新 計次變數
課堂練習 練習1 練習2 請設計可以由使用者輸入 n, 然後計算出由 1+3+5+……+ n = ? for(i=1;i<=n;i+=3){ // 計算加總 } 練習2 請印出 10、8、6、 …、0、-2、-4 (每行一個數字)
巢狀迴圈(雙重迴圈) for(a=1;a<10;a=a+1) { 程式碼; ... for(b=1;b<8;b=b+1) { { 程式碼; ... for(b=1;b<8;b=b+1) { 程式碼; ... } } /*這種觀念叫雙重迴圈*/
範例練習 請印出下面的形狀 * ** *** ****
課堂練習 練習1 :請印出下面的形狀 **** *** ** * 練習2 : 請印出下面的形狀
作業三 請利用for迴圈輸出九九乘法表。 1*1=1 1*2=2 … 9*8=72 9*9=81 提示:可以利用雙層迴圈來計次兩個變數。 (HW3_1.cpp)
作業三-2 (HW3_tree.cpp) (回家自己練習,寫出來有加分) ** **** ****** ******** bonus 使用者輸入欲建樹的字元 使用者決定幾層 提示: 空白的數目=總層數-目前的層數 星星的數目=目前的層數*2
改變迴圈結構流程 要讓迴圈結束有規則的和不規則的方式 規則的方式 不規則的迴圈結束方法 讓反覆執行的迴圈藉由適當的條件測試而自然結束 條件變成false 不規則的迴圈結束方法 在不可預期的執行狀況下,強制迴圈中斷,以避免可能發生的程式錯誤 一旦在迴圈自然結束前,已經得到想要的運算結果,同樣可以運用強制中斷的方式結束迴圈 可以提高程式執行的效率
break敘述 提供從 for、while、do – while 間提早離開的方法 break 只離開最內層迴圈 回想一下剛教過的switch,break用來做什麼事情?
範例練習 占卜系統設計 用到哪些教過的語法? 利用while迴圈讓使用者可以抽籤直到按0離開系統 if…else, switch, while, break
課堂練習 撰寫一個程式,使用者輸入一數,程式會找出大於此數的數字中,最小的17的倍數 //輸入數字 While(1){ //數字+1 //判斷數字可不可以被17整除,可以則跳出 }
continue敘述 不離開迴圈 立即停止這一次的迴圈 跳到測試迴圈的地方決定是否進行下一次迴圈 在 for 迴圈中是跳到運算式 只能用在迴圈,不適用 switch 寫在 switch 中,效果是對包著 switch 的迴圈,即包著 switch 的迴圈進入下一次迴圈
範例練習 有棟公寓沒有四樓這個樓層 請寫程式模擬坐電梯從一樓到十樓,電梯顯示樓層的情形
作業三 請撰寫一個程式,使用者輸入兩個數字範圍 在這範圍中的數字,除了3的倍數之外都印出 HW3_2.cpp) //要注意輸入的兩個數字誰比較大 If(input1>input2){ } else{