《C综合应用实例.pptx》由会员分享,可在线阅读,更多相关《C综合应用实例.pptx(97页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1、数据代数运算系统的设计(相当于计算器)问题:设计一个计算器程序,完成整数间的加、减、乘、除以及求运算,以及累加求和、计算n!等。(1)计算器程序设计文档 (2)使用TC开发的dos界面程序;(3)程序运行演示;这样的系统不好,我们可以将其改写为图形界面 (4)图形界面程序演示;(5)图形界面程序源代码第1页/共97页2、学生成绩管理系统的设计例2:编写程序,实现学生成绩管理:要求实现 用户登录,显示主菜单,学生信息的输入,学生信息的输出,按学号查询学生信息,按成绩降序排序,追加学生信息,把学生信息保存到文件,从文件中导出学生信息 等有关的功能。第2页/共97页关于该设计题目的有关问题与分析
2、:(1)采用的程序设计方法的选择?A)面向结构的设计方法?B)面向对象的设计方法?(2)运行界面的选择?A)DOS界面的设计?B)图形界面(Windows界面)?(3)数据类型的定义 (结构体或类的定义)(4)(数据结构的定义)存放数据的方式 顺序表(数组存放一个班学生信息)链表(利用指针存放一个班的学生信息)第3页/共97页该题目的分析与设计:本题目可以采用4种方式实现:(1)采用面向结构的程序设计方法,用顺序表(数组和结构体),DOS界面。(2)采用面向结构的程序设计方法,用链表(指针和结构体),DOS界面(3)采用面向对象的程序设计方法,用顺序表(定义顺序表类),DOS界面(4)采用面向
3、对象的程序设计方法,用链表(定义链表类),DOS界面 另外,对这4种方式,都可以采用Windows(图形)界面实现。第4页/共97页(1)采用面向结构的程序设计方法 用顺序表(数组和结构体)DOS界面第5页/共97页采用面向结构的程序设计方法,用顺序表(数组和结构体),DOS界面处理过程:(1)定义学生结构体;(2)定义学生数组(一般放到主函数中定义)这里要注意,学生人数问题(3)按功能要求定义各有关功能函数;这里要注意,每个函数的参数及其函数的返回值(4)设计主函数,实现系统所要求的功能。思考:假设将(2)定义成一个“班级结构体”,那么,整个系统该如何实现);第6页/共97页(1)定义学生结
4、构体;struct st char Class20;/班级 int num;/学号 char name8;/姓名 float kc6;/各课程成绩(6门)float ave;/平均成绩 int order;/名次 ;第7页/共97页按功能要求定义各有关功能函数 (1)学生信息的输入(输入学生的信息,存放到数组s中,返回实际学生个数给n,注意:输入的结束条件如何设计?)void iuput(st s int*n);(2)将数组s中,n个学生信息输出,要求:按一定得格式输出学生信息(最好是表格格式,并且当学生人数较多时,应按页显示)void pint(st s,int n)(3)从数组s,n个学生
5、信息中,查询学号为x的学生信息,并返回查找成功是(位置号)否(-1)。int find(st s,int n,int x)第8页/共97页(4)将数组s,n个学生信息中按平均成绩降序排序,形成排序数组y。sort(st s,int n,st y)(5)在数组s,n个学生信息的未,输入追加学生信息。该功能的实现,可以使用(1)输入学生信息功能(6)将数组s,n个学生信息,保存到文件f中。save(st s,int n,char*f)(7)从文件f中导出学生信息,存放到数组s中,并返回实际学生人数n。load(char*f,st s,int&n)第9页/共97页给出每个函数的具体实现 同学们自己给
6、出各函数的源代码。第10页/共97页设计主函数,实现系统所要求的功能定义学生数组:这里要注意,学生人数问题Void main()st*t;定义数组 int m;数组的最大空间 int n;实际学生人数 m=1000;st=new stm;n=0;显示菜单,分别调用有关的函数。第11页/共97页(3)采用面向对象的程序设计方法 用顺序表(定义顺序表类)DOS界面第12页/共97页采用面向结构的程序设计方法,用顺序表(定义顺序表类),DOS界面处理过程:(1)定义学生类;(2)定义班级类(3)设计主函数,定义有关的对象,并调用有关的函数,完成系统功能。分析:由于成绩管理是由多名学生构成的,所以需要
7、定义学生类;另外,由多个学生,形成一个班或年级,所以还需要定义一个班级(年级)类第13页/共97页(1)定义学生类;class st private:char Class20;/班级 int num;/学号 char name8;/姓名 float kc6;/各课程成绩(6门)float ave;/平均成绩 int order;/名次 public:分析:关于学生类,该有哪些函数成员?;第14页/共97页学生类,函数成员的定义与实现public:(1)构造函数的定义:利用参数传递,形成一个学生 有键盘输入形成一个学生 (2)输出学生信息函数;第15页/共97页(2)定义班级类class bj
8、private:int m;/私有变量,顺序表实例的最大长度 int n;/私有变量,顺序表实例的当前长度 st *s;/存放学生的数组(利用指针实现)public:分析:关于班级类,该有哪些函数成员?;第16页/共97页班级类,函数成员的定义与实现public:(1)构造函数的定义:利用参数传递,形成班级 由数组s中,n各学生,形成班级 bj(st s int n);有键盘输入形成班级 学生信息的输入(输入的结束条件如何设计?)bj();有文件导入,形成班级;从文件f中导出学生信息,bj(char*f)第17页/共97页其它成员函数 (2)输出学生信息,要求:按一定得格式输出学生信息(最好是
9、表格格式,并且当学生人数较多时,应按页显示)void pint()(3)查询学号为x的学生信息,并返回查找成功是(位置号)否(-1)。int find(int x)第18页/共97页(4)按平均成绩降序排序,形成新类。st sort()(5)在学生信息的未,输入追加学生信息。注意:输入的结束条件如何设计?void input()(6)在学生信息的未,通过文件f,追加学生信息。void app(char*f)(7)保存到文件f中。void save(char *f)第19页/共97页给出每个函数的具体实现 同学们自己给出各函数的源代码。第20页/共97页设计主函数,实现系统所要求的功能定义有关的
10、对象Void main()bj b;定义班级对象 st s;定义学生对象 显示菜单,分别调用有关的函数。第21页/共97页链表成绩管理成绩管理1.链表的定义与结构描述2.链表的有关操作实现3.利用链表结构实现成绩管理 (1)成绩管理的功能分析 (2)成绩管理的类定义与实现3 采用面向对象的程序设计方法,用链表(定义链表类),DOS界面第22页/共97页1 单链表通过指针把它的一串存储结点链接成一个链 存储结点由两部分组成:data字段 next 字段 data next头指针指向下一个节点的指针附加头结点结点尾指针第23页/共97页单链表的结点类型struct ListNode int dat
11、a;ListNode *next;data next问题(有关链表的操作):n 如何定义(申明)一个链表呢?n 如何形成一个链表呢?n 在链表中指定的位置处,如何插入一个节点呢?n 在链表中如何删除一个节点呢?n 一个链表中,有几个数据元素呢?第24页/共97页如何定义(申明)一个链表呢?一个链表一般只要告诉该链表的头指针即可。定义链表:struct ListNode *first 该链表所有的操作,全部是从“first”开始,并且,该指针永远指向第一个位置。第25页/共97页一个链表是如何形成呢?一个链表的形成,一般需要两步:First(2)在空链表的基础上不断的插入节点,从而形成链表。一般
12、分为:在前插入、在后插入两种(1)首先形成一个空链表:NULL(0)第26页/共97页构造空单链表LinkList()first=new ListNode;first-next=0;first(a)建空表第27页/共97页建立单链表头插法建立单链表图示 first(a)建空表c1ss 指向新申请的结点sdatac1(b)申请新结点并赋值firstlast(c)插入第一个结点 last=slast=sc1执行的语句组为:snextfirstnext;firstnexts;ci1firstc2c1cis(d)插入第i个元素头插法第28页/共97页尾插法建表 尾插法建表图示 c1ss 指向新申请的结
13、点空间sdatac1(b)申请新结点并赋值firstL(a)建空表lastfs(c)插入第一个结点c1lastlasts;last指向链表的结尾c1firstc2last nexts;(d)插入第二个结点sr将新建的节点插入到链表的最后尾指针第29页/共97页在头结点之后插入一个新结点void LinkList:insert(int a)ListNode *temp;temp=new ListNode;temp-data=a;temp-next=0;temp-next=first-next;first-next=temp;执行的语句组为:snextfirstnext;firstnexts;ci
14、1firstc2c1cis 插入第i个元素第30页/共97页单链表的建立(调用插入函数,可以创建链表:形成具有n个元素的链表)void LinkList:create(int n)int i=0;int data;cout endlplease input the data of the list;while(idata;insert(data);i+;第31页/共97页查找单链表中第i个结点算法 ListNode*FindIndex(const int i)ListNode *pif(i=-1)return first;p=first-next;/int j=0;while(p!=NULL&
15、j next;j+;return p;第32页/共97页单链表插入算法(第i节点前插入)La1ai1aianpre(a)寻找第 i1 个结点es(b)申请新的结点preLa1ai1aianes 与ai连链:snextprenextai-1与ai断链,插入 e:prenexts;(c)插入第33页/共97页单链表插入算法ListNode*Insert(int value,int i)/插入数据内容为value的新结点,为第i个结点。ListNode*p,*q;q=new ListNode;q-data=value;p=FindIndex(i-1);if(p=NULL)return NULL;q-
16、next=p-next;p-next=q;return q;pLa1ai1aianeq 与ai连链:snextprenextai-1与ai断链,插入 e:prenexts;(c)插入第34页/共97页单链表删除算法 void RemoveAfter(ListNode*link)/删除参数link的后继结点 ListNode*newlink;if(link!=NULL)newlink=link-next;link-next=newlink-next link-next=link-next-nexy delete newlink;第35页/共97页求长度算法int Length()ListNode
17、 *p=first-next;int count=0;while(p!=NULL)p=p-next;count+;return count;La0ai1aian()p第36页/共97页单链表的类定义分析1数据成员:两个指向结点的指针:头指针和尾指针 2成员函数:(1)构造函数 /创建并形成一个初始链表 (2)析构函数 /删除构造函数所创建的链表 (3)插入元素函数 /在表的第i 个位置处,插入数据或在表尾插入元素 (4)删除元素函数 /删除表中数值为x的元素 (5)查找元素 /在表中查找数据为x的元素在表中的位置 (6)输出链表 /从头到尾输出表中的所有的元素 (7)判定链表是否为空 /为了进
18、行删除进行的一种判定 (8)将链表设置为一个空表 /(9)计算链表的长度 /统计链表中元素个数 (10)将链表元素值写到文件中 (11)将文件中的数据读到链表中 第37页/共97页class LinkList /链表类 private:ListNode *first,*last;/链表的表头指针和尾指针 public:LinkList()LinkList();/析构函数 ListNode *Insert(int value,int i);Listnode *insert(intvalue)int Remove(int value);ListNode*FindIndex(int value);v
19、oid PrintList();/遍历单链表 void MakeEmpty();/将链表置为空表 int Length()const;/计算链表的长度 int NotNull();/判断是否是空表 void create();单链表的类定义单链表的类定义第38页/共97页三、利用链表结构实现成绩管理 (1)成绩管理的功能分析 (2)成绩管理的类定义与实现要求:1简单的系统与功能分析2建立数据结构表3要建立一个测试的数据表,至少要有20个测试数据4使用数据链表实现数据的:录入、查询、修改、增加、删除、统计、输出,第39页/共97页一、定义学生成绩管理系统的数据结构表序号 成员名 数据类型 长度
20、字段含义 1 Class int 班级 2 num int 学号 3 name char 8 姓名 4 kc0 float 电子技术 5 kc1 float C+程序设计 6 kc2 float 多媒体技术 7 kc3 float 大学英语 8 kc4 float 高等数学 9 kc5 float 大学体育 10 Ave float 平均成绩 11 Order int 名次 13 next ”自定义的结构类型“指针,指向下一个结点第40页/共97页二、根据所要求的成绩管理系统定义类系统的功能要求:使用数据链表实现如下功能:初始链表的建立,录入、查询、修改、增加、删除、统计、输出等功能。(一)数
21、据定义(类的数据成员说明):一个指向学生结构的头指针;(注意:该指针就是链表的头)struct node int Class;/班级 int num;/学号 char name8;/姓名 float kc6;/各课程成绩(6门)float ave;/平均成绩 int order;/名次 node*next;/指针;class cj private:struct node *head;public:待定义的各功能函数 结点定义类定义第41页/共97页(二)操作定义(函数功能划分)1.初始链表的建立:利用类的构造函数,建立一个只有附加头结点的空链表;2.录入(增加一个)学生信息:由键盘一个一个输入
22、学生的信息,并链到链表中;(注意:什么时候停止输入呢?即:输入的结束条件?)如何链到链表上呢?(在表的尾上追加)3.追加结点:在链表尾上链上一个结点(p所指的结点):第42页/共97页4.链表的建立:在空链表已经建立的基础上,向链表中提供信息(注意:采用先提供的信息在表的前面,依次向后);可以分为两种方式:(1)由键盘一个一个输入学生的信息,并链到链表中;(可以直接使用添加学生操作;即使用2)(2)利用文件将文件中的内容读入,并链到链表中第43页/共97页5.定位:提供学生的学号,在链表中查找该学生所在链表中的位置 (返回指向该结点的一个指针)(注意:该操作是为后面的操作服务的,特别是:删除、
23、修改、查询)6.查询:提供学生的学号,在链表中查找该学生并输出该学生的信息(包括学生的名次)7.删除:提供学生的学号,在链表中查找该学生,并从表中删除学号是该值的学生8.修改成绩:提供学生的学号,在链表中查找该学生,找到后先显示原来的学生信息,然后修改(重新输入)学生信息 第44页/共97页9.统计:给出各课成绩的平均分,总平均分,并分别按各课程统计成绩段的人数:优秀人数、良好人数、中等人数、及格人数,不及格人数,并按一定的格式将所有统计结果显示出来。10.排序(降序):按学生的平均成绩进行由小到大排序,新形成一个排序链表,.(注意:该操作是为其它操作服务的;例如:5(查询)可以使用,当添加学
24、生或删除学生以及修改学生成绩后,都需要重新排序)11.输出链表:按链表中的先后次序输出表中的所有信息 (注意:该操作为按顺序输出信息和排序输出服务):第45页/共97页12.写文件:将进行各种操作后所形成的链表信息,写入文件中,备以后使用时,利用3(2)再读入形成链表.(注意:可以形成两类文件:按输入的顺序,按排序后的)13.其他的一些服务操作:(1)析构函数:(2)输出表头函数:(为功能、6、7、8、11、12服务)(3)输出P指针所指结点信息:(为功能:6、7、8、11、12服务)第46页/共97页类声明:由以上分析,可以给出成绩管理的类声明:class cj private:struct
25、 node *head;public:cj();/1:构造函数,建立一个只有附加头结点的空链表 input();/2:向链表中添加学生的信息(在表的尾上追加)appen(node*p);/3.追加结点:在链表尾上链上一个结点(p所指的结点)void rf(char*f);/4.读文件,形成链表 node*post(int num);/5.定位:提供学号,返回指向该结点的一个指针)void lookup(int num);/6.查询 提供学号,查找学生并输出学生的信息 void Delete(int num);/7.删除:提供学号,删除学号是该值的学生 void modify(int num);
26、/8.修改成绩:提供学号,修改(重新输入)学生信息 void statistic();/9.统计函数,统计平均成绩 void sort(cj&h);/10.排序(降序):按平均成绩排序,形成排序的链表h void Insert(cj&h,node*p);/在有序表h中结点后仍有序(排序的一个辅助函数:void output();/11:输出链表中各结点值 void wf(char*f);/12.由链表,形成文件 cj();/13(1):析构函数,程序运行结束时,删除链表中的各结点,void print1();/13(2):输出一个同学的成绩(标题)void print2(node*p);/13
27、(3)输出一个同学的成绩 node*gethead()return head;/13(4)获取头指针 int Length()const;/13(5)计算链表的长度;第47页/共97页cj:cj()/1:构造函数,建立一个只有附加头结点的空链表head=new node;head-next=0;第48页/共97页void cj:input()/2:录入学生信息:由键盘一个一个输入学生的信息,并在表的尾上追加)int Class;char name8;int num;float c6,ave;int order;node*p2;int t,i;coutt;while(t=1)cout请输入班级,
28、姓名,学号,电子技术,C+,数学,;cout英语,政治,体育成绩Classnamenumc0c1c2c3c4c5;p2=new node;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;第49页/共97页void cj:appen(node*p)/3.追加结点:在链表尾上链上一个结点(p所指的结点)node*p1,*p2;p1=head;p2=p1-next;while(p2)p1=p2;p
29、2=p2-next;p1-next=p;p-next=p2;第50页/共97页void cj:rf(char*f)/4.读文件,形成链表 int Class;char name8;int num;float c6,ave;int order;char ss250;/存放标题的 node*p2;ifstream ff;ff.open(f);ff.getline(ss,200);/取第一行标题ff.getline(ss,200);/取第二行标题ffClassnamenumc0c1c2c3c4c5;()p2=new node;ave=(c0+c1+c2+c3+c4+c5)/6;p2-Class=Cl
30、ass;p2-num=num;strcpy(p2-name,name);for(i=0;ikci=ci;p2-order=0;p2-ave=ave;appen(p2);ffClassnamenumc0c1c2c3c4c5;();第51页/共97页node cj:*post(int num)/5.定位:提供学号,返回指向该结点的一个指针)node*p1,*p2;p1=head;if(p1-next=0)return 0;p2=p1-next;while(p2-num!=num&p2-next!=0)p1=p2;p2=p2-next;if(p2-num=num)return p2;else ret
31、urn 0;第52页/共97页void cj:lookup(int num)/6.查询 提供学号,查找学生并输出学生的信息 node*p1;p1=post(num);/定位:提供学号,返回指向该结点的一个指针)if(p1!=0)print1();/输出一个同学的成绩(标题)print2(p1);/输出一个同学的信息 else cout无学生记录!next;if(p1=0)cout无学生记录!num!=num&p2-next!=0)p1=p2;p2=p2-next;if(p2-num=num)p1-next=p2-next;delete p2;cout已删除了这个学生的记录endl;else c
32、out没找到该学生!endl;return;第54页/共97页void cj:modify(int num)/8:修改函数,修改对应学号的学生成绩 node*p,*p2;p=post(num);/定位:提供学号,返回指向该结点的一个指针)if(p!=0)float c6,cout原成绩:;print1();print2(p);cout请输入新的成绩:c0c1c2c3c4c5;ave=(c0+c1+c2+c3+c4+c5)/6;for(i=0;ikci=ci;p-ave=ave;else cout没找到该学生!next;while(p1!=0)print2(p1);s1=s1+p1-kc0;s2
33、=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;while(p1)p2=new node;p2-ave=p1-ave;p2-Class=p1-Class;p2-num=p1-num;strcpy(p2-name,p1-name);for(j=0;jkcj=p1-kcj;Insert(h,p2);p1=p1-next;p1=h.gethead
34、()-next;int i=1;while(p1!=0)p1-order=i;i=i+1;p1=p1-next;第57页/共97页void cj:Insert(cj&h,node*p)/在有序表中插入一个结点后仍有序(10.排序(降序)的一个辅助函数:)node*p1,*p2;p1=h.gethead();if(p1-next=0)p1-next=p;p-next=0;else p2=p1-next;while(p2-next&p2-avep-ave)p1=p2;p2=p2-next;p1-next=p;p-next=p2;第58页/共97页 void cj:output()/11:输出链表中
35、各结点值 node*p;p=head-next;cout输出学生信息:next;coutendl;第59页/共97页void cj:wf(char*f)/12.由链表,形成文件 node*p;ofstream ff;ff.open(f);ff 学生成绩表endl;ff姓名 学号 班级 elec C+数学 英语 政治 体育 next;while(p)ffnametnumtClasst;ffkc0tkc1tkc2t;ffkc3tkc4tkc5next;();第60页/共97页 cj:cj()/13(1):析构函数,程序运行结束时,删除链表中的各结点,node*p1;while(head)p1=he
36、ad;head=head-next;delete p1;第61页/共97页void cj:print1()/13(2):输出一个同学的成绩(标题)cout“姓名 ”“学号 ”“班级 ”“电子 “;coutC+数学 英语 政治 体育 endl;void cj:print2(node*p)/13(3):输出一个同学的成绩 int I;coutnametnumtClasst;for(i=0;i=5;+i)coutkci;coutnext;while(p!=0)n=n+1;p=p-next;return n;node cj:*gethead()/13(5)获取头指针return head;第63页/共
37、97页void main()/主函数 cj A,B;int a;int num;while(1)cout*endl;cout*欢迎使用本系统(请选择你所要的功能)*endl;cout 0.退出系统.endl;cout 1.成绩录入.endl;cout 2.成绩修改.endl;cout 3.成绩查询.endl;cout 4.删除成绩.endl;cout 5.顺序输出所有人的成绩.endl;cout 6.统计平均成绩.endl;cout 7.显示学生人数 endl;cout 8.输出排序结果 endl;cout 9.读文件 endl;cout 10.写文件 endl;cout*endl;couta
38、;第64页/共97页switch(a)case 0:goto end;case 1:A.create();break;case 2:coutnum;A.modify(num);A.sort(B);break;case 3:A.sort(B);coutnum;B.lookup(num);break;case 4:coutnum;A.Delete(num);break;case 5:A.output();break;case 6:A.statistic();break;case 7:cout学生人数为:()endl;break;case 8:A.sort(B);B.output();break;c
39、ase 9:A.rf(abc);break;case 10:A.wf(abc);break;default:break;cout按任意键继续操作!endl;getchar();end:;cout谢谢您使用本系统!endl;第65页/共97页3、三角形面积验证程序的设计问题:问题:给出求解下列问题逐步求精的分析过程给出求解下列问题逐步求精的分析过程,并设计程序完成并设计程序完成其验证:其验证:已知一个正三角形已知一个正三角形ABC,其内分点,其内分点A1、B1、C1,使得,使得2AC1=C1B、2BA1=A1C、2CB1=B1A,连接,连接CC1、BB1、AA1,三条直线分别相交于三条直线分别相
40、交于A2、B2、C2。要求编写程序验证。要求编写程序验证,三角形三角形A2B2C2的面积是三角形的面积是三角形ABC的面积的的面积的7分之一。分之一。第66页/共97页分析问题的基本方法分析问题的基本方法 基本方法是:基本方法是:由顶向下,逐步求精;由顶向下,逐步求精;即:即:将复杂问题,分解为小问题,小问题解决将复杂问题,分解为小问题,小问题解决了,大问题也就解决了。了,大问题也就解决了。例如:如下的问题 已知一个正三角形ABC,其内分点A1、B1、C1,使得2AC1=C1B、2BA1=A1C、2CB1=B1A,连接CC1、BB1、AA1,三条直线分别相交于A2、B2、C2(见图1)。要求编
41、写程序验证:三角形A2B2C2面积是三角形 ABC面积的七分之一.第67页/共97页 (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的顶点坐
42、标(A、B、C)分析分析实实现现第68页/共97页设计分析(1)采用什么设计方法:面向结构的设计方法?面向对象的设计方法?(2)不同的设计方法,需要定义不同的数据结构(数据类型),如何定义数据结构;结构体 类 (3)下面我们对两种设计方法,分别给出设计程序 第69页/共97页 采用“面向结构的设计方法”第70页/共97页采用“面向结构的设计方法”需要的工作步骤:(1)定义有关的结构体:点,直线,三角形(2)给出有关的函数设计实现:根据前面的分析,需要定义什么函数,完成什么功能,使用什么参数,函数返回值及其类型;(3)设计主函数:调用(2)中的函数,完成要求的功能。1、已知一个三角形t,求面积m
43、j;2、已知两顶点a,b,求内分点 (在这里两段的比值为1:2);3、已知两顶点p1,p2,求直线方程line4、已知两直线l1,l2,求交点坐标5、已知两点P1,P2,求距离第71页/共97页(1)首先,定义有关的数据结构(采用结构体)三角形结构(三边形成三角形)(a,b,c)struc T double a;double b;double c;直线方程结构:ax+by+c=0struc L double a;double b;double c;点结构:(x,y)struc P double x;double y;直线方程结构:y=kx+bstruc L double k;double b;
44、或者第72页/共97页(2)给出有关的函数设计 (注意:形参和函数的返回值):1、已知一个三角形t,求面积mj;double mj(T t)double L,ss;L=(t.a+t.b+t.c)/2;ss=sqr(L*(L-)*(L-)*(L-);return ss;第73页/共97页2、已知两顶点a,b,求内分点 (在这里两段的比值为1:2);P fd(P a,P b)P q;=(b.x-a.x)/3+a.x;=(b.y-a.y)/3+a.y;return q;第74页/共97页3、已知两顶点p1,p2,求直线方程line (ax+by+c=0)L zx(P p1,P p2)L q;实现过程
45、.第75页/共97页4、已知两直线l1,l2,求交点坐标 P jd(L l1,L l2)实现过程.第76页/共97页5、已知两点P1,P2,求距离 double jl(P p1,P p2)实现过程.第77页/共97页(3)设计主函数(调用前面的各函数,完成计算)Void main()P A,B,C,A1,B1,C1,A2,B2,C2;L L1,L2,L3;double d1,d2,d3,s1,s2;double a=10.00;=0;B.y=0;=a/2;A.y=a*sqr(3)/2;=0;A1=fd(B,C);B1=fd(C,A);C1=fd(A,B);L1=zx(A,A1);L2=zx(B
46、,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)/?cout“正确!”;else cout“错误!”第78页/共97页 采用“面向对象的设计方法”第79页/共97页采用“面向对象的设计方法”需要的工作步骤:(1)定义有关的类:点,直线,三角形 (2)设计主函数:定义有关的对象,并调用有关的函数,完成要求的功能。注意:每个类有什么数据成员;每个类有什么成员函数,都具有什么功能?第80页/共97
47、页(1)首先,定义有关的类结构 class P private:double x;double y;public:/构造函数,用a,b提供值,形成点 P(double a,double b);/构造函数,由两直线a,b形成交点 P(line a,line b);/构造函数,由两顶点a,b,及比值r,求内分点 P(P a,P b,double r);/由两顶点,求两点间的距离 (使用友元)friend double d(P a,P b);/显示顶点的值 void show();点类的定义:点结构:(x,y)第81页/共97页/构造函数,用a,b提供值,形成点P:P(double a,double
48、 b)x=a;y=b;第82页/共97页/构造函数,由两直线a,b形成交点P:P(line a,line b)/直线采用:y=kx+b 第83页/共97页/构造函数,由两顶点a,b,及比值r,求内分点P:P(P a,P b,double r)第84页/共97页/由两顶点,求两点间的距离(使用友元)friend double d(P a,P b)第85页/共97页/显示顶点的值void P:show()第86页/共97页直线类结构直线方程结构:ax+by+c=0class L double a;double b;double c;直线方程结构:y=kx+bclass L double k;dou
49、ble b;或者本题目中,使用,第二种格式第87页/共97页直线方程结构:y=kx+bclass Lprivate:double k;double b;public:/构造函数,由两参数,直接赋值 L(double x,double y);/构造函数,由两点形成直线 L(P x,P y);/显示直线信息 void show();第88页/共97页/构造函数,由两参数,直接赋值L:L(double x,double y)第89页/共97页/构造函数,由两点形成直线L:L(P x,P y)第90页/共97页/显示直线信息void L:show()第91页/共97页三角形类结构 (三边形成三角形)(
50、a,b,c)class T private:double a;double b;double c;public:/构造函数,由三参数,直接赋值;T(double x,double y,double z);/显示三角形的信息;void show();/计算三角形面积 double s();第92页/共97页/构造函数,由三参数,直接赋值T:T(double x,double y,double z)第93页/共97页/显示三角形的信息;void T:show()第94页/共97页/计算三角形面积double T:s()第95页/共97页设计主函数(定义对象,完成计算)void main()doub