【C++测绘程序设计练习题2程序--2】

C++测绘程序设计课后练习题2编程

一、前言

C++测绘程序设计(长安大学编)练习题2第15-26题代码,仅供参考。

一、具体内容

练习题2第15题:编写程序使用输入输出流iostream,从键盘输入一个数值与一个字符串(字符串使用string类定义),并向屏幕输出数值与字符串。

#include <iostream>
#include <string>
using namespace std;
int main()
{
    int num;
    string str;
    cout << "请输入一个数值和一个字符串,中间用空格隔开:" << endl;
    cin >> num >> str;

    cout << "输入的数值为:" << num << endl;
    cout << "输入的字符串为:" << str << endl;
    return 0;
}

第16题:编写程序使用文件流fstream,从一个文本文件(.txt)中读入数值与字符串等数据,向另一个文本文件保存这些数据与字符串。

#include<iostream>
#include<fstream>
using namespace std;
int main()
{
    ofstream ou;
    ou.open("D:\\C++测绘程序设计\\编程作业\\test2\\输出文件流.txt", ios::_Nocreate);
    //如果没有不自动创建
        if (!ou)
        {
            cout << "文件打开失败";
            exit(1);
        }
    ifstream in;
    in.open("D:\\C++测绘程序设计\\编程作业\\test2\\输入文件流.txt", ios::_Nocreate);
    if (!in)
    {
        cout << "文件打开失败";
        exit(1);
    }
    int a ;
    string str;
    in >> a >> str;//从输入文件流.txt文件中读入a和字符串str
    in.close();
    ou << a << str;//向输出文件流.txt文件中写入a和字符串str
        ou.close();
        cout << "文件读写完成!" << endl;
        return 0;
}

第17题:用实数表示角度制值的格式为ddd.ffmmm…m,其中ddd表示度,ff表示分(两位),mmm…m表示mm.m…m秒(位数不确定,前两位是秒的整数值)。编写两个函数 double HD_DFM(double HD)和double DFM_HD(double DFM)实现角度制与弧度制的相互转化。取整计算可用int()、floor()或modf()函数。编写main函数测试两个转换函数。

#include<iostream>
using namespace std;
double PI = 3.14159265;
double HD_DFM(double HD)
{
    double DFM;
    int ddd = int(HD / PI * 180);
    int ff = int((HD / PI * 180 - ddd) * 60);
    double mm = (((HD / PI * 180 - ddd) * 60) - ff) * 60;
    DFM = ddd + ff * 1e-2 + mm * 1e-4;
    return DFM;
}
double DFM_HD(double DFM)  //其中用实数表示角度制的格式ddd.ffmmm...m
{
    double HD;
    int ddd = int(DFM);
    int ff = int((DFM - ddd) * 1e2);
    double mm = (DFM - ddd - ff / 100) * 3600;
    HD = (mm / 3600 + ff / 60 + ddd) / 180 * PI;
    return HD;
}
int main()
{
    double DFM = 180.3030333;
    double HD = 3.14;
    cout << "度分秒" << DFM << "转弧度:" << DFM_HD(DFM) << endl;
    cout << "弧度" << HD << "转度分秒:" << HD_DFM(HD) << endl;
    return 0;
}

第18题:编写坐标方位角计算函数double Afa(double dx,double dy)根据坐标增量dx和dy利用反正切函数atan计算坐标方位角(返回值为计算结果/角度制)。要求正确计算坐标方位角并能够处理dx等于零的情况。

#include <iostream>
#include <cmath>
double PI = 3.14159265;
using namespace std;
double Afa(double dx, double dy)
{
    double a = 0;
    if (dx == 0) // 处理dx等于0的情况
    {
        if (dy > 0) { a = 90; }
        else if (dy < 0) { a = 270; }
        else a = 0;
    }
    else
    {
        a = atan(dy / dx) * 180 / PI;//tan(x)定义域在[-PI/2,PI/2]
        if (dx < 0) a += 180;
        else if (dy < 0) a += 360;
    }
    return a;
}
int main()
{
    double dx = 1.0, dy = 1.0;
    double a = Afa(dx, dy);
    cout << "坐标方位角为:" << a << "度" << endl;
    return 0;
}

