C语言---判断与循环

本文详细介绍了C语言中的关系运算符和逻辑运算符,包括短路求值的概念。接着讲解了各种循环结构,如if语句的三种形式,switch语句的使用,以及do...while和while语句。同时,探讨了for语句的灵活性和循环嵌套的应用,以及break和continue语句在控制流程中的作用。文章还通过实例展示了如何根据条件和流程图编写相应的C语言代码。

  • 有固定次数,用for
  • 如果必须执行一次,用do-while
  • 其他情况用while

关系运算符和逻辑运算符

关系运算符

在 C 语言中,使用关系运算符来比较两个数的大小关系。
在这里插入图片描述
关系运算符得到的值是逻辑值,逻辑值就是只有真或者假(C语言用1表示真,0表示假)

关系表达式

用关系运算符将两边的变量、数据或表达式连接起来,称之为关系表达式
eg:1 < 2 ; a > b ; a < = 1 + b;

#include <stdio.h>

int main()
{
	int a = 5, b = 3;
	
	printf("%d\n",1 < 2);
	printf("%d\n",a > b);
	printf("%d\n",a <= b + 1);
	printf("%d\n",'a' + 'b' <= 'c');
	printf("%d\n",(a=3) > (b=5));
}

结果如下:
在这里插入图片描述

逻辑运算符

C 语言总共提供了三种逻辑运算符:
在这里插入图片描述

逻辑表达式

用逻辑运算符将两边的变量、数据或表达式连接起来,称之为逻辑表达式:

#include <stdio.h>

int main()
{
	int a = 5, b = 3;
	printf("%d\n",3 > 1 && 1 < 2);
	printf("%d\n",3 + 1 || 2 == 0);
	printf("%d\n",!(a + b));
	printf("%d\n",!0 + 1 < 1 || !(3 + 4));
	printf("%d\n",!'a' - 'b' && 'c');
	
	return 0;
}

结果如下:
在这里插入图片描述

短路求值

短路求值又称最小化求值,是一种逻辑运算符的求值策略。只有当第一个运算数的值无法确定逻辑运算的结果时,才对第二个运算数进行求值。

C 语言对于逻辑与和逻辑或采用短路求值的方式。

#include <stdio.h>

int main()
{
	int a = 3,b = 3;
	
	(a = 0) && (b = 5);
	printf("a = %d, b = %d\n",a,b);
	
	(a = 1) && (b = 5);
	printf("a = %d, b = %d\n",a,b);
	
	return 0;
}

结果如下:
在这里插入图片描述
&&:只要左边的不成立,右边的就不会再对其进行运算
| |: 左边或者右边任何一边成立即可

if语句

if语句实现形式

第一种:
…… // 其它语句
if (表达式)
{
    …… // 逻辑值为真所执行的语句、程序块
}
…… // 其它语句
第二种:
…… // 其它语句
if (表达式)
{
    …… // 表达式的逻辑值为真所执行的语句、程序块
}
else
{
    …… // 表达式的逻辑值为假所执行的语句、程序块
}
…… // 其它语句
第三种:
…… // 其它语句
if (表达式1) 
{
    …… // 表达式 1 的逻辑值为真所执行的语句、程序块
}
else if (表达式2)
{
    …… // 表达式 2 的逻辑值为真所执行的语句、程序块
}
else if (表达式3)
{
    …… // 表达式 3 的逻辑值为真所执行的语句、程序块
}
  .
  .
  .
else if (表达式n)
{
    …… // 表达式 n 的逻辑值为真所执行的语句、程序块
}
else
{
    …… // 上面所有表达式的逻辑值均为假所执行的语句、程序块
}
…… // 其它语句

练习:帮数学老师做一个按分数评级的程序

#include <stdio.h>

int main()
{
	int i;
	
	printf("请输入分数: ");
	scanf("%d",&i);
	
	if(i>=90)
	{
		printf("A\n");
	}
	else if(i>=80&&i<90)
	{
		printf("B\n");
	}
	else if(i>=70&&i<80)
	{
		printf("C\n");
	}
	else if(i>=60&&i<70)
	{
		printf("D\n");
	}
	else
	{
		printf("E\n");
	}
	
	return 0;
	
	
}

