精子生于 1995 年,英文 ID jysperm.
C++ 讲稿 4.处理数据
By 精英王子
CC-BY-NC-SA(署名-非商业性使用-以相同方式共享) 3.0
注:解说在图片下方
原始幻灯片(持续更新):https://docs.google.com/presentation/d/1kcyy3IevzXQI5Ce0n60ERZmPfbPywErbCSkdazBkGXg/edit
解说写在
讲者备注
中
可以说数据就是编程的核心,任何一个程序无非都是接收一些数据,通过加工,再输出一些数据。
这里的数据可以是文字、数字、图像、声音等等。
在第二节Hello World中我们已经见到了如何定义变量,如何利用变量进行简单的运算,这节课我们会详细了解如何使用变量。
变量用于储存数据。
这是一条定义变量的语句,就好像为变量申请到了储存的空间,供以后储存数据使用。
double是数据类型,数据类型必须是之前已经定义过的,double在这里表示浮点数,稍后我们会介绍更多的数据类型。
a是变量的名字,这是由你决定的,当然,给变量命名也有一些规则,稍后介绍。在之后的代码中,你就可以用a这个名字来表示这个变量了。
最后是一个分号,在C++中不光是定义变量的语句,所有语句都要以分号来结尾。
double a,b; 像这样可以同时定义两个变量,它们的类型都是double,名字分别是a和b.
这和下面两句,分别定义a和b是完全等价的。
还记得以两个斜杠开头的那一行么,那是注释,编译器会无视它。
double a=1.23;还可以像这样,在定义变量的同时,给他一个初始的值。
(在这个例子中,其他情况存在例外)这和下面两行是等价的。
等号在这里是“赋值号”,用来把右边的值复制到左面的变量中。
在给变量命名的时候,我们需要遵守一些规则。
这里的不推荐是C++标准规定的,以下划线开头的变量可能被编译器保留用于特殊用途。
C++的关键字就是在C++中有特殊意义的词,它们是语法的一部分,不用用来做变量名,但是可以是变量名的一部分(如print).
要尽量选择有意义的单词,以便于阅读代码。
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++的关键字,你不能用它们作为变量名。
就像一个轮子一样,如果超出了它能够储存的最大值,就会从头开始。
这种现象叫溢出,在C++中,溢出是不会有警告的,需要自己注意。
浮点数有三种,同样,区别仅仅是长度。同样,不同平台具体的长度可能不同,以上是GCC在Windows XP/7的长度。
浮点数永远区分正负,没有对应的无符号版本,同样float和double都是C++的关键字。
bool是这样的一种数据类型,它表示是(true)或者否(false),表现上就好像一个比特一样,但它实际上会占用一个字节的空间。
在C++中true代表是,false代表否。同时,其他类型的数据(如整数)也可以向bool类型转换,在C++中0表示否,其他非0的数都表示是。
bool、true、false都是C++的关键字。
字符类型刚好是一个字节,可以储存一个字符。
在C++里面,字符要用单引号括起来,字符是指一个字母或者一个符号,而不是多个字母或符号。
或者你可以直接写字符对应的ACSII码,两种方法是等价的。
char同样是C++的关键字。
string表示一个字符串,可以是英文、符号、中文,甚至是空的。
值得注意的是,string并不是C++的关键字,也不是C++语法的一部分,它来自标准库,所以我们需要在程序开头加上#include
以反斜杠开头的叫转义字符,可以用它们来表示一些无法直接输入的字符,比如换行、双引号等等,如果确实需要表示反斜杠本身,要使用两个反斜杠。
%表示求模,即a%b表示a整除b后的余数。
b=10.0/3.0; 之前我们知道=是赋值号,用来把右面的值复制到左边的变量中。
但在这里,右边并不是一个值,而是一个算式,所以会先计算这个算式的值。之前我们还讲到,类型决定了它能够进行何种运算。
10.0在这里并不是变量,而是一个值(字面值),但它也有类型,它是浮点数,通过在整数10后面加上小数点,可以让它变成浮点数,进行浮点数的计算,得到带小数的结果3.3333.
如果改成10/3,那么10和3都是整数,他们会进行整数的计算,计算结果会省略小数,即3.
虽然b可以储存小数,但这个除法计算是在赋值给b之前发生的,赋值给b的值已经是整数3了。
前面的课程提到,标准库中提供了众多实现基础功能的函数,今天我们介绍其中的几个数学函数。
如幻灯片,值得注意的是C++标准库中三角函数有关的函数均使用弧度制。
上面有一段代码演示了如何使用函数,首先是一个函数名,然后是括号,括号里面是以逗号隔开的参数列表。
参数就是你传递给函数的数据,比如我们要算4个平方根,就要将4作为参数传递给sqrt函数,具体有几个参数,取决于具体的函数。
比如pow接受两个参数,它会计算第一个参数的第二个参数次幂。
调用函数后,函数会返回计算结果,你可以将计算结果直接赋值给变量,就像直接书写一个值一样。
这些数学函数来自标准库的cmath部分,需要加入对应的包含语句。
如果我们要计算一个一元二次方程的根怎么办?我们需要判断一元二次方程的判别式(b^2-4ac)与0的大小关系。
下节课我们将讨论如何利用条件语句进行逻辑判断,让程序不再是一条直线,而是可以分支的。