当前位置:网站首页>4.分支语句和循环语句

4.分支语句和循环语句

2022-07-06 09:20:00 是王久久阿

在之前学习的C语言中,都是顺序结构的,各语句是按自上而下的顺序执行的,语句之间的衔接不需要判断,执行完上一条语句自动执行下一条语句。但是在实际中,需要根据是否满足某个条件,以此来决定是否执行程序或是选择执行某一个程序。C语言中有着丰富的控制语句,控制语句可分为三大类:

1.条件判断语句(分支语句):if语句、switch语句;

2.循环执行语句:while语句、for语句、do while语句;

3.转向语句:return语句、break语句、continue语句、goto语句。

目录

分支语句

(1)if语句

if语句的一般结构

if语句的使用

(2)switch语句

switch语句的一般格式

switch语句的使用

循环语句

(1)while语句

while语句的一般结构

while语句中的break和continue

(2)for语句

for语句的一般结构

for语句中的break和continue

for语句的使用技巧

(3)do...while语句

do...while语句的一般结构

do...while语句中的break和continue

goto语句


分支语句

在现实中有很多需要进行判断和选择的情况。

例如:参加考试,如果我们考试前选择好好学习,就能取得好成绩;如果选择不学习,只能参加补考;如果选择作弊,则会被学校开除。

(1)if语句

  • if语句的一般结构

     a.                                                     b.                                                       c.

     if(表达式)                                    if(表达式)                                      if(表达式1)

              语句;                                               语句;                                                    语句;

                                                             else                                                   else if(表达式2)

                                                                     语句;                                                    语句;

                                                                                                                       else 

                                                                                                                                  语句;

  • 如果表达式为真则执行,为假则不执行。C语言中0表示非0表示。因此,if(1)必执行,if(0)必不执行。
  • 如果语句是多段语句,那么需要用大括号括起来,括起来的部分为一个代码块。(为了养成良好的习惯,最好都要用大括号括起来)

                                                                                         

  • if语句的使用

输入一名学生的数学考试成绩,判断不及格、及格、良好、或是优秀。

#include<stdio.h>
int main()
{
	int math = 0;
	scanf("%d", &math);
	if (math >= 0 && math < 60)//&&为逻辑与操作符,当操作符两边都为真时则执行,有一个不为真则不执行
	{
		printf("不及格\n");
	}
	else if (math >= 60 && math < 70)
	{
		printf("及格\n");
	}
	else if (math >= 70 && math < 90)
	{
		printf("良好n");
	}
	else if (math >= 90 && math <= 100)
	{
		printf("优秀\n");
	}
	else
		printf("输入错误\n");

		return 0;
}

  • &&为逻辑与操作符,当操作符两边都为真时则执行,有一个不为真则不执行。
  • (math >= 0 && math < 60)可以理解为:分数大于等于0分并且小于60分
  • ||为逻辑或操作符,操作符两边只要有一个为真则执行,如果都为假则不执行。
  • (math < 60 || math > 90)可以理解为:分数小于60分或者大于90分

不同卷面总分不一样,所对应的标准也不同,可以运用我们之前学过的用#define定义的常量来表示,这样可以大大减少修改代码时的任务量。

例如:

#include<stdio.h>

#define 及格 60
#define 良好 70
#define 优秀 90
#define 满分 100

int main()
{
	int math = 0;
	scanf("%d", &math);
	if (math >= 0 && math < 及格)
	{
		printf("不及格\n");
	}
	else if (math >= 及格 && math < 良好)
	{
		printf("及格\n");
	}
	else if (math >= 良好 && math < 优秀)
	{
		printf("良好\n");
	}
	else if (math >= 优秀 && math <= 满分)
	{
		printf("优秀\n");
	}
	else
		printf("输入错误\n");

	return 0;
}

C语言中的运算符:

C语言中的加减乘与我们日常理解的一致、除略有所差异。如果是两个整数相除,所得的结果为两数相除的

