C语言第六课选择结构程序设计——第三节switch语句格式以及注意事项、输入年份月份,求该月份的天数并输出、空语句、选择结构常见错误分析、平行if语句与嵌套if语句、条件运算符、goto语句、语句标号

本文深入探讨C语言中的选择结构,包括if语句、switch语句的使用技巧及注意事项,解析平行if与嵌套if的区别,条件运算符的应用,以及goto语句的合理使用。通过实例讲解如何高效处理多分支逻辑,提升代码质量和可读性。

一、switch语句

也是用来处理多分支选择结构的
不过相比于IF语句
它的功能比较弱

在这里插入图片描述

  1. 他的表达式只能是整型、字符型或枚举型的表达式。
  2. 注意符号的使用,别搞错格式
  3. 首先求出switch之后表达式的值,然后依次与每个case之后的常量表达式的值相比较。若二者相等,则执行相应case之后的语句序列,直至switch语句体结束或者遇到break语句跳出switch语句体为止。
  4. 如果没有与之相等的常量表达式,并有default标号,则执行default标号之后的语句序列,直至switch语句体结束或者遇到break语句跳出switch语句体为止;若无default标号,则直接跳出switch语句体。
#include <stdio.h>
int main()
int a;
printf("请输入一个整数: ");
scanf("%d",&a);
switch(a)
{
case 0 : printf("zero\n");
case 1 : printf("one\n");break; 
case 2 : printf("two\n");break;
case 3 : printf("three\n");break;
default : printf("other\n"); 
return 0;
}

break的重要性
一旦匹配成功
比如这里输入0以后
会顺带着把1也执行了
如果都没有break
这些语句都得过一遍
选择结构就直接成了顺序结构了

二、编程序实现:从键盘输入年份和月份,求出该月份的天数并输出。

编程思路:
1.除了二月份之外,每个月的天数都是固定不变的;而二月份的天数则会受到闰年或平年的影响。
2.因此,可以首先判断月份,并确定二月份以外月份的天数;若是二月份,再判断年份是否是闰年,从而确定天数。
3.由于月份的取值相对固定,因此可以使用switch语句判断;年份则使用if语句判断。

