C++面向对象程序附合导线、解析交会、角度转换类及计算源代码
c 面向对象编程
c 面向对象编程C语言是一种广泛应用于系统开发和嵌入式领域的编程语言,它提供了丰富的面向对象编程(Object-Oriented Programming, OOP)特性。
面向对象编程是一种编程范式,通过将数据和操作封装在对象中,使得代码更易于理解、维护和重用。
在C语言中,可以通过结构体和函数指针来实现面向对象编程的特性。
面向对象编程的核心思想是将数据和操作封装在对象中。
在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面向对象程序设计
C面向对象程序设计面向对象程序设计(Object-Oriented Programming,简称OOP)是一种程序设计策略,旨在通过将现实世界的实体抽象为对象,以及通过对象之间的交互来解决复杂问题。
OOP 可以让程序更加灵活、可维护和可扩展。
OOP的关键概念有:封装、继承和多态。
封装是OOP的基本特性之一,它指的是将数据和方法捆绑在一起,形成一个对象。
对象内部的数据称为对象的属性,对象的方法用于封装处理数据的逻辑。
通过封装,对象可以隐藏内部的实现细节,只暴露出有限的接口供其他对象使用。
这样可以保护数据的完整性和安全性,同时也提供了代码的复用性和可维护性。
继承是指一个对象可以从另一个对象那里获取属性和方法,而不需要重新编写代码。
通过继承,可以构建对象之间的层次关系。
继承可以分为单继承和多继承。
在单继承中,一个子类只能继承一个父类,而在多继承中,一个子类可以同时继承多个父类。
继承的好处是提高了代码的复用性和可扩展性,同时也提供了一种自然的抽象机制。
多态是指同一个方法可以在不同的对象上执行不同的行为。
通过多态,可以针对对象具体的类型调用相应的方法,而不需要在编写代码时确定对象的类型。
多态提供了更灵活和可扩展的设计方案,可以减少代码的冗余和重复。
除了封装、继承和多态,OOP还包括其他的概念和特性,如抽象、接口、组合等。
抽象是指将具有相同特征和行为的对象抽象为类。
类是一个抽象的概念,它描述了对象的属性和方法,不关心对象的具体实现细节。
抽象提供了一种理念上的概括,使得程序的设计更加清晰和可处理。
接口是一组定义了一组方法规范的集合,用于描述对象之间的交互方式。
接口定义了不同对象之间的公共协议,使得不同的对象可以方便地互相交互。
组合是指将多个对象组合到一个更大的对象中。
通过组合,可以创建一个更复杂的对象,该对象可以使用其中的各个部分,还可以使用部分的组合来实现更高级别的功能。
在实际的程序设计中,OOP已经得到了广泛的应用。
c语言面向对象编程
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面向对象程序设计的原理、特点以及它的优点。
C面向对象程序设计的核心思想是将程序的各个部分抽象为对象,并将这些对象分解为可独立的组件。
每个对象都有自己的属性和方法,可以对外部进行操作和被操作。
对象之间通过消息传递来进行通信和交互,这样可以实现对象的封装性和松耦合性。
1.封装性:对象的内部实现细节对外部是隐藏的,只提供有限的接口来与外界进行数据和方法的交互。
这样可以确保数据的安全性和代码的安全性。
2.继承性:通过继承机制,可以创建新的类并从现有类派生,从而实现代码的重用。
继承可以广泛应用于软件开发中,使得代码具有更高的可扩展性和可维护性。
3.多态性:多态是指同一个方法可以具有不同的实现方式,根据不同的对象调用相同的方法可以得到不同的结果。
这种特性增强了代码的灵活性和可扩展性。
1.代码的可重用性:通过继承和多态等机制,可以实现代码的重用,减少代码的编写量。
这样可以提高开发效率,减少项目的开发时间。
2.代码的可维护性:面向对象程序设计鼓励将程序分解为小的模块,并且每个模块都有明确的功能和接口。
这样使得代码更易于理解和维护,提高了软件的可维护性。
3.代码的可扩展性:通过继承和多态等机制,可以方便地添加新的功能和修改现有功能。
这样可以使得软件更具有灵活性和可扩展性,适应不断变化的需求。
在C语言中实现面向对象程序设计有一些技巧。
首先,使用结构体来表示对象的数据成员,通过函数来实现对象的方法。
结构体提供了封装性的特性,可以将相关的数据和函数封装在一起。
其次,使用函数指针来实现多态性。
函数指针可以在运行时动态绑定不同的函数实现,实现不同对象之间的方法调用。
总结起来,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语言中进行面向对象的设计。
在面向对象的程序设计中,我们将程序中的数据和操作数据的函数封装在一起,形成一个对象。
对象可以拥有属性(数据)和方法(操作),通过调用对象的方法来实现对数据的操作。
在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成员变量中。
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;}。
c 语言面向对象编程
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++内部通过一个虚表来实现多态。
C语言常用二维解析几何函数集源代码
C语言常用二维解析几何函数集源代码默认分类2010-12-29 22:29:28 阅读50 评论0 字号:大中小订阅这个代码是我今天放学后抽时间写的,选取了用于做动画或者游戏里较常用的数学函数(就是说不可能很全面)包括简单的碰撞检测计算函数包括:向量加减法,向量点乘与叉乘,向量缩放,向量长度三角形面积,点到直线(和线段)的距离,判断直线平行,判断线段相交,求直线(和线段)的交点,点到直线的垂足,点关于直线的对称点,线段关于直线的反射线点绕给定点旋转判断点在三角形(和椭圆)内直线(和线段)与三角形碰撞,三角形与三角形碰撞两平行矩形碰撞,平行矩形与椭圆碰撞程序代码:#include <math.h>//定义点结构typedef struct point{double x;double y;}point;//定义有向线段typedef struct segment{point s;point e;}segment;//定义三角形typedef struct triangle{point p[3];}triangle;//定义精度误差const double eps = 1e-6;//两点距离double distance(const point *p1, const point *p2){double dx = p1->x - p2->x, dy = p1->y - p2->y;return sqrt(dx * dx + dy * dy);}//线段长double len(const segment* seg){double dx = seg->s.x - seg->e.x, dy = seg->s.y - seg->e.y;return sqrt(dx * dx + dy * dy);}//线段长的平方double lensqr(const segment* seg){double dx = seg->s.x - seg->e.x, dy = seg->s.y - seg->e.y;return dx * dx + dy * dy;}//向量加法point add(const point *p1, const point *p2){point ret;ret.x = p1->x + p2->x;ret.y = p1->y + p2->y;return ret;}//向量减法point minus(const point *p1, const point *p2){point ret;ret.x = p1->x - p2->x;ret.y = p1->y - p2->y;return ret;}//向量缩放point scale(const point *p, double s){point ret;ret.x = p->x * s;ret.y = p->y * s;return ret;}//向量缩放(以o点为基准点)point scale2(const point *p, const point *o, double s){point v;v.x = (p->x - o->x) * s;v.y = (p->y - o->y) * s;return add(&v, o);}//向量点乘double dotmul(const point *p1, const point *p2){return p1->x * p2->x + p1->y * p2->y;}//返回两点与原点组成的三角形面积的两倍(叉乘z值)double multi(const point *p1, const point *p2){return p1->x * p2->y - p1->y * p2->x;}//返回三点组成的三角形面积的两倍(有次序,相当于叉乘)double multi3(point p1, point p2, point p3){p2 = minus(&p2, &p1);p3 = minus(&p3, &p1);return multi(&p2, &p3);}//三角形面积double triangleArea(point a, point b, point c){return multi3(a, b, c) / 2;}//计算点到直线的距离,a,b定义那个直线,p为要计算的点double pointToLine(point a, point b, point p){a = minus(&a, &p);b = minus(&b, &p);return fabs(multi(&a, &b)) / distance(&a, &b);}//计算点到线段的距离,a,b定义那个线段,p为要计算的点double pointToSeg(point a, point b, point p){point ab, o = {0};ab = minus(&b, &a);a = minus(&a, &p);b = minus(&b, &p);if (dotmul(&a, &ab) > -eps) return distance(&o, &a);ab.x = -ab.x; ab.y = -ab.y;if (dotmul(&b, &ab) > -eps) return distance(&o, &b);return fabs(multi(&a, &b)) / distance(&a, &b);}//判断两直线平行(重载1)int isParallelP(const point* as, const point* ae, const point* bs, const point* be) {double d1, d2;d1 = multi3(*as, *bs, *ae); d2 = multi3(*as, *ae, *be);return fabs(d1 + d2) < eps;}//判断两直线平行(重载2)int isParallelS(const segment* a, const segment* b){double d1, d2;d1 = multi3(a->s, b->s, a->e); d2 = multi3(a->s, a->e, b->e);return fabs(d1 + d2) < eps;}//直线求交点(重载1)point linesIntersectP(const point* as, const point* ae, const point* bs, const point* be) {point ret;double d1, d2;d1 = multi3(*as, *bs, *ae); d2 = multi3(*as, *ae, *be);ret.x = (bs->x * d2 + be->x * d1) / (d1 + d2);ret.y = (bs->y * d2 + be->y * d1) / (d1 + d2);return ret;}//直线求交点(重载2)point linesIntersectS(const segment* a, const segment* b){point ret;double d1, d2;d1 = multi3(a->s, b->s, a->e); d2 = multi3(a->s, a->e, b->e);ret.x = (b->s.x * d2 + b->e.x * d1) / (d1 + d2);ret.y = (b->s.y * d2 + b->e.y * d1) / (d1 + d2);return ret;}//点到直线的垂足point pointToLineFoot(point a, point b, point p){point t;t = p;t.x += a.y - b.y;t.y += b.x - a.x;return linesIntersectP(&a, &b, &t, &p);}//点关于直线的对称点point mirrorPoint(point a, point b, point p){point f;double dis;dis = pointToSeg(a, b, p);if (dis < eps) return p;f = pointToLineFoot(a, b, p);f.x += f.x - p.x;f.y += f.y - p.y;return f;}//求对称线段或者反射线(返回点放回p,q)void mirrorSeg(const point* a, const point* b, point* p, point* q){*p = mirrorPoint(*a, *b, *p);*q = mirrorPoint(*a, *b, *q);}//对p点以o点为中心逆时针旋转r弧度,计算结果返回p中(参数返回方式的重载)void rotate(point* p, point o, double r){point q;double sr, cr;q = minus(p, &o);sr = sin(r); cr = cos(r);p->x = o.x + (cr * q.x - sr * q.y);p->y = o.y + (sr * q.x + cr * q.y);}//对p点以o点为中心逆时针旋转r弧度(直接返回点的重载)point rotateR(point p, point o, double r){point q;double sr, cr;q = minus(&p, &o);sr = sin(r); cr = cos(r);p.x = o.x + (cr * q.x - sr * q.y);p.y = o.y + (sr * q.x + cr * q.y);return p;}//判断两线段相交(相交返回1,不相交返回0)int segCrashSegP(const point* as, const point* ae, const point* bs, const point* be) {double s, t;s = multi3(*as, *bs, *be);t = multi3(*ae, *bs, *be);if (s * t > eps) return 0;s = multi3(*bs, *as, *ae);t = multi3(*be, *as, *ae);if (s * t > eps) return 0;return 1;}//判断两线段相交(相交返回1,不相交返回0)int segCrashSegS(const segment* a, const segment* b){double s, t;s = multi3(a->s, b->s, b->e);t = multi3(a->e, b->s, b->e);if (s * t > eps) return 0;s = multi3(b->s, a->s, a->e);t = multi3(b->e, a->s, a->e);if (s * t > eps) return 0;return 1;}//判断点在三角形内(返回1:内;返回0:边上;返回-1:外)int pointInTriangle(const triangle* tri, const point* p){double s, t;s = multi3(*p, tri->p[0], tri->p[1]);if (fabs(s) < eps) return 0;t = multi3(*p, tri->p[1], tri->p[2]);if (fabs(t) < eps) return 0;if ((s < 0) ^ (t < 0)) return -1;s = multi3(*p, tri->p[2], tri->p[0]);if (fabs(s) < eps) return 0;if ((s < 0) ^ (t < 0)) return -1;return 1;}//三角形与直线碰撞检测(碰撞返回1,不碰撞返回0)int triangleCrashLine(const triangle* tri, const segment* seg){double s, t;s = multi3(tri->p[0], seg->s, seg->e);t = multi3(tri->p[1], seg->s, seg->e);if ((s < 0) ^ (t < 0)) return 1;s = multi3(tri->p[2], seg->s, seg->e);if ((s < 0) ^ (t < 0)) return 1;return 0;}//三角形与线段碰撞检测(碰撞返回1,不碰撞返回0)int triangleCrashSeg(const triangle* tri, const segment* seg){if (pointInTriangle(tri, &seg->s) > 0) return 1;if (segCrashSegP(&tri->p[0], &tri->p[1], &seg->s, &seg->e)) return 1;if (segCrashSegP(&tri->p[0], &tri->p[2], &seg->s, &seg->e)) return 1;if (segCrashSegP(&tri->p[2], &tri->p[1], &seg->s, &seg->e)) return 1;return 0;}//三角形与三角形碰撞检测(碰撞返回1,不碰撞返回0)int triangleCrashTriangle(const triangle* tri1, const triangle* tri2){segment seg;seg.s = tri2->p[0]; seg.e = tri2->p[1];if (triangleCrashSeg(tri1, &seg)) return 1;seg.s = tri2->p[0]; seg.e = tri2->p[2];if (triangleCrashSeg(tri1, &seg)) return 1;seg.s = tri2->p[2]; seg.e = tri2->p[1];if (triangleCrashSeg(tri1, &seg)) return 1;return 0;}//两平行于坐标轴的矩形碰撞检测(碰撞返回1,不碰撞返回0)int rectCrashRect(const point* rect1lt, const point* rect1rb, const point* rect2lt, const point* rect2rb){if (rect1lt->x > rect2rb->x || rect1lt->y > rect2rb->y) return 0;if (rect2lt->x > rect1rb->x || rect2lt->y > rect1rb->y) return 0;return 1;}//判断点在椭圆内(返回1:内;返回0:边上;返回-1:外)int pointInEllipse(const point* elplt, const point* elprb, const point* pt){point center, p;double a, b, s;center.x = (elplt->x + elprb->x) / 2; center.y = (elplt->y + elprb->y) / 2;a = center.x - elplt->x;b = center.y - elplt->y;a *= a;b *= b;p = minus(pt, ¢er);s = p.x * p.x / a + p.y * p.y / b;if (fabs(s) < eps) return 0;if (s > 1) return -1;return 1;}//判断平行矩形与椭圆碰撞(碰撞返回1,不碰撞返回0)int rectCrashEllipse(const point* rectlt, const point* rectrb, const point* elplt, const point* elprb) {if (rectCrashRect(rectlt, rectrb, elplt, elprb)){point p;int xs, ys;p.x = (elplt->x + elprb->x) / 2; p.y = (elplt->y + elprb->y) / 2;if (p.x < rectlt->x) xs = -1;else if (p.x < rectrb->x) xs = 0;else xs = 1;if (p.y < rectlt->y) ys = -1;else if (p.y < rectrb->y) ys = 0;else ys = 1;if (xs * ys == 0) return 1;if (xs < 0){if (ys < 0) p = *elplt;else p.x = elplt->x, p.y = elprb->y;}else{if (ys > 0) p = *elprb;else p.x = elprb->x, p.y = elplt->y;}return pointInEllipse(elplt, elprb, &p) > 0;}return 0;}因为代码是我匆忙编写的,所以代码很可能还存在问题,如果发现请告诉我但有一些函数,要你自己注意调用场合,比如求两直线的交点,最好先判断是否平行求两线段的交点,先判断是否相交等等另外,代码是未经优化的,在效率要求较高的场合可能不适用,但多数场合下的应用不会有什么问题要注意的是,里面的旋转函数的坐标,用的是数学坐标,逆时针是指从x轴的正方向,向y轴的正方向旋转构成的角,这个角度可正可负。
c 面向对象设计程序
c 面向对象设计程序C语言是一种非常经典的编程语言,它一直以来都备受开发者的喜爱和广泛应用。
其中,C语言的面向对象设计程序是一项非常重要的技能。
本文将从面向对象设计的基本概念、C语言中实现面向对象的方法以及面向对象设计程序的一般步骤等方面进行详细介绍。
我们来了解一下面向对象设计的基本概念。
面向对象是一种编程范式,它将程序中的数据和操作数据的方法组织成一个对象,通过对象之间的交互来实现程序的功能。
面向对象的设计思想主要包括封装、继承和多态。
封装是指将数据和操作数据的方法封装在一个对象中,对象对外界隐藏了内部实现细节,只提供有限的接口供外界访问和操作。
继承是指通过继承机制,可以创建新的对象并从已有的对象中继承属性和方法。
多态是指同一种操作可以作用于不同的对象,产生不同的结果。
在C语言中,虽然没有内置的面向对象的特性,但我们可以通过一些技巧来实现面向对象的设计。
首先,我们可以使用结构体来封装数据和操作数据的函数。
结构体可以将相关的数据和函数组织在一起,形成一个对象。
其次,我们可以使用函数指针来实现多态。
函数指针可以指向不同的函数,通过调用不同的函数来实现不同的操作。
此外,我们还可以使用宏定义来模拟继承的特性。
接下来,让我们来看看在C语言中如何进行面向对象设计程序的一般步骤。
首先,我们需要明确程序的需求和目标,确定需要设计的对象以及对象之间的关系。
然后,我们可以根据需求设计相应的结构体,并为每个结构体定义相关的函数。
在函数的实现过程中,我们可以使用指针来操作结构体的成员变量,实现对数据的访问和操作。
在设计过程中,我们还可以使用宏定义来定义一些常用的操作,提高代码的复用性。
最后,我们可以编写主函数,通过调用对象的方法来实现程序的功能。
除了基本的面向对象设计概念和步骤外,我们还需要注意一些面向对象设计程序的常见问题。
首先,要注意封装的原则,即使对象的内部实现发生变化,对外界的接口应保持稳定。
其次,要合理使用继承和多态的特性,避免过度使用,以防代码变得复杂和难以维护。
C语言中的面向对象编程技巧
C语言中的面向对象编程技巧C语言是一种结构化的编程语言,但是它也可以通过一些技巧来实现面向对象的编程方式。
在使用C语言进行面向对象编程时,有一些技巧可以帮助我们更好地设计和实现代码,提高代码的可维护性和可扩展性。
以下是一些在C语言中实现面向对象编程的技巧:1. 结构体和指针:在C语言中,我们可以使用结构体来封装数据,通过使用指针来访问和操作结构体的成员。
结构体可以代表一个对象的属性,而指针可以在不同的函数之间传递对象,并对对象进行操作。
这样可以实现数据的封装和隐藏,提高代码的模块化和可维护性。
2. 函数指针:函数指针是指向函数的指针,我们可以将函数指针作为参数传递给其他函数,也可以将函数指针作为结构体成员。
通过函数指针,我们可以实现类似于虚函数的功能,实现多态性和动态绑定。
3. 动态内存分配:在C语言中,我们可以使用malloc和free函数来进行动态内存分配和释放。
通过动态内存分配,我们可以在运行时动态创建对象,并在不需要对象时释放内存,避免资源浪费。
动态内存分配也可以避免栈内存的限制,使程序更加灵活。
4. 结构体指针作为函数参数:将结构体指针作为函数参数传递,可以减少内存的开销和提高程序的效率。
通过传递结构体指针,我们可以直接操作对象的地址,避免对象的拷贝和传递过程中发生的额外开销。
5. 封装和继承:虽然C语言本身并不支持类和对象的概念,但是我们可以通过结构体和函数指针来实现类似于类和对象的功能。
通过合理地封装结构体和函数,我们可以实现数据和行为的分离,降低对象之间的耦合度,提高代码的可维护性。
同时,通过结构体的嵌套和函数指针的传递,我们也可以实现类似于继承的功能。
总的来说,虽然C语言并不是一种面向对象的编程语言,但是通过一些技巧和设计模式,我们可以在C语言中实现类似于面向对象编程的功能。
合理地使用结构体、指针、函数指针等特性,可以帮助我们更好地设计和实现代码,提高代码的质量和可维护性。
通过不断地学习和实践,我们可以在C语言中掌握更多面向对象编程的技巧,提高自己的编程水平。
C面向对象程序设计第二章
C++
2- 6
2.1 面向对象程序设计方法概述
什么是对象封装(encapsulation )?
就是把对象的不想让外界知道的属性和功能屏蔽起来, 让外界看不见。封装有两个含义,一是将有关的数据和操作 函数封装成一个基本单位,即对象内。各对象之间相互独立, 互不干扰;二是将对象中的部分属性或功能对外隐蔽,只留 少数接口向外公布,以接收外界信息。
就是对象的“属性”,函数就是用来对数据进行的“操作”, 以便实现某种功能。这种操作就是对象的“行为”,也叫 “方法”。我们点击一下鼠标,按动键盘的一个按钮,就是 给某个对象一个消息,系统会调用该对象中的函数进行操作。
比如长方形对象,其长和宽就是它的属性,调用该对象 的一些函数,即向该对象传送一些消息,可以用来对其长、 宽值进行加工计算,以实现求出面积、周长等功能。
C++中,所谓多态性是指,由继承而产生的相关的不同 的类,其对象对同一消息会作出不同的响应。
显然,多态性能增加程序的灵活性,它是面向对象程序 设计的重要特征。
C++
2- 10
填空题
1.面向对象的系统最突出的特性是
、
、
。
2.C++语言是一种计算机编程语言,利用它编写的程序并不能
直接在计算机上运行,而是要经过 、 和
C++ 语言设计
第二章 类和对象
第一章 C++的初步知识 第二章 类和对象 第三章 再论类和对象 第四章 运算符重载 第五章 继承与派生 第六章 多态性与虚函数 第七章 输入输出流 第八章 C++工具
ቤተ መጻሕፍቲ ባይዱ
C++
C语言实现面向对象编程
C语言实现面向对象编程面向对象编程(Object-oriented programming,OOP)是一种广泛应用于软件开发的编程思想和方法论。
传统的C语言是一种过程式编程语言,而不是面向对象的编程语言,但是可以通过一些技巧来模拟实现面向对象编程的特性。
接下来,我将详细介绍如何在C语言中实现面向对象编程。
在C语言中模拟实现面向对象编程,我们需要用结构体来模拟类的概念,使用函数指针来模拟方法的概念。
首先,我们定义一个结构体来表示一个类,结构体中包含成员变量和成员函数。
例如,我们可以定义一个代表矩形的类Rectangle:```ctypedef structfloat width;float height;float (*area)(void *);} Rectangle;```在这个结构体中,width和height表示矩形的宽度和高度,area是一个指向函数的指针,用来计算矩形的面积。
这个指针指向的函数接收一个void类型的指针参数,在函数中我们需要将这个指针强制转换为Rectangle类型的指针,以便访问结构体中的成员变量。
接下来,我们需要定义一些成员函数来实现类的方法。
可以使用函数指针将这些函数赋值给成员函数。
例如,我们定义一个计算矩形面积的方法:```cfloat calculateArea(void *rect)Rectangle *r = (Rectangle *)rect;return r->width * r->height;```在这个方法中,我们首先将传入的指针强制转换为Rectangle类型的指针,并通过箭头操作符访问矩形的width和height成员变量,然后计算矩形的面积并返回。
接下来,我们需要定义一个用于创建矩形对象的工厂函数:```cRectangle *createRectangle(float width, float height)Rectangle *r = malloc(sizeof(Rectangle));r->width = width;r->height = height;r->area = &calculateArea;return r;```在这个工厂函数中,我们首先分配了一个Rectangle对象的内存空间,然后设置矩形的宽度和高度,最后将calculateArea函数赋值给area成员变量。
c 面向对象设计程序
c 面向对象设计程序C语言是一种面向过程的编程语言,但是它也可以通过面向对象的方式进行程序设计。
面向对象的编程范式在软件开发中被广泛应用,它的核心思想是将程序看作是由对象组成的,每个对象都有自己的属性和方法。
在C语言中,我们可以通过结构体来模拟对象的概念。
结构体可以包含多个不同类型的数据,这些数据可以代表对象的属性。
同时,我们可以定义函数来操作结构体中的数据,这些函数就是对象的方法。
假设我们要设计一个简单的图形库,其中包含矩形、圆形和三角形这三种图形。
我们可以通过结构体来表示这些图形对象,结构体中的数据可以包括图形的位置、大小等属性。
同时,我们可以定义函数来操作这些图形对象,比如计算图形的面积、移动图形的位置等。
我们可以定义一个表示矩形的结构体,其中包含矩形的左上角坐标、宽度和高度这几个属性。
然后,我们可以定义函数来操作这个结构体,比如计算矩形的面积、移动矩形的位置等。
接下来,我们可以定义一个表示圆形的结构体,其中包含圆形的中心坐标和半径这两个属性。
同样地,我们可以定义函数来操作这个结构体,比如计算圆形的面积、移动圆形的位置等。
我们可以定义一个表示三角形的结构体,其中包含三个顶点的坐标这三个属性。
同样地,我们可以定义函数来操作这个结构体,比如计算三角形的面积、移动三角形的位置等。
通过这种方式,我们可以模拟出矩形、圆形和三角形这三种图形对象,每个对象都有自己的属性和方法。
这样,我们就可以在程序中创建这些对象,并对它们进行操作。
总结一下,虽然C语言是一种面向过程的编程语言,但是我们可以通过结构体和函数来模拟面向对象的程序设计。
通过定义结构体来表示对象的属性,再通过定义函数来操作这些属性,我们可以实现面向对象的编程思想。
这种方式可以使程序结构更加清晰,代码更加易于维护和扩展。
在实际的软件开发中,面向对象的编程范式已经被广泛应用,成为了一种重要的编程思想。
c++面向对象实例程序源代码
1、使用构造函数和析构函数构造函数的功能是在创建对象时,使用给定的值将对象初始化。
析构函数的功能是用来释放一个对象,在对象删除前用它来做一些内存释放等清理工作。
构造函数与析构函数与相应的类同名。
#include"iostream.h"#include"string.h"classCName{private:char *strName;public:CName()//不带参数的构造函数{strName=NULL;+}CName(char *str)//带参数的构造函数{strName=(char*)new char[strlen(str)+1];strcpy(strName,str);}~CName()//析构函数{if(strName)delete []strName;strName=NULL;}char*getName()returnstrName;}};int main(){char *p=new char[5];strcpy(p,"ding");CNameone(p);delete []p;cout<<one.getName()<<endl;return 0;}2、对象成员初始化(采用对象成员列表方式,即使用冒号来引导的对象成员初始化列表的方式,可以将成员的定义和初始化同时进行。
#include "iostream"using namespace std;#include"string.h"classCPoint{private:intxPos,yPos;public:CPoint(intx,int y){xPos=x;yPos=y;intgetxPos(){returnxPos;}intgetyPos(){returnyPos;}};classCRect{private:CPointm_ptLT,m_ptRB;public:CRect(int x1,int y1,int x2,int y2):m_ptLT(x1,y1),m_ptRB(x2,y2){}void printf1(){cout<<m_ptLT.getxPos()<<" "<<m_ptLT.getyPos()<<endl;cout<<m_ptRB.getxPos()<<" "<<m_ptRB.getyPos()<<endl;}};int main()CRectlx(110,100,87,64);lx.printf1();return 0;}3、静态数据成员的使用(静态数据成员与静态变量相似,具有静态生存期,是在类中声明的全局数据成员,能被同一个类的所有对象共享。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#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;}。