五、 实习中主要技术问题及处理方法
1. 问题:函数如何返回多个数值
处理方法:1)指针传递
Eg:角度转换成度分秒函数将度分秒的值传回主函数(3个返回值) 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;
}
2)调用数组
Eg:附合导线坐标方位角计算函数将计算所得方位角值传回主函数(多个返
回值)
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 {cang[i]=cang[i-1]+b*(PI-ang[i]); if(cang[i]>2*PI) cang[i]=cang[i]-2*PI;} } if(cang[i]<0) cang[i]=cang[i]+2*PI; 2. 问题:如何访问类的对象成员 处理方法:在预处理命令中装入相应类的头文件,再通过指针访问对象成员 Eg:检查角度处理类算法时,在主函数中调用类中函数 #include\ …… …… DegSwitch *D1=new DegSwitch(); D1->Deg_DMS(Deg,&(*a),&(*b),&*(c)); …… …… result=D1->Deg_Rad(Deg); …… …… 3. 问题:不同的类之间可否相互调用成员函数 处理方法:可以;在预处理命令中装入相应类的头文件,再通过指针访问对象成员 4. 问题:录入的多个以度分秒表示的角度如何批量存放、处理 处理方法:放入二维数组中储存、处理 Eg:在主函数中定义一个数组存放录入的附合导线观测角值 int A[N][3] …… 6 其中,A[i][0]、A[i][1]、A[i][2]中分别存放第i+1个观测角的度、分、秒 位上的数值 5. 问题:附合导线近似计算类中,最初录入的度分秒形式的角度值无法直接进行运算,如 何准确计算和分配角度闭合差、算出坐标方位角,并根据坐标方位角正确计算坐标增量 处理方法:1)根据不同计算需求将角度转换成以秒为单位或以弧度为单位数据 度分秒形式进行角度转换 以秒为单位 的角度值 角度值 进行角度闭合差的计算与 进行角度转换 分配,根据调整后的观测进行角度转换 角值计算坐标方位角 度分秒形式弧度形式的 的角度值 角度值 得到并输出度分秒形以弧度形式的坐标方 式的调整后观测角值位角值运用三角函数 和坐标方位角 计算坐标增量 2)对角度闭合差的分配:先将闭合差平均分配到每一个观测角中,若有余数, 再将余数平均分配到最小边对应点两个观测角中 实现以上处理的对应代码: …… //度分秒形式角度值转换成以秒为单位角度值 DegSwitch *m=new DegSwitch(); for(i=0;i ang[i]=m->DMS_s(A[i][0],A[i][1],A[i][2]); …… //对角度闭合差的分配 int ff=f_a/n*b; for(int i=0;i ang[i]=ang[i]+ff; int m=0,f1=0,f2=0; for(int j=1;j if(S[j]<=S[m]) m=j; if((f_a%n)!=0) if((f_a/n)%2!=0) {f1=(f_a%n)/2; 7 f2=f1+1;} else {f1=(f_a%n)/2; f2=f1;} ang[m]=ang[m]+f1*b; ang[m+1]=ang[m+1]+f2*b; …… //以秒为单位角度值转换成弧度值计算坐标增量 DegSwitch *q=new DegSwitch; for(i=0;i cang2[i]=q->DMS_Rad(0,0,cang[i]); …… double xs=0,ys=0; for(i=0;i {Ccoo[i][0]=S[i]*cos(cang[i]); xs=xs+Ccoo[i][0]; ys=ys+Ccoo[i][1]; *dx=xs-x; *dy=ys-y; …… //得到并输出度分秒形式的调整后观测角值和坐标方位角 cout< {u->s_DMS(ang[i],&A[i][0],&A[i][1],&A[i][2]); cout< cout< Ccoo[i][1]=S[i]*sin(cang[i]); } {u->s_DMS(cang[i],&CAng[i][0],&CAng[i][1],&CAng[i][2]); cout< …… 6. 问题:读原始数据文件过程中,如何将多个数据一次存放在数组中 处理方法:通过循环语句实现 Eg:将原始数据文件中储存的观测角角度值(度分秒形式)存入一个二维数 组中 for(i=0;i for(j=0;j<3;j++) fscanf(fp,\,&A[i][j]); 7. 问题:程序能够生成、运行,但运行结果不正确 处理方法:通过以下手段调试、检查程序: 8 1)断点调试 2)逐语句执行程序 3)选取关键变量进行监视 经过逐步排除筛选找出源代码的逻辑错误或算法错误,进行分析改正 8. 问题:Windows窗体程序中如何通过对控件的操作打开一个新的窗体 处理方法:在原窗体头文件的预处理命令中装入新窗体对应头文件,在原窗体设计界面 双击控件,进入头文件,在光标停留处添加代码 Eg:角度转换 cfrm=gcnew 角度转换(); cfrm->Show(); 9. 问题:如何在Windows窗体中提取、改变控件文本 处理方法:提取控件文本:double d=Convert::ToDouble(t1->Text); 改变控件文本: t4->Text=Convert::ToString(deg); 10. 问题:如何在Windows窗体中调用类的成员函数 处理方法:DegSwitch^ x=gcnew DegSwitch(); deg=x->DMS_Deg(d,m,s); 六、 实习收获及感想 根据面向对象思想设计算法、编写代码使程序设计模块化,各模块有明确的功能,既便于对函数的调用,也有利于对程序算法的精简、检查。 基于面向对象思想的程序设计,首先要明确需要处理的对象(已知数据)和最终要得到的对象(所求数据),然后分析二者之间的关系,深入理解问题,由此设计算法,再将分块进行算法代码编写,最终编码实现整个过程。编写源代码过程中要注意对数据的灵活处理和转换,如度分秒形式的角度值可存放在二维数组中,使用三角函数是角度值应化为弧度值,通过指针或数组进行值的传递等。编码完成生成程序后,要及时进行多次检查,发现错误后采用适当的方法进行调试、找出有问题的语句或算法进行修改,尽量提高算法的效率和准确度,使结果最精确。 在Windows窗体程序设计过程中,每个控件都要有相应的功能或作用,为用户提供获取及输入信息的途径;同时,界面的设计要简洁合理,使用户能一目了然,迅速进行操作,因此可在所需控件较多的情况下按功能添加新的窗体,在原窗体中只提供功能选择控件,并在新窗体中设计实现相应功能。 总体来说,我在本次实习中更具体地认识、理解了面向对象程序设计的思想,独立实践运用了课堂上学习的编程知识,并学习了一些新的编程语法知识,全面提高了自身编程能力,对编程所解决的问题有了更加深入的理解。目前,我能够独立设计编写的程序还很简单,因此更需要我在以后尽力学习相关知识、查阅相关资料,以不断提升程序设计方面的水平。 七、 意见及建议 希望今后能提前通知实习内容及要求,以便学生能在实习前做好准备,查阅、学习相关资料,提高实习过程中的效率。 9