当前课程知识点:基于Linux的C++ > 第二讲 程序控制结构 > 2.5 break语句 > LinuxCPP0205
好 现在我们通过日历的打印例子
给同学们演示一下
我们为什么需要break语句
让同学们有一个深刻的感性认识
我们还是按照原来的方式
新建了之后 首先把它保存起来
这样的话 下一次就能够在编辑的时候
显示语法高亮信息
现在输入我们的源代码
因为需要决定数据显示的格式
所以需要一个iomanip头
进行输入输出操纵
这是我们的主函数
我们还要加上一个标准的枚举类型的定义
SUN、MON、TUE、WED、THU、FRI、SAT
然后是WEEKDAY
正常情况下
我们需要用户输入一个日期
然后才能决定它是星期几
所以我们有一个起始日期
有一个const WEEKDAY
有个1号的起始日期
它是什么呢 它是FRI
然后我们要通过这样的一个日期
来去计算用户传过来的新的日期
最终的结果是星期几
首先我们要输出整个程序的功能性描述
cout 我们继续输出
就是问他date
然后是cin 得到这个date
在这个地方同学们就要特别注意了
实现了一个if语句 做什么用的呢
就是如果用户输入的这个日期是无效的
比如说date小于1 我问你的是什么呢
实际上是2006年的12月的
某一天的星期几的信息
你给我输入一个数据
然后date是0
有12月0号吗 没有
你给我输一个250
它有这样的250吗 没有
所以一个日期得到了之后
我们必须要对它进行数据的有效性检查
这是必须要的
是你的程序里边一定要有的
这是非常重要的一个设计原则
对于重要数据
我们要进行数据有效性检查
我们将在第四讲 讲算法的时候
会特别强调这一点
现在我们来看整个程序的实现
如果你真地输入了一个日期
是小于1的 或者是大于31的
这说明这个日期就是非法的日期
那么就会显示一个错误消息
然后程序就应该退出
这个时候退出也不退出0了
0往往表示这个程序正确退出
没有发生任何错误 所以用0
现在这里面我就用1退出
表示发生了一个日期输入错误
跟我们正常执行的时候肯定是不一样的
我们按照这个模式就能够得到正确的date
此后我们就要完成计算
weekday等于什么呢 WEEKDAY
这是个类型转换
然后是(date + (int)date_1 – 1) % 7
然后输出我们的数据
这是我们的标题 输出我们的标题
最后完成switch这部分代码
其实我们已经算出来weekday是星期几了
现在我们完成我们的switch
根据weekday的值决定
数据输出在什么特定的位置
如果它是SUN 因为是顶头
所以我们设置它的宽度是2
然后输出date
输出完了以后同学们记得要break
我们把它拷贝过来
MON是6
然后是星期二 TUE是10
然后WED是14
THU是18
FRI是22
SAT是26
正常情况下边
这已经完成了全部分支 对吧
default实际上什么也没有
它的可能取值就那么几种嘛
所以default可以不写
完成全部输出之后 我们return
这段程序代码是我们目前写的
最长的一段程序代码了
这地方还有个错误呢
终于把它查出来了
现在进入我们的Cal目录
我们来看看 main.cpp已经在了
我们g++ main.cpp 还没有问题
刚才错误就被我们找到了
a.out 我们执行看 看看什么结果
问你要日期 给一个3号
惨了 很难看 说明什么呀
说明压根就不是我们所要的
刚才我们的格式输出有问题了
“Calendar”后边缺少了换行标志
结果那个短横跟它合在一起了
然后这个日期打完了以后
它也缺少一个换行标志 对吧
我们就在这个地方用“\n”表示换行
和endl一样 现在我们重新编译它
g++ main.cpp
我们再尝试着运行一下 3号
现在打的就对了
我们现在要演示的就是最重要的地方
如果我们的程序中没有break
它会发生什么事
把所有的break都注释掉
然后重新编译 运行给你看 3号
你看看打了什么东西
太奇怪了 对不对
非常非常奇怪的一个结果
怎么打了这么多3
好 我们可以把这个地方改掉
“<< endl” 拷贝
然后我把这个去掉
我们再重新编译 再演示一遍给你看
你看它干了什么事
3号 这倒好看了 刚才很不规整
一时半会儿 不知道它为什么
会打成这个样子 对吧
我们现在可以看
这是很规整的一个结构了
现在你就知道它是什么原因了
打了几个 打了7个3
在星期天打了一个
星期一打了一个
星期二打了一个
一直到星期六都打了一个
每天下面都打了一个3号
这肯定就不对了
这就是最重要的原因
没有break
没有break语句的时候
它就会从SUN标号下边去找
去开始执行它对应的那条语句
就是“cout << setw(2)”这条语句
然后去做 把这个日期打印一下
然后做完了它就会做下一条语句
下一条语句是哪一个
下一条语句就是这一条
不是switch语句后边这一条
比如cout这一条语句 不是的
它是这一条语句 它要做一条
做完了这一条做下一条
所以这个case的标号 这个常数表达式
只起到什么时候
进入这条switch语句的作用
它并不能起到离开这条switch语句的作用
如果你想离开这条switch的这条子句
必须要加上break
没有break是不能够工作的
不信我们再执行一遍
这个时候我不用3了 我用4
4是星期一
这跟刚才可不一样
3号是从Su一直打到Sa
现在4号就从Mo一直打到Sa
它就只打了6个 我们再运行一遍
如果使用2 它一切都很正常
这是一个非常重要的地方
所以我们必须使用break
来终止这条switch
-1.1 提纲
-1.2 程序设计的基本概念
-1.3 简单C/C++程序介绍
-1.4 程序设计的基本流程
-1.5 基本语法元素
-1.6 程序设计风格
-1.7 编程实践
-第一讲 C/C++基本语法元素--编程实践提交入口
-2.1 提纲
-2.2 结构化程序设计基础
-2.3 布尔数据
-2.4 分支结构
-2.5 break语句
-2.6 循环结构
-2.7 编程实践
-第二讲 程序控制结构--编程实践提交入口
-3.1 提纲
-3.2 函数声明、调用与定义
-3.3 函数调用栈框架
-3.4 编程实践
-第三讲 函数--编程实践提交入口
-4.1 提纲
-4.2 算法概念与特征
-4.3 算法描述
-4.4 算法设计与实现
-4.5 递归算法(一)
-4.6 递归算法(二)
-4.7 容错与计算复杂度
-4.8 编程实践
-第四讲 算法--编程实践提交入口
-5.1 提纲
-5.2 库与接口
-5.3 随机数库(一)
-5.4 随机数库(二)
-5.5 作用域与生存期
-5.6 典型软件开发流程(一)
-5.7 典型软件开发流程(二)
-5.8 编程实践
-第五讲 程序组织与开发方法--编程实践提交入口
-6.1 提纲
-6.2 字符
-6.3 数组(一)
-6.4 数组(二)
-6.5 结构体
-6.6 编程实践
-第六讲 复合数据类型--编程实践提交入口
-7.1 提纲
-7.2 指针基本概念
-7.3 指针与函数
-7.4 指针与复合数据类型(一)
-7.5 指针与复合数据类型(二)
-7.6 字符串
-7.7 动态存储管理(一)
-7.8 动态存储管理(二)
-7.9 引用
-7.10 编程实践
-第七讲 指针与引用--编程实践提交入口
-8.1 提纲
-8.2 数据抽象(一)
-8.3 数据抽象(二)
-8.4 链表(一)
-8.5 链表(二)
-8.6 链表(三)
-8.7 链表(四)
-8.8 函数指针(一)
-8.9 函数指针(二)
-8.10 抽象链表(一)
-8.11 抽象链表(二)
-8.12 编程实践
-第八讲 链表与程序抽象--编程实践提交入口
-9.1 提纲
-9.2 程序抽象与面向对象
-9.3 类类型
-9.4 对象(一)
-9.5 对象(二)
-9.6 类与对象的成员(一)
-9.7 类与对象的成员(二)
-9.8 类与对象的成员(三)
-9.9 继承(一)
-9.10 继承(二)
-9.11 继承(三)
-9.12 多态(一)
-9.13 多态(二)
-9.14 编程实践
-第九讲 类与对象--编程实践提交入口
-10.1 提纲
-10.2 四则运算符重载(一)
-10.3 四则运算符重载(二)
-10.4 关系与下标操作符重载
-10.5 赋值操作符重载(一)
-10.6 赋值操作符重载(二)
-10.7 赋值操作符重载(三)
-10.8 赋值操作符重载(四)
-10.9 赋值操作符重载(五)
-10.10 流操作符重载(一)
-10.11 流操作符重载(二)
-10.12 流操作符重载(三)
-10.13 操作符重载总结
-10.14 编程实践
-第十讲 操作符重载--编程实践提交入口
-11.1 提纲
-11.2 泛型编程概览
-11.3 异常处理机制(一)
-11.4 异常处理机制(二)
-11.5 运行期型式信息(一)
-11.6 运行期型式信息(二)
-11.7 模板与型式参数化
-11.8 题外话:术语翻译
-11.9 泛型编程实践(一)
-11.10 泛型编程实践(二)
-11.11 泛型编程实践(三)
-11.12 泛型编程实践(四)
-11.13 泛型编程实践(五)
-11.14 泛型编程实践(六)
-11.15 泛型编程实践(七)
-11.16 泛型编程实践(八)
-11.17 泛型编程实践(九)
-11.18 泛型编程实践(十)
-11.19 编程实践
-第十一讲 泛型编程--编程实践提交入口
-12.1 提纲
-12.2 程序执行环境(一)
-12.3 程序执行环境(二)
-12.4 程序执行环境(三)
-12.5 程序执行环境(四)
-12.6 输入输出(一)
-12.7 输入输出(二)
-12.8 文件系统
-12.9 设备
-12.10 库(一)
-12.11 库(二)
-12.12 makefile文件(一)
-12.13 makefile文件(二)
-12.14 makefile文件(三)
-12.15 编程实践
-第十二讲 Linux系统编程基础--编程实践提交入口
-13.01 提纲
-13.02 进程基本概念
-13.03 信号
-13.04 进程管理(一)
-13.05 进程管理(二)
-13.06 进程管理(三)
-13.07 进程间通信(一)
-13.08 进程间通信(二)
-13.09 进程间通信(三)
-13.10 进程间通信(四)
-13.11 进程池
-13.12 编程实践
-第十三讲 进程编程--编程实践提交入口
-14.1 提纲
-14.2 线程基本概念
-14.3 线程管理(一)
-14.4 线程管理(二)
-14.5 线程管理(三)
-14.6 线程管理(四)
-14.7 线程同步机制(一)
-14.8 线程同步机制(二)
-14.9 C++11线程库(一)
-14.10 C++11线程库(二)
-14.11 C++11线程库(三)
-14.12 C++11线程库(四)
-14.13 C++11线程库(五)
-14.14 编程实践
-第十四讲 线程编程--编程实践提交入口
-15.1 提纲
-15.2 Internet网络协议
-15.3 套接字(一)
-15.4 套接字(二)
-15.5 编程实践
-第十五讲 网络编程--编程实践提交入口