分支与循环(上)

分支与循环(上)

if语句

if

  1. 常用格式:
if(表达式)
   语句

注意:在c语言中,0–>结果为假—>语句不执行;非0–>结果为真–>语句执行

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

	
	 return 0;

}

要点:

  • c语言规定,一个分号就是一条语句,而if是控制语句,它默认只能控制接下来的第一条语句,所以如果在if语句后面加了分号,则无论表达式是真是假,if语句都不执行任何命令。

else 语句

  1. 语法形式:
if(表达式)
    语句1
else
    语句2

示例1:num如果不是偶数就是奇数。

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

	return 0;
}

示例2:年龄>=18–>成年;<18–>未成年

#include<stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age>=18)
		printf("成年\n");
	else
		printf("未成年\n");

		return 0;

}

分支中包含多个语句

示例2拓展:

#include<stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age>=18)
		printf("成年\n");
	    printf("可以谈恋爱了");
	else
		printf("未成年\n");

		return 0;

}

报错:C2181–>没有匹配if的非法else。
原因:默认情况下,if和else的后边只能跟一条语句。如果要跟多条语句,可以放入花括号里。
正确代码:

#include<stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age >= 18)
	{
		printf("成年\n");
		printf("可以谈恋爱了\n");
	}
	else
	{
		printf("未成年\n");
		printf("禁止谈恋爱\n");
	}
		return 0;

}

注意:if后面使用的花括号,控制多条语句的这个块,也叫做程序块或者复合语句。

嵌套if语句

示例3:若num=0–>0,num<0–>负数,num>0–>正数
嵌套1:

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

嵌套2:

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

嵌套3:

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

	return 0;
}

悬空else 问题

注意:如果有多个if和else—>else总是与最接近的if匹配
示例4: a = 1,b = 2 —>hehe , a = 1 , b不等于2 —>haha

#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;
}

示例5:a =1,b=2—>hehe , a不等于1—>haha

#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;
	
    
}

关系操作符

  1. 关系表达式:用于比较的表达式,通常返回0/1,表示真假(c语言中,0表示假,所有非0值表示真)
  2. 关系运算符:关系表达式中使用的运算符。
  • 分类 : > 、 <、>=、 <= 、 == (相等运算符)、!=(不相等运算符) 、
  • 相等运算符是"==“,不是”=“(”="表示赋值),写代码时:if(a = 15)—>if(15 = a)
  • 注意:
    • 多个关系符不要连用
      +举例 : a < b < c—> a <b && b<c(此处的”&&“时逻辑操作符)

条件操作符

  1. 条件操作符:也叫三元运算符(三元–>有3个操作数)
  2. 形式:
表达式1 ? 表达式2 : 表达式3
  1. 计算逻辑:先计算–》表达式1
  • 表达式1 —>真,表达式2 —>计算 , 表达式3—>不计算(表达式2的结果–》整个表达式的结果)
  • 表达式1 —>假,表达式2—> 不计算 ,表达式3—>计算(表达式3的结果—》整个表达式的结果)
  1. 举例:m = n < 8 ? 6 : -6 (分析:n的值<8,输出6;n的值>=8,输出 -6,最后将n的值赋给m)。

逻辑操作符

  1. 逻辑操作符:提供逻辑判断的功能。
  2. 分类:
  • ! :逻辑取反运算符(改变单个表达式的真假)。

  • && :逻辑与运算符(并且)–》两侧表达式都真,则真,有一个为假,都为假。

  • || :逻辑或运算符(或者)–》两侧至少有一个表达式为真,则为真

switch语句

  1. 常用格式
switch (表达式){
        case 常量表达式 :语句
        ....
        case 常量表达式 :语句
        default : 语句
}
  1. 格式分析:
  • 表达式(控制表达式):整型表达式。注意:字符类型也归类到了整型家族中,因为字符的本质就是ASCII值,这个值是整数。
  • 分支标号:case 常量表达式 :
  • 常量表达式:必须是整数/字符(比如:5是常量表达式,5+10也是常量表达式)
  • 语句:
    • 每个分支标号的后面可以跟任意数量的语句,且不需要花括号,每组语句的最后一条通常是break语句。
    • 分支标号不允许重复,分支顺序无要求,多个分支标号可放在同一组语句的前面。
  1. 举例 :输⼊1-7的数字,打印对应的年级
#include<stdio.h>
int main()
{
	int grade = 0;
	scanf("%d", &grade);
	switch (grade)
	{
	case 1:
		printf("一年级\n");
		//break;
	case 2:
		printf("二年级\n");
		//break;
	case 3:
		printf("三年级\n");
		//break;
	case 4:
		printf("四年级\n");
		//break;
	case 5:
		printf("五年级\n");
		//break;
	case 6:
		printf("六年级\n");
		//break;
	case 7:
		printf("7年级\n");
		//break;
	}
	return 0;
}

