引言
C語?是結構化的程序設計語?,這?的結構指的是順序結構、選擇結構、循環結構。為什么有著三種結構呢,大家其實可以想象一下,生活中的絕大數事情都可以抽象著三種結構,而我們今天要給大家介紹的就是三大結構之一——選擇結構
選擇結構要求程序員指定一個或多個要評估或測試的條件,以及條件為真時要執行的語句(必需的)和條件為假時要執行的語句(可選的)。它的流程圖大致如下:
1. 邏輯運算符
在講解什么是選擇結構前,我們要先了解一些C語言常見的邏輯運算符。
1.1 邏輯取反運算符
邏輯取反運算符的形式特別簡單,只需要在需要進行取反操作的變量前+!:
!(變量名)
假設有變量a,它的取反規則如下:
1.2 與運算符
在C語言中,并不支持數學上的且,而是由一個運算符&&代替的。比如說數學上的0<x<10寫成C語言的形式就是x>0&&x<10。
假設有兩個變量a,b,與運算符的運算規則如下:
1.3 或運算符
在C語言中,或者也有專門的運算符表示——||
假設有兩個變量a,b,或運算符的運算規則如下:
2. if......else語句
2.1 if語句
if語句是最簡單選擇結構語法之一,他的語法結構如下:
if ( 表達式 )語句
表達式成?(為真),則語句執?,表達式不成?(為假),則語句不執?。
C語言特別規定:非零為真,零為假。
例?:輸??個整數,判斷是否為奇數,如果是奇數打印是奇數
#include<stdio.h>
int main()
{int num = 0;scanf("%d", &num);if (num % 2 == 1)printf("%d 是奇數\n", num);return 0;
}
-
首先輸入一個值(num),然后進入if語句判斷,如果num%2等于1,條件就為真,就會打印;反之,條件為假,就不會進入打印。
-
特別注意:C語言中判斷是否相等的運算符是==,=是賦值符號。
2.2 else
我們繼續以上面例子為列,如果?個數不是奇數,那就是偶數了,如果任意?個整數,我們要清楚的判斷是奇數還是偶數怎么表?呢?這?就需要 if...else... 語句了,語法形式如下:
if ( 表達式 )語句1else語句2
所以上面的例子可以改寫成如下代碼:
#include<stdio.h>
int main()
{int num = 0;scanf("%d", &num);if (num % 2 == 1)printf("%d 是奇數\n", num);elseprintf("%d 是偶數\n", num);return 0;
}
-
默認在 if 和 else 語句中默認都只控制?條語句
2.3 多個if else的使用
if else 語句也可以多個同時使用,構成多個分支,形式如下:
if(判斷條件1){語句塊1} else if(判斷條件2){語句塊2}else if(判斷條件3){語句塊3}else if(判斷條件m){語句塊m}else{語句塊n}
意思是,從上到下依次檢測判斷條件,當某個判斷條件成立時,則執行其對應的語句塊,然后跳到整個 if else 語句之外繼續執行其他代碼。如果所有判斷條件都不成立,則執行語句塊n,然后繼續執行后續代碼。
也就是說,一旦遇到能夠成立的判斷條件,則不再執行其他的語句塊,所以最終只能有一個語句塊被執行。
我們以下面這段代碼舉個例子:
#include<stdio.h>int main()
{int age = 0;scanf("%d", &age);if (age > 0 && age < 18) {printf("少年\n");}else if (age >= 18 && age < 30) {printf("青年\n");}else if (age >= 30 && age < 45) {printf("壯年\n");}else if (age >= 45 && age < 55) {printf("中年\n");}else if (age >= 55 && age < 75) {printf("老年\n");}else {printf("老壽星\n");}return 0;
}
假設我們輸入的是40,輸出:
2.4 if else的嵌套
if else也能嵌套使用,也就是說if執行的語句中也可以包含if else語句。我們用判斷三角形來具體說明這個問題:
#include <stdio.h>
int main()
{int a, b, c;while(scanf("%d%d%d", &a, &b, &c)==3){if (a + b > c && a + c > b && b + c > a) {if (a == b && b == c) {printf("是一個等邊三角形");}else if (a == b || a == c || b == c) {printf("是一個等腰三角形");}else if (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a) {printf("是一個直角三角形");}else {printf("是一個普通三角形");}}else {printf("由%d,%d,%d三邊組成的不是三角形", a, b, c);}}return 0;
}
2.5 懸空的else
在書寫if....else語句時最好每一條語句后面都加上大括號。
至于為什么,我們可以以下面這段代碼舉例
#include<stdio.h>
int main()
{int a = 0;int b = 2;if (a == 1)if (b == 2)printf("hehe\n");elseprintf("haha\n");return 0;
}//輸出什么???
輸出結果:
為什么會什么結果都沒有輸出呢?
這就是懸空 else 的問題,如果有多個 if 和 else ,可以記住這樣?條規則, else 總是跟最接近的 if 匹配。最下面的else其實是與if(b==2)這條語句配對的,而不是與if(a==1)配對,當a等于0,自然不會進入任何語句。
3. switch語句
在我們學習多個lf else語句時候就會會發現,如果條件多的話,整個選擇結構就會變得很冗雜,所以C語言為了解決這個問題引入了switch,switch 是另外一種選擇結構的語句,用來代替簡單的、擁有多個分支的 if else 語句。
比如說下面這段代碼就會顯得十分冗余
int main()
{int day = 0;scanf("%d", day);if(day == 1)printf("星期一\n");else if(day == 2)printf("星期二\n");else if (day == 3)printf("星期三\n");else if (day == 4)printf("星期四\n");else if (day == 5)printf("星期五\n");else if (day == 6)printf("星期六\n");elseprintf("星期天\n");return 0;
}
3.1 switch的基本規則
switch的語法如下:
switch (expression) {case value1: statementcase value2: statementdefault: statement}
switch語句必須遵循下面的規則:
switch語句中的括號是一個常量表達式,必須是一個整型或枚舉類型。
在一個 switch 中可以有任意數量的 case 語句。每個 case 后跟一個要比較的值和一個冒號。
3.2 break的重要性
學習完switch的語法之后,然后我們可以將最開始的例子改造
int main()
{int day = 0;scanf("%d", &day);switch (day){case 1:printf("星期一\n");case 2:printf("星期二\n");case 3:printf("星期三\n");case 4:printf("星期四\n");case 5:printf("星期五\n");case 6:printf("星期六\n");case 7:printf("星期天\n");}return 0;
}
但是當我們一運行代碼就會發現問題:
為什么輸入1反而后續的結果都輸出了呢?
原因是 switch 語句也是分?效果的,只有在 switch 語句中使??break?才能在跳出 switch 語句,如果某?個 case 語句的后邊沒有 break 語句,代碼會繼續玩下執?,有可能執?其他 case語句中的代碼,直到遇到 break 語句或者 switch 語句結束。
所以在 switch 語句中 break 語句是?常重要的,能實現真正的分?效果。
當然, break 也不是每個 case 語句都得有,這就得根據實際情況來看了。
改造代碼后;
int main()
{int day = 0;scanf("%d", &day);switch (day){case 1:printf("星期一\n");break;case 2:printf("星期二\n");break;case 3:printf("星期三\n");break;case 4:printf("星期四\n");break;case 5:printf("星期五\n");break;case 6:printf("星期六\n");break;case 7:printf("星期天\n");break;}return 0;
}
3.3 default的使用
在使? switch 語句的時候,我們經常可能遇到?種情況,?如?switch 后的表達式中的值?法匹配代碼中的 case 語句的時候,這時候要不就不做處理,要不就得在 switch 語句中加?default??句。
其語法如下:
switch (expression) {case value1: statementcase value2: statementdefault: statement}
-
switch 后邊的 expression 的結果不是 value1 ,也不是 value2 的時候,就會執?default ?句。
就?如前?做的打印星期的練習,如果 day 的輸?不是1~7的值,如果我們要提?:輸?錯誤,則可以這樣完成代碼:
#include<stdio.h>
int main()
{int day = 0;scanf("%d", &day);switch (day){case 1:printf("星期一\n");break;case 2:printf("星期二\n");break;case 3:printf("星期三\n");break;case 4:printf("星期四\n");break;case 5:printf("星期五\n");break;case 6:printf("星期六\n");break;case 7:printf("星期天\n");break;default :printf("輸入錯誤\n");break;}return 0;
}
-
在 switch 語句中 case 語句和 default 語句是沒有順序要求的,只要你的順序是滿?實際需求的就可以。不過我們通常是把 default ?句放在最后處理的。
4. 綜合練習
4.1 題目一
輸入三個整數x,y,z,請把這三個數由小到大輸出。
#include <stdio.h>
int main()
{int x, y, z, t;printf("請輸入三個數字:\n");scanf("%d%d%d", &x, &y, &z);if (x > y) { /*交換x,y的值*/t = x; x = y; y = t;}if (x > z) { /*交換x,z的值*/t = z; z = x; x = t;}if (y > z) { /*交換z,y的值*/t = y; y = z; z = t;}printf("從小到大排序: %d %d %d\n", x, y, z);return 0;
}
4.2 題目二
輸入某年某月某日,判斷這一天是這一年的第幾天?
#include <stdio.h>
int main()
{int day, month, year, sum, leap;printf("請輸入年、月、日,格式為:年,月,日(2015,12,10)\n");scanf("%d,%d,%d", &year, &month, &day); // 格式為:2015,12,10switch (month) // 先計算某月以前月份的總天數{case 1:sum = 0; break;case 2:sum = 31; break;case 3:sum = 59; break;case 4:sum = 90;break;case 5:sum = 120;break;case 6:sum = 151;break;case 7:sum = 181; break;case 8:sum = 212; break;case 9:sum = 243;break;case 10:sum = 273; break;case 11:sum = 304; break;case 12:sum = 334; break;default:printf("輸入錯誤\n"); break;}sum = sum + day; // 再加上某天的天數if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {// 判斷是不是閏年leap = 1;}else {leap = 0;}if (leap == 1 && month > 2) { // *如果是閏年且月份大于2,總天數應該加一天sum++;}printf("這是這一年的第 %d 天。", sum);printf("\n");return 0;
}
文章轉載自:Betty’sSweet
原文鏈接:https://www.cnblogs.com/bett/p/18028037
體驗地址:引邁 - JNPF快速開發平臺_低代碼開發平臺_零代碼開發平臺_流程設計器_表單引擎_工作流引擎_軟件架構