C程序设计参考资料.doc_第1页
C程序设计参考资料.doc_第2页
C程序设计参考资料.doc_第3页
C程序设计参考资料.doc_第4页
C程序设计参考资料.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计参考资料一、 在图形方式下编程的几个问题1. 初始化图形系统初始化图形系统的方法: 在程序中加入下述三条语句int driver,mode;drvier=DETECT; mode=VGAHI;initgraph(&driver,&mode,);得到的VGA高分辨率图形屏幕(如图1所示).关闭图形系统的方法: 调用库函数 restorecrtmode(); 或closegraph();完成各种图形功能的库函数原型在头文件graphics.h 中说明,调用这些图形功能函数时需要在源程序中加入 #define 语句 图1 图形屏幕 2.直角坐标和屏幕坐标的变换 点、直线等图形的位置通常采用直角坐标来表示,在图形方式下作图时就需要把直角坐标转换成屏幕坐标。图1的右上角文字描述了进行这种坐标变换的方法。在程序设计时可以定义一个函数来完成坐标变换,这个函数的输入参数为直角坐标(x,y),返回对应的屏幕坐标(xs,ys),程序代码如下所示:#define PI 3.1415926 /*定义常量PI*/#define XOS 20 /*定义直角坐标系原点O在屏幕上的位置为: */#define YOS 240 /* 水平方向第20个像素,垂直方向第240个像素*/#define SCALE_X 640/(4.5*PI) /*定义整个屏幕的宽度在直角坐标系中*/ #define SCALE_Y 640/(4.5*PI) /* 的长度为4.5 PI*/void xytoscreen(double x,double y,int *xs,int *ys) (*xs)=XOS+x*SCALE_X; (*ys)=YOS-y*SCALE_Y; 以上各个符号常量和变量的说明见图1右上角文字 3.如何在屏幕上画一条曲线 屏幕显示区域是由离散的像素组成,一条曲线也是由有限个像素组成的。可以采用如下方法画一条曲线:在曲线上取一些点,将这些点依次用直线段连接成一条折线,当点的数量足够多时,在屏幕上看到的就是一条曲线。图1右下角显示了一条由折线表示的曲线。例如在屏幕上画一条一个周期的正弦曲线,代码如下所示:#define N 200 /*定义的常量N表示把区间0,2*PI等分成N个点*/double a,b,x,y,h;int xs,ys,k;a=0; b=2*PI; h=(b-a)/N; x=a; y=sin(x); xytoscreen(x,y,&xs,&ys);moveto(xs,ys); for(k=1;k=t1+3) /*停顿三次系统时钟滴答声,1秒时钟滴答声约为18.2次*/ setfillstyle(0,0); bar(0,160,639,320); /*这两句完成擦除画面的功能*/ xita0=xita0+delta; x=a; y=sin(x+xita); xytoscreen(x,y,&xs,&ys); moveto(xs,ys); for(k=1;k2*PI) xita0=0; t1=t2; t2=biostime(0,0);注: inkey()为自定义函数,返回按键的Ascii码int inkey() int keyinput; keyinput=0;if (bioskey(1) keyinput=bioskey(0)&0x00ff; return keyinput; /*bioskey()为C库函数,需包含头文件bios.h, keyinput为按键的ascii代码*/ setfillstyle(0,0); 设置填充模式为用背景色填充, setcolor(2); 设置用2号颜色作图 bar(0,160,639,320); 画一个左上角坐标为(0,160),右下角坐标为(639,320)的矩形并填充 biostime(0,0); 返回自午夜以来系统时钟的滴答声次数,1秒系统时钟大约滴答18.2次 setfillstyle(),bar(),setcolor()是库函数,需要在程序中包含头文件graphics.hbiostime(),bioskey()是库函数,需要在程序中包含头文件bios.h b) 用这述方法制作动画,画面会很明显地闪烁。.以下介绍在VGA中分辩率图形方式下,采用分页显示制作动画的方法. VGA中分辩图形方式屏幕的显示分辩率为640350,16色,支持两个显示页, 制作动画的流程如图2所示,这时初始化图形系统的代码应该为: int driver,mode; drvier=VGA; mode=VGAMED; initgraph(&driver,&mode,);设置第0页为当前活动页使用库函数cleardevice() 清屏在屏幕上画一帧画面设置第0页为当前可见页设置第1页为当前活动页设置第1页为当前可见页进入动画处理是否结束动画使用库函数cleardevice() 清屏在屏幕上画一帧画面是否结束动画是是否否退出动画处理图2 动画制作流程图 以下程序段完成两条正弦曲线交替移动的动画 int driver=VGA,mode=VGAMED,k,xs,ys,xs1,ys1,xs2,ys2,am=0; long t1,t2; double x,y,h,a=0,b=4*PI,xita1=0,xita2=0,delta1=0.2*PI,delta2=0.1*PI; char s180; initgraph(&driver,&mode,); /*将显示模式设置成VGA中分辩率图形模式*/ h=(b-a)/N; t1=t2=biostime(0,0); setactivepage(am); while (inkey()!=32) if(t2t1+3) cleardevice(); xita1=xita1+delta1; xita2=xita1-delta2; x=a;y=sin(x+xita1); xytoscreen(x,y,&xs1,&ys1); x=a;y=1.5*sin(x-xita2); xytoscreen(x,y,&xs2,&ys2); for(k=1;k2*PI) xita1=0; if (xita22*PI) xita2=0; t1=t2; setvisualpage(am); am=(am+1)%2; setactivepage(am); t2=biostime(0,0); 注: device()是库函数,功能为清屏 line(int x1,int y1,int x2,int y2) 是库函数,功能为以(x1,y1),(x2,y2)为端点画一线段setvisualpage(int n)是库函数,功能是设置第n个显示页为可见页setactivepage(int n)是库函数,功能是设置第n个显示页为活动页VGAHI图形方式下只有一个显示页, VGAMED图形方式下有两个显示页 5.例子(代码见附录) exam1_g.c : 正弦曲线y=sin(x+)的动画,其中从0到2*PI反复变化 exam2_g.c : 四条不断变化的曲线 sin2_g.c: 两条交替运动的正弦曲线在图形方式下运行程序,必须将EGAVGA.BGI文件和正在运行的可执行文件放在同一目录中。二、 在文本方式下编程的几个问题 C语言程序运行的默认方式为文本方式,文本方式下的屏幕布局如图3所示。 图3 文本屏幕1.如何清屏 库函数 clrscr() 完成清屏的功能,并且将光标移到屏幕左上角( 坐标(1,1)的位置 )2.如何移动光标 库函数 gotoxy(int x, int y) , 将光标移至坐标为(x,y)的位置3.如何设置字符的颜色 库函数 textbackground(int n); textcolor(int n); 完成设置字符背景色、前景色的功能.4.例子(代码见附录)clrscr();gotoxy(5,16);textbackground(7); textcolor(1);cputs(abcd); 运行的结果为从第5列第16行开始以白底兰字显示字符串abcd exam1_t.c: A至Z26个英文字母随机排列,随机设置前景和背景颜色并不停地跳动四、 DOSBox软件简介在Windows系统运行Dos程序,特别是图形程序经常会出现错误。DOSBox软件是当前在 Windows 系统运行 DOS 游戏的较为完美的解决方案,该软件不仅能支持相当多的游戏实现正常运行,而且能将声音完美表现出来。1.首先下载 DOXbox 0.72 版。2.下载完毕,开始安装。安装到任意目录均可。安装完毕会在开始菜单生成程序组,DOSBox.conf 文件是 DOXbox 的配置文件,保持默认配置就可以顺利运行游戏。3.运行 DOSBox,会打开两个 DOS 窗口快捷方法:1) 直接把可执行文件拖动到DosBox图标上放手。这样这个可执行文件所在的文件夹就是Dos窗口中的C盘根目录2) ALT+ENTER可以切换/解除全屏模式。3) CTRL+F9是关闭DOSBox4) 最后建议不要使用中文目录名和文件名,有可能出错。5) mount c h:pal此命令的作用为将 h:pal 挂载为 C 盘6) 用记事本打开配置文件dosbox.conf文件,找到AUTOEXEC部分,把整条mount命令写在这里DosBox把这部分当作AUTOEXEC.BAT。五、 附录 1. 部分完成图形功能的库函数(1)设置画线颜色 void setcolor(int n); /* n 为0到15的整型数*/(2)画直线 void line(int x1,int y1,int x2,int y2) /*以(x1,y1),(x2,y2)为端点画直线*/(3)画矩形框 void rectangle(int x1,int y1,int x2,int y2) /*以(x1,y1),(x2,y2)为对角点画矩形框*/(4)画圆 void circle(int x,int y,int r) /*以(x,y)为圆心,r为半径画一圆*/(5)画一条圆弧void arc(int x,int y,int a1,int a2,int r)/*以(x,y)为圆心,r为半径,a1为起始角,a2为终止角*/(6)画一个扇形void pieslice(int x,int y,int a1,int a2,int r) /*以(x,y)为圆心,r为半径,a1为起始角,a2为终止角*/(7)设置画线模式 void setlinestyle(int n,1,int k) /* n的取值为 0-3,k取值为1或3,表示线的宽度 */(8)设置填充模式 void setfillstyle(int n,int color) /* n取值为0-12 */(9)画一实矩形区域void bar(int x1,int y1,int x2,int y2) /*以(x1,y1),(x2,y2)为对角点画矩形框,填充模式由setfillstyle预先设定*/(10)画一点 void putpixel(int x,int y,int color) /*在坐标(x,y)的位置画一点 */(11)填充满一个有界区域 void floodfill(int x,int y,int border) /* border为边界的颜色值,(x,y)为区域内某一点的坐标 */(12)设置填充模式 void setfillstyle(int pattern,int color) /* pattern取1为单一颜色填充,color填充色*/(13)图形模式下在屏幕上输出字符串 void outtextxy(int x,int y,char textstring);(14)设置矢量字符的样式 setteststyle(字体名,对齐方向,缩放比例);(15)设置当前作图点 moveto(int x,int y) 将作图点移至坐标(x,y)的位置(16)画线段lineto(int x,int y) 从当前作图点画一线段至坐标(x,y)的位置(17)清屏device()(18)设置显示可见页 setvisualpage(int n),设置第n个显示页为可见页(19)设置显示活动而 setactivepage(int n),设置第n个显示页为活动页/* (1)-(19)需包含头文件graphics.h ,并把tc目录下的EGAVGA.BGI文件复制到当前目录*/ 2.其它函数(20)在文本窗口中设置光标 void gotoxy(int x,int y) /* 在当前文本窗口中移动光标到指定的位置 */(21)设置文本颜色 void textcolor(int color) /* color的取值为0-15*/(22)设置文本背景颜色 void textbackground(int color) /* color的取值为0-7*/(23)字符串输出 void cputs(char *s) /* 在屏幕上输出字符串s */(24)清屏 void clrscr(); /* (17)-(21)需包含头文件conio.h */(25)取随机数 int random(n); /*返回0至n之间的整数,需包含头文件 stdlib.h */(26 )读取从午夜开始以每秒约18.2次滴答的速率计时的计时器 long biostime(0,0); /*C库函数,需包含头文件bios.h,返回值类型为long*/(27)测试有无按键输入,如果有则读出按键的ascii码值 int inkey() int keyinput; keyinput=0; if (bioskey(1) keyinput=bioskey(0)&0x00ff; return keyinput; /*bioskey()为C库函数,需包含头文件bios.h, keyinput为按键的ascii代码*/(28)测试有无按键输入,如果有则读出按键的键盘扫描码值 int inkey2() int keyinput; keyinput=0; if (bioskey(1) keyinput=(bioskey(0)&0xff00)8; return keyinput; (29)计算时间间隔 time caltime() long time1,time2; time(&time1);.;time(&time2); return time2-time1; /*time()为C库函数,需包含头文件time.h,time2-tim1为完成.所用的秒数*/ (30)取得系统日期和时间 void getsystemdatetime() struct tm *tm_now; long seconds_now; time(&seconds_now); tm_now=localtime(&seconds_now); tm_now-tm_year+1900; tm_now-tm_mon+1; tm_now-tm_mday; /*表达式的值分别为年,月,日*/ tm_now-tm_hour; tm_now-tm_min; tm_now-tm_sec; /*表达式的值分别为时,分,秒*/ tm_now-tm_wday; /*星期几,星期日为0 */ /* tm为C预定义的结构体类型,需包含头文件time.h tm_now */structtminttm_sec;inttm_min;inttm_hour;inttm_mday;inttm_mon;inttm_year;inttm_wday;inttm_yday;inttm_isdst; 3.颜色值及其适用范围颜色数值在文本方式使用在图形方式中使用黑色0前景和背景前景和背景兰色1前景和背景前景和背景绿色2前景和背景前景和背景青色3前景和背景前景和背景红色4前景和背景前景和背景粉红5前景和背景前景和背景棕色6前景和背景前景和背景淡灰7前景和背景前景和背景深灰8前景前景和背景淡兰9前景前景和背景淡绿10前景前景和背景淡青11前景前景和背景淡红12前景前景和背景 品红13前景前景和背景黄色14前景前景和背景白色15前景前景和背景 4.几个常用按键的代码值按键Ascii码键盘扫描码空格3257回车键1328A653004811a9730+4313-4512077075072080 5. eam1_t.c(跳动的26个英文字母)源程序#include #include #include #include int inkey();struct strdemo int x; int y; char c; int forecolor; int backcolor; s26; /*用于存放每个字母的信息*/main() int n,k; long t1,t2; char s12; randomize(); /*初始化随机数序列*/ for(k=0;kt1+2) for (k=0;k26;k+) textbackground(0);gotoxy(sk.x,sk.y);cputs( ); /*清除当前字母*/ sk.y=16-random(5); gotoxy(sk.x,sk.y); textbackground(sk.backcolor); textcolor(sk.forecolor); s10=sk.c; cputs(s1); /*在新的位置上显示当前字母*/ t1=t2; t2=biostime(0,1); gotoxy(1,1); return ;int inkey() int keyinput; keyinput=0; if (bioskey(1) keyinput=bioskey(0)&0x00ff; return keyinput; /*bioskey()为C库函数,需包含头文件bios.h,keyinput为ascii代码*/exam1_g.c(正弦曲线y=sin(x+)的动画,其中从0到2*PI反复变化)源程序#include #include #include #include #define PI 3.1415926#define XOS 20#define YOS 240#define SCALE_X 640/(4.5*PI)#define SCALE_Y 640/(4.5*PI)#define N 150void xytoscreen(double x,double y,int *xs,int *ys);int inkey();main() int driver=VGA,mode=VGAHI; int k,xs,ys; long t1,t2; double x,y,h,a=0,b=4*PI,xita0=0,xita1,delta=0.2*PI; char s180; initgraph(&driver,&mode,); /*将显示模式设置成VGA图形模式*/ setcolor(2); h=(b-a)/N; t1=t2=biostime(0,0); while (inkey()!=32) if(t2t1+3) x=a;y=sin(x+xita0); xytoscreen(x,y,&xs,&ys);moveto(xs,ys); setcolor(0); for(k=1;k=N;k+) x=a+k*h; y=sin(x+xita0); xytoscreen(x,y,&xs,&ys); lineto(xs,ys); xita1=xita0+delta; x=a;y=sin(x+xita1); xytoscreen(x,y,&xs,&ys);moveto(xs,ys); setcolor(2); for(k=1;k2*PI) xita0=0; t1=t2; setfillstyle(0,0); bar(500,100,639,120); sprintf(s1,y=sin(x),%ld,t1); outtextxy(510,100,s1); t2=biostime(0,0); restorecrtmode(); return ;void xytoscreen(double x,double y,int *xs,int *ys) (*xs)=XOS+x*SCALE_X; (*ys)=YOS-y*SCALE_Y;int inkey() int keyinput; keyinput=0; if (bioskey(1) keyinput=bioskey(0)&0x00ff; return keyinput; /*bioskey()为C库函数,需包含头文件bios.h, keyinput为ascii代码*/exam2_g.c (四条不断变化的曲线)源程序#include #include #include #include #include #define PI 3.1415926#define XOS 20#define YOS 240#define SCALE_X 640/(4.5*PI)#define SCALE_Y 640/(4.5*PI)#define N 120void xytoscreen(double x,double y,int *xs,int *ys);int inkey();void sin1();void sin2();void sin3();void sin4();main() int driver=VGA,mode=VGAHI; long t1,t2; char s180; initgraph(&driver,&mode,); /*将显示模式设置成VGA图形模式*/ t1=t2=biostime(0,1); while (inkey()!=32) if(t2t1+2) sin1(); sin2(); sin3(); sin4(); t1=t2; setfillstyle(0,0); bar(500,450,639,479); sprintf(s1,y=sin(x),%ld,t1); setcolor(2); outtextxy(510,460,s1); t2=biostime(0,1); restorecrtmode(); return ;void sin1() int k,xs,ys,xs0,ys0; double x,y,h,a=0,b=4*PI,delta=0.05*PI; static double xita=0; setcolor(2); h=(b-a)/N; xs0=0;ys0=180; setfillstyle(0,0); bar(0,0,639,110); setcolor(2); x=a;y=sin(x+xita); xytoscreen(x,y,&xs,&ys); moveto(xs-xs0,ys-ys0); for(k=1;k2*PI-delta) xita=xita-2*PI;void sin2() int k,xs,ys,xs0,ys0; double x,y,h,a=0,b=4*PI; static double omiga=0,fs=1; setcolor(2); h=(b-a)/N; xs0=0;ys0=70; setfillstyle(0,0); bar(0,110,639,220); setcolor(2); x=a;y=sin(x*(1+omiga); xytoscreen(x,y,&xs,&ys); moveto(xs-xs0,ys-ys0); for(k=1;k5-0.05) fs=-1; if (omiga-0.5+0.05) fs=1;void sin3() int k,xs,ys,xs0,ys0; double x,y,h,a=0,b=4*PI; static double ampi=1,fs=-1; setcolor(2); h=(b-a)/N; xs0=0;ys0=-40; setfillstyle(0,0); bar(0,220,639,330); setcolor(2); x=a;y=ampi*sin(x*2); xytoscreen(x,y,&xs,&ys); moveto(xs-xs0,ys-ys0); for(k=1;k1-0.05) fs=-1; if (ampi0.05) fs=1;void sin4() int k,xs,ys,xs0,ys0,t; double x,y,h,a=0,b=4*PI,delta=0.05*PI,ampi=1,omiga=0,fs1=-1,fs2=1; static double xita=0; static int p=1; setcolor(2); h=(b-a)/N; xs0=0;ys0=-150; setfillstyle(0,0); bar(0,330,639,440); setcolor(2); x=a; y=ampi*sin(x*(1+omiga)+xita); xytoscreen(x,y,&xs,&ys); moveto(xs-xs0,ys-ys0); for(k=1;k1-0.06) fs1=-1; if (ampi3-0.08) fs2=-1;if (omiga2*PI-delta) xita=xita-2*PI; setlinestyle(0,0,1); p=p%N+1;void xytoscreen(double x,double y,int *xs,int *ys) (*xs)=XOS+x*SCALE_X; (*ys)=YOS-y*SCALE_Y;int inkey() int keyinput; keyinput=0; if (bioskey

温馨提示

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

评论

0/150

提交评论