第19题:使用引用形参,设计一个测量正算函数,输入数据为double类型的边长D和坐标方位角a(角度制),计算结果为坐标增量( ),定义函数void CL_ZHS(double D,double a,double &dx,double &dy),其中,dx与dy为该函数的返回值。编写main()函数测试该函数。

#include <iostream>
#include <cmath>
double PI = 3.14159265;
using namespace std;
void CL_ZHS(double D, double a, double& dx, double& dy)
{
    double angle = a * PI / 180.0;//注:大地坐标系xy轴与数学直角坐标轴xy不同
    dx = D * cos(angle);
    dy = D * sin(angle);
}
int main()
{
    double D = 10.0, a = 30.0;//边长D设为10,坐标方位角a设为30度
    double dx = 0, dy = 0;
    CL_ZHS(D, a, dx, dy);
    cout << "坐标增量为(" << dx << ", " << dy << ")" << endl;
    return 0;
}

第22题:上网查找、下载math.h文件及其应用文章,根据参考资料编写程序练习三角函数、幂函数等的应用方法。

#include <iostream>
#include<fstream>
#include <cmath>
double PI = 3.14159265;
using namespace std;
int main()
{
	double a = PI / 6;
	double b = 1.0;
	double c = -3.1415;
	double d = 6.66;
	double e = 2.0;

	double arr[10];
	arr[0] = sin(a);//正弦函数
	arr[1] = cos(a);//余弦函数
	arr[2] = tan(a);//正切函数
	arr[3] = atan(b);//反正切函数
	arr[4] = fabs(c);//取绝对值
	arr[5] = int(d);//取整函数
	arr[6] = sqrt(e);//取平方根函数
	arr[7] = asin(1 / sqrt(e));//反正弦函数
	arr[8] = acos(1 / sqrt(e));//反正切函数
	arr[9] = pow(e, 3);//幂函数
	cout << "sin(PI / 6)、cos(PI / 6)、tan(PI / 6)、atan(1.0)、fabs(-3.1415)、int(6.66)、sqrt(2.0)、asin(1 / sqrt(2))、" <<
		"acos(1 / sqrt(2))、pow(2, 3) = " << endl;
	for (int i = 0; i < 10; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl << "计算完毕!" << endl;
	return 0;
}

第23题:编程序练习C++字符串类string的应用方法,声明字符串、从键盘和文本文件分别输入、输出字符串,判断两个字符串是否相等,进行不同字符串的连接。

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
    string str1, str2;
    cout << "请输入字符串1:" << endl;
    getline(cin, str1);          //接收一个字符串,可以接收空格并输出,需包含“#include<string>”
    cout << "请输入字符串2:" << endl;
    getline(cin, str2);
    cout << "字符串1为:" << str1 << endl;
    cout << "字符串2为:" << str2 << endl;
    if (str1 == str2)
        cout << "字符串1和字符串2相等" << endl;
    else
        cout << "字符串1和字符串2不相等" << endl;
    string str3 = str1 + str2;    // 字符串连接
    cout << "字符串1和字符串2连接后为:" << str3 << endl;
    ifstream fin("text.txt");//默认路径
    if (fin)
    {
        string str4;
        getline(fin, str4);    // 从文本文件输入字符串
        cout << "从文件中读取的字符串为:" << str4 << endl;
    }
    else
    {
        cout << "打开文件失败" << endl;
    }
    return 0;
}

第24题:编写单向三角高程计算函数DX_SJGC,输入数据两点间的水平距离、竖直角(度.分分秒秒)、仪器高与镜高,计算两点间的高差。

