内容介绍
1、课程大纲。
第一部分第5课:计算那件事
3、第一部分第六课预告片:条件式。
课程概述
我们的课程分为四个部分,每个部分结束后会有练习题,并公布答案。可以用c语言制作三种游戏。
c语言编程基础知识
什么是编程?
球要想做好那件事,必须先利用那个仪器
你的第一个节目
变量的世界
计算那件事
条件式
环路门
实战:第一个c语言游戏
函数
练习题
练习:改进第一个c语言游戏
c语言高级技术
模块化编程
进击的指针,C语言ace
数组
字符串
预处理
创建自己的变量类型
读取和写入文件
动态分配
实战:“悬挂小人”游戏
安全的文本输入
练习题
练习:用自己的语言描述指针。
用基于c语言的SDL库开发2D游戏
安装SDL
创建窗口和画布
显示图像
事件处理
实战:“超级玛丽推箱子”小游戏
掌握时间的使用
使用SDL_ttf编辑文本
用FMOD控制声音
实战:可视化的声谱
练习题
数据结构
链表
堆、堆栈和队列
海时标
练习题
第一部分第五课:计算那件事
《变量的世界》这门课分为三章,让小编有点对不起大家。一个人又要上班,所以时间不多。
但是到了周末,可以花更多的时间编辑文章。
今天一起来学习C语言(对大多数编程语言来说也差不多)的运算。
上节课,我们说电脑是“傻瓜”机器,只能计算。(阿尔伯特爱因斯坦,计算机名言)无论是用电脑听音乐、用电脑看电影、玩游戏,其实电脑只是在计算。(阿尔伯特爱因斯坦,计算机名言)否则怎么叫“计算机”?
这门课我们一起来学习计算机能实现的大部分计算。我们将继续使用上节课学到的变量的知识。事实上,就是做各种操作,包括加、减、乘、除、取模等。
即使你对数学不感兴趣,这门课也是必不可少的。请硬着头皮。
基础运算
说起基础运算,没有排场
家产
减法
漂亮
除法
采取模子。(如果是第一次听说,请不要担心。稍后再解释。)
事实上,你的电脑也只知道这种基础的计算。要进行更复杂的运算(平方、乘法、代数等),必须编程。也就是说,你要向电脑解释该怎么做。(约翰f肯尼迪,计算机名言)但幸运的是,在这门课中,我们可以看到C语言设计了数学库。(有关图书馆的知识,请参阅前面的课程。)简单来说,可以说是程序可以调用的各种变量和函数的集合。)只需要使用专家定义的库的内容。不需要自己重复“造轮子”。
一开始先从加法开始吧。
为了在c语言中加法,我们必须使用号码。不开玩笑。就这么简单。
你要把加法的结果放在一个变量里。让我们将整数类型的变量命名为“结果”。
intresult=0;
result=4 6;
不一定是专业数学家,但程序运行后,可以预计结果值为10。使用printf函数输出结果。
Printf('4 6=%d ',result);
程序运行,显示:
4 6=10
你看,加法这么简单,一点也不任性。
同样的原理也适用于其他运算类型。只有运算符不同。如下表所示。
运算
符号
加法
p>减法
-
乘法
*
除法
/
取模
%
如果你曾经使用过电脑上的计算器,你肯定知道这些符号。除了最后两个(除和取模),其他应该很熟悉。我们就来说说最后两个符号。
除法
当没有余数时,除法运行得好好的。比如,6 / 3 等于 2,你的电脑给了你正确的答案。到这里为止还没有问题。
但是,我们假如让电脑做 5 / 2,照理结果应该是 2.5,但是,来看看我们的程序:
int result=0;
result=5/2;
printf("5 / 2 = %d",result);
运行程序,显示:
5 / 2 = 2
我们让电脑计算 5 / 2,期待的结果是 2.5,但是实际上电脑却给出了 2。这不是很二嘛...亲爱的电脑,你怎么可以这样对我。
其实,内有蹊跷。难道我们的电脑真的在这点上这么蠢笨吗?
事实上,当电脑看到数字5和2时,它会做一个整数之间的除法(也叫做《欧几里得除法》)。就是说它会把结果截取一段,只留下整数部分(这里是2)。
你也许会说:啊,我知道了,都是因为result这个变量是整数嘛。如果result声明为double类型的浮点数,那它应该可以储存带小数点的数啦。
其实不是,这不是原因。假如你把result声明为double类型,做
result = 5 / 2,你还是会得到2。事实上,这是因为运算符两边的数是整数,所以电脑会做整数之间的除法。
当然,也是可以让电脑输出你想要的结果的,怎么办呢?看下面程序:
double result=0;
result=5.0;
printf("5 / 2 = %f",result);
运行,显示:
5 / 2 = 2.500000
看到了吗,如果要你的电脑显示正确结果,还需要你把运算符两边的数写成 5.0和2.0(同样是5和2,但是电脑却认为这两个是浮点数,因此它就做浮点数的除法),怎么样,电脑任性不?
这个整数除法的特性很重要。所以得记住,对于电脑来说:
5 / 2 = 2
10 / 3 = 3
4 / 5 = 0
有点令人吃惊,不是么?但是这就是电脑做整数运算的方式。
如果你想要得到浮点数的结果,需要运算的数本身是浮点数(提一下,其实不需要两个数都是浮点数,一个是浮点数就够了,电脑会自动把另一个也认为是浮点数来做运算):
5.0 / 2.0 = 2.5
10 / 3.0 = 3.33333
4.0 / 5 = 0.8
事实上,在做整数除法时,比如 5 / 2,你的电脑会回答下面问题:“5里面有多少个2?”,答案是两个。同样的,“10里面有多少个3呢”,答案是三个。
然后你又会问了,我们怎么才能获取到除法剩下的数(余数)呢?
这就要轮到取模运算出场了。
取模
取模运算是获得除法的余数的一种数学运算。可能相比 加、减、乘、除这基本的四则运算来说,它没有那么被人熟知,但对电脑来说,取模是基本的运算之一。很有可能是为了解决上面提到的整数除法的难题。
上面表格里列出来了,取模的符号是 %
以下列出一些取模运算的例子:
5 % 2 = 1
14 % 3 = 2
4 % 2 = 0
取模运算 5 % 2 是除法运算 5 / 2的余数,所以是 1。电脑计算 5 = 2 * 2 + 1,所以取模运算就得出1为结果。
同样地, 14 = 3 * 4 + 2,所以余数为2。
4 = 2 * 2,所以余数为0。
好了,我宣布一个好消息:我们已经学了所有的基础运算了,数学课下课了。
变量之间的运算
诶,怎么数学老师刚走,又来了数学教授啊?没办法,电脑又名计算机,肯定要跟数学打点交道的嘛。幸亏来的不是“叫兽”。
既然我们在上面一节中已经学习了基础的5种运算,那现在可以来看看变量之间的运算咯。
事实上,变量之间的运算也是同理。
result = number1 + number2;
上面这一行代码对number1和number2这两个变量做加法运算,并且把结果储存到result这个变量里。
现在我们的学习越来越有意思了。其实你现在已经可以实现一个迷你的计算器的功能了,不要怀疑自己,你可以的。
想象一个程序,请求用户输入两个数,这两个数,你将其储存在变量里。
然后,你对这两个变量做加法,并且把结果储存在另一个变量里。接下来,你就只需要把计算的结果显示在屏幕上就好了,让用户看看电脑的本领,很多人做加法可没有这么快速呢!
试着自己编写以上程序,很简单的,也可以给你练手。
当然了,我们还是把代码写上:
#include <;
int main(int argc, char *argv[])
{
int result = 0, number1 = 0, number2 = 0;
// 请求用户输入number1和number2的值:
printf("请输入数字1 : ");
scanf("%d", &number1);
printf("请输入数字2 : ");
scanf("%d", &number2);
// 做运算:
result = number1 + number2;
// 把运算结果显示在屏幕上 :
printf ("%d + %d = %d\n", number1, number2, result);
return 0;
}
运行,显示:
请输入数字1 : 289
请输入数字2 : 376
289 + 376 = 665
可能你还没意识到:这是我们第一个有点意思的程序。我们的程序请求用户输入两个数,然后做加法,再把结果输出到屏幕上,很棒吧!
请你自己也试着用其他四个基础运算符来写程序,看看结果如何。
缩写
之前我们保证过,不会再有新的运算形式出现了。确实如此,我们已经知道了所有的基础运算:加、减、乘、除、取模。用这些基础运算我们可以做所有事情。不需要其他的运算了。我知道这很难令人相信。你会说难道一个很复杂的3D游戏最终也是由加、减、乘、除等构成的?是的,确实如此。
虽然如此,但是在C语言里我们还可以进行运算的缩写。
为什么要缩写呢?因为很多时候我们做的运算都是重复的。下面你就会看到缩写的好处了。
自增运算
你会发现你在编程中经常要对一个变量进行+1操作。
假设你的变量名字是number,你知道怎么对它进行+1操作吗?是这样做的:
number = number + 1;
上面的语句做了什么呢?
首先我们做运算 number + 1,然后我们把运算结果储存到变量 number (它自己)中。
因此,假如我们的变量值是4,运算后变成5了,假如它的值是8,那会变成9,依此类推。
这个运算是重复的。要知道,计算机科学家都是很懒的人,他们可不希望输入两遍number(确实也挺累人的)。
于是他们发明了一个缩写形式,叫做自增运算。它的结果和+1操作是一样的:
number++;
这一行代码,就是用了自增运算符 ++,是不是比刚才那句 number = number + 1简单了?它意味着“对number做+1运算”。
敏锐的读者可能想到了,在编程语言C++中的++符号其实正是自增运算符的意思,我以前也不太理解为什么不是C+,而是C++。原来计算机科学家跟大家开了一个很有意味的玩笑:C++意味着对C做+1操作。当然了,事实上,C++只是用不同的方式来编程,并不是说C++比C更优秀,只是不同而已。
自减运算
知道了自加运算的原理,自减运算应该不难理解吧:就是对变量进行-1运算。
number--;
其他的缩写形式
同理,其他还有好几种运算的缩写形式。比如 number = number * 2; 可以写成 number *= 2;
看以下代码:
int number = 2;
number += 4; // number变为6
number -= 3; // number变为3
number *= 5; // number变为15
number /= 3; // number变为5
number %= 3; // number变为2 (因为 5 = 1 * 3 + 2)
数学库
在C语言中,我们有一些称之为“标准库”的东西,就是那些很实用的库。我们一般会经常使用那些基础库。
给大家复习一下:库就是指已经定义好的函数和变量的集合。这些函数由前人写成,可以避免我们“重复造轮子”。
我们已经使用过 库中的printf和scanf这两个函数了。
其实还有很多其他很实用的库,其中就有一个叫 ma,里面包含了数学相关的函数。
实际上,光是加、减、乘、除、取模是不够的。虽然底层都是这五个运算,但是很多时候我们需要做复杂的运算形式,就需要调用库或者自己写函数了。因为电脑并没办法理解除了+,-,*,/,%之外的运算符,比如你如果要电脑做乘方,输入 5 ^ 2,电脑完全不理解什么意思,除非你调用数学库里已经定义好的做乘方的函数。
调用数学库很简单,
#include <ma>
只要这一行代码,接下来你的程序就可以用里面定义的所有函数了。
我们介绍其中几个最常用的吧。
fabs
这个函数返回绝对值:
如果你传给这个函数 -53,它会返回53
如果你传给这个函数53,它会返回53
double absolut = 0, number = -29;
absolut = fabs(number); // absolut的值变为29
ceil
这个函数返回给出的浮点数后面紧接的整数。这是一种舍入的方式。ceil函数总是舍入紧邻的比参数大的整数。
double above = 0, number = 34.81;
above = ceil(number); // above的值变为35
floor
这个函数与ceil的作用相对,返回给出的浮点数前面紧接的整数。
double below = 0, number = 45.63;
below = floor(number); // below的值变为45
pow
这个函数计算数字的乘方。你要给它两个参数:底数和指数。
double result = 0, number = 2;
result = pow(number, 4); // result的值变为16 (2 ^ 4 = 16)
sqrt
这个函数返回参数的平方根。返回值是double类型
double result = 0, number = 100;
result = sqrt(number); // result的值变为10
sin, cos, tan
这三个函数是计算正弦,余弦,正切的值。
asin, acos, atan
这三个函数是计算反正弦,反余弦,反正切的值。
exp
这个函数是特殊的乘方形式,返回以e(自然对数的底数,近似等于2.7182)为底数的指数运算的值
log
这个函数返回以e为底的对数值(我们学数学时也写成 ln)
log10
这个函数返回以10为底的对数值
总结
电脑只知道计算
电脑会的运算类型很基本:加、减、乘、除、取模(取模就是做除法后剩下的部分)
自加是将变量加一的运算,写成 variable++
自减是将变量减一的运算,写成 variable--
为了增加电脑能知道的运算形式,需要载入数学库(#include <ma>)
数学库里有高级一些的函数,例如 乘方,平方根,舍入,指数,对数,等
第一部分第六课预告:条件表达式
今天的课就到这里,一起加油咯。
下一课我们学习第六课,来认识条件表达式吧。
新朋友请关注「程序员联盟」微信搜公众号 ProgrammerLeague
小编的微信号: frogoscar
小编的邮箱: enmingx@gmail.com