C语言程序设计ppt课件 第7章.ppt

上传人:小飞机 文档编号:1375821 上传时间:2022-11-16 格式:PPT 页数:57 大小:309KB
返回 下载 相关 举报
C语言程序设计ppt课件 第7章.ppt_第1页
第1页 / 共57页
C语言程序设计ppt课件 第7章.ppt_第2页
第2页 / 共57页
C语言程序设计ppt课件 第7章.ppt_第3页
第3页 / 共57页
C语言程序设计ppt课件 第7章.ppt_第4页
第4页 / 共57页
C语言程序设计ppt课件 第7章.ppt_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《C语言程序设计ppt课件 第7章.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计ppt课件 第7章.ppt(57页珍藏版)》请在三一办公上搜索。

1、2022/11/16,华中科技大学计算机学院,1,C语言程序设计,The C Programming Language,华中科技大学计算机学院曹计昌,2022/11/16,华中科技大学计算机学院,2,C语言程序设计,第7章 标准库及用户自定义库 接口的概念、与头文件的关系()C标准库的使用,以及图形库函数的应用和动画的设计方法 自定义库的创建,2022/11/16,华中科技大学计算机学院,3,7.3 C图形库及其基本的图形操作,基本输出函数printf 将信息以数字和字符串方式输出在显示屏上用户希望结果更形象、更生动、更逼真例如,windows操作系统取代Dos操作系统C编译系统 为了方便用户

2、设计图形程序 提供了画图函数库(graphics.h ),2022/11/16,华中科技大学计算机学院,4,7.3.1 图形显示的窗口和坐标,图形的窗口 可由用户定义它的位置和大小,大可到整个屏幕,小可到几个字符 屏幕上常常可同时有几个活动窗口 所有图形输出都是与当前窗口有关系,超出边界部分将被裁剪掉,2022/11/16,华中科技大学计算机学院,5,7.3.1 图形显示的窗口和坐标,图形的坐标 显示器的整个屏幕就像一张坐标纸图形上任一点位置用坐标值(x, y)来表示坐标值 (x, y)以像素为单位绝对坐标指相对于屏幕原点的坐标A和B的绝对坐标分别为(20,20)和(420,130)如定义一个

3、以A为左上角、B为右下角的图形窗口则用相对坐标表示,A为相对坐标原点,B的相对坐标是(400,110),2022/11/16,华中科技大学计算机学院,6,7.3.2 图形模式的初始化,原因微机系统默认屏幕为文本模式(80列,25行字符模式)此时所有图形函数均不能工作 方法void initgraph( int far *gdriver, int far *gmode, char far *path) gdriver所指的图形驱动软件装入到内存 参数gmode是图形函数用来确定显示模式的整型指针,2022/11/16,华中科技大学计算机学院,7,7.3.2 图形模式的初始化,初始化前的问题不知道

4、所用的图形显示器适配器类型,因为图形显示器适配器种类很多需要将编写的程序用于不同图形驱动器 解决方法初始化前用Turbo C的自动检测显示器硬件函数void far detectgraph(int far *gdriver, int far *gmode) 完成对适配器的检查,得到显示器类型号和相应的最高分辨率模式,2022/11/16,华中科技大学计算机学院,8,图形模式初始化例子,#include void main(void) int gdriver,gmode; detectgraph( /* 根据测试结果初始化图形模式 */,#includevoid main(void) int g

