我开发了一个基于 Beancount 的账本托管服务 HostedBeans,欢迎大家来了解纯文本复式记账并试用我的服务。
归档 2012 年 11 月

C++ 讲稿 4.处理数据

By 精英王子

CC-BY-NC-SA(署名-非商业性使用-以相同方式共享) 3.0

注:解说在图片下方

原始幻灯片(持续更新):https://docs.google.com/presentation/d/1kcyy3IevzXQI5Ce0n60ERZmPfbPywErbCSkdazBkGXg/edit

解说写在讲者备注

1

可以说数据就是编程的核心,任何一个程序无非都是接收一些数据,通过加工,再输出一些数据。

这里的数据可以是文字、数字、图像、声音等等。

在第二节Hello World中我们已经见到了如何定义变量,如何利用变量进行简单的运算,这节课我们会详细了解如何使用变量。

2

变量用于储存数据。

这是一条定义变量的语句,就好像为变量申请到了储存的空间,供以后储存数据使用。

double是数据类型,数据类型必须是之前已经定义过的,double在这里表示浮点数,稍后我们会介绍更多的数据类型。

a是变量的名字,这是由你决定的,当然,给变量命名也有一些规则,稍后介绍。在之后的代码中,你就可以用a这个名字来表示这个变量了。

最后是一个分号,在C++中不光是定义变量的语句,所有语句都要以分号来结尾。

3

double a,b; 像这样可以同时定义两个变量,它们的类型都是double,名字分别是a和b.

这和下面两句,分别定义a和b是完全等价的。

还记得以两个斜杠开头的那一行么,那是注释,编译器会无视它。

double a=1.23;还可以像这样,在定义变量的同时,给他一个初始的值。

(在这个例子中,其他情况存在例外)这和下面两行是等价的。

等号在这里是“赋值号”,用来把右边的值复制到左面的变量中。

4

在给变量命名的时候,我们需要遵守一些规则。

这里的不推荐是C++标准规定的,以下划线开头的变量可能被编译器保留用于特殊用途。

C++的关键字就是在C++中有特殊意义的词,它们是语法的一部分,不用用来做变量名,但是可以是变量名的一部分(如print).

要尽量选择有意义的单词,以便于阅读代码。

5

C++的每个变量都有一个类型,变量的类型决定了它能储存何种数据、进行何种运算,一个变量的类型一旦确定就不能更改。

C++中表示整数的数据类型有4种,他们的区别只是长度。short表示稍短一点的整数,int表示最适合CPU计算的长度的整数,long是稍长一点(其实在Windows XP/7上他们和int一样长),long long则更长。

幻灯片上列出的是他们在GCC、Windows XP/7上的具体长度,其他操作系统、编译器可能不同。C++没有明确规定某个数据类型的长度,这样保证了它能够运行在任何平台上,如手机、计算器等等。

在这些数据类型名称的前面加上unsigned,即表示无符号。比如int是区分正负的,可以储存负数,而unsigned int则是不区分符号的,只能储存正数。

因为少了一位用来表示符号的位,所以无符号类型要比有符号类型能表示的数的范围大一倍。

通过上节课的知识,我们可以算出各个数据类型可以表示的数字的范围,例如short是16bit,可以表示65536个数,因为short是区分符号的,所以可以表示-32768到32767. 而unsigned short则可以表示0-65535.

这里的short、int、long、unsigned都是C++的关键字,你不能用它们作为变量名。

6

就像一个轮子一样,如果超出了它能够储存的最大值,就会从头开始。

这种现象叫溢出,在C++中,溢出是不会有警告的,需要自己注意。

7

浮点数有三种,同样,区别仅仅是长度。同样,不同平台具体的长度可能不同,以上是GCC在Windows XP/7的长度。

浮点数永远区分正负,没有对应的无符号版本,同样float和double都是C++的关键字。

8

bool是这样的一种数据类型,它表示是(true)或者否(false),表现上就好像一个比特一样,但它实际上会占用一个字节的空间。

在C++中true代表是,false代表否。同时,其他类型的数据(如整数)也可以向bool类型转换,在C++中0表示否,其他非0的数都表示是。

bool、true、false都是C++的关键字。

9

字符类型刚好是一个字节,可以储存一个字符。

在C++里面,字符要用单引号括起来,字符是指一个字母或者一个符号,而不是多个字母或符号。

或者你可以直接写字符对应的ACSII码,两种方法是等价的。

char同样是C++的关键字。

