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

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

实验二:简单程序设计(上)在线视频

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

下一节:数据的输入和输出

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

实验二:简单程序设计(上)课程教案、知识点、字幕

大家好

欢迎来到实验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的上半部分就到这里

我们下次再见

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章小结

--第六章小结

-综合实例

--综合实例

-实验六(下)

--实验六(下)

实验二:简单程序设计(上)笔记与讨论

也许你还感兴趣的课程:

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