5、driver = DETECT; int gmode; initgraph( ,将driver设置为DETECT,它会自动检测所用显示器的类型,装入相应的图形驱动软件,并选用最高分辨率的显示模式,改进,2022/11/16,华中科技大学计算机学院,9,图形模式初始化的关闭,void far closegraph(void);用于关闭图形系统,回到文本方式(Turbo C 默认方式) 并释放用于保存图形驱动程序和字体的系统内存。void far restorecrtmode(void);用于返回到文本方式,但不关闭图形系统即图形函数所占用的内存不被释放和setgraphmode交互使用,在图形和

6、文本之间来回切换。,2022/11/16,华中科技大学计算机学院,10,例7.1 一个能独立运行的简单C图形程序,#include#includevoid main(void) int gdriver=DETECT,gmode; int i, xradius=130,yradius=130; initgraph( /* 关闭图形系统 */,2022/11/16,华中科技大学计算机学院,11,7.3.3 基本图形函数,画点函数 void putpixel(int x, int y, int color);用color颜色在(x,y)位置画一点 坐标位置函数int getmaxx(void); i

7、nt getmaxy(void); 分别得到x轴、 y轴的最大int getx(void); int gety(void); 分别得到当前画笔的x坐标、y坐标。void moveto(int x,int y);把画笔从当前位置移到点(x,y),移动过程不画。void moverel(int dx,int dy)把画笔从当前位置(x0,y0)移动到点(x0+dx,y0+dy),2022/11/16,华中科技大学计算机学院,12,补充: 点, 线,面的画法,点: 屏幕上(x,y)坐标处的像素(pixel)画点: 指在指定(x,y)坐标处输出一个像素.画点函数(像素输出函数) putpixel原型:

8、 void far _Cdecl putpixel(int x, int y, int color);功能: 指在指定(x,y)坐标处画一个color颜色的点.调用: putpixel(x,y,YELLOW);,2022/11/16,华中科技大学计算机学院,13,#include graphics.h#include math.h#include dos.hvoid main(void)int x=150,y=250,step, num,i,gdriver,gmode;printf(input step and number please!n);scanf(%d%d,例1. 按照输入点之间的间

9、隔和点的数目画点.,for(i=0;inum;i+) putpixel(x,y,RED); x+=step; getch(); y+=2; x=150; for(i=0;inum;i+) putpixel(x,y,RED); x+=step; getch(); closegraph();,2022/11/16,华中科技大学计算机学院,14,#include graphics.h#include math.h#include dos.hvoid main(void) int x0,y0,x1,y1,x,y, gdriver,gmode; float k; printf(input x0,y0,

10、x1,y1,please!n);scanf(%d%d%d%d,例2. 按照输入的起点,终点画线.,initgraph(,2022/11/16,华中科技大学计算机学院,15,画线函数(ppt15-ppt29自学),void line(int x1,int y1,int x2,int y2);从点(x1,y1)到(x2, y2)之间画一直线void far lineto(int x,int y);从画笔当前位置到点(x,y)之间画一直线void far linerel(int dx,int dy);函数linerel从画笔当前位置(x,y)到其相对位置(x+dx,y+dy)之间画一直线,2022/

11、11/16,华中科技大学计算机学院,16,画圆、圆弧和椭圆函数,void far circle(int x,int y,int radius)画一个以(x,y)为圆心,radius为半径的圆void arc(int x,int y,int stangle,int endangle,radius)画一个以点(x,y)为圆心,radius为半径起始角为stangle,终止角为endangle的圆弧ellipse(int x,int y,int stangle,int endangle, int xradius, yradius )画一个以点(x,y)为中心,stangle为起始角,endangle

12、为终止角,xradius为x轴半径,yradius为y轴半径的椭圆角度以度为单位,屏幕的水平方向为0度,逆时钟方向为正,2022/11/16,华中科技大学计算机学院,17,画矩形函数,void rectangle(int x1,int y1,int x2,int y2);画一个矩形其左上角坐标是(x1,y1)右下角坐标是(x2,y2),2022/11/16,华中科技大学计算机学院,18,7.3.4 颜色及线型的设置,设置背景色和前景色void setbkcolor(int color);color值必须是表7.1所列setcolor(4); /*等价于setcolor(RED);*/,void

13、 setcolor(int color);对EGA、VEA显示器,只有一个调色板(表7.1) 对CGA显示器,有4个调色板调色板号x通过设置图形初始化中参数mode为CGACx如mode为CGAC1,setcolor(2) 为洋红色,2022/11/16,华中科技大学计算机学院,19,有关调色板的函数,void setpalette(int index, int color) 将调色板寄存器index中寄存的颜色设置为color色 对EGA / VGA显示器有效对CGA无效因为它的4个调色板的颜色值是固定不变的index只能取015,而color(6位bit)可取063,2022/11/16,

14、华中科技大学计算机学院,20,调色板的例子,setcolor(4); /*缺省值红色 */circle(100,100,50);getch();setpalette(4,EGA_YELLOW); /*等价于setpalette(4, 62);*/,调色板寄存器所装的颜色一旦改变,之前用setcolor (寄存器号)设置的图形颜色也随之改变 此例调用setpalette(4,EGA_YELLOW)将4号调色板寄存器中的颜色改变为黄色圆的颜色也立即改变为黄色,2022/11/16,华中科技大学计算机学院,21,有关调色板的函数,void setallpalette(struct palettety

15、pe far *palette);来设置EGA/VEA调色板上的16种颜色结构palettetype在头文件graphics.h中定义为:struct palettetype unsigned char size; signed char colors16;;,2022/11/16,华中科技大学计算机学院,22,画线的线型函数,线型参数linestyle取值如表7.4所示,缺省值是实线线宽参数thickNORM_WIDTH(1)表示一个像素宽 (缺省值)THICK_WIDTH(3)表示三个像素宽参数upattern只有在参数linestyle取4或USERBIT_LINE(用户自定义线型)时,

16、 才有意义,setlinestyle( int linestyle,unsigned upattern, int thick);,2022/11/16,华中科技大学计算机学院,23,7.3.5 封闭图形的填充,填充前模式和颜色的设置调用函数setfillstyleTurbo C 提供两种方法 调用函数floodfill实现任意封闭图形的填充一些特定画图函数会产生封闭轮廓图的自动填充,2022/11/16,华中科技大学计算机学院,24,填充模式和颜色的设置,void setfillstyle(int pattern,int color);参数color是调色板寄存器号参数pattern如下表值为

17、USER_FILL(用户自定义填充模式)时,需调用函数setfillpattern,2022/11/16,华中科技大学计算机学院,25,用户自定义填充方式,void setfillpattern(char * upattern, int color);参数color用颜色填充后面的轮廓图和指定区域参数upattern指针指向一个88像素点阵组成的填充图模(占8个字节存储区)每个字节代表一行,每个bit位对应列上的像素1则该像素用color显示,0则不显示例 :char upattern=0 x8a,0 x8a,0 x41, 0 x3,0 x8a, 0 x8a,0 x41,0 x3;,2022/

18、11/16,华中科技大学计算机学院,26,填充任意封闭图形的函数,void floodfill(int x,int y,int bordercolor);参数x和y为封闭图形内任意一点的坐标参数bordercolor是封闭图形边框的颜色 注意所要填充的图形必须是完全封闭的点(x,y)要在封闭图形之内bordercolor的值必须与封闭图形边线的颜色一致,2022/11/16,华中科技大学计算机学院,27,填充例子,先用红色画一个圆,然后用黄色按如图7.3的图案填充该圆。char upattern=0 x8a,0 x8a,0 x41,0 x3, 0 x8a,0 x8a, 0 x41, 0 x3;

19、setcolor(RED); /* 设置前景色为红色 */setfillpattern(upattern,YELLOW); /* 自定义填充模式 */circle( 100,100,100); /* 画圆 */floodfill(50,60,RED); /* 填充圆 */,2022/11/16,华中科技大学计算机学院,28,画封闭轮廓图的函数,特点首先画出一个的封闭轮廓图然后用设定的或缺省的模式和颜色进行填充 例void bar(int x1,int y1,int x2,int y2);画一个已填充的条形图,没有边框 void pieslice(int x,int y,int stangle,

20、int endangle,int radius);画一个已填充的扇形 void fillellipse(int x,int y,int xradius,int yradius);画一个已填充椭圆,2022/11/16,华中科技大学计算机学院,29,7.3.6 图形方式下的字符输出,rintf 的不足无法选择字符的大小、字型、方向和颜色输出指定位置的字符串void outtext(char *str);在当前位置上输出由str所指的字符串void outtextxy(int x,int y,char *str);在窗口中(x,y)位置输出字符串不足只能输出字符串,不能直接输出变量的值,2022/

21、11/16,华中科技大学计算机学院,30,格式化输出函数,int sprintf(char *s,char *format,);功能把省略号部分的各种类型的数据按格式字符串format指定的格式,转换成字符串输出到指针s指向的字符数组中 注意: 课程设计的菜单设计中要用到!例char s20;int x=10,y=20;sprintf(s, x=%d,y=%d,x,y);outtext(s); /* 显示:x=10,y=20 */,2022/11/16,华中科技大学计算机学院,31,定义字符字型、大小和方向的函数(略),void settextstyle(int font,int direct

22、ion,int charsize);参数font确定所用的字型参数direction决定字符显示的方向,从左到右水平输出(0或HORIZ_DIR)或从底向上垂直输出(1或VERT_DIR) 参数charsize增加字符大小的倍数,其值为0到10,2022/11/16,华中科技大学计算机学院,32,例7.2 多变的圆环(略讲),一个综合应用画图、设置颜色、填充和字符输出的实例显示多个静态的同心圆和通过圆心的一组线段按任意键后,图形出现不同的变化还介绍了利用直线函数制作绕固定点旋转图形的方法中心点用(x0, y0)表示其它点根据绕该点旋转多少角度,使用三角函数sin和cos动态决定,这两个函数的度

23、数都要为弧度,2022/11/16,华中科技大学计算机学院,33,例7.2 多变的圆环(略讲),# include# include# include# define PAI 3# define B 0.809void main(void) int i,x0,y0,x,y,driver,mode ; float a ; driver=CGA; mode=CGAC0; /* 指定图形显示方式 */ initgraph( /* 初始化图形系统 */,2022/11/16,华中科技大学计算机学院,34,例7.2 多变的圆环(略讲),setcolor(3); /* 设置前景色为黄色 */ setbkc

24、olor(GREEN); /* 设置背景色为绿色 */ x0=150;y0=100; circle(x0,y0,10); /* 画三个黄色的同心圆 */ circle(x0,y0,20); circle(x0,y0,50); for(i=0;i16;i+) /* 通过圆心绘制16条红色的直线 */ a=(2*PAI/16)*i; x=ceil(x0+48*cos(a); /*ceil(x)返回不小于x的最小整数*/ y=ceil(y0+48*sin(a)*B); /* ceil(1.2)=2; ceil(-1.2)=-1 */ setcolor(2); line(x0,y0,x,y); ,20

25、22/11/16,华中科技大学计算机学院,35,例7.2 多变的圆环(略讲),setcolor(3);circle(x0,y0,60); settextstyle(SMALL_FONT,HORIZ_DIR,1); /* 定义字体、大小和方向 */ outtextxy(120,170, press a key); /* 输出字符串 */ getch(); setfillstyle(HATCH_FILL,YELLOW); /* 设置填充模式 */ floodfill(202,100,3); /* 用黄色网格线填充指定区域 */ getch();,2022/11/16,华中科技大学计算机学院,36,

26、例7.2 多变的圆环(略讲),setcolor(2); /* 设置前景色为红色 */for(k=0.0;k=2*3.1415;k+=0.1) /* 直线绕圆心旋转 */x=ceil(x0+60*cos(k);y=ceil(y0+60*sin(k); line(x0,y0,x,y); delay(1000); getch(); closegraph();,2022/11/16,华中科技大学计算机学院,37,7.3.7 图形屏幕操作函数,清屏函数void far cleardevice(void);用于清除整个屏幕void far clearviewport(void); 如果已用函数setvie

27、wport定义了一个图形窗口可调用它清除图形窗口内的内容存取位图像函数 1)unsigned imagesize(int x1,int y1,int x2, int y2);返回左上角为(x1,y1)、右上角为(x2,y2)的矩形区内的全部内容所占的内存字节数,2022/11/16,华中科技大学计算机学院,38,存取位图像函数,2)void getimage(int x1,int y1,int x2,int y2,void far *mapbuf);把左上角为(x1,y1)、右上角为(x2,y2)矩形区内的图像保存到mapbuf所指的内存中去。3)void putimage(int x,int

28、 y,void *mapbuf,int op);将以前用getimage保存的图像重新送回屏幕显示,参数op 一个组合算子将图像与原屏幕图像 进行op操作注意:这两个函数在制作图形菜单时非常有用!,2022/11/16,华中科技大学计算机学院,39,设置图形页的函数(略),图形页 指可存放显示在整个屏幕上信息的RAMTurbo C最多支持4页,VGA有2个图形页,EGA有4个图形页 用户可以使用由硬件支持的任何一个图形页,并可根据需要作页之间的开关切换 活动页 正在由用户编辑图形的页 可视页 显示在屏幕上的页活动页不一定是可视页,即若用户不设定该页为当前显示页时,在该页上编辑的图形将不会在屏上

29、显示出来。缺省时,0页既活动页又是可视页。,2022/11/16,华中科技大学计算机学院,40,设置图形页的函数(略),void setactivepage(int pagenum);设置pagenum为活动页该句后面的所有画图操作都在该页进行 void setvisualpage(int pagenum);设置pagenum为可视页有了多个图形页,就可以将图形输出到一个不可视的屏幕页可以理解为先在屏幕的后台工作,然后,通过调用setvisualpage改变可视页来快速显示后台屏幕图像,从而产生动画,2022/11/16,华中科技大学计算机学院,41,建立图形视口的函数(略),视口在图形方式下

30、屏幕的某一区域即窗口的别名 void setviewport(int x1,int y1,int x2,int y2,int clipflag);clipflag为非0,则超出视口的图形会被自动剪裁掉不显示clipflag为0,则超出视口的图形仍将显示注意在屏幕上可设置不同的视口,甚至部分可以重叠最近设置的视口是当前视口图形坐标也是相对于当前视口的,2022/11/16,华中科技大学计算机学院,42,7.4 创建自己的库,库与目标文件区别目标文件中的函数,无论他们是否真正被程序所用,都成为可执行程序的一部分 库文件与其它文件连接时,可执行程序中只包含那些真正由程序所用的库函数建立库的基本方法以

31、随机数为主题建立一个随机数库(即random库),2022/11/16,华中科技大学计算机学院,43,7.4.1 random库的设计,伪随机数计算机无法产生真正的随机数计算机总是按照某种顺序执行指令 依靠计算机内部算法产生的“随机”数从统计的观点来看是随机的并且复杂到没有哪个用户能够轻松地预测到它 函数int rand(void) 是接口stdlib.h的一部分返回值是一个非负且不大于常量RAND_MAX的整数 RAND_MAX的值取决于计算机系统在典型的Macintosh机环境里,RAND_MAX是32,767在一个典型的Unix工作站上,它是2,147,483,647,2022/11/1

32、6,华中科技大学计算机学院,44,改变随机数的范围,问题rand库函数不能给出精确的数值范围来适应特定要求例如掷骰子产生一个1-6间的随机数 解决方法设计一个函数int RandomInteger (int low, int high);模拟掷骰子,可以调用RandomInteger (1, 6) 模拟抽牌,可以调用RandomInteger (1, 52) 引发新问题怎样实现这个函数呢?如何把这个通用的函数加入到随机数库中?,2022/11/16,华中科技大学计算机学院,45,RandomInteger函数的实现,rand库函数产生的值限制为一个浮点数d,范围是0d1。用乘法将d的值按照需要

33、的范围扩大若干倍。将上述值的小数部分截去,那么产生以0为最小边界的随机整数。修改数值的范围使得从需要的最小值开始。,int RandomInteger(int low,int high) int k; double d;d=(double)rand()/(double) RAND_MAX+1); k = (int)(d*(high-low+ 1); return(low+k);,2022/11/16,华中科技大学计算机学院,46,初始化随机数发生器,线性同余法产生随机序列a0,a1,anb、c和m的选取是随机性理论研究的内容d称为随机序列的种子。由系统时间自动产生一个初始种子因为时间始终在改变

34、随机序列也将随之而全部改变,2022/11/16,华中科技大学计算机学院,47,初始化随机数发生器,代码语句srand(time(NULL);对这语句,用户得去理解随机数种子的概念、time函数,和神秘常数NULL的意义简化:引入Randomize void Randomize(void) srand(time(NULL); 使用起来非常简单,可以把它加入随机数库中 建库前要创建一个接口(例:random.h )然后在另外一个文件里给予实现 (例:random.c ),2022/11/16,华中科技大学计算机学院,48,7.4.2 random库的接口,也就是random.h文件 内容函数原型

35、要给用户提供他们能够使用的所有函数的原型常数定义一般采用#define定义,比如RAND_MAX这样的常量类型定义经常定义一些新的类型给用户使用这一点在现代编程技术里十分重要 任何实际内容出现以前,必须的3行语句#ifndef _name_h#define _name_h其中,name是接口的名字。其次接口的最后一行必须为:在最后需加上#endif为什么需要这3行?,2022/11/16,华中科技大学计算机学院,49,7.4.2 random库的接口,程序如何读接口当一个复杂程序多次包含(include)一个接口时,编译器并不会每次读一遍接口它一旦发现_name_h已经定义了,#ifndef

36、_name_h就帮助编译器跳过直到#endif的所有文本当需要在接口中再嵌入其它头文件时,加上# include行,2022/11/16,华中科技大学计算机学院,50,random.h文件的内容,/* * 文件: random.h * - * 产生伪随机数的程序库. */#ifndef _random_h#define _random_h/* * 函数: Randomize * 用法: Randomize(); * - * 该函数设置随机数的种子,使得随即序列不可预知。 * 在程序调试期间,为了使程序的行为可重复,最好不要调用该函数。 */,void Randomize(void);/* *

37、函数: RandomInteger * 用法: n = RandomInt eger(low, high); * 该函数返回一个在low和high之间的随机整数. */int RandomInteger(int low, int high);#endif,2022/11/16,华中科技大学计算机学院,51,7.4.3 random库的实现,也就是random.c文件 内容注释,说明它是接口的引用然后列出需要的#include文件每一个实现都要包含自己的头文件以便编译器对照检查函数原型和函数实现 再接下来是函数的实现,2022/11/16,华中科技大学计算机学院,52,random.c文件,/*

38、 文件:random.c实现the random.h接口*/#include #include#include#includerandom.h/* * 函数:Randomize * 该函数将随机数的种子设置为当前时间。 * 函数srand由stdlib.h库提供,它需要一个整型参数。 * 时间函数由time.h库提供。 */,void Randomize(void) srand(int)time(NULL); /*下个函数的注释(略)*/int RandomInteger(int low,int high) int k; double d;d=(double)rand()/(double) R

39、AND_MAX+1); k=(int)(d*(high-low+1); return(low+k);,2022/11/16,华中科技大学计算机学院,53,7.4.4怎么样把自己编写的函数库建立起来,TLIB库名用扩展名.LIB,模块名用扩展名.OBJ(包含多个函数)可对库中模块进行添加、消去 ,还可抽取.OBJ文件 不能够从模块中抽取函数,只可操作整个模块 TLIB命令行格式 TLIB library_name opmodule_name1 opmodule_name2 op.library_name是库名,它指定要修改的库module_name是模块名,指明要被操作的模块名字op是一个操作符

40、,它指明TLIB的操作建立一个库只要给出一个不存在的库名,再增加一个模块到库中 例如,TLIB MYLIB +Module1,2022/11/16,华中科技大学计算机学院,54,random库的建立,把random.c编译成.obj文件 在集成环境下,选择compile to .obj 在命令行方式,tcc c -Iinclude -Imyfile myfilerandom 用tlib产生random.lib库 在命令行方式下,tlib random +random连接random.lib库(在命令行方式下) tcc -Iinclude Imyfile Llib myfiletest rand

41、om.lib test.c被编译并与random.lib相连接,生成test.exe文件标准库文件会自动被连入,不必给出这些库名,其中Llib指定系统库目录为lib子目录,2022/11/16,华中科技大学计算机学院,55,random库的建立,连接random.lib库(在集成环境下 )必须建立一个包含所有目标模块的表以及程序所需要的库工程(project)文件工程文件(.prj文件)要包含这一行:test random.lib,2022/11/16,华中科技大学计算机学院,56,查看库中有什么函数,tlib library_name,output_file.lstlibrary_name为库名output_file.lst指定了输出文件,该文件包含模块大小和库中函数本例tlib random,output.lst type output.lst产生一个称为output.lst且包含如下信息的文件publics by moduleRANDOM size=96 _RandomInteger _Randomize,2022/11/16,华中科技大学计算机学院,57,本章习题,7.9,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号