4.7 用switch语句 实现多分支结构
1.用 switch语句 写一个日期读取程序
include<stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期天\n");
break;
}
return 0;
}
代码逻辑:
### switch语句:case是入口 break是出口
default 字句处理 无法匹配的情况
注:
1.
case字句 和 default字句 写在代码块的哪个位置都不影响 运行结果
case 只能跟常量(每个常量比必须互不相同)
2.
多个case可共用同一组执行语句
#include<stido.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
}
return 0;
}
switch 其值的类型必须为 整型
4.8 选择结构程序综合举例
1.判断 year 是否为闰年
#include<stido.h>
int main()
{
int year = 0;
int leap = 0;
scanf("%d", &year);
if (year % 4 == 0)
{
if (year % 100 == 0)
{
if (year % 400 == 0)
{
leap = 1;
}
else
{
leap = 0;
}
}
else
{
leap = 1;
}
}
else
{
leap = 0;
}
printf("leap的值为:%d", leap);
return 0;
}
代码逻辑:
对齐问题:最上面的对应最下面的else 往中间嵌套
1.1用逻辑表达式处理更简便
#include<stdio.h>
int main()
{
int year = 0;
int leap = 0;
scanf("%d", &year);
if ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0))
{
leap = 1;
}
else
{
leap = 0;
}
printf("leap的值为:%d", leap);
return 0;
}
代码逻辑:
注:
1.2 用逻辑变量 和 逻辑常量 true 和 false处理
#include<stdio.h>
#include<stdbool.h>
int main()
{
int year = 0;
_Bool leap = false; //定义 leap 为逻辑变量
scanf("%d", &year);
if (year % 4 == 0)
{
if (year % 100 == 0)
{
if (year % 400 == 0)
{
leap = true; //使 leap 值为真
}
else
{
leap = false;
}
}
else
{
leap = true;
}
}
else
{
leap = false; //使 leap值为假
}
if (leap == true)
printf("%d是闰年\n", year);
else
printf("不是闰年");
return 0;
}
代码逻辑:
注:
2.判断一个一元二次方程根的情况
#include <stdio.h>
#include <math.h>
int main()
{
double a = 0.0;
double b = 0.0;
double c = 0.0;
scanf("%lf%lf%lf", &a, &b, &c);
if (fabs(a) <= 1e-6)
printf("该方程不是二次方程");
else
{
double disc = b * b - 4 * a * c;
if (fabs(disc) <= 1e-6)
{
double x = (-b) / (2 * a);
printf("有两个相等的实根:\nx =%lf", x);
}
else if (disc > 1e-6)
{
double x1 = (-b + sqrt(disc)) / (2 * a);
double x2 = (-b - sqrt(disc)) / (2 * a);
printf("有两个不相等的实根:\nx1 = %lf\nx2 = %lf\n", x1, x2);
}
else
{
double realPart = -b / (2 * a);
double imagPart = sqrt(-disc) / (2 * a);
printf("有两个共轭复根:%.2lf+%.2lfi 和 %.2lf-%.2lfi\n", realPart, imagPart, realPart, imagPart);
printf("有两个共轭复根:\n");
}
}
return 0;
}
代码逻辑:
分为四种情况
1. a = 0 ,该方程不是一元二次方程
2. disc = 0 ,该方程有两个相同的实根 x
3. disc >= 0,该方程有两个不相等的实根x1, x2
4.disc <= 0 ,该方程有两个共轭负根
注:
1.浮点数存储的精度丢失问题
if (a == 0) 写法错误
如果存入一个 a = 0.00000001 能否准确录入
3.14 //3.1400000000000001
二进制存入: 11.00.1 11.00.1 = 0.125
11.00100110001... 无限逼近,极有可能发生精度丢失
abs 求绝对值的函数 //fabs求小数的绝对值
if (fabs(a) <= 0.000001) //绝对值小于0.000001,则认为这个数为 0
2. 科学计数法
1e-6——小数点后六位