3.C语言掌握分支和循环(上)

1.if语句

1.1if

语法:

if ( 表达式 )
 语句

代码演示:

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

代码执行流程图(if 语句执行流程 和 奇数判断):

在这里插入图片描述

1.2else

语法:

if ( 表达式 )
 语句1
else
 语句2

例如:输⼊⼀个整数,判断是否为奇数,如果是奇数打印是奇数,否则打印数偶数
代码演示:

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

1.3分支中包含多条语句

if 语句只能控制⼀条语句。
我们要 if 语句同时控制2条语句或多条语句时,就要用{ }将代码括起来,else 也可以跟上大括号。

代码演示:

#include <stdio.h>
int main()
{
     int age = 0;
     scanf("%d", &age);
     if(age >= 18) //if 后使⽤{} 控制多条语句-这个块也叫:程序块,或者复合语句
     {
            printf("成年了\n");
            printf("可以交⼥朋友了\n");
     }
     else //else 后使⽤{}控制多条语句-这个块也叫:程序块,或者复合语句
     {
             printf("未成年\n");
             printf("不可以早恋哦\n");
     }
     return 0;
}

1.4嵌套if

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

代码演示1:
if(num == 0)
printf(“输⼊的数字是0\n”);
else if(num > 0) //这⾥的if 相当于嵌套在els语句中,形成了嵌套结构
printf(“输⼊的数字是正数\n”);
else
printf(“输⼊的数字是负数\n”);

后面标黄的代码时嵌套在第一个else 子句中,构成嵌套if 语句。

代码演示2:
if(num>0)
{
if(num%2 == 0)
printf(“偶数\n”);
else
printf(“奇数\n”);

}
else
{
printf(“输⼊的值是负数\n”);
}
标黄的代码是嵌套在if 语句中,构成嵌套语句。

以上就是嵌套if语句的语法,有了嵌套if语句,就可以完成更多复杂逻辑的判断。

1.5悬空else 问题(注意)

如果有多个 if 和 else ,else 总是跟最接近的 if 匹配。
代码演示:

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
	       if (b == 2)
			printf("hehe\n");
	else
	    printf("haha\n");
	
	return 0;
}

输出的结果是:啥都不输出。
为什么呢?
else 语句根最近的if 语句匹配,所以实际上代码是这样的:

if (a == 1)
	{
		if (b == 2)
			printf("hehe\n");
		else
			printf("haha\n");
	}

a = 0不满足if 语句判断,则表达式为0,不输出。

如果我们要else 和第一个if 匹配,则如下:

    if (a == 1)
	{
		if (b == 2)
			printf("hehe\n");
	}
	else
	{
		printf("haha\n");
	}

所以大家要注意括号使用。

2.关系操作符

⽤于⽐较的表达式,称为 “关系表达式”(relational expression),⾥⾯使⽤的运算符就称为“关系运算符”(relational operator)。
主要有下面6个:
• > ⼤于运算符
• < ⼩于运算符
• >= ⼤于等于运算符
• <= ⼩于等于运算符
• == 相等运算符
• != 不相等运算符)
关系表达式通常返回 0 或 1 ,表⽰真假。常⽤于 if 或 while 结构。

注意1:相等运算符 == 与赋值运算符 = 是两个不⼀样的运算符。
x == 3 写成 x = 3 。这个式⼦表⽰对变量 x 赋值 3 ,它的返回值为 3 ,所以 if 判断总是为真

注意2:多个关系运算符不宜连⽤。
如:i<j<k
这是合法表达式,不会报错,但是通常出来不是我们要的结果。因为实际执行是这样的流程:(i<j)<k ,
(i<j)成立,则返回1,1和k比较
(i<j)不成立,则返回0,0和k比较。

所以我们真实想要判断 j 是否在i 和 k 之间,则如下:
i < j && j < k
&&表示并且的意思。
例子:我们输⼊⼀个年龄,如果年龄在18岁~36岁之间,我们输出⻘年。

int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age>=18 && age<=36) //40
		printf("青年\n");
	else
		printf("非青年\n");
	return 0;
}

3.逻辑运算符&&,||,!

• ! :逻辑取反运算符(改变单个表达式的真假)。
• && :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
• || :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。

