• C程序设计内容与例题讲解 -- 第四章--选择结构程序设计第二部分(第五版)谭浩强


    前言:在前面我们学习了选择结构和条件判断,用if语句实现选择结构,关系运算符和关系表达式,逻辑运算符和逻辑表达式等知识。今天我们将接着上一篇未讲完的继续讲解。
    鸡汤:种一棵树最好的时间是十年前,其次是现在!加油各位一起努力!

    这里是引用

    4.1 选择结构的嵌套

    在if语句中又包含一个或者多个if语句称为"if语句的嵌套"。
    其一般格式如下:
    
    • 1
    • 2

    在这里插入图片描述

    我们应当注意if与else的配对关系:
    else总是与它上面最近的未配对的if配对。
    
    • 1
    • 2

    我们来看一道例题
    例题:有一阶跃函数(如下图),编写一程序,输入一个x的值,要求输出对应y的值。
    在这里插入图片描述
    代码:

    int main()
    {
    	int x = 0;
    	int y = 0;
    	scanf("%d", &x);
    	if (x < 0)
    	{
    		y = -1;
    	}
    	else if (x == 0)
    	{
    		y = 0;
    	}
    	else
    	{
    		y = 1;
    	}
    	printf("%d\n", y);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    4.2 用switch语句实现多分支选择结构

    if 语句只有两个分支可供选择,而实际问题中常常需要用到多分支的选择。例如,学生成绩分类(85分以上为A等,70 ~ 84分为B等,60 ~ 69分为C等),人口统计分类(按年龄分为老、中、青、年、少、儿童),工资统计分类,银行存款分类等。当然这些也可以用嵌套的If语句来处理,但如果分支较多,则嵌套的if语句层数较多,程序冗长而且可读性降低。因此我们可以使用C语言提供的switch语句直接处理多分支的选择。switch语句是多分支选择语句

    看例题:要求按照考试成绩的等级输出百分制分数段,85分以上为A等,70 ~ 84分为B等,60 ~ 69分为C等,60分以下为D等。成绩等级由键盘输入。

    int main()
    {
    	char grade = 0;
    	scanf("%c", &grade);
    	printf("请输入你的成绩\n");
    	switch (grade)
    	{
    	case 'A':
    		printf("你的成绩是:100 ~ 85\n");
    		break;
    	case 'B':
    		printf("你的成绩是:84 ~ 70\n");
    		break;
    	case 'C':
    		printf("你的成绩是:69 ~ 60\n");
    		break;
    	case 'D':
    		printf("你的成绩是:小于60分\n");
    		break;
    	default:
    		printf("输入错误,请重新输入\n");
    		break;
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    运行结果:
    在这里插入图片描述
    运行流程图:
    在这里插入图片描述

    我们可以看到,switch语句的作用是根据表达式的值,使跳转流程转到不同的语句,switch语句的一般形式如下:
    在这里插入图片描述

    我们再来看一个例题:用 switch语句处理菜单命令。在许多应用程序中,用菜单对流程进行控制,例如从键盘输入一个’A’或’a’字符,就会执行A操作,输入一个’B’或’b’字符,就会执行B操作。可以按照以下以下思路编写程序。

    int sum(int x, int y)
    {
    	return x + y;
    }
    
    int diff(int x, int y)
    {
    	return x - y;
    }
    
    int main()
    {
    	int a = 0;
    	int b = 0;
    	char ch = 0;
    	printf("请输入三个数,前两个输入整数,后一个表示执行的操作\n");
    	scanf("%d %d %c", &a, &b,&ch);
    	switch (ch)
    	{
    	case 'A':
    	case 'a':
    		printf("sum = %d\n", sum(a, b));
    		break;
    	case 'B':
    	case 'b':
    		printf("diff = %d\n", diff(a, b));
    		break;
    	default:
    		printf("输入错误,请重新0入\n");
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    运行结果:
    在这里插入图片描述

    本章习题与习题讲解

    习题1:请写出下面各逻辑表达式的值。设a = 3,b = 4,c = 5
    (1) a + b > c && b = = c
    题目分析:

    a + b > c为真b == c为假,所以整体为假,所以表达式的值为0

    (2)a || b + c && b - c
    题目分析:

    因为a为真 b + c也为真,所以 a || b + c整体为真,又因 b - c整体为真,所以a || b + c && b - c整体为真。故答案为1。

    (3) !(a > b) && !c || 1
    题目分析:

    因为!的优先级在这里的逻辑运算符中是最高的所以优先算!的值,因a > b整体为假所以!(a > b)整体真,又因为c为真,所以!c为假,所以!(a>b) && !c整体为假,又因1为真,所以!(a > b) && !c || 1整体为真,故答案为1。

    (4) !(x = a) && (y = b) && 0
    题目分析:

    x = a为真,所以!(x = a)整体为假,所以!(x = a) && (y = b)这个整体为假,所以可以推出!(x = a) && (y = b) && 0这个整体为假,故而答案为0。

    (5) !(a + b) + c - 1 && b + c / 2
    题目分析:因为!优先级最高,所以 !(a + b)为假值为0,所以 !(a + b) + c - 1值为4为真,又因为b + c /2值为真,所整体为真。

    习题2:给出一位不多于5位的正整数,要求:
    (1)求出它是几位数
    代码分析:

    int digit(int n)
    {
    	int count = 1;
    	while (n /=  10)//任何数最少是一位数
    	{
    		count++;
    	}
    	return count;
    
    }
    int main()
    {
    	int num = 0;
    	scanf("%d", &num);
    	int count = digit(num);
    	printf("%d\n", count);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    运行结果:
    在这里插入图片描述

    (2)分别输出每一位数字
    代码分析:

    int digit(int n)
    {
    	int count = 1;
    	while (n /=  10)//任何数最少是一位数
    	{
    		count++;
    	}
    	return count;
    
    }
    int main()
    {
    	int num = 0;
    	scanf("%d", &num);
    	int count = digit(num);//求出位数
    	//printf("%d\n", count);
    	int e_digit = 0;
    	int i = 0;
    	for (i = 0; i < count; i++)
    	{
    		e_digit = num % 10;//将每一位数保存
    		printf("每一位数是从低位到高位:%d\n", e_digit);
    		num /= 10;
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    运行结果:
    在这里插入图片描述

    (3)按逆序输出各位数字,例如原数321,应输出123。

    int digit(int n)
    {
    	int count = 1;
    	while (n /=  10)//任何数最少是一位数
    	{
    		count++;
    	}
    	return count;
    
    }
    int main()
    {
    	int num = 0;
    	scanf("%d", &num);
    	int count = digit(num);//求出位数
    	//printf("%d\n", count);
    	int e_digit = 0;
    	int i = 0;
    	printf("逆序输出的结果是:");
    	for (i = 0; i < count; i++)
    	{
    		e_digit = num % 10;
    		//printf("每一位数是从低位到高位:%d\n", e_digit);
    		printf("%d", e_digit);
    		num /= 10;
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    运行结果:
    在这里插入图片描述
    结尾:好了,今天的内容讲解就到了这里了,如果各位觉得讲的好的话,就给作者一个三连吧,讲的不好的地方也麻烦各位多多指出,作者都会努力改进的,谢谢各位观看。

  • 相关阅读:
    opensql
    AudioLM: 音频生成的革命性模型
    【C++】你看懂C++的类和对象了么
    [附源码]SSM计算机毕业设计疫情状态下病房管理平台JAVA
    跨级通信 Provide & Inject
    Java架构师之路九、设计模式:常见的设计模式,如单例模式、工厂模式、策略模式、桥接模式等
    C++ 求 最长连号
    【基于HTML5的网页设计及应用】——实现个人简历表格和伪类选择器应用
    LabVIEW做仪器测试不知道是否适用
    使用python进行页面开发——Django模型层
  • 原文地址:https://blog.csdn.net/m0_64826370/article/details/133493880