前言:在前面我们学习了选择结构和条件判断,用if语句实现选择结构,关系运算符和关系表达式,逻辑运算符和逻辑表达式等知识。今天我们将接着上一篇未讲完的继续讲解。
鸡汤:种一棵树最好的时间是十年前,其次是现在!加油各位一起努力!
4.1 选择结构的嵌套
在if语句中又包含一个或者多个if语句称为"if语句的嵌套"。 其一般格式如下:
我们应当注意if与else的配对关系: else总是与它上面最近的未配对的if配对。
我们来看一道例题
例题:有一阶跃函数(如下图),编写一程序,输入一个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; }
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; }
运行结果:
运行流程图:
我们可以看到,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:请写出下面各逻辑表达式的值。设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; }
运行结果:
(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; }
运行结果:
(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; }
运行结果:
结尾:好了,今天的内容讲解就到了这里了,如果各位觉得讲的好的话,就给作者一个三连吧,讲的不好的地方也麻烦各位多多指出,作者都会努力改进的,谢谢各位观看。