测绘程序设计四-函数实验报告

合集下载

测绘程序设计四 函数实验报告

测绘程序设计四 函数实验报告

《测绘程序设计()》上机实验报告(Visual C++.Net)班级:测绘1402学号: 0401140207姓名:施庆章序号: sm_207二零一六年五月实验4 函数一、实验目的∙掌握函数的定义、引用及应用方法。

二、实验内容1.交会定点计算函数设计把前方交会、测边交会、后方交会程序写成函数的形式,然后再通过主程序调用。

提示:后方交会计算函数设计思路(1)基本原理及计算公式。

若将Pa、Pb、Pc看成权,则P点的坐标即为三个已知点的加权平均值(2)计算程序设计步骤①设计界面,用于输入3个已知点的坐标和三个观测角α、β和γ,以及用于输出待定点坐标的文本框(12个)、静态标签框和Button按钮;②定义文本框控件变量(Value);③创建后方交会定点计算函数,函数的输入为三个观测角和三个已知点的坐标,输出为待定点坐标,输出可以用引用参数的方式输出,具体计算步骤;a.根据已知点计算三个内角A 、B 、C ;b.计算Tan(α)、Tan(β)、Tan(γ)、Tan(A)、Tan(B)、Tan(C);c.计算Pa 、Pb 、Pc ;d.计算待定点坐标Xp 、Yp 。

④创建“计算”Button 按钮的Click 事件函数,在该事件函数中调用后方交会计算函数,并在相应的文本框中显示计算结果。

2.高斯投影正反算计算函数设计编写高斯投影正算与反算的两个函数,并设计简单界面对函数计算的正确性进行测试。

