第4章 簡單的C程式設計——選擇結構程式設計

来源:https://www.cnblogs.com/CSAH/archive/2019/04/24/10759575.html
-Advertisement-
Play Games

在順序結構中,各語句是按自上而下的順序執行的,執行完上一個語句就自動執行下一個語句,是無條件的,不必作任何判斷。實際上,很多情況下,需要根據某個條件是否滿足來決定是否執行指定的操作任務,或者從給定的兩種或多種操作選擇其一。 4.1選擇結構和條件判斷 例:定義一個函數,如果餓了吃飯。如果不餓不吃飯。 ...


在順序結構中,各語句是按自上而下的順序執行的,執行完上一個語句就自動執行下一個語句,是無條件的,不必作任何判斷。實際上,很多情況下,需要根據某個條件是否滿足來決定是否執行指定的操作任務,或者從給定的兩種或多種操作選擇其一。

4.1選擇結構和條件判斷

例:定義一個函數,如果餓了吃飯。如果不餓不吃飯。

 1 #include <stdio.h>
 2 int main()
 3 {
 4     int a;
 5     printf("請輸入一個數 0或1 ,0代表不餓,1代表餓了\n");
 6     scanf("%d",%a);
 7     if(a!=0||a!=1)
 8         printf("輸入錯誤\n");
 9     if(a==1)
10         printf("餓了,吃飯。。。\n");
11     else
12         printf("不餓,不吃飯。。。\n");
13     return 0;
14 }
View Code
1 若輸入0則,輸出“不餓,不吃飯。。。”
2 若輸入1則,輸出“餓了,吃飯。。。”
3 若輸出其他值,輸出”輸入錯誤“
code result

 

C語言有兩種選擇語句:(1)if語句,用來實現兩個分支的選擇結構;(2)switch語句,用來實現多分支的選擇結構。

4.2 用if語句實現選擇結構

4.2.1 用if語句處理選擇結構舉例

例:實現兩個變數的交換

 1 #include <stdio.h>
 2 int main()
 3 {
 4     int a,b,temp;
 5     printf("請輸入兩個數a b\n");
 6     scanf("%d%d",a,b);
 7     printf("你輸入的值a=%d,b=%d\n",a,b);
 8     printf("正在交換兩個數的位置\n");
 9     temp = a;
10     a = b;
11     b = temp;
12     printf("交換後的值a=%d,b=%d\n",a,b);
13     return 0;
14 }
View Code
1 若輸入1,2;則輸出:
2 {
3     請輸入兩個數a b
4     你輸入的值a=1,b=2
5     正在交換兩個數的位置
6     交換後的值a=2,b=1
7 }
Code Result

 

4.2.2 if語句的一般形式

if語句的一般形式如下:

if(表達式) 語句1

         [else 語句2]

if語句中的“表達式”可以使關係表達式、邏輯表達式,甚至是數值表達式。

關係表達式就是兩個數值進行比較的式子。

根據if語句的一般形式,if語句可以寫成不同的形式,最常用的優以下3中形式:

(1)if(表達式)

語句1[複合語句]           (沒有else子句部分)

(2)if(表達式)                             (有else子句部分)

         語句1[複合語句] 

else

         語句2[複合語句] 

(3)if(表達式1)         語句1[複合語句]  (在else部分又嵌套了多層的if語句)

  else if(表達式2) 語句2[複合語句]        

  else if(表達式3) 語句3[複合語句]        

         …                      …

else if(表達式m) 語句m[複合語句] 

else                            語句m+1[複合語句]    

 

註意:複合語句應當用花括弧括起來。{} 花括弧括起來的多條語句稱為複合語句。

 

4.3 關係運算符和關係表達式

在C語言中,比較符(或稱比較運算符)稱為關係運算符。所謂“關係運算”就是“比較運算”,將兩個數值進行比較,判斷其比較的結果是否符合給定的條件。

 

4.3.1 關係運算符機器優先次序

C語言提供6中關係運算符:

