写在开始

马上就要C语言考试了,但是我并不是很想花时间复习C语言,所以整理一下C语言的实验就当做复习吧.

实验一 简单C语言程序的调试

一、 实验目的

掌握选择结构程序设计的一般方法及选择结构程序的调试方法。

二、实验内容

已知地球的赤道半径为6378.137千米。假设在赤道上,有两个处于不同经度(单位为度)的城市,用C语言编程序求出这两点之间的直线距离(即弦长)与球面距离 (即劣弧的长度)。

要求:

⑴ 计算结果要有尽可能高的精确度。
⑵ 要考虑到横跨东、西两个半球的情况。(提示:东经为正,西经为负。) 
⑶ 要求输入数据时之间以空格分隔。例如,欲求赤道上东经10度到东经50度的距离,输入格式应为:10 50
⑷ 最后提交完成的C语言源程序(扩展名为.c)文件。 
建议:

从简单到复杂, 比如先实现同一个半球上的计算,正确运行之后再拓展到两个半球。

三、参考测试数据及结果: 

东经0度,东经90度——直线距离9020.047727 ,球面距离10018.754000

东经20.5度,西经36.6度——直线距离6096.548421 ,球面距离6356.342816 

东经160度,西经170度——直线距离3301.566601 ,球面距离3339.584667

题目解析

这一个题目需要的是一个输入两个经度的经度差,然后算成弧长和弦长的程序,所以我写了几个函数来处理这个问题,当然一开始我不知道double类型的数据有一个fabs函数可以取绝对值,所以我自己写了一个函数来计算.

然后我又写了一个求弦长的函数和一个求弧长的函数,然后输入半径和角度来计算结果的.

再用一个p函数来打印输出,run显得有点多余,应该说是我不想在main函数里面写太多代码的缘故.

我的代码

为了适配VS2017让我改成了C++的.

#include<iostream>
#include"stdafx.h"
#include<cstdio>
#include"omp.h"
#include<cstdlib>
#include<cmath>
#include<cstring>
#define PI 3.14159265358979323846264338327950288419716939937510582097494459230781640628
using namespace std;

/*
先用经度差除以360,然后用角度double值乘赤道半径
*/
double dabs(double input){
    if (input<=0) input = -input;
    return input;
}
double shijicha(double a,double b){
    if (dabs(a-b)>=180) return 360.0-dabs(a-b);
    else return dabs(a-b);
}
double huchang(double r,double jiaodu){
    return 2.0*PI*r*jiaodu/360.0;
}
double xuanchang(double r,double jiaodu){
    return 2.0*r*sin(jiaodu/2.0*PI/180.0);
}
void p(double a,double b,double c,double d){
    char dong[5] = "东经";
    char xi[5] = "西经";
    char *str1;
    char *str2;
    str1 = dong;
    str2 = dong;
    if (a<0) {
        str1 = xi;
        a = dabs(a);
    }
    if (b<0) {
        str2 = xi;
        b = dabs(b);
    }
    printf("%s%lf度,%s%lf度——直线距离%lf ,球面距离%lf \n",str1,a,str2,b,c,d);
}
void run(double r,double input[],int length){
    double cha = shijicha(input[0],input[1]);
    //printf("%lf",cha);
    p(input[0],input[1],xuanchang(r,cha),huchang(r,cha));

}

int main(){
    double input[2];
    double R = 6378.137;
    scanf_s("%lf %lf", &input[0], &input[1]);
    run(R,input,2);

    system("pause");

    return 0;
}

测试数据

0 45
东经0.000000度,东经45.000000度——直线距离4881.614719 ,球面距离5009.377086
请按任意键继续. . .

0 55
东经0.000000度,东经55.000000度——直线距离5890.191830 ,球面距离6122.571994
请按任意键继续. . .

-10 55
西经10.000000度,东经55.000000度——直线距离6853.941024 ,球面距离7235.766902
请按任意键继续. . .

写在最后

应该也就写成这样了,这个实验我写的有点过度封装的感觉,虽然C语言是面向过程的语言.

Last modification:January 27th, 2020 at 01:21 pm