大學C語言程序設計
chapter 2 分支結構
1. 三大結構的認識
編程語言的三大結構:
- 順序結構:從上至下,從左至右的執行;
- 分支結構(選擇結構):滿足條件就執行:if, switch;
- 循環結構:滿足條件就一直執行,直到不滿足時退出:for, while。
學習分支結構前,我們需要了解一個概念:什么叫條件?
條件:在這里是一個關系表達式,或者是一個布爾類型的變量,其結果表示成立與否,那么它就只有兩種結果:成立(true),不成立(false),而在計算機中成立用 '!0' 代替, 不成立用 '0' 代替。
當然布爾類型在C99並不存在,而在C++中是存在的,這里作為對條件這一概念的認識。
bool flag = true;// 1
bool flag = false;// 0
不過C99之前,人們也時常用 int 來表示布爾類型,畢竟它可以賦值為 1 and 0.
int flag=1;
int flag=0;
2. 關系表達式
等於 | 不等於 | 大於 | 小於 | 大於等於 | 小於等於 |
---|---|---|---|---|---|
== | != | > | < | >= | <= |
3. 邏輯表達式
符號 | 名字 | 使用格式 | 備注 | 樣例 | 樣例 |
---|---|---|---|---|---|
&& | 邏輯與 | a&&b | 同真為真 | 1&&1=1 | 1&&0=0 |
|| | 邏輯或 | a||b | 同假為假 | 1||0=1 | 0||0=0 |
! | 邏輯非 | !a | 非假即真,非真即假 | !0=1 | !1=0 |
& | 按位與 | a&b | 同真為真 | 1&0=0 | 1100 & 1001=1000 |
| | 按位或 | a|b | 同假為假 | 1|0=1 | 1100 | 1001=1101 |
~ | 按位取反 | ~a | 非假即真,非真即假 | ~1=0 | ~1010=0101 |
4. if語句
if(flag){} 、 if(flag)else{} 、if(flag){} else if(flag){} else{}、....
if...else...
bool flag = true;
布爾類型,只有兩種格式:true, false
也可以記作1和0,0表示false, 非0表示true
bool flag = true;
if(flag){ //如果flag為真,就執行{}中的內容,否則不執行
//
}
bool flag=0;
if(flag){ //如果flag為真,就執行{}中的內容,否則不執行
//
}else{ //如果if不執行,就執行else{}中的內容
//
}
bool flag=0;
if(flag){//如果flag為真,就執行{}中的內容,否則不執行
//
}else if(flag){//如果前面沒有if執行,並且滿足現在if的條件,就執行else{}中的內容
//
}else if(flag){//如果前面沒有if執行,並且滿足現在if的條件,就執行else{}中的內容
//
}else{ //如果沒有任何一個if執行,就執行else{}中的內容
//
}
5. if案例練習
【題目描述】輸入一個整數,判斷其是奇數還是偶數
輸入樣例:10
輸出樣例:10是偶數
#include<stdio.h>
int main(){
int n; scanf("%d", &n);
if(n%2==0){ //判斷兩個數相等用雙等於; 奇偶數的判斷還可以使用(n&1)
printf("%d是偶數", n);
}else{
printf("%d是奇數", n);
}
return 0;
}
【題目描述】輸入年份year,輸出該年份是否為閏年。
判斷閏年的方法:年份能被4整除但不能被100整除或者年份能被400整除的稱為閏年。
輸入樣例:2020
輸出樣例:2020是閏年
輸入樣例:2021
輸出樣例:2021不是閏年
#include<stdio.h>
int main(){
int year; scanf("%d", &year);
bool flag = (year%4==0 && year%100!=0)||(year%400==0);
if(flag){
printf("%d是閏年", year);
}else{
printf("%d不是閏年", year);
}
return 0;
}
6. 條件表達式
格式:<表達式1>?<表達式2>:<表達式3>
條件表達式要求有三個操作對象,"?"和":"一起出現在條件表達式中,稱三目(元)運算符,它是C++中唯一的一個三目運算符。
條件表達式的運算規則:
(1)計算表達式1的值。
(2)若表達式1的值為真(或非0),則只計算表達式2,並將其結果作為整個表達式的值。
(3)反之,若表達式1 的值為假(或為0),則只計算表達式3,並將其結果作為整個表達式的值。
舉例:求a,b的最大值
int maxn = a>b ? a:b;
舉例:求a,b的最小值
int maxn = a<b ? a:b;
7. switch
本質上 switch 和 if 是相通的,滿足條件就執行。
int main() {
int num; scanf("%d", &num);
switch(num) {
case -1: printf("-1\n"); break; //退出
case 1: printf("1\n"); break;
case 0: printf("0\n"); break;
default: //如果前面沒有case執行,就執行
printf("ERROR\n"); break;
}
return 0;
}
【題目描述】根據輸入的表示星期幾的數字,對應輸出它的英文名稱。
1、星期一:Monday
2、星期二:Tuesday
3、星期三:Wednesday
4、星期四:Thursday
5、星期五:Friday
6、星期六:Saturday
7、星期日:Sunday
錯誤輸入請輸出:input error!
輸入格式:輸入的表示星期幾的數字。
輸出格式:對應輸出它的英文名稱。
輸入樣例:1
輸出樣例:Monday
#include<stdio.h>
int main(){
int n; scanf("%d", &n);
switch(n){
case 1: printf("Monday"); break;
case 2: printf("Tuesday"); break;
case 3: printf("Wednesday"); break;
case 4: printf("Thursday"); break;
case 5: printf("Friday"); break;
case 6: printf("Saturday"); break;
case 7: printf("Sunday"); break;
default: printf("input error!"); break;
}
return 0;
}
【題目描述】一個最簡單的計算器,支持 +, -, *, / 四種運算。
僅需考慮輸入輸出為整數的情況,數據和運算結果不會超過int表示的范圍。然而:
輸入格式:輸入三個參數,其中第 1、2 個參數為整數,第 3 個參數為操作符(+,-,*,/)。
輸出格式:輸出只有一行,一個整數,為 a 操作符 b 的運算結果。然而:
- 如果出現除數為0的情況,則輸出:Divided by zero!
- 如果除數不為0,則保留2位小數。
- 如果出現無效的操作符(即不為 +, -, *, / 之一),則輸出:Invalid operator!
輸入樣例1:1 2 +
輸出樣例1:3
輸入樣例2:1 2 /
輸出樣例2:0.5
#include<stdio.h>
int main(){
int a,b; char c;
scanf("%d %d %c", &a, &b, &c);//由於使用到字符輸入,所以加空格區分
switch(c){
case '+': printf("%d", a+b); break;
case '-': printf("%d", a-b); break;
case '*': printf("%d", a*b); break;
case '/': {
if(b==0) printf("Divided by zero!");
else printf("%.2lf", (double)a/b);
break;
} // {}是一個整體
default: printf("Invalid operator!"); break;
}
return 0;
}