第二节 switch语句
2057:【例3.9 】星期几
#include <stdio.h>
int main()
{
// 声明一个整型变量n
int n;
// 从输入读取一个整数并赋给n
scanf("%d", &n);
// 根据n的值执行相应的操作
switch(n)
{
// 如果n的值为1,打印"Monday"
case 1:
printf("Monday");
break;
// 如果n的值为2,打印"Tuesday"
case 2:
printf("Tuesday");
break;
// 如果n的值为3,打印"Wednesday"
case 3:
printf("Wednesday");
break;
// 如果n的值为4,打印"Thursday"
case 4:
printf("Thursday");
break;
// 如果n的值为5,打印"Friday"
case 5:
printf("Friday");
break;
// 如果n的值为6,打印"Saturday"
case 6:
printf("Saturday");
break;
// 如果n的值为7,打印"Sunday"
case 7:
printf("Sunday");
break;
// 如果n的值不在1-7之间,打印"input error!"
default:
printf("input error!");
}
return 0;
}
2058:【例3.10】简单计算器
#include <stdio.h>
int main()
{
// 声明两个双精度浮点型变量x和y,用于存储输入的两个数字
double x, y;
// 声明一个字符型变量c,用于存储输入的运算符
char c;
// 从输入流读取两个数字和一个运算符
scanf("%lf %lf %c", &x, &y, &c);
// 根据输入的运算符进行相应的运算
switch(c)
{
// 如果运算符为'+',输出x和y的和
case '+':
printf("%.2lf", x + y);
break;
// 如果运算符为'-',输出x和y的差
case '-':
printf("%.2lf", x - y);
break;
// 如果运算符为'*',输出x和y的乘积
case '*':
printf("%.2lf", x * y);
break;
// 如果运算符为'/',需要先判断除数是否为0
case '/':
if (y == 0) // 如果除数是0
printf("Divided by zero!"); // 输出:除0,这是非法运算
else
printf("%.2lf", x / y); // 否则输出x除以y的结果
break;
// 如果输入的运算符不是 + - * /
default:
printf("Invalid operator!"); // 输出"非法运算符"
}
return 0;
}
2059:【例3.11】买笔
#include <stdio.h>
int main()
{
// 定义四个整型变量,分别用于存储输入的数(x)和需要四个(n4)、五个(n5)、六个(n6)的数量
int x, n4 = 0, n5 = 0, n6 = 0;
// 从标准输入获取一个数,并将其赋值给x
scanf("%d", &x);
// 如果输入的数大于4
if(x > 4)
{
// 计算输入的数x可以被4整除的次数,即需要四个的数量,并将结果赋值给n4
// 然后计算x除以4的余数,并将余数赋值给x
n4 = x / 4;
x %= 4;
// 根据修改后的x的值做不同的处理
switch(x)
{
case 1:
// 如果x的值为1,则n5(需要五个的数量)增加1,n4(需要四个的数量)减少1
n5++;
n4--;
break;
case 2:
// 如果x的值为2,则n6(需要六个的数量)增加1,n4(需要四个的数量)减少1
n6++;
n4--;
break;
case 3:
// 如果x的值为3,则n6(需要六个的数量)增加1,n4(需要四个的数量)减少1
n6++;
n4--;
// 如果n4的值大于0,则n5(需要五个的数量)增加1,n4(需要四个的数量)减少1
if(n4 > 0)
{
n5++;
n4--;
}
break;
default:
// 如果x的值为0或4,不做任何操作
break;
}
}
// 打印需要六个、五个和四个的数量
printf("%d %d %d", n6, n5, n4);
return 0;
}
1049:晶晶赴约会
#include <stdio.h>
int main()
{
int a;
scanf("%d", &a); // 从输入流中读取一个整数a
// 使用switch语句来检查a的值是否为1,3或5
switch(a)
{
case 1:
case 3:
case 5:
printf("NO"); // 如果a是1,3或5,则输出"NO"
break;
default:
printf("YES"); // 如果a不是1,3或5,则输出"YES"
break;
}
return 0;
}
1050:骑车与走路
#include <stdio.h>
#include <math.h>
int main() {
double s, tw, tb;
scanf("%lf", &s); // 从输入流中读取一个浮点数s
tw = s / 1.2; // 计算走路所需时间
tb = 27 + 23 + s / 3; // 计算骑车所需时间
int diff = (int)round((tw - tb) * 10000); // 计算时间差并将其转换为整数
// 使用switch语句来判断哪种方式更快
switch(diff) {
case 0:
// 如果两种方式用时相同,则输出"All"
printf("All");
break;
default:
// 如果走路用时更多,则输出"Bike",否则输出"Walk"
printf(diff > 0 ? "Bike" : "Walk");
break;
}
return 0;
}
1051:分段函数
#include <stdio.h>
int main() {
float x, y;
scanf("%f", &x); // 从输入流中读取一个浮点数x
int ix = (int)(x * 10); // 将x乘以10并转换为整数,以便在switch语句中使用
// 使用switch语句来确定应用哪个公式
switch(ix / 50) {
// ix / 50将x的范围从[0, 5), [5, 10), [10, 20)转换为[0, 1), [1, 2), [2, 4)
case 0:
y = -x + 2.5;
break;
case 1:
y = 2 - 1.5 * (x - 3) * (x - 3);
break;
case 2:
case 3:
y = x / 2 - 1.5;
break;
}
printf("%.3f\n", y); // 输出y,保留三位小数
return 0;
}
1052:计算邮资
#include <stdio.h>
int main()
{
int w, r = 8; // w: 重量, r: 结果
char h; // h: 是否加急
// 从输入中读取重量和是否加急
scanf("%d %c", &w, &h);
// 如果重量超过1000,增加额外费用
if(w > 1000)
{
// 如果减去1000后的重量能被500整除,则按照每500g增加4的费用
if((w - 1000) % 500 == 0)
r += (w - 1000) / 500 * 4;
else
// 否则,需要向上取整
r += ((w - 1000) / 500 + 1) * 4;
}
// 判断是否加急
switch(h) {
case 'y': // 如果加急
r += 5;
break;
default: // 如果不加急,不做任何操作
break;
}
printf("%d", r); // 输出结果
return 0;
}
1053:最大数输出
#include<stdio.h>
int main()
{
int a, b, c;
int big; // 用来存储a、b和c中最大的值
// 从标准输入读取三个整数
scanf("%d%d%d", &a, &b, &c);
// 判断a和b中哪个大
if(a > b)
big = a; // 如果a大于b,那么a就是大数
else
big = b; // 如果b大于或等于a,那么b就是大数
// 判断big和c中哪个大
if(big < c)
big = c; // 如果c大于big,那么c就是最大数
// 输出最大数
printf("%d", big);
return 0;
}
1054:三角形判断
#include<stdio.h>
int main()
{
int a, b, c;
//从标准输入读取三个整数
scanf("%d%d%d", &a, &b, &c);
/* 判断a、b、c三个数能否构成三角形,需要满足以下三个条件:
1. 任意两边之和大于第三边
2. 任意两边之差小于第三边
由于已知a、b、c都是整数,所以只需要判断任意两边之和大于第三边即可
*/
if(a + b > c && a + c > b && c + b > a)
printf("yes\n"); //如果满足条件,输出“yes”
else
printf("no\n"); //如果不满足条件,输出“no”
return 0;
}
1055:判断闰年
#include<stdio.h>
int main()
{
int year;
//从标准输入读取一个整数
scanf("%d", &year);
/* 判断一个年份是否为闰年,需要满足以下两个条件之一:
1. 年份能被400整除
2. 年份不能被100整除,但能被4整除
*/
if(year % 400 == 0 || (year % 100 != 0 && year % 4 == 0))
printf("Y\n"); //如果满足条件,输出“Y”
else
printf("N\n"); //如果不满足条件,输出“N”
return 0;
}
1056:点和正方形的关系
#include<stdio.h>
int main()
{
int x, y;
//从标准输入读取两个整数
scanf("%d%d", &x, &y);
/* 判断点(x,y)是否在以原点(0,0)为中心,边长为2的正方形内,
需要满足以下四个条件:
1. x的值在[-1, 1]之间
2. y的值在[-1, 1]之间
*/
if(x >= -1 && x <= 1 && y >= -1 && y <= 1)
printf("yes\n"); //如果满足条件,输出“yes”
else
printf("no\n"); //如果不满足条件,输出“no”
return 0;
}
1057:简单计算器
#include<stdio.h>
int main()
{
int x, y; //声明两个整型变量,表示参与运算的数字
char c; //声明字符型变量,表示运算符
//从标准输入读取两个整数和一个字符
scanf("%d %d %c", &x, &y, &c);
//switch选择语句,看变量c与哪个case后面的常量相等
switch(c)
{
case '+': //如果c是'+'
printf("%d\n", x + y); //输出x+y的结果
break;
case '-': //如果c是'-'
printf("%d\n", x - y); //输出x-y的结果
break;
case '*': //如果c是'*'
printf("%d\n", x * y); //输出x*y的结果
break;
case '/': //如果c是'/'
if (y == 0) //如果除数是0
printf("Divided by zero!\n"); //输出:除0,这是非法运算
else
printf("%d\n", x / y); //输出x/y的结果
break;
default: //如果运算符不是 + - * /
printf("Invalid operator!\n"); //输出"非法运算符"
}
return 0;
}
1058:求一元二次方程
#include<stdio.h>
#include<math.h>
int main()
{
double a, b, c;
scanf("%lf %lf %lf", &a, &b, &c); //从标准输入读取三个浮点数
double delta = b*b - 4*a*c; //计算判别式delta
//如果delta等于0(考虑到浮点数的精度问题,这里不能直接用delta==0来判断)
if(fabs(delta) < 0.00001)
printf("x1=x2=%.5lf\n", -b/(2*a)); //输出相等的根
else if(delta > 0) //如果delta大于0
{
double x_small = (-b-sqrt(delta))/(2*a); //x_small保存较小的根
double x_big = (-b+sqrt(delta))/(2*a); //x_big保存较大的根
//刚刚求出的x_small与x_big没有确定的大小关系,此处操作可以使得x_small一定小于x_big
if(x_small > x_big)
{
double temp = x_small; //交换x_small与x_big
x_small = x_big;
x_big = temp;
}
printf("x1=%.5lf;x2=%.5lf\n", x_small, x_big); //先输出较小的根再输出较大的根
}
else
printf("No answer!\n"); //没有实根
return 0;
}