为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

兔宝宝学编程记——从零开始三个月学会编小游戏

2017-09-03 33页 doc 73KB 25阅读

用户头像

is_321635

暂无简介

举报
兔宝宝学编程记——从零开始三个月学会编小游戏兔宝宝学编程记——从零开始三个月学会编小游戏 三个月学会编小游戏 ——兔宝宝成长记 何勤 公元2013年3月27日,网名为兔宝宝的群友加入了何勤老师创建的QQ群:C游戏编程学习研讨班。兔宝宝是一个初学者,对编程完全不懂,但兔宝宝打算在比较短的时间内学会用C语言编写小游戏。 以下是兔宝宝与何勤老师的互动教学过程的完整记录。从记录中你可以了解到,兔宝宝 1 是如何从零开始只用了两个多月时间,就学会编写小游戏程序的。 2013年 3月27日 何老师:兔娃娃,三个月的时间并不长啊,三个月就能让你实现儿时的理想,难道你都...
兔宝宝学编程记——从零开始三个月学会编小游戏
兔宝宝学编程记——从零开始三个月学会编小游戏 三个月学会编小游戏 ——兔宝宝成长记 何勤 公元2013年3月27日,网名为兔宝宝的群友加入了何勤老师创建的QQ群:C游戏编程学习研讨班。兔宝宝是一个初学者,对编程完全不懂,但兔宝宝打算在比较短的时间内学会用C语言编写小游戏。 以下是兔宝宝与何勤老师的互动教学过程的完整记录。从记录中你可以了解到,兔宝宝 1 是如何从零开始只用了两个多月时间,就学会编写小游戏程序的。 2013年 3月27日 何老师:兔娃娃,三个月的时间并不长啊,三个月就能让你实现儿时的理想,难道你都不能 坚持吗,~如果偷懒不愿意每天编写两个程序,那还不如别跟我学,纯属浪费你我的时间。 兔宝宝:好的,那兔娃一定按照老师的要求去做~ 何老师:我尽量给你选讲有趣一些的例题,尽量给你布置一些比较有趣的编程作业题。但是 有些内容比较枯燥和难懂也是在所难免的,尤其是在开始学习的一周内。如果见到一些枯燥或难懂的内容就马上逃避,一点苦都吃不了,那你也是不可能学会编写小游戏程序的~ 兔宝宝:为了实现本兔的理想,兔娃有不怕吃苦的决心,这个请老师绝对放心。本兔的理想 2 就是将来做一个程序猿。不好意思,打错了,是做一个程序兔。不吃苦中苦,难成兔中兔,这个道理本兔明白的。 何老师:阿兔,你学过C语言吗, 兔宝宝:呵呵,老师,我正好打算开始学C语言呢~我是零基础的小白兔一个。 何老师:零基础没关系,一张白纸更好画画。我现给你介绍一位大师兄,名叫灰哥,他就是跟我从零开始用了不到三个月就学会了编小游戏。我不在时你有不懂的问题可以请教灰哥。 兔宝宝:哇~灰哥这么厉害,~灰哥在吗,师妹拜见大师兄了。 灰哥:嘛,兔宝宝,你是新来的, 兔宝宝:大湿胸你好~。。。不好意思~又打错字了,是大师兄你好~大师兄,师妹我非常佩服你呀~ 灰哥:小师妹,估的模您,我这点成就算个毛~这一点师妹只要能够坚持下来,也完全能够做到的。师妹,以后有问题随时可以问我。 何老师:兔宝宝,那我们就开始今天的学习何老师:好,今天的课程开始了。我先把今天你要学的程序发上来: /*1*/ #include<stdio.h> /*2*/ int main( void) 3 /*3*/ { /*4*/ printf("Hello World~\n"); /*5*/ getchar(); /*6*/ return 0; /*7*/ } 兔宝宝:老师,这个程序是干嘛的, 何老师:兔娃,现在别问干嘛 ,你先认真看看这个程序,然后把这个程序按照原样在 DEV_C++5.0集成开发环境下编写出来。如果不知道如何操作,请看附录中的DEV_C++5.0集成开发环境下编写调试C语言程序简介。 兔宝宝:嘛,老师,你别看不起本兔,用DEV_C++5.0怎么输入程序我先自己看看说明,再摸索一下,想必还是很容易学会滴。老师,您先忙别的,等我弄好了我再通知您~。。。。。。(大约半小时之后)老师,我已经把您的程序输入进去了。 何老师:兔娃还不错嘛~现在,你在主菜单上选择―运行‖——>―编译‖(英文版是选择)。对这个源程序进行编译。 兔宝宝:老师,我按照您的要求做了,可是出问题了~老师,我把屏幕截给您看: 何老师:兔宝宝,你的程序第4行和我发给你的可是不一样的哦~你用的双引号是在中文输 入法下输入的,而且printf被你错打成了print 。你改一下吧~ 群友们注意了:printf("Hello World\n"); 中,printf()这几个字母别打错了,都要用小写的。后面的圆括号,双引号和最后结束时的分号都要在英文输入法下输入,不能在中文输入法来输入。 兔宝宝:哦,原来如彼~。。。。。我改好了。。。。老师,又蹦出来了一个窗体,这是什么意思, 4 何老师:恭喜阿兔~你的第一个程序编译通过了。你按以下方法操作就可以看 到程序运行的 结果:你先点击关闭按钮,关闭这个Compile Progress(即编译进度)窗体,然后在主菜单上点选 ―运行‖——>―运行‖(英文版是点击 )。 兔宝宝:哇~老师,真的出来了~very good~老师,我截屏给您看: 何老师:阿兔,你别高兴太早了,你知道这个程序的意思吗, 兔宝宝:真心不懂,老师您给我讲讲好吗, 何老师: C语言源程序是由一个或多个函数构成的,其中通常都有一个main()函数。本例中从程序的第2行开始到第7行为止,就是一个main()函数。无论程序有几个函数,程序都是从main()函数开始运行的。 兔宝宝:我听的莫名其妙,是不是兔娃很笨,C语言中的函数是不是跟我数学中学过的函数有什么关系,都是那样高深莫测的, 何老师:没有什么直接关系,只不过从功能上来看有些类似而已。这不能说兔娃很笨,不懂也没什么,因为这都是一些术语和规定。以下我给你讲的这些知识你要多看几遍,但不必背下来,以后我会给你讲解其中的一些道理。 兔宝宝:哦,老师我记下了:C语言源程序是由函数构成的,其中有一个main()函数,程序都是从main()函数开始运行的。 何老师:下面讲讲函数的构成。任何函数都是由函数头和函数体构成。本例程序中只有一个名为main()的函数。第2行是函数头,第3到第7行是函数体。过几天兔娃会看到由两个函数构成的一个C语言程序。 兔宝宝:函数还有头和体,这不有点像本兔了, 哦,函数没有脚,跟本兔还不太像。 5 何老师:(函数头的构成:)函数头由函数的返回值类型 函数名和用圆括号括住的参数表 构成。本例程序中的函数头就是:int main(void) 。在本例中,main()后面的圆括号表明了main是一个函数名。而int说明了main()函数运行后的返回值是一个整数,viod说明了这个main()函数运行不需要参数。兔妹,你可要注意了:函数名main这四个字母都只能用小写,决不能用大写 。 兔宝宝:(小声自言自语):嘛,本兔觉得好枯燥哦~好吧,为了实现理想,本兔一定要咬牙 坚持住~(大声地):老师,我记住了。 灰哥:函数体的构成:函数体主要是由若干条语句构成的,每一条语句都要以 分号作为结 束符(复合语句除外)。整个函数体必须用大括号{ } 括住。语句主要又分为定义型语句和执行型语句这两大类。 兔宝宝:师兄,语句是用来干嘛的, 灰哥:定义型语句主要是用来向编译程序申请计算机内存中的一个或者若干个存储单元的, 程序用这些申请到的存储单元来临时存放数据。执行型语句主要是用来告诉计算机,如何对这些数据进行运算和处理的。 兔宝宝:大师兄,你的话我听起来感到好奇怪耶~按照师兄的说法,好像用C语言编写出来程序只能够用来命令电脑加工数据了,那我们学会用C语言编写程序难道会有什么好大的用处吗, 灰哥:兔师妹,你知道什么是电脑吗,电脑的正式名称就是计算机呀~ 兔宝宝:计算机不就是我们用来上网QQ聊天、玩游戏、看视频、听音乐,发邮件、偶尔用Word打打字的那个电子设备吗,难道它一直都是在做加工数据的工作吗,兔娃真的不敢相信耶~为什么要叫它为计算机呢,它多聪明啊,能做好多各种各样的事呢,所以我觉得还是叫它电脑更合适~ 灰哥:兔妹,你对计算机或者说电脑只是有一个初级的感性认识,很不严谨深刻。什么是计算机呢,按照老师的说法,计算机就是―通过运行程序,把数据加工成信息的二进制数字信号处理设备‖1。这个定义关键指明了,计算机本质上只能够做一件有意义的事——把数据加工成信息。计算机加工数据的手段就是通过运行程序。兔师妹,你想要对计算机的基本工作原理有进一步的了解,就请看何老师写的《C语言程序设计 问题与求解方法》这一本书的第零章和第一章,我个人觉得老师这两章的内容写得很好、很到位。师妹,你有空可以看看这本书,群共享中有这本书的前半部。 1 摘自《C语言程序设计 问题与求解方法》何勤,机械工业出版社2013年1月 6 兔宝宝:哦,原来计算机本质上仅仅只能做―把数据加工成信息‖这样一件事啊~这个我还是头一次听说呢。那到底什么是数据,什么又是信息呢, 何老师:数据和信息这两个术语态基础了,两者都没有明确定义。 一般认为―数据‖是对某个事物的真实记录(即对事物某个或某些方面的一种忠实抽象);而―信息‖则是对数据(((((((( 进行某种处理(比如计算、排序、查找、分析、综合、解题、思考等)后得到的正确结果。 数据与信息之间的关系就有些类似于食物原料与加工好了的食物之间的关系。计算机其实就很类似于一个厨房。一个将没重量、没有体积、不会腐败变质的数据加工成为同样没重(( 量、没有体积、不会腐败变质的信息的厨房。换言之,不像有重量的物质,数据和信息都是(( 抽象的。 兔宝宝:老师,我可以这么认为吗:信息就是通过加工数据从中提取出来的更有用东西。 何老师:是的,兔娃理解正确。。。。。。还有兔娃,别以为你所看到的几斤几两、几尺几寸、车速、成绩、时间、气温等数值才是数据,这一大类数据称为数值数据;图像、声音、文字和视频等其实也是一大类数据,这一大类数据 称为非数值数据。这两大类数据目前都已经能够通过各种方式转变成二进制数据,输入到计算机内部,让计算机对它进行加工处理。现代计算机由于性能的极大提高,已经能够轻松快速加工处理海量的非数值数据,这是人们感到计算机用处很广、聪明伶俐、无所不能的一个重要原因。三十多年前的普通计算机大多用来加工处理数值数据,文字处理都比较;那时,也没有将全世界大部分计算机联在一起的因特网。那个时代你想用电脑上网聊天、听音乐、看电影、玩网游那就是在做梦。在那个时代,没有哪个人认为计算机是多才多艺、无所不能、聪明伶俐的。当时的计算机仅仅只是远离普通人的、能够快速自动进行数值计算的一台机器而已。计算机从上世纪30年代末发明出来之后,它的本质一直都没有改变,只是它的速度变得越来越快,体积变得越来越小,它能够加工处理的数据类型变的越来越多而已。 兔宝宝:噢~原来是这么一回事,我还以为计算机真的很聪明、很能干呢~认真细想一想,仿佛老师和师兄说的还是很有道理滴。我以前对计算机的理解真的是太肤浅了。老师,我有空会去认真阅读您写的那本书。。。。老师,我对今天讲的函数的那些概念理解起来还是有些模模糊糊的,好多新的名词和术语。 何老师:兔宝宝,后天的课程我再给你深入一些介绍函数。阿兔,我先把今天剩下来的知识给你介绍一下。 今天的例题中没有定义型语句,只有三条执行型语句,一条语句是: printf(―hello World~\n‖); 7 printf()语句是一条库函数的函数调用语句。什么是库函数和函数调用这个明后天再给你讲解。你今天只要了解这条语句的作用就行。 兔宝宝:好滴~老师还是很体贴初学兔。装的东西太多兔脑袋要爆炸滴~ 何老师:那还不简单~把你大师兄头顶上的金箍取下来给你戴上,师父给你念几句紧箍咒,兔脑袋就没事啦~ 兔宝宝:嘛,别~别~别~师父,金箍那宝贝还是给大师兄留着吧,本兔很纯洁,不贪财滴~ 何老师:printf()这条语句的作用是在屏幕上显示一串(或几串)字符。Hello World~ 就是这么显示出来的。然后进行换行,换行是由其中的转义字符 \n引起的。兔宝宝,你看到printf()语句中紧挨着Hello World~后面的字符 \n 吗, 兔宝宝:老师,我看到了。原来它是用来换行的,我知道了~我说怎么没在屏幕上看见字符\n呢,谢老师。 何老师:在printf()函数调用语句中,要在屏幕上显示的字符串必须用双引号括住。双引号括住的这个字符串又称为格式串。语句getchar(); 也是一条库函数调用语句,它是用来((( 等待你从键盘上输入一个字符的,用在此处只是使程序运行暂时停在此条语句之处,为的是将程序运行的结果显示给你看。兔娃,你可以把这条语句删掉试试,程序的运行结果你就看不到了(不是用DEV_C++5.0编译器的读者有可能看得到)。 兔宝宝:哦哦,原来是这样的啊~ 何老师:语句 return 0; 是一条返回语句, 它的作用是带着main()函数运行后的返回值,返回到操作系统或者集成开发环境中。返回数值0用来表示程序运行是正常结束的。 兔宝宝:老师,这里面蕴含的知识还是很多的啊。本兔听得有些似懂非懂滴。 何老师:兔娃,万事开头难,你现在不太懂是没关系的,下课后,你把这个聊天记录再认真看一到两遍就行了,不必硬背下来。将来学完整个课程后,再回过头来看一遍,你就会觉得今天学的内容简直是太容易了。现在,你只要认真按照我说的去动手做,把今天的作业做完就行了。 兔宝宝:遵命~ 何老师:兔宝,现在,你可以在这个程序的第4行和第5行之间,另外再插入一条语句: printf(‖我正在学编程\n‖); 然后重新再将程序重新编译和运行一下。 兔宝宝:好滴~。。。。。。老师,程序运行结果出来了: 8 嘿嘿,本兔大概知道该怎么做了。。。。。。。不过老师,我还想再问一下,程序中的第一行:#include<stdio.h> 这是什么意思呢, 何老师:兔宝宝,这是一条编译预处理命令,你现在只要在编写程序时记住要写这一行就行,我后天会给你讲解其中道理的。 兔宝宝:老师,那程序中每一行的最左边的那些 /*1*/ 、/*2*/ 又是什么意思呢,是不是我们编写程序时都要这样书写, 何老师:不是的,你写的程序中完全不必这样写。阿兔, /*1*/、/*2*/等等这些只是为了方便讲解程序而额外加上的注释。编写程序时,通常要对难以读懂的语句或语句段添加一些注(释,使之更容易读懂。注释是要用 /*和 */ 括起来的。C编译程序在加工处理源程序时,会( 把注释当成不存在,有关注释如何使用,我以后还会讲解的。 兔宝宝:老师,我知道了,谢谢~ 何老师:今天所讲的主要内容体现在这张表中: 图3.1 C语言函数的构成 阿兔,老师现在给你出几道题。 兔宝宝:老师,您就要让兔娃做题了,好吧,那本兔就试试~ 何老师:题目很简单的: 第一题:编写一个程序,在程序中只允许使用一条printf语句,要显示的内容是: 9 第二题:编一个程序,程序运行后在屏幕上显示你的一段。 思考题:对于编译程序而言,什么是数据,什么是信息, 网上资料查找题(不做要求,但最好看一看): 1、 通过阅读《C语言程序设计 问题与求解方法》的第零章和第一章,大体了解计算机的组成结构和基本工作原理(网上新浪爱问共享资料中,有《C语言程序设计 问题与求解方法》这本书的前5章)。 2、高级程序设计语言主要有哪几种, 3、C语言的起源、发展和特点。 4、从粗粒度看,C语言源程序是由一到多个函数构成的,从最小粒度来看是由什么构成的,它通常是以什么形式存放到计算机的内存中的, 5、计算机为何能够处理图像、声音、文字、视频和动画,这些非数值数据是以何种方式进入到计算机内部的,请参见《C语言程序设计 问题与求解方法》何勤著,机械工业出版社2013年1月 6、为什么计算机似乎显得无所不能,能够做各种各样的事,显得似乎很聪明,根本原因何在, 兔宝宝:好的,遵命。 兔宝宝:哦。老师,我今天收获还是很大滴耶,谢谢老师~ 何老师:阿兔,你还要把今天你所学到的要点归纳小结一下。 兔宝宝:好,那是必须滴,老师你去忙。兔娃先洗个澡,休息一下,今天听课太疲劳了。我晚上把今天的小结和做了的作业发到群共享里面。好吗, 何老师:好。 兔宝宝发到群共享中的作业和小结: 第二题编程题答案: #include<stdio.h> 10 int main( void) { !我是兔宝宝。\n"); printf("大家好 printf("我今年15岁,大萝莉,\n我正在努力学编程\n"); getchar(); return 0; } 今日学到的知识要点:含有何老师对兔宝宝作业的小结的点评: 1、 计算机是通过运行程序,将数据加工成信息的一种电子设备。 点评:兔宝宝对我的论述进行了修改,但这是一种庸俗化的修改。计算机是―通过运行程序,将数据加工成信息的一种二进制数字信号处理设备。‖不能简化为电子设备这几个字。什么是二进制数字信号,计算机为何要采用二进制数字信号,这其中蕴含有很大的奥秘~——这其实是构成计算机主体的电子设备几乎决不会出错的根本原因所在。这些函数名和用圆括号括住的参数表构成。 8、 函数体是由若干条语句构成的。C语言程序中每一条语句都要以分号作为结束(复合语 句除外)。函数体必须用大括号{ } 括住。语句分为定义型语句和执行性语句两大类。 点评:―函数体是由若干条语句构成―这样修改还是不妥的,还是应当说:函数体主要是由(( 若干条语句构成。这是由于函数体中还可以出现别的以后将要介绍的成分,比如声明型语句、 11 编译预处理命令。 9、C语言中定义型语句和执行型语句各自所起的作用。 10、printf()可以用来在显示屏上显示一串字符,格式串要用双引号括住,格式串中的普通字符按照原样在屏幕上输出,\n是转义字符,转义字符在屏幕上是看不见的,转义字符\n的作用相当于按下了Enter键。 11、注释的作用 12、getchar()的作用 13、return 语句的作用 思考题的答案:对于运行着的编译程序来说,由一长串字符构成的源程序就是数据,由指令序列构成的机器语言程序就是信息。 资料查找题1、计算机的基本工作原理: 在计算机中,要运行的程序和要加工的数据都是分别存放在内存中的。程序中的指令按照存放在内存中的先后顺序,逐一地被(CPU中的控制单元)取到CPU中进行译码执行。数据是按照指令的要求(取内存的哪一个存储单元中的数据),取到CPU中的运算器中进行指令所要求的运算的,运算所得到的结果又按照指令的要求,存放到内存的某个存储单元中(或输出到计算机外部)。在计算机内部,指令、数据和运算结果都是以两种不同稳定状态(电路中的高低电平、电容的充放电状态)所表示的二进制数或码。电流在电路中以光速传播是计算机运算速度超快的根本原因。 、 资料查找题4 C语言源程序从最小粒度来看就是由一个一个字符组成的,这一串字符中的每一个字符通常是以二进制的ASCII码的形式存放在计算机的内存和外存中的。 兔宝宝这个小结得分良好。资料查找题和思考题兔宝宝也做的不错。奖励两根胡萝卜给宝宝兔。 3月28日整型常量、浮点型常量的形式、运算和输入输出 12 ? 整型常量和浮点型常量 ? 整型变量和浮点型变量 ? 标识符 ? 算术运算符 ? 算术表达式 ? 用printf()输出表达式的值 兔宝宝:老师早~您今天给我讲什么呢, 何老师:我先发一个程序上来,你把它敲入你的电脑然后运行起来。这个程序只要运行一次,你想要算出多少对两个整数的积都是可以的。兔宝宝,要注意输入方式:两个整数之间用空格隔开,输完两个数后按下回车键。然后再输入两个整数,按下会车键,。。。不想看了,只要随便输入一个英文字母,再按下回车键,就可以结束程序运行。 #include<stdio.h> int main( void) { /*1*/ int m1, m2 ; /*2/ while (scanf("%d%d" , &m1, &m2 ) ==2 ) /*3*/ printf("%d*%d=%d\n " , m1, m2, m1*m2 ); /*4*/ getchar(); /*5*/ getchar(); /*6*/ return 0; } 兔宝宝:老师,真的很神奇耶~我输了很多组两个数,居然都是可以算出结果的。老师,我截图给您看看: 13 其中奇数行都是本兔输入的数据,偶数行都是电脑运行程序自动打出来的。可是老师,这个程序到底是怎么运行的呢,您能给我解释吗, 何老师:兔娃,你想不想看任意两个整数之和是多少, 兔宝宝:嗯,想啊~那应该怎么办, 何老师:这很简单的。阿兔,你只要把上面程序中的这一句: printf("%d * %d=%d\n " , m1, m2, m1*m2 ); 改成: printf("%d + %d=%d\n " , m1, m2, m1+m2 ); ? ? 就行了。只有箭头所指的两个符号 * 替换成了+ ,其它的都没改变~ 兔宝宝:是真的吗,我来试试~。。。程序出来结果了~真的变成了加法~ 何老师:兔娃,你感兴趣的话,你还可以分别用减号 – 、用除号 / 来取代这条语句中的乘号 * 试试~那你就可以叫计算机为你计算任意多组的两个数之差、计算任意多组的两个数之商了。 兔宝宝:。。。。。。真的好玩耶~第二天学编程,我就可以叫计算给我做加减乘除了,真的好开心~这个程序本兔要好好把它保存下来~。。。。不过老师,兔娃不懂这个程序是怎么工作的。您能给我讲解其中的道理吗, 何老师:那是当然的~但是,讲解的过程是很漫长,很枯燥的,以上这个程序的工作原要一直讲两天才能讲完,兔娃,你有思想准备吗, 14 兔宝宝:那当然有了~老师,我觉得学编程还是蛮有意思的。吃点苦算不了什么~坚持两天没关系的。能让电脑乖乖听本兔的话,本兔好有成就感~跟老师学几个月,电脑不就成了本大兔的一个小跟班了吗,~ 何老师:学会编程兔娃可就是超级兔娃了~很多令人讨厌的枯燥的脑力活通通的都可以编写程序,放心让电脑为你自动做,而且比你自己做要快得多,还不会犯错误。好了,阿兔,我们就正式开始今天的征程吧~ 兔宝宝:遵命~本兔要像一块大海绵一样,认真听老师讲课,吸收~吸收~再吸收~征服这个对本兔一直桀骜不驯的电脑~ (一) 整型常量和浮点型常量 何老师:计算机的程序中很多都是要进行数值计算的,数值计算是学习编程的基础。计算机中所用的数值与我们日常生活中所用的数值很类似但又有一些很奇怪的特点。稍不注意我们编程的到的结果就是错误的。现在我先给兔娃讲讲程序计算中经常要用到的常量。什么是常量呢,常量就是在程序运行过程中数值不会发生变化的量。常量主要分为两大类:整型常量和浮点型常量。各种常用的数值常量书写规范汇总请看下表: 表1 各种常用的数值常量书写规则 兔宝宝:老师,你的意思是,在程序中使用常量必须按照以上表中的规范去写,不能违反,对吗, 何老师:是的,是这个意思。兔娃,你要注意了:浮点数的指数表示法中10的n次方(n是整数)要写成 En或en。比如:10-13要写成E-13 或者e-13 。 兔宝宝:老师,上面这张表中的浮点数是不是就是指我们数学中学过的实数呢, 何老师:差不多吧,但兔娃的说法又不够准确。计算机中为何称为浮点数而不称作为实数呢, 15 这是因为在计算机中,通常只能用3083 兔宝宝:哇,这个范围可是真够大的了。 何老师:学以致用,兔娃,我来考考你所掌握以上知识的情况。 兔宝宝:好啊~请老师出题。 何老师:234.0 是整数还是浮点数, 兔宝宝:那还不简单~整数。因为小数部分是0。 何老师:兔娃,恭喜你,答错了~在C语言中一个数只要带了小数点,不管该数的小数点后面是些什么数,这个数都是浮点数,一个整数是不能带小数点的。 兔宝宝:噢,原来如此,兔娃受教了。 何老师:我再问你, -123e3 是整数还是浮点数, 兔宝宝:老师,兔娃有些都不敢说了,说了怕出错。 2 3 C语言标准只要求达到10位精度即可,但大多数计算机高于这个标准的规定。 这是指遵循IEEE745标准的计算机。绝大多数计算机遵循这个标准。 16 何老师:出错了才记得更清楚呢~我真的还希望你出错。 兔宝宝:让我想想。。。老师,我认为这个是整数,因为它的值不就是-123000吗。这个数没有带小数点。 何老师:兔娃,再次恭喜你,你又答错了。C语言中,所有用指数表示法表示的常量都是浮点数,而不是整数。指数表示法所表示的常数存储在计算机中都是 +12345678 有小数部分的。这一点在兔娃学了浮点数在机(4) 二、请将以下实数用指数形式的浮点数来表示 (1)0.123 (2) -0.000000000000000001234567 (3)123456789876543212345.6784 三、填空: 浮点数指数表示法书写规则:字母e(或者E)_______和_______都必须有数字,这些数字之前都可以__________;e(或者E)之后的指数必须是一个_________;在字母e(或者E)的前后以及数字之间不得插入_______。 兔宝宝:老师,我把答案发上来好吗, 17 何老师:不必,这些题很简单,让其他初学群友也去做做吧。兔娃,下面我们开始学变量吧,程序中有变量才有魅力。没有变量的程序就是死水一潭~ 兔宝宝:老师,兔娃先去洗把脸,喝口水,马上过来。。。兔娃,老师,兔娃在此等候老师授课呢~ (二) 让计算机把数据打出来——printf()用法 何老师:有了整数和浮点数,我们就可以让计算机把整数和浮点数打出来。 让计算机显示一个整数的格式是:printf(‖%d\n‖, 整数 ); 让计算机显示多个整数的格式是:printf(‖%d,%d,%d….\n‖, 整数1, 整数2, 整数3,…); 双引号格式串中的%d的个数,要和后面的要输出的整数个数一样多。 让计算机显示一个双精度浮点数的格式是:printf(‖%Lf\n‖, 浮点数 ); 让计算机显示多个双精度浮点数的格式是: printf(‖%Lf,%Lf,%Lf….\n‖, 浮点数1, 浮点数2, 浮点数3,….. ); 双引号中的%Lf的个数,要和后面的要输出的浮点数个数一样多。 其中位于双引号括住的格式串中的%d或者%Lf称为占位符或者转换说明。 ((((((( 兔宝宝:老师,那兔娃亲自来试试,有问题还请老师指导。 何老师:可以呀,那你编一个程序,把以上四种方式都试试~ 兔宝宝:遵命,那本兔就要动手了。。。兔宝宝:老师,我编好了,请您过目。 #include<stdio.h> Int mian(void); { print( ―%d\n‖, -123456) print(―%d,%d,%d\n, 234, -5678, 123456789 ‖ ) print(‖%d\n,‖ 123456789876543212345.6784) Print( %Lf,%Lf.\n,‖ 123e-5, -543.126, 123.45e-20 ) getchar(); return0 何老师:兔宝宝,你这个程序错误很多,也很典型。我一点一点给你讲吧~你先仔细看下这一行,发现错误了吗, Int mian(void); 兔宝宝:老师,我再看看昨天上课笔记。。。噢,是错了,函数头结束时不能加 分号,兔娃我 18 忘了~ 何老师:这一行还有错误吗, 兔宝宝:没有吧, 何老师:你没看见吗, int被你写成了Int 这也是不允许的。C语言程序严格区分大小写,小写字母是决不能改成大写字母的。还有,应该是main(英文含义:主要的),你的拼写错了,被你写成了mian。兔宝宝:噢,是本兔错了,已记下。 何老师:女娃娃要细心。再来看下一行: print( ―%d\n‖, -123456) 这一行你又犯了初学者的典型错误,语句结束时漏写了分号。还有,你错把printf写成了print,所有的printf全部都少了一个f。 兔宝宝:哦,是滴,我怎么都把分号给漏掉了呢,还都少写了f,。。。老师,好了,本兔通通加上了。 何老师:再看下一行: printf(―%d,%d,%d\n, 234, -5678, 123456789 ‖ ); 这一行你再仔细看看格式对照一下,还有错误吗, 兔宝宝:哦,我发现我的双引号放错了位置,应该是这样的: printf(―%d,%d,%d\n‖ , 234, -5678, 123456789 ); 何老师:下面一句还有问题,兔娃发现吗:printf(‖ %d\n,‖ 123456789876543212345.6784); 兔宝宝:老师,我仔细看了,没发现错误呀~ 何老师:正确的是printf(‖%Lf\n‖,123456789876543212345.6784); 你里面的格式符%d只能用于输出整数,现在输出的是浮点数,所以要改成%Lf。还有一个错误 ,你的格式串与输出项之间本来要有的逗号,被你括在了格式串中,你看见了吗, 兔宝宝:噢,写这些输出语句真的要很细心那。 何老师:阿兔,下面一句改完之后还有问题,你发现了吗: Printf(%Lf,%Lf \n,‖ 123e-5, -543.126, 123.45e-20 ); 兔宝宝:老师,我真的没发现呢。 何老师:第一,printf都必须小写不能大写,你的p写成了大写的P,第二,格式串中的%Lf的个数要与后面输出的数据个数一样多,你少写了一个%Lf ;第三,格式串必须用一对双引号括住,你漏掉了一最左边的双引号 ‖ 。 兔宝宝:老师,真没想到一句中还有这么多错误,我按照您说的都改过来了。 何老师:最后这一句你没发现问题吗,return0; return和0之间至少要加一个空格。return是返回语句用的关键字,关键字和要返回的值之间要加一个空格。 19 兔宝宝:噢,老师我改过来了。现在可以了吗, 何老师:你仔细看看还有错误吗, 兔宝宝:哦~函数体结束时的括号 } 我漏写了。我把它加上。老师程序修改 好了, #include<stdio.h> int main(void) { printf("%d\n", -123456); printf("%d,%d,%d\n", 234, -5678, 123456789 ); printf("%Lf\n", 123456789876543212345.6784); printf( "%Lf,%Lf, %Lf\n" ,123e-5, -5.1263457, 123.45e-20 ); getchar(); return 0; } 我再试试。。。。。。老师,程序结果出来了,我把它复制上来给您看: 何老师:兔娃,你从这些运行结果中能学到什么,一句一句仔细对照消化。 printf("%d\n", -123456); printf("%d,%d,%d\n", 234, -5678, 123456789 ); printf("%Lf\n", 123456789876543212345.6784); printf( "%Lf,%Lf, %Lf\n" ,123e-5, -5.1263457, 123.45e-20 ); 兔宝宝:待本兔好好研究一番,。。。。。。(小声自言自语:)第一句容易懂pass,第二句也没什么问题pass;再看第三句:诶~发现大问题了~数据本身是123456789876543212345.6784但是打印出来的结果后面10位全是0啊~哦~想起来了,老师说过:实数输入到计算机中精度只能确保15位,我来点点一共有多少位是对的。。。。。。一共是17位有效数字。也就是说,这个数的精度有17位了,(大声地)老师:第三句浮点数的输出精度是17位吧, 何老师:这是完全有可能的,我只说过,通常的计算机至少能确保高15位数是有效的4,有的时候会多一、两位有效位。阿兔,你对最后一条printf()语你有什么认识,重点看后两个数。 4 遵循IEEE745标准制造出来的计算机都能达到这个精度。 20 兔宝宝:第二个数看出来了,输出时4舍5入只保留了小数点后面6位数。后一个数输出时更奇怪, 1.2345e-20这个数输出时全部变成了零蛋~原因嘛。。。。。。兔娃认为是由于小数点后面只保留了6位造成的。老师,我说的对不对, 何老师:兔娃分析的有道理,那这一句中最后两项该如何处理呢,兔娃知道吗, 兔宝宝:兔娃我不知道。请老师指点。 何老师:对于浮点数值太大和太小的情况,最好使用占位符%e,这是用指数表示法输出浮点数的值 。此外,如果你想要控制小数点之后输出数据的位数,可以这样用:%.nLf 。其中n是一个正整数,用n值来表示4舍5入之后小数点后面保留几位数。比如%.2Lf 就是表示输出值(在4舍5入之后)只保留两位小数 兔宝宝:好的,谢谢老师指导。那兔娃把程序最后一句改一改。。。。。。老师,最后一句兔娃改成这样了,您看如何, printf( "%Lf,%.7Lf, %e\n" ,123e-5, -543.126, 1.2345e-20 ); 何老师:兔娃改得不错。 兔宝宝:老师,我想问问,在一条printf()调用语句中,能够既输出整数又输出浮点数吗, 何老师:完全可以~只不过要注意占位符与后面输出数据的类型一定要一一匹配,千万不能搞错了~举个简单例子吧:如果三个输出数据依次是整型,浮点型,整型,那么占位符一定就要是 %d 、%Lf、%d这样的顺序 。最左边的占位符类型与最左边的输出数据的类型要匹配,。。。最右边的占位符与最右边的输出数据的类型要匹配,语句就一定要写成: printf(―%d ,%Lf,%d\n‖ , 整数,浮点数,整数 ); 这样的形式。 兔宝宝:嗯,兔娃记住了。哦,老师,上面这条语句我能够不写占位符之间的逗号吗, 何老师:兔娃,你可以自己试试呀~ 兔宝宝:老师,那我真的试试了~ #include<stdio.h> int main(void) { printf("%d%Lf%d\n" , -54321, 76854.234521, 1234) ; %Lf,%d\n" , -54321., -76854, 1234e0 ); printf("%d, getchar(); return 0; } 老师,运行结果的第一行三个数据完全连在了一起~ 第二行我想输出的数没有一个是对的~ 何老师:那是很自然的。第一行中,格式串中多个占位符一定不能连着写,占位符之间一定要插入一些别的普通字符(或转义字符),这样才能把几个数据分隔开来。第二行你仔细看看第一个输出数据是浮点数 -54321. 此处有一小数点,所以与之匹配的占位符应当是%Lf,可你却用了占位符%d,中间的输出是整数,而你却用了%Lf,所以输出数据不对是 0正常的。第三项数1234e0的值虽然等于1234×10 也就是1234,但由于前面已经说过此 数不是整数而是浮点数,所以也要用占位符%Lf。程序输出不对是很正常的。 兔宝宝:老师,我懂了。老师,您讲的内容虽然有些枯燥,但兔娃觉得还是很重要,让我认识到了计算机中的整数和符点数与日常生活中的整数和实数是有重要区别的。兔娃还发现用 21 printf()来显示数据是很容易出错的,一定要认真仔细。 何老师:阿兔学得不错。现在,可以进入下一课题了。下面我们开始学变量吧,程序中有了变量才有了活力。没有变量的程序就是死水一潭~ (三) 变量的定义 何老师:按照惯例,我先发一个例题上来,兔娃把程序编译好,运行之后,看到了结果我再来讲解。这个程序一旦运行,兔娃要用键盘输入两个整数,两数之间要用空格隔开,输完后要按下回车键(即Enter键或)。 兔宝宝:好滴,本兔来看看结果。 例题3:变量及其运算 #include<stdio.h> int main( void) { int num1, num2 ; scanf("%d%d" , &num1, &num2 ); printf("/*3*/%d\n" , num1 ); printf(/*4*/"%d\n" , - num1 ); printf("/*5*/%d\n" , num2 ); printf("/*6*/%d\n" , num1+ num2 ); printf("/*7*/%d\n" , num1 - um2 ); printf("/*8*/%d\n" , num1 *num2 ); printf("/*9*/%d\n" , num1 / num 2 ); printf("/*10*/%d\n" , num1*num1+2*num1*num2+num2*num2 ); printf("/*11*/%d\n" , num1*(num1+num2)/(2*num2) ); getchar(); getchar(); return 0; } 兔宝宝:老师,运行结果出来了~您看~ 何老师:兔娃,你先看程序中这一行: int num1, num2 ; 22 这一行定义了两个int型变量,变量名分别是num1和num2。定义变量的一般 格式是: 类型名 变量名; 定义整型变量要用关键字int ,定义双精度浮点型变量要用关键字double 。给 变量起的名字要符合标识符的规定。定义多个变量时,两个变量之间要用逗号隔 开,定义变量结束时的分号不要忘了写。 兔娃,还记得昨天讲过的abc@yahoo.com , number 7, x+y 兔宝宝,你能看出第二行中的各项为什么不是标识符吗, 兔宝宝:第一个2ab以数字开头,第二个sum-2出现了减号- ,第三个也是以 数字开头;第 23 四个出现了符号@;第六个 number 7 中出现了空格字符,第七个出现了加号+。 哦,老师现在我懂了,在程序中是不能够用中文来定义来变量的。 何老师:下面留一个题给兔宝宝:定义两个整型变量,一个变量是用来计数苹果 个数的,另一个是用来计分的 ; 定义一个双精度浮点型变量,变量是用来存放 车速的。 兔宝宝(过了3分钟):老师,我这样定义行不行, int count ,score; double speed; 何老师:阿兔,very good~ 不过,如果你把它分成两行写就更好了~ int count ,score; double speed; 不同类型变量的定义,不要放在同一行上。何况,你做程序猿的工资老板可能是按照程序行数给你付钱的。 兔宝宝:噢~谢谢老师指点。 (五)使用scanf()输入变量的值 何老师:现在我们回到例题3中的这一句: scanf("%d%d" , &num1, &num2 ); 这条语句的作用是让程序用户能够从键盘上输入两个整数,计算机会把这两个整数存放到变量所对应的存储单元中。这个兔娃已经亲自试过了。 兔宝宝:是的,我刚刚运行了这个程序,原来这一条语句是起这个作用啊~那是不是说我输入的第一个整数17就存入到了变量num1中,第二个整数5就存入到了变量num2中呢, 何老师:兔娃说的完全正确~scanf()是格式化输入库函数。一般情况下通过调用scanf()使用键盘输入数据到变量中的格式为: 书写scanf()函数调用语据时,初学者最容易犯的错误有三个: 第一:漏掉变量名左边的取地址符号; 第二:在格式符结束时加了一个转义字符 \n ; 第三:错把%d与浮点型变量匹配,或者错把%Lf与整型变量匹配。 比如就像以下这样三错具全的语句:(假设有变量定义:int num1 , num2 ; ) scanf("%Lf%Lf\n" , num1, num2 ); 24 兔宝宝:老师,为何在scanf()中不能这样用转义字符 \n 呢, 而在printf()中却经常要用到转义字符来 \n 换行呢, 何老师:这个道理现在讲不合适,涉及到输入缓冲区的概念,一说开来就会远离今天要学的主题。兔娃,你先记住别这么写,老师还是以后给兔娃讲解其中的道理吧~ 兔宝宝:好的,老师我记下了。 何老师:现在,老师要考考你,假设定义了3个变量 int age1, age2; double score1,score2; 请你用一条scanf()函数调用语句输入这4个变量的值。 兔宝宝:好的老师,我会做的,这题应该不难。 (六)让电脑算起来——算术运算符和算术表达式 何老师:简单介绍完使用scanf()输入变量的值之后,现在我们可以命令计算机对数值做加减乘除工作了。 兔宝宝:好哇~终于可以让计算机做些有用的计算工作了~ 何老师:现在先来学习什么是运算符和表达式 运算符是表明要计算机进行什么运算的符号,必须指明运算符作用在那个或者 那几个运算量上,经过对运算量进行指定的运算才能得到结果。 C语言中,最常用的运算符分为四大类: 1、算术运算符(见下表) 2、关系运算符:有 大于 >、大于等于 >=、小于 <、小与等于 <=、 等于 ==、不等于 != 一共六个关系运算符,用法见以后讲解 3、逻辑运算符:有 与 && 、或 || 、非 ! 一共三个逻辑运算符,用法见以后讲解。 4、赋值运算符:把一个值存入一个变量(或者一个存储单元)中。明天的课程会介绍赋值运算符。 各种算术运算符见下表 表 各种算术运算符 一元运算符只需要一个运算量;而二元运算符需要左右两个运算量参与运算,才能得到运算结果。 25 使用算术运算符,有以下几点需要注意: 1(初学者最容易漏写乘法运算符(比如:将2*x*y ,误写成为2xy )。 ((((((((((((( 2(不要把浮点数数除法误用为整数除法(比如:错把1.0/3.0 写成1/3 。1/3的值是0 )。一般的,如果左右两个运算量都是整型,则除法运算的结果是舍弃了小数部分的整数商。 3(不要将数值0作为除法的除数,这将导致程序运行出现C语言标准未定义的行为。 4(取模运算符%两边的运算量,都要求是整型量,不能是实型量。 5. 取模运算符―%‖得到的是整数除法的余数。取模运算符―%‖的作用非常大,在后面你能看到,在处理一些周期性问题或者将一个多位数值分解成一个个的单个数字时,都离不开它。 兔宝宝:老师,是不是运算符和运算量结合起来才明确了要对什么数进行什么样的运算吗, 何老师:是的。这是你编程命令计算机工作的关键要素之一。随之而来的,就要学习C语言中的一个重要概念——表达式。 兔宝宝:什么是表达式,它是用来干嘛的, 何老师:算术表达式的定义是:用算术运算符、运算量(有的书称为操作数)和圆括号连接起来的有意义的式子(即能够明确计算出数值的式子),都称为算术表达式。其中的圆括号用来表示要优先计算的部分。 兔宝宝:老师,这个定义中所指的运算量到底是些什么呢, 何老师:运算量包括常量、变量、有返回值的函数调用。常量和变量我们已经学到了,有返回值的函数调用也可以作为运算量,这个老师明天会讲到的。比如: m1+m2、 34* (123+78)、 m1*m1+2*m1*m2+m2*m2、 b * b – 4 * a * c 、 a*b*sin(alfa)/2.0 等等。 兔宝宝:老师,表达式 34* (123+78) 的意思是要优先做123+78 ,将求和得到的结果再乘34吧, a2,a3的平均值如何用 何老师:是的。兔娃,老师考考你,求3个变量a1, 表达式来表示, 兔宝宝:老师,这个不难吧,不就是(a1+a2+a3)/3吗? 何老师:阿兔,你的答案看似正确,其实是有问题的,正确无误的应当是(a1+a2+a3)/3.0 兔宝宝:为什么这么说,难道本兔的答案有误, 何老师:当这三个变量都是整型时,你给的答案就是整数,这个平均值就得不到正确值了。不信你自己编一个小程序试试~ 兔宝宝:哦~是兔娃粗心了,老师前面已经讲过了,如果被除数和除数都为整数的话,除法运算就是整除,整除的结果是一个不带小数的整数商。 26 (七)用printf()显示表达式的运算结果 何老师:学到此时,可以让计算机做一些有趣的事了。下面我给兔娃一个程序,这个程序的作用是将一个输入的三位整数反向后输出。 #include<stdio.h> int main(void) { int n;/*输入变量*/ printf("请输入一个三位整数\n"); scanf("%d", &n); printf( "反向后的三位整数为:\n%d\n" , (n%10)*100+ ((n%100)/10)*10+n/100 ); getchar(); getchar(); return 0; } 兔宝宝:老师运行结果出来了: 但是这个结果兔娃看不太懂。老师,您给我讲讲好吗, 何老师:老师先给兔娃讲讲如何用printf输出表达式的值。printf()不仅可以用来输出常量的值,也可以用来输出变量和表达式的值。其实常量和简单变量5都是表达式,它们都是最简单的表达式。234可以看成234+0 或234*1 。任何一个简单变量也是如此。 兔宝宝:太抽象了,老师,您能否举例说明? 何老师:现在我们来看程序中的关键而又有些难懂的句子: printf( "反向后的三位整数为:\n%d\n" , (n%10)*100+( (n%100)/10)*10+n/100 ); 用此句来解释上述printf函数调用语句的用法 第一句:―printf函数是用来显示格式串中的 反向后的三位整数为:\n%d\n 5 以后讲学到的数组和结构变量不是这样的,这些不属于简单变量。 27 第二句:―格式串后面的参数是需要在显示时插入到该串中的表达式的值‖。此句中的表达式为:(n%10)*100+ (n%100)/10*10+n/100 其中的n为输入的一个三位整数。现在假设输入的n为 359。我们来验证一下该表达式的值是否为953 。先看表达式中的 (n%10)*100。 n%10得到的是359中的个位数9 ,再乘以100就是900;再来看表达式中的 ((n%100)/10)*10 。圆括号中的n%100得到的是 59/10得到的是359这个数中的十位数5, 5再乘以10是50;再来看 n/100 它所得到的是359这个数中的百位数3 。900+50+3 当然就是953了。 所以n反向后得到的值953是要插入到格式串中的,但插入到哪个位置呢, 第三句指出了:―插入的位置是格式串中相匹配的占位符所处的位置,也就是说占位符将被所插入的值取代‖。所以插入后的格式串为: 反向后的三位整数为:\n953\n 由于格式串中转义字符的作用是换行,所以你最终在显示屏上看到的是: 反向后的三位整数为: 953 兔宝宝:噢~老师解释的非常清楚,兔娃彻底懂了。 何老师:懂不懂,看行动。阿兔,我现在给你出一个类似的题,你想想该如何做。题目是这样的:将一个输入的似位整数的前两位和后两为反向后输出。 举例 输入 1234 输出 3412 兔宝宝:好勒~本兔一定负责做出来~ 何老师:现在我可以给兔娃讲解今天的题了。这话说起来就比较长了。我还是给你讲讲吧,你听不懂也没关系的。这里用到了while循环语句: while (scanf("%d%d" , &m1, &m2 ) ==2 ) printf("%d*%d=%d\n " , m1, m2, m1*m2 ); 以上这两行组成了一条while循环语句。while循环语句是在某个条件为―真‖时一直运行 28 一条嵌入在它之中的语句,在条件为―假‖时就运行循环语句之后的语句。在上 面这个程序中,这个条件是由while后面的圆括号中的: scanf("%d%d" , &m1, &m2 ) ==2 给出的,只要这个条件为―真‖,就执行: printf("%d*%d=%d\n " , m1, m2, m1*m2 ); 这条嵌入在while语句之中的语句。运行完这条语句之后,又重新回过头去再次判断条件是否还是为真,。。。。。 假 while 语句的执行流程 兔宝宝:老师,那条件 scanf("%d%d" , &m1, &m2 ) ==2 在什么情况下才为真呢, 何老师:简单说一句,只要你输入了两个整数,输入的两个整数用空格隔开,这两个整数还不能溢出,那这个条件就为真。 兔宝宝:老师,那个后面的 ==2 又是什么意思呢, 何老师:scanf( )函数调用不仅可以让一个或者多个变量得到值,scanf()函数调用结束时也会有一个返回值,这个返回值就是scanf()函数运行成功所输入变量值的个数,在本例中输入项的个数是2,所以成功输入两个数据的话,返回值就应当是2。而以下这个式子 scanf("%d%d" , &m1, &m2 ) ==2 就是用来判断通过scanf()函数调用输入的数据是不是两个。所以你可以多次输入,每次输入两个数。。。。。。 如果你按下一个字符键q ,scanf()函数无法将字符q转化成整数,scanf的返回值就不是2(返回值是0),所以循环就会终止。 兔宝宝:老师,这里面的知识够多的呀,我听起来比较费力。 何老师:这个不要求你现在就懂的,你只要能够模仿用来做题就行了。以后系统讲到了循环 29 兔娃自然会懂的。 兔宝宝:好滴,谢老师讲解,本兔要好好琢磨琢磨,争取把它搞懂。 何老师:今天讲课就到此结束吧,今天所讲的知识非常重要,兔娃要好好一下。再出几个题给兔娃做。 今日编程题 第一题:输入三个数,输出三个数之积和平均值 第三题:输入任意组三个数,输出三个数之积 第四题:将任意个三位整数反向 30
/
本文档为【兔宝宝学编程记——从零开始三个月学会编小游戏】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索