测绘程序设计四-函数实验报告
测绘程序设计四 函数实验报告
《测绘程序设计()》上机实验报告(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文档
《测绘程序设计()》上机实验报告(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 语言函数实验报告一、实验目的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语言_实验四、函数程序设计
实验四函数一、实验目的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 -=。
编写一个用户自定义函数,该函数有一个整数参数,函数的功能是:求解这个整数的阶乘,函数的返回值为这个整数的阶乘。
实验报告函数心得
实验报告函数心得实验报告函数心得在学习编程的过程中,函数是一个非常重要的概念。
函数可以将一段代码块封装起来,使得程序更加模块化和可读性更强。
通过实验,我深刻体会到了函数的重要性,并且对函数的使用和设计有了更深入的理解。
首先,我学会了如何定义和调用函数。
在编写函数时,我需要指定函数的名称、参数和返回值。
通过这些信息,我可以在程序中调用函数,传递参数,并获得返回值。
这样,我可以将一段重复使用的代码封装成一个函数,方便多次调用,提高代码的复用性。
在实验中,我遇到了一个计算圆的面积的问题,我编写了一个名为"calculate_area"的函数来完成这个任务。
通过调用这个函数,我可以在程序的任何地方计算圆的面积,而不需要重复编写计算公式。
其次,我了解了函数的参数传递方式。
在函数定义时,我可以指定函数的参数,参数可以是必需的或可选的。
通过参数,我可以向函数传递数据,函数可以根据参数的值进行相应的操作。
在实验中,我遇到了一个求和的问题,我定义了一个名为"sum_numbers"的函数,它接受两个参数,并返回它们的和。
通过传递不同的参数值,我可以在程序中多次调用这个函数,得到不同的结果。
另外,我学会了如何使用函数来解决复杂的问题。
在编写程序时,我经常会遇到一些复杂的任务,这时候函数就派上了用场。
通过将复杂的任务分解成若干个小的子任务,并将每个子任务封装成一个函数,我可以更加清晰地思考和编写代码。
在实验中,我遇到了一个统计字符串中字符个数的问题,我编写了一个名为"count_characters"的函数来完成这个任务。
通过调用这个函数,我可以轻松地统计任意字符串中字符的个数,而不需要在程序中重复编写统计代码。
除此之外,我还了解了函数的作用域和变量的生命周期。
在函数内部定义的变量称为局部变量,它们只在函数内部可见,函数执行完毕后,这些变量的值会被销毁。
而在函数外部定义的变量称为全局变量,它们在整个程序中可见,可以被多个函数共享。
C语言程序设计—函数—实验报告.docx
33
scanf(H :” r &num);
34
temper)roveGo 1 dbach (num);
35
if (temp— )//当输入小于 6 或者不是偶贾 彳
36
37
P丄
38
return ;
39
40
CMXMCCMC
length; KW lino; 40
Ln;29 3;初 Sd;0|0
Oc$\Wtf)dcrw> ANMasUn 8 介 ®
题目三 :编写一个求阶乘的函数,接着调用该函数实现组合的求解
要求: ① 提示用户输入 n 和 m 的数值;
: ② 输出的 C 结果
#include<stdio.h> /*======二阶乘函数=======*/ int fac(int n) {
int f; if(n<0)
printf(nn<O,data error!11); else if(n==0lln==l)
实验报告函数的用法(3篇)
第1篇一、实验目的1. 理解函数的概念及作用。
2. 掌握函数的声明、定义和调用方法。
3. 学习函数的参数传递和返回值。
4. 熟悉函数的嵌套调用和递归调用。
二、实验原理函数是程序设计中的一种基本概念,它将一系列具有特定功能的代码封装在一起,以便重复使用。
函数的主要作用是将复杂的程序分解为多个模块,提高代码的可读性和可维护性。
在C语言中,函数分为两大类:标准函数和自定义函数。
标准函数是C语言库函数,如printf()、scanf()等;自定义函数是由程序员根据实际需求编写的函数。
函数的基本结构如下:```c函数返回类型函数名(参数列表) {// 函数体}```三、实验内容1. 函数的声明函数声明用于告诉编译器函数的存在,包括函数名、返回类型和参数列表。
函数声明格式如下:```c函数返回类型函数名(参数类型参数名);```2. 函数的定义函数定义是函数声明的具体实现,包括函数名、返回类型、参数列表和函数体。
函数体由大括号{}包围,包含一系列执行语句。
```c函数返回类型函数名(参数类型参数名) {// 函数体}```3. 函数的调用函数调用是指程序中调用函数的过程。
调用函数时,需要按照函数的参数列表提供相应的实参。
```c函数名(实参1, 实参2, ..., 实参n);```4. 函数的参数传递函数的参数传递主要有两种方式:值传递和地址传递。
(1)值传递:将实参的值复制给形参,函数内部对形参的修改不会影响实参。
(2)地址传递:将实参的地址传递给形参,函数内部通过修改形参的地址来修改实参的值。
5. 函数的返回值函数的返回值是指函数执行完毕后返回给调用者的值。
函数返回值类型必须与函数声明时指定的返回类型一致。
6. 函数的嵌套调用函数嵌套调用是指在一个函数内部调用另一个函数。
嵌套调用的函数可以递归调用自身。
7. 函数的递归调用递归调用是指函数在执行过程中直接或间接地调用自身。
递归调用分为直接递归和间接递归两种。
最新测绘程序设计实验报告
最新测绘程序设计实验报告实验目的:本实验旨在通过设计和实现最新的测绘程序,提高学生对测绘技术和程序设计的理解,同时培养学生的编程能力和解决实际问题的能力。
通过实验,学生将学习到如何运用现代测绘方法和编程技巧,有效地处理地理信息数据,并生成精确的地图。
实验内容:1. 测绘数据采集:使用全球定位系统(GPS)和遥感技术收集地理信息数据。
2. 数据处理与分析:利用地理信息系统(GIS)软件对采集的数据进行处理和分析,包括数据清洗、格式转换和误差分析。
3. 程序设计:基于Python或C++等编程语言,设计测绘程序,实现数据的自动化处理和地图的生成。
4. 地图生成:通过编写的程序,生成二维或三维地图,并进行可视化展示。
5. 实验评估:对生成的地图精度和程序性能进行评估,提出改进意见。
实验步骤:1. 确定实验目标和所需数据类型。
2. 选择合适的测绘工具和GIS软件。
3. 设计程序架构,编写程序代码。
4. 运行程序,输入测绘数据,进行数据处理。
5. 生成地图,并对地图进行校验和修正。
6. 撰写实验报告,总结实验过程和结果。
实验结果:通过本次实验,成功设计并实现了一个测绘程序。
该程序能够自动处理GPS和遥感数据,生成精确的地图。
实验中发现,程序在处理大规模数据时效率较高,但在数据清洗阶段需要进一步优化以提高准确性。
生成的地图清晰度高,满足了实验的基本要求。
结论:本次实验验证了所设计测绘程序的有效性,通过实际应用,程序能够满足基本的测绘需求。
未来的工作将集中在提高程序的数据处理能力和用户交互体验上,以适应更复杂的测绘任务。
此外,还需探索如何将人工智能技术集成到测绘程序中,进一步提升地图生成的智能化水平。
函数图像绘制实验报告
函数图像绘制实验报告1. 引言函数图像绘制是数学学科中的重要内容,通过绘制函数的图像,可以形象地表示函数的性质和规律,帮助我们更好地理解函数的行为。
本实验旨在通过使用编程语言实现函数图像的绘制,学习和掌握函数图像的绘制方法和技巧。
2. 实验方法本次实验使用Python编程语言,结合Matplotlib库实现函数图像的绘制。
Matplotlib是一种用于创建静态、动态和交互式形式绘图的库,它可以在Python脚本中以相当简单的方式绘制各种各样的图形。
实验流程如下:1. 导入Matplotlib库2. 定义绘图区域,设置坐标轴的范围3. 定义函数,构建函数的数学表达式4. 使用Matplotlib库绘制函数的图像5. 添加图像的标题和标签6. 显示图像3. 实验结果在本实验中,我们选择绘制函数y = sin(x)的图像。
具体代码如下:pythonimport numpy as npimport matplotlib.pyplot as plt定义x范围和步长x = np.arange(0, 2 * np.pi, 0.1)定义函数y = np.sin(x)绘制函数图像plt.plot(x, y)添加标题和标签plt.title('Function Graph: y = sin(x)')plt.xlabel('x')plt.ylabel('y')显示图像plt.show()执行以上代码,我们可以得到函数y = sin(x)的图像,如图1所示。
![Function Graph: y = sin(x)](sin_function.png)*图1: 函数图像y = sin(x)*4. 结论与分析通过实验,我们成功地实现了函数图像的绘制。
通过观察图像,我们可以发现函数y = sin(x)的图像是一个周期性的波形,它的振幅在-1到1之间变化。
随着x 从0到2π的增加,函数的周期为2π,图像呈现出周期性重复的特点。
程序设计基础实验报告
实验一 用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语言程序设计实验报告(实验名称:函数)1实验目的(1)掌握函数的定义方法、调用方法、参数说明以及返回值;(2)掌握实参与形参的对应关系,以及参数之间的“值传递”的方式;(3)掌握函数的嵌套调用及递归调用的用的设计方法;(4)在编程过程中加深理解函数调用的程序设计思想。
2实验内容(1)编写一个函数primeNum(int x),功能是判别一个数是否为素数。
要求:①在主函数中输入一个整数x(直接赋值或从键盘输入);②函数类型为空值(void),调用primeNum( )函数后,在函数中输出x是否为素数的信息,输出格式为“x is a prime number”或”x is not aprime number”;③分别输入一下数据:0,1,2,5,9,13,59,121,并运行程序,检查结果是否正确。
(2)编写函数 mulNum(int a,int b),它的功能是用来确定a和b是否是整数倍的关系。
如果a是b的整数倍,则函数返回值为1,否则函数返回值为0。
要求:①在主函数中从键盘输入一对整型数据a和b;②调用函数后,根据返回值对a和b的关系进行说明。
例如,在主函数中输入:10,5,则输出“10 is a multiple of 5”;③分别输入下面几组数据进行函数的正确性测试:1与5,5与5,6与2,6与4,20与4,37与9。
3算法描述流程图(1)primeNum(int x)(判别一个数是否是素数)函数流程图①主函数流程图:②判断素数函数流程图:(2)mulNum(int a,int b)(确定a和b是否是整数倍的关系)函数流程图①主函数流程图:②判断倍数流程图:4源程序(1)判断某个数是否是素数#include <stdio.h>int primNum(int x) /*编写函数判断某个数是否是素数*/ {int i;if (x==0||x==1) /*当x等于1或等于0时判断是否为素数*/return 0;for (i=2;i<x;i++) /* 当x大于2时判断不为素数的数*/{if (x%i==0)return 0;}if (x%i) /* 当x等于2或不满足上述条件时时判断出该数是素数*/ return 1;}void main(){int n ;printf("Please input an integer:"); /* 提示从键盘输入一个数x */scanf("%d",&n);if (primNum(n)==1) /* 调用定义的函数*/ printf("%d is a prime number\n",n); /* 由函数得出结论判断是否为素数*/ elseprintf("%d is not a prime number\n",n);}(2)个数是否是整数倍关系#include <stdio.h>int mulNum(int a,int b)/* 定义函数确定两个数是否有整数倍关系*/{if (a%b==0) /* 判断出a是b的整数*/return 1;else /* 判断出a不是b的整数*/return 0;}void main (){int m,n;printf ("please input tow integers:\n"); /*提示从键盘输入两个数*/scanf ("%d%d",&m,&n); /*从键盘输入两个数的值*/if(mulNum(m,n)==1) /*调用定义的函数并判断输出相应的结果*/printf("%d is a multiple of %d\n",m,n);elseprintf("%d is not a multiple of %d\n",m,n);}5测试数据(1)实验(1)测试数据为0,1,2,5,9,13,59,121 运行结果当测试数据0时当测试数据1时当测试数据2时当测试数据5时当测试数据9时当测试数据13时当测试数据59时当测试数据121时(2)实验2测试的数据1与5,5与5,6与2,6与4,20与4,37与9。
测绘程序设计基础实验报告
《测绘程序设计()》上机实验报告(Visual C++.Net)班级:测绘1101学号: 0405100731姓名:龚自飞序号:二零一四年六月目录实验1 Visual C++.Net环境和程序设计初步 (1)实验内容: (1)设计思路: (1)界面设计: (1)主要代码:列出程序的代码,按文件依次列出。
注意代码的书写格式和注释 (2)运行结果: (3)总结 (5)实验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)、创建名为“gzf1”的 MFC 应用程序;(2)、在窗体上放置4 个文本框、4 个静态框、3 个命令按钮(其中两个缺省); (3)、设置控件属性,如Static1 的Caption 属性设置成“a=”,用于提示Edit框的输入边长a ;(4)、把“取消”按钮的Caption 属性改为“退出”;双击前两个按钮,生成Click 消息函数,注释掉重载函数“OnOK()”。
(5)、为4 个Edit 控件添加绑定变量。
(6)、在相应的函数中添加代码; (7)、运行和调试程序; (8)、保存应用程序。
界面设计:主要代码:gzf1void Cproject01Dlg::OnBnClickedOk(){// TODO: 在此添加控件通知处理程序代码UpdateData(TRUE);double p;p=(a+b+c)/2;S=sqrt(p*(p-a)*(p-b)*(p-c));UpdateData(FALSE);//OnOK();}void Cproject01Dlg::OnBnClickedOk2(){// TODO: 在此添加控件通知处理程序代码a=0;b=0;c=0;S=0;UpdateData(FALSE);}void Cproject01Dlg::OnBnClickedCancel() {// TODO: 在此添加控件通知处理程序代码OnCancel();}运行结果:总结总结的书写要求:这是我这学期编写的第一个MFC程序,在这次课前,我们在大一课程设计的时候有接触到相关的MFC编程,不过时隔两年,也陌生了不少。
测绘程序设计基础实验报告
测绘程序设计基础实验报告1.引言本实验旨在通过测绘程序设计基础实验,加深对测绘程序设计基本概念及其应用的理解。
在实验中,我们将学习如何使用测绘程序设计工具,结合实际测绘数据进行计算、分析和可视化展示。
本报告将详细介绍实验背景、实验过程和实验结果,并总结实验中的收获与体会。
2.实验背景测绘程序设计是测绘工程的重要组成部分,它利用计算机技术和数学方法对大量的测量数据进行处理和分析,以实现对地理信息的精确描述与快速获取。
测绘程序设计的基础是计算机编程和地理测量学知识,因此对编程基础和地理测量学的了解是进行测绘程序设计的前提。
为了培养学生对测绘程序设计的理解和应用能力,本实验将通过设计测绘程序,实现对实际测绘数据的处理和分析。
通过这个实验,我们将进一步了解测绘程序设计的基本原理和实际应用。
3.实验过程3.1 实验准备在开始实验之前,我们需要准备以下工具和材料:•计算机•测绘软件•实验数据3.2 实验步骤1.下载并安装测绘软件,根据官方提供的安装指南完成软件的安装。
2.运行测绘软件,新建一个项目,在项目中导入实验数据。
3.使用测绘软件提供的分析工具,对实验数据进行计算和处理。
4.根据实验要求,设计测绘程序,实现对实验数据的处理和分析。
5.在测绘软件中运行测绘程序,获取处理后的数据。
6.根据实验要求,将处理后的数据可视化展示。
7.完成实验报告,总结实验过程和结果。
3.3 实验注意事项在进行实验过程中,需要注意以下几点:•确保测绘软件和测绘程序的兼容性,避免出现兼容性问题导致实验失败。
•仔细阅读实验要求,确保程序设计符合要求并能够正确处理和分析实验数据。
•注意数据质量和精度,对实验数据进行必要的清洗和校验。
4.实验结果根据实验要求,我们设计了一个测绘程序,用于对实验数据进行处理和分析。
经过运行程序并在测绘软件中查看结果,我们得到了以下实验结果:•处理后的数据结果清晰可见。
•分析结果准确,符合实验要求和设计要求。
测绘程序设计实验报告
测绘程序设计(C版)实习报告学号: 201420050138姓名:李阳靖班级: 1420501Z专业:测绘工程课程名称:测绘程序设计(C及Matlab)指导老师:肖根如2015年12月目录前言1一、实验目的1二、实验环境2三、Turbo C 3.0与VC++6.0的熟悉与操作2四、实验内容梗概3五、实验具体内容4实验一算法4实验二数据类型、运算符和表达式5实验三控制语句6实验四函数9实验五数组11实验六结构体与共用体12六、常见错误及分析14七、程序调试15八、实验心得与体会17九、附录:实习程序设计清单21前言现代科学飞速发展,世界也不断的变化,人类的生活随着科技的发展也发生着惊天动地的变化。
作为新时代的大学生,我们应该不断努力学习科学文化知识,以适应社会的发展要求,以现代化的科学知识为祖国做贡献。
而C语言作为一种计算机语言,无疑是我们将来工作不可缺少的一门技能,所以我们应该认真学好C语言。
但只是课本上的知识是不够的,我们应该将从课本上学到的理论知识应用到实践中,通过不断的实践,在实践中发现错误解决错误,并不断创新,最后能熟练的运用所学的知识,充分掌握这种工具。
C语言知识博大精深,有必要对C语言的专著进行研究学习,多阅读别人的程序代码、多动手实践操作与设计,这样便对程序算法精简改进提供了可能。
想学的更深更透彻的话就必须进一步掌握运用C进行程序设计的能力;进一步理解和运用面向过程程序设计的思想和方法;初步掌握开发一个小型实用系统的基本方法;学会调试一个较长程序的基本方法;学会利用互联网查找相关的知识并学习;学海之路何其宽广,有必要让我们孜孜不倦的求索下去。
一、实验目的C语言程序设计实习是在学习《C语言程序设计》理论知识的基础上进行的实践教学环节,其目的是培养我们具有初步的C语言程序设计、编程、调试和排除C语言程序语法、逻辑错误的能力。
全面熟悉、掌握C语言基本知识,掌握C程序设计中的顺序、分支、循环三种结构及数组、函数和C语言基本图形编程等方法,把编程和实际结合起来,增强对不同的问题运用和灵活选择合适的数据结构以及算法描述的本领,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,培养使用计算机解决实际问题的能力,养成提供文档资料的习惯和规范编程的思想,为以后在专业课程中应用计算机系统解决计算、分析、实验和设计等学习环节打下较扎实的基础。
测绘程序实验报告
实验1 Visual C++.Net环境和程序设计初步1.掌握 VC++ 语言的基本语法;2.理解顺序结构、选择结构和循环结构程序设计的特点及应用;3.掌握对基于对话框的 MFC 应用程序设计方法;4.掌握一些简单算法。
5.编写一个方位角计算程序。
提示:先使用反正切函数计算,然后利用坐标增量的符号来判断所在的象限。
设计思路:在按钮下面添加程序。
X Y同时大于0在第一象限,方位角等于arctan(y/x);X>0,Y<0在第二象限,方位角等于arctan(y/x)+90;X<0,Y<0在第三象限,方位角等于arctan(y/x)+180;X<0,Y>0在第四象限,方位角等于arctan(y/x)+270;界面设计:主要代码:计同一参考椭球下的三维地心坐标(笛卡儿坐标系)与大地坐标系转换的程序。
(提示:用 do…while 迭代,B、H 初始为 0 进行迭代,直到 H 的精度达到米)注意:东经 0~180(Y>0),西经:0~-180(Y<0)式中,B、L、H 为椭球面上的大地纬度、大地经度、大地高;X、Y、Z 为空间直角坐标;N 为卯酉圈曲率半径,e 为椭球的偏心率,a 为椭球的长半径,b 为椭球的短半径。
(WGS84 椭球参数:长半径 a=6378137m,扁率α=1/)设计思路:在按钮下面设置主程序,按照指导书给的思路编辑公式界面设计:主要代码:写一个后方交会计算程序。
基本原理及计算公式若将 Pa、Pb、Pc 看成权,则 P 点的坐标即为三个已知点的加权平均值计算程序设计步骤(1)设计界面,用于输入 3 个已知点的坐标和三个观测角、和,以及用于输出待定点坐标的文本框(12 个)、静态标签框和 Button 按钮;(2)定义文本框控件变量(Value);(3)根据已知点计算三个内角 A、B、C;(4)计算 Tan(α)、Tan(β)、Tan(γ)、Tan(A)、Tan(B)、Tan(C);(5)计算 Pa、Pb、Pc;(6)计算待定点坐标 Xp、Yp。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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(); }计算结果总结次实验虽然思维不复杂,但是因为高斯投影正反算公式比较复杂,导致工作量有点大,但还是顺利完成了。