#include <stdio.h>
int main()
{ 
int y,m,days;
printf("请输入年份和月份: ");
scanf("%d%d",&y,&m);
switch(m)
{
case 1 : days=31;break;
case 3 : days=31;break;
case 5 : days=31;break;
case 7 : days=31;break;
case 8 : days=31;break;
case 10 : days=31;break;
case 12 : days=31;break;
case 4 : days=30; break; 
case 6 : days=30; break;
case 9 : days=30; break;
case 11 : days= 30; break;
case 2:
if(y%4==0&&y%100!=0||y%400==0)
	days=29;
else
	days=28;
printf("days=%d\n",days);
return 0;
}

这样老复杂了
可以把天数相同的月份整合一下
case后面的标号只不过是一个入口
匹配成功以后
不碰到break语句就不会跳出
所以共用就OK了
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12 : days=31;break;

三、选择结构中容易混淆的问题

  1. 关于if语句的条件
int a,b;
scanf("%d",&a);
if(a)
	b=1;
else 
	b=0;
printf("b=%d\n",b);

if语句中表示条件的表达式,除了可以是关系表达式或逻辑表达式之外,还可以是任意标量类型的表达式,标量类型也就是整型、实型、字符型、枚举型和指针型。而且,只要表达式的值为非0,就看作真;只要表达式的值为0,就看作假。
所以这里a只要不是0就是真,执行if后面的子句
如果a=0就执行else后面的子句。
所以

if(a)
等价于
if(a!=0)
这个挺绕的,比如a=1
这个时候1非零
执行if后面的子句

在他的等价形式里面就有
1!=0
的确1不等于0
这个条件为真
既然为真了
自然就执行if后面的子句了

好好绕一下这个地方
因此:
if(a)等价于if(a!=0)
if(!a)等价于if(a==0)

int a;
printf("请输入-一个整数: ");
scanf( "%d",&a);
if(a=1)
	printf("one");
else
	printf("other");
return 0;
===的区别
这个还是比较容易出错的
这是一个赋值语句
如果给a赋值的表达式不是0
这个表达式就一直为真
毕竟非0就是真


如果
if(a=0)
就是给a赋值为0
这不就铁定一直是0 了吗
你都给人家特意指定了
所以就是铁定为假了

在判断相等时,要使用等于运算符
==
而不要误用赋值运算符
=
不管变量a取何值,if(a=1)中的条件始终为真;if(a=0)中的条件始终为假。
这个就跟判断没有什么关系了,因为这个是你自己指定了表达式的真假了


  1. 关于if子句和else子句
    在这里插入图片描述
    if子句和else子句,必须是单条语句,或者用花括号括起来的复合语句。
    这就体现出来{}的重要性了

在这里插入图片描述
还有这种在if(表达式)后面加;的行为

这个是啥还记得吗
之前写过
这个叫做空语句

if(a>0);
就相当于
if(a>o)
;
执行的是后面的空语句
而不是你所想要的
有的时候还可能报错
找不到if
所以你不加;就什么事情都没有
非得加个分号的话。。。。。。
自找麻烦。。。。
一堆报错
找问题都费劲

四、平行if语句与嵌套的if语句之间的区别

通过前面的学习,我们知道,在嵌套的if结构中,有内外层之分。内嵌的if语句是否执行,要由外层if语句中的条件来决定。
而在平行if结构中,其中的if语句相互并列、互不嵌套。不管前边if语句中的条件是真是假,后面的if语句都要执行。
在这里插入图片描述
在这里插入图片描述
如果不期望后边if语句中的判断受前边if语句中判断的影响,则可以构成平
行if结构,否则应该构成嵌套if结构。
简单点就是判断条件的安置问题,看你到底放在那里了。

五、例题对比(基本都会了,主要就是提一下差别或者说是做法吧)

  1. 从键盘输入年份和月份,求出该月份的天数并输出。
    分别用if与switch语句
    我没有弄得很详细
    感觉大家应该都会,我就把算法简单的表示了一下
    大家看看对比就OK了
    看看自己喜欢哪一种
    在这里插入图片描述
    在这里插入图片描述
    这个是错误的,
m==1或者3或者5或者...
他是这个意思
不是m==1或m==3
m==1或者3
3非零
所以这个或运算永远都是真的
因为3永远真

说这个就是想说不要想当然
就像===的区别一样

在这里插入图片描述
这个才是对的

六、在switch语句中能否使用case score>=90形式?

这个主要就是在分数区间啊或者在一定范围之内搞得,比如90-100是A,80-90是B这样子
case之后是常量表达式,这里的score是变量,所以case score>=90这种形式不OK。
可以通过一种变换,将某个分数区间映射为一个整数。
方法就是借助于整除。
需要将score被10整除,可以将101个整数分数转化为0~10这11个整数,让每个整数对应于一个case分支。
这样就把90-100这个波动范围内的数据统为10.9,这样以后也会方便很多。

switch(score/10)

条件里面可以这样写


```c
case 10:
case 9 : g='A';break;
case 8 : g='B';break;
case 7 : g='C';break; 
case 6 : g='D';break;

第一个没有break就是将10跟9统在一起成为A了
注意'A'.     %c
switch只能够是字符型、枚举型、整型
不能够有实型
所以啥99.9、88.4啥的就算了
但小数也不好避免对吧
成绩这玩意总有个小数点
方法就是强制类型转换
switch((int)(score/10))
这样小数也就OK了

七、条件运算符和goto语句

  1. 条件运算符是唯一的三目运算符,他有三个运算对象,在之前的博客里面也有提到过这个,三目运算符用起来还是挺方便的,尤其是在某些选择结构当中。
    用条件运算符构成的表达式成为条件表达式。
  2. 一般形式:表达式1?表达式2:表达式3

在这里插入图片描述

int a=5,b=3,max;
max=a>b?a:b;
有没有很熟悉的感觉
这就是求最大值
这样子多简单啊对不

if(a>b)
	max= a;
else
	max=b;

功能上来说
条件运算符是跟if-else等价的
  1. 优先级与结合性
    条件运算符的优先级很低,仅仅高于赋值运算符而己。同时,条件运算符的结合方向是自右向左的。
    在这里插入图片描述
    右结合就得先算右边的

八、例题:从键盘输入一个字符,若是大写字母,则转换为相应的小写字母;否则,转换为ASCII代码表中的下一个字符。

可使用逻辑表达式ch>=‘A’&&ch<='Z’判断变量ch中的字符是否是大写字母。

#include <stdio.h>
int main()
char ch;
printf("请输入一个字符: ");
scanf("%c",&ch);
ch=(ch>='A'&&ch<='Z')?(ch+32):(ch+1);
printf("转换后的字符=%c\n" ,ch);
return 0;
}

九、语句标号与goto语句

语句标号就是写在语句之前的标识符
其格式为
标号:语句

L1: printf("Hello World\n");
这里的L1就是语句标号

goto语句的格式为:
goto 语句标号;
它的功能是无条件跳转到标号之后的语句上执行。
例题:
从键盘输入两个数,输出其中的较大者。

#include<stdio.h>
int main()
{
int a,b,max;
printf("请输入两个整数: "); 
scanf("%d%d",&a,&b);
if(a>=b)
	max=a;
else
	max=b;
printf("较大数是: %d\n",max);
return 0; 



#include <stdio.h>
int main()
{
int a,b,max; 
printf("请输入两个整数: ");
scanf("%d%d",&a,&b);
max=a;			//假定a大
if(a>=b)		//如果为真说明a就是大的
	goto L1;	//跳转到L1
max=b;			
//为假就执行max=b;这其实是一个缺省if结构
L1:printf("较大数是: %d\n",max);
return 0;
}

使用goto语句
会影响程序的结构性和可读性,所以应该减少使用
想一下几万条语句
你搞了几百个goto随意跳转
别人看的时候,咋能准确知道你跳哪里去了
为人为己,少用goto!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值