例如:5/2=2 。想要小数结果,只需要将其中一个整数改为小数结构即可,例如:5.0/2=2.5 。

此外,C语言中还有取模运算符%,取模就是取余数,例如5%2=1,这个1就是5除以2的余数。     

判断一个数是否为奇数。

#include<stdio.h>

int main()
{
	unsigned int num = 0;//无符号整型
	scanf("%d", &num);

	if (num % 2 == 1)
	{
		printf("是奇数\n");
	}
	else
	{
		printf("不是奇数\n");
	}
	return 0;
}

因为只有正整数才有奇偶的概念,并且0也规定到偶数中。所以我们可以设置一个无符号整型来存放变量num。在正整数中不是奇数,就必定是偶数,所以当我们对奇数判断完成后,偶数部分不用再去判断了。

注:

  • == 为判断是否相等操作符,(num % 2 == 1)的意思为:判断num%2的余数是否等于1 。
  • 当if语句的表达式中只有一个等号时,便不再是判断,而是赋值了,很多bug来源于此。
  • 例如:if(a=1)则表示为将1的值赋给a,因为1是非0,所以if条件必执行 。                                                                                            

输出1到100之间的奇数。

#include<stdio.h>

int main()
{
	int num = 1;
	while (num <= 100)
	{
		if (num % 2 == 1)
		{
			printf("%d ", num);
			num++;//与num=num+1同理
		}
		else
			num++;
	}
	
	return 0;
}

因为if是条件判断语句,打印1到100之间的奇数需要用到循环,这里可以使用while循环,while循环下面会讲到。

  • a++为后置++,后置++为:先使用,再++;例如:b=a++的意思为,先将a的值赋给b,  再将a加1。

  • ++a为前置++,前置++为:先++,再使用;例如:b=++a的意思为,先将a加1,再将a的值赋给b。         

  • 不管是++a,还是a++,最终都会改变a的值。

(2)switch语句

  • switch语句的一般格式

switch(整型表达式)                        //表达式的返回值必须是整型

{

case 整型常量表达式:                 //例如case 1  case2等等...

                         语句;

                       break;                  //break执行后,将不再往下执行,跳出switch,以此来实现分支

default:                                      //defalut为缺省情况,只有当无法找到匹配项时才执行

                         语句;

}

注:

  • 标部分为一般格式,是不可缺少的。

  • switch语句的使用

输入一个正整数(1~7),来判断是星期几,如果输入超出范围,提示输入错误。

#include<stdio.h>
int main()
{
	int input = 0;
	scanf("%d", &input);
	switch (input)
	{
	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("星期日\n");
		break;
	default:
		printf("输入错误\n");
	}
	return 0;
}

假设将每次的break删除后,会怎么样?

假如我们输入4,那么编译器将会从case 4进入,并且一直往下执行。所以break才是switch实现分支的关键。

假如需求改变,输入1~5显示工作日,输入6~7显示休息日,如何实现?

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

注:        

  • 一个switch语句中只可以有一个default语句,default语句可以放在switch语句中的任何位置,但是一般推荐将default语句放在最后

循环语句

在前面介绍了顺序结构和分支结构,但是光有这两种结构是不够的,所以还需要循环结构(重复结构)。顺序结构、选择结构、循环结构是结构化程序设计的三种基本结构,是各种复杂程序构成的基本单元。

(1)while语句

在之前的学习中,判断一个数是不是奇数用到了if语句,但是if语句只能执行一次,想要打印1-100之间的奇数时,用到了while循环,我们设置了一个变量a,初始化a=1,while(a<=100),每一次循环都会判断a是不是奇数,并且a++,当a>100时,循环就跳出来了,这就是一个简单是while循环。

  • while语句的一般结构

   while(表达式)                 //表达式为真则执行,为假则不执行