练习:闰年的判断
输⼊⼀个年份year,判断year是否是闰年
闰年判断的规则(2个都要成立):

  1. 能被4整除并且不能被100整除是闰年
  2. 能被400整除是闰年
int main()
{
	int year = 0;
	scanf("%d", &year);
	if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
		printf("是闰年\n");
	else
		printf("不是闰年\n");
	return 0;
}

注意:短路问题
逻辑运算符有个特点:它总是先对左侧的表达式求值,再对右边的表达式求值。
如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值(类似|| 或运算符,表达式只要有⼀个是真,整个表达式就是真)。这种情况称为“短路”。

4.switch语句

switch 语句是⼀种特殊形式的 if…else 结构,⽤于判断条件有多个结果的情况。它把多重的 else if 改成更易⽤、可读性更好的形式。

switch (expression) {
 case value1: statement
 case value2: statement
  default: statement
}

根据表达式 expression 不同的值,执⾏相应的 case 分⽀。如果找不到对应的值,就执⾏ default 分⽀
注意
• switch 后的 expression 必须是整型表达式
• case 后的值,必须是整型常量表达式

4.1if 和switch对比

代码演示:输⼊任意⼀个整数值,计算除3之后的余数
if 语句

int main()
{
	int num = 0;
	scanf("%d", &num);
	if (num % 3 == 0)
	{
		printf("余数是0\n");
	}
	else if (num % 3 == 1)
	{
		printf("余数是1\n");
	}
	else
	{
		printf("余数是2\n");
	}

	return 0;
}

switch语句

int main()
{
	int num = 0;
	int n = 1;
	scanf("%f", &num);
	switch (num % 3)
	{
	case 0:
		printf("余数是0\n");
		break;
	case 1:
		printf("余数是1\n");
		break;
	case 2:
		printf("余数是2\n");
		break;
	}
	return 0;
}

注意

  1. case 和后边的数字之间必须有空格
  2. 每⼀个 case 语句中的代码执⾏完成后,只有加上 break ,才能跳出这个switch语句,当然,break 也不是每个 case 语句都得有。

代码练习演示:

  1. 输⼊1-5,输出的是“⼯作⽇”;
  2. 输⼊6-7,输出“休息⽇
int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	default:
		printf("输入错误,请输入1~7的数字\n");
		break;
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("工作日\n");
		break;
	case 6:
	case 7:
		printf("休息日\n");
		break;
	
	}
	return 0;
}

4.2switch中的default

举例直观看default用处:

switch (expression) {
 case value1: statement
 case value2: statement
 default: statement
}

switch 后边的 expression 的结果不是 value1 ,也不是 value2 的时候,就会执⾏default ⼦句。

所以我们在上个打印工作日练习中,可在switch语句中加上

default:
 printf("输⼊错误\n");
 break;

注意:在 switch 语句中 case 语句和 default 语句是没有顺序要求,default我们经常放在最后处理。

5.while循环

语法:

while(表达式)
   语句;
   //如果循环体想包含更多的语句,可以加上⼤括号

执行流程:
在这里插入图片描述

代码演示练习1.:打印1~10的值

int main()
{
	int i = 1;
	while (i <= 10)
	{
		printf("%d ",i);
		i++;
	}
	return 0;
}

2.练习:输⼊⼀个正的整数,逆序打印这个整数的每⼀位
例如:
输⼊:1234,输出:4 3 2 1
输⼊:521,输出:1 2 5

int main()
{
	int num = 0;
	scanf("%d", &num);
	while (num)
	{
		printf("%d ", num % 10);
		num = num / 10;
	}
}

思路:
1.⽤n%10的运算,得到的余数就是最低位,如:1234%10得到4
2.找出倒数第⼆位,则使⽤ n=n/10 操作就可以先去掉最低位。
如:
n=1234/10得到123,123相较于1234就去掉了最低位,123%10就得到倒数第⼆位3。
3.循环1和2两个步骤,在n变成0之前,就能到所有的位。

6.for循环

语法:

for(表达式1;表达式2;表达式3)
语句;

表达式1 ⽤于循环变量的初始化
表达式2 ⽤于循环结束条件的判断
表达式3 ⽤于循环变量的调整

执行流程:
在这里插入图片描述

