华中科技大学C++实验总结报告(图形编辑器)
- 格式:doc
- 大小:36.50 KB
- 文档页数:6
华中科技大学计算机科学与技术学院《C语言程序设计》课程设计实验报告题目:科研项目信息管理系统专业:计算机班级:学号:姓名:成绩:指导教师:李开完成日期:2009年10 月20 日科研项目信息管理系统一、系统功能结构模块图二、数据结构设计及其用法说明typedef struct lakey{char name[30];/*团队名称*/int total;/*自然科学基金的科研项目数*/float dudu;/*经费数*/struct lakey *next;}*plakey;/*统计3中用到的数据结构*/typedef struct emmey{char name[30];/*团队名称*/int teacher;/*老师人数*/int harden;/*项目数*/float bizhi;/*比值*/struct emmey *next;}*pemmey;/*统计4中用到的数据结构*/typedef struct kPro{char code[15];/*项目编号*/char sort;/*项目种类*/int aking1;char time[8];/*项目时间*/float dudu;/*项目经费*/int aking2;char beiler[15];/*负责人*/int aking3;char keynoName[30];/*所在团队名称*/struct kPro *next;}harden,*pHarden;typedef struct Komo{int teacher;/*老师人数*/char name[20];/*院系名称*/int student;/*学生人数*/float bizhi;/*二者比值*/struct Komo *next;}*pKomo;/*统计1中用到的数据结构,统计结果放在这个数据结构中*/typedef struct kTea{char name[30];/*团队名称*/char beiler[15];/*负责人*/int stuNum;/*学生人数*/int aking2;int coco;/*老师人数*/char colName[20];/*所在院系的名称*/int aking1;struct kTea *next;pHarden child;}keyno,*pKeyno;typedef struct edward{char name[20];/*院系名称*/int totalnum;/*项目总数*/int num973;/*973项目数*/int num863;/*863项目数*/float amount;/*经费数*/struct edward *next;}*pedward;/*统计2中用到的数据结构*/typedef struct kCol{char name[20];/*院系名称*/int aking;char beiler[15];/*院系负责人*/struct kCol *next;char call[15];/*负责人电话号码*/pKeyno child;}kekey,*pKekey;三、程序结构四、各模块的功能1、pKekey Charge(pKekey alpha)/*这个函数将文件中的内容写入链表中*/2、pKekey temption(int aking,int aking1,int aking2,pKekey item1,pKeynoitem2,pHarden item3,pKekey alpha,int sort)/*这个函数用于向指定位置(aking)添加指定节点(item),alpha是头结点。
C++实验总结报告研究课题:图形编辑器学校:华中科技大学院系:班级:姓名:指导老师:一、实验目的1.熟悉C++的一些重要性质,利用封装、继承、虚函数和多态性等特性,通过实验学习如何对各类图元的属性和方法进行合理的封装2.学习Microsoft的Visual C++编程工具3.掌握MFC的相关知识4.掌握基本的文件保存、读取以及操作封装技术二、实验目的设计一个简单的图形编辑器三、实验所用仪器、设备计算机:PentiumIII 800 以上256M内存操作系统:Windows 2000/XP开发集成环境:Visual C++ 6.0四、软件功能简介(注:此软件是从网上下载得来)该软件具有汉化的菜单界面(仿Windows自带画图软件),具有文件打开、编辑、保存等功能。
编辑部分包括可以在编辑区域画直线、圆、矩形、曲线等矢量图形,可插入文字,可以修改线条的线型、颜色等基本属性。
五、部分代码分析1.直线类代码:class CCreateLine : public CCommand{private:Position m_begin; // 直线的起点Position m_end;// 直线的终点public:CCreateLine() ;~CCreateLine() ;int GetType();int OnLButtonDown(UINT nFlags, const Position& pos) ;int OnMouseMove(UINT nFlags, const Position& pos) ;int OnRButtonDown(UINT nFlags, const Position& pos) ;int Cancel() ;} ;学习C++我们最需要理解的就是它面向对象的设计思想。
这种思想可以在类和对象上得到充分的体现。
类是面向对象程序设计的核心,它实际上是由用户定义的一种新的复杂数据类型。
华中科技大学自动化学院《C语言程序设计》课程设计实验报告题目:南海军演模拟系统专业:测控班级: 1301学号: U201314492 U201314494姓名:柳焜剑杨渊超成绩:指导教师:周凯波完成日期:2014年11 月 1 日一系统功能结构模块及程序结构二各模块的功能1、maine();/*这个函数将第一张欢迎图片展示出来*/2、void init();/*画图初始化*/3、process0();process00();process01();process02();process03();process03A();process03B();/*实现各个界面的功能,通过if语句来执行不同的界面切换*/4、abc();form();bfjj1();bfjj2();bfjj3();help();/*画图函数以及返回mouse函数,通过返回到达不同界面下的不同按钮效果*/5、end/*结束函数 */6、outhz ()/*汉字和输入函数*7、menue();/*菜单函数,显示主菜单,四个按钮*/8 ……三试验结果1、主菜单页面2、军舰指导3、军演开始一、体会这是我们第一次做这么大型的且比较复杂的一个C程序,从暑假开始边看书边慢慢尝试到如今全部做出来花费了许多时间与精力。
以前接触到的C程序设计都是最简单、最基本的编程,就连最后的期末考试也只是一些小程序,并不像课程设计这样庞大复杂。
小程序是考察我们对基本概念的熟识,而这种大程序则是考察了我们对整体构架的设计以及各种小程序的拼接,看似不难,实则会遇到许多意想不到的困难,当然,这过程当中我们学到了许多。
后来经过网上的搜索资料以及和其他同学的讨论,对这个军演系统进行一些列分块,拆成几个部分,然后再逐个突破,这样显得有条理且方便。
接下来是真正开始动手写程序,随之而来的是一些列的问题,其中最困扰我的是内存模式。
在所有内核做好之后,接下来就是界面的问题,最开始的时候我考虑做图形界面,但是由于时间比较紧迫,不得不放弃,只好做了一个简易菜单,菜单设计容易,可是将界面和程序结合起来却又是一个难题。
课程实验报告课程名称:汇编语言程序设计实验实验名称:实验三程序执行时间与代码长度优化实验时间: 2016-4-5,14:00-17:30 实验地点:南一楼804室55号实验台指导教师:张勇专业班级:计算机科学与技术201409班学号:U201414813 姓名:唐礼威同组学生:无报告日期:2016年 4 月6日原创性声明本人郑重声明:本报告的内容由本人独立完成,有关观点、方法、数据和文献等的引用已经在文中指出。
除文中已经注明引用的内容外,本报告不包含任何其他个人或集体已经公开发表的作品或成果,不存在剽窃、抄袭行为。
特此声明!学生签名:日期:成绩评定指导教师签字:日期:目录1实验目的与要求 (1)2实验内容 (1)3实验过程 (2)3.1任务1 (2)3.1.1设计思想及存储单元分配 (2)3.1.2流程图 (3)3.1.3源程序 (3)3.1.4实验步骤 (7)3.1.5实验记录 (8)3.2任务2 (8)3.2.1设计思想及存储单元分配 (8)3.2.2流程图 (8)3.2.3源程序 (8)3.2.4实验步骤 (12)3.2.5实验记录 (12)3.3任务3 (13)3.3.1设计思想及存储单元分配 (13)3.3.2流程图 (13)3.3.3源程序 (14)3.3.4实验步骤 (14)3.3.5实验记录 (14)4体会 (14)参考文献 (15)1实验目的与要求(1) 熟悉汇编语言指令的特点,掌握代码优化的基本方法;(2) 理解高级语言程序与汇编语言程序之间的对应关系。
2实验内容任务1. 观察多重循环对CPU计算能力消耗的影响若有m个用户在同一台电脑上排队使用实验二的程序,想要查询“wangwu”这个学生的平均成绩,那就相当于将实验二的程序执行了m次。
为了观察从第一个用户开始进入查询至第m个用户查到结果之间到底延迟了多少时间,我们让实验二的功能二和功能三的代码重复执行m次,通过计算这m次循环执行前和执行后的时间差,来感受其影响。
华中科技大学计算机图形学实验报告——画直线、日地月模型计算机图形学基础实验报告专业:班级:姓名:学号:日期:OpenGL简介(1)OpenGL作为一个性能优越的图形应用程序设计界面(API),它独立于硬件和窗口系统,在运行各种操作系统的各种计算机上都可用,并能在网络环境下以客户/服务器模式工作,是专业图形处理、科学计算等高端应用领域的标准图形库。
它具有以下功能。
1. 模型绘制2. 模型观察在建立了三维景物模型后,就需要用OpenGL描述如何观察所建立的三维模型。
3. 颜色模式的指定OpenGL应用了一些专门的函数来指定三维模型的颜色。
4. 光照应用用OpenGL绘制的三维模型必须加上光照才能更加与客观物体相似。
5. 图象效果增强OpenGL提供了一系列的增强三维景观的图象效果的函数,这些函数通过反走样、混合和雾化来增强图象的效果。
6. 位图和图象处理OpenGL还提供了专门对位图和图象进行操作的函数。
7. 纹理映射8. 实时动画9. 交互技术应用软件OpenGL窗口系统操作系统图形硬件图1.1 OpenGL图形处理系统的层次结构(2)OpenGL的操作步骤在OpenGL中进行的图形操作直至在计算机屏幕上渲染绘制出三维图形景观的基本步骤如下:1. 根据基本图形单元建立景物模型,得到景物模型的数学描述(OpenGL 中把点、线、多边形、图像和位图都作为基本图形单元);2. 把景物模型放在三维空间中的合适的位置,并且设置视点(Viewpoint)以观察所感兴趣的景观;3. 计算模型中所有物体的色彩,同时确定光照条件、纹理粘贴方式等;4. 把景物模型的数学描述及其色彩信息转换至计算机屏幕上的像素,这个过程也就是光栅化(rasterization)。
在这些步骤的执行过程中,OpenGL可能执行其他的一些操作,例如自动消隐处理等。
另外,景物光栅化之后被送入帧缓冲器之前还可以根据需要对象素数据进行操作。
(3)OpenGL的组成OpenGL不是一种编程语言,而是一种API(应用程序编程接口),它实际上是一种图形与硬件的接口,包括了多个图形函数。
课程设计报告题目:航班时刻表信息查询系统课程名称: C语言程序设计专业班级:学号:姓名:指导教师:报告日期:计算机科学与技术学院毕业设计[论文]任务书姓名:班号:专业:计算机科学与技术同组姓名:指导教师:一、课题名称航班时刻表查询系统二、主要内容建立航班时刻表查询系统,提供创建、编辑和查询等基本功能和服务。
三、任务要求收集与阅读相关文献资料,确定系统目标与范围,分析系统需求,确定系统功能;设计系统方案,完成系统实现;提交《课程设计报告》。
四、系统功能系统主要提供航班信息的快速查询、检索和统计。
应该具有①按航班、按机场等查询信息的功能;②模糊条件检索航班信息;③统计航班座次情况等。
五、系统数据系统主要涉及“航班”、“经停机场”和“经停航班” 3类信息。
六、基本要求1)、只能使用C语言,源程序要有适当的注释,使程序容易阅读;2)、要有用户界面,要求至少采用教材p215-p216类似的简易菜单,鼓励采用文本菜单界面甚至采用图形菜单界面;3)、必须使用结构和十字交叉链表等数据结构;4)、使用文件保存数据;5)、至少输出一份报表(屏幕输出即可),鼓励自行增加新功能;6)、设计测试的模拟数据,完成系统测试;7)、写实验报告(要求正规打印,A4幅面)。
前言本C语言程序课程设计报告是由wt编写的。
本课程设计主要内容包括,内容中文摘要、Abstract(英文摘要)、正文、致谢、参考文献以及附录,其中: 正文主要内容有:一、系统功能模块,主要介绍该课程设计的航班时刻表查询系统的组成功能模块有哪些;二、数据结构设计及用法说明,主要是介绍说明本航班时刻表查询系统设计时用到的一些数据信息结构的设计思路和用法;三、程序结构流程图,用流程图的方式解释本课程设计中一些功能函数的设计思路和实现方法;四、各模块的功能,主要展示了本系统最终功能的解释说明;五、试验结果,主要展示了本航班时刻表查询系统最终功能的实现效果;六、体会,讲述作者在制作过程中的一些心得体会。
课程实验报告课程名称:计算机图形学专业班级:学号:姓名:指导教师:报告日期:2015-11-11计算机科学与技术学院实验一:分形图形绘制一、实验目的(标题四号黑体)(1)理解OpenGL 中glut 程序框架;(2)掌握二维基本图形绘制算法;(3)利用二维基本图形绘制算法,扩展对其他复杂图形的绘制理解。
二、实验内容1、实验算法(a)中点Bresenham算法画线a)输入直线的两个端点:端点、端点。
必要时交换A、B两点的坐标,使A点不在B点的右边。
令,,,b)讨论直线的斜率的大小及正负,分四种情况分别逐点画线:i.当最大位移方向为x轴。
构建判别公式:其中,初值。
当时,,。
当时,。
ii.当最大位移方向为x轴。
构建判别公式:其中,初值。
当时,,。
当时,。
iii.当最大位移方向为x轴。
构建判别公式:其中,初值。
当时,,。
当时,。
iv.当最大位移方向为x轴。
构建判别公式:其中,初值。
当时,,。
当时,。
c)当直线没有画完时重复b)步骤(b)绘制分形三角形a)输入三角形的三个端点:端点、端点、端点、递归层数n。
b)连接A、B、C三点。
c)当时,连接输入三角形三边的中点,将分割得到的四个三角形中包含顶点的三个、作为输入参数,递归调用本步骤。
2、源程序#include <iostream>#include <math.h>#include <GL/glut.h>#define ROUND(a) ((int )(a+0.5)) //求某个数的四舍五入值using namespace std;//全局变量声明:三角形三顶点及递归层数GLint Global_xa, Global_ya, Global_xb, Global_yb, Global_xc, Global_yc;int Global_n;void init(void){glClearColor(1.0, 1.0, 1.0, 0.0);//指定窗口的背景色为白色glMatrixMode(GL_PROJECTION);//对投影矩阵进行操作gluOrtho2D(0.0, 600.0, 0.0, 600.0);//使用正投影}//绘制直线的函数void lineDDA(GLint xa, GLint ya, GLint xb, GLint yb){GLint dx = xb - xa, dy = yb - ya; //计算x,y方向的跨距int steps, k; //定义绘制直线像素点的步数float xIcre, yIcre, x = xa, y = ya; //定义步长的增量//取X,Y方向跨距较大的值为步数if (abs(dx) > abs(dy)) steps = abs(dx);else steps = abs(dy);//根据步数来求步长增量xIcre = dx / (float)steps;yIcre = dy / (float)steps;//从起点开始绘制像素点for (k = 0; k <= steps; k++){glBegin(GL_POINTS);glVertex2f(x, y);glEnd();x += xIcre;y += yIcre;}}//绘制直线的函数(中点Bresenham算法)void lineBre(GLint xa, GLint ya, GLint xb, GLint yb){GLint dx, dy, d, UpIncre, DownIncre, x, y; //统一规定UpIncre为能使非最大位移方向坐标改变时的Di增量//统一规定DownIncre为不能使非最大位移方向坐标改变时的Di增量if (xa > xb) {/* 确保a点不在b点的右方*/x = xb; xb = xa; xa = x;y = yb; yb = ya; ya = y;}x = xa; y = ya; //计算画线起点dx = xb - xa; dy = yb - ya; //计算dx和dyif (abs(dx) >= abs(dy)){/* 考虑|k|<=1的情况*/if (dy >= 0) {/* 考虑k>=0的情况*/d = dx - 2 * dy; //计算D0UpIncre = 2 * dx - 2 * dy; DownIncre = -2 * dy; //计算UpIncre和DownIncrewhile (x <= xb) {/* 从线起点画到线终点*/glBegin(GL_POINTS);glVertex2i(x, y); // 在(x,y)位置画点glEnd();x++; //移动下一画点位置的x轴坐标if (d < 0) {/* 考虑Di<0的情况*/y++; //移动下一画点位置的y轴坐标d += UpIncre; //迭代d}else {/* 考虑Di>=0的情况*/d += DownIncre; //迭代d}}}else {/* 考虑k<0的情况*/d = -dx - 2 * dy; //计算D0UpIncre = -2 * dx - 2 * dy; DownIncre = -2 * dy; //计算UpIncre和DownIncrewhile (x <= xb) {/* 从线起点画到线终点*/glBegin(GL_POINTS);glVertex2i(x, y); // 在(x,y)位置画点glEnd();x++; //移动下一画点位置的x轴坐标if (d > 0) {/* 考虑Di>0的情况*/y--; //移动下一画点位置的y轴坐标d += UpIncre; //迭代d}else {/* 考虑Di>=0的情况*/d += DownIncre; //迭代d}}}}else {/* 考虑|k|>1的情况*/if (dy > 0) {/* 考虑k>0的情况*/d = 2 * dx - dy; //计算D0UpIncre = 2 * dx - 2 * dy; DownIncre = 2 * dx; //计算UpIncre和DownIncrewhile (y <= yb) {/* 从线起点画到线终点*/glBegin(GL_POINTS);glVertex2i(x, y); // 在(x,y)位置画点glEnd();y++; //移动下一画点位置的y轴坐标if (d > 0) {/* 考虑Di>0的情况*/x++; //移动下一画点位置的x轴坐标d += UpIncre; //迭代d}else {/* 考虑Di>=0的情况*/d += DownIncre; //迭代d}}}else {/* 考虑k<0的情况*/d = -2 * dx - dy; //计算D0UpIncre = -2 * dx - 2 * dy; DownIncre = -2 * dx; //计算UpIncre和DownIncrewhile (y >= yb) {/* 从线起点画到线终点*/glBegin(GL_POINTS);glVertex2i(x, y); // 在(x,y)位置画点glEnd();y--; //移动下一画点位置的y轴坐标if (d < 0) {/* 考虑Di>0的情况*/x++; //移动下一画点位置的x轴坐标d += UpIncre; //迭代d}else {/* 考虑Di>=0的情况*/d += DownIncre; //迭代d}}}}}void Triangle(GLint xa, GLint ya, GLint xb, GLint yb, GLint xc, GLint yc){// 绘制三角形// xa,ya;xb,yb;xc,yc;是三角形的三个顶点lineBre(xa, ya, xb, yb);lineBre(xb, yb, xc, yc);lineBre(xa, ya, xc, yc);}void Fractal(GLint xa, GLint ya, GLint xb, GLint yb, GLint xc, GLint yc, int n){GLint xaa, yaa, xbb, ybb, xcc, ycc; //获取三边中点的坐标xaa = (xb + xc) / 2;yaa = (yb + yc) / 2;xbb = (xa + xc) / 2;ybb = (ya + yc) / 2;xcc = (xa + xb) / 2;ycc = (ya + yb) / 2;if (n >= 1) {//递归Fractal(xa, ya, xbb, ybb, xcc, ycc, n - 1);Fractal(xb, yb, xaa, yaa, xcc, ycc, n - 1);Fractal(xc, yc, xaa, yaa, xbb, ybb, n - 1);Triangle(xaa, yaa, xbb, ybb, xcc, ycc); //连接三边中点}}void Fractal_Call(){// 绘制分形三角形// xa,ya;xb,yb;xc,yc;是三角形的初始顶点// n 是三角形的递归层数glClear(GL_COLOR_BUFFER_BIT);//设定颜色缓存中的值glColor3f(1.0, 0.0, 0.0); //设置直线颜色为红色Triangle(Global_xa, Global_ya, Global_xb, Global_yb, Global_xc, Global_yc);//连接三角形顶点Fractal(Global_xa, Global_ya, Global_xb, Global_yb, Global_xc, Global_yc, Global_n);//递归生成分形图形glFlush(); //立即执行}int main(int argc, char ** argv){glutInit(&argc, argv);//初始化GLUT库OpenGL窗口的显示模式glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(600, 600); //设置窗口的尺寸glutInitWindowPosition(100, 100); //设置窗口的位置glutCreateWindow("分形图形绘制");cout << "分形图形绘制" << endl;//输入直线的起点坐标cout << "please input the first point(xa,ya) of the Triangle(Integer that range from 0 to 600): " << endl;cin >> Global_xa;cin >> Global_ya;//输入直线的终点坐标cout << "please input the second point(xb,yb) of the Triangle(Integer range from 0 to 600): " << endl;cin >> Global_xb;cin >> Global_yb;//输入直线的终点坐标cout << "please input the last point(xc,yc) of the Triangle(Integer range from 0 to 600): " << endl;cin >> Global_xc;cin >> Global_yc;//输入直线的终点坐标cout << "please input the recursion layer(n) of the Triangle(Integer range greater than -1): " << endl;cin >> Global_n;init(); //初始化glutDisplayFunc(Fractal_Call); //执行画图程序glutMainLoop(); //启动主GLUT事件处理循环}3、实验结果图3-1 DDA算法绘制直线结果(k=1)图3-2 DDA算法绘制直线结果(k>1)图3-3 DDA算法绘制直线结果(k<-1)图3-4 DDA算法绘制直线结果(0>k>-1)图3-5 四层分形斜三角形图3-6 六层分形正三角形三、实验心得这次实验真的算是一次比较特殊的体验,因为这是我第一次在程序中完全地依赖数学编写程序。
科技成果信息管理系统C语言课程设计实验报告华中科技大学计算机科学与技术学院《C语言程序设计》课程设计基础部分实验报告题目:科技成果信息管理系统专业:计算机科学与技术目录一、系统功能结构设计 (1)二、数据结构设计 (1)三、程序结构 (4)四、函数原型及功能 (9)五、试验结果 (13)六、实验体会 (29)七、附录1:参考文献 (31)八、附录2:程序清单 (31)一、系统功能结构设计航科技成果信息管理系统由五大功能模块组成:文件模块,编辑模块,查询模块,统计模块,帮助模块。
如下图所示:二、数据结构设计1.单位信息链结点结构(DEPT_NODE)及用法typedef struct dept_node{char number[8]; /*单位编号*/char name[30]; /*单位名称*/char PIC[20]; /*负责人*/struct dept_node *next; /*指向下一结点*/struct archs_node *achs; /*指向科技成果信息链结点的指针*/GtkTreeIter iter; /*treeview中对应treeiter*/} DEPT_NODE;2.科技成果信息链结点结构(ACHS_NODE)及用法typedef struct achs_node{char number[12]; /*成果编号*/char name[50]; /*成果名称*/char field[20]; /*所属技术领域*/char first_dept_name[30]; /*第一完成单位*/char first_dept_number[8]; /*第一完成单位编号*/char first_member_name[20]; /*第一完成人*/char award_name[30]; /*获奖名称*/char award_level[10]; /*获奖档次*/char award_grade[10]; /*获奖等级*/struct arhs_node *next; /*指向下一节点*/struct member_node *members; /*指向完成人员信息结点的指*/GtkTreeIter iter; /*treeview中对应treeiter*/ } ACHS_NODE;3.完成人员信息链结点结构(MEMBER_NODE)及用法typedef struct member_node{char number[18]; /*身份证号*/char name[20]; /*姓名*/char dept_name[30]; /*工作单位*/char sex[4]; /*性别*/int age; /*年龄*/char title[15]; /*职称*/int rank; /*成果排名*/char achs_name[40]; /*所属成果名称*/struct member_node *next;/*指向下一个结点*/GtkTreeIter iter; /*treeview中对应treeiter*/ } MEMBER_NODE;4.三方向的十字交叉链表结构5.登陆窗体控件结构体(wgt)及用法struct login_widget{GtkWidget *window; //主窗体GtkWidget *label_tips; //用于信息提示的标签GtkWidget *button_login; //两个按钮,一个点击后登录,一个点击后退出GtkWidget *button_exit;GtkWidget *entry_username; //两个文本框,用于输入用户名和密码GtkWidget *entry_pwd;GtkWidget *label_username; //两个标签用于显示username文本框和password文本框提示GtkWidget *label_pwd;GtkWidget *vbox; //垂直布局盒子,包含以下三个水平布局盒子GtkWidget *hbox_username; //包含用户名提示标签和用户名文本框,下面的HBOX作用类似GtkWidget *hbox_pwd;GtkWidget *hbox_button;} wgt;说明:将登陆窗体相关控件独立成一个结构体6.指向3种节点的指针联合及用法typedef union nodep{struct dept_node *dept;struct achs_node *achs;struct member_node *member;} nodep;说明:用于3种结构都会用到但不会同时用到的情形7.两个传递参数的结构及其用法struct nodecreate{GtkWidget *window;GtkWidget *entry[9];nodep unp;int type;};struct query_judge{GtkWidget *entry;int flag;};说明:GTK信号连接g_signal_connected将函数与信号链接后之内传递一个参数给函数,所以定义这两个结构分别将几个参数结合在一起传递三、程序结构1.主程序运行流程2.数据保存流程3.添加流程4.单位查询流程5.统计50开始Y四、函数原型及功能(所有GtkWidget *button参数均为与消息链接用)1.登陆模块//功能:登录框初始化函数//输入参数://返回值:无void init_login_widget()//功能:登录验证函数,点击login按钮时调用//输入参数://返回值:无void login(GtkWidget *widget,gpointer data)2.图形界面模块/**初始化部分变量,再依次调用各函数初始化界面各部分*/int main( int argc, char *argv[])/**初始化菜单栏*/void init_menubar(GtkWidget *menubar)/**初始化目录*/void create_view_and_model (void)/**初始化显示栏*/void init_show(GtkWidget *list)/**改变状态栏及显示栏*/void on_changed(GtkWidget *widget, gpointer statusbar)//功能:将选中的节点信息在显示栏中显示出来//输入参数:iter//返回值:无int Show_Node(GtkTreeIter iter)//值传递不影响selectediter/**对应3个节点显示的3个函数,返回对应GtkListStore*/GtkListStore *Show_Dept(char *name);GtkListStore *Show_Achs(char *name,char *P_name);GtkListStore *Show_Member(char *name,char *P_name,char *PP_name);3.文件模块//功能:读取数据文件//输入参数://返回值:re 的二进制前3位记录了三个数据文件是否成功打开,1为成功int LoadData(GtkWidget *button)//功能:读取数据文件中数据到链表中//输入参数:phead 单位节点头指针的地址//返回值:re 的二进制前3位记录了三个数据文件是否成功打开,1为成功int LoadList(DEPT_NODE **phead)//功能:将链表中节点添加到左侧树状列表中//输入参数://返回值:void rebuildtree()//功能:存储数据文件//输入参数://返回值:flag 的二进制前3位记录了三个数据文件是否成功打开,1为成功int SaveData(GtkWidget *button)//功能:将链表中数据存储在数据文件中//输入参数:phead单位节点头指针//返回值:flag 的二进制前3位记录了三个数据文件是否成功打开,1为成功int SaveList(DEPT_NODE *phead)//功能:推出前提示保存//输入参数://返回值:void quit_save(GtkWidget *button)4.查询模块//功能:根据type弹出一个查询框,再分别调用对应的Query函数//输入参数:type对应枚举的几种类型//返回值:无void Query_info(GtkWidget *button,int type)//功能:查询学院//输入参数:in 包含iter和名称的结构//返回值:无void Query_Dept(GtkWidget *button,struct query_judge *in)//功能:根据type弹出一个查询框,再分别调用对应的Query函数//输入参数:type对应枚举的几种类型//返回值:无void Query_info(GtkWidget *button,int type)//功能:查询完成人员//输入参数:in 包含iter和名称的结构//返回值:无void Query_Member(GtkWidget *button,struct query_judge *in)//功能:展开并跳转至指定iter//输入参数:iter treeview中的一个目标iter//返回值:无void expand_select(GtkTreeIter iter)//功能:按名称搜索单位//输入参数:D_name 单位名称//返回值:单位节点指针DEPT_NODE *DEPT_search(char *D_name)//功能:按名称搜索科技成果节点//输入参数:A_name 科技成果节点名称,ACHS 所在学院头科技成果节点指针//返回值:科技成果节点节点指针ACHS_NODE *ACHS_search(char *A_name,ACHS_NODE *ACHS)//功能:按名称搜索完成人员节点//输入参数:M_name 完成人员节点名称,ACHS 所属科技成果头完成人员节点指针//返回值:完成人员节点节点指针MEMBER_NODE*MEMBER_search(char*M_name,MEMBER_NODE*MEMBER)5.添加模块//功能:弹出一个输入框//输入参数:type对应枚举的几种类型//返回值:无void entry_info(GtkWidget *button,int type)//功能:添加3种节点统一函数,由entry_info确定按钮调用//输入参数://返回值:无void Add_node(GtkWidget *button,struct nodecreate *nodec)//功能:插入科技成果节点函数,由Add_Node中情况3调用//输入参数:pNew 指向新节点的指针//返回值:对应单位节点指针DEPT_NODE *insert_ACHS(ACHS_NODE *pNew)//功能:插入完成人员节点函数,由Add_Node中情况4调用//输入参数:pNew 指向新节点的指针//返回值:对应科技成果节点指针ACHS_NODE *insert_MEMBER(MEMBER_NODE *pNew)6.删除模块//功能:删除3种节点统一函数,由“删除”按钮调用//输入参数://返回值:无void Del_Node(GtkWidget *button)//功能:删除单位节点,由Del_Node函数case 2调用//输入参数:name 单位名称//返回值:int 1为有错,0为正常int Del_Dept(char *name)//功能:删除科技成果节点,由Del_Node函数case 2调用//输入参数:name 科技成果名称,P_name 对应单位名称//返回值:int 1为有错,0为正常int Del_Achs(char *name,char *P_name)//功能:删除完成人员节点,由Del_Node函数case 4调用//输入参数:name 完成人员名称,P_name 对应科技成果名称,PP_name 对应单位名称//返回值:int 1为有错,0为正常int Del_Member(char *name,char *P_name,char *PP_name)7.编辑模块//功能:弹出一个编辑框//输入参数://返回值:无int Edit_info(GtkWidget *button)//功能:编辑节点//输入参数://返回值:无void Edit_Node(GtkWidget *button,struct nodecreate *nodec)8.统计模块//功能:弹出一个统计框,由传入参数设置具体内容//输入参数:title 统计框标题,col1 第一列标题,col2 第二列标题,in 传入的model//返回值:无void Statis_info(char *title,char *col1,char *col2,GtkListStore *in)//功能:统计各单位科技成果数量,调用Statis_info显示统计结果//输入参数://返回值:无void statis_func1(GtkWidget *button)//功能:统计各单位完成人员成果排名,调用Statis_info显示统计结果//输入参数://返回值:无void statis_func2(GtkWidget *button)//功能:统计所有50岁以下第一完成人,调用Statis_info显示统计结果//输入参数://返回值:无void statis_func3(GtkWidget *button)9.帮助模块//功能:弹出软件信息及作者信息//输入参数://返回值:无void help_about(GtkWidget *button)五、试验结果编译环境:Ubuntulinux64位MingwGcc(源代码配置好后可跨平台编译)GTK版本:GTK+2.41开发IDE:Codeblocks 12.111.系统登陆输对自动进入输错显示错误2.登陆成功进入主界面3.全屏模式4.读取数据(标准gnome菜单栏在最上面)5.读取成功点击相应节点右侧显示相关信息6.添加单位(添加成功提示)9.添加错误返回信息10.编辑结点(选中节点后点击左下角编辑按钮)更改生效11.删除节点弹出确认框删除成功12.查询单位查询成功,左侧已跳转至并展开机械学院13.查询科技成果查询成功,左侧已跳转至并展开网络磁盘阵列未查询到时弹出提示14.查询完成人员从头查询,跳转至并展开第一个张江点击查询,跳转至并展开第二个张江15.统计各单位科技成果总数及各类成果数16.统计各单位成果排名17.统计50岁以下第一完成人18.软件信息及作者信息19.退出前提示保存六、实验体会首先我看了一下实验书上的编程规范和几个基本模块的实现思想,但当我开始做的时候我发现光用face.c自己看不懂文本菜单操作肯定会有很多问题的,于是我想同样是学,不如直接学图形界面的开发。
C++
实验总结报告
研究课题:图形编辑器
学校:华中科技大学
院系:
班级:
姓名:
指导老师:
一、实验目的
1.熟悉C++的一些重要性质,利用封装、继承、虚
函数和多态性等特性,通过实验学习如何对各类
图元的属性和方法进行合理的封装
2.学习Microsoft的Visual C++编程工具
3.掌握MFC的相关知识
4.掌握基本的文件保存、读取以及操作封装技术
二、实验目的
设计一个简单的图形编辑器
三、实验所用仪器、设备
计算机:PentiumIII 800 以上
256M内存
操作系统:Windows 2000/XP
开发集成环境:Visual C++ 6.0
四、软件功能简介
(注:此软件是从网上下载得来)
该软件具有汉化的菜单界面(仿Windows自带画图软件),具有文件打开、编辑、保存等功能。
编辑部分包括可以在编辑区域画直线、圆、矩形、曲线等矢量图
形,可插入文字,可以修改线条的线型、颜色等基本属性。
五、部分代码分析
1.直线类代码:
class CCreateLine : public CCommand
{
private:
Position m_begin; // 直线的起点
Position m_end;// 直线的终点
public:
CCreateLine() ;
~CCreateLine() ;
int GetType();
int OnLButtonDown(UINT nFlags, const Position& pos) ;
int OnMouseMove(UINT nFlags, const Position& pos) ;
int OnRButtonDown(UINT nFlags, const Position& pos) ;
int Cancel() ;
} ;
学习C++我们最需要理解的就是它面向对象的设计思想。
这种思想可以在类和对象上得到充分的体现。
类是面向对象程序设计的核心,它实际上是由用户定义的一种新的复杂数据类型。
它是通过抽象数据类型ADT方法来实现的一种数据类型,
将不同类型的数据和与这些数据相关的操作封装在一起形成一个集合体。
因此,它具有更高的抽象性,实现了信息的隐藏和封装。
对象是某种类的一个实例,是类的具体体现。
一个类可以有多个对象。
分析这一段代码,编程者将直线的起始点和终止点设置为私有成员,这样做就对整条直线实现了隐藏和保护,是面向对象中封装特性的一个具
体体现;另外,此函数中还包含了构造函数与析构函数,构造函数完成对
新对象的初始化工作,析构函数是构造函数的配对物,它实现与构造函数
相反的功能。
另外的几个成员函数名称形参返回值都与class Ccommand 中
的几个公有函数相同,而在class Ccommand中,这几个函数都是虚函数,这是函数重载,也是多态性的具体体现。
由这段代码我们可以了解关于类和对象的一些知识,为我们进一步了
解面向对象程序设计的思想精髓奠定了基础。
2.对构造函数和解析函数的分析
构造函数
CCreateLine::CCreateLine()
: m_begin(0,0), m_end(0,0)
{
m_nStep = 0; // 初始化操作步为0
}
此构造函数用初始化列表的方式对直线类的私有成员进行初始化,同时记下操作步m_nStep是直线类从指令类中继承来的成员,它在指令类中属于保护成员,在直线类中则成为私有成员。
这是数据共享与数据保护两者兼顾时的一种处理方法。
析构函数
CCreateLine::~CCreateLine()
{
}
此析构函数中没有任何操作语句,但它并非没有任何操作。
在任何一个对象消失时都要调用本类的析构函数进行扫尾工作。
在构造对象时,构造函数分配资源给程序,在对象作用结束后,这些资源的释放就要靠析构函数。
当然析构函数中也是可以有语句的,当需要在对象消失之前执行某种操作时,可以把语句写在里边。
3.
BOOL Cline::Pick(const Position&pos,const double pick_radius)
{
Position objPos=pos;
BOX2D sourceBox,desBOX;
GetBox(&sourceBox);
desBox.min[0]=sourceBox.min[0]-pick_radius;
desBox.min[1]=sourceBox.min[1]-pick_radius;
desBox.max[0]=sourceBox.max[0]+pick_radius;
desBox.max[1]=sourceBox.min[1]+pick_radius;
if(!objPos.lslnBox(desBox))
return FALSE;
double angle=::GetAngleToXAxis(m_begin,m_end);
Position dp =objPos-m_begin;
Double dist = fabs(dp.x*cos(angle)+dp.y*sin(angle)-objPos.Distance(m_begin));
if(dist<=pick_radius)
return TRUE;
return FALSE;
}
在阅读此函数的源代码过程中,我感觉到对类创建的合理划分对整个程序具有
着十分重要的意义。
正如上段代码,它的前提是对类进行了合理的划分,只有
在对类进行了合理的划分后,我们才能更加高效地处理对象。
所以,我感觉到
在学习面向对象程序设计时,应当尤为注意类的创建与划分。
六、个人学习体会
在学习C++以前,我认为C++只是在C语言的基础上的一种延伸,认为只要学过C语言,就可以用C语言的那种设计思想来学习C++、设计C++程序。
正是由于抱了这种错误的思想,使我在一开始学习
C++的时候遇到了很大的困难,我没有办法体会面向对象的设计思想,我在学习这门课的时候老是想着实现这个函数功能的具体过程,而没
太注意对象分类的重要性。
随着课程学习的深入,我感觉到了利用类和对象、继承、封装等一系列知识可以把我们程序中很多繁杂、重复的部分省略掉,还可以
解决一些利用面向过程的设计思想无法解决的问题,我自己也试着编
写一些小的C++程序,当然在这个过程中遇到了很多困难,其中调试
带来的困难让我无法忘记,在调试程序的同时,我也总结出来了一些
调试的小技巧,让我在C语言课程设计中也受用匪浅。
在学习这门课的过程中,我感受到了自己亲自动手编程序、调程序的重要性,我们要熟悉C++的语法、体会调试的思想,最好的一个
手段就是自己动手编程、调试,这会比我们一味的看书效果好得多。
另外,我还感觉到一个好的程序编出来需要很多人的团结合作。
我在检查自己编写的程序是否有BUG未被找出的时候,我会让我的同学作为一个程序使用者来找出未发现的BUG并提出改进意见,这让我们的工作更加高效。
很高兴能够了解到C++的神奇魅力和面向对象程序设计的独特思想,它为我今后的程序设计奠定了基础。
感谢老师对我们的悉心教授!。