10

string表示一个字符串,可以是英文、符号、中文,甚至是空的。

值得注意的是,string并不是C++的关键字,也不是C++语法的一部分,它来自标准库,所以我们需要在程序开头加上#include表示这个程序需要使用来自标准库的string.

以反斜杠开头的叫转义字符,可以用它们来表示一些无法直接输入的字符,比如换行、双引号等等,如果确实需要表示反斜杠本身,要使用两个反斜杠。

11

%表示求模,即a%b表示a整除b后的余数。

b=10.0/3.0; 之前我们知道=是赋值号,用来把右面的值复制到左边的变量中。

但在这里,右边并不是一个值,而是一个算式,所以会先计算这个算式的值。之前我们还讲到,类型决定了它能够进行何种运算。

10.0在这里并不是变量,而是一个值(字面值),但它也有类型,它是浮点数,通过在整数10后面加上小数点,可以让它变成浮点数,进行浮点数的计算,得到带小数的结果3.3333.

如果改成10/3,那么10和3都是整数,他们会进行整数的计算,计算结果会省略小数,即3.

虽然b可以储存小数,但这个除法计算是在赋值给b之前发生的,赋值给b的值已经是整数3了。

12

前面的课程提到,标准库中提供了众多实现基础功能的函数,今天我们介绍其中的几个数学函数。

如幻灯片,值得注意的是C++标准库中三角函数有关的函数均使用弧度制。

上面有一段代码演示了如何使用函数,首先是一个函数名,然后是括号,括号里面是以逗号隔开的参数列表。

参数就是你传递给函数的数据,比如我们要算4个平方根,就要将4作为参数传递给sqrt函数,具体有几个参数,取决于具体的函数。

比如pow接受两个参数,它会计算第一个参数的第二个参数次幂。

调用函数后,函数会返回计算结果,你可以将计算结果直接赋值给变量,就像直接书写一个值一样。

这些数学函数来自标准库的cmath部分,需要加入对应的包含语句。

13

14

如果我们要计算一个一元二次方程的根怎么办?我们需要判断一元二次方程的判别式(b^2-4ac)与0的大小关系。

下节课我们将讨论如何利用条件语句进行逻辑判断,让程序不再是一条直线,而是可以分支的。

C++ 讲稿 3.计算机如何储存数据

By 精英王子

CC-BY-NC-SA(署名-非商业性使用-以相同方式共享) 3.0

注:解说在图片下方

原始幻灯片(持续更新):https://docs.google.com/presentation/d/1-9F3hQxXXlFk_ftLbh5C1gKnKcw–tnODPcD40TEg7g/edit

解说写在讲者备注

1

左下角,我们平时能够看到每个文件都有一个数字来表示他们的体积,数字后面还有各种不同的单位。

这节课我们就来了解计算机如何储存数据,这一节并不限于C++,所有的计算机、编程语言都是这么做的。

2

位是表示数据最基础的单位,他就像一个开关,只能表示两种状态之一,计算机很喜欢这种表示方法。

一个位只能表示两种状态之一,但通过将多个位组合在一起,即可表示更多种状态之一。

计算机通过将多个位(通常是几百万、上千万)通过一定结构,组合在一起,来表示数据。因此计算机以二进制为基础。

3

二进制数有很多特殊的性质,例如0.1在十进制中是有限小数,而在二进制中是无限小数。

十六进制数保留有二进制数的性质(因为十六是二的整数次幂),而且表示起来比二进制简短,所以有时我们也使用十六进制。

为了不至于把二进制、十进制、十六进制搞混,我们在书写的时候通常会在二进制数后加B作为后缀,在十六进制数前加0x作为前缀,十进制数原样书写。

或者用下标来表示进制。

4

所谓浮点数就是说小数点的位置是可以改变的,通过修改指数的大小,即可改变小数点的位置。

通过科学计数法,一个小数被划分为三个部分,它们都是整数,所以我们可以按照之前提到的储存整数的方法进行储存。

5

6

通过前面的介绍,可以得出这样的结论,计算机本质上储存的是数字,二进制数字。

所以如果想让计算机储存文字,必须指定一种从数字的字符的转换方法。

在ASCII中,每个字符对应一个二进制数字,通过储存这些数字即可表示这些字符。

特殊字符即各种无法直接显示在屏幕上的字符,如回车、换行等。

7

GB18030收录了7万多个汉字,自然无法用一个字节表示 (一个字节只能表示255个字符之一),所以我们需要用多个字节来表示一个汉字,所以GB18030属于多字节字符集。

