C++综合应用实例ppt课件.ppt_第1页
C++综合应用实例ppt课件.ppt_第2页
C++综合应用实例ppt课件.ppt_第3页
C++综合应用实例ppt课件.ppt_第4页
C++综合应用实例ppt课件.ppt_第5页
已阅读5页,还剩93页未读 继续免费阅读

下载本文档

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

文档简介

1、数据代数运算系统的设计(相当于计算器)2、学生成绩管理系统的设计3、三角形面积验证程序的设计,C/C+综合应用实例,1,1、数据代数运算系统的设计(相当于计算器),问题:设计一个计算器程序,完成整数间的加、减、乘、除以及求运算,以及累加求和、计算n!等。(1)计算器程序设计文档(2)使用TC开发的dos界面程序;(3)程序运行演示;这样的系统不好,我们可以将其改写为图形界面(4)图形界面程序演示;(5)图形界面程序源代码,2,2、学生成绩管理系统的设计,例2:编写程序,实现学生成绩管理:要求实现用户登录,显示主菜单,学生信息的输入,学生信息的输出,按学号查询学生信息,按成绩降序排序,追加学生信息,把学生信息保存到文件,从文件中导出学生信息等有关的功能。,3,关于该设计题目的有关问题与分析:,(1)采用的程序设计方法的选择?A)面向结构的设计方法?B)面向对象的设计方法?(2)运行界面的选择?A)DOS界面的设计?B)图形界面(Windows界面)?(3)数据类型的定义(结构体或类的定义)(4)(数据结构的定义)存放数据的方式顺序表(数组存放一个班学生信息)链表(利用指针存放一个班的学生信息),4,该题目的分析与设计:,本题目可以采用4种方式实现:(1)采用面向结构的程序设计方法,用顺序表(数组和结构体),DOS界面。(2)采用面向结构的程序设计方法,用链表(指针和结构体),DOS界面(3)采用面向对象的程序设计方法,用顺序表(定义顺序表类),DOS界面(4)采用面向对象的程序设计方法,用链表(定义链表类),DOS界面另外,对这4种方式,都可以采用Windows(图形)界面实现。,5,(1)采用面向结构的程序设计方法用顺序表(数组和结构体)DOS界面,6,采用面向结构的程序设计方法,用顺序表(数组和结构体),DOS界面,处理过程:(1)定义学生结构体;(2)定义学生数组(一般放到主函数中定义)这里要注意,学生人数问题(3)按功能要求定义各有关功能函数;这里要注意,每个函数的参数及其函数的返回值(4)设计主函数,实现系统所要求的功能。思考:假设将(2)定义成一个“班级结构体”,那么,整个系统该如何实现);,7,(1)定义学生结构体;,structstcharClass20;/班级intnum;/学号charname8;/姓名floatkc6;/各课程成绩(6门)floatave;/平均成绩intorder;/名次;,8,按功能要求定义各有关功能函数,(1)学生信息的输入(输入学生的信息,存放到数组s中,返回实际学生个数给n,注意:输入的结束条件如何设计?)voidiuput(stsint*n);(2)将数组s中,n个学生信息输出,要求:按一定得格式输出学生信息(最好是表格格式,并且当学生人数较多时,应按页显示)voidpint(sts,intn)(3)从数组s,n个学生信息中,查询学号为x的学生信息,并返回查找成功是(位置号)否(-1)。intfind(sts,intn,intx),9,(4)将数组s,n个学生信息中按平均成绩降序排序,形成排序数组y。sort(sts,intn,sty)(5)在数组s,n个学生信息的未,输入追加学生信息。该功能的实现,可以使用(1)输入学生信息功能(6)将数组s,n个学生信息,保存到文件f中。save(sts,intn,char*f)(7)从文件f中导出学生信息,存放到数组s中,并返回实际学生人数n。load(char*f,sts,int定义数组intm;数组的最大空间intn;实际学生人数m=1000;st=newstm;n=0;显示菜单,分别调用有关的函数。,12,(3)采用面向对象的程序设计方法用顺序表(定义顺序表类)DOS界面,13,采用面向结构的程序设计方法,用顺序表(定义顺序表类),DOS界面,处理过程:(1)定义学生类;(2)定义班级类(3)设计主函数,定义有关的对象,并调用有关的函数,完成系统功能。,分析:由于成绩管理是由多名学生构成的,所以需要定义学生类;另外,由多个学生,形成一个班或年级,所以还需要定义一个班级(年级)类,14,(1)定义学生类;,classstprivate:charClass20;/班级intnum;/学号charname8;/姓名floatkc6;/各课程成绩(6门)floatave;/平均成绩intorder;/名次public:分析:关于学生类,该有哪些函数成员?;,15,学生类,函数成员的定义与实现,public:(1)构造函数的定义:利用参数传递,形成一个学生有键盘输入形成一个学生(2)输出学生信息函数;,16,(2)定义班级类,classbjprivate:intm;/私有变量,顺序表实例的最大长度intn;/私有变量,顺序表实例的当前长度st*s;/存放学生的数组(利用指针实现)public:分析:关于班级类,该有哪些函数成员?;,17,班级类,函数成员的定义与实现,public:(1)构造函数的定义:利用参数传递,形成班级由数组s中,n各学生,形成班级bj(stsintn);有键盘输入形成班级学生信息的输入(输入的结束条件如何设计?)bj();有文件导入,形成班级;从文件f中导出学生信息,bj(char*f),18,其它成员函数,(2)输出学生信息,要求:按一定得格式输出学生信息(最好是表格格式,并且当学生人数较多时,应按页显示)voidpint()(3)查询学号为x的学生信息,并返回查找成功是(位置号)否(-1)。intfind(intx),19,(4)按平均成绩降序排序,形成新类。stsort()(5)在学生信息的未,输入追加学生信息。注意:输入的结束条件如何设计?voidinput()(6)在学生信息的未,通过文件f,追加学生信息。voidapp(char*f)(7)保存到文件f中。voidsave(char*f),20,给出每个函数的具体实现,同学们自己给出各函数的源代码。,21,设计主函数,实现系统所要求的功能,定义有关的对象Voidmain()bjb;定义班级对象sts;定义学生对象显示菜单,分别调用有关的函数。,22,链表成绩管理,1.链表的定义与结构描述2.链表的有关操作实现3.利用链表结构实现成绩管理(1)成绩管理的功能分析(2)成绩管理的类定义与实现,3采用面向对象的程序设计方法,用链表(定义链表类),DOS界面,23,1单链表,通过指针把它的一串存储结点链接成一个链存储结点由两部分组成:data字段next字段,头指针,指向下一个节点的指针,附加头结点,结点,尾指针,24,单链表的结点类型,structListNodeintdata;ListNode*next;,问题(有关链表的操作):如何定义(申明)一个链表呢?如何形成一个链表呢?在链表中指定的位置处,如何插入一个节点呢?在链表中如何删除一个节点呢?一个链表中,有几个数据元素呢?,25,如何定义(申明)一个链表呢?,一个链表一般只要告诉该链表的头指针即可。,定义链表:structListNode*first,该链表所有的操作,全部是从“first”开始,并且,该指针永远指向第一个位置。,26,一个链表是如何形成呢?,一个链表的形成,一般需要两步:,First,(2)在空链表的基础上不断的插入节点,从而形成链表。一般分为:在前插入、在后插入两种,(1)首先形成一个空链表:,NULL(0),27,构造空单链表,LinkList()first=newListNode;first-next=0;,28,建立单链表,头插法建立单链表图示,头插法,29,尾插法建表,尾插法建表图示,将新建的节点插入到链表的最后,尾指针,30,在头结点之后插入一个新结点,voidLinkList:insert(inta)ListNode*temp;temp=newListNode;temp-data=a;temp-next=0;temp-next=first-next;first-next=temp;,执行的语句组为:snextfirstnext;firstnexts;,c,i,1,first,c,2,c,1,c,i,s,插入第,i,个元素,31,单链表的建立(调用插入函数,可以创建链表:形成具有n个元素的链表),voidLinkList:create(intn)inti=0;intdata;coutdata;insert(data);i+;,32,查找单链表中第i个结点算法,ListNode*FindIndex(constinti)ListNode*pif(i=-1)returnfirst;p=first-next;/intj=0;while(p!=NULL,33,单链表插入算法(第i节点前插入),34,单链表插入算法,ListNode*Insert(intvalue,inti)/插入数据内容为value的新结点,为第i个结点。ListNode*p,*q;q=newListNode;q-data=value;p=FindIndex(i-1);if(p=NULL)returnNULL;q-next=p-next;p-next=q;returnq;,35,单链表删除算法,voidRemoveAfter(ListNode*link)/删除参数link的后继结点ListNode*newlink;if(link!=NULL)newlink=link-next;link-next=newlink-nextlink-next=link-next-nexydeletenewlink;,36,求长度算法,intLength()ListNode*p=first-next;intcount=0;while(p!=NULL)p=p-next;count+;returncount;,p,37,单链表的类定义,分析1数据成员:两个指向结点的指针:头指针和尾指针2成员函数:(1)构造函数/创建并形成一个初始链表(2)析构函数/删除构造函数所创建的链表(3)插入元素函数/在表的第i个位置处,插入数据或在表尾插入元素(4)删除元素函数/删除表中数值为x的元素(5)查找元素/在表中查找数据为x的元素在表中的位置(6)输出链表/从头到尾输出表中的所有的元素(7)判定链表是否为空/为了进行删除进行的一种判定(8)将链表设置为一个空表/(9)计算链表的长度/统计链表中元素个数(10)将链表元素值写到文件中(11)将文件中的数据读到链表中,38,classLinkList/链表类private:ListNode*first,*last;/链表的表头指针和尾指针public:LinkList()LinkList();/析构函数ListNode*Insert(intvalue,inti);Listnode*insert(intvalue)intRemove(intvalue);ListNode*FindIndex(intvalue);voidPrintList();/遍历单链表voidMakeEmpty();/将链表置为空表intLength()const;/计算链表的长度intNotNull();/判断是否是空表voidcreate();,单链表的类定义,39,三、利用链表结构实现成绩管理(1)成绩管理的功能分析(2)成绩管理的类定义与实现要求:1简单的系统与功能分析2建立数据结构表3要建立一个测试的数据表,至少要有20个测试数据4使用数据链表实现数据的:录入、查询、修改、增加、删除、统计、输出,40,一、定义学生成绩管理系统的数据结构表,序号成员名数据类型长度字段含义1Classint班级2numint学号3namechar8姓名4kc0float电子技术5kc1floatC+程序设计6kc2float多媒体技术7kc3float大学英语8kc4float高等数学9kc5float大学体育10Avefloat平均成绩11Orderint名次13next”自定义的结构类型“指针,指向下一个结点,41,二、根据所要求的成绩管理系统定义类,系统的功能要求:使用数据链表实现如下功能:初始链表的建立,录入、查询、修改、增加、删除、统计、输出等功能。,(一)数据定义(类的数据成员说明):一个指向学生结构的头指针;(注意:该指针就是链表的头),structnodeintClass;/班级intnum;/学号charname8;/姓名floatkc6;/各课程成绩(6门)floatave;/平均成绩intorder;/名次node*next;/指针;,classcjprivate:structnode*head;public:待定义的各功能函数,结点定义,类定义,42,(二)操作定义(函数功能划分),1.初始链表的建立:利用类的构造函数,建立一个只有附加头结点的空链表;2.录入(增加一个)学生信息:由键盘一个一个输入学生的信息,并链到链表中;(注意:什么时候停止输入呢?即:输入的结束条件?)如何链到链表上呢?(在表的尾上追加)3.追加结点:在链表尾上链上一个结点(p所指的结点):,43,4.链表的建立:在空链表已经建立的基础上,向链表中提供信息(注意:采用先提供的信息在表的前面,依次向后);可以分为两种方式:(1)由键盘一个一个输入学生的信息,并链到链表中;(可以直接使用添加学生操作;即使用2)(2)利用文件将文件中的内容读入,并链到链表中,44,5.定位:提供学生的学号,在链表中查找该学生所在链表中的位置(返回指向该结点的一个指针)(注意:该操作是为后面的操作服务的,特别是:删除、修改、查询)6.查询:提供学生的学号,在链表中查找该学生并输出该学生的信息(包括学生的名次)7.删除:提供学生的学号,在链表中查找该学生,并从表中删除学号是该值的学生8.修改成绩:提供学生的学号,在链表中查找该学生,找到后先显示原来的学生信息,然后修改(重新输入)学生信息,45,9.统计:给出各课成绩的平均分,总平均分,并分别按各课程统计成绩段的人数:优秀人数、良好人数、中等人数、及格人数,不及格人数,并按一定的格式将所有统计结果显示出来。10.排序(降序):按学生的平均成绩进行由小到大排序,新形成一个排序链表,.(注意:该操作是为其它操作服务的;例如:5(查询)可以使用,当添加学生或删除学生以及修改学生成绩后,都需要重新排序)11.输出链表:按链表中的先后次序输出表中的所有信息(注意:该操作为按顺序输出信息和排序输出服务):,46,12.写文件:将进行各种操作后所形成的链表信息,写入文件中,备以后使用时,利用3(2)再读入形成链表.(注意:可以形成两类文件:按输入的顺序,按排序后的)13.其他的一些服务操作:(1)析构函数:(2)输出表头函数:(为功能、6、7、8、11、12服务)(3)输出P指针所指结点信息:(为功能:6、7、8、11、12服务),47,类声明:由以上分析,可以给出成绩管理的类声明:,classcjprivate:structnode*head;public:cj();/1:构造函数,建立一个只有附加头结点的空链表input();/2:向链表中添加学生的信息(在表的尾上追加)appen(node*p);/3.追加结点:在链表尾上链上一个结点(p所指的结点)voidrf(char*f);/4.读文件,形成链表node*post(intnum);/5.定位:提供学号,返回指向该结点的一个指针)voidlookup(intnum);/6.查询提供学号,查找学生并输出学生的信息voidDelete(intnum);/7.删除:提供学号,删除学号是该值的学生voidmodify(intnum);/8.修改成绩:提供学号,修改(重新输入)学生信息voidstatistic();/9.统计函数,统计平均成绩voidsort(cj,48,cj:cj()/1:构造函数,建立一个只有附加头结点的空链表head=newnode;head-next=0;,49,voidcj:input()/2:录入学生信息:由键盘一个一个输入学生的信息,并在表的尾上追加)intClass;charname8;intnum;floatc6,ave;intorder;node*p2;intt,i;coutt;while(t=1)coutClassnamenumc0c1c2c3c4c5;p2=newnode;ave=(c0+c1+c2+c3+c4+c5)/6;p2-Class=Class;p2-num=num;strcpy(p2-name,name);for(i=0;ikci=ci;p2-order=0;p2-ave=ave;appen(p2);coutt;,50,voidcj:appen(node*p)/3.追加结点:在链表尾上链上一个结点(p所指的结点)node*p1,*p2;p1=head;p2=p1-next;while(p2)p1=p2;p2=p2-next;p1-next=p;p-next=p2;,51,voidcj:rf(char*f)/4.读文件,形成链表intClass;charname8;intnum;floatc6,ave;intorder;charss250;/存放标题的node*p2;ifstreamff;ff.open(f);ff.getline(ss,200);/取第一行标题ff.getline(ss,200);/取第二行标题ffClassnamenumc0c1c2c3c4c5;while(!ff.eof()p2=newnode;ave=(c0+c1+c2+c3+c4+c5)/6;p2-Class=Class;p2-num=num;strcpy(p2-name,name);for(i=0;ikci=ci;p2-order=0;p2-ave=ave;appen(p2);ffClassnamenumc0c1c2c3c4c5;ff.close();,52,nodecj:*post(intnum)/5.定位:提供学号,返回指向该结点的一个指针)node*p1,*p2;p1=head;if(p1-next=0)return0;p2=p1-next;while(p2-num!=num,53,voidcj:lookup(intnum)/6.查询提供学号,查找学生并输出学生的信息node*p1;p1=post(num);/定位:提供学号,返回指向该结点的一个指针)if(p1!=0)print1();/输出一个同学的成绩(标题)print2(p1);/输出一个同学的信息elsecout无学生记录!c0c1c2c3c4c5;ave=(c0+c1+c2+c3+c4+c5)/6;for(i=0;ikci=ci;p-ave=ave;elsecout没找到该学生!kc0;s2=s2+p1-kc1;s3=s3+p1-kc2;s4=s4+p1-kc3;s5=s5+p1-kc4;s6=s6+p1-kc5;i+;p1=p1-next;cout平均成绩:endl;cout电子技术s1/itC+:s2/i;cout数学s3/it英语s4/it政治s5/it;cout体育s6/inext;coutnext;coutnext;deletep1;,62,voidcj:print1()/13(2):输出一个同学的成绩(标题)coutnamenumClasskci;coutnext;returnn;nodecj:*gethead()/13(5)获取头指针returnhead;,64,voidmain()/主函数cjA,B;inta;intnum;while(1)couta;,65,switch(a)case0:gotoend;case1:A.create();break;case2:coutnum;A.modify(num);A.sort(B);break;case3:A.sort(B);coutnum;B.lookup(num);break;case4:coutnum;A.Delete(num);break;,case5:A.output();break;case6:A.statistic();break;case7:cout学生人数为:A.Length()endl;break;case8:A.sort(B);B.output();break;case9:A.rf(abc);break;case10:A.wf(abc);break;default:break;cout按任意键继续操作!endl;getchar();end:;cout谢谢您使用本系统!endl;,66,3、三角形面积验证程序的设计,问题:给出求解下列问题逐步求精的分析过程,并设计程序完成其验证:已知一个正三角形ABC,其内分点A1、B1、C1,使得2AC1=C1B、2BA1=A1C、2CB1=B1A,连接CC1、BB1、AA1,三条直线分别相交于A2、B2、C2。要求编写程序验证,三角形A2B2C2的面积是三角形ABC的面积的7分之一。,67,68,分析问题的基本方法,基本方法是:由顶向下,逐步求精;即:将复杂问题,分解为小问题,小问题解决了,大问题也就解决了。,例如:如下的问题已知一个正三角形ABC,其内分点A1、B1、C1,使得2AC1=C1B、2BA1=A1C、2CB1=B1A,连接CC1、BB1、AA1,三条直线分别相交于A2、B2、C2(见图1)。要求编写程序验证:三角形A2B2C2面积是三角形ABC面积的七分之一.,69,(7)建立平面直角坐标系;。,运用逻辑思维分析程序设计:,设正三角形ABC的边长为a,则本题目就是求两个三角形的面积,已知三角形的边长求面积,对于三角形ABC是很容易的,但对于三角形A2B2C2的面积的求解却比较麻烦。(如何求呢?),对于该问题的逻辑思维及其分析过程:,(1)三角形A2B2C2的面积,(2)求边长(A2B2、B2C2、C2A2),(3)求交点坐标(A2、B2、C2),(4)求直线方程(AA1、BB1、CC1),(5)求内分点坐标(A1、B1、C1),(6)已知边长a,确定三角形ABC的顶点坐标(A、B、C),分析,实现,70,设计分析,(1)采用什么设计方法:面向结构的设计方法?面向对象的设计方法?(2)不同的设计方法,需要定义不同的数据结构(数据类型),如何定义数据结构;结构体类(3)下面我们对两种设计方法,分别给出设计程序,71,采用“面向结构的设计方法”,72,采用“面向结构的设计方法”,需要的工作步骤:(1)定义有关的结构体:点,直线,三角形(2)给出有关的函数设计实现:根据前面的分析,需要定义什么函数,完成什么功能,使用什么参数,函数返回值及其类型;(3)设计主函数:调用(2)中的函数,完成要求的功能。,1、已知一个三角形t,求面积mj;2、已知两顶点a,b,求内分点(在这里两段的比值为1:2);3、已知两顶点p1,p2,求直线方程line4、已知两直线l1,l2,求交点坐标5、已知两点P1,P2,求距离,73,(1)首先,定义有关的数据结构(采用结构体),三角形结构(三边形成三角形)(a,b,c)strucTdoublea;doubleb;doublec;,直线方程结构:ax+by+c=0strucLdoublea;doubleb;doublec;,点结构:(x,y)strucPdoublex;doubley;,直线方程结构:y=kx+bstrucLdoublek;doubleb;,或者,74,(2)给出有关的函数设计(注意:形参和函数的返回值):,1、已知一个三角形t,求面积mj;doublemj(Tt)doubleL,ss;L=(t.a+t.b+t.c)/2;ss=sqr(L*(L-t.a)*(L-t.b)*(L-t.c);returnss;,75,2、已知两顶点a,b,求内分点(在这里两段的比值为1:2);Pfd(Pa,Pb)Pq;q.x=(b.x-a.x)/3+a.x;q.y=(b.y-a.y)/3+a.y;returnq;,76,3、已知两顶点p1,p2,求直线方程line(ax+by+c=0)Lzx(Pp1,Pp2)Lq;实现过程.,77,4、已知两直线l1,l2,求交点坐标Pjd(Ll1,Ll2)实现过程.,78,5、已知两点P1,P2,求距离doublejl(Pp1,Pp2)实现过程.,79,(3)设计主函数(调用前面的各函数,完成计算),Voidmain()PA,B,C,A1,B1,C1,A2,B2,C2;LL1,L2,L3;doubled1,d2,d3,s1,s2;doublea=10.00;B.x=0;B.y=0;A.x=a/2;A.y=a*sqr(3)/2;C.x=a;C.y=0;A1=fd(B,C);B1=fd(C,A);C1=fd(A,B);L1=zx(A,A1);L2=zx(B,B1);L3=zx(C,C1);A2=jd(L1,L2);B2=jd(L1,L3);C2=jd(L2,L3);d1=jl(A2,B2);d2=jl(B2,C2);d3=j;(C2,A2);s1=mj(a,a,a);s2=mj(d1,d2,d3);if(fabs(s1-7*s2)=0.001)/?cout“正确!”;elsecout“错误!”,80,采用“面向对象的设计方法”,81,采用“面向对象的设计方法”,需要的工作步骤:(1)定义有关的类:点,直线,三角形(2)设计主函数:定义有关的对象,并调用有关的函数,完成要求的功能。,注意:每个类有什么数据成员;每个类有什么成员函数,都具有什么功能?,82,(1)首先,定义有关的类结构,classPprivate:doublex;doubley;public:/构造函数,用a,b提供值,形成点P(doublea,doubleb);/构造函数,由两直线a,b形成交点P(linea,lineb);/构造函数,由两顶点a,b,及比值r,求内分点P(Pa,Pb,double

温馨提示

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

评论

0/150

提交评论