C++面向对象程序附合导线、解析交会、角度转换类及计算源代码
- 格式:doc
- 大小:73.50 KB
- 文档页数:10
c 面向对象编程C语言是一种广泛应用于系统开发和嵌入式领域的编程语言,它提供了丰富的面向对象编程(Object-Oriented Programming, OOP)特性。
面向对象编程是一种编程范式,通过将数据和操作封装在对象中,使得代码更易于理解、维护和重用。
在C语言中,可以通过结构体和函数指针来实现面向对象编程的特性。
面向对象编程的核心思想是将数据和操作封装在对象中。
在C语言中,可以使用结构体来定义对象的数据成员,使用函数指针来定义对象的操作。
通过将相关的数据和操作封装在一个对象中,可以提高代码的可读性和可维护性。
同时,通过定义接口函数来操作对象,可以对对象的数据进行封装,保证数据的安全性和一致性。
面向对象编程的另一个重要特性是继承。
继承是指一个对象可以从另一个对象中继承数据和操作。
在C语言中,可以通过在结构体中包含其他结构体来实现继承的效果。
通过继承,可以实现代码的重用,减少代码的冗余。
多态是面向对象编程的另一个重要特性。
多态是指一个对象可以根据不同的上下文环境表现出不同的行为。
在C语言中,可以通过函数指针和函数回调来实现多态的效果。
通过多态,可以实现代码的灵活性和扩展性,使得程序可以根据不同的需求进行适应和变化。
除了上述特性之外,面向对象编程还包括封装、抽象和消息传递等概念。
封装是指将对象的数据和操作隐藏起来,只提供有限的接口函数来访问和操作对象。
通过封装,可以实现数据的保护和隔离,提高代码的安全性和可靠性。
抽象是指将对象的共同特征提取出来,形成一个抽象类或接口,从而实现代码的模块化和重用。
消息传递是指对象之间通过发送消息来进行通信和交互。
通过消息传递,可以实现对象之间的解耦和松散耦合,提高代码的灵活性和可维护性。
虽然C语言不是一种纯粹的面向对象编程语言,但是通过结构体和函数指针的组合使用,可以在C语言中实现面向对象编程的特性。
通过合理的设计和封装,可以将复杂的系统分解成多个对象,提高代码的可读性和可维护性。
C语言面向对象编程概述面向对象编程(Object-Oriented Programming,简称OOP)是一种广泛应用于软件开发中的编程范式。
C语言作为一种高效且功能强大的程序设计语言,也可以通过使用面向对象的编程思想来进行开发。
本文将概述C语言面向对象编程的基本概念、特征和应用。
1. 面向对象编程的基本概念面向对象编程将计算机程序设计中的问题看作是一系列对象之间的交互。
每个对象都有自己的属性(数据)和行为(方法),对象间通过消息的交换进行通信和协作。
C语言通过结构体和函数的组合实现对象的建立,使得程序更加模块化、易于维护和扩展。
2. 面向对象编程的特征2.1 封装性(Encapsulation)封装性是面向对象编程的核心概念之一。
通过将数据和方法封装在对象内部,并通过访问控制,实现对象内部行为的隐藏和保护。
C语言中可以使用结构体来封装数据,并使用函数对数据进行处理和访问控制。
2.2 继承性(Inheritance)继承性允许我们通过现有的类创建新的类,并从现有的类继承属性和行为。
这样可以避免重复编写代码,提高代码复用性和灵活性。
虽然C语言本身不直接支持继承,但可以通过结构体的嵌套和指针的使用来模拟实现继承的效果。
2.3 多态性(Polymorphism)多态性指同一类型的对象在不同情况下表现出不同的行为。
通过继承和函数指针的运用,C语言可以实现多态性。
函数指针的使用可以减少对具体实现的依赖,增强代码的灵活性和可维护性。
3. C语言面向对象编程的应用3.1 类模拟通过使用结构体和函数的组合,可以在C语言中模拟类的概念。
结构体包含数据成员和函数成员,函数成员用于操作数据成员、实现类的方法。
通过定义不同的结构体和函数,可以创建多个对象实例,实现对不同类的模拟。
3.2 封装数据结构和行为C语言可以将相关数据和函数组成的结构体作为一种封装的方式,实现对数据和行为的统一管理。
通过引入访问控制,可以有效保护数据的安全性和正确性。
C面向对象程序设计面向对象程序设计(Object-Oriented Programming,简称OOP)是一种程序设计策略,旨在通过将现实世界的实体抽象为对象,以及通过对象之间的交互来解决复杂问题。
OOP 可以让程序更加灵活、可维护和可扩展。
OOP的关键概念有:封装、继承和多态。
封装是OOP的基本特性之一,它指的是将数据和方法捆绑在一起,形成一个对象。
对象内部的数据称为对象的属性,对象的方法用于封装处理数据的逻辑。
通过封装,对象可以隐藏内部的实现细节,只暴露出有限的接口供其他对象使用。
这样可以保护数据的完整性和安全性,同时也提供了代码的复用性和可维护性。
继承是指一个对象可以从另一个对象那里获取属性和方法,而不需要重新编写代码。
通过继承,可以构建对象之间的层次关系。
继承可以分为单继承和多继承。
在单继承中,一个子类只能继承一个父类,而在多继承中,一个子类可以同时继承多个父类。
继承的好处是提高了代码的复用性和可扩展性,同时也提供了一种自然的抽象机制。
多态是指同一个方法可以在不同的对象上执行不同的行为。
通过多态,可以针对对象具体的类型调用相应的方法,而不需要在编写代码时确定对象的类型。
多态提供了更灵活和可扩展的设计方案,可以减少代码的冗余和重复。
除了封装、继承和多态,OOP还包括其他的概念和特性,如抽象、接口、组合等。
抽象是指将具有相同特征和行为的对象抽象为类。
类是一个抽象的概念,它描述了对象的属性和方法,不关心对象的具体实现细节。
抽象提供了一种理念上的概括,使得程序的设计更加清晰和可处理。
接口是一组定义了一组方法规范的集合,用于描述对象之间的交互方式。
接口定义了不同对象之间的公共协议,使得不同的对象可以方便地互相交互。
组合是指将多个对象组合到一个更大的对象中。
通过组合,可以创建一个更复杂的对象,该对象可以使用其中的各个部分,还可以使用部分的组合来实现更高级别的功能。
在实际的程序设计中,OOP已经得到了广泛的应用。
c语言面向对象编程
1. C语言面向对象编程
C语言面向对象编程(Object-oriented Programming,简称OOP)是一种最受欢迎的数据表示和程序构造技术,自小到大,语言按照这
种形式进行构建,发展了许多特性,而这特性都是C语言所带来的新
的思想。
主要有:封装、继承、多态性和抽象性。
2. 封装
封装是指将对象的信息和对象的操作封装在一起,这样可以将复
杂性更好地隐藏起来,增强模块之间的独立性,使它们相互之间更加
松耦合,同时提供更丰富和更完全的接口,使得类及其实例更加有可
读性。
3. 继承
继承是指将一个类(超类或父类)的属性和行为继承给另一个类(子类),以便子类可以直接使用超类的属性和行为,实现代码的重用。
4. 多态性
多态性是指相同的代码,可以根据实参的不同而产生不同的行为,比如同一段代码可以根据传入的不同参数引起不同的行为,不同的类
的不同的实例也可以引起不同的行为。
5. 抽象性
抽象性是指将客观实体抽象出来做成一个对象,从而达到数据抽象和功能抽象从而简化程序,提高程序设计的效率,使得更加容易理解、修改和改进程序。
总之,C语言面向对象编程涉及到封装、继承、多态性和抽象性四个特性,它们极大地改变了程序设计中的思维方式,使用它们对对象可以有更完全的控制,从而使得程序更加易读、易懂、易修改、易构造和易改进。
目录一.任务一 (1)1.1任务介绍及小组成员任务分配 (1)1.2设计思想及主要流程图 (1)1.3主要程序清单 (2)1.4运行结果及分析 (3)2.1任务介绍及小组成员任务分配 (3)2.2设计思想及主要流程图 (4)2.3主要程序清单 (5)2.4运行结果及分析 (6)3.1任务介绍及小组成员任务分配 (7)3.2设计思想及主要流程图 (7)3.3主要程序清单 (8)3.4运行结果及分析 (11)二.任务二 (12)1任务介绍及小组成员任务分配 (12)2设计思想及主要流程图 (12)3主要程序清单 (18)4.运行结果及分析 (22)三、收获、体会及建议: (23)一.任务一1.1任务介绍及小组成员任务分配任务介绍根据输出设计类设计类就是根据数据封装的要求,抽象出适合的类。
有如下测试程序和测试程序的输出结果,要求设计类Welcome。
void main(){Welcome we;Welcome you(we);you.Display();you.Set(“Thank you.”);cout<<you.Get()<<endl;you.talk();you.Display();}测试程序的输出结果如下:Welcome!Thank you.输入:How about you?输出:How about you?输入:Fine,thank you.输出:Fine,thank you.输入:OKAll rightGoodbye!OKGoodbye!Goodbye!设计类Welcome 的原则1)在头文件Cpp1.h 中声明类2)在Cpp1.cpp中实现类3)使用内联函数定义Display()函数1.2设计思想及主要流程图设计思路该题要求根据主函数设计类且已给出运行结果。
首先要分析一下主函数,了解其意义之后再根据主函数中的Welcome we;Welcome you(me);结合任务中所给的测试程序的输出结果,定义Welcome类,输出Welcome!只有输入为0K时,才会输出All rightGoodbye!OK否则输入什么输出什么,所以在这里定义一个函数talk,并且用do-while结构来实现循环。
C面向对象程序设计C面向对象程序设计是一种编程方法论,该方法强调将问题分解为对象并定义对象之间的关系。
它是一种用于构建可重用、可维护和模块化的软件系统的方法。
在本文中,我将探讨C面向对象程序设计的原理、特点以及它的优点。
C面向对象程序设计的核心思想是将程序的各个部分抽象为对象,并将这些对象分解为可独立的组件。
每个对象都有自己的属性和方法,可以对外部进行操作和被操作。
对象之间通过消息传递来进行通信和交互,这样可以实现对象的封装性和松耦合性。
1.封装性:对象的内部实现细节对外部是隐藏的,只提供有限的接口来与外界进行数据和方法的交互。
这样可以确保数据的安全性和代码的安全性。
2.继承性:通过继承机制,可以创建新的类并从现有类派生,从而实现代码的重用。
继承可以广泛应用于软件开发中,使得代码具有更高的可扩展性和可维护性。
3.多态性:多态是指同一个方法可以具有不同的实现方式,根据不同的对象调用相同的方法可以得到不同的结果。
这种特性增强了代码的灵活性和可扩展性。
1.代码的可重用性:通过继承和多态等机制,可以实现代码的重用,减少代码的编写量。
这样可以提高开发效率,减少项目的开发时间。
2.代码的可维护性:面向对象程序设计鼓励将程序分解为小的模块,并且每个模块都有明确的功能和接口。
这样使得代码更易于理解和维护,提高了软件的可维护性。
3.代码的可扩展性:通过继承和多态等机制,可以方便地添加新的功能和修改现有功能。
这样可以使得软件更具有灵活性和可扩展性,适应不断变化的需求。
在C语言中实现面向对象程序设计有一些技巧。
首先,使用结构体来表示对象的数据成员,通过函数来实现对象的方法。
结构体提供了封装性的特性,可以将相关的数据和函数封装在一起。
其次,使用函数指针来实现多态性。
函数指针可以在运行时动态绑定不同的函数实现,实现不同对象之间的方法调用。
总结起来,C面向对象程序设计是一种强调对象和对象之间关系的编程方法,具有封装性、继承性和多态性等特点。
C++面向对象程序设计习题解答与上机指导(第2版)习题参考答案源代码使用源程序的几点注意事项(1) 由于源程序在复制、编辑、解压缩等过程中可能引起部分符号(主要是标点符号,如分号、冒号、逗号、引号)的字体、半全角等发生变化,在编译时可能被检出语法错误,只要使用“替换”功能,纠正后即能顺利运行。
(2) 有的C++系统(如Visual C++6.0)没有完全实现C++标准,它所提供的不带后缀的.h的头文件不支持友元运算符重载函数,在Visual C++6.0中编译会出错,这时可采用带后缀的.h头文件。
将程序中的#include<iostream>using namespace std。
修改成#include<iostream.h>即可顺利运行。
第2章 C++基础【2.2】下面是一个C程序,改写它,使它采用C++风格的I/O语句。
#include<stdio.h>int main(){ int a,b,d,min。
printf("Enter two numbers:")。
scanf("%d%d",&a,&b)。
min=a>b? b:a。
for (d=2。
d<min。
d++)if (((a%d)==0)&&((b%d)==0)) break。
if (d==min){ printf("No common denominators\n")。
return 0。
}printf("The lowest common denominator is %d\n",d)。
return 0。
}【解】#include<iostream>using namespace std。
int main(){ int a,b,d,min。
cout<<"Enter two numbers:"。
c 面向对象设计程序C语言是一种面向过程的编程语言,但是通过一些技巧和设计模式,我们也可以在C语言中实现面向对象的程序设计。
本文将介绍如何在C语言中进行面向对象的设计。
在面向对象的程序设计中,我们将程序中的数据和操作数据的函数封装在一起,形成一个对象。
对象可以拥有属性(数据)和方法(操作),通过调用对象的方法来实现对数据的操作。
在C语言中,我们可以使用结构体来定义一个对象。
结构体可以包含多个不同类型的数据,这些数据可以表示对象的属性。
同时,我们可以通过函数指针来实现对象的方法。
函数指针可以指向一个函数,通过调用函数指针来执行相应的操作。
我们需要定义一个结构体来表示对象。
结构体中的成员变量可以表示对象的属性,例如:```ctypedef struct {int age;char name[20];} Person;```上面的代码定义了一个名为Person的结构体,包含一个整型变量age和一个字符数组name,分别表示人的年龄和姓名。
接下来,我们可以定义一些函数来操作这个对象。
这些函数可以通过函数指针的方式存储在对象中,例如:```ctypedef struct {int age;char name[20];void (*sayHello)(Person*);} Person;void sayHello(Person* person) {printf("Hello, my name is %s and I am %d years old.\n", person->name, person->age);}```上面的代码定义了一个名为sayHello的函数,该函数接受一个Person类型的指针作为参数,输出该人的姓名和年龄。
接下来,我们可以创建一个对象并调用其方法。
首先,我们需要创建一个Person类型的变量,并初始化其成员变量,例如:```cPerson person;person.age = 20;strcpy(, "Tom");person.sayHello = sayHello;```上面的代码创建了一个名为person的对象,设置其年龄为20,姓名为Tom,并将sayHello函数的地址存储在对象的sayHello成员变量中。
#include"stdafx.h"#include<iostream>#include<cmath>#include<string>#include"DegSwitch.h"#include"Coordinate.h"#include"LineCalculation.h"using namespace std;const int N=50;void main(){int degree(int a);int coordinate(int b);int linecalculation(int c);char MODE;cout<<"D.角度转换C.解析交会L.附合导线"<<endl<<"MODE(D/C/L):"; cin>>MODE;cout<<endl;int a;switch(MODE){case'D':a=degree(0);break;case'C':a=coordinate(0);break;case'L':a=linecalculation(0);break;}}// 附合导线验算函数int linecalculation(int c){static int A[N][3],AA[3],CAng[N][3];static double ang[N],cang[N],cang2[N],C[N][2],S[N],Ccoo[N][2],dxdy[N][2];double x1,y1,s=0,x=0,y=0,dx,dy,sc_ang,ec_ang;int b=-1,i=0,j=0,n=0,d,m,s0,f_a;char ch1;FILE *fp;fp=fopen("E:\\Mine\\learning\\测量程序设计\\M.txt","r");if(!fp) printf("文件打开失败");;for(i=0;i<3;i++)fscanf(fp,"%d",&AA[i]);fscanf(fp,"%lf %lf",&x1,&y1);for(i=0;i<N;i++)for(j=0;j<3;j++)fscanf(fp,"%d",&A[i][j]);fscanf(fp,"%c",&ch1);for(i=0;i<N;i++)fscanf(fp,"%lf",&S[i]);fclose(fp);DegSwitch *e0=new DegSwitch();sc_ang=e0->DMS_s(AA[0],AA[1],AA[2]);LineCalculation *e=new LineCalculation();e->Start(&n,A,ang,S,&s,&x,&y);e->Angle_M(ang,n,b,&f_a,&d,&m,&s0);e->Angle_A(ang,n,b,f_a,S);e->C_Angle(ang,cang,n,b,sc_ang);DegSwitch *q=new DegSwitch;for(i=0;i<n;i++)cang2[i]=q->DMS_Rad(0,0,cang[i]);e->Coordinate_M(Ccoo,S,sc_ang,cang,n,x,y,&dx,&dy);e->Coordinate_A(Ccoo,dxdy,n,dx,dy,S,s);e->Coordinate(C,Ccoo,n,x1,y1);cout<<endl<<"调整后角度值:"<<endl;DegSwitch *u=new DegSwitch;for(i=0;i<n;i++){u->s_DMS(ang[i],&A[i][0],&A[i][1],&A[i][2]);cout<<A[i][0]<<" "<<A[i][1]<<" "<<A[i][2]<<endl;}cout<<endl<<"坐标方位角:"<<endl;for(i=0;i<n;i++){u->s_DMS(cang[i],&CAng[i][0],&CAng[i][1],&CAng[i][2]);cout<<CAng[i][0]<<" "<<CAng[i][1]<<" "<<CAng[i][2]<<endl; }cout<<endl<<"坐标:"<<endl;for(i=0;i<n-1;i++)cout<<C[i][0]<<" "<<C[i][1]<<endl;cout<<n<<endl;/*fp=fopen("e:\\mine\\learning\\测量程序设计\\M2.txt","w");if(!fp) printf("文件创建失败");fprintf(fp,"%s","调整后角度值:\n");for(i=0;i<n;i++){for(j=0;j<3;j++)fprintf(fp,"%d ",A[i][j]);fprintf(fp,"%s"," \n");}fprintf(fp,"%s","坐标方位角:\n");for(i=0;i<n-1;i++){for(j=0;j<3;j++)fprintf(fp,"%d ",CAng[i][j]);fprintf(fp,"%s"," \n");}fprintf(fp,"%s","坐标:\n");for(i=0;i<n-1;i++){for(j=0;j<2;j++)fprintf(fp,"%lf ",C[i][j]);fprintf(fp,"%s"," \n");}fclose(fp);*/return 0;}// 解析交会验算函数int coordinate(int b){int d1,m1,s1,d2,m2,s2;double xa,ya,xb,yb,xc,yc,xp,yp,ang1,ang2,s;char mode1;cout<<endl<<"1.坐标正算2.坐标反算3.前方交会4.后方交会"<<endl<<"请选择计算方式:"; cin>>mode1;Coordinate *m=new Coordinate();DegSwitch *n=new DegSwitch();switch(mode1){case'1':cout<<"已知点坐标:"<<endl;cin>>xa>>ya;cout<<"距离:"<<endl;cin>>s;cout<<"连线方位角:"<<endl;cin>>d1>>m1>>s1;ang1=n->DMS_Rad(d1,m1,s1);m->C1SA_C2(xa,ya,s,ang1,&xb,&yb);cout<<"所求点坐标:"<<endl<<xb<<" "<<yb<<endl;break;case'2':cout<<"两点坐标:"<<endl;cin>>xa>>ya>>xb>>yb;m->C1C2_SA(xa,ya,xb,yb,&s,&ang1);n->Rad_DMS(ang1,&d1,&m1,&s1);cout<<"距离:"<<s<<"m"<<endl;cout<<"方位角:"<<d1<<"度"<<m1<<"分"<<s1<<"秒"<<endl;break;case'3':cout<<"已知两点坐标:"<<endl;cin>>xa>>ya>>xb>>yb;cout<<"观测角:"<<endl;cin>>d1>>m1>>s1;cin>>d2>>m2>>s2;ang1=n->DMS_Rad(d1,m1,s1);ang2=n->DMS_Rad(d2,m2,s2);m->C1C2A1A2_P(xa,ya,ang1,xb,yb,ang2,&xp,&yp);cout<<"所求点坐标:"<<endl<<xp<<" "<<yp<<endl;break;case'4':cout<<"已知三点坐标:"<<endl;cin>>xa>>ya>>xb>>yb>>xc>>yc;cout<<"观测角:"<<endl;cin>>d1>>m1>>s1;cin>>d2>>m2>>s2;ang1=n->DMS_Rad(d1,m1,s1);ang2=n->DMS_Rad(d2,m2,s2);m->C1C2C3_P(xa,ya,xb,yb,xc,yc,ang1,ang2,&xp,&yp);cout<<"所求点坐标:"<<endl<<xp<<" "<<yp<<endl;break;}cout<<endl;return 0;}// 角度转换验算函数int degree(int a){char mode2;double rawdata,result,Xa,Ya,Xb,Yb;int d=0,m=0,s=0;DegSwitch *x=new DegSwitch();cout<<"1.Deg_DMS 2.DMS_Deg 3.Deg_Rad 4.Rad_Deg 5.Rad_DMS 6.DMS_Rad 7.Coo_Angle"<<endl<<"请选择转换方式:";cin>>mode2;cout<<endl<<"请输入原始数据:";switch(mode2){ case'1':cin>>rawdata;x->Deg_DMS(rawdata,&d,&m,&s);cout<<endl<<"转换结果:"<<d<<" "<<m<<" "<<s<<endl;break;case'2':cin>>d>>m>>s;result=x->DMS_Deg(d,m,s);cout<<endl<<"转换结果:"<<result<<endl;break;case'3':cin>>rawdata;result=x->Deg_Rad(rawdata);cout<<endl<<"转换结果:"<<result<<endl;break;case'4':cin>>rawdata;result=x->Rad_Deg(rawdata);cout<<endl<<"转换结果:"<<result<<endl;break;case'5':cin>>rawdata;x->Rad_DMS(rawdata,&d,&m,&s);cout<<endl<<"转换结果:"<<d<<" "<<m<<" "<<s<<endl;break;case'6':cin>>d>>m>>s;result=x->DMS_Rad(d,m,s);cout<<endl<<"转换结果:"<<result<<endl;break;case'7':cin>>Xa>>Ya>>Xb>>Yb;result=x->C_A(Xa,Ya,Xb,Yb);cout<<endl<<"转换结果:"<<result<<endl;break;}cout<<endl;return 0;}//附合导线类#include"StdAfx.h"#include<cmath>#include"LineCalculation.h"#include"DegSwitch.h"using namespace std;const double PI=648000;const int N=50;LineCalculation::LineCalculation(void){}LineCalculation::~LineCalculation(void){}// 附合导线-计数、角度转换、原始坐标增量计算函数void LineCalculation::Start(int *n,int A[][3],double ang[],double S[],double *s,double *x,double *y){int i=0,j=0;for(i=0;i<N;i++){if(S[i]==0)break;*n=*n+1;}DegSwitch *m=new DegSwitch();for(i=0;i<N;i++)ang[i]=m->DMS_s(A[i][0],A[i][1],A[i][2]);for(i=0;i<*n;i++)*s=*s+S[i];}// 附合导线-角度闭合差计算函数void LineCalculation::Angle_M(double ang[],int n,int b,int *f_a,int*d,int*m,int*s) //n已知,ang[]中为弧度,起始角、终止角为弧度值{double ec_ang1,sum1=0;for(int i=0;i<n;i++)sum1=sum1+ang[i];ec_ang1=(n-2)*PI;*f_a=sum1-ec_ang1;DegSwitch *x=new DegSwitch();x->s_DMS(*f_a,&(*d),&(*m),&(*s));}// 附合导线-角度闭合差调整函数void LineCalculation::Angle_A(double ang[],int n,int b,int f_a,double S[]){int ff=f_a/n*b;for(int i=0;i<n;i++)ang[i]=ang[i]+ff;int m=0,f1=0,f2=0;for(int j=1;j<n;j++)if(S[j]<=S[m])m=j;if((f_a%n)!=0)if((f_a/n)%2!=0){f1=(f_a%n)/2;f2=f1+1;}else {f1=(f_a%n)/2;f2=f1;}ang[m-1]=ang[m-1]+f1*b;ang[m]=ang[m]+f2*b;}// 附合导线-坐标方位角计算函数void LineCalculation::C_Angle(double ang[],double cang[],int n,int b,double sc_ang){cang[0]=sc_ang+b*(PI-ang[0]);if(cang[0]<0) cang[0]=cang[0]+2*PI;if(cang[0]>2*PI) cang[0]=cang[0]-2*PI;for(int i=1;i<n;i++){cang[i]=cang[i-1]+b*(PI-ang[i]);if(cang[i]<0) cang[i]=cang[i]+2*PI;if(cang[i]>2*PI) cang[i]=cang[i]-2*PI;}}// 附合导线-坐标增量计算函数void LineCalculation::Coordinate_M(double Ccoo[][2],double S[],double sc_ang,double cang[],int n,double x,double y,double*dx,double*dy){int i;DegSwitch *e0=new DegSwitch();sc_ang=e0->DMS_Rad(0,0,sc_ang);Ccoo[0][0]=S[0]*cos(sc_ang);Ccoo[0][1]=S[0]*sin(sc_ang);double xs=0,ys=0;for(i=1;i<n;i++){Ccoo[i][0]=S[i]*cos(cang[i-1]);Ccoo[i][1]=S[i]*sin(cang[i-1]);xs=xs+Ccoo[i][0];ys=ys+Ccoo[i][1];}*dx=xs-x;*dy=ys-y;}// 附合导线-改正后坐标增量计算函数void LineCalculation::Coordinate_A(double Ccoo[][2],double dxdy[][2],int n,double dx,double dy,double S[],double s){for(int i=0;i<n;i++){dxdy[i][0]=dx*S[i]/s;dxdy[i][1]=dy*S[i]/s;Ccoo[i][0]-=dxdy[i][0];Ccoo[i][1]-=dxdy[i][1];}}// 附合导线-各点坐标计算函数void LineCalculation::Coordinate(double C[][2],double Ccoo[][2],int n,double xa,double ya){C[0][0]=xa+Ccoo[0][0];C[0][1]=ya+Ccoo[0][1];int i=0,j=0;for(i=1;i<n;i++)for(j=0;j<2;j++)C[i][j]=C[i-1][j]+Ccoo[i][j];}// 解析交会类#include"StdAfx.h"#include"Coordinate.h"#include<cmath>#include"DegSwitch.h"using namespace std;Coordinate::Coordinate(void){}Coordinate::~Coordinate(void){}// 解析交会-坐标正算函数void Coordinate::C1SA_C2(double xa,double ya,double s,double ang,double*xb,double*yb){*xb=xa+s*cos(ang);*yb=ya+s*sin(ang);}// 解析交会-坐标反算函数void Coordinate::C1C2_SA(double xa,double ya,double xb,double yb,double*s,double*ang) {DegSwitch*x=new DegSwitch();*s=sqrt(pow((xb-xa),2)+pow((yb-ya),2));*ang=x->C_A(xa,ya,xb,yb);}// 解析交会-前方交会函数void Coordinate::C1C2A1A2_P(double xa,double ya,double ang1,double xb,double yb,doubleang2,double*xp,double*yp){double a=tan(ang1),b=tan(ang2);*xp=(xa*a+xb*b+(yb-ya)*a*b)/(a+b);*yp=(ya*a+yb*b+(xa-xb)*a*b)/(a+b);}// 解析交会-后方交会函数void Coordinate::C1C2C3_P(double xa,double ya,double xb,double yb,double xc,double yc,double ang1,double ang2,double*xp,double*yp){double a=tan(ang1),b=tan(ang2);double tanBP=((yb-ya)/a+(yb-yc)/b+xa-xc)/((xb-xa)/a+(xb-xc)/b-(ya-yc));double BP=atan(tanBP);*xp=xb+((yb-ya)*(1/a-tanBP)-(xb-xa)*(1+tanBP/a))/(1+tanBP*tanBP);*yp=yb+(*xp-xb)*tanBP;}// 角度转换类#include"StdAfx.h"#include<iostream>#include"DegSwitch.h"using namespace std;const double PI=3.1415926;DegSwitch::DegSwitch(void){}DegSwitch::~DegSwitch(void){}//角度转换成度分秒函数void DegSwitch::Deg_DMS(double Deg,int*a,int*b,int*c){int DMS_D=(int)Deg;*a=DMS_D;double DMS_M1=(Deg-DMS_D)*60;int DMS_M=(int)DMS_M1;*b=DMS_M;int DMS_S=int((DMS_M1-DMS_M)*60);*c=DMS_S;}// 度分秒转换成角度函数double DegSwitch::DMS_Deg(int D, int M, int S){double M1=(double)S/60.0+M;double Deg=M1/60.0+D;return Deg;}// 角度转换成弧度函数double DegSwitch::Deg_Rad(double Deg){double Rad=Deg/180.0*PI;return Rad;}// 弧度转换成角度函数double DegSwitch::Rad_Deg(double Rad){double Deg=Rad/PI*180;return Deg;}// 弧度转换成度分秒void DegSwitch::Rad_DMS(double Rad,int*a,int*b,int*c) {double Deg=Rad_Deg(Rad);DegSwitch *D1 ;D1=new DegSwitch();D1->Deg_DMS(Deg,&(*a),&(*b),&*(c));}// 度分秒转换成弧度double DegSwitch::DMS_Rad(int D, int M, int S){double Deg=DMS_Deg(D, M, S);double Rad=Deg_Rad(Deg);return Rad;}// 坐标方位角反算函数double DegSwitch::C_A(double xa, double ya, double xb, double yb) {double ang1=atan((yb-ya)/(xb-xa));double ang;if(xa==xb){if(yb>ya) ang=0;else ang=PI;}if(xb>xa){if(yb>=ya) ang=ang1;else ang=ang1+2*PI;}if(xb<xa)ang=ang1+PI;return ang;}// 度分秒转换成秒函数int DegSwitch::DMS_s(int D, int M, int S){int s=D*3600+M*60+S;return s;}// 秒转换成度分秒函数void DegSwitch::s_DMS(int s,int*D,int*M,int*S) {*S=s%60;*M=(s/60)%60;*D=s/3600;}。
c 语言面向对象编程在嵌入式开发中,C/C++语言是使用最普及的,在C++11版本之前,它们的语法是比较相似的,只不过C++提供了面向对象的编程方式。
虽然C++语言是从C语言发展而来的,但是今天的C++已经不是当年的C语言的扩展了,从20XX版本开始,更像是一门全新的语言。
C++在这几个问题上的解决的确很好,但是随着语言标准的逐步扩充,C++语言的学习难度也逐渐加大。
没有开发过几个项目,都不好意思说自己学会了C++,那些左值、右值、模板、模板参数、可变模板参数等等一堆的概念,真的不是使用2,3年就可以熟练掌握的。
但是,C语言也有很多的优点:其实最后一个优点是最重要的:使用的人越多,生命力就越强。
有这么一个公式:程序=数据结构+算法。
C语言中一般使用面向过程编程,就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步调用,在函数中对数据结构进行处理(执行算法),也就是说数据结构和算法是分开的。
C++语言把数据和算法封装在一起,形成一个整体,无论是对它的属性进行操作、还是对它的行为进行调用,都是通过一个对象来执行,这就是面向对象编程思想。
如果用C语言来模拟这样的编程方式,需要解决3个问题:数据的封装继承多态第一个问题:封装封装描述的是数据的组织形式,就是把属于一个对象的所有属性(数据)组织在一起,C语言中的结构体类型天生就支持这一点。
第二个问题:继承继承描述的是对象之间的关系,子类通过继承父类,自动拥有父类中的属性和行为(也就是方法)。
这个问题只要理解了C语言的内存模型,也不是问题,只要在子类结构体中的第一个成员变量的位置放置一个父类结构体变量,那么子类对象就继承了父类中的属性。
另外补充一点:学习任何一种语言,一定要理解内存模型!第三个问题:多态按字面理解,多态就是“多种状态”,描述的是一种动态的行为。
在C++中,只有通过基类引用或者指针,去调用虚函数的时候才发生多态,也就是说多态是发生在运行期间的,C++内部通过一个虚表来实现多态。
#include"stdafx.h"#include<iostream>#include<cmath>#include<string>#include"DegSwitch.h"#include"Coordinate.h"#include"LineCalculation.h"using namespace std;const int N=50;void main(){int degree(int a);int coordinate(int b);int linecalculation(int c);char MODE;cout<<"D.角度转换C.解析交会L.附合导线"<<endl<<"MODE(D/C/L):"; cin>>MODE;cout<<endl;int a;switch(MODE){case'D':a=degree(0);break;case'C':a=coordinate(0);break;case'L':a=linecalculation(0);break;}}// 附合导线验算函数int linecalculation(int c){static int A[N][3],AA[3],CAng[N][3];static double ang[N],cang[N],cang2[N],C[N][2],S[N],Ccoo[N][2],dxdy[N][2];double x1,y1,s=0,x=0,y=0,dx,dy,sc_ang,ec_ang;int b=-1,i=0,j=0,n=0,d,m,s0,f_a;char ch1;FILE *fp;fp=fopen("E:\\Mine\\learning\\测量程序设计\\M.txt","r");if(!fp) printf("文件打开失败");;for(i=0;i<3;i++)fscanf(fp,"%d",&AA[i]);fscanf(fp,"%lf %lf",&x1,&y1);for(i=0;i<N;i++)for(j=0;j<3;j++)fscanf(fp,"%d",&A[i][j]);fscanf(fp,"%c",&ch1);for(i=0;i<N;i++)fscanf(fp,"%lf",&S[i]);fclose(fp);DegSwitch *e0=new DegSwitch();sc_ang=e0->DMS_s(AA[0],AA[1],AA[2]);LineCalculation *e=new LineCalculation();e->Start(&n,A,ang,S,&s,&x,&y);e->Angle_M(ang,n,b,&f_a,&d,&m,&s0);e->Angle_A(ang,n,b,f_a,S);e->C_Angle(ang,cang,n,b,sc_ang);DegSwitch *q=new DegSwitch;for(i=0;i<n;i++)cang2[i]=q->DMS_Rad(0,0,cang[i]);e->Coordinate_M(Ccoo,S,sc_ang,cang,n,x,y,&dx,&dy);e->Coordinate_A(Ccoo,dxdy,n,dx,dy,S,s);e->Coordinate(C,Ccoo,n,x1,y1);cout<<endl<<"调整后角度值:"<<endl;DegSwitch *u=new DegSwitch;for(i=0;i<n;i++){u->s_DMS(ang[i],&A[i][0],&A[i][1],&A[i][2]);cout<<A[i][0]<<" "<<A[i][1]<<" "<<A[i][2]<<endl;}cout<<endl<<"坐标方位角:"<<endl;for(i=0;i<n;i++){u->s_DMS(cang[i],&CAng[i][0],&CAng[i][1],&CAng[i][2]);cout<<CAng[i][0]<<" "<<CAng[i][1]<<" "<<CAng[i][2]<<endl; }cout<<endl<<"坐标:"<<endl;for(i=0;i<n-1;i++)cout<<C[i][0]<<" "<<C[i][1]<<endl;cout<<n<<endl;/*fp=fopen("e:\\mine\\learning\\测量程序设计\\M2.txt","w");if(!fp) printf("文件创建失败");fprintf(fp,"%s","调整后角度值:\n");for(i=0;i<n;i++){for(j=0;j<3;j++)fprintf(fp,"%d ",A[i][j]);fprintf(fp,"%s"," \n");}fprintf(fp,"%s","坐标方位角:\n");for(i=0;i<n-1;i++){for(j=0;j<3;j++)fprintf(fp,"%d ",CAng[i][j]);fprintf(fp,"%s"," \n");}fprintf(fp,"%s","坐标:\n");for(i=0;i<n-1;i++){for(j=0;j<2;j++)fprintf(fp,"%lf ",C[i][j]);fprintf(fp,"%s"," \n");}fclose(fp);*/return 0;}// 解析交会验算函数int coordinate(int b){int d1,m1,s1,d2,m2,s2;double xa,ya,xb,yb,xc,yc,xp,yp,ang1,ang2,s;char mode1;cout<<endl<<"1.坐标正算2.坐标反算3.前方交会4.后方交会"<<endl<<"请选择计算方式:"; cin>>mode1;Coordinate *m=new Coordinate();DegSwitch *n=new DegSwitch();switch(mode1){case'1':cout<<"已知点坐标:"<<endl;cin>>xa>>ya;cout<<"距离:"<<endl;cin>>s;cout<<"连线方位角:"<<endl;cin>>d1>>m1>>s1;ang1=n->DMS_Rad(d1,m1,s1);m->C1SA_C2(xa,ya,s,ang1,&xb,&yb);cout<<"所求点坐标:"<<endl<<xb<<" "<<yb<<endl;break;case'2':cout<<"两点坐标:"<<endl;cin>>xa>>ya>>xb>>yb;m->C1C2_SA(xa,ya,xb,yb,&s,&ang1);n->Rad_DMS(ang1,&d1,&m1,&s1);cout<<"距离:"<<s<<"m"<<endl;cout<<"方位角:"<<d1<<"度"<<m1<<"分"<<s1<<"秒"<<endl;break;case'3':cout<<"已知两点坐标:"<<endl;cin>>xa>>ya>>xb>>yb;cout<<"观测角:"<<endl;cin>>d1>>m1>>s1;cin>>d2>>m2>>s2;ang1=n->DMS_Rad(d1,m1,s1);ang2=n->DMS_Rad(d2,m2,s2);m->C1C2A1A2_P(xa,ya,ang1,xb,yb,ang2,&xp,&yp);cout<<"所求点坐标:"<<endl<<xp<<" "<<yp<<endl;break;case'4':cout<<"已知三点坐标:"<<endl;cin>>xa>>ya>>xb>>yb>>xc>>yc;cout<<"观测角:"<<endl;cin>>d1>>m1>>s1;cin>>d2>>m2>>s2;ang1=n->DMS_Rad(d1,m1,s1);ang2=n->DMS_Rad(d2,m2,s2);m->C1C2C3_P(xa,ya,xb,yb,xc,yc,ang1,ang2,&xp,&yp);cout<<"所求点坐标:"<<endl<<xp<<" "<<yp<<endl;break;}cout<<endl;return 0;}// 角度转换验算函数int degree(int a){char mode2;double rawdata,result,Xa,Ya,Xb,Yb;int d=0,m=0,s=0;DegSwitch *x=new DegSwitch();cout<<"1.Deg_DMS 2.DMS_Deg 3.Deg_Rad 4.Rad_Deg 5.Rad_DMS 6.DMS_Rad 7.Coo_Angle"<<endl<<"请选择转换方式:";cin>>mode2;cout<<endl<<"请输入原始数据:";switch(mode2){ case'1':cin>>rawdata;x->Deg_DMS(rawdata,&d,&m,&s);cout<<endl<<"转换结果:"<<d<<" "<<m<<" "<<s<<endl;break;case'2':cin>>d>>m>>s;result=x->DMS_Deg(d,m,s);cout<<endl<<"转换结果:"<<result<<endl;break;case'3':cin>>rawdata;result=x->Deg_Rad(rawdata);cout<<endl<<"转换结果:"<<result<<endl;break;case'4':cin>>rawdata;result=x->Rad_Deg(rawdata);cout<<endl<<"转换结果:"<<result<<endl;break;case'5':cin>>rawdata;x->Rad_DMS(rawdata,&d,&m,&s);cout<<endl<<"转换结果:"<<d<<" "<<m<<" "<<s<<endl;break;case'6':cin>>d>>m>>s;result=x->DMS_Rad(d,m,s);cout<<endl<<"转换结果:"<<result<<endl;break;case'7':cin>>Xa>>Ya>>Xb>>Yb;result=x->C_A(Xa,Ya,Xb,Yb);cout<<endl<<"转换结果:"<<result<<endl;break;}cout<<endl;return 0;}//附合导线类#include"StdAfx.h"#include<cmath>#include"LineCalculation.h"#include"DegSwitch.h"using namespace std;const double PI=648000;const int N=50;LineCalculation::LineCalculation(void){}LineCalculation::~LineCalculation(void){}// 附合导线-计数、角度转换、原始坐标增量计算函数void LineCalculation::Start(int *n,int A[][3],double ang[],double S[],double *s,double *x,double *y){int i=0,j=0;for(i=0;i<N;i++){if(S[i]==0)break;*n=*n+1;}DegSwitch *m=new DegSwitch();for(i=0;i<N;i++)ang[i]=m->DMS_s(A[i][0],A[i][1],A[i][2]);for(i=0;i<*n;i++)*s=*s+S[i];}// 附合导线-角度闭合差计算函数void LineCalculation::Angle_M(double ang[],int n,int b,int *f_a,int*d,int*m,int*s) //n已知,ang[]中为弧度,起始角、终止角为弧度值{double ec_ang1,sum1=0;for(int i=0;i<n;i++)sum1=sum1+ang[i];ec_ang1=(n-2)*PI;*f_a=sum1-ec_ang1;DegSwitch *x=new DegSwitch();x->s_DMS(*f_a,&(*d),&(*m),&(*s));}// 附合导线-角度闭合差调整函数void LineCalculation::Angle_A(double ang[],int n,int b,int f_a,double S[]){int ff=f_a/n*b;for(int i=0;i<n;i++)ang[i]=ang[i]+ff;int m=0,f1=0,f2=0;for(int j=1;j<n;j++)if(S[j]<=S[m])m=j;if((f_a%n)!=0)if((f_a/n)%2!=0){f1=(f_a%n)/2;f2=f1+1;}else {f1=(f_a%n)/2;f2=f1;}ang[m-1]=ang[m-1]+f1*b;ang[m]=ang[m]+f2*b;}// 附合导线-坐标方位角计算函数void LineCalculation::C_Angle(double ang[],double cang[],int n,int b,double sc_ang){cang[0]=sc_ang+b*(PI-ang[0]);if(cang[0]<0) cang[0]=cang[0]+2*PI;if(cang[0]>2*PI) cang[0]=cang[0]-2*PI;for(int i=1;i<n;i++){cang[i]=cang[i-1]+b*(PI-ang[i]);if(cang[i]<0) cang[i]=cang[i]+2*PI;if(cang[i]>2*PI) cang[i]=cang[i]-2*PI;}}// 附合导线-坐标增量计算函数void LineCalculation::Coordinate_M(double Ccoo[][2],double S[],double sc_ang,double cang[],int n,double x,double y,double*dx,double*dy){int i;DegSwitch *e0=new DegSwitch();sc_ang=e0->DMS_Rad(0,0,sc_ang);Ccoo[0][0]=S[0]*cos(sc_ang);Ccoo[0][1]=S[0]*sin(sc_ang);double xs=0,ys=0;for(i=1;i<n;i++){Ccoo[i][0]=S[i]*cos(cang[i-1]);Ccoo[i][1]=S[i]*sin(cang[i-1]);xs=xs+Ccoo[i][0];ys=ys+Ccoo[i][1];}*dx=xs-x;*dy=ys-y;}// 附合导线-改正后坐标增量计算函数void LineCalculation::Coordinate_A(double Ccoo[][2],double dxdy[][2],int n,double dx,double dy,double S[],double s){for(int i=0;i<n;i++){dxdy[i][0]=dx*S[i]/s;dxdy[i][1]=dy*S[i]/s;Ccoo[i][0]-=dxdy[i][0];Ccoo[i][1]-=dxdy[i][1];}}// 附合导线-各点坐标计算函数void LineCalculation::Coordinate(double C[][2],double Ccoo[][2],int n,double xa,double ya){C[0][0]=xa+Ccoo[0][0];C[0][1]=ya+Ccoo[0][1];int i=0,j=0;for(i=1;i<n;i++)for(j=0;j<2;j++)C[i][j]=C[i-1][j]+Ccoo[i][j];}// 解析交会类#include"StdAfx.h"#include"Coordinate.h"#include<cmath>#include"DegSwitch.h"using namespace std;Coordinate::Coordinate(void){}Coordinate::~Coordinate(void){}// 解析交会-坐标正算函数void Coordinate::C1SA_C2(double xa,double ya,double s,double ang,double*xb,double*yb){*xb=xa+s*cos(ang);*yb=ya+s*sin(ang);}// 解析交会-坐标反算函数void Coordinate::C1C2_SA(double xa,double ya,double xb,double yb,double*s,double*ang) {DegSwitch*x=new DegSwitch();*s=sqrt(pow((xb-xa),2)+pow((yb-ya),2));*ang=x->C_A(xa,ya,xb,yb);}// 解析交会-前方交会函数void Coordinate::C1C2A1A2_P(double xa,double ya,double ang1,double xb,double yb,doubleang2,double*xp,double*yp){double a=tan(ang1),b=tan(ang2);*xp=(xa*a+xb*b+(yb-ya)*a*b)/(a+b);*yp=(ya*a+yb*b+(xa-xb)*a*b)/(a+b);}// 解析交会-后方交会函数void Coordinate::C1C2C3_P(double xa,double ya,double xb,double yb,double xc,double yc,double ang1,double ang2,double*xp,double*yp){double a=tan(ang1),b=tan(ang2);double tanBP=((yb-ya)/a+(yb-yc)/b+xa-xc)/((xb-xa)/a+(xb-xc)/b-(ya-yc));double BP=atan(tanBP);*xp=xb+((yb-ya)*(1/a-tanBP)-(xb-xa)*(1+tanBP/a))/(1+tanBP*tanBP);*yp=yb+(*xp-xb)*tanBP;}// 角度转换类#include"StdAfx.h"#include<iostream>#include"DegSwitch.h"using namespace std;const double PI=3.1415926;DegSwitch::DegSwitch(void){}DegSwitch::~DegSwitch(void){}//角度转换成度分秒函数void DegSwitch::Deg_DMS(double Deg,int*a,int*b,int*c){int DMS_D=(int)Deg;*a=DMS_D;double DMS_M1=(Deg-DMS_D)*60;int DMS_M=(int)DMS_M1;*b=DMS_M;int DMS_S=int((DMS_M1-DMS_M)*60);*c=DMS_S;}// 度分秒转换成角度函数double DegSwitch::DMS_Deg(int D, int M, int S){double M1=(double)S/60.0+M;double Deg=M1/60.0+D;return Deg;}// 角度转换成弧度函数double DegSwitch::Deg_Rad(double Deg){double Rad=Deg/180.0*PI;return Rad;}// 弧度转换成角度函数double DegSwitch::Rad_Deg(double Rad){double Deg=Rad/PI*180;return Deg;}// 弧度转换成度分秒void DegSwitch::Rad_DMS(double Rad,int*a,int*b,int*c) {double Deg=Rad_Deg(Rad);DegSwitch *D1 ;D1=new DegSwitch();D1->Deg_DMS(Deg,&(*a),&(*b),&*(c));}// 度分秒转换成弧度double DegSwitch::DMS_Rad(int D, int M, int S){double Deg=DMS_Deg(D, M, S);double Rad=Deg_Rad(Deg);return Rad;}// 坐标方位角反算函数double DegSwitch::C_A(double xa, double ya, double xb, double yb) {double ang1=atan((yb-ya)/(xb-xa));double ang;if(xa==xb){if(yb>ya) ang=0;else ang=PI;}if(xb>xa){if(yb>=ya) ang=ang1;else ang=ang1+2*PI;}if(xb<xa)ang=ang1+PI;return ang;}// 度分秒转换成秒函数int DegSwitch::DMS_s(int D, int M, int S){int s=D*3600+M*60+S;return s;}// 秒转换成度分秒函数void DegSwitch::s_DMS(int s,int*D,int*M,int*S) {*S=s%60;*M=(s/60)%60;*D=s/3600;}。