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

1350

被折叠的 条评论
为什么被折叠?



