当前课程知识点:程序设计基础 > 第二章 变量与代数思维 > 程设论道 > 程设论道
我讲的第二章的内容
涉及到变量和类型
这是两个非常重要的概念
我以前在清华讲课的时候呢
发现学生对这两个概念
理解起来还是有一定的难度
所以我觉得我们有必要
在今天这个讨论环节
去给学生好好地来说一说
关于类型和关于变量的一些事
这个是比较抽象
我是觉得
我以前给数学系的同学讲过
他们数学系的同学肯定
第一感觉就
先把那个变量和类型去跟
数学里的变量和类型去比嘛
然后我们的类型一整
要赋个值嘛,就表示它
有个地方存它
然后 人家问
数学里面的概念就觉得
唉 我这就是个概念啊
我就给它,画个符号,就完了
不需要有个地方
所以我就觉得
我一直在给数学的同学
在强调说 一定要想着
(变量)背后是有一个内存空间的
包括我觉得
咱们这节课讲的类型
还比较少
咱们以后会有
更多更多的类型
然后,其实我觉得
既然,计算机这个语言里头
包括C++语言里头
主要的一个原则
还是说 我要定义一个变量的时候
得知道这个变量到底占多大空间
内存里对应一个内存空间
包括后面的结构越来越复杂的时候
这个类型其实表达的还是
我觉得最关键的是
它有一个固定的大小的空间
放这个变量
对 所以类型就是要给它
相当于是告诉计算机
这个变量到底要占多大的一个地儿
对 对
其实 我觉得还有一个原因
也是类型非常重要的
就是在学生去理解的时候
应该去理解说 这个类型
其实也是要去告诉计算机
存在里头的那个东西
该怎么解读
因为你存到计算机里头都是二进制
都0101嘛 对不对
大家长得都一模一样
可是为什么你这个是指数
那个是浮点数呢?
唉 它解释不一样 对吧?
所以我觉得包括前面也讲过
我们的字符类型
其实可以当成整数来理解
它们放在内存里都是0101
然后就看你怎么解释它
然后 有类型在,相当于是说
我告诉你这个0101应该这么解释
这个可能和谁的一首诗
横看成岭侧成峰
你这么看 长得是个岭
那么看 这叫做峰
意思不一样
反正还是
我们代码里头说同样一个值
如果是整数 比如说 65 66
那你可能说 我这个是字符类型
打出来 就是a b字符
就是 a啊 b啊什么之类的了
因为我们有什么ASCII码之类的
值是一样的
因为它类型不一样
他表现出来的特点不一样
然后呢 包括我们计算
比如加法 整数也可以加
浮点数也可以加
然后我们可能以后(学的)
字符串类型
看起来好像也是加号连接的
但他们译起来是不一样的
你有了类型
就能够帮助计算机来判断
到底我现在
是哪样一种计算操作
所以说计算机可以根据
你的类型来决定
现在它看到的
那个运算符
到底应该来怎么实施
我们以后还要讲函数
函数更是了 接口都是(有)类型(的)
类型必须匹配上
才能调用这样一个函数
包括这个我觉得
你要是换一个其他语言
不是C++的话
这个加号代表的意义
到底是什么啊
各个语言可能表达的
不一定是数学的加法了
到底怎么解释它
是这个语言的类型去规定的
而且你说这个我想起来
其实这个问题非常(能够反映)
我们以前一贯的观点
就是很多知识
是本来生活当中有
我们要去发现和提炼
比如你刚才说的
那个加号的问题
我们仔细回想一下
在小学的时候
我们学到的
整数的加法
老师会告诉我们说
你把这个数右对齐
最末一位对齐
然后再去加
但是我们加小数的时候
它还是那个加号
老师告诉你什么
小数点对齐 对吧
这个其实本来就是
因为两个数的种类
或者叫类型不同
所以呢 它就有不同的
加法的规则
反过来讲 就是
当我去做加法的时候
我必须知道
被加的是什么
我才能正确地操作它
所以这个东西
本来大家小学就学过了
所以我们现在
在这个(课程)上学的时候
就再次看到
类型有的时候
也要起这样的一个
相当于是决定
哪种运算来被执行
应该怎么来算
这样一个信息
对 就是你刚才说嘛
内存里头都0101嘛
有类型我就知道它到底是什么
然后怎么算
两个相辅相成的
包括说存多大地儿
整理一下 咱们刚才说的就是说
有类型就相当于是
要告诉它(计算机)
要占多大内存
然后 内存里的0101要怎么解读
最后 遇到一个符号要怎么运算
这0101解读后要怎么操作
解决由静态的操作动态的
有了这三个元素 类型的规定
使得变量这个概念更加圆了
对 对 是这个意思
我觉得这样的话
应该能够让学生听明白 理解
我觉得下一个要讨论是那个
刚才说到 变量
变量 在《程序》里头
这一章是属于第一次出现
因为在你前面第一章里头
是没有讲这个的
那我们第二章讲了
变量 这个概念
那么 首先 一个
过去学生经常问的问题
说老师 我为什么要有变量
数学里也有变量
对 数学里也有变量
你怎么跟数学系的同学讲啊
我觉得数学系的同学就是
有变量这个事
他们会觉得理所当然的
我们天然就有变量
如果是到计算机里
无非是我把数学里的那个变量
或者物理里的那个变量的概念
用在这个计算机里面
我觉得问题本身(是)
数学系的这个(同学)
经过多年培训 他们一眼就看出来
这里边变量是什么
然后我就应该
在计算机里设一个变量
但我觉得其实
在这还是有一个坎
就是咱们到后面的时候
问题里没有出现的这种变量
到计算机里 其实
应该给它设一个变量的
或者 应该是说
到底哪些东西可以
成为程序里的变量
对 什么时候我就
用变量这个东西了
对 对
实际上是这么一个问题
我当时讲的时候还是说
什么时候你需要
回归到那个类型的概念
就是需要一块内存
什么时候你需要记一个东西
这个东西 你觉得
以后还会用到
然后要有个名字
要有个地方存它
以后有可能还会改
就需要有一个变量
它不一定是我们
数学里头那个(变量)
(用来)放数
(程序里的变量)可以
(放)任何东西
只要你认为的概念 它是个东西
又需要存 那我就找个变量
需要存 还要有个名字
所以我觉得
可以把它总结为一句话
就是 (变量)是对概念的
一种符号化表示
就是 可能编程当中 算法里头
或者哪一个公式里头
有一个概念 比方说
临时值 中间变量 中间值
那么我需要去对它进行表示
那表示起来 比如给它一个名字
好去引用它
就临时变量 中间变量什么的
那这样的话就是
在这个时候
但凡是需要符号化表示的概念
可能都是需要我们把它定义成变量的东西
这是我觉得第一个
变量我们怎么来找到它
或者说哪些东西应该成为变量
其实还挺深刻的
包括数学里头也是
你说变量吧
那它肯定跟不变的有关系
就我们以前说那个
比如数学函数
那你有个变量
那怎么算这件事情
其实是一种相对固定的
相对不变的规律性的东西
所以其实变量这个提法
其实挺深刻的
变量可能跟不变的规律的东西
实际上是同时存在的
其实我们有时候分析一些问题
比方说 过去做物理实验也好
化学实验也好 去观察一个事物也好
说你总想把它搞明白的时候
其实 你在去 试图把它
搞明白这个 思维的过程
其实就是不断地看
到底什么在变 什么没有变
所以我觉得你说那个
变跟不变的这种区分
说得非常好
什么时候我们发现
问题当中问题描述本身
虽然没有这个量
但是它其实背后是有一个量
在那决定它们
可能是这个问题的一个根源
背后的那种规律
就是说 你必须把握一个
理解这种规律性的东西
你才能够说哪个是变量
哪个是相对不变的
其实就相当于是一个问题的两面
就是说 这个规律之所以成为规律
是因为这里头有变化和没变化
就是这样有一个区分存在
因为变量的存在
所以它规律才能体现出来
反过来 我们为了找到规律
那你可以有一种办法
就是说 我找到这个里头的
哪些是变化的哪些是不变的
当你把变量找出来的时候
规律自然就在那个地方
所以 或者 换角度想
我们那个程序 变量是要变的嘛
但是我们 其他那些语句 就是规律
比如像你讲那个
将来我们后面要讲到的那个
枚举 一个循环体
其实它的那个 循环体里
那些语句看上去是不变的
但是有变量在里头
它其实又是在变化的
这种变化又是符合
那个循环体所揭示的
那个算法 或者那个 所谓的规律吧
所以 这个 抽象一点说就是
我们写程序的过程实际上就是
在挖掘这个问题里的规律
但是怎么挖掘这个规律呢
先找到这个问题当中的变量
是你挖掘到这个规律的一个
非常(好的)切入点
就是看你计算思维的功力了
其实你刚才说那个函数
我就想我们过去
在学函数的时候
还有一个说法就是
因变量和自变量
其实我觉得
就是在变量这个里头
我们应该也告诉学生
这个变量其实还体现了
人们对于这个因果性的
这种理解和把握
一个变化的量 它其实
两个可能都是变量
但是谁为主 谁为次
这个里头其实还是有区别的
大家并不是一视同仁的
所以我觉得就是
在变化的过程当中
还得去看哪个是主导
哪个是被动
那这里头就有一个因果性的
这样一个体现
或者反过来讲
就是我们程序里所有变量就是
希望能够把这种事物运动的
因果性 把它表达出来
这么讲应该还是把这个变量
包括前面讲的那个类型
能够帮助学生理解得更深刻一些
提示学生们
其实你设了一个变量
不要简单地就觉得
我随随便便就设了一个
这个背后其实是有
这个把握事物规律
掌握事物因果
这样一个深刻的意境
所以它可能不止是简单的一个表达式里的一个符号
或者一个公式里的一个符号
这只是一个表面现象
但这个背后告诉我们一些
深刻的道理
-1.1 基础知识
-1.2 买菜问题
-1.3 数学运算
-1.4 补充说明
-1.5 总结
--1.5 总结
-程设论道
--程设论道
-师生问答
-第一章 编程初步--语法自测
-2.1 关于超级计算器的几点思考
-2.2 电子秤模拟 — 背景介绍及需求分析
-2.3 电子秤模拟 — 代码实现
-2.4 变量定义与变量类型
-2.5 猜数游戏与数据表示
-2.6 关于变量的讨论
--公告
-2.7 变量体现的计算思维
-程设论道
--程设论道
-师生问答
--师生问答
-第二章 变量与代数思维--语法自测
-3.1 谁做的好事——语义表示
-3.2 谁做的好事——真假检查
-3.3 谁做的好事——循环枚举
-3.4 谁是嫌疑犯——多重循环枚举
-3.5 谁是嫌疑犯——破案线索表示
-3.6 谁是嫌疑犯——用二进制枚举
-程设论道
--程设论道一
--程设论道二
--程设论道三
-师生问答
-第三章 逻辑推理与枚举解题--语法自测
-4.1 插花游戏
-4.2 筛法
-4.3 线性查找
-4.4 折半查找
--4.4.1 提问
-4.5 排序问题
-4.6 总结
--4.6.1 总结
-程设论道
--程设论道二:筛法
-师生问答
-第四章 筛法与查找--语法自测
-5.1 阶乘
-5.2 排序
-5.3 矩阵填充
-5.4 分书与八皇后
-5.5 青蛙过河
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答一
--师生问答二
-第五章 分治思想与递归--语法自测
-6.1 兔子数列问题
-6.2 分鱼问题
-6.3 橱窗的插花问题
-6.4 最长公共子序列问题
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第六章 递推与动态规划--语法自测
-7.1 统计记录总数
-7.2 统计活跃用户数
-7.3 统计在线时长
--7.3.2 结构
-7.4 总结
--7.4.1 总结
-程设论道
--程设论道
-师生问答
--师生问答
-第七章 文本数据处理--语法自测
-8.1 将数据组织成链表
-8.2 提高链表访问效率 —— 哈希链表
-8.3 以二进制文件存储链表
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第八章 非文本数据处理--语法自测
-9.1 自动售卖程序
-9.2 配制水果信息
-9.3 指定界面语言
-程设论道
--程设论道
-师生问答
--师生问答
-第九章 可配置的程序设计--语法自测