#include <iostream>
#include <cmath>
const double PI = 3.14159265;
using namespace std;
double DFM_HD(double DFM)  //将度分秒转弧度(使用第17题函数),其中DFM是用实数表示角度制,格式为ddd.ffmmm...m
{
    double HD;
    int ddd = int(DFM);
    int ff = int((DFM - ddd) * 1e2);
    double mm = (DFM - ddd - ff / 100) * 3600;
    HD = (mm / 3600 + ff / 60 + ddd) / 180 * PI;
    return HD;
}
// 单向三角高程 计算高差
double DX_SJGC(double D, double DFM, double instrumentH, double targetH)
{
    double HD = DFM_HD(DFM); // 将竖直角转换为弧度值
    double deltaH = D * tan(HD) + targetH - instrumentH;    // 计算高差
    return deltaH;
}
int main()
{
    double D = 173; // 两点间水平距离
    double DFM = 30.0000; // 竖直角(度度度.分分秒秒)
    double instrumentH = 1.5; // 仪器高
    double targetH = 1.5; // 镜高

    double deltaH = DX_SJGC(D, DFM, instrumentH, targetH);//输入数据为两点间的水平距离D、竖直角DFM、仪器高与镜高,计算两点高差。
    cout << "两点间高差为:" << deltaH << endl;
    return 0;
}

第25题: 根据24题的三角高程计算函数,设计对向观测的三角高程计算函数WF_SJGC, 输入数据为起点高程、两点间的水平距离D(/m)、往返测的竖直角(/度.分分秒秒)、往返测的仪器高与镜高(/m),计算终点高程。往返测高差较差的限差为40√(D/1000)mm。往返测高差较差超限时返回-1×108。

#include <iostream>
#include <cmath>
double PI = 3.14159265;
using namespace std;
double DFM_HD(double DFM)  //将度分秒转弧度制(使用第17题函数),其中DFM是用实数表示角度制,格式为ddd.ffmmm...m
{
    double HD;
    int ddd = int(DFM);
    int ff = int((DFM - ddd) * 1e2);
    double mm = (DFM - ddd - ff / 100) * 3600;
    HD = (mm / 3600 + ff / 60 + ddd) / 180 * PI;
    return HD;
}
// 往返三角高程计算
double WF_SJGC(double startH, double D, double frontDFM, double backDFM, double frontInstrumentH, double frontTargetH, double backInstrumentH, double backTargetH)
{
    double HDf = DFM_HD(frontDFM);
    double HDb = DFM_HD(backDFM);
    // 计算前后视高差
    double deltaHf = D * tan(HDf) + frontTargetH - frontInstrumentH;
    double deltaHb = D * tan(HDb) + backTargetH - backInstrumentH;
    // 计算终点高程
    double endH = startH + (deltaHf + deltaHb) / 2.0;
    // 计算限差
    double limit = 40.0 * sqrt(D / 1000.0);
    // 判断是否超限
    if (fabs(deltaHf - deltaHb) > limit / 1000)
    {
        return -1e8;
    }
    return endH;
}
int main()
{
    double startH = 100.0; // 起点高程
    double D = 173.0; // 两点间水平距离
    double frontDFM = 30.2830; // 往测竖直角(度度度.分分秒秒)
    double backDFM = 30.2810; // 反测竖直角
    double frontInstrumentH = 1.5; // 往测仪器高
    double frontTargetH = 3.0;     // 往测镜高
    double backInstrumentH = 1.5; // 返测仪器高
    double backTargetH = 3.0;     // 返测镜高
    double endH = WF_SJGC(startH, D, frontDFM, backDFM, frontInstrumentH, frontTargetH, backInstrumentH, backTargetH);
    if (endH == -1.0e8)
    {
        cout << "前后视高差超限!" << endl;
    }
    else
    {
        cout << "终点高程为:" << endH << endl;
    }
    return 0;
}

第26题: 根据25题的三角高程计算函数,设计一个文件计算函数File_SJGC(string filename)计算在一个文本文件中保存的n个对向观测的三角高程数据。要求将计算数据与计算结果以追加(ios::app)的方式添加在输入文件数据之后。

