第三课:分支结构(笔记)

C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构。

仔细思考可以发现:生活中的大量问题都可以通过这三种方法来解决

我们使用 if 、switch 实现选择(分支)结构,使用 for、 while、do while 实现循环结构。

1.if 语句

1.1if

if的语法结构:

if(表达式)
 语句一;

在C语言中,0表示假,非0表示真

1.2 else

else的语法结构:

if(表达式)
 语句一;
else
 语句二;

1.3分支中包含多条语句

在if和else语句中默认只控制一条语句;

若要控制多条,可以采用大括号。

所以为了方便,直接加上大括号

if(表达式)
{
  语句一;
}
else
{
  语句二;
}

1.4嵌套if

嵌套在else中,当代码判断没有一定顺序时

在if else语句中,else可以与另一个if连用,构成多重判断。

比如:输入一个整数,判断其是0、正数还是负数

写法一:

#include <stdio.h>
int main() {
	int n;
	scanf("%d", &n);
	if (n == 0)
		printf("输入的是0\n");
	else {
		if (n > 0)
			printf("输入的是正数\n");
		else
			printf("输入的是负数\n");
	}
}

写法二:

#include <stdio.h>
int main() {
	int n;
	scanf("%d", &n);
	if (n == 0)
		printf("输入的是0\n");
	else if (n > 0)
			printf("输入的是正数\n");
	else
			printf("输入的是负数\n");
	}
}

嵌套在if中,当代码判断有一定顺序时

比如:输入一个整数,如果它是正数,再判断是奇数还是偶数,并输出;如果它是非正数,则输出非正数。

#include <stdio.h>
int main() {
	int n;
	scanf("%d", &n);
	if (n > 0) {
		if (n % 2 == 0)
			printf("n是偶数");
		else
			printf("n是奇数");
	}
	else
		printf("n是非正数");
}

嵌套中的判断范围可以不考虑嵌套外的范围

if(n>0)
  printf("大于0");
else if(n<200)
  printf("大于0且小于200");
else
  printf("大于等于200")

1.5悬空else问题

在多个if和else中,else总是和最近的if匹配

#include <stdio.h>
int main() {
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	if (a > 0)
		if (b > 0)
			printf("haha");
		else
			printf("hehe");//其自动与第二个if对齐
}

此代码原理:只有a成立,才判断时if 还是else

*而此代码更好的书写格式是:

#include <stdio.h>
int main() {
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	if (a > 0)
   {
		if (b > 0)
			printf("haha");
		else
			printf("hehe");//其自动与第二个if对齐
    }
}

**小提示:适量数量的空格,提升代码美感。要养成良好的代码习惯! 

 2.关系操作符


2.1 有哪些

C语言用于比较的表达式,称为“关系表达式” (relational expression),里面使用的运算符就称为"关系运算符”(relational operator) ,主要有下面6个。
•>  大于运算符
•< 小于运算符
•>=  大于等于运算符
•<=  小于等于运算符
•==  相等运算符
•!=  不相等运算符

*关系表达式通常返回0或1,表示真假。
C语言中,0表示假,所有非零值表示真。比如,20>12返回1。12>2日返回0。
关系表达式常用于 if 或 while 结构

 2.2  需要避免的错误

2.2.1“=”赋值,“==”相等
 注意两个的区分!

如果一个变量和一个常量比较相等,建议将常量放在==的左边

#include <stdio.h>
int main() {
	int a = 5;
	if (7 == a)
		printf("haha\n");
}

改变的一定是操作符的左边,常量无法改变,故放在左边可以防止错误。

2.2.2 多个关系操作符不能连用
int a = 10;
int b = 6;
int c = 9;
if(a<b<c)
  printf("haha");

运行结果是:haha
运行原理:a先与b比较--a>b--结果为假0
         0再与c比较--0<c--成立

正确写法:
int a = 10;
int b = 6;
int c = 9;
if(a<b && b<c)//&& 是并且的意思
  printf("haha");

3.条件操作符

条件操作符又叫三目操作符,需要接受三个数。

格式:exp1 ?exp2 :exp3

操作原理:

表达式1真-----表达式2计算,表达式3不算,表达式2的结果是整个表达式的结果
表达式1假-----表达式2不算,表达式3计算,表达式3的结果是整个表达式的结果

#include <stdio.h>
int main() {
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	if (a > 5)
		printf("b=3");
	else
		printf("b=-3");
}

#include <stdio.h>
int main() {
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	b = (a > 5 ? 3 : -3);
		printf("%d", b);
}

//与条件判断的运行结果相同,所以又叫条件操作符
使用条件表达式来判断两个值的最大值
#include <stdio.h>
int main() {
	int a = 0;
	int b = 0;
	int m = 0;
	scanf("%d %d", &a, &b);
	m=(a > b ? a : b);
	printf("%d", m);
	return 0;
}

