当前课程知识点:C语言程序设计(上) > 选择结构的程序设计 > 3.6 选择结构的程序实例 > 3.6 程序展示
最后我们大家再来
看一道例题
这是一个稍微综合一些的题目
问题是这样
输入我们从键盘上敲
某一年某一月某一天
比如说
今年2014年
9月5号
那么 我们把这一天敲进去
让计算机来判断这一天
是这一年的第几天
我们看
对这个问题里边
我们是不是涉及到了
这么三个变量
年月日
还有什么
还有你最后要计算的这一年
现在过了多少个月
你输入的那个月
是多少个月
而且这个月里边大家还要注意
哪个是大月哪个是小月
是30天还是31天
然后还要说
你最后说的那个月的那一天
它不是个满月
比如说5号
那这个月
你前四个月是满月整数月
这个月只有5天
是不是大家考虑这个日期
应该是说
前面四个月的天数加起来
再加上这一个月的这5天
就是这一年的第sum天
所以sum应该等于什么
加上day
因为给的日子是day
这个问题
除过我们刚才说的大月小月
这一点之外还有一个
非常重要的问题需要注意
这个问题是什么
这一年是不是闰年
如果你是闰年并且
你选的是超过了2月份
什么意思呢
如果这一年是闰年
可是你选的月份是1月份
那与闰年没有关系
因为闰年只涉及到2月它是
28天还是29天
如果是闰年你选了
3月份4月份也就说
超过了2月份以后的任何月份
那2月份就是一个整数月
2月份到底算28天还是算29天
就是个问题
所以要判断是不是闰年
并且这一年你选的这个月份
是不是超过了2月份
所以这块
sum里边有一件事情
就有一个一天的差别
是需要注意的
这个算法的描述我们看
是不是可以这样
大家看
先输入年月日
然后计算sum
sum是某月之前的月份的总天数
然后再计算
是什么意思
前面的sum只是那些整数月的
整数月的
然后还要加上
你当前月的那个天
这个事情做完了以后
你需要判断一下
我先默认它不是闰年
我已经做完了
做完了之后我判断它是闰年吗
你是闰年并且你的月份是
超过了2月份了吗
如果是
需要在sum里边加1天
sum里边加1天
否则刚才的做法就是对的
与闰年没有关系
就直接输出sum
也就说你这块
是不是闰年只差一个什么
要不要加这1天
是闰年加1天否则不加
这就是我们整个这件事情的
一个流程
这个流程里边大家注意两个
前边这个计算sum
就是整数月的天数
要注意大月和小月
比如你输入的是11月
那前边的1到11月
1到10月你都要考虑
它是30天还是31天
程序我们看看
是不是这样
这块大家先看一下前边
我们定义了四个变量
年月日和sum
就是累加器
下边的scanf读进了年月日
然后我们用了一个什么样的结构呢
switch switch结构
在这个结构里我们条件是用谁给的
是用月
比如说 我是5月
那我这里边
月里边我输入的是5
这里边就是常量 里边是数值5
现在下边问
你刚才输的月是1吗
当然不是
是2吗 不是 是3 4 不是
从5入口
从5这块入口
前面四个都没有
这四条路径都没有走
从5月这入口
sum等于什么
120
也就说5月之前的这个天数
一共是120
然后break
120天 break
break完了吗
一定没完
你现在才算出来
这里边的任意一个入口
只支持了你算出来整数月
还有你当前月的天数
所以下面要做一件事
sum加上day天数
比如我们刚才说是5月5号
我这个也加上了5
那就是120天加上5就是125天
送到了sum
然后
下边要做我们刚才说的
判断是不是闰年
怎么判断闰年
我们看前面曾经举过一个例子
怎么判断闰年呢
是这个年份能被400整除
或者是能被4整除
并且不能被100整除
这样子
而且这里边还有一个
end了一个什么东西
这个月份是大于2月份的
这个东西才需要算
否则是不需要算的
如果是这样就给sum加1天
否则就直接输出
就可以了
无论加还是不加
这是一个单选择
这只是一个单选择
无论加还是不加大家都会输出sum
这个天数
大家看这个程序看上去很长
但是结构很简单
定义了几个变量然后输入
人机交互的方式输入这个变量
然后进入了switch
问月数是哪个月
然后就得到了这个月之前的天数
再加上当前的月
再加上是不是闰年的这个问题
所有问题考虑完了
这件事情我们得到结果
我们再来看一道例题
这个例题是我们前面用过的
是算银行的利率
我存了一些钱
到底本金和利息能拿到多少
我们是用多路径的选择
if else嵌套这个方法来实现的
我们用switch来实现一下这个功能
是不是这个程序看上去更简洁一些
用switch解决问题最关键的是
里边的条件是谁
我们现在说条件里边是year
year是什么
我们给它定义成是整型的
然后是你要存的时间段
这个是你的钱数 利率
和你的总的本金和利息
合起来的一个总数
我们读进来的是
你存的存款以及要存多长时间
多长时间这件事
我们是用整型的
所以它可以在switch的条件里边出现
是因为switch的条件里边大家是知道的
它一定是只能是整型或者字符型
因为字符型就是整型
所以总归一句话
它只能是一个整型数
它不能是一个实型数
为什么不能
最主要的是case后边都是常量
是常量或者符号常量
是常量而且是整型常量
这里边要出现实型数
跟它就没法比较了
所以这里边只能是整型数
我们读进来你存的钱数和你的时间
然后这进入了判断
你存的时间段是1年吗
比如说我是存了3年
那我现在是1年吗 不是
那这条路不走了
是2年吗 不是
这条路也不走了
是3年吗 是3年
做这件事
这件事做了给利率赋了
赋值0.005
然后break
break的哪里呢
到了default的底下
到了switch的出口处
这是switch的出口处
switch入口处在这
这个红颜色
switch出口处在这
到了switch的出口处
我们就该算了
总共拿到多少钱
这跟我们刚才是一样的
把这个钱数算出来
然后printf输出
我们现在看什么不同了
刚才的if else
else这样的东西现在被这种开关
开关是一档吗两档吗三档吗
五档吗八档吗
如果你输错了
你前边的什么都不是
比如你输了9
或者你存了10年
你存了10年
也是按8年的利息给你
按8的利率给你
当然时间它要给你算到10年
按8年的利率给你
所以这块你这样是不合算的
所以你要是输入了
不是这几年里边的任何一个
它就走了default
比如输入了一个6
即不是5也不是8
也就说你的利率要给你5
按5年给你不是吃亏了
按8你又够不着
所以这时候它没有算
这种情况我们都用default
利率是0
你存了多少没有给你利息
你还愿意做吗
你不愿意做那就考虑一下
你重新选择
大家看
这个程序实现这个功能
用switch也是非常合适的一种选择
default在这起了一个什么作用呢
如果你选择的年不合适的话
在这块给你提了个醒
当然你这块还可以做的是
不是给rate赋了一个0
你完全是
可以给它提个醒
是你给它提个醒
你这里边你要返回去
做什么事情
你输入的年号不合适等等
也可以是这样做
给你明显的一个明示
无论怎么样
比如我们现在运行一下这个程序
我们看一下
比如我存的是一个15万
15万不要是15元
然后存多长时间
存3年
这样我们拿15万存了3年
我们可以得到27000块钱的利息
大家看
回过头来看
这个程序看上去比if else
看上去明快一些
所以我们今天举的例子
都是比较简单的
简单的一个应用
实际上在一些更复杂的应用背景的
情况下
switch这个语句
它的功能还是非常的好用的
-1.1 计算机的问题求解方法
--讨论题:数学模型
-1.1 计算机的问题求解方法--作业
-1.2 C语言与C程序
--讨论题:运算符
-1.3 C语言处理系统与程序调试运行
--例程
-1.4 程序中的人机交互
--例程
--作业讨论区
-2.1 算术运算的C程序实现
--算术混合运算.c
-2.1 算术运算的C程序实现--作业
-2.2 关系运算的C程序实现
--bukao.c
--字符比较.c
--讨论题:比较大小
-2.2 关系运算的C程序实现--作业
-第二周作业--作业
-2.3 逻辑运算的C程序实现
--计算结合性
--闰年.c
--自动购票问题.c
-2.3 逻辑运算的C程序实现--作业
-2.4 位运算的C程序实现
--讨论题:位运算
-2.5 几种很个别的运算
--讨论题
--讨论题
-2.5 几种很个别的运算--作业
-2.6 混合运算及数据类型转换
--讨论题:数据类型
-2.7 顺序结构程序实例
--Video
--三角形面积.c
--讨论题:工业产值
-2.7 顺序结构程序实例--作业
-3.1 程序中的路径选择实现
--打印学生成绩.c
--一元二次方程.c
-3.1 程序中的路径选择实现--作业
-3.2 路径中的再选择——嵌套判断
--例程
--讨论题:程序改错
-3.2 路径中的再选择——嵌套判断--作业
-3.3 复杂判断问题的C程序设计
--3.3 多级选择
--银行存款.c
--讨论题:多级选择
-3.4 多分支问题的C程序设计
--加减乘除运算.c
-3.4 多分支问题的C程序设计--作业
-3.5 GOTO的适当使用
-3.6 选择结构的程序实例
--3.6 程序展示
--计算第几天.c
--讨论题:输出奇数
--讨论题:计算税金
-3.6 选择结构的程序实例--作业
-第四周作业--作业
-4.1 需要重复执行的程序
--求和.c
--打印学生成绩.c
--统计录入速度.c
--求平均数.c
-4.1 需要重复执行的程序--作业
-4.2 至少要执行一次的循环
--n的阶乘.c
--字符分类统计.c
-4.2 至少要执行一次的循环--作业
-4.3 已知循环次数用for语句
--求和问题.c
--数列求和.c
--讨论题:循环语句
-4.3 已知循环次数用for语句--作业
-4.4 循环控制——简单循环应用
--水仙花数.c
--讨论题:死循环
--讨论题:猜数字
-循环结构的程序设计(一)--4.4 循环控制——简单循环应用
-4.5 循环的嵌套
--讨论题:程序运行
-4.5 循环的嵌套--作业
-4.6 break与continue
--最大素数.c
-4.6 break与continue--作业
-4.7 循环的综合应用
--数的排列组合.c
--鸡兔同笼.c
--打印空心字符.c
--讨论题:打印图形
--讨论题:计算闰年
-第六周作业
-第六周作业--作业
-5.1 同类有序数据处理问题
-5.2 一维数组的定义和引用
--数组定义.c
--数组初始化.c
--反向输出.c
--讨论题:对称数
-5.2 一维数组的定义和引用--作业
-5.3 一维字符串数组
--讨论题:编程
-5.4 字符串处理函数
--字符串反向.c
--字符串函数
-5.5 二维数组的定义与使用
-5.6 二维数组的输入输出
-5.6 二维数组的输入输出--作业
-5.7 二维数组的应用
--转置矩阵.c
--讨论题:修改程序
-5.8 二维字符数组
--5.8 单词排序
--单词排序.c
-5.8 二维字符数组--作业
-5.9 数组综合应用
--统计成绩.c
--统计字符次数.c
--讨论题:洗牌
-本期课程结束语
--end
-第八周编程作业
-《C语言程序设计(上)》期末复习参考
--html
-《C语言程序设计(上)》期末复习参考答案
--html