#include <iostream>
#include<fstream>
#include <cmath>
double PI = 3.14159265;
using namespace std;
double DFM_HD(double DFM)  //将度分秒转弧度制(使用第17题函数),其中DFM是用实数表示角度制,格式为ddd.ffmmm...m
{
    double HD;
    int ddd = int(DFM);
    int ff = int((DFM - ddd) * 1e2);
    double mm = (DFM - ddd - ff / 100) * 3600;
    HD = (mm / 3600 + ff / 60 + ddd) / 180 * PI;
    return HD;
}
// 往返三角高程计算
void File_SJGC(double** arr, int n, int& error)
{
    double* startH = new double[n]; //起点高程
    double* D = new double[n];//两点间的水平距离D
    double* HDf = new double[n]; //往测竖直角DFM1
    double* HDb = new double[n];//返测竖直角DFM2
    double* frontInstrumentH = new double[n]; //往测仪器高
    double* frontTargetH = new double[n];//往测镜高
    double* backInstrumentH = new double[n];//返测仪器高
    double* backTargetH = new double[n];//返测镜高
    double* deltaHf = new double[n];//往测高差
    double* deltaHb = new double[n];//返测高差
    for (int i = 0; i < n; i++)
    {
        HDf[i] = DFM_HD(arr[i][2]);//竖直角转换成弧度值
        HDb[i] = DFM_HD(arr[i][3]);
    }
    for (int i = 0; i < n; i++)
    {
        //观测数据赋值
        D[i] = arr[i][1];
        frontTargetH[i] = arr[i][5];
        frontInstrumentH[i] = arr[i][4];
        backTargetH[i] = arr[i][7];
        backInstrumentH[i] = arr[i][6];
        // 计算前后视高差
        deltaHf[i] = D[i] * tan(HDf[i]) + frontTargetH[i] - frontInstrumentH[i];
        deltaHb[i] = D[i] * tan(HDb[i]) + backTargetH[i] - backInstrumentH[i];
        // 计算终点高程
        double* endH = new double[n];
        startH[i] = arr[i][0];
        endH[i] = startH[i] + (deltaHf[i] + deltaHb[i]) / 2.0;
        // 计算限差
        double* limit = new double[n];
        limit[i] = 40.0 * sqrt(D[i] / 1000.0);
        // 判断是否超限
        if (fabs(deltaHf[i] - deltaHb[i]) > limit[i] / 1000)
        {
            endH[i] = -1e8;
        }
        ofstream out;
        out.open("D:\\C++测绘程序设计\\编程作业\\test2\\往返测三角高程观测数据.txt", ios::_Nocreate | ios::app);//没有不创建,追加写入
        if (!out)
        {
            cout << "文件打开失败"; exit(1);
        }
        else
        {
            out << "计算第" << i + 1 << "个终点高程结果为:" << endH[i] << endl;
            if (endH[i] == -1e8) { out << "前后视高差超限!" << endl; error += 1; }
        }
    }
}
int main()
{
    int n;
    ifstream in;
    in.open("D:\\C++测绘程序设计\\编程作业\\test2\\往返测三角高程观测数据.txt", ios::_Nocreate);
    if (!in)
    {
        cout << "文件打开失败1"; exit(1);
    }
    else
    {
        in >> n;
        double** arr = new double* [n];//(C语言)先给二维数组的每一行开辟一块空间,用来指向每一行(即存放每一行的地址)
        for (int i = 0; i < n; i++)
        {
            arr[i] = new double[8];//然后分别为每一行再开辟内存,用来管理列
        }
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < 8; j++)
            {
                in >> arr[i][j];//用观测数据给二纬数组赋初值
            }
        }
        int error = 0;
        File_SJGC(arr, n, error);
        string str;
        in >> str;
        for (int i = 0; i < n; i++)
        {
            delete[] arr[i];
        }
        delete[]arr;
        cout << "一共" << n << "个对向观测三角高程数据计算写入完成!有" << error << "个前后视高差超限。" << endl << str;
        in.close();
    }
    return 0;
}
/*文本文件:
2
100 173 20.2830 30.2810 1.5 3.0 1.5 3.0
100 50 45.2830 45.2810 1.5 3.0 1.5 3.0
数据格式为:2个对向观测三角高程数据。从左到右为:起点高程、两点间的水平距离D、往测竖直角DFM1、往测竖直角DFM2、往测仪器高、镜高、往测仪器高、镜高。
*/

后续持续更新中…

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

왕 낙 원.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值