结构分析:

  • 控制表达式(整型表达式) --》grade
  • 分支标号–》case 1:/case 2:/case 3 :(注意冒号不要丢)
  • 打印–》题目所要求的数字对应的班级号"一年级“/二年级”…/”七年级“

输入输出分析:(将break语句注释掉)

  • 输入2–》二年级(换行),三年级(换行),四年级(换行),…,七年级(换行)。
  • 输入3–》三年级(换行),四年级(换行),…,七年级(换行)。
  • 思考:为什么输入的年级是2,却将后面的3-7年级都显示出来了?
    原因 :break 语句–》switch语句具有分支效果,我们的分支标号只是一个说明switch内部位置的标记,如果没有break语句,控制会从一个分支继续到下一个分支,也就是我们上面演示的那样。为语句添加break语句就会得到一一对应的答案。

改进:输入1-5,输出低年级;6-7,输出高年级。

#include<stdio.h>
int main()
{
	int grade = 0;
	scanf("%d", &grade);
	switch (grade)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("低年级\n")
		break;
	case 6:
	case 7:
		printf("高年级\n");
		break;
	//default:
	//printf("输入错误\n");
	//break;     
	}
	return 0;
}

上例体现了分支标号可以放置再同一组语句下面。
思考:如果我们输出一个其他值,但是有想要屏幕上打印除”输入错误“的内容,则可以添加default语句,用大白话来讲它的作用就是解决case解决不了的问题。注意此处的default 的位置可以不固定,只是我们通常放在最后。

总结
(1).switch语句是一种特殊的if…else结构,switch(表达式)中,表达式必须是整型表达式(包含字母)。
(2).switch语句具有分支效果,如果不想让代码执行下去,需要添加break语句。
(3).break语句:执行break语句会导致程序”跳出“switch语句,继续执行switch后面的语句。
(4).default语句:解决分支标号(case语句)解决不了的问题。
(5).case语句(分支标号):不可重复,不限语句数量(无需花括号),多个case语句可以放置在同一组语句下面。

循环语句

while 循环

  1. 语法形式:
while(条件表达式)
    语句;

表达式是控制语句,语句是循环体;while循环中,当条件表达式成立时,才会执行循环体中的语句,故while循环条件会比循环体多执行一次。(参考执行流程举例,其中m=m+2为循环体,m<6为条件表达式,m=m+2的次数少于m<6)
2. 执行流程举例
比如说:我们设定m>6,m=m+3,则体现的语法形式为

while(m<6)//控制(条件)表达式
 m = m + 2;//循环体(若需要多条语句,需要添加花括号构成复合语句)

分析:m<6为真,值不为0;m > 6为假,值为0。当值为假的时候,循环才会终止。我们m的现在值都<6,故为真,参与循环;若当m的现在值等于7的时候,故为假,终止循环。
跟踪执行情况:(注意:此处的m=m+2可以写成m++ = 2)

  • m = 1 ; —> m现在值为1
  • m < 6成立吗?–> 成立,继续。
  • m = m + 2 ; —>m现在值为3
  • m < 6成立吗?—> 成立,继续。
  • m = m + 2 ; —> m现在值为 5。
  • m < 6成立吗? —>成立,继续。
  • m = m + 2; —> m现在值为7 。
  • m < 6 成立吗? —> 不成立,退出循环。
  1. 详解示例:在屏幕上打印1~10的值。
    代码1:给变量赋值为0的情况–》int i = 0
#include<stdio.h>
int main()
{
	int i = 0;
	while (i < 10)
	{
	    i++;//123456789 10 (位置1)
		printf("%d\n", i);
	    //i++;//0123456789 (位置2)
	}
	return 0;
}

位置1 :给变量赋值为0:int i = 0–》先 i++ ,则i++ = 1,打印值为1
位置2:给变量赋值为0:int i = 0 --》先打印,再i++ = 1,打印值为0(不符合条件)
思考:如何让位置2满足题目要求。可修改为
代码2:给变量赋值为1的情况

#include<stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		printf("%d\n", i);
		i++;
	}
	return 0;
}

总结规律:打印( i>=1 && i<=n)
int i = 0 ,i<n,–>先i++,在打印;–》给变量赋值为0,无等于号
int = 1 ,i <=n,–>先打印,再i++;–》给变量赋值为1,有等于号

  1. 无限循环:除非循环体中含有跳出循环控制的语句(break,goto,return),否则while语句将永远执行下去。
    形式:
while(1)...

do while循环

  1. 格式:
do 
   语句 
while (表达式)//此行括号右面没有分号
  1. 执行方法:先执行循环体,再根据表达式进行判定,表达式为真,执行循环体;表达式为假,循环终止。
  2. do while循环与while 循环的区别:do… while 的循环体至少执行一次,而while 循环在控制表达式初始为0时,会完全跳过循环体。
  3. 示例:使用 do while 在屏幕上打印1~10的数字
#include<stdio.h>
int main()
{
	int i = 1;
	do
	{ 
		printf("%d\n", i);
		i++;
	} while (i <= 10);
		return 0;
}

