图形学数学编程实训.doc_第1页
图形学数学编程实训.doc_第2页
图形学数学编程实训.doc_第3页
图形学数学编程实训.doc_第4页
图形学数学编程实训.doc_第5页
已阅读5页,还剩113页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

图形学数学编程实训目录第1章C语言导论1.1C语言概述1.2C语言编程1.2.1C语言编程工具1.2.2C语言编程流程1.2.3C语言编程环境第2章数据类型与数值2.1数据类型2.2数据的数值2.2.1常量2.2.2变量第3章运算符与控制结构3.1运算符3.1.1算术运算符3.1.2赋值运算符3.1.3关系运算符,逻辑运算符和强制转换运算符3.2三种控制结构3.2.1顺序结构3.2.2选择结构3.2.3循环结构3.3国旗图形程序设计初步第4章函数4.1函数声明4.2函数定义4.3函数的调用4.3.1函数语句调用4.3.2函数表达式调用4.3.3函数参数调用4.4多文件编程方法4.4.1函数声明法4.4.2文件包含法4.5改写函数4.6国旗演示系统第1章C语言导论本章,我们主要讲三个内容。第一,告诉读者什么是C语言,它是干嘛的?第二,C语言是怎么做事的?第三,演示一个简单有趣又人人都能做的C语言图形实例,通过它既可以说明C语言程序的基本结构,又能激发读者的兴趣。要知道,兴趣可是世界上最好的老师!1.1C语言概述本节,我们主要介绍C语言的过去,现在和将来。常言道:人有人言,兽有兽语。自然界的生物总会有各自的办法来向同类传递信息,例如猎人之间通过人类语言交流,猎犬之间通过吠叫交流。但是不同类生物之间如何交流呢?猎人可以通过手势或口令等中介语言来指挥猎犬!同样,当程序设计人员想指挥计算机工作时,也是通过各种中介语言来控制计算机,这些中介语言称为计算机语言。那么有多少种计算机语言呢?据统计,50万年以来,世界上至少有过2500-3000种人类语言,但是现今的人类社会中,只有英语和汉语等几种语言最为流行,其他的要么很少使用,要么销声匿迹。类似地,从计算机诞生以来,也产生了成百上千的计算机语言,但主流的计算机语言只有几十种,本书讲解的C语言就是其中一种。C语言在这么多种计算机语言中是佼佼者。著名的TIOBE世界编程语言排行榜展现了计算机语言的流行趋势,如图所示。从中不难发现,C语言被广泛应用的程度。目前C语言可以应用于众多领域,例如嵌入式系统,操作系统,驱动程序,电脑游戏等领域。如果学习C语言的过程脱离了上述具体的应用领域会让C语言美丽的外表显得苍白。但是如果打算通过实际电脑驱动程序或汽车嵌入式程序开发来讲解C语言,又会让人望而生畏。能不能通过既然结合具体应用,又适合所有人的实例来学习C语言呢?全球知名创新与创造力专家Ken Robinson在世界著名的TED大会论坛曾给出过答案:画画儿。对!就这么简单。画画儿几乎是所有人都能做的又感兴趣的,那么用C语言来画画儿是不是更有趣呢?本着这个出发点,本书结合其在图形领域的应用,讲解C语言。图1.11.2C语言编程本节,我们主要介绍C语言的编程工具和编程流程,也就是C语言用什么东西来进行编程(例如图形编程)和编程的步骤。1.2.1C语言编程工具本节主要介绍一种C语言编程工具VC6.0。我们知道,人类语言是借助喉部,口腔和鼻腔等发音器官来实现,同样,C语言的实现要依赖集成开发环境,这些集成开发环境提供了编辑,编译,连接和运行等功能。本书以Microsoft公司的Visual C+6.0(以下简称VC6.0)集成开发环境来实现C语言程序。所以,请确保用于开发C语言程序的计算机上安装有VC6.0,读者可以从相关书籍或网络上了解VC6.0的安装方法,这里不再介绍。此外,为了利用C语言进行图形应用领域的程序设计,还需要安装相应的图形函数库,这里详细介绍安装步骤。共两步:第一步,将“图形函数库”文件夹中的文件graphics.h,拷贝到文件夹C:Program FilesMicrosoft Visual StudioVC98Include下(如果读者的VC6.0目录不是在这个文件夹,请自行调整)。第二步,将“图形函数库”文件夹中的文件graphics.lib,拷贝到文件夹C:Program FilesMicrosoft Visual StudioVC98Lib下(如果读者的VC6.0目录不是在这个文件夹,请自行调整)。到此,图形函数库安装完毕,很简单吧!本书中绝大多数实例都需要上述两个编程工具。1.2.2C语言编程流程本节主要介绍使用C语言编程工具VC6.0进行编程的步骤。那么如何利用上述的编程工具,需要哪些步骤来编程呢?这就涉及到了C语言的一般编程流程。现在,我们动手编写第一个C语言程序,体验一下它在图形应用方面的魅力吧!大致分为四个步骤:第一步,需要建立一个C语言工程,步骤如下。点击“File”New”,弹出“New”对话框。该对话框包含四个选项卡,在“Files”,“Projects”,“Workspaces”和“Other Documents”这四个选项卡中,点击“Projects”选项卡。如图所示,输入信息。图1.2点击选中“Win32 Console Application”。在”Project name:”处输入0101。在“Location:”处输入C:0101。点击“OK”按钮。弹出新的对话框,不需要任何输入,直接点击“Finish”按钮。再次弹出新的对话框,仍然不需要任何输入,直接点击“OK”按钮。至此,一个C语言工程建立完毕。第二步,需要建立一个C语言文件,步骤如下。点击“File”New”,弹出“New”对话框。在“Files”,“Projects”,“Workspaces”和“Other Documents”四个选项卡中,点击“Files”选项卡。如图所示,输入信息。图1.3点击选中“C+ Source File”。勾选“Add to project:”。在“File”处输入0101.cpp。点击“OK”按钮。至此,一个C语言文件建立完毕。第三步,编辑程序。在名为“0101.cpp”的编辑区内,输入如下代码。图1.4仔细检查代码是否一致。之所以强调“仔细”二字,是因为经验表明,半数以上的程序错误都是由录入不认真造成的。例如,少写多写字符,字母大小写不一致,或错误的使用中文全角标点符号等等。在进行C语言编程是,不要急于运行程序查看结果,而应该先仔细检查,将一些拼写之类的低级错误消灭在萌芽阶段。第四步,需要运行程序,步骤如下。检查无误后,点击“File”菜单,弹出下拉菜单如下图所示。图1.5依次点”Complie 0101.cpp Ctrl+F7”菜单,”Build 0101.exe F7”菜单,”Execute 0101.exe Ctrl+F5”菜单,完成程序的编译,连接与运行工作。程序运行成功,将弹出运行结果如图所示。图1.6到此,经过四步,我们的第一个C语言程序就完成了。程序中语句initgraph(400,200);用于定义窗口的宽度和高度,尝试修改一下吧,例如改为initgraph(600,600);再运行程序看看有什么效果?会发现图形窗口变宽变高了!其实,我们是修改了图形窗口的屏幕坐标系。这里介绍一下屏幕坐标系。在图形函数库中规定,显示器左上角为坐标系原点(0,0),水平方向为X轴,自左向右;垂直方向为Y轴,自上向下。如图所示。(0,0)图1.7程序中语句outtextxy(150,100,Hello World);用于定义输出文字的横坐标,纵坐标和文字内容,尝试修改一下,例如改为outtextxy(100,50,你好世界);再运行程序看看有什么效果?但是这个程序的视觉效果不太好。首先,黑色的背景很不友好。其次,文字的颜色单一。最后,文字的字体较简陋。下面我们改良一下这个例子。重新执行第三步,再次编辑程序。在名为“0101.cpp”的编辑区内,输入如下代码。图1.8重复执行第四步。完成程序的编译,连接与运行工作。程序运行成功,将弹出运行结果如图所示。图1.9这个程序的视觉效果大大提高。首先,语句setbkcolor(WHITE);修改背景色为白色,去掉了黑色的背景。其次,语句setcolor(GREEN);将文字的颜色设置为绿色。最后,语句setfont(60,15,华文行楷);设置文字的高度和宽度分别为60和15,并设置字体为华文行楷。一些读者一定已经跃跃欲试,想修改其它的颜色和字体。下面简要介绍一下。颜色的信息是在图形函数库中预先定义好的,如表所示。当然,还有更多种颜色,后续章节介绍。参数颜色参数颜色参数颜色参数颜色BLACK黑BLUE蓝GREEN绿CYAN青RED红MAGENTA紫BROWN棕LIGHTGRAY浅灰DARKGRAY深灰LIGHTBLUE浅蓝LIGHTGREEN浅绿LIGHTCYAN浅青LIGHTRED浅红LIGHTMAGENTA浅紫YELLOW黄WHITE白表1.1字体的信息是在计算机系统中预先定义好的。详见计算机文件夹C:WINDOWSFonts。这里有许多种字体,例如宋体,黑体等等。当然,还有更多种字体,读者可以从网络上下载。通过这两个实例的对比以及读者的反复修改,我们不难发现一个C语言图形程序的基本结构。如下所示。首先,看第1行。本书所用图形函数库具有几十个图形库函数,因此其图形功能非常丰富。所有这些图形函数均在头文件“graphics.h”中定义,所以,开发C语言图形应用程序,都必须在程序文件的开头写上文件包含命令#include”graphics.h”。其次,看第4行。在一般情况下,计算机屏幕为文本方式,在该方式下所有的图形函数都不能操作,因此,在使用图形函数绘图之前,必须通过图形方式初始化来将文本方式转换成图形方式。图形方式初始化是通过函数initgraph来完成的。其格式如下:void initgraph(width, height);需要注意的是屏幕宽度参数width和高度参数height必须为整数。第4行的功能就是建立一个400*200的图形窗口。再次,看第6和7行。在运行完成图形程序绘图结束后,又要回到文本方式,以进行其他工作,这里应关闭图形方式。关闭图形方式要用函数closegraph。其格式如下:void closegraph();功能是释放所有图形系统分配的存储空间,返回调用initgraph之前的状态。需要注意的是该函数不需要任何参数。如果我们绘制了某个图形,想将其暂时留在窗口中以便观看而不是立刻被第7行的closegaph()关闭掉,就必须在第6行加上getch()来实现留屏。尝试着在前面的程序中删除第6行,观察一下有什么不同的效果?绘制的图形将一闪而过。最后,看第2,3和8行。main在每个C语言图形程序中必须书写,功能是整合上述语句,并作为程序执行的入口。到此,我们就总结了一个C语言图形程序的基本框架。如果需要绘制一些图形,将相应语句加在基本框架中第5行空白的地方即可。1.2.3C语言编程环境本节主要介绍C语言编程工具VC6.0的开发环境的布局及功能。通过前面的学习,已经感性地体会了一下典型的C语言图形程序。本节,详细介绍一下C语言图形程序的编程开发环境。首先,我们了解一下开发工具VC6.0。VC6.0是Microsoft公司推出的一个基于Windows系统平台、可视化的集成开发环境,它的源程序按C+语言的要求编写,并加入了微软提供的功能强大的MFC(Microsoft Foundation Class)类库。MFC中封装了大部分Windows API函数和Windows控件,它包含的功能涉及到整个Windows操作系统。MFC不仅给用户提供了Windows图形环境下应用程序的框架,而且还提供了创建应用程序的组件,这样,开发人员不必从头设计创建和管理一个标准Windows应用程序所需的程序,而是从一个比较高的起点编程,故节省了大量的时间。另外,它提供了大量的代码,指导用户编程时实现某些技术和功能。因此,使用VC+提供的高度可视化的应用程序开发工具和MFC类库,可使应用程序开发变得简单。此外,本书结合C语言在图形开发中的应用来讲解C语言,所以还需要另一个开发工具,图形函数库graphics.h。graphics.h原是TurboC里面的图形库,现已经移植到Windows平台,移植后的graphics.h是针对 C+ 的图形库,可以帮助 C 语言初学者快速上手图形和游戏编程。值得注意的是,如果要使用它进行C语言图形程序设计,建立的C语言文件的扩展名必须是.cpp,不可以是.c。其次,我们了解一下VC6.0的开发编程环境。如图所示。图1.10VC6.0的开发环境由四大部分组成,分别是菜单工具区,代码编辑区,提示信息区,项目文件区。菜单工具区主要包括各种菜单和工具按钮,是整个VC6.0的功能集合。代码编辑区主要包括一个文本编辑窗口,供程序设计人员手动录入代码。提示信息区主要包括一个信息输出窗口,供VC6.0输出编辑连接等信息,供程序设计人员参考。项目文件区主要包括一个项目文件管理树状目录,方便程序设计人员管理已有的各种工程文件。最后,我们总结一下C语言程序的开发流程。C语言是一种编译型计算机语言,开发流程包括编辑,编译,连接和运行四个步骤。一般地,编辑步骤是指C语言源程序代码的录入和修改。在代码编辑区创建C语言源文件,最后以文件的形式存放在磁盘上,文件名由程序设计人员自行定义,但扩展名一般为.cpp。例如:0101.cpp。(提示:一般的C语言程序的扩展名是.c,由于需要调用图形函数库,所以本书上所有C语言文件扩展名规定为.cpp。)编译步骤是编译器把C语言源程序代码翻译成可重定位的二进制目标程序文件,其文件名与源文件名同,但扩展自动为.obj。编译器是VC6.0自带的,其工作是将源代码转换为可执行代码。.obj是用机器语言表示的代码,一般程序设计人员不必关心。进行编译有三种方法,第一种通过菜单”Build”Complie”;第二种通过菜单工具区中的编译按钮;第三种通过快捷键Ctrl+F7。当编译发现错误时,需要回到代码编辑区修改程序,直到没错为止。连接步骤是连接程序把编译过的目标程序与程序中用到的库函数连接在一起,形成可执行文件,可执行文件名与C语言工程同,其扩展名为.exe。进行连接有三种方法,第一种通过菜单”Build”Build”;第二种通过菜单工具区中的连接按钮;第三种通过快捷键F7。当连接发现错误时,需要回到代码编辑区修改程序,直到没错为止。运行步骤是执行可执行文件,显示程序结果。进行连接有三种方法,第一种通过菜单”Build”Execute”;第二种通过菜单工具区中的运行按钮;第三种通过快捷键Ctrl+F5。小结:本章主要介绍了两部分内容:C语言的背景知识及C语言编程。以一个简单有趣的“你好世界”实例为导引,使读者对编程工具,编程流程及编程环境三个概念有一个初步的认识。第2章 数据的类型与数值C语言本质上一种计算机语言,而计算机的本质就是进行数据处理的机器,所以,在C语言中对于数据的研究是少不了的。本章首先介绍数据的概念,其次讲解数据的重要属性数据的类型。最后,根据数据是否可以改变大小,介绍常量和变量。从40年代电子数字计算机ENIAC处理的6张弹道火力表到现如今21世纪随处可见的个人笔记本电脑上播放的阿凡达3D大片,计算机处理的对象几乎渗透到人类生活与工作的每个角落。但无论处理的对象表面多么纷繁复杂,究其根本都是“数据”二字。本章,我们就来讨论一下C语言中的数据及其属性。什么是数据呢?数据是关于自然、社会现象和科学试验的定量或定性的记录,是科学研究最重要的基础;研究数据就是对数据进行采集、分类、录入、储存、统计分析,统计检验等一系列活动的统称。这样官方的定义虽然客观严谨,却不便于学习C语言的读者的理解。其实数据就在你身边,这里打个出方。拿一张存储电影的光盘。盘片主要由保护层,反射激光的铝反射层,刻槽和聚碳酸酯衬垫组成,电影数据被记录在高低不同的凹凸起伏的刻槽上。凹凸分别代表数字1和0,从而记录数据。我们可以把数据比喻成光盘。2.1数据类型本节主要介绍一些常见的基本数据类型,对于复杂的构造数据类型,后续章节单独列章介绍。知道了什么是数据,现在我们先来看数据的第一属性,数据类型。我们知道,不同类型光盘的容量相异,CD光盘的容量是600M,DVD光盘的容量则是4.7G。类似地,数据也有类型之分,不同数据类型之间尺寸大小是不同的。在C语言中,数据类型的分类如图所示。图2.1根据上图所示,在C语言中数据类型分为基本和构造两大类。基本类型是不可再分的数据类型,构造类型由基本类型构成。后者更复杂,功能也更强大,在后续章节介绍。C语言提供了4种基本数据如表所示。(其中空类型在后续章节介绍。)表2.1不同的数据类型在内存中所占字节数是不同,即大小不同。例如字符型在内存中占1个字节,但双精度浮点型却占了8字节,是前者的8位。类似地,现实生活中,一张DVD光盘的容量远大一张VCD光盘。数据类型是数据的第一属性。这里注意一点,由于不同的编程工具是由不同的公司在不同的时代开发的,所以,数据类型的规定有一些是有出入的。例如,在VC6.0中,整型占4个字节而不是2个字节,但是另一种编程软件Turbo C中整型还是占2个字节。2.2数据的数值本节根据数据大小可否改变,将数据分为常量和变量两种。学习了数据的第一属性数据类型,下面我们来看看数据的第二属性,数据的数值。我们知道,有的光盘只能读取数据,不能写入;有的光盘却技术较先进,可以重复刻录数据。类似地,在C语言中,有的数据不能改变其大小,有的数据的数值却可以更新修改。这就涉及数据的第二属性,数值。根据数值可否改变将数据分为两大类:常量和变量。2.2.1常量本节介绍数值大小不可改变的数据:常量。重点介绍算术常量,符号常量和字符常量,以圆形绘制为实例。常量是在程序执行过程中其值保持不变的数据。其特征是使用时直接书写数值,系统不会为其分配内存,不必为其命名。C语言中常量可分为算术常量,字符常量,枚举常量和符号常量(枚举常量在后续章节介绍)。算术常量又分为整型常量和实型常量。例0201这个程序定义了一个宽度和高度都 是200像素,背景色是白色的窗口,并在窗口中心(100,100)处画了一个绿色的点。其中点的横纵坐标都是整型常量100,不能被修改,所以点是固定不变的。程序中用到了图形函数库中的putpixel函数,简要介绍如下。void putpixel( x, y, color);参数x和y是点的横纵坐标,参数color是点的颜色。请读者修改程序尝试在(150,150)处画一个白色的点吧!多写几条语句,可以画更多的点呦!试着画一个布满各种颜色点的虚拟星空效果吧!整型常量可以用三种形式来表示:1)十进制整数十进制是大家最熟悉的整型常量写法,十进制没有前缀,其数码为0,1,2,3,4,5,6,7,8,9共十个。例如上例中点坐标100,就是合法的十进制整数。2)八进制整数八进制在计算机使用较多的写法,八进制需要以数字0为前缀,其数码为0,1,2,3,4,5,6,7共八个。例如上例中点的十进制坐标100,完全造价于八进制坐标0144。3)十六进制整数十六进制也是在计算机使用较多的写法,十六进制需要以0x为前缀,其数码更复杂,包括十六个:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F。例如上例中点的十进制坐标100,完全造价于十进制坐标0x64。使用八进制和十六进制改写上面的例子。例0202例0202与例0201实验效果完全一样。关于三种进制的相互转换的方法,读者可以参阅计算机文化基础等图书或网络。下面学习一下实型常量。实型常量只采用十进制表示。它有两种形式:小数和指数。1)小数形式由正负号,整数部分,小数点和小数部分组成。观察如下的程序的实验结果。例0203会发现与例0201的效果一样。并且开发环境的提示信息区有这样的两句话。warning C4244: argument : conversion from const double to int, possible loss of data和warning C4244: argument : conversion from const double to int, possible loss of data。提示程序设计人员,系统自动将两个实型常量100.2和100.5自动转换成整型常量,这一过程可能造成数据丢失。造成这样现象的原因是,程序窗口是由一群离散的像素点组成 的,例如语句initgraph(200,200);会定义一个宽200个像素高有200个像素共40000个像素点的窗口。如果程序设计人员把窗口错误地想当然成线性连续的,使用实型常量100.2和100.5,系统只能被迫截取成整型常量100和100,所以会得到一样的实验效果。2)指数形式在小数的基础上,后面加阶码标志(E)及指数组成。例如小数形式的实型常量圆周率3.1415926,可以表示为指数形式的实型常量圆周率0.31415926E1。需要注意的是,阶码标志前面必须有数字,后面的指数必须是整数。例0204这个程序的功能是在绿色的背景上绘制一个半径为50的红色的圆,并计算输出圆的面积。图2.2绘制一个圆,需要用到图形函数库中的circle函数,格式如下:void circle(x,y,radius);参数x和y是圆心的横纵坐标,参数radius是圆的半径。为了计算输出圆的面积,需要做三步工作。第一步,计算其值将整型常量50乘以整型常量50再乘以指数形式的实型常量0.31415926E1。结果为7853.981500。第二步,使用VC6.0自带输出函数printf输出结果数,如果要使用该函数,必须写上#include。第三步,启动Win32 Console Application控制台窗口,将输出结果显示出来。如果要打开该窗口,必须在#include前面写上#define SHOW_CONSOLE。图2.3细心的读者可能已经发现,语句“printf(圆的面积是%f,50*50*0.31415926E1); /指数形式圆周率”中,有一段汉字不会被程序执行,这是C语言注释。这些注释是面向人类而不是计算机的,意思也就是说,人看得到机器看不到,所以不会被VC6.0所执行,只供程序设计人员之间交流使用。一个好的程序设计人员应该在程序中正确使用注释来说明程序的功能,注意事项和有关算法等。例如上例中注释说明指数形式实型常量0.31415926E1是圆周率。程序设计人员可以使用/逐行给程序加注释,也可以使用/*/多行给程序加注释,这在注释多行语句时很方便,但需要注意的是,/*和*/一定要配对使用,否则将破坏程序。也正因此,本书建议读者采用逐行注释形式/。下面学习一下符号常量。如果现在想修改圆周率的精度为3.1415927,只须修改一行。但是如果一个大型的程序中用到了成百上千次圆周率呢?逐行的修改岂不让人崩溃。为了解决这个问题,可以借助符号常量。例0205图2.4程序中语句#define YZL 3.1415927,定义了一个符号常量YZL来代表新精度的圆周率。这样,使用符号常量形式的圆周率代替算术常量形式的圆周率,如果需要修改圆周率的精度,只须修改一行,则程序中使用到符号常量的其他行都自动修改了,达到了一改全改,提高效率的目的。值得注意的是,在graphics.h的图形函数库中已经定义好了#define PI 3.14159供我们用户使用。定义符号常量有三种方法:宏定义,const修饰符和枚举法(枚举后续章节介绍),本章介绍前两种。宏定义时用指定的标识符来代表一串字符,其一般形式为:#define 标识符 字符串例如上例中#define YZL 3.1415927行,程序在进行编译时,凡在出现YZL的地方都使用3.1415927来替换,易于修改,非常方便,但也问题重重。主要表现在两点上,第一个问题是,这种替换只是单纯地文本替换,有时会导致错误结果。例0206图2.5将#define YZL 3.1415927修改为#define YZL 1.1415927+2后,圆的面积和周长结果都是错误的。仔细观察发现程序在计算面积时使用的是50*50*1.1415927+2=2855.981750而不是使用50*50*(1.1415927+2)。周长类似。这种替换不作语法检查,使用时应当心。另一个问题是,在上述宏定义中,我们不知道YZL的数据类型,这样也是不安全的。使用const修饰符可以解决上面的两个问题。const修饰符const定义的符号常量既有数据类型也进行语法检查,克服了宏定义的上述缺点。例0207图2.6结果又恢复正确了。const的一般形式为:const 数据类型 标识符=字符串;可见,在使用符号常量时,建议读者尽量不要使用宏定义,而使用const的定义方法 。前面的例子中,绘制了圆计算了面积和周长并输出了结果。下面让我们初步了解一下C语言提供给程序设计人员的输出接口。输出是将保存在内存中的数据送到输出设备上。为完成此操作,需要使用格式输出函数printf。在此,先做一简单的介绍。格式输出函数printf的功能是按指定的格式输出数据,其一般格式为:printf(“格式控制符和若干字符”,输出项表);其中,printf是函数名,其后括号中的内容为该函数的参数:格式控制字符串用双引号括起来,用来规定输出格式,例如%d用来输出十进制整数,%f用来输出实数,%c用来输出字符,也可以包含普通字符,如果在格式控制字符串中包含非格式控制字符,将原样输出;参数表中包含0个或多个输出项,输出项之间用逗号分开。例0208#define SHOW_CONSOLE#include#includeconst double YZL=3.1415927;void main()initgraph(200,200);setbkcolor(GREEN);setcolor(RED);circle(100,100,50);printf(圆的半径是%d,圆的面积是%f,圆的周长是%f,50,50*50*YZL,2*50*YZL);getch();closegraph();图2.7但是输出结果过长不便于观察,也不美观。改写程序中相应语句为printf(圆的半径是%dn圆的面积是%fn圆的周长是%f,50,50*50*YZL,2*50*YZL);图2.8修改后的结果整洁大方,便于观察。必定语句中包含了一个n,起到了回车换行的作用。这就涉及到了字符常量的概念。字符常量有单字符常量和字符串常量两种。单字符常量是指仅含ASCII字符的常量,在内存中占一个字符,存放字符的ASCII码。单字符常量又分为两种:普通单字符常量和转义字符常量。前者指是由一对单引号括起来的单个字符所构成,例如A,1,#等等。例0209图2.9使用普通单字符常量输出一个圆的英语单词。那是不是键盘上的字符都可以通过普通单字符常量的形式来输出呢?下面是一张键位图,改写上面的程序,看看有哪些字符不能正常显示。图2.10经过仔细逐个测试细心的读者会发现有三个字符无法正常显示,分别是单引号,双引号”和反斜杠。例0209上述程序试图输出单引号,双引号”和反斜杠,但在编译步骤报错。原因是,在C语言中规定,这些字符是不能通过普通单字符常量的形式输出 的,而应该采用转义字符常量的形式输出。常见的转义字符常量如下表。转义字符常量含义转义字符常量含义n换行符a响铃符t水平制表符反斜杠v垂直制表符单引号b退格符”双引号r回车符ooo八进制数f换页符xhh十六进制数表2.2下面的程序采用转义字符常量的形式,可以正常显示单引号,双引号”和反斜杠。例0210试着改写例0210,输出其它的转义字符常量,验证其含义吧!另外,前面介绍的普通单字符常量均可用转义字符常量来表示,可以视其为转义字符常量的特殊情况。表中ooo和xhh正是为此而提出的。ooo和hh分别为八进制和十六进制的ASCII码。如八进制转义字符常量162和143表示普通单字符常量字母r和c, 十六进制转义字符常量x6c和x65表示普通单字符常量字母l 和e。例0211上述程序混合使用普通单字符常量和转义字符常量在屏幕上打印圆的英文单词Circle。程序结果如图所示。此外,对于ASCII感兴趣的读者可以参阅相关的图书或搜索网络。图2.112.2.2变量本节介绍数值大小可改变的数据:变量。从变量的数据类型,名字,数值,地址值四个角度入手,以圆形绘制为例。前面的例子中,绘制了圆并计算输出了圆的面积和周长。初步实现了输出功能后,一定有些读者摩拳擦掌想实现输入功能,例如输出一个半径,自动画一个相应的圆形。要实现这一功能,需要两个重要内容:接收半径的输入函数和存放半径的存储变量。那么什么是变量呢?与常量相反,变量是在程序执行过程中其值可以改变的数据,其特征是使用时系统会为其分配内存,该内存存储该变量某时某刻的某个值。另外与常量不同,必须为变量命名。变量有五个重要的属性:存储类型(后续章节介绍),数据类型,名字,数值,地址值。数据类型我们前面已经学习了。常量的基本类型变量有字符型变量,整型变量和实型变量(构造类型变量后续章节介绍)。变量的名字就像人类的名字一样,不但要起得合法合规矩,还要起得漂亮有意义。合法合规矩的变量名是指要满足C语言标识符要求。那么什么是标识符呢?标识符就量个字符序列,就象中国人的名字是汉字序列一样。中国人名必须符合一定的语法规则:第 一个字必须属于百家姓中的某个汉字,不可任意使用,第一个字之后,可是以任意的汉字。标识符可由字母,下划线和数字等“汉字”组成,但第一个字必须是字母或下下划线这些“姓”。例如我们可以为存放半径的存储变量起一个名字radius。这个名字是合法。那么什么是合规矩呢?我们知道在封建王朝,起名字时要避免与统治皇帝的名字同字,虽然同字的名字是合法的,但是却由于不合规矩,也不能使用。在C语言中也有一些称为关键字的“皇族”(共32个),在给变量起名字时要与之避开。关键字详见下表。控制语句关键字chardoubleenumfloatintlongshortsignedstructunionunsignedvoid数据类型关键字fordowhilebreakcontinueifelsegotoswitchcasedefaultreturn存储类型关键字autoexternregisterstatic其他关键字constsizeoftypedefvolatile表2.3最后补充一句,C语言是大小字母区分的计算机语言,例如auto和Auto是两个不同的标识符,这样,我们可以使用Auto给变量命名,既合法又合规矩,不会与关键字auto冲突。但除非特殊情况,否则不建议读者打这样的“擦边球”。变量的名字仅仅合法合规矩还够,还要漂亮有意义。例如对于存储圆半径的变量来说,变量名radius比变量名r有意义,变量名circleRadius比变量名radius更漂亮。如何做到变量名漂亮有意义呢?这就涉及到复杂的编程命名规范。虽然命名规范是程序书写规范中最重要也是最富争议的地方,至今没有统一的方法,但是有些一般性的简单规律可供读者遵循:1)名字尽量使用接近变量的功能英文单词2)如果名字由多个英文单词组成,则第一个单词后每个单词的第1个字母大写3)由于C语言库函数通常使用下划线开头,因此不建议使用下划线开头对编程命名规范感兴趣的读者,可以参阅匈牙利命名法等编程命名规范。关于变量的数值和地址值。我们可以把变量想象成一个计算机仓库,变量的地址值相当于仓库的地址,变量的数值相当于仓库里的货物。前者不能改变,后者可以更新。我们改变存储圆半径的变量的操作就类似于我们更改仓库里货物的过程。首先,按照找到变量,其次,使用新的数值覆盖旧的数值以更新变量的数值。最后,在操作中,变量的数值改变了但地址值没变,类似仓库不会移位,只是存放的货物不同了。例0212程序结果如图所示。 图2.12图2.13程序首先绘制了一个半径为50的圆,该圆的半径存储在一个名字为radius的整型变量中,该变量的内存地址值是0x0012FF7C。后来程序要求读者输入一个新的半径值,例如20,之后绘制新的圆形并输出变量的新属性,观察发现只有数值一项属性发生变量,其它保持不变。在程序中,使用scanf函数来输入新的半径。下面让我们初步了解一下C语言提供给程序设计人员的输入接口。输入是将原始数据通过输入设备送入到计算机内存。为完成此操作,需要使用格式输入函数scanf。在此,先做一简单的介绍。格式输入函数scanf的功能是按指定的格式输入数据,其一般格式为:scanf(“格式控制符和若干字符”,输入项表);其中,scanf是函数名,其后括号中的内容为该函数的参数:格式控制字符串用双引号括起来,用来规定输入格式,其用法和printf函数中规定相同,例如%d用来输出十进制整数,%f用来输出实数,%c用来输出字符,也可以包含普通字符,如果在格式控制字符串中包含非格式控制字符,将原样输出;参数表中包含1个或多个输入项,该输入项必须是变量的地址值(变量的地址表示方法一般是在变量名字前加上&符号),多输入项之间用逗号分开。一般情况下,我们不知道变量在内存中的地址值。所以经常在scanf中使用&取地址运算符来取出变量地址。在上例中我们知道了变量的地址是0x0012FF7C。所以可以将程序中语句scanf(%d,&radius);改写为scanf(%d,0x0012FF7C);程序的效果将一样。当然,不建议读者使用这种既笨拙又不安全的scanf使用方法。其实,在本程序中,不仅圆的半径可以使用变量来输入,其它的数值需要改变的数据都可以使用变量来表示并输入。例0213本例中窗口的尺寸,圆的坐标及半径都是由读者交互式指定的。结果如图所示。图2.14图2.15读者还可以根据自己的需要继续改写上述程序。例如多绘制几个不同颜色,不同坐标,不同大小的圆形。如图所示。图2.16例0214该程序虽然行数较多,但其实非常简单,十五次调用circle函数绘制十五个圆,每次改变圆的颜色,并更新圆心的横坐标,其值是不断变化的。如图所示。图2.17在上面的例子中,我们通过加号+和等号=将circle变量的数值增加了10,这两个符号其实属于C语言中的运算符。那么C语言中还有哪些运算符呢?它们的功能是什么呢?请看第3章 运算符与表达式吧!小结:本章主要介绍C语言中的数据概念,并且从两个角度出发。第一,根据数据在类型进行介绍,使读者了解一些基本的数据类型,整型,字符型,浮点型等。第二,根据数据的大小可否改变,以大家熟悉的圆形绘制为基础,从常量和变量两个方面介绍一些常见的算术常量,字符常量和符号常量;也介绍了变量的一些重要属性和用法。第3章 运算符与控制结构本章主要介绍三部分C语言知识:运算符,控制结构和简单的国旗图形编程。首先,计算机的天职是各种数值计算,这自然离不开运算符的有关知识。其次,如何控制前面说的运算符的运算过程,这就涉及到了C语言控制结构。这两个知识点通过一个雷达程序实例来讲解,该实例理论与实际紧密地结合,读者也可以自由扩展雷达实例,非常有趣!最后,将圆形的雷达实例进一步扩展,绘制一些由圆形构成的国旗。并进一步扩展讲解在各种国旗中除图形的其它几何元素:矩形,三角形,五角星等。在前面的学习过程中,我们利用图形函数库绘制了一个圆形,并结合该圆形介绍了数据的类型和数值等重要概念。在本节里,我们再以上面大家已经熟悉的圆形为基础,模拟绘制一个圆形的雷达,并结合该雷达实例介绍一下C语言对数据进行各种操作的手段:运算符和控制结构。请读者按照C语言程序的编程流程,实现下面以圆形为基础的雷达实例的代码,并观察实验效果,分析本例中是如何使用圆形来模拟雷达的。值得注意的是,虽然代码相对以前的例子来说较长,但我们会结合运算符和控制结构的相关概念,采用分块方法,分而治之地解释各部分的功用,所以读者不必担心难以理解和掌握。例0301代码如下:程序运行结果如图3.1所示。程序有两个窗口:图形窗口WIN32CONSOLE控制台窗口。程序在图形窗口中绘制一个绿色的雷达扫描界面,还有一个会移动的白色不明飞行物,雷达的扫描线是转动的。程序在WIN32CONSOLE控制台窗口中计算并显示不明飞行物的信息。如图3.2所示。当不明飞行物不在绿色的雷达扫描区域里时,计算机会在WIN32CONSOLE控制台窗口中显示“雷达未见异常”;但是当不明飞行物进入绿色的雷达扫描区域内时,计算机会模拟发出嘀嘀的雷达报警声,同时,在WIN32CONSOLE控制台窗口中显示“警报!雷达发现不明飞行物!”及不明飞行物的坐标信息。图3.1图3.2虽然雷达实例程序较长,但实际上代码的宏观结构却较简单。程序大致分三大块,第一块,从第13到21行,从第66到72行。其功能是完成程序中用到的变量的定义和计算工作,控制程序走向。第二块,从第22到54行,其功能是绘制雷达界面。第三块,从第56到64行,其功能是绘制不明飞行物。下面,我们先来看第三块,绘制不明飞行物。/-UFO绘制开始-putpixel(ufoX,ufoY,WHITE);putpixel(ufoX-1,ufoY,WHITE);putpixel(ufoX,ufoY-1,WHITE);putpixel(ufoX+1,ufoY,WHITE);putpixel(ufoX,ufoY+1,WHITE);/-UFO绘制结束-这里使用到了图形函数库中的putpixel函数。简介如下。putpixel 在指定位置画一个像素点调用格式:putpixel(x,y,color);形参说明:x和y指定位置坐标,color指定颜色例如程序中putpixel(ufoX,ufoY,WHITE);语句在图形窗口中的(ufoX,ufoY)处绘制一下白色的像素,代表不明飞行物。但由于一个像素过小,观察起来不方便,于是在其坐标的上,下,左,右四个方向上的也绘制四个白色的像素点,这样五个像素点共同代表一个较大的十字形状的不明飞行物。这里,读者可以根据自己的需要,由不同数目和颜色的像素点组成任意形状和色彩的不明飞行物,例如改写程序相应的部分如下。/- UFO绘制开始-putpixel(ufoX,ufoY,WHITE);putpixel(ufoX-1,ufoY,WHITE);putpixel(ufoX,ufoY-1,WHITE);putpixel(ufoX+1,ufoY,WHITE);putpixel(ufoX,ufoY+1,WHITE);putpixel(ufoX-1,ufoY-1,WHITE);putpixel(ufoX+1,ufoY-1,WHITE);putpixel(ufoX-1,ufoY+1,WHITE);putpixel(ufoX+1,ufoY+1,WHITE);/- UFO绘制结束-在(ufoX,ufoY)坐标的上,下,左,右,左上,左下,右上,右下8个方向上绘制四个白色的像素点,这样九个像素点共同代表一个正方形状的不明飞行物。如图所示。图3.3当然,手动书写代码的由像素组成的不明飞行物的图形相对而言,都是比较简陋的。我们可以使用前面学习过的setfont和outtextxy函数在屏幕上绘制一个真正的不明飞行物图形。如果要完成这项工作,需要完成如下三步。首先,我们使用setfont函数设置一下特殊字体KR Out of This World。书写setfont(30,0,KR Out Of This World);语句,以设置图形系统字体为特殊字体KR Out of This World。该字体在计算机系统内没有自带,所以读者需要下载安装该字体。如图所示。图3.4其次,使用outputxy函数在(ufoX,ufoY)坐标处绘制一个UFO图形。由于在特殊字体KR Out of This World中f对应一个ufo图形,所以书写如下语句。outtextxy(ufoX,ufoY,f);最后,使用上述代码替换原程序中对应的部分。/- UFO绘制开始-setcolor(WHITE);setfont(30,0,KR Out Of This World);ou

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论