程序設計入門-C語言基礎知識-翁愷-第二週:簡單的計算程序-詳細筆記(二)

第二週:判斷

2.1 比較

簡單的判斷語句:ide

if(條件成立){
    //執行代碼
}

條件測試

  • 計算兩個值之間的關係,因此叫作關係運算

關係運算的結果ui

  • 當兩個值的關係符合關係運算符的預期時,關係運算的結果爲整數1,不然爲整數0
  • printf("%d\n",5==3); -> 結果爲0
  • printf("%d\n",5>3); -> 結果爲1
  • printf("%d\n",5<=3); -> 結果爲0

優先級code

  • 全部的關係運算符的優先級比算術運算低,可是比賦值運算的高
    • 7 >= 3 + 4; 先計算3 + 4 ,再將結果和7比較,比較的結果爲1
    • int r = a > 0; 先計算 a > 0 , 再將比較的結果賦值給r
  • 判斷是否相等的==!=的優先級比其餘的低,而連續的關係運算是從左到右進行的
    • 5 > 3 == 6 > 4 分別計算 5 > 3和 6 > 4 ,再判斷他們的結果是否相等,也就是 1 == 1,最後的結果爲1
    • 6 > 5 > 4 先計算 6 > 5,再用結果和4進行比較,也就是 1 > 4,最後的結果爲0
    • a == b == 6 先計算 a == b ,再用結果和6進行比較,也就是(a == b)== 6
    • a == b > 0 先計算 b > 0,再用結果和a進行比較,也就是 a == ( b > 0)

2.2 判斷

