当前课程知识点:C++语言程序设计基础 > 第2章 C++简单程序设计(二) > 实验二:C++简单程序设计(下) > 实验二C++简单程序设计(下)
大家好
欢迎来到实验2的下半部分
整个第二章是程序设计的基础
学习的目标
是掌握基本的概念
和基本的语句
能够编写简单的程序
本部分的实验内容
是通过进一步地练习
来帮助大家理解
基本控制结构的运用
自定义数据类型的应用
并且来复习一下
基本的输入输出语句
头文件的作用
以及常见的Debug功能
从第二章的下半部分开始
我们学习了各种基本的逻辑控制结构
有循环结构
包括while语句 do while语句
和for语句
分支结构
if else的各种类型
以及switch case语句
还有与之配合的break与continue
此外我们介绍了
一些简单的自定义数据类型
可以说
这些是我们进行编程的
基本武器装备
练使用这些武器的基本功
对于我们掌握编程的武艺
至关重要
首先我们来看例题一
输入并运行课本上的例题2.7
也即用do while语句编程
求自然数1到10的和
我们已经把2.7这个例子
录入到我们的开发环境中去了
大家看到
它是一个非常简单的
do while的这样的一个循环
我们在这里有两个变量
一个是i 一个是sum
i是用来做每次的被加数的
依次从1到10
sum是用来记录累加和的
这样一个变量
首先我们进入了do这个循环
在do循环中有两个语句
第一条语句呢
是把当前的i值累加到
这个累加器sum中去
第二条语句呢
是当i被累加之后呢
自己增1
我们把i的值初始化为1
那自增1之后呢
i的值就会变成2
这次依次地循环
依次地累加
直到i的值到10
是最后一次循环
当i的值累加为11的时候
就不符合
while后面的这个条件判断了
于是应该当i等于11的时候
已经不能满足
小于等于10这个条件了
这个时候就会退出这个循环
退出循环以后
累计器sum中的值
刚好就是从1到10的累加和
这个时候把sum的值输出
就会得到我们想要的效果
我们来运行一下
那我们可以看到
在return之前呢
i的值变成了11
退出了循环
同时sum的值
变成了1到10的和55
符合我们的预期
我们再来看一下
这个控制台上
确实也输出了sum的值等于55
我们来停止调试
接下来
我们再来做一个小的尝试
复习一下头文件的作用
我们在这里用include的语句
引用了iostream这样一个头文件
我们这里把它删去
看一下会发生什么样的情况
当删掉了以后呢
我们可以看到
这里出现了两个
编译时的静态错误
在cout下面有波浪线
在endl下面也有波浪线
这里的提示都是cout
没有定义
endl也没有定义
这是为什么呢
这是因为cout
这个输入输出流类库的
标准输出流对象
是预先定义在iostream里面
而endl也是一样
因为我们把include
iostream删除了
所以编译器就不知道
它们从何而来了
因此会报这样的错误
那么我们把它恢复回来
再保存一下
大家可以看到
这个静态编译的错误就消失了
我们在第一章的时候
其实给大家讨论过
include编译预处理指令
以及它用来包含相关提前
定义库里的相关的用法
如果不清楚的同学
可以再回去复习一下实验1
或者再去复习一下本章的2.1节
那么对于这个例子呢
我们还想考察一下
它能否用别的办法来实现
相同的功能
我们知道do while语句
while语句和for语句
都是循环结构
那循环语句严格上
都可以用强大的for语句来完成
接下来我们将给大家看一下
用for语句来代替do while语句
来实现完全相同的功能
好啦在这里我们看到
我们用for语句来代替了刚才的do while循环
可以完成相同的功能
我们在这里做了一些代码的改变
因为在for语句中
圆括号中可以写上三条语句
其中第一条语句
是对循环控制变量进行初始化
第二条语句呢
是循环继续的条件
第三条语句呢
是循环控制变量改变的语句
可以看到我们在这里
把i的值初始化为1
作为累加值
在for语句内部呢
我们把当前的i值
累加到累加器sum中去
做完每一步循环之后呢
我们会到这里来判断一下
循环是否能继续
到i值为1的时候
显然它是小于等于10的
是可以继续的
那么在进入循环体之前呢
通过第三个语句
把i的值进行增1
这个时候i的值就会变成2
那接下来
在每一条for循环的执行中
都会把i的当前值
累计到sum这个累加器中去
一直到什么时候为止呢
当i的值等于11的时候
这个时候循环控制条件都不满足
就会从for循环中退出来
所以我们用了另外一种方式
用for语句也可以实现
刚才完全一样的功能
我们也可以来这里
再跟踪调试一下
那我们在第一个断点的时候
是进行了变量i和sum的声明
但是并没有进行初始化
那么经过了
初始化这个语句之后呢
sum和i的值都变成了0
这就进入了for循环
那在for循环里
刚开始i的值被初始化为1
这个时候sum的值被累加为1
又回到for循环的上面
来进行判断
1是小于等于10的
满足循环条件
接着去执行下一条
第三条语句
这个时候i的值
就自动变成了2
依次的这样
那么sum的值呢
把刚才的1累加成2
就变成了3
依次这样循环
这样一直进行下去
到程序结束的时候我们看到
循环退出的条件是i等于11
而sum的值是55
也符合我们的预期
那么大家除此之外
还可以再去改变一下这个程序
在for中i及i循环条件
还有什么样其他的写法
可以实现同样的功能呢
在这里
我们可以把这个循环控制条件
改为i小于11
和这里写成i小于等于10
它的这个结束条件
其实是一样的
所以循环语句有千变万化的写法
那for语句呢
可以替代while语句
do while语句
和不同的for语句的实现
那么究竟你用什么样的写法
首先取决于你要解决的问题
适合于什么样的语句来表达
其次呢
和个人的喜好
或者是描述问题的习惯
都是有关系的
我们来看例题二
编程计算图形的面积
程序可以计算圆形 长方形
正方形的面积
运算时先提示用户
选择图形的类型
然后对圆形
要求用户输入半径值
对长方形
要求用户输入长和宽的值
对正方形
要求用户输入边长的值
然后计算出面积的值
将其显示出来
首先
这是一个非常典型的
分情况讨论来处理的问题
因此非常适合用
switch case结构来描述
我们在这里对程序的功能
进行一下实现
大家一起来看一下
在这里我们声明了
一个int类型的变量iType
用来区别圆形 长方形
和矩形等不同形状的类型
我们这里声明了四个变量
是浮点数类型的变量
分别来记录圆形的半径
矩形和方形的边长
以及最后计算的
面积这样一个结果
第一条cout语句
提示用户选择计算面积的图形
1 表示圆形
2 表示长方形
3 表示正方形
接着通过cin来从键盘获取
用户的输入
放到变量iType中去
接下来
就是我们的switch case结构
来根据用户的不同输入
进入到不同的case分支中去
进行不同的面积的计算
和参数的输入
以及计算结果的输出
这里需要注意以下几点
在switch case结构中
switch括号后面的这个数据类型
这里iType是int类型的
在这里呢
还可以是其他的类型
但必须是和int类型
兼容的数据类型
第二个需要注意的一点是
在每个case分支的结尾
我们在这里都用了break
这样一个语句
这是通常情况下的配对用法
就是当每一个case分支等等
处理完毕以后
要通过break这个语句
来跳出整个switch case
这样的结构
那么也有复用不同case分支的
那么可以适当地省略break
那相关的用法
请大家再回去复习一下
郑莉老师给大家
在课堂上的详细讲解
接下来我们来跟踪一下
这个程序的执行过程
从什么地方开始跟踪呢
我们在这里选择了第一条
cout这个语句
进入调试之后我们可以看到
在这里
我们预先声明了这五个变量呢
它当前的值
都是一个类似于任意值
因为它们并没有
通过初始化语句来赋初值
接下来
就是用了第一条cout语句
就会在屏幕上输出提示信息
让用户去选择输入的类型
在这里我们选择了2
也就是我们接下来想计算
长方形的面积
那这个时候我们来看一下
iType的值这个时候是2
那么我们从下面的窗口中
也可以看到
iType的值
与我们输入一样
我们选择了类型2
也就是要计算长方形的面积
在这里switch语句
因为感知到iType的值是2
那么它就会进入第二个分支
iType的值为2的情况
进入第二个case分支
所以我们的光标
是一个正确的位置
它确实跳入到case2的入口
这个时候屏幕上应该
再次输入一个提示语句
让用户来输入矩形的长
让用户输入矩形的长度
现在执行到这一步
这个时候通过cin
获得了键盘上
用户对矩形长的输入
并且存入了变量a中去
因为它是一个浮点数
所以这个显示的是2.00000000
像类似地
这个时候我们还可以
继续按照提示来输入矩形的宽度
那它的长和宽输出了以后
我们就到了
面积计算的这样一个语句
来计算面积area
我们可以看到
面积area计算完毕
是把a和b的值相乘
那么是16.00000000
接下来就输出当前矩形的面积
可以看到
在这里输出的面积为16
2乘以8等于16
正常地完成了
整个程序的计算逻辑
我们再次单步跟踪
因为在输出面积之后
遇到了break语句
它的作用是跳出
整个switch case结构
那么就进入到
我们程序的最后一条语句
return语句
那么大家接下来
还是用类似的方法
来练习跟踪圆形
和正方形选项的情形
来进一步地
熟悉debug的基本用法
最后我们来看例题三
声明一个表示时间的结构体
以精确地记录年 月 日
小时 分和秒
提示用户输入年 月 日 时
分 秒
然后完整地显示出来
在这里我们需要用到
struct的这个结构
这个结构是把一组
相互关联的数据整合在一起
而不是分散开
那在这里这个时间的结构体
就是struct的一个很好的例子
struct的结构来自于
对C语言的兼容
在C++中的类
不仅仅把相关的数据
还把相关的功能整合在一起
加以封装
很多面向对象的优势
都是因此而来的
所以在后面
我们更多的是使用类
来作为自定义的类型
我们来看一下
这里的这个代码实现
在这里我们声明了一个结构体
它的名字叫MyTimeStruct
我们用了struct这个关键字
接下来的这个花括号里呢
给出了相关数据元素的集合
在这我们用无符号整数
表示了年 月 日 小时 分和秒
在main函数中
我们利用这个
预先定义好的自定义数据类型
MyTimeStruct声明了一个变量
叫MyTime
在这我们通过花括号的方式
对MyTime这个结构体变量
进行了初始化
在这里我们把它初始化为
2015年3月16日12点0时0分和0秒
接下来的代码就非常的简单了
通过cout不断地去提示用户
输入不同的时间元素
然后用cin呢
从键盘读入不同的时间元素的值
放到对应的时间元素中去
我们在这里回顾一下
当你去引用一个结构体变量的
某一个元素的时候
你是通过点这样一个分隔符
来引用的
那我们在这里依次提示用户输入
年 月 日 小时 分和秒
然后接下来呢
再通过输出语句
来依次地输出
这个结构体中的每一个元素
我们在这里输出语句稍微长一点
现在来进行可视化的结构输出
使得我们输出的这个数据值呢
更容易被用户所看懂
我们在这里年 月 日
用了斜杠来作为分割符
小时 分 秒
用了冒号来作为分隔符
然后最后就会程序结束
接下来
我们来进行一个简单地跟踪
和调试
那这里呢
我们把断点设置在
所有的输入都完成之后
在这一行
在这里提示用户输入年
那我们就输入2015年
3月17日16时08分00秒
那这个时候呢
所有的输入完成了
遇到了我们的断点就停在了这里
我们来观察一下
我们刚才通过键盘
录入的各种元素
是不是正确地存储到了MyTime
这个结构体变量中去
因为它是个结构体变量
所以我们可以通过点击这个加号
把它的所有元素进行展开
可以看到在这里
确实是准确无误地接收了
键盘的输入
把年 月 日
设置为2015年3月17日
小时 分 秒
设置为16时8分00秒
我们还可以用这种方式
来察看它的每个元素
光标所在之处
它可以显示当前元素的值
MyTime.year是2015年
MyTime.hour是16
那在这里
最后一个cout语句输出
这效果就是这样的
时间被设定为2015年3月17日16时18分00秒
例题三非常简单
但是事情不是仅此而已
刚才老师给出的例题
是按照老师自己习惯的方式
来进行数据输入和数据显示
那么在不同的应用场景下
你可能会希望不同的交互方式
所以接下来的扩展练习一
就是请您修改一下程序
让它按照您喜欢的方式
来进行数据的输入和输出
顺便也可以练习一下cin
和cout的用法
另外一个需要注意的是
在我们这个结构体中可以看到
它的每一个元素
都不会是一个负数
所以我们在这里的数据类型
设置为非负整数
就是unsigned int
这可以在一定情况下
避免出现负数
这样非法数据的产生
但是仍然没有办法完全地避免
非法数据的输入
比如 如果我输入了13月36日
这样的值
系统是没有办法感知
并且报错的
这是为什么呢
这是因为其中的
每一个元素的取值
其实都是一个很小的值域
比如说我们的月份
只能取1到12
而我们的日子呢
只能从1到31
小时也是0到24
1小时只有60分钟等等
就是每个元素的取值
都有一个很小的值域
那么接下来的一个问题呢
希望大家回去修改一下代码
来作为一个练习和思考
如何去修改当前的代码
使得系统只能去接收合法的数据
这个问题听起来似乎有点复杂
那么给大家两个小提示
第一个呢
大家可以试着使用一下
自定义类型中的枚举类型
来约束各个时间元素的取值
这个可以参照我们的例题中
约束从周一到周日
这样的时间元素的取值
第二个提示呢
是可以在每一次cin之后呢
通过if else这样的语句
来进行条件判断
看当前输入的这个值
是否落入在合法的范围之内
如果是的话就接收输入
如果不是的话
会提示用户
并要是用户重新输入
所以我们扩展例题2是
修改一下当前的这个程序
让它只接收合法的时间数据
并且只输出合法的时间数据
在第二章里
我们学习了C++的基本概念
和基本语句
能够编写简单的程序
这为我们C++程序设计
打下了一个良好的基础
同时我们也进一步地熟悉了
修改编译时静态错误
和调试运行时错误的常见方法
还记得上一次
我给大家说的小本子吗
多多练习 多多积累
就会越来越高效
实验2的下半部分就到这里
我们下次再见
-导学
--第1章导学
-计算机系统简介
--计算机系统简介
--计算机系统简介 测试题
-计算机语言和程序设计方法的发展
--计算机语言和程序设计方法的发展 测试题
-面向对象的基本概念
--面向对象的基本概念 测试题
-程序的开发过程
--程序的开发过程
--程序的开发过程 测试题
-信息的表示和储存
--计算机的数字系统
--数据的编码表示
--信息的表示和储存 测试题
-实验指导
-导学
--第二章导学
-C++语言概述
--C++语言概述 测试题
-基本数据类型、常量、变量
--程序举例
--基本数据类型、常量、变量 测试题
-运算与表达式
--运算与表达式 测试题
-实验二:简单程序设计(上)
-数据的输入和输出
--数据的输入和输出
--数据的输入和输出 测试题
-选择结构
--if语句
--switch语句
--选择结构 测试题
-循环结构
--for语句
--循环结构 测试题
-自定义类型
--自定义类型
--自定义类型
-第2章小结
--第二章小结
-实验二:C++简单程序设计(下)
-导学
--导学
-函数定义
--函数定义
--函数定义 测试题
-函数调用
--例3-2
--例3-3
--例3-4
--例3-5
--例3-6
--函数调用 测试题
-嵌套与递归
--例3-9
--例3-10
--嵌套与递归 测试题
-函数的参数传递
--函数的参数传递
--函数的参数传递 测试题
-引用类型
--引用类型 测试题
-含有可变参数的函数
--含有可变参数的函数 测试题
-内联函数
--内联函数 测试题
-constexpr函数
--CONSTEXPR函数课后习题
-带默认参数值的函数
--带默认参数值的函数 测试题
-函数重载
--函数重载 测试题
-C++系统函数
--C++系统函数习题
-第3章小结
--第三章小结
-实验三(上)函数的应用
-实验三(下)函数的应用
-导学
--导学
-面向对象程序的基本特点
--面向对象程序的基本特点 测试题
-类和对象
--类和对象的定义
--类和对象 测试题
-构造函数
--构造函数基本概念
--委托构造函数
--复制构造函数
--构造函数 测试题
-析构函数
--析构函数
--析构函数 测试题
-类的组合
--类的组合
--类的组合程序举例
--前向引用声明
--类的组合 测试题
-UML简介
--UML简介
--UML简介课后习题
-结构体与联合体
--结构体与联合体 测试题
-枚举类
--枚举类
--枚举类 测试题
-第4章小结
--第四章小结
-实验四(上)
--实验四(上)
-实验四(下)
--实验四(下)
-导学
--导学
-标识符的作用域与可见性
--标识符的作用域与可见性 测试题
-对象的生存期
--对象的生存期
--对象的生存期 测试题
-类的静态成员
--类的静态成员 测试题
-类的友元
--类的友元 测试题
-共享数据的保护
--共享数据的保护 测试题
-多文件结构和预编译命令
--多文件结构和预编译命令 测试题
-第5章小结
--小结
-实验五
--实验五
-导学
--导学
-数组的定义与初始化
--数组的定义与使用
--一维数组应用举例
--数组的定义与初始化 测试题
-数组作为函数的参数
--数组作为函数的参数 测试题
-对象数组
--对象数组
--对象数组 测试题
-基于范围的for循环
-指针的定义和运算
--指针的定义和运算 测试题
-综合实例
--综合实例
-实验六(上)
--实验六上
-指针与数组
--指针数组
--指针与数组 测试题
-指针与函数
--指针类型的函数
--指向函数的指针
--指针与函数 测试题
-对象指针
--对象指针
--对象指针 测试题
-动态内存分配
--动态内存分配 测试题
-智能指针
--智能指针
-vector对象
--vector对象
--vector对象 测试题
-对象复制与移动
--移动构造
--对象复制与移动 测试题
-字符串
--C风格字符串
--string类
--字符串 测试题
-第6章小结
--第六章小结
-综合实例
--综合实例
-实验六(下)
--实验六(下)