




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、中国地质大学(武汉)信息工程学院-数据结构课程实习报告2015年秋+实习题目【题目一】角度、弧度、方位角【问题描述】(1)从键盘输入一个角度,判断其合法性;(2)从键盘输入一个角度值将其转化为对应的弧度值输出;(3)从键盘输入一个弧度值将其转化为对应的角度值输出;(4)从键盘输入两个点的坐标的值(x1,y1)(x2,y2),求方位角并输出。【算法分析与设计】1、 问题分析与设计思想 题目一包含了四个部分,因此可以定义四个函数实现上述功能。 函数(一)主要应用if-else的分支结构来实现,首先是取出输入值的度位判断其是否位于0,360),接下来取其分位判断是否位于0,60),最后判断秒位是否位
2、于0,60),这样就可以实现输入角度合法性判断的功能了。函数(二)的设计就比较简单了,主要是要先取出输入的角度的度、分、秒对应的值a1,a2,a3,然后利用利用数学公式a1*PI/180+a2*PI/(180*60)+a3*PI/(180*60*60)式中(PI=3.1415926);输出求得的结果即可。函数(三)设计思路和函数二的整体思路基本一致,只不过首先要先利用数学公式a*180/PI求出输入弧度对应的以度为单位的值,然后就是取出改值的度、分、秒对应的值a1,a2,a3,最后用公式a1+a2/100+a3/10000;求得我们平差中常用的角度值。函数(四)整体设计思路是运用反三角函数at
3、an,但是要考虑一些细节问题,因为求得的(y2-y1)/(x2-x1)值可能为负数为了后面的计算方便要先调用一个求绝对值的函数fabs(),然后调用atan()函数求得的结果是弧度值,因此要调用之前的弧度转环为度的函数,接下来运用if-else if-else的分支语句分不同的象限求值,最后输出求得的结果。2、 出现的问题及解决办法 第一次设计函数四的功能时,在调用函数atan()是由于疏忽是用下面这种方式调用的atan(y2-y1)/(x2-x1),细心观测会发现少了一个括号,因此导致输出的结果不正确,然后就加断点分步运行调试最终找出问题所在。3效率分析与改进设想 因为四个函数的代码较短,函
4、数功能比较简单因此效率很高,暂时还没想出改进设想,期待日后更加深入的学习。【源代码】见附件。/ HzJ.cpp : 定义控制台应用程序的入口点。/#include "stdafx.h"#include<iostream>#include<cmath>using namespace std;const double PI=3.1415926;void PD_angle(double a) /传入一个角度double c;int b,d;b=(int)a; if(b<0|b>360) /判断度位是否合法 cout<<"输
5、入角度不合法<<endl; else c=(a-b)*100; d=(int)c; if(d>=60) /判断分位是否合法 cout<<"输入角度不合法<<endl; else c=(c-d)*100; if(c>=60) /判断秒位是否合法 cout<<"输入角度不合法<<endl; else cout<<"输入角度合法<<endl; double JzH(int a)double b,d;int c1,c2,c3;c1=(int)a; /取出来度位b=(a-c1)*
6、100; c2=(int)b; /取出来分位c3=(int)(b-c2)*100; /取出来秒位d=c1*PI/180+c2*PI/(180*60)+c3*PI/(180*60*60); /计算弧度cout<<"输入的角度转为弧度是"<<d<<endl;return d;double HzJ(double a)double c1,c2,c3,d;int b1,b2,b3;c1=a*180/PI; /将弧度转化为以度为单位b1=(int)c1; /取出度位c2=(c1-b1)*60; b2=(int)c2; /取出分位c3=(c2-b2)*
7、60;b3=(int)c3; /取出秒位d=b1+b2/100+b3/10000;cout<<"输入的弧度转为角度为a:"<<d<<endl;return d;double FwJ(double x1,double y1,double x2,double y2)double a,b,d,x,y;if(x1=x2 &&y1*y2>0)d=90;cout<<"两点间的方位角为a:"<<d<<endl;else if(x1=x2 && y1*y2<
8、;0)d=270;cout<<"两点间的方位角为a:"<<d<<endl;elsex=x2-x1; y=y2-y1; a=atan(y/x);a=(a>0)? a:-a;d=HzJ(a);/x=x2-x1;/y=y2-y1;if(x>0&&y>0)d=d;else if(x<0&&y>0)d=180-d;else if(x<0&&y<0)d=180+d;elsed=360-d;cout<<"两点间的方位角为a:"<
9、;<d<<endl;return d;int _tmain(int argc, _TCHAR* argv)double a,b,c,x1,y1,x2,y2;cout<<"输入一个角度判断是否合法<<endl;cin>>a;PD_angle(a);cout<<"输入一个角度转换为弧度"<<endl;cin>>b;JzH(b);cout<<"输入一个弧度转换为角度"<<endl;cin>>c;HzJ(c);cout<&
10、lt;"输入两个点的坐标(x1,y1)(x2,y2)"<<endl;cin>>x1>>y1>>x2>>y2;FwJ(x1,y1,x2,y2);return 0;【运行结果】【题目二】确定一棵二叉树【问题描述】编写一个矩阵类,实现矩阵的转置、求逆运算,以及两个矩阵的加、减、乘等相关运算。【算法分析与设计】.问题分析与设计思想 首先定义一个矩阵类,类中包含类的私有数据成员,矩阵的行row和列col,公有数据成员包括类的构造函数,读入文件函数,读出文件函数,矩阵相加、相减、相乘的重载函数,矩阵的转置函数,矩阵的求逆函数。
11、在写文件的读入读出函数时把第一行的数据定义为读入或读出矩阵的行和列,这样便于记录矩阵的行和列,就不用从键盘输入行和列,用两个嵌套的for循环函数去控制矩阵按行和列的方式读入或读出,矩阵的加减函数相对来说比较简单,先在加减的重载函数中读入两个文件中存储的矩阵,接着要进行判断两个矩阵能否进行加减操作,也就是要判断两个矩阵的行和列是不是都相等,如果条件成立就进行下一步的运算,同样是用两个嵌套的for循环进行加减运算。矩阵的转置运算同样是利用两个嵌套的for循环,然后将矩阵的行和列进行转换。两个矩阵相乘较矩阵的加减复杂一点,首先是判断两个矩阵能否相乘,就是判断第一个矩阵的列和第二个矩阵的行是否相等,如
12、果相等就进行接下来的计算,否则输出两个矩阵不能相乘,矩阵相乘是要进行累加操作的,因此矩阵相乘要用三个for循环嵌套。矩阵的求逆是这次程序最重要的一个函数,为了更符合一般矩阵的求逆,我采用了高斯-约旦法,因为之前在线性代数上学过这种方法,所以采用了这种方法,主要思想有将文件读入的矩阵变为增广矩阵,然后将读入的矩阵变为单位矩阵,最后将增广矩阵的部分读入到文件中即可。2程序源代码/ juzhen.cpp : 定义控制台应用程序的入口点。/#include "stdafx.h"#include<iostream>#include<fstream>using
13、namespace std;double a100100=0;double b100100=0;double B100100=0;int To1(int i,int N,double B100100)/在进行矩阵变成上三角是将第i行第i列的数变成1/并且返回是否变换成功/0-失败,也就是说改矩阵的秩不是N,并不能求出逆矩阵/1-成功,返回后进行下一步程序int j;int ii=i;double ij;if(Biiii!=0) ij=Biiii;else for(j=i+1;j<=N;+j)if(Bji!=0)break;if(j>N)return 0; /失败for(;i<
14、=2*N;+i) /将第j行的加到第ii行Biii+=Bji;ij=Biiii;for(i=ii;i<=2*N;+i)/将第ii行第ii列的变为1Biii/=ij;return 1; /成功返回void To0(int i,int j,int N,double B100100)/利用第i行第i列的数将第j行到第i行的第i列变为0 if(i=j)return;int ii=i,jj=j;double ij;int n=(i<j)?-1:1;/在下面是 j+=n/n用来检验是求上三角,还是下三角/-1-i<j 也就是 将下三角表为0/1-i>j 也就是 将上三角变为0for
15、(;j!=i;j+=n)for(ii=i,ij=Bji;ii<=2*N;+ii)Bjii-=ij*Biii;class juzhenpublic:juzhen(int r=1,int l=1)row=r;col=l;void get1(juzhen &r1); void get2(juzhen &r2); void Transp();void QN(juzhen &r1); friend juzhen operator+(juzhen &rth1,juzhen & rth2); friend juzhen operator-(juzhen &
16、;rth1,juzhen & rth2); friend juzhen operator*(juzhen &rth1,juzhen & rth2); private:int row;int col; void juzhen:get1(juzhen &r1)int m ,n;ifstream inf1;inf1.open("F:f1.txt");inf1>>m>>n;for(int i=1;i<=m;i+) for(int j=0;j<n;j+) inf1>>aij;r1.row=m;r1.col
17、=n;inf1.close();/return a; void juzhen:get2(juzhen &r2)int d,h; ifstream inf2;inf2.open("F:f2.txt");inf2>>d>>h; for(int i=1;i<=d;i+) for(int j=0;j<h;j+) inf2>>bij;r2.row=d;r2.col=h;inf2.close();juzhen operator+(juzhen &rth1,juzhen & rth2)juzhen r;if(rth1
18、.row!=rth2.row|rth1.col!=rth2.col)cout<<"两个矩阵不能相加"<<endl;elsedouble c100100=0; rth1.get1(rth1); rth2.get2(rth2); ofstream onf2;onf2.open("F:f4.txt");onf2<<"两个矩阵相加:"<<endl;onf2<<rth1.row<<" "<<rth1.col<<endl; for(
19、int i=1;i<=rth1.row;i+) for(int j=0;j<rth1.col;j+) cij=aij+bij; onf2<<cij<<" " onf2<<endl; return r; juzhen operator-(juzhen &rth1,juzhen & rth2)juzhen r;if(rth1.row!=rth2.row|rth1.col!=rth2.col)cout<<"两个矩阵不能相减"<<endl;elsedouble c100100
20、=0; rth1.get1(rth1); rth2.get2(rth2); ofstream onf2;onf2.open("F:f5.txt");onf2<<"两个矩阵相减:"<<endl;onf2<<rth1.row<<" "<<rth1.col<<endl; for(int i=1;i<=rth1.row;i+) for(int j=0;j<rth1.col;j+) cij=aij-bij; onf2<<cij<<&quo
21、t; " onf2<<endl; return r; juzhen operator*(juzhen &rth1,juzhen & rth2)juzhen r;if(rth1.col!=rth2.row)cout<<"两个矩阵不能相乘"<<endl;elsedouble c100100=0; rth1.get1(rth1); rth2.get2(rth2); ofstream onf2;onf2.open("F:f6.txt");for(int i=1;i<=rth1.row;i+)fo
22、r(int j=0;j<rth2.col;j+)for(int m=0;m<rth2.col;m+)cij+=aim*bm+1j;onf2<<"两个矩阵相乘:"<<endl;onf2<<rth1.row<<" "<<rth2.col<<endl;for(int i=1;i<=rth1.row;i+) onf2<<endl;for(int j=0;j<rth2.col;j+)onf2<<cij<<" "re
23、turn r;void juzhen:Transp()juzhen r ;r.get1(r); ofstream onf2;onf2.open("F:f7.txt");onf2<<"矩阵的转置为:"<<endl;onf2<<r.col<<" "<<r.row<<endl; for(int i=0;i<r.col;i+) for(int j=0;j<r.row;j+) bij=aj+1i; onf2<<bij<<" &q
24、uot; onf2<<endl; void juzhen:QN(juzhen &r1)r1.get2(r1);for(int i=1;i<=r1.col;+i)for(int j=1+col;j<=2*r1.col;+j)bij=(j-i=r1.col)?1:0;int i;int flag=1;for(i=1;i<r1.col;+i)if(To1(i,r1.col,b)To0(i,r1.col,r1.col,b);elsecout<<"该矩阵的秩小于 N ,没有逆矩阵"<<endl; flag=0;break;for(i=r1.row;i>=1&&flag=1;-i)if(To1(i,r1.col,b)To0(i,0,r1.col,b);else cout<<"该矩阵的秩小于 N ,没有逆矩阵"<<endl; f
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年江苏省盐城市第二小学数学三上期末质量检测模拟试题含解析
- 七年级下册各单元综合性学习课件
- 八年级生物上《细菌》-课件
- 自考行政管理的行业前景试题及答案
- 2025年护士专业定位试题及答案挖掘
- 执业护士备考中的知识点掌握试题及答案
- 执业药师考试模拟试题及答案解析
- 中国古典文学对管理的启示试题及答案
- 行政管理专业学生的职业发展规划试题及答案
- 执业护士执业技能要求试题及答案2025
- 演出服装定制合同协议
- 计划生育选择试题及答案
- 法律文化-形考作业3-国开(ZJ)-参考资料
- 家校共育“心”模式:青少年心理健康教育家长会
- 形势与政策(贵州财经大学)知到智慧树章节答案
- 从创意到创业智慧树知到期末考试答案章节答案2024年湖南师范大学
- DL-T 1476-2023 电力安全工器具预防性试验规程
- 更换岩棉彩钢板施工方案
- 老年人的体重控制
- 北京中考英语完形填空专项练习及答案
- 小黄瓜种植观察日记(课堂PPT)
评论
0/150
提交评论