註釋blog

  • 以兩個斜槓"//"開頭的語句爲註釋,爲程序提供解釋 `
  • 註釋插入在程序代碼中,用來向讀者提供解釋信息。他們對於程序的功能沒有任何影響,可是每每能使得程序更容易被理解。
  • "//" 是C99的註釋,ANSI C不支持
  • 延續數行的註釋,要用多行註釋的格式來寫。多行註釋由一對字符序列「/*」開始,以「*/」結束。
  • 多行註釋也能夠寫在一行內

比較兩個數的大小
用戶輸入兩個數,用比較兩個數的大小,輸出較大的那個數。
程序流程圖:ip

代碼實現:rem

#include <stdio.h>
int main(int argc, char *argv[]) {

 int a = 0;
 int b = 0;
 int max = 0;
  
 printf("請輸入兩個整數:");
 scanf("%d %d", &a, &b);
    
 if(a>b){
  max = a;
 } else {//b>=a
  max = b;
 }

 printf("大的那個是%d\n", max);
}

運行結果:it

請輸入兩個整數:5 10
大的那個是10

if語句的大括號的做用io

  • 當if語句後面跟着大括號時,程序會執行大括號裏面的全部語句。
  • 當if語句後面沒有大括號時,程序只會執行緊跟if後的那條語句。
  • 對於else也一樣適用

嵌套的判斷

  • 當if的條件知足或者不知足的時候要執行的語句也能夠是一條if或if-else語句,這就是嵌套的if語句
  • if-else老是兩個相鄰最近的作匹配
    例如:
if(條件A成立){
    if(條件B成立){
        //執行代碼    
    } else {
        //執行代碼
    }
}

tips

  • 在if或else後面老是用{}
  • 即便只有一條語句的時候
  • 這樣作的好處是代碼清晰容易閱讀
  • 雖然這麼作,咱們寫的代碼會多一個大括號,可是對於程序運行效率來說沒有任何影響。

級聯的if-else if

  • 當咱們要判斷的條件有多個時,咱們可使用一個if,一個或多個else if 對這些條件進行鏈接。
  • 固然在這個級聯的判斷塊的最後咱們能夠跟一個else也能夠用else if結尾,換句話說if、else-if、else的組合是靈活多變的,關鍵看你想怎麼使用它。

示例:

if(條件1){
    //執行塊1
}
else if (條件2){
    //執行塊2
}
else if (條件3){
    //執行塊3
}
...
else { // 這個else能夠省略掉
    //執行塊n
}

switch-case

  • c語言還有一種判斷-分支的語句能夠在特殊的狀況下代替級聯的if-else-if,他就是switch-case
  • 語法
switch (控制表達式){
case 常量:
    語句;
    語句;
    break;

case 常量:
    語句;
    語句;
case 常量:
case 常量:
        語句;
default:
    語句;
    break;
}
  • 控制表達式只能是整數的結果
  • 常量能夠是常數,也能夠是常數計算的表達式
  • 程序會根據表達式的結果選擇對應常量的case執行
  • 程序遇到break;纔會退出swtich-case語句塊,換句話說若是觸發了一個case語句,程序會一直執行到遇到break語句纔會中止,期間可能穿過多個case前提是這些case中都沒有break語句。
  • switch-case相比if-else if的好處是可使咱們的程序更加直觀。

swtich-case 示例-成績轉換
本題要求編寫程序將一個百分制成績轉換爲五分製成績。轉換規則:

  • 大於等於90分爲A
  • 小於90且大於等於80分爲B
  • 小於80且大於等於70爲C
  • 小於70且大於等於60爲D
  • 小於60爲E

輸入格式:
輸入在一行中給出1個整數的百分制成績

輸入出格式:
在一行中輸出對應的五分製成績

輸入樣例:
90

輸出樣例:
A

程序實現:

#include <stdio.h>

int main(int argc, char *argv[]) {      
 int score = 0;
 printf("請輸入你的分數(0-100):");
 scanf("%d", &score);
    
 if(score < 0 || score > 100) {
  printf("輸入的分數有誤,請輸入0至100之內的分數");
 } else { 
  score = score / 10;  
  switch(score){
   case 10:
   case 9:
    printf("A");
    break;
   case 8:
    printf("B");
    break;
   case 7:
    printf("C");
    break;
   case 6:
    printf("D");
    break;
   default:
    printf("E");
    break;
  }   
 } 
  
 return 0;
}

執行結果:

請輸入你的分數(0-100):80
B

錯題解析
如下語句是否能夠經過編譯:
int n = 0;
if ( 1<=n<=10 );

題目分析:

  • 首先語句是能夠經過編譯的,1<=n<=10是一個正確的關係表達式,雖然它表示的並非n在0到10([0,10])這個範圍中。
  • if語句後面沒有若是沒有執行語句,能夠寫一個分號結束,固然沒有執行語句的if語句自己沒有任何意義。
  • 再來看1 <= n <= 10 這個關係表達式的結果,關係表達式按優先級從左到右結合,1<=0的結果爲0, 0<=10的結果爲1,進一步分析,關係表達式的值只能爲0或1,0小於1小於10,所以整個表達式的值老是爲1.

2.3 課後習題

一、題目內容:
UTC 是世界協調時,BJT 是北京時間,UTC 時間至關於 BJT 減去 8。如今,你的程序要
讀入一個整數,表示 BJT 的時和分。整數的個位和十位表示分,百位和千位表示小時。如
果小時小於 10,則沒有千位部分;若是小時是 0,則沒有百位部分;若是分小於 10 分,
須要保留十位上的 0。如 1124 表示 11 點 24 分,而 905 表示 9 點 5 分,36 表示 0
點 36 分,7 表示 0 點 7 分。
有效的輸入範圍是 0 到 2359,即你的程序不可能從測試服務器讀到 0 到 2359 之外的輸
入數據。
你的程序要輸出這個時間對應的 UTC 時間,輸出的格式和輸入的相同,即輸出一個整數,
表示 UTC 的時和分。整數的個位和十位表示分,百位和千位表示小時。若是小時小於 10,
則沒有千位部分;若是小時是 0,則沒有百位部分;若是分小於 10 分,須要保留十位上的
0。

提醒:要當心跨日的換算。

輸入格式:
一個整數,表示 BJT 的時和分。整數的個位和十位表示分,百位和千位表示小時。若是小
時小於 10,則沒有千位部分;若是小時是 0,則沒有百位部分;若是分小於 10 分,須要
保留十位上的 0。

輸出格式:
一個整數,表示 UTC 的時和分。整數的個位和十位表示分,百位和千位表示小時。若是小
時小於 10,則沒有千位部分;若是小時是 0,則沒有百位部分;若是分小於 10 分,須要
保留十位上的 0。
輸入樣例:
903

輸出樣例:
103

題目分析

  • 用戶輸入一個四位數來表示小時和分鐘,前兩位表示小時,然後兩位表示分鐘。
  • 咱們使用24小時制來表示UTC和BJT實際所以小時的範圍爲0到23,而分鐘的範圍爲0到59,所以咱們須要分別校驗用戶輸入的小時和分鐘是否合法。
  • 若是小時小於10千位爲0,小時等於0百位也爲0,若是分鐘爲零小時不爲零則須要保留十位的零,若是小時爲零,分鐘的十位小於零,則無需保留前面的0,例如 7 表示 0點7分,換句話說除了個位數,若是高位以及高位以上的數若是爲零則均可以省略掉
  • 須要把用戶輸入的北京時間轉換爲世界協調時,咱們知道UTC時間 = BJT時間 - 8 小時 ,而8小時在咱們的程序中的表示爲 800 ,所以轉換的公式爲:UTC時間 = 用戶輸入的BJT時間 - 800
  • 因爲BJT時間小於8小時的狀況下就會有跨天的狀況,所以方便考慮咱們使用負數來表示,好比說-1600就表明UTC時間的前一天的16點也就是BJT時間的0點,咱們知道當用戶輸入0點時依據咱們上一條的公式計算的結果爲-800,所以咱們還須要作一個轉換。 -(-800+2400) = -1600,也就是說當UTC時間計算結果爲負數時咱們還須要用公式 UTC時間 = - ( UTC時間 + 2400 ) 來轉換爲用戶查看的時間。
  • 確認讀懂需求而且對需求的實現有一個細緻的分析後咱們就能夠開始用程序實現了
#include <stdio.h>

int main(int argc, char *argv[]) { 
    
 const int TIMELAG = 800; //北京時間和世界協調時間的時差
 const int TIMEOFDAY = 2400; //一天的時間24制在程序中的表示 
 int bjtTime = 0;
 int utcTime = 0;
 /*時間有效性狀態碼,
 0:有效  
 1:無效,小時超出0~23範圍 ,
 2:無效,分鐘超出0~59範圍  
 */
 int validCode = 0; 
 int hours = 0;
 int minutes = 0;
    
 printf("請輸入北京時間,用一個四位正整數表示,"
   "如1124表示11點24分,7表示0點7分:");

 scanf("%d", &bjtTime);
    
 //校驗用戶輸入時間的正確性 Begin 
  
 if(validCode == 0) {
  hours = bjtTime / 100;
  if(hours < 0){
   validCode = 1;
  } else if(hours > 23){
   validCode = 1;
  }
 }
    
 if(validCode == 0) {
  minutes = bjtTime % 100;
  if(minutes < 0){
   validCode = 2;
  } else if(minutes > 59){
   validCode = 2;
  }
 }
 //校驗用戶輸入時間的正確性 End
    
 if(validCode == 0) {//有效則進行時間轉換處理
  utcTime = bjtTime - TIMELAG;
  if(utcTime < 0) {
   utcTime = -(utcTime + TIMEOFDAY);
   printf("%d(負數表明UTC前一天的時間,好比-2300表示UTC時間前一天23點整)\n", utcTime);
  } else {
   printf("%d\n", utcTime);
  }  
 } else if(validCode == 1) { 
  printf("輸入的時間無效:小時超出範圍,請輸入0~23內的小時\n");
 } else if(validCode == 2) { 
  printf("輸入的時間無效:分鐘超出範圍,請輸入0~59內的分鐘\n");
 } else {//當新增了錯誤碼,但忘記新增else-if分支時提示,幫助排錯。 
  printf("輸入的時間無效:錯誤碼%d,請聯繫管理員\n",validCode);
 }
  return 0;
}

運行結果:

請輸入北京時間,用一個四位正整數表示,如1124表示11點24分,7表示0點7分:1124
324

請輸入北京時間,用一個四位正整數表示,如1124表示11點24分,7表示0點7分:7
-1607(負數表明UTC前一天的時間,好比-2300表示UTC時間前一天23點整)

請輸入北京時間,用一個四位正整數表示,如1124表示11點24分,7表示0點7分:2400
輸入的時間無效:小時超出範圍,請輸入0~23內的小時

請輸入北京時間,用一個四位正整數表示,如1124表示11點24分,7表示0點7分:2360
輸入的時間無效:分鐘超出範圍,請輸入0~59內的分鐘

二、題目內容:
無線電臺的 RS 制信號報告是由三兩個部分組成的:
R(Readability) 信號可辨度即清晰度.
S(Strength) 信號強度即大小.
其中 R 位於報告第一位,共分 5 級,用 1—5 數字表示.
1---Unreadable
2---Barely readable, occasional words distinguishable
3---Readable with considerable difficulty
4---Readable with practically no difficulty
5---Perfectly readable
報告第二位是 S,共分九個級別,用 1—9 中的一位數字表示
1---Faint signals, barely perceptible
2---Very weak signals
3---Weak signals
4---Fair signals
5---Fairly good signals
6---Good signals
7---Moderately strong signals
8---Strong signals
9---Extremely strong signals
如今,你的程序要讀入一個信號報告的數字,而後輸出對應的含義。

輸入樣例
59

輸出樣例
Extremely strong signals, perfectly readable.

題目分析

  • 經過用戶輸入的數字告訴用戶的含義
  • 輸入有效性校驗數字必須是一個兩位數
  • 數字的十位表明可辨度,個位表明信號強度
  • 經過分析咱們能夠知道程序用到的都是對固定值進行的判斷,所以比較適合使用switch-case分支。
  • 輸出時信號強度在前面,可辨度在後面。

程序實現:

#include <stdio.h>
int main(int argc, char *argv[]) { 
    
    
 int rsCode = 0; 
 int sinals = 0; //信號強度 
 int redable = 0; //可辨度 
 int isValidRSCode = 1;
    
 printf("請輸入一個信號報告兩位整數,十位表明可辨度,個位表明信號強度,\n"
   "好比59表示Extremely strong signals, perfectly readable. :");

 scanf("%d", &rsCode);
    
 //用戶輸入校驗 Begin
 if(rsCode <= 10){
  isValidRSCode = 0;
 }else if(rsCode > 100) {
  isValidRSCode = 0;
 }
 //用戶輸入校驗 End
    
 if(isValidRSCode == 1){
  sinals = rsCode % 10;
  switch(sinals) {
   case 1: 
    printf("Faint signals, barely perceptible");
    break;
   case 2: 
    printf("Very weak signals");
    break;
   case 3: 
    printf("Weak signals");
    break;
   case 4: 
    printf("Fair signals");
    break;
   case 5: 
    printf("Fairly good signals");
    break;
   case 6: 
    printf("Good signals");
    break;
   case 7: 
    printf("Moderately strong signals");
    break;
   case 8: 
    printf("Strong signals");
    break;
   case 9: 
    printf("Extremely strong signals");
    break;
   default:
    printf("Error:Unown signals%d", sinals);
    break;
  }
  
  printf(",");
  
  redable = rsCode / 10;
  switch(redable) {
   case 1: 
    printf("Unreadable");
    break;
   case 2: 
    printf("Barely readable, occasional words distinguishable");
    break;
   case 3: 
    printf("Readable with considerable difficulty");
    break;
   case 4: 
    printf("Readable with practically no difficulty");
    break;
   case 5: 
    printf("Perfectly readable");
    break;   
   default:
    printf("Error:Unown readable%d", redable);
    break;
  }
  
  printf(".\n");
  
 } else {
  printf("信號必須是一個兩位整數"); 
 }

return 0;   
}

執行結果:

請輸入一個信號報告兩位整數,十位表明可辨度,個位表明信號強度,
好比59表示Extremely strong signals, perfectly readable. :59
Extremely strong signals,Perfectly readable.

請輸入一個信號報告兩位整數,十位表明可辨度,個位表明信號強度,
好比59表示Extremely strong signals, perfectly readable. :11
Faint signals, barely perceptible,Unreadable.
相關文章
相關標籤/搜索