前言
上一篇講了變量,輸入輸出等基本的內(nèi)容。
不知道聰明的同學(xué)是否認(rèn)真完成作業(yè)了~

下面公布作業(yè)的答案~
-
設(shè)計(jì)一個(gè)程序,讓用戶依次輸入兩個(gè)數(shù),輸出這兩個(gè)數(shù)的加減乘除四則運(yùn)算的結(jié)果。
image.png -
設(shè)計(jì)一個(gè)程序,讓用戶依次輸入兩個(gè)數(shù),將兩個(gè)變量互換以后輸出。
image.png
如果之前沒有寫出來,這里看完思路之后記得自己去重新寫一遍~
今天我們將會(huì)講一些新的概念。
分支
我們的賓館建好了,里面也有了各種房型以及形形色色的顧客,警示標(biāo)語也貼的到處都是,但是這個(gè)賓館還是評(píng)級(jí)不高,為啥啊?
你說為啥?你見過給你一塊地讓你建賓館,結(jié)果你建了一座筆直筆直的建筑?這不浪費(fèi)嗎?有的顧客想找房間還得走出好遠(yuǎn)~
所以這里引入一個(gè)新的概念,分支。
眾所周知,如果沒有特殊情況,程序是按順序從上至下一條一條執(zhí)行的。
而如果我們想改變一些程序的執(zhí)行順序,必然要有一些分支。
比如我們把昨天的作業(yè)題改一下。
- 設(shè)計(jì)一個(gè)程序,讓用戶依次輸入兩個(gè)數(shù),然后再讓用戶輸入1、2、3、4四個(gè)數(shù)的其中一個(gè),當(dāng)用戶輸入這四個(gè)數(shù)中任意一個(gè)的時(shí)候,依次顯示a+b,a-b,a*b,a/b的值。當(dāng)用戶輸入其他數(shù)字的時(shí)候,輸出輸入錯(cuò)誤。
臥槽這是什么,怎么忽然變得這么難了?大佬放我走吧我不學(xué)了!

別急,我先隨便寫一下代碼,你再來感受一下這個(gè)是不是傳說中那么難。
int a,b,operation;
printf("請(qǐng)輸入數(shù)字a:");
scanf("%d",&a);
printf("請(qǐng)輸入數(shù)字b:");
scanf("%d",&b);
printf("請(qǐng)選擇你要執(zhí)行的運(yùn)算,1-加法,2-減法,3-乘法,4-除法:");
scanf("%d",&operation);
if (operation == 1){
int d = a+b;
printf("a+b=%d",d);
}else if (operation == 2){
int d = a-b;
printf("a-b=%d",d);
}else if (operation == 3){
int d = a*b;
printf("a*b=%d",d);
}else if (operation == 4){
int d = a/b;
printf("a/b=%d",d);
}else{
printf("輸入有誤");
}

怎么樣,根據(jù)你所學(xué)的知識(shí)理解一下,是不是也不難,只不過里面加了if else之類的語句。
if 和 else
在上面的程序中,我們也認(rèn)識(shí)了一個(gè)新朋友,if和else。
把這倆哥們好好組合起來,就可以成為最簡(jiǎn)單的分支結(jié)構(gòu)。
if (條件){
執(zhí)行的語句;
}else{
否則執(zhí)行的語句;
}

當(dāng)然,有一些條件比較復(fù)雜,我們可以用else if來做銜接
if (條件1){
執(zhí)行的語句;
}else if(條件2){
不滿足條件1且滿足條件2執(zhí)行的語句;
}else{
否則執(zhí)行的語句;
}

