前言
上一篇講了變量拿霉,輸入輸出等基本的內(nèi)容啸胧。
不知道聰明的同學(xué)是否認(rèn)真完成作業(yè)了~
下面公布作業(yè)的答案~
-
設(shè)計(jì)一個(gè)程序彪置,讓用戶依次輸入兩個(gè)數(shù)过吻,輸出這兩個(gè)數(shù)的加減乘除四則運(yùn)算的結(jié)果纯衍。
-
設(shè)計(jì)一個(gè)程序,讓用戶依次輸入兩個(gè)數(shù)再榄,將兩個(gè)變量互換以后輸出狡刘。
如果之前沒有寫出來,這里看完思路之后記得自己去重新寫一遍~
今天我們將會(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ù)龟虎。