{

            循环语句;                //每一次循环都要接近表达式的条件值,跳出while,否则将会死循环

}

  • while语句中的break和continue

break:while中的break会终止while的所有循环,只要遇到break,就会跳出当前while循环。

#include<stdio.h>

int main()
{
	int i = 0;
	while (i < 10)
	{
		i++;
		if (i == 5)
		{
			break;
		}
	}
	printf("%d\n", i);//打印结果为5
	return 0;
}

通过测试可以看到i的值为5,虽然5<10,但是通过break跳出了while循环。

  • 如果是多层循环嵌套,break只能跳出一层循环,想要一下子跳出多层循环可以用goto语句,后面会讲goto语句的用法。

continue:while中的continue会终止本次循环,continue后面的部分不会再执行,直接跳到while语句的判断部分。

#include<stdio.h>

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

通过测试可以看到,当i=5时,continue跳过了后面的打印,直接来到了下一次循环。

  • continue是跳出本次循环,分支语句不是循环语句,故switch里无法使用continue。

(2)for语句

for语句更加的灵活,除了可以用于循环次数确定的情况下,在循环次数不确定的时候依然适用。

  • for语句的一般结构

for(表达式1;表达式2;表达式3)         //表达式1为:初始化部分,用于初始化循环变量的。

                                                               //表达式2为:条件判断部分,用于判断循环时候终止。  

                            循环语句;                    //表达式3为:调整部分,用于循环条件的调整。

}

for语句的执行过程为:首先执行表达式1(在整个for循环中,表达式1只执行一次),然后执行表达式2,如果表达式2为假则跳出循环,如果表达式2为真则进行循环语句,然后进行表达式3。之后的循环便为:表达式2——循环语句——表达式3——表达式2的循环。

用for循环在屏幕上打印1~10个数字

#include<stdio.h>

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

i=1为初始化部分,因为打印的数字从1开始,所以将i初始化为1即可。

i<=10为判定部分,当i<=10时,执行循环语句,i>10跳出循环。

i++为调整部分,每一次循环最后将i++,越来越接近判定部分的条件值。

for循环的使用非常方便,它可以完全代替while语句。

  • for语句中的break和continue

for语句中也可以插入break和continue,并且他们的用法与while中的用法是一致的,continue的用法略有差异。

break:

#include<stdio.h>

int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", i);
		if (i == 5)
		{
			break;
		}
	}
	putchar('\n');
	return 0;
}

 当i=5时,if表达式判定为真,执行break跳出循环,最终打印1 2 3 4 5。

continue:

#include<stdio.h>

int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		if (i == 5)
		{
			continue;
		}
		printf("%d ", i);
	}
	putchar('\n');
	return 0;
}

 

这里printf函数在continue后面,当i=5时,if表达式判定为真,continue执行跳出本次循环,来到调整部分i++(while循环中的continue是直接跳到判断部分,for循环如果也跳到判断部分将会导致死循环,所以要先跳到调整部分,然后再判断)。

  • for语句的使用技巧

(1)for语句中的初始化部分、判断部分、调整部分都可以省略。

#include <stdio.h>
int main()
{
	for (;;)
	{
		printf("hello ");
	}
	return 0;
}

即使将for循环中的3个部分全部省略,代码依然可以执行,不过3个部分都省略后代码将进入死循环,无限打印“hello”。(初学时不建议省略)


(2)for循环的嵌套使用

打印九九乘法口诀表


#include<stdio.h>

int main()
{
	int i = 0;
	int j = 0;
	for (i = 1; i < 10; i++)
	{
		for (j = 1; j <= i; j++)
		{
			printf("%d*%d=%2d  ", j, i, j * i);//%2d设置域宽为2,这样就可以实现右对齐了
		}
		printf("\n");
	}
	return 0;
}

设置两个变量i和j,通过两个for循环的嵌套来实现乘法口诀表的打印。每次打印完一行,在第一个循环最后单独打印一个换行符,实现自动换行。

