C 程序设计教程(14)—— 选择结构程序设计

C 程序设计教程(14)—— 选择结构程序设计

在这里插入图片描述

该专栏主要介绍 C 语言的基本语法,作为《程序设计语言》课程的课件与参考资料,用于《程序设计语言》课程的教学,供入门级用户阅读。

选择结构又称为分支结构,是结构化程序的三种基本结构之一,作用是根据所指定的条件是否满足,决定程序的不同流程。实现分支结构的语句有三种形式:单分支 if 语句、双分支 if 语句和 switch 语句。

一、单分支 if 语句

执行单分支 if 语句时,先计算表达式的值,若表达式的值为非 0,则执行其后的语句;若表达式的值为 0,则跳过表达式后的语句,直接执行该 if 语句的后续语句。单分支 if 语句语法格式如下:

if (表达式)
{
    
    语句};

例如:任意输入两个整数,输出较大的值。

#include<stdio.h>
int main() {
    
    
	int x,y;
	printf("请输入两个整数(用逗号隔开):");
	scanf("%d,%d",&x,&y);
	if (x>y){
    
    
		printf("%d",x);
		return 0;
	}
	printf("%d\n",y);
	return 0;
}

以上程序的运行结果如下:

在这里插入图片描述

二、双分支 if 语句

执行双分支 if 语句时,先计算表达式的值,若表达式的值为非 0,则执行语句1;若表达式的值为 0,则执行语句2。当 if 语句执行结束后,再执行该 if 语句的后续语句。双分支 if 语句语法格式如下:

if (表达式)
	{语句1}
else
	{语句2};

例如:任意输入两个整数,输出较大的值。本题也可以使用双分支 if 语句解答。

#include<stdio.h>
int main() {
    
    
	int x,y,z;
	printf("请输入两个整数(用逗号隔开):");
	scanf("%d,%d",&x,&y);
	if (x>y) z=x; else z=y;
	printf("%d\n",z);
	return 0;
}

以上程序的运行结果如下:

在这里插入图片描述

例子:输入一个整数,判断是偶数还是奇数。

#include<stdio.h>
int main() {
    
    
	int x;
	printf("请输入一个整数:");
	scanf("%d",&x);
	if (x%2==0) {
    
    
		printf("你输入的是一个偶数\n"); 
	}
	else{
    
    
		printf("你输入的是一个奇数\n");
	}
	return 0;
}

以上程序的运行结果如下:

在这里插入图片描述

三、if 语句的嵌套

if 语句中的 if 和 else 子句可以嵌套另一个 if 语句。内嵌的 if 语句既可以嵌套到 if 子句中,也可以嵌套到 else 子句中。语法格式如下:

if (表达式)
	{
    
    if 语句}
else
	{
    
    if 语句}

说明:在嵌套的 if 语句中,应注意 else 与 if 的匹配方式。基本原则有两个:一是“最近匹配”原则,即举例最近的 else 和 else 前面的 if 相匹配;二是“一对一”原则,即一个 else 只能和一个 if 相匹配。尽量把内嵌的 if 语句嵌套在 else 子句中。

为了使程序结构清晰,避免产生逻辑错误,可以加花括号来确定配对关系。例如:

编程实现:比较两个数的大小关系(x>y,x<y,x=y)。

#include<stdio.h>
int main() {
    
    
	int x,y;
	printf("请输入两个整数,用逗号分隔:");
	scanf("%d,%d",&x,&y);
	if (x==y) {
    
    
		printf("x和y相等。\n"); 
	}
	else{
    
    
		if (x>y){
    
    
			printf("x>y\n");
		}
		else{
    
    
			printf("x<y\n");
		}		
	}
	return 0;
}

以上程序的运行结果如下:

在这里插入图片描述

四、switch 语句(多分支)

if 语句只有两个分支,而实际应用中经常需要用到多分支的选择。如果使用嵌套的 if 语句来处理,由于分支较多,致使嵌套的 if 语句层数过多,导致程序的可读性较差。此时,可以使用 switch 语句来处理多分支选择问题。switch 语句的语法格式如下:

switch (表达式){
    
    
    case 常量表达式1:语句序列1
    case 常量表达式2:语句序列2
        .....
    case 常量表达式n:语句序列n
        default:语句序列n+1        
}

switch 语句的执行过程:先计算 switch 后表达式的值,再逐个与后面的常量表达式的值相比较,当表达式的值与某个常量表达式i 的值相等时,则从语句序列i开始执行,直到语句序列n为止。如果表达式的值与所有 case 后的常量表达式的值都不相同,则执行 default 后的语句序列n+1。

使用 switch 语句应注意的问题:

(1)switch 后面括号内的表达式,可以是整型表达式或字符型表达式,也可以是枚举型数据。

(2)当表达式的值与某一个 case 后面的常量表达式的值相等时,就执行此 case 后面的语句。若所有的 case 中的常量表达式的值与表达式的值都不相等,就执行 default 后面的语句。如果没有 default 就跳出 switch ,执行 switch 语句后面的语句。

(3)各个 case 的常量表达式的值必须互不相同。

(4)各个 case 的出现次序不影响执行结果。

(5)执行完一个 case 后面的语句后,流程控制转移到下一个 case 继续执行。“case 常量表达式” 只是起到语句标号作用,并不是在该处进行条件判断。在执行 switch 语句时,根据 switch 后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。

(6)多个 case 可以共用一组执行语句。

例如:给出一个百分制成绩,要求输出成绩等级A、B、C、D、E。90分以上为A、8089分为B、7079分为C、60~69分为D、60分以下为E。

#include<stdio.h>
int main() {
    
    
	int score;
	printf("请输入分数:");
	scanf("%d",&score);
	if (score>100||score<0){
    
    
		printf("分数输入有误。分数的范围必须在0~100之间。");
		return 0;
	}
	switch(score/10){
    
    
		case 10:
		case 9:printf("A\n");
		case 8:printf("B\n");
		case 7:printf("C\n");
		case 6:printf("D\n");
		default:printf("E\n");
	}
	return 0;
}

以上程序的运行结果如下:

在这里插入图片描述

问题分析:以上程序的执行结果存在问题,当输入100分时,应该输出等级A,但却输出了多个等级。

在 switch 语句中,“case 常量表达式” 只相当于一个语句标号,表达式的值与某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个 switch 语句,所以出现了继续执行所有后面 case 语句的情况。

为了避免以上情况的发生,可以在每个 case 语句后面添加一个 break 语句,使每次执行 case 之后均跳出 switch 语句,从而避免输出不需要的结果。

修改后的程序代码如下:

#include<stdio.h>
int main() {
    
    
	int score;
	printf("请输入分数:");
	scanf("%d",&score);
	if (score>100||score<0){
    
    
		printf("分数输入有误。分数的范围必须在0~100之间。");
		return 0;
	}
	switch(score/10){
    
    
		case 10:
		case 9:printf("A\n");break;
		case 8:printf("B\n");break;
		case 7:printf("C\n");break;
		case 6:printf("D\n");break;
		default:printf("E\n");
	}
	return 0;
}

以上程序的运行结果如下:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44377973/article/details/128627834
今日推荐