while和for对比:
for 和 while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部分⾮常集中,便于代码的维护,⽽如果代码较多的时候 while 循环的三个部分就⽐较分散,所以从形式上 for 循环要更优⼀些

代码演示练习1:打印1~10

int main()
{
	int i = 0;
	 for(i=1;i <= 10;i++)
	{
		printf("%d ",i);
		
	 }
	return 0;
}

代码演示练习2:计算1~100之间3的倍数的数字之和

int main()
{
	int i = 0;
	int sum = 0;
	for (i = 1; i <= 100; i += 3)
	{
		sum += i;

	}
	printf("%d\n", sum);
	return 0;
}

7.do-while循环

语法:

do
  语句;
while(表达式);

执行流程:
在这里插入图片描述

代码演示练习1:打印1~10

int main()
{
	int i = 1;
	do
	{
		printf("%d ", i);
		i = i + 1;
	} while (i <= 10);
	return 0;
}

练习2:输⼊⼀个正整数,计算这个整数是⼏位数?
例如:
输⼊:1234 输出:4
输⼊:12 输出:2

nt main()
{
	int num = 0;
	scanf("%d", &num);
	int count = 0;
	do
	{
		count++;
		num = num / 10;
	} while (num);
	printf("%d\n", count);
	return 0;
}

8.break和continue语句

• break 的作⽤是⽤于永久的终⽌循环,只要 break 被执⾏,直接就会跳出循环,继续往后执⾏。

• continue 的作⽤是跳过本次循环 continue 后边的代码,继续进⾏下⼀次循环的判断。在 for 循环和 while 循环中有所差异的。

while和break 代码演示:

int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			break;
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}

运行结果是1 2 3 4
当 i 等于5的时候,循环正 break 的地⽅终⽌,不再打印,不再循环。

while和continue 代码演示

int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			continue;
			//当i等于5后,就执⾏continue,直接跳过continue的代码,去循环的判断的地⽅
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}

因为跳过了i = i+1,所以i⼀直为5,程序陷⼊和死循环。

for和break 代码演示:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			break;

		printf("%d ", i);
	}

	return 0;
}

运行结果:1 2 3 4
break 的作⽤是永久的终⽌循环。

for和continue循环

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			continue;
        //这⾥continue跳过了后边的打印,来到了i++的调整部分
		printf("%d ", i);
	}

	return 0;
}

运行结果:1 2 3 4 6 7 8 9 10

do while和break 代码演示:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int i = 1;
	do 
	{
		if (i == 5)
			break;
		printf("%d ", i);
		i++;
	} while (i <= 10);

	return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int i = 1;
	do 
	{
		if (i == 5)
			continue;
		printf("%d ", i);
		i++;
	} while (i <= 10);

	return 0;
}

9.循环的嵌套

代码演示练习:找出100~200之间的素数

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int main()
{
	int i = 1;
	//循环产⽣100~200的数字
	for (i = 101; i <= 200; i = i + 2)
	{
		//判断i是否是素数
		//使用2~i-1之间的数字去试除i
		//如果i被整除了,i就不是素数
		//如果2~i-1之间的没有数字可以整除i,i就是素数
		int j = 0;
		int flag = 1;
		for (j = 2; j <= sqrt(i); j++)
		{
			if (i % j == 0)
			{
				flag = 0;
				break;
			}

		}
		if (flag == 1)
		{
			printf("%d ", i);
		}
	}

	return 0;
}

10.goto语句

goto 语句可以实现在同⼀个函数内跳转到设置好的标号处。

int main()
{
	printf("hehe\n");
    goto end;
	printf("haha\n");
    end:
	printf("跳过haha的打印,直接来到这里\n");
	return 0;
}

好处:在多层循环的代码中,如果想快速跳出使⽤ goto 就⾮常的⽅便了。

for(...)
{
    for(...)
    {
       for(...)
       {
        if(disaster)
            goto error;
        }
     }
}

error:
    //..

for 循环想提前退出得使⽤ break ,⼀个 break 只能跳出⼀层 for 循环,如果3层循环嵌套就得使⽤3个 break 才能跳出循环,所以在这种情况下我们使⽤ goto 语句就会更加的快捷。

若有不足地方,望各位指正,谢谢。

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值