第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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...