结果如下:
在这里插入图片描述
在这里插入图片描述

switch语句和分支嵌套

switch语句

处理多分支结构,可以考虑使用语法更简便的 switch 语句

…… // 其它语句
switch (表达式)
{
        case 常量表达式 1: 语句或程序块;
        case 常量表达式 2: 语句或程序块;
        ……
        case 常量表达式 n:语句或程序块;
        default: 语句或程序块;
}
…… // 其它语句
#include <stdio.h>

int main()
{
	char ch;
	
	printf("请输入成绩:");
	scanf("%c",&ch);
	
	switch(ch)
	{
		case'A':printf("您的成绩在90分以上!\n");break;
		case'B':printf("您的成绩在80~90分之间!\n");break;
		case'C':printf("您的成绩在70~80分之间!\n");break;
		case'D':printf("您的成绩在60~70分以上!\n");break;
		case'E':printf("您的成绩在60分以下!\n");break;
		default:printf("请输入有效的成绩!\n"); 
	} 
	 return 0;
	
 } 

结果如下:
在这里插入图片描述
在这里插入图片描述

  • 每个 case 后边的常量是匹配 switch 后边表达式的值
  • case 后边必须跟一个常量值,而不能是一个范围
  • 如果所有的 case 均没有匹配的,那么执行 default 的内容
  • default 是可选的,如果没有 default,并且所有的 case 均不匹配,那么 switch 语句不执行任何动作
  • 使用break语句跳出。当 switch 跳到某个位置之后,就会一直往下执行,所以我们这里还需要配合一个 break 语句,让代码在适当的位置跳出 switch。

分支结构的嵌套

如果在一个 if 语句中包含另一个 if 语句,我们就称之为 if 语句的嵌套,也叫分支结构的嵌套。
在这里插入图片描述

根据流程图写代码

练习:两个数a和b的大小比较

#include <stdio.h>

int main(){
	int a,b;
	printf("请输入两个整数a和b:");
	scanf("%d %d",&a,&b);
	
	if(a!=b)
	{
		if(a>b)
		{
			printf("%d > %d\n",a,b);		
		}
		else
		{
		    printf("%d < %d\n",a,b);	
		}
	}
	else
	{
		printf("%d = %d\n",a,b);
	}
	
	return 0;
}

结果如下:
在这里插入图片描述
在这里插入图片描述

  • 在 C 语言中使用等号(=)作为赋值运算,使用连续两个等号(==)作为比较运算。
  • 一般而言,赋值运算相对于比较运算出现得更频繁,因此字符较少的 = 就被赋予了更常用的含义——赋值操作。此外,在 C 语言中赋值符号被作为一种操作符对待,因而重复进行赋值操作(如 a = b = c)可以很容易地书写,并且赋值操作还可以被嵌入到更大的表达式中

分支嵌套

while语句

while (表达式)
        循环体

例子1:计算1+2+3+…+100的结果

#include <stdio.h>

int main(){
	int i=1,sum=0;
	
	while(i<=100)
	{
		sum=sum+i;
		i=i+1;
	}
	printf("结果是:%d\n",sum);
	
	return 0;
	
}

结果如下:
在这里插入图片描述
例子2:统计从键盘输入的一行英文句子的字符个数

#include <stdio.h>

int main()
{
	int count = 0;
	printf("请输入一行英文字符:\n");
	
	
	while(getchar()!='\n')
	{
		count = count + 1;
	}
	printf("您总共输入了%d个字符\n",count);
	
	
	return 0;
}

结果如下:
在这里插入图片描述

  • getchar( ):从标准输入流里面读取下一个字符。

do…while语句

do
    循环体
while (表达式);
  • 注意:do…while 语句在 while 后边一定要用分号(;)表示语句结束。

  • while 是先判断表达式,如果表达式结果为真,才执行循环体里边的内容;

  • 而 do…while 则相反,不管三七二十一,先执行循环体的内容再判断表达式是否为真。

例子:计算1+2+3…+100

#include <stdio.h>

int main()
{
	int i=1,sum=0;
	
	do
	{
		sum=sum+i;
		i=i+1;
		
	}
	while(i<=100);
	printf("结果是:%d\n",sum);
	
	return 0;
}