正算公式:ae长半轴第一偏心率⎪⎪⎪⎪⎪⎩⎪⎪⎪⎪⎪⎨⎧''-++-''+''+-''+''''=''+-''+''++-''+''''+=52224255322336425644223222)5814185(cos 120)1(cos 6cos )5861(cos sin 720)495(cos sin 24cos sin 2l t t t B N l t B N l B N y l t t B B N l t B B N l B B N X x ηηρηρρρηηρρBe cos '=ηBe a N 22sin 1-=tant B =aba e 22-=bb a e 22-='反算公式:[]{})sin (sin sin 2sin 026402202000B K K B K B K B B B f ++++=020)1(A e a X B -=xX =即,y =0时 x 所对应道的子午弧长⎪⎪⎪⎪⎪⎩⎪⎪⎪⎪⎪⎨⎧+++++++-=++--+++-=5222425322364254222232)8624285(cos 1201 )21(cos 61cos 1)459061(720 )935(242 y t t t B N y t B N y B N l y t t N M t y t t N M t y N M t B B f f f f f f f f f f f f f ff ff ff f f f ff f f f f f ηηηηηlfB 是要求的点到中央子午线的经度差, 为底点纬度下标“f”表示与 fB 有关量fff B e N M 22cos 1'+=ff B e a N 22sin 1-=ff B e cos '=ηff B t tan =界面设计:主要代码:double PI=3.1415926;double EPSILON=1.0E-10;void FowardIntersection(double Xa1,double Ya1,double Xb1,double Yb1,double a,double b,double& Xp1,double& Yp1) //前方交会函数{double cota=1/tan(a);double cotb=1/tan(b);Xp1=(Xa1*cotb+Xb1*cota+Yb1-Ya1)/(cota+cotb);Yp1=(Ya1*cotb+Yb1*cota+Xa1-Xb1)/(cota+cotb);}void SideIntersection(double Xa2,double Ya2,double Xb2,double Yb2,double Dap,double Dbp,double& Xp2,double& Yp2) //侧方交会函数{double dx=Xb2-Xa2;double dy=Yb2-Ya2+EPSILON;//计算AB方位角(弧度制)double angleAB;if(dy>=0){angleAB=0.5*PI-atan(dx/dy);}else{angleAB=1.5*PI-atan(dx/dy);}//计算角Adouble Dab; //AB边长double A; //角Adouble angleAP; //方位角APDab=sqrt((Xb2-Xa2)*(Xb2-Xa2)+(Yb2-Ya2)*(Yb2-Ya2));A=acos((Dab*Dab+Dap*Dap-Dbp*Dbp)/(2*Dab*Dap));angleAP=angleAB-A;Xp2=Xa2+Dap*cos(angleAP);Yp2=Ya2+Dap*sin(angleAP);}void Csqz2Dlg::OnBnClickedCancle()//清空数据{UpdateData(true);X1=0;Y1=0;X2=0;Y2=0;a=0;b=0;Xp=0;Yp=0;x1=0;y1=0;x2=0;y2=0;Dap=0;Dbp=0;xp=0;yp=0;UpdateData(false);}void Csqz2Dlg::OnBnClickedOk2()//进行侧方交会计算{UpdateData(true);SideIntersection(x1,y1,x2,y2,Dap,Dbp,xp,yp); //调用函数UpdateData(false);} void Csqz2Dlg::OnBnClickedOk()//进行前方交会计算{UpdateData(true);FowardIntersection(X1,Y1,X2,Y2,a,b,Xp,Yp); //调用函数UpdateData(false);}double Pxy(double x,double y) //计算x,y的函数{double P;P=(tan(x)*tan(y))/(tan(x)-tan(y));return P;}void CsqzDlg::OnBnClickedOk()//进行后方交会的计算{UpdateData(TRUE);double Pa;double Pb;double Pc;double a,b,c,A,B,C;a=sqrt((XC-XB)*(XC-XB)+(YC-YB)*(YC-YB));b=sqrt((XC-XA)*(XC-XA)+(YC-YA)*(YC-YA));c=sqrt((XB-XA)*(XB-XA)+(YB-YA)-(YB-YA));A=acos((b*b+c*c-a*a)/(2*b*c))*180/3.1415926;B=acos((a*a+c*c-b*b)/(2*a*c))*180/3.1415926;C=acos((b*b+a*a-c*c)/(2*b*a))*180/3.1415926;if(alpha+betta+C<170||alpha+betta+C>190)//判断危险圆{Pa=Pxy(alpha,A);Pb=Pxy(betta,B);Pc=Pxy(gamma,C);XP=(XA*Pa+XB*Pb+XC*Pc)/(Pa+Pb+Pc);YP=(YA*Pa+YB*Pb+YC*Pc)/(Pa+Pb+Pc);}elseMessageBox(_T("该点位于危险圆上"));UpdateData((FALSE);}#include"math.h"double PI=3.1415926; //一些常数的定义double p2=206265;double a=6378140.0;double b=6356755.2881575287;double e=(sqrt(a*a-b*b))/a;double e1=(sqrt(a*a-b*b))/b;double dmstodgree(double dmg) //度分秒转换成度{double dge;int Dgree;int Min;int Secend;Dgree=int(dmg);//截取度的整数部分Min=int((dmg-Dgree)*100);//截取分的部分Secend=int((dmg-Dgree)*100-Min)*100;//截取秒的部分dge=Dgree+(Min/60)+(Secend/3600);//将度分秒转换为度return dge;//返回度}double dgreetodms(double drg)//度转换成度分秒{double dge;int Dgree;int Min;int Secend;Dgree=int(drg);//截取度的整数部分Min=int((drg-Dgree)*60);//截取分的整数部分Secend=int(((drg-Dgree)*60-Min)*60);//截取秒的整数部分 dge=Dgree+Min/100+Secend/10000;//将度转换成度分秒return dge;//返回度分秒}double caculateS(double B) //计算X{double A0=1+3/4*e*e+45/64*pow(e,4)+350/512*pow(e,6)+11025/16384*pow(e,8);double A2=-1/2*(3/4*e*e+60/64*pow(e,4)+525/512*pow(e,6)+17640/16384*pow(e,8));double A4=1/4*(15/64*pow(e,4)+210/512*pow(e,6)+8820/16384*pow(e,8));double A6=-1/6*(35/512*pow(e,6)+2520/16384*pow(e,8));double A8=1/8*(315/16384*pow(e,8));double S=a*(1-e*e)*(A0*B+A2*sin(2*B)+A4*sin(4*B)+A6*sin(6*B)+A8*sin(8*B));return S;}double caculateBf(double X) //计算Bf{double A0=1+3/4*e*e+45/64*pow(e,4)+350/512*pow(e,6)+11025/16384*pow(e,8);double B0=caculateS(X)/(a*(1-e*e)*A0);double k0=1/2*(3/4*e*e+45/64*pow(e,4)+350/512*pow(e,6)+11025/16384*pow(e,8));double k2=-1/3*(63/64*pow(e,4)+1108/512*pow(e,6)+58239/16384*pow(e,8));double k4=1/3*(604/512*pow(e,6)+68484/16384*pow(e,8));double k6=-1/3*(26328/16384*pow(e,8));doubleBf=B0+sin(2*B0)*(k0+sin(B0)*sin(B0)*(k2+sin(B0)*sin(B0)*(k4+k6*sin(B0)*sin(B0))));return Bf;}void coordinatecalculate(double B,double L,double n,double &X,double&Y) //正算{double dl=dmstodgree(L);double N=dmstodgree(n);double l=(dl-N)*3600/206265;double b=dmstodgree(B)*PI/180;double n1=e1*cos(b);double t=tan(b);double N1=a/sqrt(1-e*e*sin(b)*sin(b));double l2=abs(l-(int(l)*6-3))*3600;//经度L同当前子午线的差值单位为秒double s=p2*p2*p2*p2;double v=l2*l2*l2*l2;double u=cos(b)*cos(b)*cos(b);X=caculateS(X)+N1/(2*(p2)*(p2))*sin(b)*cos(b)*(l2)*(l2)+N/(24*(p2)*(p2))*sin(b)*u* (5-t*t+9*n1*n1+4*n1*n1*n1*n1)*v+N1/(720*p2*p2*s)*sin(b)*cos(b)*cos(b)*u*(61-58*t*t+t*t *t*t)*l2*l2*v;Y=N1/(p2)*cos(b)*(l2)+N*p2/(6*s)*u*(1-t*t+n*n)*v/l2+N1/(120*p2*s)*cos(b)*cos(b)*u* (5-18*t*t+t*t*t*t-58*n1*n1*t*t)*l2*v;}void coordinateinversecalculation(double X,double Y,double n,double &B,double &L) //反算{ double Bf=caculateBf(X);double x=X;double Tf=tan(Bf);double nf=e1*cos(Bf);double Nf=a/sqrt(1-e*e*sin(Bf)*sin(Bf));double Mf=Nf/(1+e1*e1*cos(Bf)*cos(Bf));double g=Nf*Nf*Nf*Nf;double h=Y*Y*Y*Y;double c=Tf*Tf*Tf*Tf;doubleb=Bf-Tf/(2*Mf*Nf)*Y*Y+Tf/(24*Mf*pow(Nf,3))*(5+3*Tf*Tf+nf*nf-9*nf*nf*Tf*Tf)*h-Tf/(720*M f*pow(Nf,5))*(61+90*Tf*Tf+45*c)*h*Y*Y;doublel=1/(Nf*cos(Bf))*Y-Nf/(6*g*cos(Bf))*(1+2*Tf*Tf+nf*nf)*h/Y+1/(120*Nf*g*cos(Bf))*(5+28*T f*Tf+24*c+6*nf*nf+8*nf*nf*Tf*Tf)*h*Y;l=l+n;B=dmstodgree(b); //转换L=dmstodgree(l);}void qingchu(double X,double Y,double n,double B,double L) //清除{X=0;Y=0;n=0;B=0;L=0;}void CCalculationofcoordinateDlg::OnBnClickedCoordinate()//正算{UpdateData(true);coordinatecalculate(B,L,n,X,Y); //调用正算函数UpdateData(false);}void CCalculationofcoordinateDlg::OnBnClickedInverse()//反算{UpdateData(true);coordinateinversecalculation(X,Y,n,B,L); //调用反算函数UpdateData(false);}void CCalculationofcoordinateDlg::OnBnClickeddelete()//清除{UpdateData(true);qingchu(X,Y,n,B,L);UpdateData(false);}void CCalculationofcoordinateDlg::OnBnClickedCancel()//退出{OnCancel();}计算结果总结次实验虽然思维不复杂,但是因为高斯投影正反算公式比较复杂,导致工作量有点大,但还是顺利完成了。