4.逻辑操作符 && || !

!   逻辑取反运算符(改变单个表达式的真假)

&& 与运算符,并且

||    或运算符,或者

4.1 逻辑取反运算符 !

a!a
非00
01

*真打印,假不打印

#include <stdio.h>
int main(){
	int aim = 0;
	if (!aim)
		printf("haha\n");
	return 0;
}

运行结果为:haha

4.2 与操作符 &&

双目操作符

规则:两端都真为真。有假则假。

3到5月是春季
#include <stdio.h>
int main() {
	int a = 0;
	scanf("%d", &a);
	if (a >= 3 && a <= 5)
		printf("春季");
	return 0;
}

4.3 或操作符 ||

规则:一端为真即为真,两端都为假才为假

#include <stdio.h>
int main() {
	int a = 0;
	scanf("%d", &a);
	if ( a==1 || a==2 || a==12)
		printf("冬季");
}

4.4练习(判断是否为闰年):

规则:能被4整除但不能被100整除,或者能被400整除

#include <stdio.h>
int main() {
	int a = 0;
	scanf("%d", &a);
	if (a % 4 == 0 && a % 100 != 0 || a % 400 == 0)
		printf("闰年");
	else
		printf("平年");
	return 0;
}

4.5短路

C语言逻辑运算符还有一个特点:它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。
如果左边的表达式不满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”

像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值。

与(一假全假)
#include <stdio.h>
int main() {
	int a = 0;
	int b = 10;
	int c = 6;
	int i = a++ && ++b && c++;
	//a先使用再++
	//a先使用a=0,决定了后面不在运算
	//a后++  a=1,决定了a自身最后的结果
	printf("%d\n%d\n%d", a, b, c);
	return 0;
}
结果:a=1,b=10,c=6



如果a=1
#include <stdio.h>
int main() {
	int a = 1;
	int b = 10;
	int c = 6;
	int i = a++ && ++b && c++;
	//a先使用再++
	//a先使用a=1,决定了后面继续运算
	//a后++决定了a自身最后的结果,a=2
	printf("%d\n%d\n%d", a, b, c);
	return 0;
}
结果:a=2,b=11.c=7
或(一真全真)​​​​​​

#include <stdio.h>
int main() {
	int a = 1;
	int b = 10;
	int c = 6;
	int i = a++ || ++b || c++;
	//或只要有一个为真即可
	//a=1为真,故后面直接运算即可
	printf("%d\n%d\n%d", a, b, c);
	return 0;
}
结果:a = 2, b = 11.c = 7

5.switch语句

除了 if 语句外,C语言还提供了 switch 语句来实现分支结构。(分支结构:if 、switch)

switch 语句用于判断条件有多个结果的情况。它把多重的else if 改成更易用、可读性更好的形式。

 --switch 后的 expression 必须是整型表达式

浮点数不行,字符可以,整型可以(字符属于整型家族)

--case 后的值,必须是整形常量表达式

#include <stdio.h>
int main(){
  int a=0;
  int n=9;
  scanf("%d",&a);
  switch(s)//整型表达式
{
  case 1:
  printf...
  case 1+2://正确,只要是整型常量表达式即可
  case n://错误,因为n是变量
  printf...
}
}

5.1  if语句和switch语句的比较

//求被3整除的余数是几
//if语句

#include <stdio.h>
int main() {
	int a = 0;
	scanf("%d", &a);
	if (a % 3 == 0)
		printf("余数是0\n");
	else if (a % 3 == 1)
		printf("余数是1\n");
	else
		printf("余数是2\n");
	return 0;
}

//switch语句
#include <stdio.h>
int main() {
	int a = 0;
	scanf("%d", &a);
	switch (a % 3)
	{
	case 0://入口
		printf("余数是0\n");
		break;//出口
	case 1:
		printf("余数是1\n");
		break;
	case 2:
		printf("余数是2\n");
		break;
	}
	return 0;
}

5.2switch语句中的break

case是入口,break是出口

break在特殊情况下可以省略,且更方便。

根据实际需求添加break!!

#include <stdio.h>
int main() {
	int a = 0;
	scanf("%d", &a);
	switch (a)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("工作日");
		break;
	case 6:
	case 7:
		printf("休息日");
        break;
	}
	return 0;
}

5.3 Switch语句中的default

当所有case都无法匹配时,输入default

#include <stdio.h>
int main() {
	int a = 0;
	scanf("%d", &a);
	switch (a)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("工作日");
		break;
	case 6:
	case 7:
		printf("休息日");
		break;
	default:
		printf("输入错误");
		break;
	}
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值