版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言画板实验内容从本次课程开始的大工程,是使用C语言以及EGE图形库,构建一个“XXX画板”(其中“XXX”你是给画板取的名字)
这个“XXX画板”要能够根据我们输入的信息画图(或者动画,甚至游戏),能够将图形(动画)的信息保存在文件(称为“画板文件”,文件扩展名为.draw)中,能够从文件中读取绘图信息。本次课程,仅实现“XXX画板”两个功能询问用户是否读取画板文件用户根据提示菜单选择要进行的操作。2020-03-152实验要求-11.模块1:“是否读取文件”:第一步:程序启动后,询问用户是否读取之前的信息存储文件,如下图:欢迎您进入XXX(如
Mickey画板),请根据菜单选择您想进行的操作:读取文件不读取文件请输入您的选择:
第二步:当用户选择后予以反馈。1、读取,显示提示信息“已读取”。2、不读取,显示提示信息“未读取”第三步:进入到模块2(见下页)
注意事项:使用if语句实现。且需注意,因目前还未学习文件操作,故代码中不涉及文件读取功能,在程序设计中可直接在用户选取“1”或“2”
后,直接显示提示信息,并进入到模块2中。2020-03-153实验要求-22模块2:“用户根据菜单选择要进行的操作”:i.呈现以下菜单信息,如下图:欢迎您进入XXX(如
Mickey画板),请根据菜单选择您想进行的操作:清除屏幕作画退出……(自由发挥)请输入您的选择:
ii.用户根据需要输入自己的选择。如果用户选择1,则清除屏幕上所有的图画内容(注意,不能删除菜单内容);如果用户选择2,则继续询问所作画内容(图形、颜色【switch】等,可自由发挥);如果用户选择3,则程序结束;更多功能可以由同学们自由发挥。iii.使用switch语句实现。2020-03-154EGE2020-03-155·绘图环境:initgraph,
closegraph颜色表示:setcolor,setfillcolor,EGERGB·绘制图形:bar,circle,moveto文字输出:outtext,
xyprintf键鼠输入:getkey,
getmouse,getInteger时间函数:delay_ms,
delay_fps随机函数:randomize,
random可能用到的EGE函数在使用下面函数之前,请先看《实验课函数参考手册》中对该函数的说明!getch(): 读键盘输入的一个字符getInteger();读一个整数cleardevice(); 清除屏幕内容2020-03-156outtextxy();xyprintf();在屏幕上指定位置显示一个字符串在屏幕上指定位置显示格式化后的信息·
绘制图形相关的函数,例如
bar,circle
rectangle,line,lineto等常见错误在EGE图形模式下,是无法使用printf()函数的。请使用xyprintf()或者
outtextxy()代替int
x=30;xyprintf(0,40,"今天气温为%d摄氏度",x);
xyprintf()中的格式控制字符如"\n"等是不起作用的,所以,如果想要显示两行信息那么需要如下:int
x=30;xyprintf(0,40,"今天气温为%d摄氏度",x);xyprintf(0,60,"昨天气温为%d摄氏度",x/2);2020-03-157实验内容2020-03-158·将实验四中实现的两个模块修改为两个函数,通过一个main函数来调用两个函数分别实现“读取文件”、“选择要进行的操作”这两个功能。实验要求-12020-03-159程序启动后,main函数首先调用”文件读取函数”;如果读取文件成功则提示用户“读取文件成功!”;否则,提示“文件不存在”;然后显示相应的菜单选项如果文件读取成功,在菜单项里面增加显示一项“重画”如果不成功,那么在菜单项里面不显示“重画”暂不需要编写“真正的”文件读写功能只要求在“文件读取函数”中向用户提问并获取用户输入即可(同学们可根据自己的理解自行发挥)2.
函数声明列表:序号函数原型说明备注1void
menu(……)根据读取文件成功与否(参数判断)显示相应的菜单2int
readFile(……)读取文件,成功返回1,否则返回0附加说明2020-03-1510向用户提问并获取输入信息,可能需要使用“键盘鼠标输入函数”(参见《实验课函数参考手册》)·“显示菜单选项”可以有很多有趣且效果更好的实现方法,需要大家自行探索(可以参考ege的帮助文档“入门基础示例”“用户交互——鼠标1/鼠标2”。该帮助在ege\man\index.htm文件中)菜单项能够对鼠标的移入和移出产生响应,就像鼠标在VC菜单栏滑过的效果菜单项能够响应鼠标的点击,而不仅仅是键盘的输入实验内容2020-03-1511(1)从一个使用者的角度出发,考虑上次课程所设计的画板的最常见的功能都有哪些?·(2)从一个程序开发者的角度出发,考虑如何采用自顶向下逐步精化的设计方法,从主程序的层次着手,依次将前述的每个功能各对应一个函数(注意,每个函数解决整个问题中的一部分),最后将所有的函数编写出来。(3)将所有模块分文件存储。如何模块化-12020-03-1512首先假设我们已经开发完了一个程序程序中包含3个函数,均存放到一个Main.c文件中main()mod1()mod2()现在,我们希望将这个程序模块化:将mod1()函数放置到
Module1.c中将mod2()函数放置到
Module2.c中在Module1.h中声明mod1()的函数原型在Module2.h中声明mod2()的函数原型如何模块化-2·添加新建项:C程序源文件(.c)以及头文件(.h)右键单击,“添加”“新建项”2020-03-1513如何模块化-3·
“#pragma
once”是一个预编译指令,一般用在头文件的第一行,避免该头文件被重复包含产生的错误2020-03-1514如何模块化-42020-03-1515一般来说,模块化开发中,每个“.cpp”或者“.c”文件都会对应一个同名的“.h”文件。·在“.cpp”或者“.c”中定义的函数,其原型声明均放置到同名的“.h”文件中,便于其它程序包含引用在前面的例子中,“Main.c”文件中的主函数main()要调用“Module1.c和“Module2.c”中定义的函数;只需要在“Main.c”中包含
“Module1.h”和“Module2.h”即可。如何模块化-5·有几点需要格外注意的:这里的#include
“Module1.h”是双引号,因为是引用工程内的头文件;而对库中的头文件引用则用尖括号如:<stdio.h>头文件中只需要重新声明一遍main函数中所需调用的所有函数,而不需要重新定义。·这样分文件管理代码以后是不是结构更加清晰了呢?2020-03-1516实验内容2020-03-1517下面我们来介绍如何画多边形。fillpoly(int,int[])感兴趣的同学可能已经认识这个函数了,不认识也系我们来稍微介绍一下它。这个函数用来画有填充的多边形,所谓“有填充”是指多边形内部是用指定的填充色进行填充的。可以看到这里有两个需要传入的参数:第一个int值,代表了多边形的边数也就是定点数。第二个是我们刚学到的知识——int型数组它是用来存放各个顶点坐标的。实验内容例如:int
pt[]
=
{0 ,
0,100,
0,100,
100,10
,
10,90
,
10,0 ,
100
};fillpoly(6,
pt);这一段便是绘制一个六边形的代码如图:是不是很灵巧?2020-03-1518实验内容
既然我们做的是一个画板,那么就需要可以让用户自行绘制自己喜欢的图形,换而言之就是多边形的边数和顶点坐标就需要通过用户的输入来确定。那么,如何在EGE中获取用户输入的字符串呢?这里EGE库提供了一个函数“inputbox_getline(...)”,用于显示一个输入框。2020-03-1519实验内容2020-03-1520int
inputbox_getline(LPCSTR
title,
LPCSTR
text,
LPSTR
buf,
int
len);参数title对话框标题text对话框内显示的提示文字,可以使用"\n"或者"\t"进行格式控制。buf用于接收输入的字符串指针,指向一个缓冲区,可以是一个字符数组的名字len指定buf指向的缓冲区的大小,同时也会限制在对话框里输入的最大长度返回值:返回1表示输入有效,buf中的内容为用户所输入的数据,返回0表示输入无效,同时buf清空。该函数的详细说明及例子,请参见EGE图形库的帮助文档“库函数目录”。实验要求-12020-03-1521(1)在画板中加入绘制多边形的功能,要求可以让用户输入多边形边数以及各个点坐标。要求使用字符串输入框输入坐标等信息。并用字符数组c[]来储存字 符串数据。对于输入信息要进行错误检查(格式、内容),抛弃错误输入,并 提示用户进行重新输入。输入成功后,将字符串坐标信息转化成整型存入整型数组用作参数。调用相关函数进行正确绘图。自己定义的函数名称按照规范拟定。提示-12020-03-1522
用inputbox_getline函数,可以一次读入一个x坐标,可以一次读入一对(x,y)坐标,可以一次读入多对坐标读入的坐标都放到一个字符数组中扫描字符数组,按序取出每个坐标对应的子串可以自己编写函数,逐个字符对比以取出子串可以使用strtok、strstr、strdup等函数将子串转换为整数字符串转整数/浮点数的函数(参见百度百科)字符串转换成浮点数:double
atof(const
char
*nptr);字符串转换成整型数:int
atoi(const
char
*nptr);提示-22020-03-1523·字符串处理的函数(参见百度百科:字符串函数)1
strcpy·
4
strncat7
strdup10
strcmp2
strcat5
strncpy8
stricmp11
strncmp3
strlen6
strcspn9
strerror12
strnicmp·13strnset14
strpbrk15strrchr·16strrev17
strset18strspn·19strstr20
strtod21strtok·22strtol23
strupr24swab·25isalpha实验内容-12020-03-1524(1)仅仅一个图形它就有很多要素,比如颜色、坐标(顶点坐标、中心坐标等)、大小、形状、还有很多。因此,想要完全确定一个图形,就需要知
道上述的所有信息。也就是说,如果想要保存一个已经绘制成功的图形,
我们就需要存储这些要素在一起。那么有没有这样一种数据结构能够同时存储这些参数信息呢?如果有的话,该如何存储;如果没有的话,又该如何存储?(2)请使用结构体来改进实验七的画板。该系统的约束如下:
i.用结构体保存所绘图形的参数信息(如形状、颜色、大小、顶点坐标或中心坐标、是否填充、边的粗细等)。ii.假设系统中可以存储至少
20个图形信息。
iii.修改后,画板包含文件存储-读取模块、用户根据提示菜单选择操作模块、自定义绘图模块(即输入所需绘图的各个参数)、重绘模块(即将以前所绘的图形重新绘制)、查询模块(即输入图案类型查询是否存在该种图形)实验内容-22020-03-1525iv.输入绘图参数时,需要对输入信息进行验证:颜色必须为大写英文缩写(例如:“RED”)。坐标必须是整形数据并且格式正确(x,y)。其他自定义的相关输入有效性检测。输入失败需提示重新输入。v.使用图形的类型查询。首先对用户输入的类型进行正确性检查,再查询系统中是否存在,查询成功则输出图案,失败给予用户反馈信息。vi.编码所定义的函数名称需严格按照规范自拟。【选作扩展】前述内容不仅仅局限于图形。动画也可以作为绘制的内容之一,例如绘制一个半径大小不断变化的圆的动画【选作扩展】考虑使用鼠标来绘制图形,或者制定图形的绘制位置实验步骤-12020-03-1526做该实验时,我们遵循由易到难的方式:定义1个圆形结构体,能存1个圆形的信息定义1个圆形结构体数组,能存放至少3个圆形的信息,用户可以输入至少3个圆形信息,输入后,清屏,然后重画这3个圆形定义1个矩形结构体,能存1个矩形信息定义1个矩形结构体数组,能存放至少3个矩形的信息,用户可以输入至少3个圆形信息和至少3个矩形信息;输入后,清屏,然后重画3个圆形和3个矩形实验步骤-22020-03-1527绘制圆形和矩形时,要注意保持绘图的次序int
sequence[100];//用户输入第n个图形信息时,将
sequence[n-1]的值设置为图形的类型(例如
sequence[n-1]=1代表第n个图形是圆形)switch
(sequence[i])
{case
1:drawcircle(circle[j]);case
2:drawrectangle(rectangle[k]);8.
}以此类推程序编写指南:思路1
(1)2020-03-1528用户可能会输入很多种不同图形的信息,怎么记录这些图形信息呢?思路1
为不同形状各定义一个形状数组,例如,一个多边形数组,一个圆形数组,一个xxx数组。用户输入的每个图形信息,分别记录到对应的数组中(按照次序)
再定义一个图序数组,用于记录上述图形的画图次序。图序数组中的每个元素都指向上述某个形状数组中的某个元素。图序数组中的图序元素是一个结构体。这个结构体有两个成员:一个成员说明当前图序元素所指向的形状类型(多边形?圆形?),另一个成员是一个void指针,指向形状数组中的某个元素。(为什么必须是void指针?)
绘图时,遍历图序数组的每个元素,取出当前图序元素的第一个结构体成员(即形状类型),按照这个形状类型去相应的形状数组中读取图形信息(由当前图序元素的第二个结构体成员,即void指针所确定)。当然,在读取图形信息之前,要将void指针转换为对应的图形指针程序编写指南:思路1
(2)2020-03-1529点:点的坐标可以存放在结构体中typedef
struct{int
x;int
y;}
POINT;多边形:多边形的坐标可以存放在一个POINT数组中POINT
pt[20];多边形的信息可以放到结构体中typedef
struct{POINT
pt[20];/*继续定义多边形的端点数量、线宽、线的颜色、填充颜色等*/}
POLY;程序编写指南:思路1
(3)2020-03-1530圆形Typedef
struct{POINT
center;unsigned
int
radius;/*线宽、线的颜色、填充颜色等
*/}
CIRCLE;void
main(){CIRCLE
circle[10];circle[0].center.x=100;circle[0].center.y=200;……}其它形状……程序编写指南:思路22020-03-1531思路2定义一个结构体S,存放任何形状的数据,结构体中包括
一个一维数组,用于存放形状的坐标、长宽等(例如多边形的多个定点的坐标、圆形的圆心坐标以及半径)。该数组中每个元素的具体含义由编程者自己定义维护一个用于表示图形类型的变量一个用于表示图形线宽的变量一个用于表示图形线的颜色的变量一个用于表示图形内部填充颜色的变量(对于某些图形,如一根线,是无效的。可以定义但是不必使用)其它必要的信息(例如显示动画所需的参数等)定义S类型的数组,用于存放用户输入的所有形状数据绘图时,根据数组中存放的信息,执行相应的绘图操作即可实验内容2020-03-1532(1)将实验八中存储的图形信息存到文件中。
(2)将实验八的画板中的图形信息从某个文件导入,导入之后,可以直接重绘这些导入的图形实验要求-12020-03-1533·
(1)数组实现的函数声明列表:序号函数原型备注1SHAPE*
readFromFile()从文件读信息到形状数组中,返回指向数组第一个元素的指针2void
writeToFile(SHAPE*
shapeArray)保存数组中的图形信息到文件实验要求-22020-03-1534(2)编码规范,注释清晰。(3)提交的结果包括:VC工程其他文档:i.关于实验完成人、提交结果描述等补充说明
readme.txt。(4)填写实验报告(格式见相应的实验报告模版)。实验指南-将哪些信息存入文件2020-03-1535用一个Shape结构体类型保存所有图形信息的情况首先存图形的数量,该数字后加上换行符。例如fprintf(fp,"%d\n",number_of_shape);或者然后保存每个图形的信息。一个图形信息占一行,图形内的各个字段使用空格符分隔。例如for(k=0;k<number_of_shape;
k++)
{fprintf(fp,
"%d
%10s
%c
",
shape[k].shape_type,shape[k].shape_name,
shape[k].fill_color);//再用一个for循环,将当前shape中的坐标fprintf输出到文件中fprintf(fp,"\n");}实验指南-将存入文件的信息读出来2020-03-1536读取文件信息时,要严格按照写入文件信息的逆向过程处理,特别要注意文件的格式。否则程序必然会出错!·对应于前一页ppt首先读取图形的数量,例如fscanf(fp,
"%d\n",
&number_of_shape);然后读取每个图形的信息,例如for(k=0;k<number_of_shape;
k++)
{fscanf(fp,
"%d
%10s
%c
",
&(shape[k].shape_type),shape[k].shape_name,
&(shape[k].fill_color));//再用一个for循环,将当前shape中坐标fscanf读入到shape中}实验指南-如何将图形信息存入文件-12020-03-1537有两种方式将图形信息存入文件文本方式·
二进制方式文本方式将所有要存放的信息,均转为人可以阅读的文本形态,存入文件。这种方式,由于输出的文件人可以阅读,所以便于调试。比如在程序执行过程中打开文件看看输出结果是否符合自己的预期但是这种方式在程序里面写起来比较繁琐,要用很多的fprintf,并且输出文件的式控制也要仔细处理。如果用空格符作为一个图形内不同字段的分隔符的话,那
么图形的名字(字符串)中就不能有空格字符。实验指南-如何将图形信息存入文件-22020-03-1538二进制方式将所有要存放的信息,均以二进制形式存入文件。fp=fopen("draw.dat","wb");//b表示二进制这种方式,由于输出的文件人难以阅读,不便于调试。这种方式在程序里面写起来很简单,不需要考虑图形信息的格式控制,只要掌握相关信息的内存占用字节数即可。这种方式可以看作将内存中的信息原封不动地转存到硬盘文件中将形状的数量写入文件fwrite(
(void*)&number_of_shape,
sizeof(int),
1,
fp);将所有形状的信息写入文件:fwrite((void*)ShapeArray,
sizeof(ShapeArray[0]), number_of_shape,
fp);实验指南-如何读写多种不同的形状类型-12020-03-1539·如果你定义了不同的结构体类型用于存放不同的形状typedef
struct·
typedef
structtypedef
structvoid
main()
{{…}{…}{…}CIRCLE;LINE;POLY;·CIRCLEcircle[100];·LINEline[100];·POLYpoly[100];·
}实验指南-如何读写多种不同的形状类型-12020-03-1540保存这些形状信息时第一步要保存各种形状的数量文本模式:fprintf(fp,"%d%d%d\n",number_of_circle,number_of_line,number_of_poly);
二进制模式:fwrite(&number_o
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 44589-2024机器人自适应能力技术要求
- GB/T 44453-2024信息技术服务数字化转型跨灾种监测预警系统技术要求
- GB/T 29244-2024网络安全技术办公设备安全规范
- 同学30周年聚会活动方案(10篇)
- 初中高知识专项测试题附答案
- 2024安全管理技术竞赛(多选、判断)复习试题及答案
- 国开计算机文化基础第1章形考客观题题库2及答案
- 专题九软文营销(课件)职教高考电子商务专业《网络营销实务》
- 贵阳某教育公司中考九年级英语第一轮复习 语法专题精讲-动词 含答案
- 工程硕士研究生英语基础教程课后题语法翻译
- 机器视觉技术基础PPT完整全套教学课件
- 镜眼距对矫正视力的影响 省赛获奖
- 中建项目经济活动分析作业指导书
- 读后续写:爱与善良-面冷心热的老妇人 讲义-高考英语作文备考
- 新视野大学英语4第三版第四册第四单元教案演示教学
- 110KV变电站电气试验项目
- (鲁科版)五年级英语上册知识要点总复习
- 电除颤仪使用理论知识考核试题及答案
- 频率分布直方图专题训练
- 高一抽象函数专题
- 内部审计统计调查制度
评论
0/150
提交评论