NO.10【婳骨】の记天数小玩意

题目

原题

  1. 简述一下switch的语法, switch支持哪些类型的值
  2. 什么是switch的穿透
  3. 实际开发中 通常哪些判断使用if 哪些判断使用switch

作答

1. 简述一下switch的语法, switch支持哪些类型的值

switch 是一种选择结构的语句,用来代替简单的、拥有多个分枝的 if else 语句,基本格式如下:
switch(表达式){
case 整型数值1: 语句 1;
case 整型数值2: 语句 2;

case 整型数值n: 语句 n;
default: 语句 n+1;
}
它的执行过程是:
1) 首先计算“表达式”的值,假设为 m。
2) 从第一个 case 开始,比较“整型数值1”和 m,如果它们相等,就执行冒号后面的所有语句,也就是从“语句1”一直执行到“语句n+1”,而不管后面的 case 是否匹配成功。
3) 如果“整型数值1”和 m 不相等,就跳过冒号后面的“语句1”,继续比较第二个 case、第三个 case……一旦发现和某个整型数值相等了,就会执行后面所有的语句。
假设 m 和“整型数值5”相等,那么就会从“语句5”一直执行到“语句n+1”。
4) 如果直到最后一个“整型数值n”都没有找到相等的值,那么就执行 default 后的“语句 n+1”。
支持的数据类型
字符型,只有字符常量可以,例如’a’‘b’‘6’’\r’实际上是整型.
布尔型——真,假,实际上是0,1
整型凡表达式值为整型的都可以.
enum型也可以,因为它模拟0,1,2,3…
字符,布尔等这些类型会自动转换为整型
case 后面必须是一个整数,或者是结果为整数的表达式,但不能包含任何变量。

2. 什么是switch的穿透

c语言的switch语句是穿透的。也就是说当程序判断某个case的条件为真后,
它将在执行该case所带的的语句块之后不再对后面的case的条件进行判断而直接执行。
直到遇到一个break(一般在运用时会在每一个case的语句后加一个break;以停止switch())

3. 实际开发中 通常哪些判断使用if 哪些判断使用switch

if使用的场景:
1).针对结果是boolean类型的判断
2).针对一个范围的判断
3).针对几个常量值的判断
switch语句:
针对几个常量值的判断

代码

#include <stdio.h>
#include <windows.h>

void Bool1(double* a);
int main()
{
	double year, month, day; 
	int february, date = 0;		//定义年月日 二月的天数 以及总天数
	int year_s, month_s, day_s = 0;
	int i = 0;	//用于跳出循环
	system("title 【婳骨】の记天数小玩意");
	printf("欢迎使用【婳骨】の记天数小玩意\n\n请依次输入年、月、日:\n如带有小数仅取整数部分,注意月与日的范围!\n");
	printf("年:");
	Bool1(&year);
	year_s = (int)year;
	while (1)
	{
		printf("月:");
		Bool1(&month);
		month_s = (int)month;
		if (month > 0.0 && month < 13.0)
		{
			break;
		}
		printf("范围不对,请重新输入");
	}
	if (year_s % 400 == 0 || (year_s % 4 == 0 && year_s % 400 != 0)) //判断是否为闰年
	{
		printf("这一年是闰年!\n");
		february = 29;
	}
	else
	{
		february = 28;
		printf("这一年不是闰年!\n");
	}
	printf("这一年二月有%d天\n", february);	//打印二月份的天数
	while (1)
	{
		printf("日:");
		Bool1(&day);
		day_s = (int)day;
		switch (month_s)
		{
			case 1:
			case 3:
			case 5:
			case 7:
			case 9:
			case 11:
				if (day < 1 || day > 31) printf("不在范围内,请重新输入");	//判断奇数月天数
				else i = 1;	//用来跳出while循环
				break; 
			case 4:
			case 6:
			case 8:
			case 10:
			case 12:
				if (day < 1 || day > 30) printf("不在范围内,请重新输入");	//判断偶数月(除2月)天数
				else i = 1;
				break;
			case 2:
				if(day < 1 || day > february) printf("不在范围内,请重新输入");	//判断2月天数
				else i = 1;
				break;
			default:
				printf("输入错误,请重新输入");
		}
		if (i == 1)break;	//判断是否跳出天数的while循环
	}
	printf("%d年%d月%d日\n", year_s, month_s, day_s);
	switch (month_s)	//根据switch()的穿透性 计算总天数
	{
	case 12:
		date += day_s;
		day_s = 30;
	case 11:
		date += day_s;
		day_s = 31;
	case 10:
		date += day_s;
		day_s = 30;
	case 9:
		date += day_s;
		date = 31;
	case 8:
		date += day_s;
		day_s = 31;
	case 7:
		date += day_s;
		day_s = 30;
	case 6:
		date += day_s;
		day_s = 31;
	case 5:
		date += day_s;
		day_s = 30;
	case 4:
		date += day_s;
		day_s = 31;
	case 3:
		date += day_s;
		day_s = february;
	case 2:
		date += day_s;
		day_s = 31;
	case 1:
		date += day_s;
	}
	printf("\n这是这一年的第 %d 天。\n蟹蟹使用!('ω')!", date);
	return 0;
}
void Bool1(double* a)	//对输入数据进行判断
{
	do
	{
		if (scanf_s("%lf", a) == 1)
		{
			break;
		}
		char choice;
		while ((choice = getchar()) != '\n' && choice != EOF);
		printf("输入的不是数字!\n");
	} 
	while (scanf_s("%lf", a) != 1);
}

部分运行结果

在这里插入图片描述
在这里插入图片描述

再次感谢顾北组长长~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值