一些需要注意的
- else和if是邏輯對(duì)立的,是互相排斥的。就像上面的圖,if和else剛好把紅色的圓給平分,且互相沒有交集。
- else和if之間可以夾雜無限個(gè)else if 但是每個(gè)條件不能有交集
比如
if (貓){
}else if(小白貓){
}else{
}
就是錯(cuò)誤的邏輯,因?yàn)樾“棕垖儆谪埖囊环N,所以不可以用else if。條件2里面的else已經(jīng)把條件1的貓給排除了。
- 可以只有if沒有else。
if (貓) {
}
- 多個(gè)if和else可以嵌套,else將會(huì)和距離他最近的if配對(duì)
if (貓){
if (小白貓){
}else{
//這個(gè)else和上面的if (小白貓)配對(duì)
}
}else if(狗){
}else{
//這個(gè)else和上面的 if (貓)以及else if(狗)配對(duì)
}
- 如果if里面只有一行語句,if后面的大括號(hào){}可以省略(但是我不建議這樣做,因?yàn)闀?huì)亂套)
if (貓) printf("喵");
所以if后面的條件咋寫???
寫了這么多偽代碼,只是希望聰明的同學(xué)能明白if的結(jié)構(gòu)。
那么現(xiàn)在我們來具體說一下if后面括號(hào)里的條件該怎么寫。
比較運(yùn)算符
我們用這些運(yùn)算符來比較變量的大小,從而作為條件
- 大于號(hào)> ,小于號(hào)<
if (a > 0) {
//如果a大于0則執(zhí)行
}
- 大于等于>=,小于等于<=
if (a >= 0) {
//如果a大于等于0則執(zhí)行
}
- 相等 ==
if (a == 0) {
//如果a等于0則執(zhí)行
}
這里相等是比較特殊的。據(jù)我所知,大部分編程語言都是用連等號(hào)來表示相等。用以和賦值區(qū)分。
比如上面的a==0是a等于0的意思,而a=0是把0賦值給a的意思。
- 不等于 !=
if (a != 0) {
//如果a不等于0則執(zhí)行
}
邏輯運(yùn)算符
我們用這些運(yùn)算符來進(jìn)行一些邏輯運(yùn)算,從而把比較運(yùn)算符關(guān)聯(lián)起來。
- 邏輯且 &&
if (a > 0 && b>0) {
//如果a>0且b>0則執(zhí)行,必須要a>0和b>0兩個(gè)條件都滿足,才可以
}
- 邏輯或 ||
if (a > 0 || b>0) {
//如果a>0或b>0則執(zhí)行,滿足a>0或b>0任意一個(gè)條件即可
}
- 邏輯非 !
if (!a > 0) {
//如果不滿足a>0則執(zhí)行,說白了就是a不大于0,也就是a<=0
}
注意事項(xiàng)
- 邏輯與邏輯之間是可以嵌套的,也有一定的運(yùn)行優(yōu)先級(jí),不過我建議直接無視優(yōu)先級(jí),把單一的邏輯用括號(hào)括起來。
比如
if (a > 0 || (b == 0 && c > 0)) {
//如果 a大于0 或 b等于0且c大于0 則執(zhí)行
}
事實(shí)上 a > 0 || b == 0 && c > 0 不加括號(hào)和上面的結(jié)果是一樣的。&&的優(yōu)先級(jí)比||要高,不過我依然建議加括號(hào),方便自己看得更明白。
一些好玩的東西
//這兩個(gè)是等價(jià)的,是省略寫法
if (a) {
}
if (a!=0) {
}
//這兩個(gè)也是等價(jià)的,是省略寫法
if (!a) {
}
if (a==0) {
}
大括號(hào)與變量的作用域
我們?cè)賮砘乜匆幌卤酒_篇用于演示的代碼
if (operation == 1){
int d = a+b;
printf("a+b=%d",d);
}else if (operation == 2){
int d = a-b;
printf("a-b=%d",d);
}else if (operation == 3){
int d = a*b;
printf("a*b=%d",d);
}else if (operation == 4){
int d = a/b;
printf("a/b=%d",d);
}else{
printf("輸入有誤");
}
可以看到,每個(gè)大括號(hào)里都有一個(gè)整形變量d。
由此可見,在大括號(hào)里定義的變量,最大范圍只能在本括號(hào)里使用。
所以定義變量的時(shí)候需要格外注意,在最合適的地方定義,才是正確的選擇。
int a;
if (a){
//這里可以調(diào)用a
a = 0;
int b;
}
//這里不能調(diào)用b
b = 0;//這句會(huì)報(bào)錯(cuò)

三段式(我也不知道這玩意叫啥)
有一些簡(jiǎn)單的分支關(guān)系,用if來寫太麻煩了。
比如
int a = 0
if (a == 0){
a = 1
}else {
a = 2
}
printf("%d",a);
有沒有簡(jiǎn)單一點(diǎn)的寫法呢?
事實(shí)上,我們可以這樣寫。
int a = 0;
a == 0 ? a = 1: a = 2;
printf("%d",a);
這個(gè)就是三段式,可以寫一些很簡(jiǎn)單的分支結(jié)構(gòu)。
格式就是
條件?滿足條件執(zhí)行:不滿足條件執(zhí)行;
三段式可以簡(jiǎn)化代碼,但是會(huì)降低代碼的可讀性。所以建議分清使用場(chǎng)合。
switch 和 case
switch和case是另一種分支寫法。
一般用于變量的固定數(shù)值寫分支。
switch (變量){
case 數(shù)值1:{
//變量為數(shù)值1則執(zhí)行
}break;
case 數(shù)值2:{
//變量為數(shù)值2則執(zhí)行
}break;
default:{
//變量的值上面沒包含,則執(zhí)行
}break;
}
比如還是開篇的那個(gè)問題,1-加法,2-減法,3-乘法,4-除法,更適合使用switch case來寫。
int a,b,operation;
printf("請(qǐng)輸入數(shù)字a:");
scanf("%d",&a);
printf("請(qǐng)輸入數(shù)字b:");
scanf("%d",&b);
printf("請(qǐng)選擇你要執(zhí)行的運(yùn)算,1-加法,2-減法,3-乘法,4-除法:");
scanf("%d",&operation);
switch (operation) {
case 1:{
int d = a+b;
printf("a+b=%d",d);
}break;
case 2:{
int d = a-b;
printf("a-b=%d",d);
}break;
case 3:{
int d = a*b;
printf("a*b=%d",d);
}break;
case 4:{
int d = a/b;
printf("a/b=%d",d);
}break;
default:{
printf("輸入有誤");
}break;
}

注意事項(xiàng)
- 注意每條后面都要接一個(gè)break,如果不加break會(huì)有神奇的事情發(fā)生~
- switch和if有各自的使用場(chǎng)景,在很多時(shí)候是也是可以通用的。
- 結(jié)尾的default可以不寫。就像if沒有寫else一樣。
以上便是分支的全部?jī)?nèi)容。
這節(jié)課內(nèi)容雖然沒有上一節(jié)多,但是需要更多的練習(xí)才能做好。
這邊留幾個(gè)思考題~
- 寫一個(gè)程序,判斷用戶輸入的年份是否是閏年,并輸出結(jié)果。
- 寫一個(gè)程序,讓用戶給定月份,輸出該月有多少天。
- 進(jìn)階:寫一個(gè)程序,讓用戶輸入年月日,輸出該天是當(dāng)年的第幾天。
- 寫一個(gè)程序,判斷用戶輸入的數(shù)字是否是7的倍數(shù)或者含有7的數(shù)。