结果如下:
在这里插入图片描述

for语句和循环嵌套

在这里插入图片描述

循环的基本结构

通常每一个循环都涉及三个步骤:

  • 初始化计数器
  • 判断循环条件是否满足
  • 更新计数器

for语句

for (表达式1; 表达式2; 表达式3)
        循环体

三个表达式用分号隔开,其中:

  • 表达式1是循环初始化表达式
  • 表达式2是循环条件表达式
  • 表达式3是循环调整表达式

练习:

#include <stdio.h>

int main()
{
	int count;
	for(count = 0 ; count < 10 ; count++)
	{
		printf("LOVE YOU\n");
	}
	return 0;
	
}

结果如下:
在这里插入图片描述

写一个程序:判断一个数是否为素数

#include <stdio.h>
#include <stdbool.h>

int main()
{
	int i,num;
	_Bool flag = 1;
	
	printf("请输入一个整数:\n");
	scanf("%d",&num);
	
	for(i = 2; i < num/2; i++)
	{
		if(num % i == 0)
		{
			flag = 0;
		}
	}
	if(flag)
	{
		printf("%d是一个素数!\n",num);
	}
	else
	{
		printf("%d不是一个素数!\n",num);
	}
	
	
	return 0;
}

结果如下:
在这里插入图片描述
在这里插入图片描述

for语句的灵活应用

for语句可以按照需求对表达式进行省略

  • for ( ; 表达式2; 表达式3)
  • for (表达式1; 表达式2; )
  • for (表达式1; ; )
  • for ( ; ; )

上述第四种情况等同于:
while(1) 永远为真
{

}

C99运行在for语句的表达式1中定义变量

#include <stdio.h>

int main()
{
		int i,j;
		
        for (i=0, j=10; i < j; i++, j--)
        {
                printf("%d\n", i);
        }

        return 0;
}

结果如下:
在这里插入图片描述

循环嵌套

  • 循环结构跟分支结构一样,都可以实现嵌套。

  • 对于嵌套的循环结构,执行顺序是从内到外:先执行内层循环,再执行外层循环。

#include <stdio.h>

int main()
{
	int i,j;
	
	for(i=0;i<3;i++)
	{
		for(j=0;j<3;j++)
		{
			printf("i=%d,j=%d\n",i,j);
		}
	}
	return 0;
}

结果如下:
在这里插入图片描述
练习:打印一个九九乘法表

#include <stdio.h>

int main()
{
	int i,j;
	
	for(i=1;i<=9;i++)
	{
		for(j=1;j<=9;j++)
		{
			printf("%d * %d = %-2d  ",i,j,i*j);
		}
		putchar('\n');
	}
	
	
	return 0;
}

结果如下:
在这里插入图片描述

break语句

在循环体中,我们想要程序跳出循环,可以使用break语句

#include <stdio.h>

int main()
{
	int i,j;
	for(i=0;i<10;i++)
	{
		for(j=0;j<10;j++)
		{
			if(j==3)
			{
				break;
			}
		}
	}
	
	printf("i=%d,j=%d\n",i,j);
 } 

结果如下:
在这里插入图片描述

continue语句

  • 当满足某个条件的时候,跳过本轮循环的内容,直接开始下一轮循环。这时候我们应该使用 continue 语句。

  • 当执行到 continue 语句的时候,循环体的剩余部分将被忽略,直接进入下一轮循环。

  • 对于嵌套循环来说,continue 语句跟 break 语句是一样的:它们都只能作用于一层循环体。

#include <stdio.h>

int main()
{
	int ch;
	
	while((ch = getchar()) != '\n')
	{
		if(ch == 'C')
		{
			continue;
		}
		putchar(ch);
	}
	putchar('\n');
	
	return 0;
	
}

结果如下:
在这里插入图片描述

for 语句和 while 语句执行过程的区别

  • for 语句和 while 语句执行过程是有区别的,它们的区别在于出现 continue 语句时。

  • 在 for 语句中,continue 语句跳过循环的剩余部分,直接回到调整部分。

  • 在 while 语句中,调整部分是循环体的一部分,因此 continue 语句会把它也跳过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值