大家好
欢迎来到实验2的上半部分
整个第二章是程序设计的基础
学习的目标是掌握基本的概念
和基本的语句
能够编写简单的程序
本部分的实验任务
是通过基本的练习
来进一步地理解
基本数据类型的使用
以及常量和变量的应用
运算符与表达式的应用
以及输入输出语句
俗话说万事开头难
如果你使用visual studio
编写和调试简单程序还有困难
那么您应该去复习一下实验1
常常有同学问我
读懂书上的例子程序很容易
可是让自己动手
写一个简单的程序
却不知道如何下手
怎么办呢
学习编程
可以从修改例子程序开始
这么做还有一个好处
本章的例题
虽然都是一些简单的问题
但是却给出了
常见问题的经典解决方法
因此可以加强我们
做软件开发的基本功
同时
改正编译时错误
和运行时的错误
也是编程的基本功
调试程序的能力和经验
需要在长期的编程实践中积累
绝大多数的编译环境
都给大家提供了辅助
调试程序的功能
也就是debug
实验2将在实验1的基础之上
进一步引导您
去熟悉其他的一些
常用debug功能
在实验开始之前
我们先来讲一些预备知识
首先来说注释
注释在程序中是起到注解
和说明的作用
以便于阅读和理解
编译器在处理注释的时候
会自动地忽略它的内容
因此
注释既不会影响程序的功能
也不会影响生成代码的大小
适当地使用注释
能够提高程序的可读性
还能让部分代码片断暂时不用
因此也是修改例题程序的利器
在C++中
有两种增加注释的方法
一种是沿用C语言中的斜杠
星号的方式
来进行整段的注释
另外一种
是用双斜杠的方法
从双斜杠开始
到整个行的结束
都是注释的部分
另外一个预备知识
是关于辅助调试工具的
为了对运行时错误
进行调试和定位
我们可以利用辅助调试工具
以实现设置断点 单步运行
观察变量
以及观察表达式的值等功能
下面我们就开始看第一个例题
在这里我们已经给大家
准备好了一个例子程序
它只有一行主体代码
它的意思是我们来看一看
int这样一个数据类型
在我们的计算机里存储
占多少个字节
在这里
我们用到了刚刚学到的sizeof
这个操作符
我们先来看一下它的运行结果
大家还记得在第一章中
为了让运行结果让我们看得清
我们需要设置一个断点
我们看到我们的运行结果
是非常完美的
非常正确地输出了int
这个数据类型的大小
在内存中是占四个字节的
现在我们结束调试
那我们在实际工作中
可能不仅仅需要知道
int这个数据类型占多少个字节
可能还比较关心
其他的一些数据类型
占多少个字节
这个时候怎么办呢
可以套用这个例子
也就是刚才我们说的
学习编程可以先从修改例子开始
我们可以把这行代码拷贝一下
在第二行里
如果我们想知道
long这个数据类型的字节长度呢
我们可以作一个修改
我们看到这里没有出现波浪线
说明在语法上它是正确无误的
没有静态的错误
接下来我们再进行一次调试
我们看到程序输出long这个类型
在内存里也是占四个字节
达到了我们想要的效果
那么有同学会问
如果我只想让它输出第二行
不要让它输出第一行
怎么办呢
就可以用到
我们刚才给大家介绍的
用注释的手段
我们可以这样注释
用斜杠星号
在这里请注意斜杠星号的配对
我们再来看一下效果
保存一下刚才的修改
我们看到这个时候
因为第一行例子程序
已经被我们注释掉了
所以我们在这里会看到
我们改过的第二行出现在这里
那么同样
大家回去还可以再试一试
我们使用双斜杠的方式
来注释整行
大家在这里可以注意一下
双斜杠和刚才斜杠星号
不同注释的这个区别
斜杠星号需要配对使用
它会把从斜杠星到星斜杠之间的
所有的语句都作为注释
而双斜杠呢是做单行注释使用
大家可以根据
自己注释的代码的长短
来选择不同的注释手段
使得注释更方便 更简捷
最后大家还可以去试一试
其他数据类型的字节长度
那因为在不同的计算机系统中
不同数据类型
所占有的字节长度
不是完全标准的
为了保证您所采用的数据类型
足够长
也就是不会溢出
在处理您的问题的时候不会溢出
所以建议
大家在第一次使用一个
计算机系统的时候
要对你常用的所有数据类型
进行一下常数的测试
以保证在您的应用环境下
数据不会溢出
下面我们就会给出
一个完整的例子
大家看到在这个例子中
我们罗列出了
一些常用的数据类型
然后并且对它的字节长度
进行测试和输出
这个例子很简单
但是很好地给我们展示了
如何从一条例子程序
衍生出你自己想要的第二个程序
然后再衍生出更多的程序代码
这就是使用注释
以及如何去进行简单地编写
和效仿例子程序的一个方法
接下来我们来看实验二
我们来看这个简单的程序
我们在这里声明了三个变量
x y和z
我们把y初始化为100
把z初始化为50
接下来把y和z相减
把它的值复制给x
然后通过这个cout进行输出
把x值进行输出
然后我们调个个
用z减去y的值
把它们的差复制给x
然后再用cout
进行一下结果的输出
最后程序返回
这是一个很简单的程序
我们几乎可以预料它的运行结果
那我们在进行动态调试之前呢
我们来观察一下
在这里出现了红色的波浪线
这里有什么错误呢
在这个波浪线上提示我们
缺少右引号
就是引号不配对
在这个波浪线提示我们
这个引号是没有定义的
同时系统也无法识别
这是怎么回事呢
这其实是我们在拷贝
和学习复制应用程序时
经常会出现的一个错误
就是当你从其他的编译器中
复制粘贴代码
到IDE环境下的时候
经常会出现中英文符号的错乱
在这里
因为这个引号
是一个中文的双引号
在我们的C++环境中
是无法识别的
所以会报出这样一个
静态的编译错误
我们在这里进行一下修改
把它改成一个中文的引号
大家可以看到
这个时候
我们的静态编译语法错误
就消失了
同样我们在return之前
设置一个断点
来观察一下前面几行语句
运行的结果
在这里我们看到输出的第一行
第一行文字呢
如我们所预期的
100减50的结果是50
但是第二行
当把z和y倒个个进行相减的时候
却出现了一个如此巨大的数字
这显然不符合我们的预期
这是怎么回事呢
为了更清楚地看到
整个程序的运行结果
建议大家在这个时候呢
不要着急
先在你认为正确的语句
设置一个断点
然后再进行
依次进行单步执行
因为我们认为第一次相减的结果
是正确的
所以我们把断点
设置在第一次相减的这个位置
接下来我们再来进行一次调试
我们在这里
当把鼠标
放在不同的变量的上的时候
它会显示这个变量当前的值
因为x并没有被初始化
它应该是内存中的一个任意值
所以它的值
大家并不需要去关心
我们看到当运行停止到
这个断点的时候
y的值是100 没有错
z的值是50 也没有错
x的值这个时候还没有改变
因为这个赋值并没有完成
那在这里插播一下
给大家解释一下
就是除了用这种方式来观察
不同变量的当前值之外
我们还可以通过底部的这些窗口
来观察不同的值
当变量比较多的时候
显然通过这种表格的方式
专用窗口来观察会更清楚
在这里
系统已经自动给我们列出了
局部变量x y和z的名称和值
那么在这里
还有一个自定义的监视窗口
那在这里你还可以再增加
比如说我想再次看到这个值
再次看到x的值
都是可以的
同时你还可以去掉
你不想关心的值
然后再重新去监视你想看到的值
这样一些手段
都是我们在调试的时候
经常用到的一些手段
接下来我们再进行单步执行
也就是说从这个断点开始
我们不会一股脑地
执行到程序的末尾
而是一行代码一行代码地执行
单步执行有几种不同的选项
我们在这个菜单栏上可以看到
有三种不同的单步运行模式
有f11这个快捷键
对应的主语句运行
有f10这个快捷键
对应的逐过程运行
还有shift f11对应的跳出
那么在这里呢
我们是用f10
这种最常用的单步执行方式
只关心每一步执行的结果
好 黄色箭头指向的就是
我们已经把断点对应的16行
这行代码已经执行过了
接下来将从第17行开始运行
那么这个时候我们来观察一下
x的值已经变成50了
我们可以看一看
在这个窗口里头我们也可以看到
这个时候x的值已经变成50了
符合我们的预期
我们再向下单步执行一步
执行到这里
在这个时候x的值并没有被更新
y的值依然是50
z的值依然是50 y的值是100
x的值还没有被更新
接下来就是
我们最关注的关键的这一步
当这个赋值完成以后
我们再来观察
这个时候x的值
变成了一个非常庞大的数字
我们会觉得很奇怪 对吧
那么这个时候我们的整个代码
就依次跟踪到结束了
类似这种错误
是比较难调试的错误
因为你一直跟踪到出错之前
都觉得程序没有任何的异常
为什么会突然出现一个
没有预期的结果呢
这种运行时错误的原因很多很多
最主要的原因就是
程序的输出类型错
和程序的逻辑错
因为我们并没有学
特别复杂的逻辑处理的这种语句
所以我们在这里
只能给大家演示数据类型错
这样一种错误的类型
大家回想一下
在第二章的开头
郑莉老师给大家介绍了
几种不同的整数类型
有短整型 长整型
还有一种就是这里给出的
无符号整型
那么无符号整型呢
它所能表示的数
是从0一直到2的8次方
和2的16次方 这样的整数
说到这里大家是不是恍然大悟
这个错误的问题在哪里呢
是因为无符号整数
不能够去表示负数
尽管我们这里是-50
但是它仍然呢
会把-50这样一个数值
把它全翻译和解释成一个
非负的整数
所以它就会出现这样一个
奇怪的大数字
那么怎么样去修改呢
相信大家都已经知道了
就是我们把这个x
前面的这个无符号unsigned去掉
把x表示为一个普通的整数
它既可以用来记录负数
也可以用来去记录正数
我们再来试一下
我们可以看到在这一步的时候
x的值是一个任意值
z的值依然是50 y的值是100
那么当这步运行结束以后
x的值变成了50
我们再继续单步运行
大家看到
刚才出错的这一句
已经被我们调整成为一个
理想的预期了
这个时候用50减去100
因为x既可以用来存储负整数
也可以用来存储正整数
所以这个时候x的值变成了-50
正常的输出了
那我们整个的调试过程就结束了
至于之后如何去生成一个
独立可运行的win32代码
如果大家还不记得的话
请您再去复习一下实验1
接下来我们来看第三个例题
在前面的例题中呢
我们可以看到
我们多次地用到了cout
来进行各种字符串的输出
还有计算结果的输出
那么在第三个例子中呢
我们再来熟悉一下cin的用法
cin和cout一样
都是标准输入输出流类库中的
一个预先定义好的
输入输出流对象
那cout是专门负责输出
而cin是专门负责输入
我们来复习一下它的用法
我们看到在这个例子中呢
我们声明了三个变量
a b和x
它们都是int类型的
也就是普通整数类型
我们在这里用cout语句呢
向用户输出了一条提示性的信息
请用户在冒号之后呢
输出变量a的值
接下来我们就用cin
把用户从键盘的输出接收进来
并且把接收进来的这个值
放到变量a中去
这就是cin的使用方法
类似地
我们会要请求用户进行
变量b的输入
并且从键盘读入b的值
放到变量b中去
那么我们这个例子
在读入了变量a的值
和变量b的值之后
要完成一项什么样的任务呢
我们希望能够把变量a和b相减
并且把它的差值
绝对值进行输出
很显然
这里有一个处理的逻辑
而且是一个非常典型的
分支情况的条件判断的处理逻辑
我们要把a和b进行相减
并且去判断一下
a减b的值到底是否大于0
如果大于0的话
我们就直接输出它们的差值
如果它们的值是0
或者负数的话
因为我们要输出的是绝对值
所以我们应该把它颠倒了相减
然后再进行输出
保证输出的值是一个非负的整数
也就是绝对值
可是我们到目前为止
到2.2节之前呢
我们并没有去学过
任何程序处理的逻辑语句
当然也包括条件判断的分支语句
那么我们如何去处理
这样一个条件判断的分支逻辑呢
幸好我们在2.2节
郑莉老师给大家介绍了
这样一个条件运算符
条件运算符
我们来回顾一下
它的基本语法结构
它是由三个表达式
和两个符号来组成的
这两个符号一个是问号
一个是冒号
其中表达式1必须是布尔类型的
那么它的执行顺序是这样的
首先去执行表达式1
如果表达式1的值为true
也就是为真的话
就会去求解表达式2的值
并且整个条件运算的结果
就等于表达式2的值
那相反
如果表达式1的值为false
也就是为假的话
那么系统就不会去计算
表达式2的值
而会跳到表达式3进行求解
并且最终的结果为
表达式3的值
我们在这里
给出了一个简单的例子
那回到我们刚才的问题上
这样我们尽管并没有学到
如何进行分支判断的
这种逻辑结构
我们就刚好在这里
可以去套用条件运算符
来实现刚才处理的这个逻辑
而且这种实现呢
会比我们后面将会学到的
if else这种分支逻辑
在整个代码的书写上更简捷
如果用if else这种分支结构
来实现的话
我们至少需要书写两行语句
一行是if 一行是else
而在这里
我们如果运用条件运算符呢
我们在这里用一条语句
就可以非常简捷地完成
刚才所说的这个逻辑功能了
那么这一行语句就是这样的
我们的表达式1呢
是来判断一下
a和b相减是否大于0
如果大于0的话
我们就把a和b相减的值
作为表达式的值输出
输出的结果赋值给变量x
如果相反
a和b相减的值等于0
或者是小于0
那么我们就把b减去a的值
赋值给x
最后进行a b差值的绝对值输出
调试一下
在这里我们可以看到
cout给我们提示了第一条文字
让我们从键盘输入变量a的值
因为今天是2015年的3月10号
我们就把a的值输入为2015
接下来呢
计算机又提示我们
让我们从键盘输入变量b的值
那么我们就输入0310
然后回车
我们可以看到运行结果是这样的
a b差值的绝对值是1705
大家算一下
刚好是我们预想的结果
如果大家还有兴趣
去挨个地去观察一下
不同变量在运行过程中的变化
那么您还可以用
刚才我们讲到的
通过这个专门的窗口
或者通过光标跟踪的方式
来在开头的地方设置断点
然后一次一次地单步调试跟踪
来依次去了解它的执行过程
和步骤
以及变量值的变化情况
那么我们的例题3呢
就讲到这里
当您开始改编程序
或者书写自己的新程序的时候
首先遇到的一个问题
就是编译时错误
和运行时错误
如果在您的程序中有语法错误
编译器会给您提示错误的位置
和错误的原因
可是遗憾的是
编译器给出的信息
往往不是非常精确
而且在很多编译环境中
错误信息还是英文的
这样就给我们初学者
带来了一定的困难
在一开始的时候
您可以借助编译器的帮助信息
甚至您还需要去查找英文字典
所以建议您准备一个笔记本
用来记下每一条
您遇到的错误信息
它的中文含义
它的根本原因
以及您排除这个错误时
使用的方法
一开始
您可能会觉得非常的麻烦
但是时间一久
您就会获益匪浅
因为这些信息
一旦你熟悉起来以后
可以大大地加快
和提高您排除错误的效率
除此之外
运行时出现的错误
才是更加难以定位和排除的
我们去定位和排除运行时的错误
被称之为程序调试
程序调试的经验和能力
需要在大量的编程实践中
慢慢地积累
不积跬步 无以致千里
那么现在
就请拿起你的笔记本
让我们从现在就开始积累吧
实验2的上半部分就到这里
我们下次再见