4.1 选择结构和条件判断
C语言中有两种选择语句:(1)if语句,用来实现两个分支的选择结构;(2)switch语句,用来实现多分支的选择结构.
4.2 用if语句实现选择结构
例4.2 输入两个实数,按代数值由小到大的顺序输出这两个数.
#include <stdio.h>
#include <stdlib.h>
int main()
{
float a,b,r;
scanf("%f,%f",&a,&b);
if(a>b)
{
r=a;
a=b;
b=r;
}
printf("%5.2f,%5.2f\n",a,b);
return 0;
}
例4.3 输入3个数a,b,c,要求按由小琶大的顺序输出.
#include <stdio.h>
#include <stdlib.h>
int main()
{
float a,b,c,t;
scanf("%f,%f,%f",&a,&b,&c);
if(a>b)
{
t=a;
a=b;
b=t;
}
if(a>c)
{
t=a;
a=c;
c=t;
}
if(b>c)
{
t=b;
b=c;
c=t;
}
printf("%5.2f,%5.2f,%5.2f\n",a,b,c);
return 0;
}
if语句无论写在几行上,都是一个整体,属于同一个语句.
4.3 关系运算符和关系表达式
<,<=,>,>=优先级相同(高)
==,!=优先级相同(低)
关系运算符的优先级低于算法运算符.
关系运算符的优先级高于赋值运算符.
用关系运算符将两个数值或数值表达式连接起来的式子,称关系表达式.
关系表达式的值是一个逻辑值,即"真"或"假".
4.4 逻辑运算符和逻辑表达式
用逻辑运算符将关系表达式或其他逻辑量连接起来的式子就是逻辑表达式.
"&&"和"||"是双目(元)运算符,"!"是一目(元)运算符.
优先级: !>&&>||
逻辑运算符中的"&&"和"||"低于关系运算符,"!"高于算术运算符.
逻辑表达式的值应该是一个逻辑量"真"或"假".在表示结果时,以数值"1"表示真,以"0"表示假,但在判断一个量是否为真时,以0代表假,以非0代表真.
在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符.
逻辑型变量.这是C 99所增加的一种数据类型.可以将关系运算和逻辑运算的结果存到一个逻辑变量中,以便于分析和运算.定义逻辑变量用类型符_Bool.
4.5 条件运算符和条件表达式
条件表达式的一般形式为:
表达式1?表达式2:表达式3
条件运算符优先于赋值运算符.
条件运算符的优先级比关系运算符和算术运算符都低.
表达式2 和 表达式3 不仅可以是数值表达式,还可以是赋值表达式或函数表达式.
例4.4 输入一个字符,判别它是否为大写字母,如果是,将它转换成小写字母,如果不是,不转换.然后输出最后得到的字符.
#include <stdio.h>
#include <stdlib.h>
int main()
{
char ch;
scanf("%c",&ch);
ch=(ch>='A'&&ch<='Z'?(ch+32):ch);
printf("%c\n",ch);
return 0;
}
4.6 选择结构的嵌套
else总是与它上面的最近的未配对的if配对.
4.7 用switch语句实现多分支选择结构
switch语句是多分支选择语句.
例4.6 要求按照考试成绩的等级输出百分制分数段,A等为85分以上,B等为70~84分,C等为60~69分,D等为60分以下.成绩的等级由键盘输入.
#include <stdio.h>
#include <stdlib.h>
int main()
{
char grade;
scanf("%c",&grade);
printf("Your score:");
switch(grade)
{
case 'A':printf("85~100\n");break;
case 'B':printf("70~84\n");break;
case 'C':printf("60~69\n");break;
case 'D':printf("<60\n");break;
default:printf("enter data error!\n");
}
return 0;
}
注意在每个case后面后的语句中,最后都有一个break语句,它的作用是使流程转到switch语句的末尾.
switch语句的作用是根据表达式的值,使流程跳转到不同的语句.
switch语句的一般形式如下:
switch后面括号内的"表达式",其值的类型应为整数类型(包括字符型).
case后面跟一个常量(或常量表达式),它们和default都是起标号的作用,用来标志一个位置.执行switch语句时,先计算switch后面的"表达式"的值,然后将它与各case标号比较,如果与某一个case标号中的常量相同,流程就转到case标号后面的语句.如果没有与switch表达式相匹配的case常量,流程转去执行default标号后面的语句.
可以没有default标号,此时如果没有与switch表达式相匹配的case常量,则不执行任何语句,流程转到switch语句的下一个语句.
各个case标号出现次序不影响执行结果.
每个case常量必须互不相同.
一般情况下,在执行一个case子句后,应当用break语句使流程跳出switch结构,即终止switch语句的执行.最后一个子句中可不必加break,因为流程已到了switch结构的结束处.
多个case标号可以共用一组执行语句.
4.8 选择结构程序综合举例
例4.8 写一程序,判断某一年是否为闰年.
方法1:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int year,leap;
printf("enter year:");
scanf("%d",&year);
if(year%4==0)
{
if(year%100==0)
{
if(year%400==0)
leap=1;
else
leap=0;
}
else
leap=1;
}
else
leap=0;
if(leap)
printf("%d is",year);
else
printf("%d is not ",year);
printf("a leap year.\n");
return 0;
}
方法2:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int year,leap;
printf("enter year:");
scanf("%d",&year);
if(year%4!=0)
leap=0;
else if(year%100!=0)
leap=1;
else if(year%400!=0)
leap=0;
else
leap=1;
if(leap)
printf("%d is",year);
else
printf("%d is not ",year);
printf("a leap year.\n");
return 0;
}
方法3:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int year,leap;
printf("enter year:");
scanf("%d",&year);
if((year%4==0&&year%100!=0)||(year%400==0))
leap=1;
else
leap=0;
if(leap)
printf("%d is",year);
else
printf("%d is not ",year);
printf("a leap year.\n");
return 0;
}
9.给一个不多于5位的正整数,要求:求出它是几位数,分别输出每一位数字,按逆序输出各位数字.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num,indiv,ten,hundred,thousand,ten_thousand,place;
printf("请输入一个整数(0-99999):");
scanf("%d",&num);
if(num>9999)
place=5;
else if(num>999)
place=4;
else if(num>99)
place=3;
else if(num>9)
place=2;
else place=1;
printf("位数:%d\n",place);
printf("每位数字为:");
ten_thousand=num/10000;
thousand=(int)(num-ten_thousand*10000)/1000;
hundred=(int)(num-ten_thousand*10000-thousand*1000)/100;
ten=(int)(num-ten_thousand*10000-thousand*1000-hundred*100)/10;
indiv=(int)(num-ten_thousand*10000-thousand*1000-hundred*100-ten*10);
switch(place)
{
case 5:printf("%d,%d,%d,%d,%d",ten_thousand,thousand,hundred,ten,indiv);
printf("\反逆序数字为:");
printf("%d,%d,%d,%d,%d",indiv,ten,hundred,thousand,ten_thousand);
break;
case 4:printf("%d,%d,%d,%d",thousand,hundred,ten,indiv);
printf("\反逆序数字为:");
printf("%d,%d,%d,%d,%d",indiv,ten,hundred,thousand);
break;
case 3:printf("%d,%d,%d",hundred,ten,indiv);
printf("\反逆序数字为:");
printf("%d,%d,%d",indiv,ten,hundred);
break;
case 2:printf("%d,%d",ten,indiv);
printf("\反逆序数字为:");
printf("%d,%d",indiv,ten);
break;
case 1:printf("%d",indiv);
printf("\反逆序数字为:");
printf("%d",indiv);
break;
}
return 0;
}