for循环

  1. 格式
for(表达式1;表达式2;表达式3) 
    语句;//若循环体想包含更多的语句,可以加上大括号。

格式分析:

  • 表达式1 :用于循环变量进行初始化(只执行1次)
  • 表达式2 : 用于循环结束条件的判断(控制循环的终止)(表达式2的值不为0,循环持续进行)。
  • 表达式3 用于循环变量的调整
  1. 示例:在屏幕上打印1-10数字
#include<stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		printf("%d\n", i);

	}
	return 0;
}
  1. for语句中的惯用法(此结论可迁移到while 循环中)
  • 从0向上加到n-1: for(i = 0 ;i < n ; i++)…
  • 从1向上加到n: for(i = 1 ; i < = n ; i --)…
  1. 注意:for ()后面不要加分号!!!

退出循环

break 语句和continue语句

1.break语句 作用: 永久终止循环,只要break被执行,直接就会跳出循环,继续往后执行。
2.continue语句作用: 跳出本次循环中continue后边的代码,在for循环和while循环中有所差异。
3.while循环中的break和continue

  • break语句:
#include<stdio.h>
int main()
{
	int i = 1;
	while (i <= 8)
	{
		if (i == 6)
			break;
		printf("%d", i);//12345
		i++;
	}
	return 0;
}

(1)解释代码:

  • 我们首先初始化值为1,当i = 1时,满足控制表达式 i<=8,则进入循环。因为 i=1,不等于6,所以直接打印i的值为1;再i++得到i=2,重新进入循环,分别打印出2345;当i= 6时,终止整个循环。
    (2)结果为12345

  • continue语句:

#include<stdio.h>
int main()
{
	int i = 1;
	while (i <= 8)
	{
		if (i == 6)
			continue;
		printf("%d", i);//12345
		i++;
	}
	return 0;
}

(1)结果显示:12345(5的后面有光点闪烁,此时程序已经死循环了)
(2)解释代码:当i = 1–>满足i<=8–>i 不等于6–>打印1–>i ++ -->i = 2—>满足i< = 8 —>i 不等于6–>打印2–>i++ -->i = 3–>…当i = 6 时,无法打印,因为continue已经跳出本次循环,打印和i++这两个语句被跳过,不再执行,又回到了6<=8,重复以上过程,我们会发现,i 是没有机会变成7的,它一直都是6。
(3) 思考:如何才能让程序出现1234578。
(4) 修改:第一步,将i++位置转移到continue语句的上面。—》得到结果2345789。第二步,int i = 0,这样就会从1开始打印。—》得到结果12345789。第三步,修改表达式的范围i<=8–》i < 8。
代码:

#include<stdio.h>
int main()
{
	int i = 0;
	while (i < 8)
	{
		i++;
		if (i == 6)
			continue;
		printf("%d", i);//1234578
		
	}
	return 0;
}

(5)总结:continue语句并不是彻底的终止循环,而是仅仅跳过i==6这一次continue后面的代码,不再执行,直接判断部分,进行下一次判断。
4.for 循环中的break和continue对比:

请添加图片描述

5.do while 循环中的break和continue对比:
在这里插入图片描述

注:continue–>12345(5循环)

goto 语句

  1. 什么是goto语句?
    goto语句可以让我们的代码跳转到我们设计的标号里面(跳转代码)。
    2.goto语句的缺点:若使用不当,在函数内部乱转,打乱程序的执行流程。
    3.goto语句的优点:相对于break 语句,在多层循环代码中,可以迅速跳出。
    4.代码示例:
    goto语句的位置可以放在开头,中间,结尾。
    示例1:
#include<stdio.h>
int main()
{
	printf("hello\n");
	if (1)          //条件成立
		goto end;
		          //hello classmate
	printf(" Mr white\n");

end:
	printf("classmate\n");//hello classmate

	return 0;

}

示例2:

#include<stdio.h>
int main()
{
	goto again;
	printf("天气晴朗\n");
again:
	printf("天气阴\n");//天气阴

	return 0;
}

示例3:

#include<stdio.h>
int main()
{
again:
	printf("you are great!\n");//死循环打印you are great!
	goto again;
	 
	return 0;
}

.goto语句的优点:相对于break 语句,在多层循环代码中,可以迅速跳出。
4.代码示例:
goto语句的位置可以放在开头,中间,结尾。
示例1:

#include<stdio.h>
int main()
{
	printf("hello\n");
	if (1)          //条件成立
		goto end;
		          //hello classmate
	printf(" Mr white\n");

end:
	printf("classmate\n");//hello classmate

	return 0;

}

示例2:

#include<stdio.h>
int main()
{
	goto again;
	printf("天气晴朗\n");
again:
	printf("天气阴\n");//天气阴

	return 0;
}

示例3:

#include<stdio.h>
int main()
{
again:
	printf("you are great!\n");//死循环打印you are great!
	goto again;
	 
	return 0;
}
  • 27
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值