同一个数字,在不同的字符集里面可能会表示不同的字符,将一个本来是GB18030(中文)编码的文件以日文字符集打开,就会看到日文字符,但这并不是翻译,而是乱码。

在一个使用GB18030(中文)编码的文件中,你无法插入日文字符,因为GB18030是中文字符集,其中没有日文字符。

为了解决这种混乱,成立一个叫Unicode的项目,他们指定了一组字符集,收录了世界上所有文字的字符。其中包括比较常用的UTF-8字符集。

8

我们时常在单位的前面加上一个前缀(“国际单位制词头”)来对单位放大或缩小一定的倍数。

对计算机中的字节也是一样,我们用1kB表示1000B,用1MB表示1000KB.

发现问题了么?你一定听说过计算机使用2的10次方——1024来进行进位。但是物理学早就规定k表示1000倍,

于是,大家又创建了一组新的词头:Ki、Mi、Gi等,他们以1024来进位而不是1000.

9

在大多数情况下,KiB、MiB中的i会被省略,甚至大多数人都不知道还有个i,有些软件也直接省略了i,但也有一些软件将i完整地写了出来。

10

11

理想

今天我们班开了一个“花有重开日,人无再少年”的班会,主题也就是梦想、理想。我觉得梦想和理想这两个词还是有区别的,前者更倾向于无法实现、不受自己控制的;而后者倾向于可以通过努力达到的。

似乎在班主任、班会的组织者、来我们班的实习老师、大多数同学的眼中,理想一定是要去上某个大学,而之后,就没有了。

实习老师讲他如何刻苦学习,如何拿到了众多奖项;幻灯片上提到了最近新闻中的“清华学霸”,还展示了她们的日程表。我承认他们都是优秀的,但是一定要要求每个人都这样做么?

主持人请我们班一直以来成绩排名第一的龙哥来谈谈自己的理想,龙哥说“希望有个健康的好身体、好好活着,身体是‘革命’的本钱”,大家都笑了。虽然这其中有玩笑的成分,但“有个健康的身体”、“好好活着”就不能是一个人的理想么?如果这话不是班级成绩第一,而是成绩靠后的同学说出来的,还会仅仅是善意的笑么?

再或者,有些人喜欢钱,即使已是富翁,还是爱钱,但他们一定是庸俗的么?可能赚更多的钱是他们的理想,更多的钱可能只是符号,但那是个人能力的象征。

什么时候连“你的理想是什么?”都有了标准答案,你当这是流水线么。有人这样说:在教育的流水线上,我是一个残次品,但我庆幸,我是那个残次品。

再说我自己,上不上大学,我还没有决定,但这并不重要。能取得怎样的成绩,取决于人,而不是上不上大学。不上大学不等于停止学习,恰相反,那些抱着“上了大学就可以随便玩了”的家长和同学才是失败者。

毫无疑问,我对计算机/互联网方面兴趣很大,也投入了很多努力。IT界瞬息万变,我也无法预测几年后的前沿技术是什么。我希望我在经过几年的经验积累之后,能够自己开发(而不是给别人打工)出一款产品,能够有人用,有人关注,越多越好。钱不是我关注的,有人用户、有人关注,自然会有钱。

短期内,我希望在我高中毕业前完成“零毫秒”——一个去中心化的网络。

物以类聚,人以群分。劝我按部就班读大学的,身边一定都是普普通通,上学、工作的朋友;若我今后奋斗成功,我的身边也一定是自己奋斗、喜欢冒险的人;若我失败,身边也一定都是失败者。

没人能预见未来,按自己的想法奋斗而失败,和听从别人劝告违背自己意愿而失败,我觉得前者会让我更好受一些 …

如果我的理想既不违反法律,又不违背社会的道德约定。那么老师是不是应该给我点支持,或者至少不是阻碍。(假设)家长不支持我可以理解,因为这关乎我的未来和他们的未来。但与老师那一点业绩相对的,是我的一生。

精子生于 1995 年,英文 ID jysperm.

订阅推送

通过 Telegram Channel 订阅我的博客日志、产品和项目的动态:

王子亭的博客 @ Telegram


通过邮件订阅订阅我的博客日志、产品和项目的动态(历史邮件):

该博客使用基于  Hexo  的  simpleblock  主题。博客内容使用  CC BY-NC-ND  授权发布。最后生成于 2024-04-08.