C语言-分支和循环

目录

if 语句

else

嵌套 if

悬空else问题

关系操作符

条件操作符

逻辑操作符:&&,||,!

短路:

switch语句

while循环

if与while对比

while循环练习

for循环

for循环的执行流程

while循环与for循环的对比

do while循环

do while 循环的例子

break 和 continue语句

while循环中的break和continue

break举例

continue举例

for 循环中break和continue

break举例

continue举例

循环的嵌套

goto语句

C语言是结构化的程序设计语言,支持三种结构:顺序结构、选择结构、循环结构。

我们可以使用 if 、switch实现分支结构,使用 for、while、do while实现循环结构

if 语句

语法形式:

if(表达式)

     语句

表达式成立为真(非0)、则语句执行。表达式不成立为假(0),则语句不执行。

#include <stdio.h>
//输入一个整数,判断是否为奇数
int main()
{
	int num = 0;
	//输入
	scanf("%d", &num);
	//判断
	if (num % 2 == 1)//==  是判断相等    = 是赋值
		printf("%d 是奇数\n", num);

	return 0;
}

else

如果任意一个整数,要判断是奇数还是偶数怎么表示呢?就需要用  if else 语句

语法形式

If (表达式)

    语句1

else

     语句2

eg:输入一个整数,判断是否为奇数,如果是奇数打印奇数、否则打印偶数。

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

输入一个年龄,>=18岁就输出:成年,否则就输出未成年

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

if 语句只能控制一条语句,那如果我们要if同时控制两条语句怎么办呢?那我们就使用{}把它括起来

嵌套 if

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

eg:要求输入一个整数,判断输入的整数是0、还是正数或者负数。

//一种表示
#include <stdio.h>
int main()
{
	int num = 0;
	scanf("%d", &num);
	if (num == 0)
		printf("输入的数字是0\n");
	else if (num > 0)//这里的if相当于嵌套在else语句中,形成了嵌套结构
		printf("输入的函数是正数\n");
	else
		printf("输入的函数为负数\n");

	return 0;
}

//另一种表示
int main()
{
	int n = 0;
	scanf("%d", &n);
	if (n >= 0) //> ==0
	{
		if (n == 0)
			printf("输入的值是0\n");
		else
			printf("输入的值是正数\n");
	}
	else
	{
		printf("输入的值是负数\n");
	}

	return 0;
}

练习:输入一个人的年龄,如果年龄<18岁,打印"少年",如果年龄在18岁至44岁打印"青年",如果年龄在45岁至59岁打印"中老年",如果年龄在60岁至89岁打印"老年",如果90岁及以上打印"老寿星"

#include <stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	//判断
	if (age < 18)
		printf("少年\n");
	else //>=18
	{
		if (age <= 44)
			printf("青年\n");
		else //>44
		{
			if (age <= 59)
				printf("中老年\n");
			else //>=60
			{
				if (age <= 89)
					printf("老年\n");
				else
					printf("老寿星\n");
			}
		}
	}
	return 0;
}

或者也可以用更简洁的写法

#include <stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	//判断
	if (age < 18)
		printf("少年\n");
	else if (age <= 44) //18~44
		printf("青年\n");
	else if (age <= 59)//45~59
		printf("中老年\n");
	else if (age <= 89)//60~89
		printf("老年\n");
	else  //>=90
		printf("老寿星\n");

	return 0;
}

悬空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 语句对齐,让我们以为 else 是和第一个if匹配的,当 if 语句不成立的时候,自然想到的就是执行else 子 句,打印 haha ,但实际上 else 是和第二个 if 进行匹配的,这样后边的 if...else 语句是嵌套在第一个 if 语句中的,如果第一个 if 语句就不成立,嵌套 if else 就没机会执行 了,最终啥都不打印。
这就是悬空else问题,如果有多个if和else,可以记住: else总是跟最接近的if 匹配

关系操作符

C语言中用于比较的表达式,称为“关系表达式”,里面使用的运算符就称为“关系运算符”
        >大于运算符

        <

小于运算符
       >=大于等于运算符
       <=小于等于运算符
       ==相等运算符
      ! =

不相等运算符

关系表达式通常返回01,表示真假,关系表达式常用语if 或 while结构。

