chap04:分支结构

2023-12-27 18:08:22


一、关系运算符与表达式

运算符名称描述
==等于检查两个操作数的值是否相等,如果相等则条件为真。
!=不等于检查两个操作数的值是否相等,如果不相等则条件为真。
>大于检查左操作数的值是否大于右操作数的值,如果是则条件为真。
<小于检查左操作数的值是否小于右操作数的值,如果是则条件为真。
>=大于等于检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。
<=小于等于检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。

注:C语言里没有布尔值,用1表示真,0表示假

二、逻辑运算符与表达式

运算符名称描述
&&如果两个操作数都为真(非零),则条件为真。
||如果两个操作数中有任意一个为真,则条件为真。
!用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。

已学运算符的优先级:

()
!
* / %
+ -
> >= < <=
== !=
&&
||
=

练习:

设a=3,b=4,c=5,写出下面各逻辑表达式的值。
a+b>c && b==c                   
!(a>b) && !c || 1                   
!(a+b) + c –1 && b + c/2 

三 、双分支结构(标准结构)

双分支结构

注意:

  • if(条件表达式)后面不能有分号
  • else后面不能写条件;

示例:

1)用户输入一个整数,判断奇偶性并输出。

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

以下程序尝试着去完成:

2)用户输入一个字母,判断大小写并输出。

3)用户输入x的值 ,按下式计算并输出y的值!

分段函数

四、单分支结构

双分支变形而来,没有B部分操作。

格式(没有else部分)

if(条件表达式)

? A部分

示例: 用户输入一个字母,如果是大写字母,就转换成小写字母。 否则,不转换。

int main(){
 	char ch; 
 	printf("请输入一个字母:");
 	scanf("%c",&ch);
 	
 	if(ch>='A' && ch<='Z')  //条件也可写成  ch>=65 && ch<=90
 		ch=ch+32;
		 
	printf("ch=%c\n",ch); 	
 }  

注意: A部分与B部分必须是一个语句:

1、可以是一个简单语句;

2、也可以是由花括号括起来的多个简单语句(称为复合语句);

如:输入两个整数a和b,使a中存放两个数中的最小值,b中存放两个中的最大值,并输出a与b;

#include<stdio.h>
int main(){
	int a,b,c;
	printf("请输入a与b:");
	scanf("%d%d",&a,&b);
	
	if(a<b){
		c=a;
		a=b;
		b=c;
	}    //这是一个复合语句,要注意花括号,可看成一个语句。
 
	printf("a=%d,b=%d\n",a,b); 
}

五、if语句的嵌套

标准结构里的A部分或B部分又可以是一个分支语句,这称为if语句的嵌套

案例: 输入一个学生成绩s(百分制),给出优秀(s>=85),合格(60 ≤ s < 85),和不合格(s<60)三个等级的评价

方法一(嵌套在A部分):
在这里插入图片描述

#include<stdio.h>
int main(){
	int s;  
	printf("请输入一个成绩:");
	scanf("%d",&s);
	//方法一:嵌套在if子句 
	if(s>=60)
		if(s>=85)
			printf("优秀!\n");
		else
			printf("合格!\n");
	else
		printf("不合格!\n");
}

方法二 (嵌套在B部分):
在这里插入图片描述

#include<stdio.h>
int main(){
	int s; 
	printf("请输入一个成绩:");
	scanf("%d",&s);
	
	//方法二:嵌套在else子句 
	if(s>=85)
		printf("优秀!\n");
	else
		if(s>=60)
			printf("合格!\n");
		else
		 	printf("不合格!\n"); 	
}

六、多分支语句(if-else if语句)

嵌套都发生在else子句时,可以整理语法格式为:

if(条件1)
	语句1;
else if(条件2)
	语句2;
else if(条件3)
	语句3;
    …
else if(条件n)
	语句n;    
else
	语句n+1;

不少教材将其称为多分支语句,其实质上还是if语句的嵌套,只是语法写的整齐点。

例如: 上一个案例的方法二,分支语句可整理格式为:

	if(s>=85)
		printf("优秀!\n");
	else if(s>=60)
		printf("合格!\n");
	else
		printf("不合格!\n");

练习:

1、用户输入一百分制成绩s,要求输出成绩等级’A’、’B’、’C’、’D’、’E’。90分以上为’A’,80-89分为’B’,70-79分为’C’,60-69分为’D’,60分以下为’E’。

#include<stdio.h>
//采用if-else if语句就比较简单(流程图略)
int main(){
	int s;
	printf("请输入一个成绩:");
	scanf("%d",&s);
	
	if(s>=90)
		printf("A\n");
	else if(s>=80)
		printf("B\n");
	else if(s>=70)
		printf("C\n");
	else if(s>=60)
		printf("D\n");
	else
		printf("E\n");	
}

