前言:在前面我们学习了选择结构和条件判断,用if语句实现选择结构,关系运算符和关系表达式,逻辑运算符和逻辑表达式等知识。今天我们将接着上一篇未讲完的继续讲解。
鸡汤:种一棵树最好的时间是十年前,其次是现在!加油各位一起努力!
在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;
}
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;
}
运行结果:
结尾:好了,今天的内容讲解就到了这里了,如果各位觉得讲的好的话,就给作者一个三连吧,讲的不好的地方也麻烦各位多多指出,作者都会努力改进的,谢谢各位观看。