因为两个数的乘积有个位数也有两位数,所以为了保持口诀表的对其,我们将最后乘积的数在打印时设置%2d,即域宽为2的整型,这样就可以保持右对齐了,使口诀表更加美观。

(3)设置多个变量控制循环

#include<stdio.h>
int main()
{
	int i=0, j=0;

	for (i = 0, j = 0; i < 4 && j < 5; ++i, j+=2)
	{
		printf("hello\n");//打印3次
	}
	return 0;
}

有些稍微复杂的情况,可以设置多个变量来帮忙控制循环。上述代码一共打印三次hello,当第三次循环语句结束后,++i,j+=2,i的值为3,j的值为6,条件判断为假,结束循环。

下述代码一共将执行多少次?

#include <stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	for (i = 0, j = 0; j = 0; i++, j++)
	{
		j++;
	}
	return 0;
}

 答:0次。注意:条件判断部分为j=0,此为赋值操作,将0的值赋给j,因为0为假,结束循环。

(3)do...while语句

  • do...while语句的一般结构

    do                                                        //先做事,再判断

{

     循环语句;                                        //do...while的循环语句至少执行一次

}while(表达式);                                //循环语句结束后,再判断是否执行下一次循环

  • do...while语句中的break和continue

用法与while语句中的用法一致。

break:

#include <stdio.h>
int main()
{
	int i = 10;

	do
	{
		if (i == 5)
			break;
		printf("%d\n", i);
		i--;
	} while (i < 10);
	return 0;
}

 当i=5时遇到break,直接跳出循环。

continue:

#include <stdio.h>
int main()
{
	int i = 10;

	do
	{
		if (i == 5)
			continue;
		printf("%d\n", i);
		i--;
	} while (i < 10);
	return 0;
}

将break改为continue后,再执行代码,发现打印10 9 8 7 6后进入死循环。这是因为我们的调整部分i--在continue后面,导致循环一直卡在i=5,只需要将i--挪至continue前方即可。

goto语句

goto语句最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。
例如:一次跳出两层或多层循环。
多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。
(从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。)

设置密码的程序:输入密码然后确认密码,如果两次密码不一致则重新输入,如果两次一样则提示密码确认成功。

#include<stdio.h>
#include<string.h>

int main()
{
	char num1[10] = { 0 };//存放第一次输入密码
	char num2[10] = { 0 };//存放第二次确认密码
	printf("请设置您的密码:>");

	again:
	scanf("%s", num1);
	printf("请确认密码:>");
	scanf("%s", num2);
	if (strcmp(num1, num2)!=0)//stecmp比较两个字符串的内容
	{
		printf("输入错误,请重新设置:>");
		goto again;//这里again可以自定义,只要前后一致即可。
	}
	else
		printf("输入正确,密码已确认:>\n");
	return 0;
}

想要使用goto语句,需要为goto语句提供一个标签。例如上述代码中在scanf函数之前先设置一个again,当两次输入结果不同时,执行goto again,程序将跳到scanf函数,这里again可以自定义,只要前后的名称一样即可。goto语句可以跳至主函数的任何一个地方,这也是为何使用goto语句时bug容易出现的原因。

注:

  • strcmp是用来比较两个字符串内容的函数:使用格式为strcmp(字符串1,字符串2),返回值为整型
  • 当字符串1和字符串2的内容一致时,strcmp返回值为0
  • 当字符串1小于字符串2时,strcmp返回值<0
  • 当字符串1大于字符串2时,strcmp返回值>0。(VS编译器中小于返回-1,等于返回0,大于返回1)
  • 想要使用strcmp函数需要包含头文件<string.h>,否则编译器将会报警告“strcmp”未定义。

原网站

版权声明
本文为[是王久久阿]所创,转载请带上原文链接,感谢
https://blog.csdn.net/why1472587/article/details/124761073

随机推荐