①<  (小於)

②<=         (小於或等於)

③>  (大於)

④>=         (大於或等於)

⑤==         (等於)

⑥!= (不等於)

①②③④優先順序相同(高),⑤⑥優先順序相同(低)

關於優先次序:

(1)前四種關係運算符(< <= > >=)的優先順序相同,後2種也相同。前4種高於後2種。

(2)關係運算符的優先順序低於算術運算符

(3)關係運算符的優先順序高於賦值運算符

 

4.3.2 關係表達式

用關係運算符將兩個數值或數值表達式連接起來的式子,稱關係表達式。關係表達式的值是一個邏輯值,即“真”或“假”。

在C的邏輯運算中,以“1”代表“真”,以“0”代表“假”。更準確來說,是“!0”代表真,“0”代表假。

4.4 邏輯運算符和邏輯表達式

4.4.1 邏輯運算符及其優先次序

有3中邏輯運算符:與(AND) 或(OR) 非(NOT)。註意:在C語言中不能在程式中直接用AND、OR、NOT作為邏輯運算符,而是用其他符號代替。C邏輯運算符及其含義如下:

“&&”和“||”是雙目(元)運算符,它要求有兩個運算對象(操作數);“!”是一目(元)運算符,只要求有一個運算對象。邏輯運算真值表:

按以下的優先次序:

(1)!(非)->&&(與)->||(或),即“!”為三者中最高的

(2)邏輯運算符中的“&&”和“||”低於關係運算符,“!”高於算術運算符。

 

4.4.2 邏輯表達式

邏輯表達式的值應該是一個邏輯量“真”或“假”。

實際上,邏輯運算符兩側的運算對象不但可以是0和1,或者是0和非0的整數,也可以是字元型、浮點型、枚舉型或指針型的純量型數據。(關於純量型的講解,在本人博客里C Language的第2章里有講解)系統最終以0和非0來判定他們屬於“真”或“假”。邏輯運算的真值表(用0和非0表示的另一種格式):

在邏輯表達式的求解中,並不是所有的邏輯運算符都被執行,只是在必須執行下一個邏輯運算符才能求出表達式的解時,才執行該運算符;如

(1)a&&b&&c。只有a為真(非0)時,才需要判別b的值。只有當a和b都為真的情況下才需要判別c的值。如果a為假,就不必判斷b和c的值(此時整個表達式已確定為假)。換個說法,就是a若為假,則b和c被短路了,不會被執行。

(2)a||b||c。只要a為真(非0)是,就不必判斷b和c。只有a為假,才判別b。a和b都為假才判別c。

 

4.4.3 邏輯型變數

這是C99有所增加的一種數據類型。可將關係運算和邏輯運算的結果存到一個邏輯變數中,以便於分析和運算。定義邏輯變數用類型符_Bool.

float score;

scanf(“%f”,&score);

_Bool a ,b;                                 //a和b被定義為邏輯型變數

a = score>=60;                                   //將關係表達式score>=60的值賦給邏輯變數a

b = score<=69;                                   //將關係表達式score<=60的值賦給邏輯變數b

if(a&&b)                                     //如果a和b均為真,輸出分數等級為C

         printf(“The grade is C\n”);

 

   如果在源文件中用#include指令包含了頭文件stdbool.h,那麼上面的程式段可以寫成:

float score;

scanf(“%f”,&score);

bool a ,b;                           //a和b被定義為邏輯型變數

a = score>=60;                                   //將關係表達式score>=60的值賦給邏輯變數a

b = score<=69;                                   //將關係表達式score<=60的值賦給邏輯變數b

if(a&&b)                                     //如果a和b均為真,輸出分數等級為C

         printf(“The grade is C\n”);

 

註意:在使用bool類型時,要先瞭解自己所用的編譯系統能否允許使用邏輯型變數bool和true和false.

4.5 條件運算符和條件表達式

有一種if語句,當被判別的表達式的值為“真”或“假”時,都執行一個賦值語句且向同一個變數賦值,如:

if(a>b)

         max = a;

else

         max = b;

以上的if語句可以改寫為:

         max = (a>b)?a:b;

條件運算符有兩個符號(?和:)組成,必須一起使用,要求有3個操作對象,稱為三目(元)雲三幅,它是C語言中唯一的一個三目運算符。

條件表達式的一般形式為:

表達式1?表達式2:表達式3

執行過程:先計算出表達式1的值,若為非零(真),則執行表達式2;否則,執行表達式3.

說明:

(1)條件運算符的執行順序:先求解表達式1,若為非0(真)則求解表達式2,表達式2的值就作為整個條件表達式的值。若表達式1的值為0(假)則求解表達式3,表達式3的值就作為整個條件表達式的值。

(2)條件運算符優先於賦值運算符,因此複製表達式的求解過程是先求解條件表達式再將它的值賦給max

條件運算符的優先順序別比關係運算符和算術運算符都低。

例:輸入一個字元,判別它是否為大寫字母,若是,則轉換為小寫字母。

#include <stdio.h>

int main()

{

         char ch;

         scanf(“%c”,&ch);

         ch = (ch>=’A’&&ch<=’Z’)?(ch+32):ch;

         printf(“%c\n”,ch);

         return 0;

}

運行結果 A 回車 a

4.7選擇結構的嵌套

在if語句中又包含一個或多個if語句稱為if語句的嵌套(nest)。其一般形式如下:

if()

         if()   語句1

         else()       語句2

else

         if()            語句3

         else()       語句4

應當註意,if與else的配對關係。else總是與它上面的最近的未配對的if配對。如:

if()

         if()    語句1

else

         if()    語句2

else          語句3

有些編程者會把else寫在與第1個if(外層if)同一列上,意圖是使else與第1個if對應,但實際上else是與第2個if配對,因為它們相距最近。

為了避免二義性的混淆,最好使內嵌if語句也包含else部分。如:

if()

{

         if() 語句1

}

else 語句2

這時“{}”限定了內嵌if語句的範圍,因此else與第一個if配對。

 

4.7用switch語句實現多分支選擇結構

C語言提供switch語句直接處理多分支選擇。

switch語句是多分支選擇語句。

switch漁具店作用是根據表達式的值,是流程跳轉到不同的語句。switch語句的一般形式如下:

switch(表達式)

{

         case 常量1 : 語句1

case 常量1 : 語句1

         …                     

         case 常量n : 語句n

         default :      語句n+1

 

}

 

說明:

(1)switch後面的括弧內的“表達式”,其值的類型應為整數類型(包括字元型)

(2)switch下麵的花括弧內是一個複合語句。這個複合語句包括若幹語句,它是switch語句的語句體。語句體內包含多個以關鍵字case開頭的語句行和最多一個以default開頭的行。

