CPP课程设计三角形.doc_第1页
CPP课程设计三角形.doc_第2页
CPP课程设计三角形.doc_第3页
CPP课程设计三角形.doc_第4页
CPP课程设计三角形.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

C+程序设计课程设计一、目的在C+程序设计课程学习和课程实验的基础上,利用Visual C+6.0 MFC编程,实现一个交互绘图程序。通过一定代码量的实际编程,巩固、加深C+概念的理解,提高面向对象编程技术的水平和熟练度,检验C+程序设计课程的学习效果,为后续专业课程的学习奠定程序设计基础。二、任务与要求利用Visual C+6.0 MFC编程创建单文档多视应用程序框架,用鼠标点击屏幕交互生成三角形,并绘制三角形的外接圆和内切圆,程序运行界面参见下图。要求:(1) 用链表记录生成的三角形;(2) 三角形类中包含顶点、边长、外接圆半径、内切圆半径及圆心等数据成员;(3) 生成的三角形可以存盘/读出。 程序的基本代码量约为500行,在此基础上可进一步发挥个人的想象力、创造力,为程序添加新的功能,使程序的总量大于1000行。供参考的功能有:(1) 图形的放大与缩小;(2) 图形的移动/旋转/拷贝;(3) 三角形质量的统计分析(内切圆半径与最长边之比);(4) 三角形信息的列表显示;(5) 修改图形的线型/线宽/颜色等。三、步骤与参考资料(1) 创建单文档、多视应用程序框架;(2) 设计点、线段、三角形类(CPoint2D、CLine、CTriangle代码参见附录);(3) 设计菜单:在WorkSpace中选ResourceView的“Menu”,双击IDR_MAINFRAME,就会出现主菜单,在其中添加如图所示的菜单项。添加的菜单(4) 菜单命令映射:给每个子菜单取一个合适的ID号,如:ID_MENU_DRAW_TRIANGLE、ID_MENU_DISPLAY、ID_MENU_SAVE_TRIANGLE、ID_MENU_READ_TRIANGLE,在子菜单上击鼠标右键,选ClassWizard,选菜单的ID号,再选Command,最后点击Add Function按钮,添加消息映射函数。依次添加所有菜单命令的消息映射函数。命令映射到视口类中本例中画三角形子菜单的ID(5) 鼠标消息映射:在具体实现各个子菜单的消息映射函数前,本例需要解决生成三角形的问题。用鼠标在视口中交互绘制三角形需要映射鼠标动作的消息响应函数,在ClassWizard中选择视口类添加鼠标左键、右键、移动WM_LBUTTONDOWN、WM_RBUTTONDOWN、WM_MOUSEMOVE的响应函数,其中要自己写入交互画三角形的代码,重点是鼠标移动过程中的异或;鼠标消息是标准的,直接从对话框右列表框中选。注意(6) 响应鼠标动作交互画三角形的代码:void CTriangleView:OnLButtonDown(UINT nFlags, CPoint point) /以下均为自己添加的程序代码CPoint2D p;CDC *pDC=GetDC();CPen newpen(PS_SOLID,1,RGB(0,255,255);CPen *pOldpen=pDC-SelectObject(&newpen);pDC-SetROP2(R2_XORPEN); /异或状态画图if(drawflag=1)/表示进入画图状态p.x=point.x; p.y=point.y; if(Pointnum%3=0)pTriangle=new CTriangle;/画十字pDC-MoveTo(point.x,point.y-5);pDC-LineTo(point.x,point.y+5);pDC-MoveTo(point.x-5,point.y);pDC-LineTo(point.x+5,point.y);if(Pointnum=0) /第一次点击鼠标左键pTriangle-setTriVertax(p);Pointnum+;pDC-MoveTo(pTriangle-p1.x,pTriangle-p1.y);pTriangle-p2.x=point.x;pTriangle-p2.y=point.y;pDC-LineTo(pTriangle-p2.x,pTriangle-p2.y);else if(Pointnum=1) /第二次点击鼠标左键pTriangle-p2.x=point.x;pTriangle-p2.y=point.y;Pointnum+;else/第三次点击鼠标左键pTriangle-setTriVertax(p);/把十字异或pDC-MoveTo(pTriangle-p1.x,pTriangle-p1.y-5); pDC-LineTo(pTriangle-p1.x,pTriangle-p1.y+5);pDC-MoveTo(pTriangle-p1.x-5,pTriangle-p1.y);pDC-LineTo(pTriangle-p1.x+5,pTriangle-p1.y);pDC-MoveTo(pTriangle-p2.x,pTriangle-p2.y-5);pDC-LineTo(pTriangle-p2.x,pTriangle-p2.y+5);pDC-MoveTo(pTriangle-p2.x-5,pTriangle-p2.y);pDC-LineTo(pTriangle-p2.x+5,pTriangle-p2.y);pDC-MoveTo(pTriangle-p3.x,pTriangle-p3.y-5);pDC-LineTo(pTriangle-p3.x,pTriangle-p3.y+5);pDC-MoveTo(pTriangle-p3.x-5,pTriangle-p3.y);pDC-LineTo(pTriangle-p3.x+5,pTriangle-p3.y); pTriangle-draw(); /画三角形m_pdlg=new CDlgTriangle(this);CString str1,str2,str3,str4,str5,str6,str7,str8,str9,str10;str1.Format(%.2f,pTriangle-a);m_pdlg-m_a=str1;对话框获得数据str2.Format(%.2f,pTriangle-b); m_pdlg-m_b=str2;str3.Format(%.2f,pTriangle-c); m_pdlg-m_c=str3;str4.Format(%.2f,pTriangle-RcenPoint.x);m_pdlg-m_Rx=str4;str5.Format(%.2f,pTriangle-RcenPoint.y);m_pdlg-m_Ry=str5;str6.Format(%.2f,pTriangle-R); m_pdlg-m_R=str6;str7.Format(%.2f,pTriangle-rcenPoint.x);m_pdlg-m_rx=str7;str8.Format(%.2f,pTriangle-rcenPoint.y);m_pdlg-m_ry=str8;str9.Format(%.2f,pTriangle-r); m_pdlg-m_r=str9;m_pdlg-m_x1=pTriangle-p1.x;m_pdlg-m_y1=pTriangle-p1.y;m_pdlg-m_x2=pTriangle-p2.x;m_pdlg-m_y2=pTriangle-p2.y;m_pdlg-m_x3=pTriangle-p3.x;m_pdlg-m_y3=pTriangle-p3.y;str10.Format(%.2f,pTriangle-triArea();m_pdlg-m_s=str8;m_pdlg-Create(IDD_TRIANGLE,this); CTriangleDoc *pDoc=GetDocument();if(pDoc-ptrHead=NULL)新生成的三角形添加到链表 pDoc-ptrHead=pTriangle;pTriangle-last=pTriangle;elsepDoc-ptrHead-last-next=pTriangle;pTriangle-last=pDoc-ptrHead-last;pDoc-ptrHead-last=pTriangle;pTriangle-next=pDoc-ptrHead;Pointnum=0; pDC-SelectObject(pOldpen);CView:OnLButtonDown(nFlags, point);/右击之后不再画图drawflag变为0void CTriangleView:OnRButtonDown(UINT nFlags, CPoint point) if(drawflag)drawflag=0;Pointnum=0;CView:OnRButtonDown(nFlags, point);void CTriangleView:OnMouseMove(UINT nFlags, CPoint point) /鼠标移动过程中,总是先异或前次画的图,再画新位置的图,交替更换就形成动态if(drawflag=1&(Pointnum=1|Pointnum=2)CClientDC dc(this);CPen pen(PS_SOLID,1,RGB(0,255,255); CPen *pOldpen=dc.SelectObject(&pen);dc.SetROP2(R2_XORPEN);if(Pointnum=1)dc.MoveTo(pTriangle-p1.x,pTriangle-p1.y);dc.LineTo(pTriangle-p2.x,pTriangle-p2.y);pTriangle-p2.x=point.x; pTriangle-p2.y=point.y;dc.MoveTo(pTriangle-p1.x,pTriangle-p1.y);dc.LineTo(point.x,point.y);elsedc.MoveTo(pTriangle-p2.x,pTriangle-p2.y);dc.LineTo(pTriangle-p3.x,pTriangle-p3.y);dc.MoveTo(pTriangle-p1.x,pTriangle-p1.y);dc.LineTo(pTriangle-p3.x,pTriangle-p3.y);pTriangle-p3.x=point.x; pTriangle-p3.y=point.y;dc.MoveTo(pTriangle-p2.x,pTriangle-p2.y);dc.LineTo(pTriangle-p3.x,pTriangle-p3.y);dc.MoveTo(pTriangle-p1.x,pTriangle-p1.y);dc.LineTo(pTriangle-p3.x,pTriangle-p3.y);dc.SelectObject(pOldpen);CView:OnMouseMove(nFlags, point);(7) 对话框显示生成三角形的信息void CTriangleView:OnDisplay() m_pdlg-ShowWindow(SW_SHOW);/本例用的是无模式对话框,可用有模式对话框 /自己写(8) 链表保存与读出void CTriangleView:OnFilesave() CString filename;CFileDialog dlg(FALSE,txt,NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,txt 文件(*.txt)|*.txt|All Files(*.*)|*.*|);if(dlg.DoModal() = IDOK)filename = dlg.GetPathName();else return;/此处自己添加写链表数据的代码void CTriangleView:OnRead() CString filename;CFileDialog dlg(TRUE,txt,NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,txt 文件(*.txt)|*.txt|All Files(*.*)|*.*|);if(dlg.DoModal() = IDOK)filename = dlg.GetPathName();else return;/此处自己添加读链表数据的代码CClientDC dc(this);this-OnDraw(&dc);四、课程设计评估序号内 容比例要求1课程设计报告与文档30%2程序运行的有效性50%3程序设计规范性10%4程序注释10%注:最终评分=上述表项得分系数(代码量、功能)五、供参考的资料(备注:下列代码仅供参考,不一致或不合理之处可在课程设计当中加以改进)链表节点类的设计class EsLinkNodepublic:EsLinkNode*next,*last;public:EsLinkNode();virtual EsLinkNode();EsLinkNode * GetNext();EsLinkNode * GetLast(); void LinkAfter(EsLinkNode *newNode);void LinkBefore(EsLinkNode *newNode);/virtual EsLinkNode *NewNode();friend class EsLink;public:virtual BOOL Read(FILE *pfile);virtual BOOL Write(FILE *pfile);链表节点类的实现EsLinkNode:EsLinkNode() next=(EsLinkNode *)NULL; last=(EsLinkNode *)NULL; /LinkNode specific initialization goes here/destruct functionEsLinkNode:EsLinkNode() next=(EsLinkNode *)NULL; last=(EsLinkNode *)NULL;EsLinkNode *EsLinkNode:GetNext() return next;EsLinkNode *EsLinkNode:GetLast() return last;void EsLinkNode:LinkAfter(EsLinkNode *newNode) newNode-next=next; next=newNode; newNode-last=this; newNode-next-last=newNode;void EsLinkNode:LinkBefore(EsLinkNode *newNode) newNode-last=last; last=newNode; newNode-next=this; newNode-last-next=newNode;BOOL EsLinkNode:Read(FILE *pfile) return TRUE;BOOL EsLinkNode:Write(FILE *pfile) return TRUE;CPoint2D类的设计class CPoint2D:public CObjectpublic:double x,y;public:CPoint2D() x=-1e10; y=-1e10;CPoint2D(double x,double y)this-x=x; this-y=y;CPoint2D()void operator=(CPoint2D &p) x=p.x; y=p.y; ;CLine类的设计class CLine:public CObjectpublic:double A,B,C; /直线方程系数public: CLine() A=0; B=0; C=0; CLine(double NA,double NB,double NC) A=NA; B=NB; C=NC; CLine();CTriangle类的设计class CTriangle:public CObject,public EsLinkNodepublic:CPoint2D p1,p2,p3; /三角形顶点 double a,b,c; /三角形边长 double R,r; /三角形外接圆半径和内切圆半径 CPoint2D RcenPoint,rcenPoint; /三角形外接圆和内切圆的圆心public:CTriangle();CTriangle(CPoint2D p1,CPoint2D p2,CPoint2D p3);CTriangle(double x1,double y1,double x2,double y2,double x3,double y3);CTriangle()private:bool InterOfTwoLine(CLine &line1,CLine &line2,CPoint2D &intPoint);public:void setTriVertax(CPoint2D &p); /设置顶点void triEdgeLength(); /计算边长double triArea(); /计算面积void Circum(); /计算外接圆圆心 void InscribedCircle(); /计算内切圆圆心void draw();BOOL Read(FILE *pfile);BOOL Write(FILE *pfile);/计算两条直线的交点bool CTriangle:InterOfTwoLine(CLine &line1,CLine &line2,CPoint2D &intPoint) if(line1.A*line2.B=line1.B*line2.A)AfxMessageBox(两直线平行,求交不成功!);return false;double temp=line1.B*line2.A-line1.A*line2.B;intPoint.x=(line1.C*line2.B-line1.B*line2.C)/temp;intPoint.y=(line1.A*line2.C-line1.C*line2.A)/temp;return true;void CTriangle:Circum()/计算外接圆圆心公式/计算外接圆半径if(a=-1e10)triEdgeLength();double temp=triArea();R=a*b*c/(4.0*temp);CLine L1,L2;L1.A=p2.x-p1.x;L1.B=p2.y-p1.y;L1.C=(p1.y*p1.y-p2.y*p2.y+p1.x*p1.x-p2.x*p2.x)*0.5000;L2.A=p2.x-p3.x;L2.B=p2.y-p3.y;L2.C=(p3.y*p3.y-p2.y*p2.y+p3.x*p3.x-p2.x*p2.x)*0.5000; InterOfTwoLine(L1,L2,RcenPoint);void CTriangle:InscribedCircle()/计算内切圆圆心公式/计算内切圆半径if(a=-1e10)triEdgeLength();double p;p=(a+b+c)*0.5;r=sqrt(p-a)*(p-b)*(p-c)/p);double temp;temp=a+b+c;rcenPoint.x=(a*p3.x+b*p1.x+c*p2.x)/temp;rcenPoint.y=(a*p3.y+b*p1.y+c*p2.y)/temp;void CTriangle:draw()Circum();InscribedCircle();CMDIFrameWnd *pFrame =(CMDIFrameWnd *) AfxGetApp()-m_pMainWnd; CMDIChildWnd *pChild =(CMDIChildWnd *) pFrame-GetActiveFrame(); CTriangleView *pView = (CTriangleView *) pChild-GetActiveView();CDC *pDC=pView-GetDC();pDC-MoveTo(p1.x,p1.y);pDC-LineTo(p2.x,p2.y);pDC-LineTo(p3.x,p3.y); pDC-LineTo(p1.x,p1.y);CBrush *pBrush=CBrush:FromHandle(HBRUSH)GetStockObject(NULL_BRUSH);CBrush *pOldBrush=pDC-SelectObject(pBrush);pDC-Ellipse(int(RcenPoint.x-R+0.5),int(RcenPoint.y-R+0.5),int(RcenPoint.x+R+0.5),int(RcenPoint.y+R+0.5);pDC-Ellipse(int(rcenPoint.x-r+0.5),int(rcenPoint.y-r+0.5),int(rcenPoint.x+r+0.5),int(rcenPoint.y+r+0.5);pDC-SelectObject(pOldBrush);pView-ReleaseDC(pDC);BOOL CTriangle:Read(FILE *pfile)if(pfile)/fscanf(pfile,%f %f %f %f %f %fn,&p1.x,&p1.y,&p2.x,&p2.y,&p3.x,&p3.y);float x1=0,y1=0,x2=0,y2=0,x3=0,y3=0,RR=0,RcenPoint_x,RcenPoint_y,rr=0,rcenPoint_x,rcenPoint_y;int flag = fscanf(pfile,%f %f %f %f %f %f %f %f %f %f %f %f,&x1,&y1,&x2,&y2,&x3,&y3,&RcenPoint_x,&RcenPoint_y,&RR,&rcenPoint_x,&rcenPoint_y,&rr);if(flag != -1)p1.x = x1; p1.y = y1;p2.x = x2; p2.y = y2;p3.x = x3; p3.y = y3;RcenPoint.x = RcenPoint_x;RcenPoint.y = RcenPoint_y;R = RR;rcenPoint.x = rcenPoint_x;rcenPoint.y = rcenPoint_y;r = rr;return 1;return -1;elsereturn 0;BOOL CTriangle:Write(FILE *pfile)if(pfile)fprintf(pfile,%f %f %f %f %f %f %f %f %f %f %f %fn,p1.x,p1.y,p2.x,p2.y,p3.x,p3.y,RcenPoint.x,RcenPoint.y,R,rcenPoint.x,rcenPoint.y,r);return 1;elsereturn 0;void CTriangleView:OnDisplay() m_pdlg-ShowWindow(SW_SHOW);void CTriangleView:OnFilesave() /*if(drawflag=0) int numnote=oblist.GetCount();ofstream outfile;outfile.open(out.txt,ios:app);if(!outfile)MessageBox(Cannot open the file!);elseoutfilenumnoteendl;POSITION pos;pos=oblist.GetHeadPosition(); for(int i=1;i=numnote;i+,pos+)outfilep1.x ; outfilep1.y ; outfileptrHead;if(head)dohead-Write(fp);head=(CTriangle *)head-next;while(head!=pDoc-ptrHead);fclose(fp);void CTriangleView:OnRead() CString filename;CFileDialog dlg(TRUE,txt,NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,txt 文件(*.txt)|*.txt|All Files(*.*)|*.*|);if(dlg.DoModal() = IDOK)filename = dlg.GetPathName();else return;FILE *fp;fp=fopen(filename,r);if(fp=NULL)AfxMessageBox(Open File to read Error!);return;elseCTriangleDoc *pDoc=GetDocument();doCTriangle* node=new CTriangle;if(node=NULL)break;int ret = node-Read(fp);if(-1 = ret)delete node;break;if(pDoc-ptrHead=NULL)pDoc-ptrHead=node;node-last=node;elsepDoc-ptrHead-last-next=node;node-last=pDoc-ptrHead-last;pDoc-ptrHead-last=node;node-next=pDoc-ptrHead;while(!feof(fp);fclose(fp);CClientDC dc(this);this-OnDraw(&dc); (C+程序设计课程设计报告样式及说明)C+程序设计课程设计报告学生姓名: 吴杰晨 学 号: 041106225 系 (院): 信息工程学院计算机系 专 业: 计算机科学与技术 设计(论文)题目: 学生成绩管理系统 完成日期: 2005年12月30日 指导教师: 徐永安 田怀凤 二五年十二月目录1. 设计目的12. 需求分析13. 概要设计14. 测试数据25. 详细设计5.1功能设计5.2类设计5.3控件List Control的使用6. 调试分析77. 用户手册98. 设计心得119. 参考资料12注解:(1) 本报告仅供参考,各人可依据自己的课程设计改写。(2) 课程设计报告应体现设计目的、要求,类的设计、界面的设计,对所设计的功能作介绍,操作说明;(3) 心得体会把握“有体会就多写,没有体会少写”的原则,需要写自己的体会,切忌“抄体会”。期望大家通过课程设计对OOP感兴趣,并在今后的学习中提高程序设计能力,为后续课程、毕业设计、读研、工作打下坚实的基础!祝学习进步,生活愉快!10. 附件列表12、设计目的1) 在具体编程过程中进一步去了解和熟悉面向对象的程序设计思想,努力使自己能够在程序中体现面向对象的程序设计方法,使自己对面向对象程序语言的三大特性:继承性、封装性、多态性,有更深刻的了解。2) 理解所需完成的任务,会进行初步的需求分析,从用户使用的角度去构思程序的各项功能及与用户的交互界面,从感性的角度去理解用户友好的设计思想,尽量使得用户能以最方便的方式操作自己所编写的程序系统,用MFC尝试基本的交互界面的制作.3) 在设计中进一步熟悉链表这种数据结构,熟练掌握其各项功能的实现,并能够通过MFC中的List Control控件将相应的结果反馈出来。4) 陪养调试中大型程序的能力,学会利用编译系统中的各种调试功能去协助完成自己的编程与调试过程,总结编程中常犯的错误,为以后的进一步深入积累实际经验。、需求分析要求实现基本的数据添加、删除、保存、读取等功能。对MFC的界面分析如下: 1) 添加:初步考虑是弹出一个Dialog来获得用户所输入的数据。2) 删除:方法一:添加一个删除按钮,当点击后删除选定的项目;方法二:在所需删除的项目上点击右击,选择删除,也可;3) 保存、读取:单击相应按钮后通过CFileDialog的对象实现相应的功能。除此之外,对数据结构的设计将会在类的设计中详细给出。、概要设计具体的实现应分为三个部分,界面部分,功能部分,界面与功能的连接部分。这是几乎所有Windows程序设计的标准三大部分,图示如下:界面功能连接有时也许各部分的界限区分并不是很明显,但无论怎样,抓住这三个部分,是有利于理清思路的。对于以上三个部分,可以打一个比方,一个程序好比一盒软包装的饮料,功能部分是我们想要的,是里面的果汁,但我们不可能说凭空地得到它们,也不可能说是可以直接把整盒饮料连着包装塞进嘴里。商家为我们设计得很好,饮料的包装盒上已经为我们开好了一个锡纸蒙着的洞,这就是我们程序的界面,也就是接口,英文就是Interface.我们可以通过它来和程序进行交互。但是,如果锡纸不被吸管捅破,你仍然你得不到你想要的饮料,所以商家想得很周到,往往会为我们提供一根吸管。吸管即是盒上小洞和里面饮料的连接渠道。同样道理,我们需要将界面与功能连接起来,于是我们需要有第三个部分,即界面与功能相连接的部分。、测试数据041106243 蠢才 9 9041106245 庸才 56 44041106240 全才 88 55041106250 人才 60 60041106246 鬼才 44 4041106244 奇才 88 66041106225 天才 1 99041106242 栋才 100 100以上数据的按排,为以后一些功能的测试留下了方便,在程序的整个编写过程中都将使用这组数据。 为了简便起见,设课程仅为两门。、详细设计.功能设计程序中的各个功能往往被设计成一个一个独立的功能模块,当然这还是在结构化程序设计的影响下而说出的,在面向对象的程序设计思想下,程序被设计成一个一个类,每个类,包含着与其相关的操作。但其中每个操作的实现,其实还是有应该有一定的顺序的。有时这些顺序是由功能之间的相互依赖性所决定的,比如在想把存储有学生信息的链表进行排序之前,首先得要链表存在。还有时,这些顺序是由调用的方便性所决定的,比如文件的读取功能,实现的是从文件将数据读入,这样一来,将来使调试时数据的输入大为简便,从而大大缩短所需的调试时间。所以,在这里,对功能的实现,个人认为,以下的顺序是可行的:添加删除修改读取保存排序查找统计其中,由于对于“排序”功能,初使的设计是点击表头后实现排序,且多次点击同一列的表头,将会使排列在顺序和逆序间切换。在本次课程设计中,由于时间紧迫,将只能完成到排序的功能,后续的功能暂时不作考虑。另外,在这里还想对大的储存框架做一个说明,如图所示:文件链表ListControl控件外存内存图.1_1数据的存储介质分为内存和外存,内存与外存数据的交互其表现形式也就是读写文件,在这里,外存只有一个具体表现,那就是磁盘上的文件;但内存却有两个表现,一个是我们自己创建的链表,还有一个就是MFC为我们提供的List Control控件。其实,就其List Control的本质来讲,也是一个链表,只不过这个链表是MFC为我们提供的(从英文名称上就可以看出,链表的英文就应当是list),所以说即使我们在这里将自己的链表丢掉(即将图中虚线框中的步骤省略),也不会影响该程序的所有功能的实现。但根据本次课程设计的目的,其中有一条就是让我们进一步熟练掌握链表的各项操作与实现,所以自然不能丢掉我们自己的链表。在笔者所编写的程序中,仅有文件的读取以及排序与链表相连,其余均与链表无关。原因很简单:我们的链表是个累赘。.添加这里的添加,指用户输入数据,向链表及List Control控件中插入数据,向List Control控件中插入数据的具体实现将会在5.3.1中详述,在这里,先仅讨论向链表中插入数据。由于链表是由我们程序员自己建立起的一个动态数据存储结构,所以,首先应该判其是否存在。如果存在,则仅进行结点的插入;相反,如其不存在,则第一步还要建立一个空的链表。当然,这只是一种思路,还有一种思路,是在程序一旦被执行,在初始化的时候就创建一个空的链表,这样在后面的所有操作都无需再创建链表。(前提要保证在程序的运行过程中不会将链表的头结点释放)详见5.3.1的内容。.删除删除功能的实现如果想要通过链表,就必须将所需删除的项目号通过List Control传给我们的链表,然后使链表找到该结点,然后删除,最后将链表中的结果再返回到List Control显示出来。可以想见,这是一个多么愚蠢的思路。当然,你也可以通过List Control先执行完删除操作后,再用现在的List Control刷新链表中的内容。可以想见,这是一个非常不合理的思路,因为到最后你将很容易将数据的版本搞混,而不晓得该是从哪个往哪个传数据。(反而前面一种方法可以避免,因为它总是以链表为数据的标本。)所以,在这里,数据的删除没有和链表挂上。详见5.3.2的内容。.修改如果和链表连接,同样会遇到上面的麻烦,所以在这里也不通过链表。详见5.3.3的内容。.读取数据从文件里读取是通过链表的,具体的分为两步:1) 从文件里读取数据,同时向链表中添加结点。2) 当数据全部读取完毕后,将链表中的所有数据再更新到List Control使之显示出来。.保存没有通过链表,其他操作和读取类似。.排序这个功能其实是在最后添加的,在最一开始就已经提出过,排序的实现应当是通过点击列表头来实现的,并且还应该能够支持正序和逆序两种方式,那么这个排序模块应有的接口就很明显了。接口应有两个,一个是用来排序的表列的列序号,另一个是正序还是逆序的判断标志。(其实在一开始设计的时候并不一定能够这么到位,像笔者一开始就只留了前面一个接口)然后就要开始构造模块内部的实现了。由于前面的多个功能都没有与链表挂钩,感觉是不是有点“离题”,所以在这里,排序功能是通过对链表排序后再返回给List Control来实现的。下面,就会想到排序代码的通用性问题,因为每一项数据都需要排序,但各个数据的数据变量名与类型都不一样,怎么样才能使排序

温馨提示

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

评论

0/150

提交评论