注:相等运算符== 与 赋值运算符 = 是两个不一样的运算符,不要混淆。

      多个关系运算符不宜连用。(i<j<k),这种写法不对,i<j 返回 0或 1,最终是0 或 1与k 作比较,如果要判断变量j的值是否在 i 和 k 之间,应该写成应该写成(i<j&&j<k

eg:输入一个年龄在18-36岁之间,输出为青年。

条件操作符

条件操作符也叫三目操作符,需要接受三个操作数。形式为:

exp1 ?exp2 :exp3

如果exp1为真,exp2计算,计算结果是整个表达式的结果·;

如果exp1为假,exp3计算,计算结果是整个表达式的结果。

int main()
{
    int a = 0;
    int b = 0;
    scanf("%d", &a);
    if (a > 5)
        b = 3;
    else
        b = -3;
    printf("%d\n", b);
	return 0;
}

改造后

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

练习:使用条件表达式实现找两个数中较大值

int main()
{
	int a = 0;
	int b = 0;
	//输入
	scanf("%d%d", &a, &b);
	int m = 0;
	//if (a > b)
	//	m = a;
	//else
	//	m = b;

	m = (a > b ? a : b);
	printf("%d\n", m);

	return 0;
}

逻辑操作符:&&,||,!

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

短路:

C语言逻辑运算符还有一个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是 保证的。 如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。 这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值
上式中a++||++b相当于0||3,结果为真(1),所以就不需要计算后面的||d++就可以知道输出 i=1
总结:&& 左边为假 右边无需计算 整体为假
            ||   左边为真 右边无需计算 整体为真

switch语句

switch 语句是⼀种特殊形式的 if...else 结构,用于判断条件有多个结果的情况。它把多重的 else if 改成更易用、可读性更好的形式。
switch (expression)
{
          case value1: statement
          case value2: statement
          default : statement
}
switch中的default
在使用 switch 语句的时候,我们经常可能遇到⼀种情况,比如 switch 后的表达式中的值无法匹配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加入default子句。 switch 后边的 expression 的结果不是 value1 ,也不是 value2 的时候,就会执行 default 子
注: switch 后的 expression 必须是 整型表达式
case 后的值,必须是 整形常量表达式
练习:输入任意一个整数值,计算除3之后的余数
#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	switch (n % 3)
	{
	case 0:
		printf("整除了,余数是0\n");
		break;
	case 1:
		printf("余数是1\n");
		break;
	case 2:
		printf("余数是2\n");
		break;
	}

	return 0;
上述的代码中,我们要注意的点有:
case 和后边的数字之间必须有空格 ;
每一个 case 语句中的代码执行完成后,需要加上 break ,才能跳出这个switch语句。
switch语句中的break
如果某一个 case 语句的后边没有 break 语句,代码会继续往下执行,有可能执行其他 case 语句中的代码,直到遇到 break 语句或者 switch 语句结束
练习: 输入一个1~7的数字,打印对应的星期几。
#include <stdio.h>
int main()
{
	int day = 0;
	//输入
	scanf("%d", &day);
	switch (day)
	{
	case 1:
		printf("星期1\n");
		break;
	case 2:
		printf("星期2\n");
		break;
	case 3:
		printf("星期3\n");
		break;
	case 4:
		printf("星期4\n");
		break;
	case 5:
		printf("星期5\n");
		break;
	case 6:
		printf("星期6\n");
		break;
	case 7:
		printf("星期天\n");
		break;
	}
	return 0;
}

如果输入变化,变为:输入:1~5,输出:工作日  输入6~7,输出:休息日

#include <stdio.h>
 int main()
{
	int day = 0;
	//输入
	scanf("%d", &day);
	switch (day)
	{
	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;
}

while循环

C语言提供了3种循环语句, while 就是其中一种,接下来就介绍一下 while 语句。 while 语句的语法结构和 if 语句非常相似。

if与while对比

if ( 表达式 )
 语句 ;
while ( 表达式 )
 语句 ; // 如果循环体想包含更多的语句,可以加上大括号
// 代码 1
# include <stdio.h>
int main ()
{
     if ( 1 )
      printf ( "hehe\n" ); //if 后边条件满足,打印⼀次 hehe
return 0 ;
}
// 代码 2
# include <stdio.h>
int main ()
{
      while ( 1 )
         printf ( "hehe\n" ); //while 后边的条件满足,死循环的打印 hehe
return 0 ;
}

这就是他们的区别,while语句是可以实现循环效果的。

 while语句执行流程

首先上来就是执行判断表达式,表达式的值为0(假),循环直接结束;表达式的值不为0(真),则执行循环语句,语句执行完后再继续判断,是否进行下一次判断。

while循环练习

在屏幕上打印1~10的值
输入一个正的整数,逆序打印这个整数的每⼀位
例如:
输入:1234,输出:4 3 2 1
输入:521,输出:1 2 5
int main()
{
 int n = 0;
 scanf("%d", &n);//123

 while (n)
 {
	 printf("%d ", n % 10);//获取一个数的最低位
	 n = n / 10;//去掉一个数的最低位
 }

 return 0;
}

题目解析:

1. 要想得到n的最低位,可以使用n%10的运算,得到的余数就是最低位,如:1234%10得到4 ;

2.要想去掉n的最低位,找出倒数第二位,则使用 n=n/10 操作就可以去掉最低位的,如:n=1234/10得到123,123相较于1234就去掉了最低位,123%10就得到倒数第二位3。

3.循环1和2两个步骤,在n变成0之前,就能到所有的位

for循环

for ( 表达式 1 ; 表达式 2 ; 表达式 3 )
语句; // 如果循环体想 包含更多的语句,可以加上大括号
表达式1 用于循环变量的初始化
表达式2 用于循环结束条件的判断
表达式3 用于循环变量的调整

for循环的执行流程

首先执行表达式 1 初始化循环变量,接下来就是执行表达式 2 的判断部分,表达式 2 的结果如果 ==0,则循环结束;表达式2 的结果如果!=0,则执行循环语句,循环语句执行完后,再去执行表达式3,调整循环变量,然后再去表达式 2 的地方执行判断,表达式 2 的结果是否为0,决定循环是否继续。整个循环的过程中,表达式1初始化部分只被执行1次,剩下的就是表达式2、循环语句、表达式3在循环。

while循环与for循环的对比

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

练习:计算1~100之间的3的倍数的数字之和


#include <stdio.h>
int main()
{
	int i = 0;
	int sum = 0;
	for (i = 1; i <= 100; i++)
	{
		if (i % 3 == 0)
			sum += i;
	}
	printf("%d\n", sum);
	return 0;
}
//⼩⼩的优化
//如果能直接产⽣3的倍数的数字就省去了多余的循环和判断
int main()
{
	int i = 0;
	int sum = 0;
	for (i = 3; i <= 100; i += 3)
	{
		sum += i;
	}
	printf("%d\n", sum);
	return 0;
}

do while循环

在循环语句中 do while 语句的使用最少,它的语法如下:

do

        语句;

while(表达式)

while 和for这两种循环都是先判断,条件如果满足就进入循环,执行循环语句,如果不满足就跳出循环;而do while 循环则是先直接进入循环体,执行循环语句,然后再执行while后的判断表达式,表达式为真,就会进行下一次,表达式为假,则不再继续循环。

do while循环的执行流程

在do while 循环中先执行图上的语句,执行完语句,再去执行判断表达式,判断表达式的结果是不等于0,则继续循环,执行循环语句,判断表达式的结果==0,则循环结束。所以在do while 语句中循环体是至少执行一次的,这是do while 循环比较特殊的地方。

do while 循环的例子

在屏幕上打印1~10的值

输入一个正整数,计算这个整数是几位数?

例如:

输入:1 2 3 4 输出:4

输入:12 输出:2

#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	int cnt = 0;
	do
	{
		cnt++;
		n = n / 10;
	} while (n);
	printf("%d\n", cnt);

	return 0;
}

break 和 continue语句

C语言提供了break 和continue关键字应用到循环中

break的作用是用于永久的终止循环,只要breeak被执行,直接就会跳出循环,继续往后执行。

continue的作用是跳过本次循环,continue后面的代码在for循环和while循环中有所差异。

while循环中的break和continue

break举例

打印了1 2 3 4后,当i等于5的时候,循环在break的地方终止,不在打印、不在循环。所以break的作用就是永久的终止循环,只要break被执行,break外的第一层循环就终止了。

continue举例

continue是继续的意思,在循环中的作用是跳过本次循环中continue后边的代码,继续进行下一次循环的判断。

continue 可以帮助我们跳过某⼀次循环 continue 后边的代码,直接到循环的判断部分,进行下一次 循环的判断 ,如果循环的调整是在 continue 后边的话,可能会造成死循环。

for 循环中break和continue

break举例

这里的break的作用和在while循环里的作用是一样的,都是为了终止循环的。

continue举例

for 循环中 continue 的作用是跳过本次循环中 continue 后的代码,直接去到循环的 调整部分 。未来当某个条件发生的时候,本次循环无需再执行后续某些操作的时候,就可以使用continue 来实现

do while 循环的break和continue的作用几乎和while一模一样。

循环的嵌套

while ,do while, for,这三种循环往往嵌套在一起才能更好的解决问题。

练习:打印100~200之间的素数

注:素数又称质数,只能被1和它本身整除。

题目解析:

要从100到200之间找出素数,首先得有100~200之间的数,这里可以使用循环解决问题。

若要判断i是否为素数,需拿 2~i-1之间的字试除 i,需要产生2~i-1之间的数字,也可用循环解决。

如果2~i-1之间有数字能整除i,则不是素数,如果都不能整除,则是素数。

//100~200之间的素数
#include <stdio.h>
int main()
{
	int i = 0;
	//循环产生100~200之间的数字
	for (i = 100; i <= 200; i++)
	{//判断i是否为素数
		//循环产生2~i-1之间的数字
		int j = 0;
		int flag = 1;//假设i是素数
		for (j = 2; j < i; j++)
		{
			if (i % j == 0)
			{
				flag = 0;
			    break;
		}
	}
	if (flag == 1)
		printf("%d\n", i);
}

	return 0;
}

goto语句

C语言提供了一种非常特别的语法,就是goto语句和跳转标号,goto语句可以实现在同一个函数内跳转到设置好的标号处。

eg:

goto语句使用不当可能会导致在函数内部随意乱跳转,会扰乱程序的执行流程,所以建议尽量不去使用。但在多层循环的代码中,如果想快速跳出,使用goto就非常方便。 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值