当前课程知识点:C++语言程序设计基础 >  第2章 C++简单程序设计(二) >  实验二:C++简单程序设计(下) >  实验二C++简单程序设计(下)

返回《C++语言程序设计基础》慕课在线视频课程列表

实验二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的下半部分就到这里

我们下次再见

C++语言程序设计基础课程列表:

第1章 绪论

-导学

--第1章导学

-计算机系统简介

--计算机系统简介

--计算机系统简介 测试题

-计算机语言和程序设计方法的发展

--计算机语言和程序设计方法的发展

--计算机语言和程序设计方法的发展 测试题

-面向对象的基本概念

--面向对象的基本概念

--面向对象的基本概念 测试题

-程序的开发过程

--程序的开发过程

--程序的开发过程 测试题

-信息的表示和储存

--计算机中的信息与存储单位

--计算机的数字系统

--数据的编码表示

--信息的表示和储存 测试题

-实验指导

--实验一:VS开发环境介绍

第2章 C++简单程序设计(一)

-导学

--第二章导学

-C++语言概述

--C++的特点和程序实例

--C++字符集和词法记号

--C++语言概述 测试题

-基本数据类型、常量、变量

--基本数据类型、常量、变量

--程序举例

--基本数据类型、常量、变量 测试题

-运算与表达式

--算术运算与赋值运算

--逗号运算、关系运算、逻辑运算和条件运算

--Sizeof运算、位运算

--运算优先级、类型转换

--运算与表达式 测试题

-实验二:简单程序设计(上)

--实验二:简单程序设计(上)

第2章 C++简单程序设计(二)

-数据的输入和输出

--数据的输入和输出

--数据的输入和输出 测试题

-选择结构

--if语句

--switch语句

--选择结构 测试题

-循环结构

--循环结构——while语句

--do-while语句

--for语句

--嵌套的控制结构、其他控制语句

--循环结构 测试题

-自定义类型

--自定义类型

--自定义类型

-第2章小结

--第二章小结

-实验二:C++简单程序设计(下)

--实验二C++简单程序设计(下)

第3章 函数

-导学

--导学

-函数定义

--函数定义

--函数定义 测试题

-函数调用

--函数调用(例3-1)

--例3-2

--例3-3

--例3-4

--例3-5

--例3-6

--函数调用 测试题

-嵌套与递归

--函数的嵌套调用(例3-7)

--函数的递归调用(例3-8)

--例3-9

--例3-10

--嵌套与递归 测试题

-函数的参数传递

--函数的参数传递

--函数的参数传递 测试题

-引用类型

--引用类型(例3-11)

--引用类型 测试题

-含有可变参数的函数

--含有可变参数的函数

--含有可变参数的函数 测试题

-内联函数

--内联函数(例3-14)

--内联函数 测试题

-constexpr函数

--constexpr函数

--CONSTEXPR函数课后习题

-带默认参数值的函数

--带默认参数值的函数

--默认参数值例(3-15)

--带默认参数值的函数 测试题

-函数重载

--函数重载(例3-16)

--函数重载 测试题

-C++系统函数

--C++系统函数(例3-17)

--C++系统函数习题

-第3章小结

--第三章小结

-实验三(上)函数的应用

--实验三(上)函数的应用

-实验三(下)函数的应用

--实验三(下)函数的应用

第4章 类与对象

-导学

--导学

-面向对象程序的基本特点

--面向对象程序的基本特点

--面向对象程序的基本特点 测试题

-类和对象

--类和对象的定义

--类和对象的程序举例

--类和对象 测试题

-构造函数

--构造函数基本概念

--构造函数例题(1)——例4-1

--构造函数例题(2)——例4-2

--委托构造函数

--复制构造函数

--复制构造函数调用举例

--构造函数 测试题

-析构函数

--析构函数

--析构函数 测试题

-类的组合

--类的组合

--类的组合程序举例

--前向引用声明

--类的组合 测试题

-UML简介

--UML简介

--UML简介课后习题

-结构体与联合体

--结构体(例4-7)

--联合体(例4-8)

--结构体与联合体 测试题

-枚举类

--枚举类

--枚举类 测试题

-第4章小结

--第四章小结

-实验四(上)

--实验四(上)

-实验四(下)

--实验四(下)

第5章 数据的共享与保护

-导学

--导学

-标识符的作用域与可见性

--标识符的作用域与可见性

--标识符的作用域与可见性 测试题

-对象的生存期

--对象的生存期

--对象的生存期 测试题

-类的静态成员

--静态数据成员(例5-4)

--静态函数成员(例5-5)

--类的静态成员 测试题

-类的友元

--类的友元(例5-6)

--类的友元 测试题

-共享数据的保护

--共享数据的保护(例5-7)

--共享数据的保护 测试题

-多文件结构和预编译命令

--多文件结构和预编译命令(例5-10)

--多文件结构和预编译命令 测试题

-第5章小结

--小结

-实验五

--实验五

第6章 数组、指针与字符串(一)

-导学

--导学

-数组的定义与初始化

--数组的定义与使用

--数组的储存与初始化

--一维数组应用举例

--数组的定义与初始化 测试题

-数组作为函数的参数

--数组作为函数参数(例6-2)

--数组作为函数的参数 测试题

-对象数组

--对象数组

--对象数组 测试题

-基于范围的for循环

--基于范围的for循环

-指针的定义和运算

--指针的概念、定义和指针运算

--指针的初始化和赋值

--指针的算术运算、关系运算

--指针的定义和运算 测试题

-综合实例

--综合实例

-实验六(上)

--实验六上

第6章 数组、指针与字符串(二)

-指针与数组

--用指针访问数组元素

--指针数组

--指针与数组 测试题

-指针与函数

--以指针作为函数参数

--指针类型的函数

--指向函数的指针

--指针与函数 测试题

-对象指针

--对象指针

--对象指针 测试题

-动态内存分配

--动态分配与释放内存

--申请和释放动态数组(一)

--申请和释放动态数组(二)

--动态内存分配 测试题

-智能指针

--智能指针

-vector对象

--vector对象

--vector对象 测试题

-对象复制与移动

--深层复制与浅层复制

--移动构造

--对象复制与移动 测试题

-字符串

--C风格字符串

--string类

--字符串 测试题

-第6章小结

--第六章小结

-综合实例

--综合实例

-实验六(下)

--实验六(下)

实验二C++简单程序设计(下)笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。