5.3 if语句和用if语句构成的选择结构
if语句用来对所给定的条件进行判定,判断其表达式的值是否满足某种条件,并根据判定的结果(真或假)决定执行给出的两种操作中的哪一种。
考点3 if语句的几种形式
真考链接
考点3 无论是在选择题或操作题,都是一个重中之重,考核概率为80%。
(1)if(表达式)语句。例如:
if(a>b)printf("The answer is right!\n");
其中,if是C语言的关键字,a>b是条件判断表达式。表达式两侧的括号不可少,并且只能是圆括号,不能用其他括号替代。紧跟着的是一条输出语句,称为if子句,如果在if子句中需要多个语句,则应该使用大括号({})把一组语句括起来构成复合语句,这样在语法上满足“一条语句”的要求。
(2)if(表达式)语句1。
else 语句2
例如:
if(a>b)printf("The answer is right.\n");
else printf("The answer is wrong.\n");
(3)if(表达式1)语句1。
elseif(表达式2)语句2
elseif(表达式3)语句3
…
elseif(表达式m)语句m
else语句n
“语句1”是if子句,“语句2…语句m”是elseif子句。这些子句在语法上要求是一条语句,当需要执行多条语句时,应该使用花括号({})把这些语句括起来组成复合语句。
小提示
else不能独立成为一条语句,它只是if语句的一部分,不允许单独出现在程序中,else必须与if配对,共同组成if…else语句。
真题精选
【例1】若变量已正确定义,有以下程序段:
int a = 3,b = 5,c = 7;
if(a > b)a = b;c = a;
if(c!= a)c= b;
printf("% d,% d,% d\n",a,b,c);
则程序输出结果为( )。
A.程序段语法错 B.3,5,3 C.3,5,5 D.3,5,7
【答案】 B
【解析】两个if语句的判断条件都不满足,程序只执行了c=a这条语句,所以变量c的值等于3,变量b的值没能变化,程序输出的结果为3,5,3。所以正确的答案为B。
【例2】下列给定程序中,函数fun()的功能是:如果参数是大写字母则转换为对应的小写字母,如果是小写字母则转换为对应的大写字母,其他字符则返回字符#,请在标号处填入正确的内容,使程序得出正确的结果。
试题程序
char fun(char c)
{ if 【1】
c = c - 32;
else if 【2】
c = c + 32;
【3】
c = '#';
return c;
}
【答案】【1】c>='a'&&c<= 'z'
【2】c>= 'A'&&c<= 'Z'
【3】else
【解析】本题考查if语句的使用。标号【1】判断是否为小写字母,标号【2】判断是否为大写字母,标号【3】表示除了大写字母和小写字母之外的其他字符,所以填入else。
【例3】以下程序的输出结果是( )。
试题程序
#include <stdio.h>
main()
{ int a,b,c;
a=10;b=50;c=30;
if(a>b)
a=b,b=c;
c=a;
printf("a=% d,b=% d,c=% d",a,b,c);
}
A.a=10,b=50,c=10 B.a=10,b=30,c=10
C.a=50,b=30,c=10 D.a=50,b=30,c=50
【答案】 A
【解析】本题考查了if语句的执行流程。
【例4】编写函数fun(),其功能是:求出1~1000能被7或11整除,但不能同时被7和11整除的所有整数,并将其放在a所指的数组中,通过n返回这些数的个数。
注意:部分源程序给出如下。
请勿改动主函数main()和其他函数中的任何内容,仅在函数fun()的花括号中填入你编写的若干语句。
试题程序
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
void fun(int *a,int *n){
}
void main()
{ int aa[1000],n,k;
fun(aa,&n);
for(k=0;k<n;k++)
if((k+1)% 10==0)
{ printf("% 5d",aa[k]);
printf("\n");
} /*一行写9个数*/
else
printf("% 5d ",aa[k]);
}
【答案】void fun(int *a,int *n)
{ int i,j=0;
for(i=1;i< =1000;i++)/*求1~1000能被7或11整除,但不能同时被7和11整除的所有整数,并放入数组a中*/
if((i% 7==0||i% 11==0)&&i% 77!=0)
a[j++] =i;
*n=j;/*传回满足条件的这些数的个数*/
}
【解析】本题考查if语句,用来判断能被7整除或者能被11整除,但是又不能同时被7和11整除的数,在这里充分理解“逻辑与”和“逻辑或”的区别;for循环语句的循环变量用来控制取值范围。
该题需要运用循环判断结构来实现,其中循环语句比较容易编写,只要确定循环变量的范围即可,下面就来看判断语句,题目要求找出能被7或11整除,但不能同时被7和11整除的所有整数。能同时被7和11整除的整数一定能被77整除,且不能被77整除的数不一定就是能被7 或11 整除的数,所以可得出程序中的if语句。注意:(i%7==0||i%11==0)两边必须要有小括号。
考点4 if语句的嵌套
真考链接
考点4 是选择题中必考的知识点。往往出现在选择题的读程序题中,考核概率为40%。
在if语句中又包含一个或多个if语句结构,称为if语句的嵌套,一般有以下两种形式。
(1)在if子句中嵌套含有else子句的if语句。
一般形式为:
if()
if()语句1
else语句2
else
if()语句3
else语句4
(2)在else子句中嵌套if语句。
一般形式为:
if(表达式1)语句1
elseif(表达式2)语句2
elseif(表达式3)语句3…
elseif(表达式m)语句m
else语句n
应当注意,else总是与它上面的最近的、没有与else配对的if配对。
真题精选
【例1】有以下程序:
#include <stdio.h>
main()
{ int x = 1,y = 2,z = 3;
if(x > y)
if(y < z)printf("% d",++z);
else printf("% d",++y);
printf("% d\n",x++);
}
程序的运行结果是( )。
A.331 B.41 C.2 D.1
【答案】 D
【解析】该题目考查if条件语句,else语句和最近的一个if语句配对。由于x>y为假,所以直接执行最后一行代码。
【例2】下列给定的程序中,fun()函数的功能是将p所指的字符串中每个单词的最后一个字母改成大写(这里的“单词”是指有空格隔开的字符串)。
例如,若输入:Iamastudenttotaketheexamination
则应输出:IaM AstudenTtOtakEthEexaminatioN
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main()函数,不得增行或删行,也不得更改程序的结构。
试题程序
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
#include <stdio.h>
void fun(char *p)
{ int k=0;
for(;*p;p++)
if(k)
{ /*****found*****/
if(p== ' ')
{ k=0;
/*****found*****/
*p=toupper(*(p-1));
}
}
else k=1;
*p=toupper(*p);
}
void main()
{ char chrstr[64];
int d;
printf("\nPlease enter an English sentence within 63 letters:");
gets(chrstr);
d=strlen(chrstr);
chrstr[d] = ' ';
chrstr[d+1] =0;
printf("\nBefore changing:\n % s", chrstr);
fun(chrstr);
printf(" \nAfter changing:\n % s", chrstr);
}
【答案】(1)if(*p=='')
(2)*(p-1)=toupper(*(p-1));
【解析】本题考查:嵌套的if语句,toupper函数的用法,该函数功能是将小写字母转换为大写字母;指针型变量。
(1)本题重点考查考生对指针的理解,当引用指针指向的元素时,应使用指针运算符*号。
(2)当p指向空格时,将前面的字符转换为大写,因此此处应为*(p-1)而不是*p。
考点5 由条件运算符构成的选择结构
真考链接
考点5是必考内容,通过条件运算符实现程序的选择结构。
在选择题中,此知识点考核概率为70%。属于应重点掌握知识点,在操作题中此知识点的考核概率为10%。
有以下语句:
if(x<y)
min=x; /*求两数中较小的一个*/
else min=y;
可以用min=(x<y)?x:y来替换,其中(x<y)?x:y是一个条件表达式,“?:”就是条件运算符。该表达式是这样执行的:如果(x<y)条件成立,则整个条件表达式取值x,否则取值y。
优先级:条件运算符高于赋值运算符,但低于逻辑运算符、关系运算符和算术运算符。
常见问题
if语句是如何实现程序的选择结构的?如果if的条件表达式为空语句,则程序运行流程如何?
if语句根据是否满足表达式的要求来选择程序执行的流程。如果if的条件表达式为空,就表示任何条件都满足,直接执行后面的语句。
真题精选
【例1】有以下程序:
#include <stdio.h>
main()
{ int x = 1,y = 2,z = 3;
if(x > y)
printf("% d",y<x?1:2);
else
printf("% d",z<x?2:3);
}
程序的运行结果是( )。
A.1 B.2 C.3 D.4
【答案】 C
【解析】该题目考查if构成的选择结构和(x<y)?x:y形式的条件运算。因为x<y,所以if(x>y)不满足而进入else分支。因为z<x为假,所以打印冒号后面的数值3。
【例2】下列说法正确的是( )。
A.条件运算符是单目运算符
B.条件运算符是双目运算符,因为它有2个运算符号
C.条件运算符是三目运算符,因为它有3个运算对象
D.条件运算符的优先级高于赋值运算符和逻辑运算符
【答案】 C
【解析】本题比较全面地考查了条件运算符的基本知识点,选项C的说法是正确的。