如果考虑到效率问题(成绩在60~80之间的人数最多),按如下流程图设计算法,请尝试写出程序。
在这里插入图片描述

2、编程实现:运输公司对用户计算运输费用。依据不同路程(km)对每吨·千米运费有一定的折扣。折扣标准如下:

s < 250 没有折扣

250≤s < 500 2%折扣

500≤s < 1000 5%折扣

1000≤s < 2000 8%折扣

2000≤s < 3000 10%折扣

3000≤s 15%折扣

输入相应路程、重量与每吨每千米运费,计算用户所需缴纳运输费用并输出。

七、条件运算符(唯一的一个三目运算符)与条件表达式

格式:

表达式1?表达式2:表达式3

运算规则与表达式的值: 先计算表达式1的值,如果表达式1值为真(非0),则计算表达式2的值,并作为整个表达式的值;若表达式1的值为假(0),则计算表达式3的值,并作为整个表达式的值。

如:

int a=6,b=3;
a>b?a:b   //该表达式的值为6
a<b?a:b   //该表达式的值为3

优先级: 仅比逗号运算符与赋值运算符高。

常见用法:

1)依据不同情况进行不同操作;

例: 输入一个数字来判断它是否为奇数或偶数 。

#include<stdio.h> 
int main(){
    int num; 
    printf("输入一个数字 : ");
    scanf("%d",&num);
 
    (num%2==0)?printf("偶数"):printf("奇数");
}

例: 用户输入一个字母,如果是大写字母,就转换成小写字母。 否则,不转换。

#include<stdio.h> 
int main(){
    char ch; 
    printf("输入一个英文字母 : ");
    scanf("%c",&ch);
 
    ch = ch>='A'&&ch<='Z'?ch+32:ch;
    
    printf("ch=%c\n",ch);
}

2)两个值中取一个值;

例: 取两个值中的最大值;

#include<stdio.h> 
int main(){
    int a,b,max; 
    printf("输入a与b:");
    scanf("%d%d",&a,&b);
 
    max = a>b?a:b;    //条件运算符的优先级比赋值运算符要高,所以这里的操作是:取a,b中的最大值赋值给max
    
    printf("最大值为:%d\n",max);
}

八、 switch语句 (开关语句)

switch(表达式)
{
    case 常量表达式1:语句1;
         break; /* 可选的 */
    case 常量表达式2:语句2;
         break; /* 可选的 */
    ...
    default:语句n+1;
}

规则: 先计算表达式的值,再逐个和 case 后的常量表达式比较,若不等则继续往下比较,若一直不等,则执行 default 后的语句;若等于某一个常量表达式,则从这个表达式后的语句开始执行,并执行后面所有 case 后的语句。

要求:

  • switch 语句中的 表达式 必须是一个整型或枚举类型。
  • 在一个 switch 中可以有任意数量的 case 语句。每个 case 后跟一个要比较的值和一个冒号。
  • case后 的 常量表达式 必须与 switch 中的变量具有相同的数据类型,且必须是一个常量或字面量
  • 当被测试的变量等于 case 中的常量时,case 后跟的语句将被执行,直到遇到 break 语句为止。
  • 当遇到 break 语句时,switch 终止,控制流将跳转到 switch 语句后的下一行。
  • 不是每一个 case 都需要包含 break。如果 case 语句不包含 break,控制流将会 继续 后续的 case,直到遇到 break 为止。
  • 一个 switch 语句可以有一个可选的 default case,出现在 switch 的结尾。default case 可用于在上面所有 case 都不为真时执行一个任务。

例1: 依据用户输入的数值,判断是星期几。

#include <stdio.h>

int main()
{
    int a;
    printf("input integer number(1-7): ");
    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");
    }
}

例2: 用switch语句实现,用户输入一百分制成绩s,要求输出成绩等级’A’、’B’、’C’、’D’、’E’。90分以上为’A’,80-89分为’B’,70-79分为’C’,60-69分为’D’,60分以下为’E’。

#include<stdio.h>
int main(){
	int s;
	printf("请输入一个成绩:");
	scanf("%d",&s);
	
	switch(s/10){  // 通过s/10将数据离散化
		/* 利用:“如果 case 语句不包含 **break**,控制流将会 *继续* 后续的 case,直到遇到 break 为止。”的特性,可使得多个case共用一组语句。*/
		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;
		case 5:
		case 4:
		case 3:
		case 2:
		case 1:
		case 0: printf("E\n");break; 
	}	
}

文章来源:https://blog.csdn.net/qq_22891627/article/details/135171443
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。