分支结构和循环结构
Posted 月之暗面
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分支结构和循环结构相关的知识,希望对你有一定的参考价值。
1.C语言关系运算符
在程序中经常需要比较两个数据的大小,以决定程序下一步的工作。比如一个程序限制了只能成年人使用,儿童因为年龄不够,没有权限使用。这时候程序就需要获取用户输入的年龄并做出判断,如果超过18岁就正常运行,否则给出无权使用的提示。
比较两个数据大小的运算符称为关系运算符(Relational Operators)。
在C语言中有以下关系运算符:
1) <(小于)
2) <=(小于或等于)
3) >(大于)
4) >=(大于或等于)
5) ==(等于)
6) !=(不等于)
关系运算符都是双目运算符,其结合性均为左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。在六个关系运算符中,<、<=、>、>=的优先级相同,高于==和!=,==和!=的优先级相同。
关系运算符的两边可以是变量、数据或表达式,例如:
1) a+b>c-d
2) x>3/2
3) \'a\'+1<c
4) -i-5*j==k+1
关系运算符也可以嵌套使用,例如:
1) a>(b>c)
2) a!=(c==d)
关系运算符的运算结果为 0 或 1,如:
5>0 成立,其值为 1;
34-12<100 不成立,其值为 0;
(a=3)>(b=5) 由于3>5不成立,故其值为 0。
我们将运算结果 1 称为“真”,表示条件成立,将 0 称为“假”,表示条件不成立。
我们不妨将关系运算符的结果输出看一下:
#include <stdio.h>
int main(){
char c=\'k\';
int i=1, j=2, k=3;
float x=3e+5, y=0.85;
printf( "%d,%d\\n", \'a\'+5<c, -i-2*j>=k+1 );
printf( "%d,%d\\n", 1<j<5, x-5.25<=x+y );
printf( "%d,%d\\n", i+j+k==-2*j, k==j==i+5 );
return 0;
}
运行结果:
1,0
1,1
0,0
对于含多个关系运算符的表达式,如 k==j==i+5,根据运算符的左结合性,先计算k==j,该式不成立,其值为0,再计算0==i+5,也不成立,故表达式值为0。
2.C语言逻辑运算符
在高中数学中,我们学过逻辑运算,例如p为真命题,q就假命题,那么“p且q”为假,“p或q”为真,“非q”为真。
在C语言中,也有类似的逻辑运算:
运算符 | 说明 | 结合性 | 举例 |
&& | 与运算,双目,对应数学中的“且” | 左结合 | 1&&0、(9>3)&&(b>a) |
|| | 或运算,双目 | 左结合 | 1||0、(9>3)||(b>a) |
! | 非运算。单目 | 右结合 | !a、!(2<5) |
①.逻辑运算的值
逻辑运算的值也为“真”和“假”两种,用“1”和“0 ”来表示,其求值规则如下。
1) 与运算(&&)
参与运算的两个量都为真时,结果才为真,否则为假。例如:
(5>0) && (4>2)
由于5>0为真,4>2也为真,相与的结果也为真。
2) 或运算(||)
参与运算的两个量只要有一个为真,结果就为真。 两个量都为假时,结果为假。例如:
(5>0) || (5>8)
由于5>0为真,相或的结果也就为真。
3) 非运算(!)
参与运算量为真时,结果为假;参与运算量为假时,结果为真。例如:
!(5>0)
的结果为假。
注意:在逻辑运算中,0 为假,非 0 值都是真,例如5为真,2*3为真。对于表达式(3+5)&&(9>3),由于3+5=8为真,9>3为真,所以结果也为真。
②.优先级
逻辑运算符和其它运算符优先级从低到高依次为:赋值运算符(=) < &&和|| < 关系运算符 < 算术运算符 < 非(!)
“&&”和“||”低于关系运算符,“!”高于算术运算符。
按照运算符的优先顺序可以得出:
- a>b && c>d 等价于 (a>b)&&(c>d)
- !b==c||d<a 等价于 ((!b)==c)||(d<a)
- a+b>c&&x+y<b 等价于 ((a+b)>c)&&((x+y)<b)
另外,逻辑表达式也可以嵌套使用,例如 a>b && b || 9>c,a || c>d && !p。
逻辑运算符举例:
#include <stdio.h>
int main(){
char c=\'k\';
int i=1,j=2,k=3;
float x=3e+5,y=0.85;
printf( "%d,%d\\n", !x*!y, !!!x );
printf( "%d,%d\\n", x||i&&j-3, i<j&&x<y );
printf( "%d,%d\\n", i==5&&c&&(j=8), x+y||i+j+k );
return 0;
}
运行结果:
0,0
1,0
0,1
本例中!x和!y分别为0,!x*!y也为0,故其输出值为0。由于x为非0,故!!!x的逻辑值为0。对x|| i && j-3式,先计算j-3的值为非0,再求i && j-3的逻辑值为1,故x||i&&j-3的逻辑值为 1。对i<j&&x<y式,由于i<j的值为1,而x<y为0故表达式的值为1,0相与,最后为0,对i==5&&c&&(j=8)式,由于i==5为假,即值为0,该表达式由两个与运算组成,所以整个表达式的值为0。对于式x+ y||i+j+k由于x+y的值为非0,故整个或表达式的值为1。
3.C语言if else语句
前面我们看到的代码都是顺序执行的,也就是先执行第一条语句,然后是第二条、第三条……一直到最后一条语句。
但是对于很多情况,顺序结构的代码是远远不够的,比如一个程序限制了只能成年人使用,儿童因为年龄不够,没有权限使用。这时候程序就需要做出判断,看用户是否是成年人,并给出提示。
①.if-else语句
在C语言中,使用if语句进行判断,请先看下面的代码:
#include <stdio.h>
int main()
{
int age;
printf("请输入你的年龄:");
scanf("%d", &age);
if(age>=18){
printf("恭喜,你已经成年,可以使用该软件!\\n");
}else{
printf("抱歉,你还未成年,不宜使用该软件!\\n");
}
return 0;
}
可能的运行结果:
请输入你的年龄:23↙
恭喜,你已经成年,可以使用该软件!
if else 语句的结构为:
if(表达式){
语句块1
}else{
语句块2
}
意思是:如果表达式的值为真,则执行语句块1,否则执行语句块2 。其执行过程可表示为下图:
所谓语句块(Statement Block),就是由{ }包围的一个或多个语句的集合。如果语句块中只有一个语句,也可以省略{ },例如:
if(age>=18) printf("恭喜,你已经成年,可以使用该软件!\\n");
else printf("抱歉,你还未成年,不宜使用该软件!\\n");
由于if else 语句可以根据不同的情况执行不同的代码,所以也叫分支结构或选择结构,上面的代码中,就有两个分支。
求两个数中的较大值:
#include <stdio.h>
int main()
{
int a, b, max;
printf("输入两个整数:");
scanf("%d %d", &a, &b);
if(a>b) max=a;
else max=b;
printf("%d和%d的较大值是:%d\\n", a, b, max);
return 0;
}
运行结果:
输入两个整数:34 28↙
34和28的较大值是:34
本例中借助变量max,用max来保存较大的值,最后将max输出。
②.if语句
我们可以只使用 if 语句,也就是说,if else不必同时出现。if 语句的基本形式为:
if(表达式){
语句块
}
意思是:如果表达式的值为真,则执行其后的语句块,否则直接跳过。其过程可表示为下图:
只使用 if 语句来求两个数中的较大值:
#include <stdio.h>
int main()
{
int a, b, max;
printf("输入两个整数:");
scanf("%d %d", &a, &b);
max=b; // 假设b最大
if(a>b) max=a; // 如果a>b,那么更改max的值
printf("%d和%d的较大值是:%d\\n", a, b, max);
return 0;
}
运行结果:
输入两个整数:34 28
34和28的较大值是:34
本例程序中,输入两个数a、b。把b先赋予变量max,再用 if 语句判别max和b的大小,如max小于b,则把b赋予max。因此max中总是大数,最后输出max的值。
③.多个if else语句
if else语句也可以多个同时使用,构成多个分支,形式如下:
if(表达式1){
语句块1
} else if(表达式2){
语句块2
}else if(表达式3){
语句块3
}else if(表达式m){
语句块m
}else{
语句块n
}
意思是:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。然后跳到整个if语句之外继续执行程序。 如果所有的表达式均为假,则执行语句块n。然后继续执行后续程序。多个 if else 语句的执行过程如下图所示:
例如,判断输入的字符的类别:
#include <stdio.h>
int main(){
char c;
printf("Input a character:");
c=getchar();
if(c<32)
printf("This is a control character\\n");
else if(c>=\'0\'&&c<=\'9\')
printf("This is a digit\\n");
else if(c>=\'A\'&&c<=\'Z\')
printf("This is a capital letter\\n");
else if(c>=\'a\'&&c<=\'z\')
printf("This is a small letter\\n");
else
printf("This is an other character\\n");
return 0;
}
运行结果:
Input a character:e
This is a small letter
本例要求判别键盘输入字符的类别。可以根据输入字符的ASCII码来判别类型。由ASCII码表可知ASCII值小于32的为控制字符。在“0”和“9”之间的为数字,在“A”和“Z”之间为大写字母, 在“a”和“z”之间为小写字母,其余则为其它字符。这是一个多分支选择的问题,用多个 if else 语句编程,判断输入字符ASCII码所在的范围,分别给出不同的输出。例如输入为“e”,输出显示它为小写字符。
在使用if语句时还应注意以下问题:
1) 在三种形式的if语句中,在 if 关键字之后均为表达式。 该表达式通常是逻辑表达式或关系表达式,但也可以是其它表达式,如赋值表达式等,甚至也可以是一个变量。例如:
if(a=5) 语句;
if(b) 语句;
都是允许的。只要表达式的值为非0,即为“真”。如在:
if(a=5)…;
中表达式的值永远为非0,所以其后的语句总是要执行的,当然这种情况在程序中不一定会出现,但在语法上是合法的。
又如,有程序段:
if(a=b)
printf("%d",a);
else
printf("a=0");
本语句的语义是,把b值赋予a,如为非0则输出该值,否则输出“a=0”字符串。这种用法在程序中是经常出现的。
2) 在if语句中,条件判断表达式必须用括号括起来。
3) 语句块由{ }包围,但要注意的是在}之后不要再加分号;。例如:
if(a>b){
a++;
b++;
}else{
a=0;
b=10;
}
④.if语句的嵌套
if 语句也可以嵌套使用,例如:
#include <stdio.h>
int main(){
int a,b;
printf("Input two numbers:");
scanf("%d %d",&a,&b);
if(a!=b){
if(a>b) printf("a>b\\n");
else printf("a<b\\n");
}else{
printf("a=b\\n");
}
return 0;
}
运行结果:
Input two numbers:12 68
a<b
if 语句嵌套时,要注意 if 和 else 的配对问题。C语言规定,else 总是与它前面最近的 if 配对,例如:
复制纯文本新窗口
if(a!=b) // ①
if(a>b) printf("a>b\\n"); // ②
else printf("a<b\\n"); // ③
③和②配对,而不是和①配对。
4.C语言switch语句
用 if else 语句在处理多分支的时候,分支太多就会显得不方便,且容易出现 if 和 else配对出现错误的情况。例如,输入一个整数,输出该整数对应的星期几的英文表示:
#include <stdio.h>
int main(){
int a;
printf("Input integer number:");
scanf("%d",&a);
if(a==1){
printf("Monday\\n");
}else if(a==2){
printf("Tuesday\\n");
}else if(a==3){
printf("Wednesday\\n");
}else if(a==4){
printf("Thursday\\n");
}else if(a==5){
printf("Friday\\n");
}else if(a==6){
printf("Saturday\\n");
}else if(a==7){
printf("Sunday\\n");
}else{
printf("error\\n");
}
return 0;
}
运行结果:
Input integer number:3↙
Wednesday
C语言还提供了另外一种多分支选择的语句——switch 语句,它的基本语法格式如下:
switch(表达式){
case 常量表达式1: 语句 1;
case 常量表达式2: 语句 2;
......
case 常量表达式n: 语句 n;
default: 语句 n+1;
}
它的执行过程是:首先计算“表达式”的值,然后从第一个 case 开始,与“常量表达式x”进行比较,如果与当前常量表达式的值不相等,那么就不执行冒号后边的语句 x,一旦发现和某个常量表达式的值相等了,那么它会执行之后所有的语句,如果直到最后一个“常量表达式 n”都没有找到相等的值,那么就执行 default 后的“语句 n+1”。
需要注意的是,当找到一个相等的 case 分支后,会执行该分支以及之后所有分支的语句。例如:
#include <stdio.h>
int main(){
int a;
printf("Input integer number:");
scanf("%d",&a);
switch(a){
case 1: printf("Monday\\n");
case 2: printf("Tuesday\\n");
case 3: printf("Wednesday\\n");
case 4: printf("Thursday\\n");
case 5: printf("Friday\\n");
case 6: printf("Saturday\\n");
case 7: printf("Sunday\\n");
default:printf("error\\n");
}
return 0;
}
运行结果:
Input integer number:4↙
Thursday
Friday
Saturday
Sunday
error
输入4,发现和第四个分支匹配,于是就执行第四个分支以及后面的所有分支。这显然不是我们想要的结果,我们希望只执行第四个分支,跳过后面的所有分支。
为了避免这种情况,C语言还提供了一个关键字 break,专门用于跳出switch语句。
switch 的分支语句一共有 n+1 种,而我们通常希望的都是选择其中的一个分支来执行,执行完后就结束整个 switch 语句,而继续执行 switch后面的语句,此时就可以通过在每个分支后加上 break 语句来实现了。如下:
switch (表达式){
case 常量表达式1: 语句1; break;
case 常量表达式2: 语句2; break;
......
case 常量表达式n: 语句n; break;
default: 语句n+1; break;
}
加了这个 break 语句后,一旦“常量表达式 x”与“表达式”的值相等了,那么就执行“语句 x”,执行完毕后,由于有了 break 则直接跳出 switch 语句,继续执行 switch 语句后面的程序了,这样就可以避免执行不必要的语句。
使用switch语句修改上面的代码:
#include <stdio.h>
int main(){
int a;
printf("Input integer number:");
scanf("%d",&a);
switch(a){
case 1: printf("Monday\\n"); break;
case 2: printf("Tuesday\\n"); break;
case 3: printf("Wednesday\\n"); break;
case 4: printf("Thursday\\n"); break;
case 5: printf("Friday\\n"); break;
case 6: printf("Saturday\\n"); break;
case 7: printf("Sunday\\n"); break;
default:printf("error\\n"); break;
}
return 0;
}
运行结果:
Input integer number:4↙
Thursday
值得一提的是,由于default是最后一个分支,匹配后不会再执行其他分支,所以也可以不用break;语句。
5.C语言条件运算符
如果希望获得两个数中最大的一个,可以使用 if 语句,例如:
if(a>b){
max = a;
}else{
max = b;
}
不过,C语言提供了一种更加简单的方法,叫做条件运算符,语法格式为:
表达式1 ? 表达式2 : 表达式3
条件运算符是C语言中唯一的一个三目运算符,其求值规则为:如果表达式1的值为真,则以表达式2 的值作为整个条件表达式的值,否则以表达式3的值作为整个条件表达式的值。条件表达式通常用于赋值语句之中。
上面的 if else 语句等价于:
max = (a>b) ? a : b;
该语句的语义是:如a>b为真,则把a赋予max,否则把b 赋予max。
你可以认为条件运算符是一种简写的 if else,你完全可以用 if else 代替条件运算符。
使用条件表达式时,还应注意以下几点:
1) 条件运算符的优先级低于关系运算符和算术运算符,但高于赋值符。因此
max=(a>b) ? a 3.1运算符+代码结构(分支+循环)+函数
Python控制流:顺序结构分支结构循环结构+forif ... elsewhileif... elif...elif..elseif