《C语言程序设计ppt课件-第7章.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计ppt课件-第7章.ppt(57页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、2022-8-8华中科技大学计算机学院1C C语言程序设计语言程序设计The C Programming Language华中科技大学计算机学院华中科技大学计算机学院曹计昌曹计昌2022-8-8华中科技大学计算机学院2C语言程序设计第7章 标准库及用户自定义库 n接口的概念、与头文件的关系()nC标准库的使用,以及图形库函数的应用和动画的设计方法 n自定义库的创建2022-8-8华中科技大学计算机学院37.3 C7.3 C图形库及其基本的图形操作图形库及其基本的图形操作 n基本输出函数基本输出函数printf n将信息以数字和字符串方式输出在显示屏上将信息以数字和字符串方式输出在显示屏上n用户
2、用户n希望结果更形象、更生动、更逼真希望结果更形象、更生动、更逼真n例如,例如,windows操作系统取代操作系统取代Dos操作系统操作系统nC编译系统编译系统 n为了方便用户设计图形程序为了方便用户设计图形程序 n提供了画图函数库提供了画图函数库(graphics.h ) 2022-8-8华中科技大学计算机学院47.3.1 7.3.1 图形显示的窗口和坐标图形显示的窗口和坐标n图形的窗口图形的窗口 n可由用户定义它的位置和大小,大可到整个可由用户定义它的位置和大小,大可到整个屏幕,小可到几个字符屏幕,小可到几个字符 n屏幕上常常可同时有几个活动窗口屏幕上常常可同时有几个活动窗口 n所有图形输
3、出都是与当前窗口有关系,超出所有图形输出都是与当前窗口有关系,超出边界部分将被裁剪掉边界部分将被裁剪掉 2022-8-8华中科技大学计算机学院57.3.1 7.3.1 图形显示的窗口和坐标图形显示的窗口和坐标n图形的坐标图形的坐标 n显示器的整个屏幕就像一张坐标纸显示器的整个屏幕就像一张坐标纸n图形上任一点位置用坐标值图形上任一点位置用坐标值(x, y)来表示来表示n坐标值坐标值 n(x, y)以像素为单位以像素为单位n绝对坐标绝对坐标指相对于屏幕原点的坐标指相对于屏幕原点的坐标nA和和B的绝对坐标分别为(的绝对坐标分别为(20,20)和()和(420,130)n如定义一个以如定义一个以A为左
4、上角、为左上角、B为右下角的图形窗口为右下角的图形窗口n则用则用相对坐标相对坐标表示,表示,A为相对坐标原点,为相对坐标原点,B的相对坐的相对坐标是(标是(400,110)ABxy (0,0) 2022-8-8华中科技大学计算机学院67.3.2 7.3.2 图形模式的初始化图形模式的初始化n原因原因n微机系统默认屏幕为文本模式(微机系统默认屏幕为文本模式(80列,列,25行字符行字符模式)模式)n此时所有图形函数均不能工作此时所有图形函数均不能工作 n方法方法nvoid initgraph( int far *gdriver, int far *gmode, char far *path) n
5、gdriver所指的图形驱动软件装入到内存所指的图形驱动软件装入到内存 n参数参数gmode是图形函数用来确定显示模式的整型是图形函数用来确定显示模式的整型指针指针2022-8-8华中科技大学计算机学院77.3.2 7.3.2 图形模式的初始化图形模式的初始化n初始化前的问题初始化前的问题n不知道所用的图形显示器适配器类型,因为图形显示不知道所用的图形显示器适配器类型,因为图形显示器适配器种类很多器适配器种类很多n需要将编写的程序用于不同图形驱动器需要将编写的程序用于不同图形驱动器 n解决方法解决方法n初始化前用初始化前用Turbo C的自动检测显示器硬件函数的自动检测显示器硬件函数nvoid
6、 far detectgraph(int far *gdriver, int far *gmode) n完成对适配器的检查,完成对适配器的检查,n得到显示器类型号和相应的最高分辨率模式得到显示器类型号和相应的最高分辨率模式 2022-8-8华中科技大学计算机学院8图形模式初始化例子图形模式初始化例子1.#include 2.void main(void)3.4. int gdriver,gmode;5. detectgraph(&gdriver,&gmode); /* 自动测试硬件自动测试硬件 */6. initgraph(&gdriver,&gmode,bgi); /* 根据测试结根据测试结
7、果初始化图形模式果初始化图形模式 */7.8.#includevoid main(void) int gdriver = DETECT; int gmode; initgraph(&gdriver,&gmode, d:tcbgi); 将将driver设置为设置为DETECT,它会自动检测,它会自动检测所用显示器的类型,装入相应的图形驱所用显示器的类型,装入相应的图形驱动软件,并选用最高分辨率的显示模式动软件,并选用最高分辨率的显示模式 改进改进2022-8-8华中科技大学计算机学院9图形模式初始化的关闭图形模式初始化的关闭nvoid far closegraph(void);n用于关闭图形系统
8、,回到文本方式用于关闭图形系统,回到文本方式(Turbo C 默认方默认方式式) n并释放用于保存图形驱动程序和字体的系统内存。并释放用于保存图形驱动程序和字体的系统内存。nvoid far restorecrtmode(void);n用于返回到文本方式,但不关闭图形系统用于返回到文本方式,但不关闭图形系统n即图形函数所占用的内存不被释放即图形函数所占用的内存不被释放n和和setgraphmode交互使用,在图形和文本之间来回交互使用,在图形和文本之间来回切换。切换。 2022-8-8华中科技大学计算机学院10例例7.1 7.1 一个能独立运行的简单一个能独立运行的简单C C图形程序图形程序
9、1.#include2.#include3.void main(void)4. int gdriver=DETECT,gmode;5. int i, xradius=130,yradius=130;6. initgraph( &gdriver,&gmode, “c:tc20bgi”); /* 初始初始化图形模式化图形模式 注意注意: bgi不一定需要不一定需要! */7. for(i=0;i20;i+) /* 绘制绘制20个椭圆个椭圆, */8. ellipse(320,240,0,360,xradius,yradius);9. xradius-=5; yradius+=5;10. getch
10、(); /* 按任意键结束按任意键结束 */11. closegraph(); /* 关闭图形系统关闭图形系统 */2022-8-8华中科技大学计算机学院117.3.3 7.3.3 基本图形函数基本图形函数n画点函数画点函数 nvoid putpixel(int x, int y, int color);n用用color颜色在(颜色在(x,y)位置画一点)位置画一点 n坐标位置函数坐标位置函数nint getmaxx(void); int getmaxy(void); n分别得到分别得到x轴、轴、 y轴的最大轴的最大nint getx(void); int gety(void); n分别得到当
11、前画笔的分别得到当前画笔的x坐标、坐标、y坐标。坐标。nvoid moveto(int x,int y);n把画笔从当前位置移到点(把画笔从当前位置移到点(x,y),移动过程不画。),移动过程不画。nvoid moverel(int dx,int dy)n把画笔从当前位置(把画笔从当前位置(x0,y0)移动到点)移动到点(x0+dx,y0+dy) 2022-8-8华中科技大学计算机学院12补充补充: : 点点, , 线线, ,面的画法面的画法n点点: 屏幕上屏幕上(x,y)坐标处的像素坐标处的像素(pixel)n画点画点: 指在指定指在指定(x,y)坐标处输出一个像素坐标处输出一个像素.n画点
12、函数画点函数(像素输出函数像素输出函数) putpixel原型原型: void far _Cdecl putpixel(int x, int y, int color);功能功能: 指在指定指在指定(x,y)坐标处画一个坐标处画一个color颜色颜色的点的点.调用调用: putpixel(x,y,YELLOW);2022-8-8华中科技大学计算机学院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
13、 and number please!n);scanf(%d%d,&step,&num); gdriver=DETECT; initgraph(&gdriver,&gmode, c:tc20); setcolor(3); setbkcolor(GREEN); 例例1. 1. 按照输入点之间的间隔和点的数目画点按照输入点之间的间隔和点的数目画点. . 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(); clo
14、segraph();2022-8-8华中科技大学计算机学院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, x1,y1,please!n);scanf(%d%d%d%d,&x0,&y0,&x1,&y1); k=1.0*(y1-y0)/(x1-x0); gdriver=DETECT; 例例2. 2. 按照输入的起点按照输入的起点, ,终点画线终点画线. .initgraph(&gdriv
15、er,&gmode, c:tc20); setcolor(3); setbkcolor(GREEN); for(x=x0;xx1;x+) y=y0+k*x; putpixel(x,y,RED); getch(); closegraph();思考思考:将画线程序改为函数将画线程序改为函数:void myline(int int int int);2022-8-8华中科技大学计算机学院15画线函数画线函数(ppt15-ppt29(ppt15-ppt29自学自学) )nvoid line(int x1,int y1,int x2,int y2);n从点(从点(x1,y1)到)到(x2, y2)之间画
16、一直线之间画一直线nvoid far lineto(int x,int y);n从画笔当前位置到点从画笔当前位置到点(x,y)之间画一直线之间画一直线nvoid far linerel(int dx,int dy);n函数函数linerel从画笔当前位置从画笔当前位置(x,y)到其相对位置到其相对位置(x+dx,y+dy)之间画一直线之间画一直线 2022-8-8华中科技大学计算机学院16画圆、圆弧和椭圆函数画圆、圆弧和椭圆函数nvoid far circle(int x,int y,int radius)n画一个以画一个以(x,y)为圆心,为圆心,radius为半径的圆为半径的圆nvoid
17、arc(int x,int y,int stangle,int endangle,radius)n画一个以点画一个以点(x,y)为圆心,为圆心,radius为半径为半径n起始角为起始角为stangle,终止角为,终止角为endangle的圆弧的圆弧nellipse(int x,int y,int stangle,int endangle, int xradius, yradius )n画一个以点画一个以点(x,y)为中心,为中心,stangle为起始角,为起始角,endangle为终止角,为终止角,xradius为为x轴半径,轴半径,yradius为为y轴半径的椭圆轴半径的椭圆n角度以度为单位
18、,屏幕的水平方向为角度以度为单位,屏幕的水平方向为0度,逆时钟方向为正度,逆时钟方向为正2022-8-8华中科技大学计算机学院17画矩形函数画矩形函数 nvoid rectangle(int x1,int y1,int x2,int y2);n画一个矩形画一个矩形n其左上角坐标是其左上角坐标是(x1,y1)n右下角坐标是右下角坐标是(x2,y2) 2022-8-8华中科技大学计算机学院187.3.4 7.3.4 颜色及线型的设置颜色及线型的设置n设置背景色和前景色设置背景色和前景色nvoid setbkcolor(int color);ncolor值必须是表值必须是表7.1所列所列nsetco
19、lor(4);); /*等价于等价于setcolor(RED););*/调色板颜色值01230123背景色背景色背景色背景色绿青浅绿浅青红洋红浅红浅洋红黄白黄白nvoid setcolor(int color);n对对EGA、VEA显示器,只有一个调色显示器,只有一个调色板板(表表7.1) n对对CGA显示器,有显示器,有4个调色板个调色板n调色板号调色板号x通过设置图形初始化中参通过设置图形初始化中参数数mode为为CGACxn如如mode为为CGAC1,setcolor(2) 为为洋红色洋红色 2022-8-8华中科技大学计算机学院19有关调色板的函数有关调色板的函数 nvoid setp
20、alette(int index, int color) n将调色板寄存器将调色板寄存器index中寄存的颜色设置为中寄存的颜色设置为color色色 n对对EGA / VGA显示器有效显示器有效n对对CGA无效无效n因为它的因为它的4个调色板的颜色值是固定不变的个调色板的颜色值是固定不变的nindex只能取只能取015,而,而color(6位位bit)可取可取063 2022-8-8华中科技大学计算机学院20调色板的例子调色板的例子1.setcolor(4); /*缺省值红色缺省值红色 */2.circle(100,100,50);3.getch();4.setpalette(4,EGA_YE
21、LLOW); /*等价于等价于setpalette(4, 62);*/ n调色板寄存器所装的颜色一旦改变,之前用调色板寄存器所装的颜色一旦改变,之前用setcolor (寄寄存器号存器号)设置的图形颜色也随之改变设置的图形颜色也随之改变 n此例调用此例调用setpalette(4,EGA_YELLOW)将将4号调色板寄号调色板寄存器中的颜色改变为黄色存器中的颜色改变为黄色n圆的颜色也立即改变为黄色圆的颜色也立即改变为黄色2022-8-8华中科技大学计算机学院21有关调色板的函数有关调色板的函数nvoid setallpalette(struct palettetype far *palette
22、);n来设置来设置EGA/VEA调色板上的调色板上的16种颜色种颜色n结构结构palettetypen在头文件在头文件graphics.h中定义为:中定义为:nstruct palettetype n unsigned char size;n signed char colors16;n; 2022-8-8华中科技大学计算机学院22画线的线型函数画线的线型函数 符号名值 含义SOLID_LINEDOTTED_LINECENTER_LINEDASHED_LINEUSERBIT_LINE01234实线(缺省值)点线中心线虚线用户自定义线型n线型参数线型参数linestylen取值如表取值如表7.4
23、所示,缺省值是实线所示,缺省值是实线n线宽参数线宽参数thicknNORM_WIDTH(1)表示一个像素)表示一个像素宽宽 (缺省值缺省值)nTHICK_WIDTH(3)表示三个像素)表示三个像素宽宽n参数参数upatternn只有在参数只有在参数linestyle取取4或或USERBIT_LINE(用户自定义线型用户自定义线型)时时, 才有意义才有意义setlinestyle( int linestyle,unsigned upattern, int thick);2022-8-8华中科技大学计算机学院237.3.5 7.3.5 封闭图形的填充封闭图形的填充n填充前模式和颜色的设置填充前模式
24、和颜色的设置n调用函数调用函数setfillstylenTurbo C 提供两种方法提供两种方法 n调用函数调用函数floodfill实现任意封闭图形的填充实现任意封闭图形的填充n一些特定画图函数会产生封闭轮廓图的自动一些特定画图函数会产生封闭轮廓图的自动填充填充 2022-8-8华中科技大学计算机学院24填充模式和颜色的设置填充模式和颜色的设置nvoid setfillstyle(int pattern,int color);n参数参数color是调色板寄存器号是调色板寄存器号n参数参数pattern如下表如下表n值为值为USER_FILL(用户自定义填充模式用户自定义填充模式)时,需调用时
25、,需调用函数函数setfillpattern 符号常量值 含 义符号常量值 含 义EMPTY_FILLSOLID_FILLLINE_FILLLTSLASH_FILLSLASH_FILLBKSLASH_FILLLTBKSLASH_FILL0123456用背景色填充全部填充填水平线填左斜线填粗左斜线填粗右斜线填右斜线HATCH_FILLXHATCH_FILLINTTERLEAVE_FILLWIDE_DOT_FILLCLOSE_DOT_FILLUSER_FILL789101112填网格线填斜交叉线填间隔线填稀疏点填密集点用户定义2022-8-8华中科技大学计算机学院25用户自定义填充方式用户自定义填
26、充方式 void setfillpattern(char * upattern, int color);n参数参数colorn用颜色填充后面的轮廓图和指定区域用颜色填充后面的轮廓图和指定区域n参数参数upattern指针指针n指向一个指向一个8 8像素点阵组成的填充图模像素点阵组成的填充图模(占占8个字节存储个字节存储区区)n每个字节代表一行,每个每个字节代表一行,每个bit位对应列上的像素位对应列上的像素n1则该像素用则该像素用color显示,显示,0则不显示则不显示n例例 :char upattern=0 x8a,0 x8a,0 x41, 0 x3,0 x8a, 0 x8a,0 x41,0
27、 x3;2022-8-8华中科技大学计算机学院26填充任意封闭图形的函数填充任意封闭图形的函数 void floodfill(int x,int y,int bordercolor);n参数参数x和和yn为封闭图形内任意一点的坐标为封闭图形内任意一点的坐标n参数参数bordercolorn是封闭图形边框的颜色是封闭图形边框的颜色 n注意注意n所要填充的图形必须是完全封闭的所要填充的图形必须是完全封闭的n点(点(x,y)要在封闭图形之内)要在封闭图形之内nbordercolor的值必须与封闭图形边线的颜色一致的值必须与封闭图形边线的颜色一致 2022-8-8华中科技大学计算机学院27填充例子填充
28、例子n先用红色画一个圆,然后用黄色按如图先用红色画一个圆,然后用黄色按如图7.3的图的图案填充该圆。案填充该圆。1.char upattern=0 x8a,0 x8a,0 x41,0 x3, 0 x8a,0 x8a, 0 x41, 0 x3;2.setcolor(RED); /* 设置前景色为红色设置前景色为红色 */3.setfillpattern(upattern,YELLOW); /* 自定义填充自定义填充模式模式 */4.circle( 100,100,100); /* 画圆画圆 */5.floodfill(50,60,RED); /* 填充圆填充圆 */2022-8-8华中科技大学计
29、算机学院28画封闭轮廓图的函数画封闭轮廓图的函数 n特点特点n首先画出一个的封闭轮廓图首先画出一个的封闭轮廓图n然后用设定的或缺省的模式和颜色进行填充然后用设定的或缺省的模式和颜色进行填充n 例例nvoid bar(int x1,int y1,int x2,int y2);n画一个已填充的条形图,没有边框画一个已填充的条形图,没有边框 nvoid pieslice(int x,int y,int stangle,int endangle,int radius);n画一个已填充的扇形画一个已填充的扇形 nvoid fillellipse(int x,int y,int xradius,int y
30、radius);n画一个已填充椭圆画一个已填充椭圆 2022-8-8华中科技大学计算机学院297.3.6 7.3.6 图形方式下的字符输出图形方式下的字符输出nprintf 的不足的不足n无法选择字符的大小、字型、方向和颜色无法选择字符的大小、字型、方向和颜色n输出指定位置的字符串输出指定位置的字符串nvoid outtext(char *str);n在在当前位置当前位置上输出由上输出由str所指的字符串所指的字符串nvoid outtextxy(int x,int y,char *str);n在窗口中(在窗口中(x,y)位置输出字符串)位置输出字符串n不足不足n只能输出字符串,不能直接输出变
31、量的值只能输出字符串,不能直接输出变量的值 2022-8-8华中科技大学计算机学院30格式化输出函数格式化输出函数 int sprintf(char *s,char *format,);n功能功能把省略号部分的各种类型的数据按格式字符串把省略号部分的各种类型的数据按格式字符串format指定的格指定的格式,转换成字符串输出到指针式,转换成字符串输出到指针s指向的字符数组中指向的字符数组中 注意注意: 课程设计的菜单设计中要用到课程设计的菜单设计中要用到!n例例1.char s20;2.int x=10,y=20;3.sprintf(s, x=%d,y=%d,x,y);4.outtext(s);
32、 /* 显示显示:x=10,y=20 */2022-8-8华中科技大学计算机学院31定义字符字型、大小和方向的函数定义字符字型、大小和方向的函数( (略略) ) 符号名值 含 义DEFAULT_FONTTRIPLEX_FONTSMALL_FONTSANSSERIF_FONTGOTHIC_FONT0123488点阵字体三重矢量字体小号矢量字体无寸线矢量字体黑体矢量字体initgraph初始化后调入内存 以itrip.chr名存在硬盘以litt.chr名存在硬盘以sans.chr名存在硬盘以goth.chr名存在硬盘void settextstyle(int font,int direction,
33、int charsize);n参数参数fontn确定所用的字型确定所用的字型n参数参数directionn决定字符显示的方向,从左到右水平输出决定字符显示的方向,从左到右水平输出(0或或HORIZ_DIR)或或从底向上垂直输出从底向上垂直输出(1或或VERT_DIR) n参数参数charsizen增加字符大小的倍数,其值为增加字符大小的倍数,其值为0到到102022-8-8华中科技大学计算机学院32例例7.2 7.2 多变的圆环多变的圆环( (略讲略讲) ) n一个综合应用画图、设置颜色、填充和字符输出一个综合应用画图、设置颜色、填充和字符输出的实例的实例n显示多个静态的同心圆和通过圆心的一组
34、线段显示多个静态的同心圆和通过圆心的一组线段n按任意键后,图形出现不同的变化按任意键后,图形出现不同的变化n还介绍了利用直线函数制作绕固定点旋转图形的还介绍了利用直线函数制作绕固定点旋转图形的方法方法n中心点用(中心点用(x0, y0)表示)表示n其它点根据绕该点旋转多少角度,使用三角函数其它点根据绕该点旋转多少角度,使用三角函数sin和和cos动态决定,这两个函数的度数都要为弧度动态决定,这两个函数的度数都要为弧度2022-8-8华中科技大学计算机学院33例例7.2 7.2 多变的圆环多变的圆环( (略讲略讲) ) 1.# include2.# include3.# include4.# d
35、efine PAI 35.# define B 0.8096.void main(void)7.8. int i,x0,y0,x,y,driver,mode ;9. float a ;10. driver=CGA; mode=CGAC0; /* 指定图形显示方指定图形显示方式式 */11. initgraph(&driver,&mode, d:tcbgi); /* 初始化初始化图形系统图形系统 */ 2022-8-8华中科技大学计算机学院34例例7.2 7.2 多变的圆环多变的圆环( (略讲略讲) ) 12. setcolor(3); /* 设置前景色为黄色设置前景色为黄色 */13. set
36、bkcolor(GREEN); /* 设置背景色为绿色设置背景色为绿色 */14. x0=150;y0=100;15. circle(x0,y0,10); /* 画三个黄色的同心圆画三个黄色的同心圆 */16. circle(x0,y0,20);17. circle(x0,y0,50);18. 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
37、.2)=2; ceil(-1.2)=-1 */ setcolor(2); line(x0,y0,x,y); 2022-8-8华中科技大学计算机学院35例例7.2 7.2 多变的圆环多变的圆环( (略讲略讲) ) 19.setcolor(3);20.circle(x0,y0,60);21. settextstyle(SMALL_FONT,HORIZ_DIR,1); /* 定义字体、大小和方向定义字体、大小和方向 */22. outtextxy(120,170, press a key); /* 输出字符串输出字符串 */23. getch();24. setfillstyle(HATCH_FIL
38、L,YELLOW); /* 设置填充模式设置填充模式 */25. floodfill(202,100,3); /* 用黄色网格线填充指定区域用黄色网格线填充指定区域 */26. getch(); 2022-8-8华中科技大学计算机学院36例例7.2 7.2 多变的圆环多变的圆环( (略讲略讲) ) 27.setcolor(2); /* 设置前景色为红色设置前景色为红色 */28.for(k=0.0;k=2*3.1415;k+=0.1) /* 直线绕圆心旋直线绕圆心旋转转 */29.x=ceil(x0+60*cos(k);30.y=ceil(y0+60*sin(k);31. line(x0,y0
39、,x,y);32. delay(1000);33. 34.getch();35. closegraph();36.2022-8-8华中科技大学计算机学院377.3.7 7.3.7 图形屏幕操作函数图形屏幕操作函数n清屏函数清屏函数nvoid far cleardevice(void);n用于清除整个屏幕用于清除整个屏幕nvoid far clearviewport(void); n如果已用函数如果已用函数setviewport定义了一个图形窗口定义了一个图形窗口n可调用它清除图形窗口内的内容可调用它清除图形窗口内的内容n存取位图像函数存取位图像函数 n1)unsigned imagesize(
40、int x1,int y1,int x2, int y2);n返回左上角为返回左上角为(x1,y1)、右上角为、右上角为(x2,y2)的矩形区内的的矩形区内的全部内容所占的全部内容所占的内存字节数内存字节数 2022-8-8华中科技大学计算机学院38存取位图像函数存取位图像函数 n2)void getimage(int x1,int y1,int x2,int y2,void far *mapbuf);n把左上角为把左上角为(x1,y1)、右上角为、右上角为(x2,y2)矩形区内的图像矩形区内的图像n保存到保存到mapbuf所指的内存中所指的内存中去。去。n3)void putimage(in
41、t x,int y,void *mapbuf,int op);n将以前用将以前用getimage保存的图像保存的图像n重新送回屏幕显示重新送回屏幕显示符号名值 含义COPYPUTXORPUTORPUTANDPUTNOTPUT01234复制异或或与非n参数参数opn 一个组合算子一个组合算子n将图像与原屏幕图像将图像与原屏幕图像 进行进行op操作操作注意注意:这两个函数在制作图形菜单时非这两个函数在制作图形菜单时非常有用常有用!2022-8-8华中科技大学计算机学院39设置图形页的函数设置图形页的函数( (略略) ) n图形页图形页 n指可存放显示在整个屏幕上信息的指可存放显示在整个屏幕上信息的
42、RAMnTurbo C最多支持最多支持4页,页,VGA有有2个图形页,个图形页,EGA有有4个图形个图形页页 n用户可以使用由硬件支持的任何一个图形页,并可根据需要用户可以使用由硬件支持的任何一个图形页,并可根据需要作页之间的开关切换作页之间的开关切换 n活动页活动页 n正在由用户编辑图形的页正在由用户编辑图形的页 n可视页可视页 n显示在屏幕上的页显示在屏幕上的页n活动页不一定是可视页,即若用户不设定该页为当前显示页活动页不一定是可视页,即若用户不设定该页为当前显示页时,在该页上编辑的图形将不会在屏上显示出来。时,在该页上编辑的图形将不会在屏上显示出来。n缺省时,缺省时,0页既活动页又是可视
43、页。页既活动页又是可视页。 2022-8-8华中科技大学计算机学院40设置图形页的函数设置图形页的函数( (略略) ) nvoid setactivepage(int pagenum);n设置设置pagenum为活动页为活动页n该句后面的所有画图操作都在该页进行该句后面的所有画图操作都在该页进行n void setvisualpage(int pagenum);n设置设置pagenum为可视页为可视页n有了多个图形页,就可以将图形输出到一个不可视有了多个图形页,就可以将图形输出到一个不可视的屏幕页的屏幕页n可以理解为先在屏幕的后台工作,然后,通过调用可以理解为先在屏幕的后台工作,然后,通过调用
44、setvisualpage改变可视页来快速显示后台屏幕图改变可视页来快速显示后台屏幕图像,从而产生像,从而产生动画动画2022-8-8华中科技大学计算机学院41建立图形视口的函数建立图形视口的函数( (略略) ) n视口视口n在图形方式下屏幕的某一区域在图形方式下屏幕的某一区域n即窗口的别名即窗口的别名n void setviewport(int x1,int y1,int x2,int y2,int clipflag);nclipflag为非为非0,则超出视口的图形会被自动剪裁掉不显示,则超出视口的图形会被自动剪裁掉不显示nclipflag为为0,则超出视口的图形仍将显示,则超出视口的图形仍
45、将显示n注意注意n在屏幕上可设置不同的视口,甚至部分可以重叠在屏幕上可设置不同的视口,甚至部分可以重叠n最近设置的视口是当前视口最近设置的视口是当前视口n图形坐标也是相对于当前视口的图形坐标也是相对于当前视口的 2022-8-8华中科技大学计算机学院427.4 7.4 创建自己的库创建自己的库 n库与目标文件区别库与目标文件区别n目标文件目标文件中的函数,无论他们是否真正被程中的函数,无论他们是否真正被程序所用,都成为可执行程序的一部分序所用,都成为可执行程序的一部分 n库文件库文件与其它文件连接时,可执行程序中只与其它文件连接时,可执行程序中只包含那些真正由程序所用的库函数包含那些真正由程序
46、所用的库函数n建立库的基本方法建立库的基本方法n以随机数为主题建立一个随机数库(即以随机数为主题建立一个随机数库(即random库)库)2022-8-8华中科技大学计算机学院437.4.1 random7.4.1 random库的设计库的设计 n伪随机数伪随机数n计算机无法产生真正的随机数计算机无法产生真正的随机数n计算机总是按照某种顺序执行指令计算机总是按照某种顺序执行指令 n依靠计算机内部算法产生的依靠计算机内部算法产生的“随机随机”数数n从统计的观点来看是随机的从统计的观点来看是随机的n并且复杂到没有哪个用户能够轻松地预测到它并且复杂到没有哪个用户能够轻松地预测到它 n函数函数int r
47、and(void) n是接口是接口stdlib.h的一部分的一部分n返回值是一个非负且不大于常量返回值是一个非负且不大于常量RAND_MAX的整数的整数 nRAND_MAX的值取决于计算机系统的值取决于计算机系统n在典型的在典型的Macintosh机环境里,机环境里,RAND_MAX是是32,767n在一个典型的在一个典型的Unix工作站上,它是工作站上,它是2,147,483,6472022-8-8华中科技大学计算机学院44改变随机数的范围改变随机数的范围 n问题问题rand库函数不能给出精确的数值范围来适应特定要求库函数不能给出精确的数值范围来适应特定要求例如掷骰子产生一个例如掷骰子产生一
48、个1-6间的随机数间的随机数 n解决方法解决方法设计一个函数设计一个函数int RandomInteger (int low, int high);模拟掷骰子,可以调用模拟掷骰子,可以调用RandomInteger (1, 6) 模拟抽牌,可以调用模拟抽牌,可以调用RandomInteger (1, 52) n引发新问题引发新问题怎样实现这个函数呢怎样实现这个函数呢?如何把这个通用的函数加入到随机数库中如何把这个通用的函数加入到随机数库中?2022-8-8华中科技大学计算机学院45RandomIntegerRandomInteger函数的实现函数的实现 1.rand库函数产生的值限库函数产生的
49、值限制为一个浮点数制为一个浮点数d,范,范围是围是0d1。2.用乘法将用乘法将d的值按照需的值按照需要的范围扩大若干倍。要的范围扩大若干倍。3.将上述值的小数部分截将上述值的小数部分截去,那么产生以去,那么产生以0为最为最小边界的随机整数。小边界的随机整数。4.修改数值的范围使得从修改数值的范围使得从需要的最小值开始。需要的最小值开始。 1.int RandomInteger(int low,int high)2.3. int k;4. double d;5.d=(double)rand()/(double) RAND_MAX+1);6. k = (int)(d*(high-low+ 1);7
50、. return(low+k);8.2022-8-8华中科技大学计算机学院46初始化随机数发生器初始化随机数发生器 n线性同余法线性同余法n产生随机序列产生随机序列a0,a1,annb、c和和m的选取是随机性理论研究的内容的选取是随机性理论研究的内容nd称为随机序列的种子。称为随机序列的种子。n由系统时间自动产生一个初始种子由系统时间自动产生一个初始种子n因为时间始终在改变因为时间始终在改变n随机序列也将随之而全部改变随机序列也将随之而全部改变 1)%(10nmcabadann2022-8-8华中科技大学计算机学院47初始化随机数发生器初始化随机数发生器n代码语句代码语句nsrand(time