C语言程序设计-第7章-标准库及用户自定义库.ppt
- 文档编号:18734464
- 上传时间:2023-10-23
- 格式:PPT
- 页数:56
- 大小:273KB
C语言程序设计-第7章-标准库及用户自定义库.ppt
《C语言程序设计-第7章-标准库及用户自定义库.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计-第7章-标准库及用户自定义库.ppt(56页珍藏版)》请在冰点文库上搜索。
10/23/2023,华中科技大学计算机学院,1,C语言程序设计,第7章标准库及用户自定义库接口的概念、与头文件的关系()C标准库的使用,以及图形库函数的应用和动画的设计方法自定义库的创建,10/23/2023,华中科技大学计算机学院,2,7.3C图形库及其基本的图形操作,基本输出函数printf将信息以数字和字符串方式输出在显示屏上用户希望结果更形象、更生动、更逼真例如,windows操作系统取代Dos操作系统C编译系统为了方便用户设计图形程序提供了画图函数库(graphics.h),10/23/2023,华中科技大学计算机学院,3,7.3.1图形显示的窗口和坐标,图形的窗口可由用户定义它的位置和大小,大可到整个屏幕,小可到几个字符屏幕上常常可同时有几个活动窗口所有图形输出都是与当前窗口有关系,超出边界部分将被裁剪掉,10/23/2023,华中科技大学计算机学院,4,7.3.1图形显示的窗口和坐标,图形的坐标显示器的整个屏幕就像一张坐标纸图形上任一点位置用坐标值(x,y)来表示坐标值(x,y)以像素为单位绝对坐标指相对于屏幕原点的坐标A和B的绝对坐标分别为(20,20)和(420,130)如定义一个以A为左上角、B为右下角的图形窗口则用相对坐标表示,A为相对坐标原点,B的相对坐标是(400,110),10/23/2023,华中科技大学计算机学院,5,7.3.2图形模式的初始化,原因微机系统默认屏幕为文本模式(80列,25行字符模式)此时所有图形函数均不能工作方法voidinitgraph(intfar*gdriver,intfar*gmode,charfar*path)gdriver所指的图形驱动软件装入到内存参数gmode是图形函数用来确定显示模式的整型指针,10/23/2023,华中科技大学计算机学院,6,7.3.2图形模式的初始化,初始化前的问题不知道所用的图形显示器适配器类型,因为图形显示器适配器种类很多需要将编写的程序用于不同图形驱动器解决方法初始化前用TurboC的自动检测显示器硬件函数voidfardetectgraph(intfar*gdriver,intfar*gmode)完成对适配器的检查,得到显示器类型号和相应的最高分辨率模式,10/23/2023,华中科技大学计算机学院,7,图形模式初始化例子,#includevoidmain(void)intgdriver,gmode;detectgraph(/*根据测试结果初始化图形模式*/,#includevoidmain(void)intgdriver=DETECT;intgmode;initgraph(,将driver设置为DETECT,它会自动检测所用显示器的类型,装入相应的图形驱动软件,并选用最高分辨率的显示模式,改进,10/23/2023,华中科技大学计算机学院,8,图形模式初始化的关闭,voidfarclosegraph(void);用于关闭图形系统,回到文本方式(TurboC默认方式)并释放用于保存图形驱动程序和字体的系统内存。
voidfarrestorecrtmode(void);用于返回到文本方式,但不关闭图形系统即图形函数所占用的内存不被释放和setgraphmode交互使用,在图形和文本之间来回切换。
10/23/2023,华中科技大学计算机学院,9,例7.1一个能独立运行的简单C图形程序,#include#includevoidmain(void)intgdriver=DETECT,gmode;inti,xradius=130,yradius=130;initgraph(/*关闭图形系统*/,10/23/2023,华中科技大学计算机学院,10,7.3.3基本图形函数,画点函数voidputpixel(intx,inty,intcolor);用color颜色在(x,y)位置画一点坐标位置函数intgetmaxx(void);intgetmaxy(void);分别得到x轴、y轴的最大intgetx(void);intgety(void);分别得到当前画笔的x坐标、y坐标。
voidmoveto(intx,inty);把画笔从当前位置移到点(x,y),移动过程不画。
voidmoverel(intdx,intdy)把画笔从当前位置(x0,y0)移动到点(x0+dx,y0+dy),10/23/2023,华中科技大学计算机学院,11,补充:
点,线,面的画法,点:
屏幕上(x,y)坐标处的像素(pixel)画点:
指在指定(x,y)坐标处输出一个像素.画点函数(像素输出函数)putpixel原型:
voidfar_Cdeclputpixel(intx,inty,intcolor);功能:
指在指定(x,y)坐标处画一个color颜色的点.调用:
putpixel(x,y,YELLOW);,10/23/2023,华中科技大学计算机学院,12,#includegraphics.h#includemath.h#includedos.hvoidmain(void)intx=150,y=250,step,num,i,gdriver,gmode;printf(inputstepandnumberplease!
n);scanf(%d%d,例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();closegraph();,10/23/2023,华中科技大学计算机学院,13,#includegraphics.h#includemath.h#includedos.hvoidmain(void)intx0,y0,x1,y1,x,y,gdriver,gmode;floatk;printf(inputx0,y0,x1,y1,please!
n);scanf(%d%d%d%d,例2.按照输入的起点,终点画线.,initgraph(,10/23/2023,华中科技大学计算机学院,14,画线函数(ppt15-ppt29自学),voidline(intx1,inty1,intx2,inty2);从点(x1,y1)到(x2,y2)之间画一直线voidfarlineto(intx,inty);从画笔当前位置到点(x,y)之间画一直线voidfarlinerel(intdx,intdy);函数linerel从画笔当前位置(x,y)到其相对位置(x+dx,y+dy)之间画一直线,10/23/2023,华中科技大学计算机学院,15,画圆、圆弧和椭圆函数,voidfarcircle(intx,inty,intradius)画一个以(x,y)为圆心,radius为半径的圆voidarc(intx,inty,intstangle,intendangle,radius)画一个以点(x,y)为圆心,radius为半径起始角为stangle,终止角为endangle的圆弧ellipse(intx,inty,intstangle,intendangle,intxradius,yradius)画一个以点(x,y)为中心,stangle为起始角,endangle为终止角,xradius为x轴半径,yradius为y轴半径的椭圆角度以度为单位,屏幕的水平方向为0度,逆时钟方向为正,10/23/2023,华中科技大学计算机学院,16,画矩形函数,voidrectangle(intx1,inty1,intx2,inty2);画一个矩形其左上角坐标是(x1,y1)右下角坐标是(x2,y2),10/23/2023,华中科技大学计算机学院,17,7.3.4颜色及线型的设置,设置背景色和前景色voidsetbkcolor(intcolor);color值必须是表7.1所列setcolor(4);/*等价于setcolor(RED);*/,voidsetcolor(intcolor);对EGA、VEA显示器,只有一个调色板(表7.1)对CGA显示器,有4个调色板调色板号x通过设置图形初始化中参数mode为CGACx如mode为CGAC1,setcolor
(2)为洋红色,10/23/2023,华中科技大学计算机学院,18,有关调色板的函数,voidsetpalette(intindex,intcolor)将调色板寄存器index中寄存的颜色设置为color色对EGA/VGA显示器有效对CGA无效因为它的4个调色板的颜色值是固定不变的index只能取015,而color(6位bit)可取063,10/23/2023,华中科技大学计算机学院,19,调色板的例子,setcolor(4);/*缺省值红色*/circle(100,100,50);getch();setpalette(4,EGA_YELLOW);/*等价于setpalette(4,62);*/,调色板寄存器所装的颜色一旦改变,之前用setcolor(寄存器号)设置的图形颜色也随之改变此例调用setpalette(4,EGA_YELLOW)将4号调色板寄存器中的颜色改变为黄色圆的颜色也立即改变为黄色,10/23/2023,华中科技大学计算机学院,20,有关调色板的函数,voidsetallpalette(structpalettetypefar*palette);来设置EGA/VEA调色板上的16种颜色结构palettetype在头文件graphics.h中定义为:
structpalettetypeunsignedcharsize;signedcharcolors16;;,10/23/2023,华中科技大学计算机学院,21,画线的线型函数,线型参数linestyle取值如表7.4所示,缺省值是实线线宽参数thickNORM_WIDTH
(1)表示一个像素宽(缺省值)THICK_WIDTH(3)表示三个像素宽参数upattern只有在参数linestyle取4或USERBIT_LINE(用户自定义线型)时,才有意义,setlinestyle(intlinestyle,unsignedupattern,intthick);,10/23/2023,华中科技大学计算机学院,22,7.3.5封闭图形的填充,填充前模式和颜色的设置调用函数setfillstyleTurboC提供两种方法调用函数floodfill实现任意封闭图形的填充一些特定画图函数会产生封闭轮廓图的自动填充,10/23/2023,华中科技大学计算机学院,23,填充模式和颜色的设置,voidsetfillstyle(intpattern,intcolor);参数color是调色板寄存器号参数pattern如下表值为USER_FILL(用户自定义填充模式)时,需调用函数setfillpattern,10/23/2023,华中科技大学计算机学院,24,用户自定义填充方式,voidsetfillpattern(char*upattern,intcolor);参数color用颜色填充后面的轮廓图和指定区域参数upattern指针指向一个88像素点阵组成的填充图模(占8个字节存储区)每个字节代表一行,每个bit位对应列上的像素1则该像素用color显示,0则不显示例:
charupattern=0x8a,0x8a,0x41,0x3,0x8a,0x8a,0x41,0x3;,10/23/2023,华中科技大学计算机学院,25,填充任意封闭图形的函数,voidfloodfill(intx,inty,intbordercolor);参数x和y为封闭图形内任意一点的坐标参数bordercolor是封闭图形边框的颜色注意所要填充的图形必须是完全封闭的点(x,y)要在封闭图形之内bordercolor的值必须与封闭图形边线的颜色一致,10/23/2023,华中科技大学计算机学院,26,填充例子,先用红色画一个圆,然后用黄色按如图7.3的图案填充该圆。
charupattern=0x8a,0x8a,0x41,0x3,0x8a,0x8a,0x41,0x3;setcolor(RED);/*设置前景色为红色*/setfillpattern(upattern,YELLOW);/*自定义填充模式*/circle(100,100,100);/*画圆*/floodfill(50,60,RED);/*填充圆*/,10/23/2023,华中科技大学计算机学院,27,画封闭轮廓图的函数,特点首先画出一个的封闭轮廓图然后用设定的或缺省的模式和颜色进行填充例voidbar(intx1,inty1,intx2,inty2);画一个已填充的条形图,没有边框voidpieslice(intx,inty,intstangle,intendangle,intradius);画一个已填充的扇形voidfillellipse(intx,inty,intxradius,intyradius);画一个已填充椭圆,10/23/2023,华中科技大学计算机学院,28,7.3.6图形方式下的字符输出,printf的不足无法选择字符的大小、字型、方向和颜色输出指定位置的字符串voidouttext(char*str);在当前位置上输出由str所指的字符串voidouttextxy(intx,inty,char*str);在窗口中(x,y)位置输出字符串不足只能输出字符串,不能直接输出变量的值,10/23/2023,华中科技大学计算机学院,29,格式化输出函数,intsprintf(char*s,char*format,);功能把省略号部分的各种类型的数据按格式字符串format指定的格式,转换成字符串输出到指针s指向的字符数组中注意:
课程设计的菜单设计中要用到!
例chars20;intx=10,y=20;sprintf(s,x=%d,y=%d,x,y);outtext(s);/*显示:
x=10,y=20*/,10/23/2023,华中科技大学计算机学院,30,定义字符字型、大小和方向的函数(略),voidsettextstyle(intfont,intdirection,intcharsize);参数font确定所用的字型参数direction决定字符显示的方向,从左到右水平输出(0或HORIZ_DIR)或从底向上垂直输出(1或VERT_DIR)参数charsize增加字符大小的倍数,其值为0到10,10/23/2023,华中科技大学计算机学院,31,例7.2多变的圆环(略讲),一个综合应用画图、设置颜色、填充和字符输出的实例显示多个静态的同心圆和通过圆心的一组线段按任意键后,图形出现不同的变化还介绍了利用直线函数制作绕固定点旋转图形的方法中心点用(x0,y0)表示其它点根据绕该点旋转多少角度,使用三角函数sin和cos动态决定,这两个函数的度数都要为弧度,10/23/2023,华中科技大学计算机学院,32,例7.2多变的圆环(略讲),#include#include#include#definePAI3#defineB0.809voidmain(void)inti,x0,y0,x,y,driver,mode;floata;driver=CGA;mode=CGAC0;/*指定图形显示方式*/initgraph(/*初始化图形系统*/,10/23/2023,华中科技大学计算机学院,33,例7.2多变的圆环(略讲),setcolor(3);/*设置前景色为黄色*/setbkcolor(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);,10/23/2023,华中科技大学计算机学院,34,例7.2多变的圆环(略讲),setcolor(3);circle(x0,y0,60);settextstyle(SMALL_FONT,HORIZ_DIR,1);/*定义字体、大小和方向*/outtextxy(120,170,pressakey);/*输出字符串*/getch();setfillstyle(HATCH_FILL,YELLOW);/*设置填充模式*/floodfill(202,100,3);/*用黄色网格线填充指定区域*/getch();,10/23/2023,华中科技大学计算机学院,35,例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();,10/23/2023,华中科技大学计算机学院,36,7.3.7图形屏幕操作函数,清屏函数voidfarcleardevice(void);用于清除整个屏幕voidfarclearviewport(void);如果已用函数setviewport定义了一个图形窗口可调用它清除图形窗口内的内容存取位图像函数1)unsignedimagesize(intx1,inty1,intx2,inty2);返回左上角为(x1,y1)、右上角为(x2,y2)的矩形区内的全部内容所占的内存字节数,10/23/2023,华中科技大学计算机学院,37,存取位图像函数,2)voidgetimage(intx1,inty1,intx2,inty2,voidfar*mapbuf);把左上角为(x1,y1)、右上角为(x2,y2)矩形区内的图像保存到mapbuf所指的内存中去。
3)voidputimage(intx,inty,void*mapbuf,intop);将以前用getimage保存的图像重新送回屏幕显示,参数op一个组合算子将图像与原屏幕图像进行op操作注意:
这两个函数在制作图形菜单时非常有用!
10/23/2023,华中科技大学计算机学院,38,设置图形页的函数(略),图形页指可存放显示在整个屏幕上信息的RAMTurboC最多支持4页,VGA有2个图形页,EGA有4个图形页用户可以使用由硬件支持的任何一个图形页,并可根据需要作页之间的开关切换活动页正在由用户编辑图形的页可视页显示在屏幕上的页活动页不一定是可视页,即若用户不设定该页为当前显示页时,在该页上编辑的图形将不会在屏上显示出来。
缺省时,0页既活动页又是可视页。
10/23/2023,华中科技大学计算机学院,39,设置图形页的函数(略),voidsetactivepage(intpagenum);设置pagenum为活动页该句后面的所有画图操作都在该页进行voidsetvisualpage(intpagenum);设置pagenum为可视页有了多个图形页,就可以将图形输出到一个不可视的屏幕页可以理解为先在屏幕的后台工作,然后,通过调用setvisualpage改变可视页来快速显示后台屏幕图像,从而产生动画,10/23/2023,华中科技大学计算机学院,40,建立图形视口的函数(略),视口在图形方式下屏幕的某一区域即窗口的别名voidsetviewport(intx1,inty1,intx2,inty2,intclipflag);clipflag为非0,则超出视口的图形会被自动剪裁掉不显示clipflag为0,则超出视口的图形仍将显示注意在屏幕上可设置不同的视口,甚至部分可以重叠最近设置的视口是当前视口图形坐标也是相对于当前视口的,10/23/2023,华中科技大学计算机学院,41,7.4创建自己的库,库与目标文件区别目标文件中的函数,无论他们是否真正被程序所用,都成为可执行程序的一部分库文件与其它文件连接时,可执行程序中只包含那些真正由程序所用的库函数建立库的基本方法以随机数为主题建立一个随机数库(即random库),10/23/2023,华中科技大学计算机学院,42,7.4.1random库的设计,伪随机数计算机无法产生真正的随机数计算机总是按照某种顺序执行指令依靠计算机内部算法产生的“随机”数从统计的观点来看是随机的并且复杂到没有哪个用户能够轻松地预测到它函数intrand(void)是接口stdlib.h的一部分返回值是一个非负且不大于常量RAND_MAX的整数RAND_MAX的值取决于计算机系统在典型的Macintosh机环境里,RAND_MAX是32,767在一个典型的Unix工作站上,它是2,147,483,647,10/23/2023,华中科技大学计算机学院,43,改变随机数的范围,问题rand库函数不能给出精确的数值范围来适应特定要求例如掷骰子产生一个1-6间的随机数解决方法设计一个函数intRandomInteger(intlow,inthigh);模拟掷骰子,可以调用RandomInteger(1,6)模拟抽牌,可以调用RandomInteger(1,52)引发新问题怎样实现这个函数呢?
如何把这个通用的函数加入到随机数库中?
10/23/2023,华中科技大学计算机学院,44,RandomInteger函数的实现,rand库函数产生的值限制为一个浮点数d,范围是0d1。
用乘法将d的值按照需要的范围扩大若干倍。
将上述值的小数部分截去,那么产生以0为最小边界的随机整数。
修改数值的范围使得从需要的最小值开始。
intRandomInteger(intlow,inthigh)intk;doubled;d=(double)rand()/(double)RAND_MAX+1);k=(int)(d*(high-low+1);return(low+k);,10/23/2023,华中科技大学计算机学院,45,初始化随机数发生器,线性同余法产生随机序列a0,a1,anb、c和m的选取是随机性理论研究的内容d称为随机序列的种子。
由系统时间自动产生一个初始种子因为时间始终在改变随机序列也将随之而全部改变,10/23/2023,华中科技大学计算机学院,46,初始化随机数发生器,代码语句srand(time(NULL);对这语句,用户得去理解随机数种子的概念、time函数,和神秘常数NULL的意义简化:
引入RandomizevoidRandomize(void)srand(time(NULL);使用起来非常简单,可以把它加入随机数库中建库前要创建一个接口(例:
random.h)然后在另外一个文件里给予实现(例:
random.c),10/23/2023,华中科技大学计算机学院,47,7.4.2random库的接口,也就是random.h文件内容函数原型要给用户提供他们能够使用的所有函数的原型常数定义一般采用#define定义,比如RAND_MAX这样的常量类型定义经常定义一些新的类型给用户使用这一点在现代编程技术里十分重要任何实际内容出现以前,必须
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 标准 用户 自定义