清华计算机技术学院 |23~24节-- switch语句
1⃣️基本概念
1. switch语句也是多选一的操作,但switch表达式必须能以整型,字符型char,和枚举型表示(即0,1,2,3,4,5,6,7,8,9,10.....),且{}不可省略。
2. break; 的作用是跳出switch结构,执行后续语语句。
3. 多个case之间某两个case不允许相同,若相同会报错。
int num = ...; // 某个整数值
switch (num) {
case 1:
// 执行当 num 等于 1 时的代码
break;
case 2:
// 执行当 num 等于 2 时的代码
break;
// 更多 case...
default:
// 如果 num 不是任何一个 case,执行这里的代码
break;
}
2⃣️练习
问:编程实现一个简单的计算器。输入两个数字,再输入+-*/符号,输出计算结果。
#include <stdio.h>
int main()
{
int a;
int b;
char c;
printf("请输入两个数字:\n");
scanf("%d",&a);
scanf("%d",&b);
printf("请输入一个符号:\n");
scanf(" %c",&c);// 注意在%c前的空格,用于跳过之前的换行符
switch(c)
{
case '+':
printf("%d + %d = %d",a,b,a+b);
break;
case '-':
printf("%d - %d = %d",a,b,a-b);
break;
case '*':
printf("%d * %d = %d",a,b,a*b);
break;
case '/':
if (b == 0)
{
printf("wrong imput\n");
}
else
{
printf("%d / %d = %d",a,b,a/b);
}
break;
default:
printf("no calculate\n");
}
return 0;
}
问:上述代码 // 注意在%c前的空格,用于跳过之前的换行符 的意义是什么?
当使用 scanf
函数从标准输入(通常是键盘)读取数据时,输入缓冲区中的换行符(由用户按下 Enter 键产生)有时会导致问题。
1.输入缓冲区和换行符
-
1)输入缓冲区:当用户输入数据并按下 Enter 键时,输入的数据(包括最后的换行符
\n
)被存储在输入缓冲区中。scanf
函数从这个缓冲区读取数据。 -
2)换行符的影响:在连续的
scanf
调用中,如果第一个scanf
读取了数字,它不会读取后面的换行符。这个换行符留在输入缓冲区中。当接下来的scanf
尝试读取一个字符时,它会立即读取并返回这个换行符,而不是等待用户输入新的数据。
2.解决方法:空格在 %c
前
- 在
%c
前面添加一个空格告诉scanf
忽略任何空白字符(包括空格、制表符和换行符),直到遇到第一个非空白字符。这意味着它会跳过留在输入缓冲区中的换行符,并等待用户的下一个有效输入。
3.示例说明
scanf("%d", &num); // 第一个scanf,假设用户输入了数字然后按了Enter
scanf("%c", &ch); // 第二个scanf
如果用户在输入数字后按下 Enter,第一个 scanf
只会读取数字,而换行符 \n
留在输入缓冲区中。当执行第二个 scanf
时,它会立即读取这个换行符,而不是等待新的输入。
通过修改第二个 scanf
为 scanf(" %c", &ch);
(注意 %c
前的空格),这个问题就可以解决。现在,scanf
会首先跳过任何空白字符(包括换行符),然后等待并读取下一个非空白字符。
3⃣️共用case 语句
问:用 switch 实现百分之成绩转 等级制成绩。(分数1~10,等级A~E)
#include <stdio.h>
int main()
{
int a;
printf("please imput your score:\n");
scanf("%d",&a);
switch(a/10)
{
case 10:
case 9:
printf("A");
break;
case 8:
case 7:
printf("B");
break;
case 6:
case 5:
printf("C");
break;
case 4:
case 3:
printf("D");
break;
case 2:
case 1:
case 0:
printf("E");
break;
default:
printf("wrong score");
}
return 0;
}