测绘程序设计实验报告word文档

测绘程序设计实验报告word文档

《测绘程序设计()》上机实验报告(Visual C++.Net)班级:学号:姓名:序号:二零一三年三月目录实验1 Visual Basic环境和程序设计初步 (1)总结 (5)实验2、控制结构程序设计(方位角计算、坐标转换、后方交会) (6)总结 (16)实验1 Visual C++.Net 环境和程序设计初步一、实验内容1. 启动与退出VC++.net ,熟悉VC++.net 的开发环境,通过向导生成基于对话框的应用程序。

使用MSDN 查看命令按钮、标签和文本框的主要属性和方法。

2. 打开Microsoft visual studio 2008 文档,浏览“Visual studio 文档”目录下的内容,并从“Visual studio 文档->Visual C++->示例”目录下下载一个程序,编译并运行之。

3. 设计一个已知三边边长计算三角形面积的程序。

计算模型如下:海伦公式:))()((c p b p a p p S ---=,其中2cb a p ++=二、设计思路1、首先,设计一个窗体,上面有三个静态框和三个文本框用于提示和输入三边a,b,c,还要有一个静态框加一个文本框用于输出面积,还要加三个命令按钮,用于计算,清除和退出;2、然后要对输入的三边进行判断是否合法(即是否可以组成三角形),用if 语句实现,不合法则清零;3、最后将海伦公式写成代码的形式即可。

三、界面设计如下:四、主要代码如下:#include<math.h>void CMy006Dlg::OnBnClickedButton1(){// TODO: 在此添加控件通知处理程序代码//判断输入是否有误并计算UpdateData(TRUE);if(a+b>c&&a+c>b&&b+c>a){double t;t=(a+b+c)/2;s=sqrt(t*(t-a)*(t-b)*(t-c));}else CMy006Dlg::OnBnClickedButton2();//输入的三边不能构成三角形时则清零UpdateData(FALSE);}void CMy006Dlg::OnBnClickedButton2(){// TODO: 在此添加控件通知处理程序代码//清除功能a=0;b=0;c=0;s=0;UpdateData(FALSE);}void CMy006Dlg::OnBnClickedButton3(){exit(0);//退出功能// TODO: 在此添加控件通知处理程序代码}五、运行结果如下:六、实验总结本次实验比较简单,主要是熟悉一下Virsual Studio 2008的MFC编程环境,了解编译MFC项目的整个流程。

函数实验报告总结

函数实验报告总结

函数实验报告总结函数实验报告总结引言:函数是计算机编程中的重要概念,它能够将一组输入映射为输出,是程序设计中模块化和可重用性的基石。

为了更好地理解函数的概念和使用方法,我们进行了一系列的函数实验。

本文将对这些实验进行总结和归纳,探讨函数在实际编程中的应用。

实验一:函数的定义和调用在这个实验中,我们学习了函数的基本概念和语法。

通过定义一个简单的函数,我们了解了如何使用关键字“def”来定义函数,并通过调用函数来执行其中的代码块。

这个实验让我们明白了函数的封装性和可复用性,可以将一段代码封装成函数,供其他地方调用。

实验二:函数的参数传递在这个实验中,我们学习了函数的参数传递方式。

通过定义带有参数的函数,我们了解了函数参数的不同类型,包括位置参数、关键字参数和默认参数。

我们还学习了如何在函数调用时传递参数,并探讨了参数传递的机制和注意事项。

这个实验让我们对函数的灵活性和可变性有了更深入的理解。

实验三:函数的返回值在这个实验中,我们学习了函数的返回值。

通过定义带有返回值的函数,我们了解了如何使用关键字“return”来返回函数执行的结果。

我们还学习了函数返回值的类型和用途,包括返回单个值、返回多个值和返回空值。

这个实验让我们明白了函数的结果可以被其他代码使用,提高了代码的灵活性和可扩展性。

实验四:递归函数在这个实验中,我们学习了递归函数的概念和用法。

通过定义递归函数来解决问题,我们了解了递归的原理和应用场景。

我们还学习了递归函数的优缺点,包括代码简洁但可能导致性能问题。

这个实验让我们对递归思想和算法有了更深入的认识,提高了问题解决的能力。

实验五:高阶函数在这个实验中,我们学习了高阶函数的概念和用法。

通过定义接受函数作为参数或返回函数的函数,我们了解了高阶函数的特点和应用场景。

我们还学习了匿名函数和函数式编程的基本概念,以及如何使用内置函数和自定义函数来实现高级功能。

这个实验让我们对函数的扩展性和灵活性有了更深入的理解。

程序设计基础实验报告

程序设计基础实验报告

实验一 用C 语言编写简单程序一、实验目的1. 熟悉VC6.0的编程环境,掌握运行C 程序的基本步骤。

2. 了解C 程序的基本框架,模仿例题编写简单的C 语言程序。

3. 正确书写算术表达式、赋值表达式和关系表达式。

4. 掌握基本输入输出函数的使用,正确调用C 语言提供的数学库函数。

5. 掌握简单的单步调试方法。

二、实验环境Windows XP ;Visual C++ 6.0。

三、实验内容1.在屏幕上显示一个句子“What is a computer?”。

2.求华氏温度150F 对应的摄氏温度。

计算公式如下:其中,c 表示摄氏温度;f 表示华氏温度。

3.输入x ,计算下列分段函数的值(保留2位小数),请调用sqrt 函数求平方根,调用pow 函数求幂。

4. 输入一个正整数m (0100)m ≤≤,求100i m i =∑。

四、实验要求1. 将上机验证正确的源代码写到实验报告上。

2.根据自己的真实感受,认真填写实验分析和实验心得以及问题和建议。

3.按时提交实验报告。

553299c f =⨯-⨯21(1)2 x<02()0x x f x ⎧+++⎪=≥一、实验目的1.熟练掌握关系表达式的使用。

2.熟练掌握使用else-if 语句实现多分支结构程序设计。

二、实验环境Windows XP ;Visual C++ 6.0。

三、实验内容1.输入x ,计算并输出下列分段函数sign(x)的值。

2.输入月薪salary ,输出应交的个人所得税tax (保留2位小数)。

按照2011年开始实行的新的个人所得税法,计算公式为:tax = rate*(salary-3500)-deduction 。

当salary≤3500时,rate=0、deduction=0当3500<salary≤5000时,rate=3%、deduction=0当5000<salary≤8000时,rate=10%、deduction=105当8000<salary≤12500时,rate=20%、deduction=555当12500<salary≤38500时,rate=25%、deduction=1005当38500<salary≤58500时,rate=30%、deduction=2775当83500<salary 时,rate=45%、deduction=135053.输入一个正整数n ,再输入n 个学生的百分制成绩,统计各等级成绩的个数。

函数程序设计实验报告

函数程序设计实验报告

函数程序设计实验报告本次实验的目的是通过学习函数的基本概念和使用方法,掌握函数的定义、调用和应用,以及函数的参数传递和返回值的使用。

在实验中,我们将通过编写程序来加深对函数的理解,并通过实际操作来掌握函数的使用技巧。

在程序设计中,函数是一种非常重要的模块化设计方法。

通过将程序中的功能模块化为函数,不仅可以提高代码的复用性和可维护性,还可以使程序的结构更加清晰,易于理解和调试。

因此,掌握函数的使用对于提高程序设计的效率和质量具有重要意义。

在本次实验中,我们首先学习了函数的定义和调用方法。

函数的定义包括函数名、参数列表和返回值类型,通过定义函数可以将一系列操作封装为一个整体,方便在程序中进行调用。

在调用函数时,我们需要使用函数名和实际参数来传递数据,并可以通过返回值来获取函数的执行结果。

通过实际编写程序来定义和调用函数,我们加深了对函数的理解,并掌握了函数的基本使用方法。

除了函数的基本概念和使用方法外,我们还学习了函数的参数传递和返回值的使用。

函数的参数可以分为形式参数和实际参数,形式参数用来接收调用函数时传递的数据,而实际参数则是调用函数时传递的具体数值。

通过实际编写程序来传递参数并使用返回值,我们掌握了函数参数传递和返回值的使用技巧,进一步提高了对函数的理解和应用能力。

在实验中,我们还通过编写一些实际的程序来应用所学的函数知识。

例如,我们编写了求解最大公约数和最小公倍数的函数,通过调用这些函数来实现对两个数的求解。

此外,我们还编写了一些涉及函数的程序,如计算阶乘、斐波那契数列等。

通过编写这些程序,我们不仅加深了对函数的理解,还提高了程序设计和编写代码的能力。

总的来说,通过本次实验,我们深入学习了函数的基本概念和使用方法,掌握了函数的定义、调用和应用,以及函数的参数传递和返回值的使用。

通过实际编写程序来应用所学的函数知识,我们提高了程序设计和编写代码的能力,为以后的学习和工作打下了良好的基础。

函数程序设计实验报告至此结束。

c语言函数实验报告

c语言函数实验报告

c语言函数实验报告C 语言函数实验报告一、实验目的1、深入理解 C 语言中函数的概念、定义和使用方法。

2、掌握函数的参数传递机制,包括值传递和地址传递。

3、学会使用函数来实现程序的模块化设计,提高代码的可读性、可维护性和可重用性。

4、通过实验,熟练掌握函数的调用、返回值的处理以及函数之间的相互协作。

二、实验环境1、操作系统:Windows 102、编译环境:Visual Studio 2019三、实验内容(一)函数的定义与声明1、定义一个名为`add` 的函数,用于计算两个整数的和,并返回结果。

```cint add(int a, int b) {return a + b;}```2、在主函数之前对`add` 函数进行声明。

```cint add(int, int);```(二)函数的调用1、在主函数中调用`add` 函数,计算 5 和 10 的和,并输出结果。

```cint main(){int result = add(5, 10);printf("5 + 10 =%d\n", result);return 0;}```(三)值传递与地址传递1、定义一个函数`swap`,通过值传递方式交换两个整数的值。

```cvoid swapValue(int a, int b) {int temp = a;a = b;b = temp;}```2、定义一个函数`swapPointer`,通过地址传递方式交换两个整数的值。

```cvoid swapPointer(int a, int b) {int temp = a;a = b;b = temp;}```3、在主函数中分别调用这两个函数,观察交换结果。

(四)函数的递归调用1、定义一个递归函数`factorial`,计算一个整数的阶乘。

```cint factorial(int n) {if (n == 0 || n == 1) {return 1;} else {return n factorial(n 1);}}```2、在主函数中调用`factorial` 函数,计算 5 的阶乘,并输出结果。

函数实验内容及要求实验报告

函数实验内容及要求实验报告

函数实验内容及要求实验报告引言函数是计算机编程中非常重要的概念之一,它能够将一系列的指令封装成一个独立的模块,使得代码的复用和维护更加简单和高效。

在本次实验中,我们将学习和掌握函数的定义、调用和返回值等基本概念,以及函数的参数传递的特点和使用方法。

实验目的通过本次实验,我们的目标是:1. 理解函数的概念和作用;2. 掌握函数的定义和调用方法;3. 掌握函数的参数传递和返回值的使用;4. 能够设计并实现简单的函数。

实验方法本次实验分为以下几个步骤:1. 了解函数的概念和作用;2. 学习函数的定义和调用方法;3. 理解函数的参数传递和返回值的概念;4. 设计并实现一个简单的函数;5. 运行并测试实现的函数。

实验过程1. 理解函数的概念和作用函数是一段封装了一系列指令的代码块,它可以被其他代码通过调用的方式来执行。

函数的作用主要有两个方面:- 提高代码的复用性:将一些常用的功能封装成函数,可以在多个地方进行调用,避免了重复编写相似的代码。

- 提高代码的可维护性:将复杂的逻辑拆分成多个函数,分工明确,易于理解和修改。

2. 学习函数的定义和调用方法函数的定义一般由以下几个部分组成:- 函数名:标识符,用于调用函数;- 参数列表:函数执行时需要接收的参数;- 返回值类型:函数执行完毕后返回的结果类型;- 函数体:包含了具体的代码实现。

函数的调用方法为直接使用函数名,后跟参数列表(如果有的话)。

3. 理解函数的参数传递和返回值的概念函数的参数传递可以通过值传递和引用传递两种方式进行。

值传递是指将参数的值复制一份传递给函数,而引用传递是指将参数的地址传递给函数。

函数可以通过返回值将计算结果返回给调用者。

返回值可以是单个值,也可以是一个列表或对象等复杂类型。

4. 设计并实现一个简单的函数我们将设计一个简单的函数,用于计算两个整数的和。

函数定义如下:pythondef add(a, b):return a + b5. 运行并测试实现的函数我们可以在程序中调用这个函数来计算两个整数的和。

C语言_实验四、函数程序设计

C语言_实验四、函数程序设计

实验四函数一、实验目的1.掌握函数的定义、函数的说明和调用。

2.掌握函数的参数及其传递方式,函数值的正确返回。

二、实验内容1.[目的]掌握标准库函数的说明和调用方法。

[题目内容]编写一个程序,首先显示一个菜单,然后根据用户的选择,输入数据后,执行相应的操作。

[输入]用户选择和函数自变量值[输出]如下菜单:=======MENU======1.。

sin2.。

cos3.。

pow4.。

sqrt0.。

exit==================[提示]使用标准库函数、多分支选择结构。

2.[目的]掌握用户自定义函数的定义、函数的说明和调用方法。

[题目内容]编写一个用户自定义函数,该函数有一个整型参数,函数的功能是:当这个整型数的值是偶数时,函数的返回值为0,当这个整型数的值是奇数时,返回值为1 。

编写一个程序,从键盘输入任意10个整数,分别调用用户自定义函数来判断这10个整数的奇偶性。

[输入]任意10个整数[输出]这10个整数的奇偶性[提示]在主函数中使用循环结构输入10个整数。

根据子函数的返回值输出相应的判断结果信息。

3.[目的]掌握用户自定义函数的定义、函数的说明和调用方法。

[题目内容]编写一个用户自定义函数,该函数有三个整数参数,函数的功能是:求解这三个整数的最大值,函数的返回值为三个参数的最大值。

编写一个程序,从键盘输入任意5个整数,分别两次调用用户自定义函数来求出这5个整数中的最大值。

[输入]任意5个整数[输出]这5个整数的最大值[提示]先用前三个整数调用函数,求出的最大值作为参数之一,再与另两个整数一起求出最大值即为所求。

4.[目的]掌握用户自定义函数的定义、函数的说明和调用方法。

[题目内容]nA表示从m各元素中抽出n个元素的排列的个数。

它的计算公式为:m)!(!n m m A n m -=。

编写一个用户自定义函数,该函数有一个整数参数,函数的功能是:求解这个整数的阶乘,函数的返回值为这个整数的阶乘。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

测绘程序设计四-函数实验报告《测绘程序设计()》上机实验报告(Visual C++.Net)班级:测绘1402学号: ***********名:***序号: sm_207二零一六年五月实验4 函数一、实验目的•掌握函数的定义、引用及应用方法。

二、实验内容1.交会定点计算函数设计把前方交会、测边交会、后方交会程序写成函数的形式,然后再通过主程序调用。

提示:后方交会计算函数设计思路(1)基本原理及计算公式。

若将Pa、Pb、Pc看成权,则P点的坐标即为三个已知点的加权平均值(2)计算程序设计步骤①设计界面,用于输入3个已知点的坐标和三个观测角α、β和γ,以及用于输出待定点坐标的文本框(12个)、静态标签框和Button 按钮; ②定义文本框控件变量(Value );③创建后方交会定点计算函数,函数的输入为三个观测角和三个已知点的坐标,输出为待定点坐标,输出可以用引用参数的方式输出,具体计算步骤;a.根据已知点计算三个内角A 、B 、C ;b.计算Tan(α)、Tan(β)、Tan(γ)、Tan(A)、Tan(B)、Tan(C);c.计算Pa 、Pb 、Pc ;d.计算待定点坐标Xp 、Yp 。

④创建“计算”Button 按钮的Click 事件函数,在该事件函数中调用后方交会计算函数,并在相应的文本框中显示计算结果。

2.高斯投影正反算计算函数设计编写高斯投影正算与反算的两个函数,并设计简单界面对函数计算的正确性进行测试。

正算公式:⎪⎪⎪⎪⎪⎩⎪⎪⎪⎪⎪⎨⎧''-++-''+''+-''+''''=''+-''+''++-''+''''+=52224255322336425644223222)5814185(cos 120)1(cos 6cos )5861(cos sin 720)495(cos sin 24cos sin 2l t t t B N l t B N l B N y l t t B B N l t B B N l B B N X x ηηρηρρρηηρρBe cos '=ηBe a N 22sin 1-=tant B =ab a e 22-=bb a e 22-='反算公式:a e长半轴第一偏心率⎪⎪⎪⎪⎪⎩⎪⎪⎪⎪⎪⎨⎧+++++++-=++--+++-=5222425322364254222232)8624285(cos1201)21(cos61cos1)459061(720)935(242ytttBNytBNyBNlyttNMtyttNMtyNMtBBfffffffffffffffffffffffffffffηηηηηlfB是要求的点到中央子午线的经度差,为底点纬度下标“f”表示与fB有关量fff BeNM22cos1'+=ffBeaN22sin1-=ffBe cos'=ηffBt tan=X 即,y=0时x所对应道的子x午弧长界面设计:控件类型控件ID 控件名称变量函数EditControl IDC_EDITx1 x1 EditControl IDC_EDITx2 x2 EditControl IDC_EDITy1 y1 EditControl IDC_EDITy2 y2 EditControl IDC_EDITDap Dap EditControl IDC_EDITDbp Dbp EditControl IDC_EDITxp xp EditControl IDC_EDITyp yp EditControl IDC_EDITX1 X1 EditControl IDC_EDITX2 X2 EditControl IDC_EDITY1 Y1 EditControl IDC_EDITY2 Y2 EditControl IDC_EDITalpha a EditControl IDC_EDITbetta b EditControl IDC_EDITXp Xp主要代码:double PI=3.1415926;double EPSILON=1.0E-10;void FowardIntersection(double Xa1,doubleYa1,double Xb1,double Yb1,double a,doubleb,double& Xp1,double& Yp1) //前方交会函数{double cota=1/tan(a);double cotb=1/tan(b);Xp1=(Xa1*cotb+Xb1*cota+Yb1-Ya1)/(cota+cotb );Yp1=(Ya1*cotb+Yb1*cota+Xa1-Xb1)/(cota+cotb );}void SideIntersection(double Xa2,doubleYa2,double Xb2,double Yb2,double Dap,double Dbp,double& Xp2,double& Yp2) //侧方交会函数{double dx=Xb2-Xa2;double dy=Yb2-Ya2+EPSILON;//计算AB方位角(弧度制)double angleAB;if(dy>=0){angleAB=0.5*PI-atan(dx/dy);}else{angleAB=1.5*PI-atan(dx/dy);}//计算角Adouble Dab; //AB边长double A; //角Adouble angleAP; //方位角APDab=sqrt((Xb2-Xa2)*(Xb2-Xa2)+(Yb2-Ya2)*(Yb 2-Ya2));A=acos((Dab*Dab+Dap*Dap-Dbp*Dbp)/(2*Dab*Da p));angleAP=angleAB-A;Xp2=Xa2+Dap*cos(angleAP);Yp2=Ya2+Dap*sin(angleAP);}void Csqz2Dlg::OnBnClickedCancle()//清空数据UpdateData(true);X1=0;Y1=0;X2=0;Y2=0;a=0;b=0;Xp=0;Yp=0;x1=0;y1=0;x2=0;y2=0;Dap=0;Dbp=0;xp=0;yp=0;UpdateData(false);}void Csqz2Dlg::OnBnClickedOk2()//进行侧方交会计算UpdateData(true);SideIntersection(x1,y1,x2,y2,Dap,Dbp,xp,yp ); //调用函数UpdateData(false);}void Csqz2Dlg::OnBnClickedOk()//进行前方交会计算{UpdateData(true);FowardIntersection(X1,Y1,X2,Y2,a,b,Xp,Yp); //调用函数UpdateData(false);}double Pxy(double x,double y) //计算x,y的函数{double P;P=(tan(x)*tan(y))/(tan(x)-tan(y));return P;}void CsqzDlg::OnBnClickedOk()//进行后方交会的计算{UpdateData(TRUE);double Pa;double Pb;double Pc;double a,b,c,A,B,C;a=sqrt((XC-XB)*(XC-XB)+(YC-YB)*(YC-YB)); b=sqrt((XC-XA)*(XC-XA)+(YC-YA)*(YC-YA));c=sqrt((XB-XA)*(XB-XA)+(YB-YA)-(YB-YA));A=acos((b*b+c*c-a*a)/(2*b*c))*180/3.141592 6;B=acos((a*a+c*c-b*b)/(2*a*c))*180/3.141592 6;C=acos((b*b+a*a-c*c)/(2*b*a))*180/3.1415926;if(alpha+betta+C<170||alpha+betta+C>190)//判断危险圆{Pa=Pxy(alpha,A);Pb=Pxy(betta,B);Pc=Pxy(gamma,C);XP=(XA*Pa+XB*Pb+XC*Pc)/(Pa+Pb+Pc);YP=(YA*Pa+YB*Pb+YC*Pc)/(Pa+Pb+Pc);}elseMessageBox(_T("该点位于危险圆上"));UpdateData((FALSE);}#include"math.h"double PI=3.1415926; //一些常数的定义double p2=206265;double a=6378140.0;double b=6356755.2881575287;double e=(sqrt(a*a-b*b))/a;double e1=(sqrt(a*a-b*b))/b;double dmstodgree(double dmg)//度分秒转换成度{double dge;int Dgree;int Min;int Secend;Dgree=int(dmg);//截取度的整数部分 Min=int((dmg-Dgree)*100);//截取分的部分Secend=int((dmg-Dgree)*100-Min)*100;//截取秒的部分dge=Dgree+(Min/60)+(Secend/3600);//将度分秒转换为度return dge;//返回度}double dgreetodms(double drg)//度转换成度分秒{double dge;int Dgree;int Min;int Secend;Dgree=int(drg);//截取度的整数部分Min=int((drg-Dgree)*60);//截取分的整数部分Secend=int(((drg-Dgree)*60-Min)*60);//截取秒的整数部分dge=Dgree+Min/100+Secend/10000;//将度转换成度分秒return dge;//返回度分秒}double caculateS(double B) //计算X{doubleA0=1+3/4*e*e+45/64*pow(e,4)+350/512*pow(e,6)+ 11025/16384*pow(e,8);doubleA2=-1/2*(3/4*e*e+60/64*pow(e,4)+525/512*pow(e ,6)+17640/16384*pow(e,8));doubleA4=1/4*(15/64*pow(e,4)+210/512*pow(e,6)+8820/ 16384*pow(e,8));doubleA6=-1/6*(35/512*pow(e,6)+2520/16384*pow(e,8)) ;double A8=1/8*(315/16384*pow(e,8));doubleS=a*(1-e*e)*(A0*B+A2*sin(2*B)+A4*sin(4*B)+A6*sin(6*B)+A8*sin(8*B));return S;}double caculateBf(double X) //计算Bf {doubleA0=1+3/4*e*e+45/64*pow(e,4)+350/512*pow(e,6)+ 11025/16384*pow(e,8);double B0=caculateS(X)/(a*(1-e*e)*A0);doublek0=1/2*(3/4*e*e+45/64*pow(e,4)+350/512*pow(e, 6)+11025/16384*pow(e,8));doublek2=-1/3*(63/64*pow(e,4)+1108/512*pow(e,6)+582 39/16384*pow(e,8));doublek4=1/3*(604/512*pow(e,6)+68484/16384*pow(e,8) );double k6=-1/3*(26328/16384*pow(e,8));doubleBf=B0+sin(2*B0)*(k0+sin(B0)*sin(B0)*(k2+sin(B 0)*sin(B0)*(k4+k6*sin(B0)*sin(B0))));return Bf;}void coordinatecalculate(double B,doubleL,double n,double &X,double&Y) //正算{double dl=dmstodgree(L);double N=dmstodgree(n);double l=(dl-N)*3600/206265;double b=dmstodgree(B)*PI/180;double n1=e1*cos(b);double t=tan(b);double N1=a/sqrt(1-e*e*sin(b)*sin(b));double l2=abs(l-(int(l)*6-3))*3600;//经度L同当前子午线的差值单位为秒double s=p2*p2*p2*p2;double v=l2*l2*l2*l2;double u=cos(b)*cos(b)*cos(b);X=caculateS(X)+N1/(2*(p2)*(p2))*sin(b)*cos (b)*(l2)*(l2)+N/(24*(p2)*(p2))*sin(b)*u*(5-t* t+9*n1*n1+4*n1*n1*n1*n1)*v+N1/(720*p2*p2*s)*s in(b)*cos(b)*cos(b)*u*(61-58*t*t+t*t*t*t)*l2* l2*v;Y=N1/(p2)*cos(b)*(l2)+N*p2/(6*s)*u*(1-t*t+ n*n)*v/l2+N1/(120*p2*s)*cos(b)*cos(b)*u*(5-18 *t*t+t*t*t*t-58*n1*n1*t*t)*l2*v;}void coordinateinversecalculation(doubleX,double Y,double n,double &B,double &L) //反算{ double Bf=caculateBf(X);double x=X;double Tf=tan(Bf);double nf=e1*cos(Bf);double Nf=a/sqrt(1-e*e*sin(Bf)*sin(Bf));double Mf=Nf/(1+e1*e1*cos(Bf)*cos(Bf));double g=Nf*Nf*Nf*Nf;double h=Y*Y*Y*Y;double c=Tf*Tf*Tf*Tf;doubleb=Bf-Tf/(2*Mf*Nf)*Y*Y+Tf/(24*Mf*pow(Nf,3))*(5 +3*Tf*Tf+nf*nf-9*nf*nf*Tf*Tf)*h-Tf/(720*Mf*po w(Nf,5))*(61+90*Tf*Tf+45*c)*h*Y*Y;doublel=1/(Nf*cos(Bf))*Y-Nf/(6*g*cos(Bf))*(1+2*Tf*Tf+nf*nf)*h/Y+1/(120*Nf*g*cos(Bf))*(5+28*Tf*Tf +24*c+6*nf*nf+8*nf*nf*Tf*Tf)*h*Y;l=l+n;B=dmstodgree(b); //转换L=dmstodgree(l);}void qingchu(double X,double Y,double n,double B,double L) //清除{X=0;Y=0;n=0;B=0;L=0;}voidCCalculationofcoordinateDlg::OnBnClickedCoord inate()//正算{UpdateData(true);coordinatecalculate(B,L,n,X,Y); //调用正算函数UpdateData(false);}voidCCalculationofcoordinateDlg::OnBnClickedInver se()//反算{UpdateData(true);coordinateinversecalculation(X,Y,n,B,L); //调用反算函数UpdateData(false);}voidCCalculationofcoordinateDlg::OnBnClickeddelet e()//清除{UpdateData(true);qingchu(X,Y,n,B,L);UpdateData(false);}voidCCalculationofcoordinateDlg::OnBnClickedCance l()//退出{OnCancel(); }计算结果总结次实验虽然思维不复杂,但是因为高斯投影正反算公式比较复杂,导致工作量有点大,但还是顺利完成了。

相关文档
最新文档