写在开始
马上就要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语言是面向过程的语言.