case後面跟一個常量(或常量表達式),如:case ‘A’ ,它們和default都是標號(label或稱標簽、標記的作用,用來標誌一個位置。執行switch語句時,先計算switch後面的“表達式”的值,然後將它與各case標號比較,如果與某一個case標號中的常量相同,流程就轉到此case標號後面的語句。如果沒有與switch表達式相匹配的case常量,流程轉去執行default標號後面的語句。換句話說,就是表達式和case後面的常量比較,有適配的就執行對應的語句;如果case沒有匹配的常量,就執行default後面的語句。

(3)可以沒有default標號,此時如果沒有與switch表達式相匹配的case常量,則不執行任何語句,流程轉到switch語句的下一個語句。

(4)各個case標號出現次序不影響執行結果。如,可以先出現default標號,然後再出現case標號。

(5)每一個case常量必須互不相同;否則就會出現相互矛盾的現象(對switch表達式的同一個值,有兩種或多種執行方案)

(6)case標號只起標記的作用。如果在個case子句中沒有break語句,則會連續輸出剩下從case標號對應的語句,直至遇到break或者結束switch選擇分支。

註意:一般情況下,在執行一個case子句後,應當用break語句使流程跳出switch結構,即終止switch語句的執行。最後一個case子句(或者default子句)中可不必加break語句,因為流程已到了switch結構的結束處。

(7)在case子句中雖然包括了一個以上執行執行語句,但可以不必用花括弧括起來,會自動順序執行本case標號後面所有的語句。當然也可以加上花括弧。

(8)多個case標號可以共用一組執行語句。

例:case ‘A’

         case ‘B’

         case ‘C’ : printf(“>60\n”);break;

當值為’A’ ’B’ ’C’時,都會執行同一組語句,輸出“>60”,然後換行。

 

例:

 1 #include <stdio.h>
 2 
 3 int main()
 4 
 5 {
 6 
 7     char ch;
 8 
 9     ch = getchar();
10 
11     switch(ch)
12 
13     {
14 
15          case 'a':
16 
17          case 'b':
18 
19          case 'c': {
20 
21                       printf("a");
22 
23                       printf("b");
24 
25                       printf("c");
26 
27                     }
28 
29     }  
30     return 0;
31 
32 }
View Code

 

運行結果:輸入a 輸出結果為abc;

   


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [TOC] 電梯作業總結 程式結構與複雜度的分析 第一次作業 1.設計思路 第一次作業是電梯作業的第一次,也是我多線程變成的第一次實踐。任務是編寫一個多線程實時電梯系統,採用FAFS的調度方式。由於第一次作業中沒有涉及到多部電梯以及捎帶的情況,因此來說是比較簡單的。我採用的是指導書提示部分中的模式, ...
  • 這裡演示的是前期框架的搭建,剩下的Controller就很簡單了 ...
  • 前幾天,棧長分享了 《 "Spring Cloud Eureka 註冊中心集群搭建,Greenwich 最新版!" 》,今天來分享下 Spring Cloud Eureka 常用的一些參數配置及說明。 Spring Boot 的配置參考Java技術棧微信公眾號往期 Spring Boot 系列文章, ...
  • [TOC] 函數的嵌套定義(掌握) 函數內部定義的函數,無法在函數外部使用內部定義的函數。 from f2 現在有一個需求,通過給一個函數傳參即可求得某個圓的面積或者圓的周長。也就是說把一堆工具丟進工具箱內,之後想要獲得某個工具,直接從工具箱中獲取就行了。 circle(10): 314.15926 ...
  • 一、前言 Go(又稱Golang)是Google開發的一種靜態強類型、編譯型的編程語言。 Go語言的主要特點包括:自動垃圾回收、更豐富的內置類型、函數多返回值、錯誤處理、匿名函數和閉包、類型和介面、併發編程、反射、語言交互性。 二、安裝配置 Go語言的安裝是很簡單的,下載安裝包進行安裝就好了,但是不 ...
  • [TOC] 函數是第一類對象,即函數可以被當做數據處理。 函數對象的四大功能(掌握) 1.引用 2.當作參數傳給一個函數 from func 3.可以當作函數的返回值 from func 4.可以當作容器類型的元素 from func 練習(掌握) '1': 支付, '2': 提現, '3': 退出 ...
  • 一、引言 Oracle為Java提供了豐富的基礎類庫,Java 8 提供了4000多個基礎類庫,熟練掌握這些基礎類庫可以提高我們的開發效率,當然,記住所有的API是不可能也沒必要的,我們可以通過API文檔或直接網上搜索來逐漸熟悉大部分類的功能和方法,下麵我們來學習一些基礎類庫。 二、Scanner ...
  • MATLAB中“fitgmdist”的用法及其GMM聚類演算法 作者:凱魯嘎吉 - 博客園 http://www.cnblogs.com/kailugaji/ 高斯混合模型的基本原理:聚類——GMM,MATLAB官方文檔中有關於fitgmdist的介紹:fitgmdist。我之前寫過有關GMM聚類的算 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...