我的代码有问题。因此,我们的任务是创建一个代码,该代码从txt文件输入信息(包括城市名称及其经度和纬度)并制作一个游戏,询问"哪个城市最接近_____"并为您提供3个选项,您必须从中选择。然后它告诉你正确/不正确并显示距离。问题是,我的代码并没有以千米计算城镇之间的距离,而是一种非常奇怪的形式。结果是例如3.582e-307和类似的。你知道这可能是什么问题吗?
#include <iostream>
#include <cstdlib>
#include <stdlib.h>
#include <fstream>
#include <sstream>
#include <string>
#include <time.h>
#include <random>
#include <numeric>
#include <math.h>
#include <cmath>
#include <algorithm>
#include <ctime>
#define PI 3.14159265
using namespace std;
struct District {
double lng ;
double lat ;
string city ;
};
struct Distance {
double lng;
double lat;
};
//void for changing degrees to rad
double dtr(double deg) {
return (deg * PI / 180);
};
//void calculation of distance
// this doesnt work correctly - the output isnt the distance in KM, i used the formula from - https://en.m.wikipedia.org/wiki/Great-circle_distance
double* distancecalc (double pos[], double distance[]) {
Distance locat [4] ;
District districts [79] ;
double posi [4];
for (int x=0; x<4; x++) {
posi [x] = pos [x] ;
}
for (int u=posi[0]; u<posi[4]; u++) {
locat [u].lat = districts [u].lat ;
locat [u].lng = districts [u]. lng;
locat [u].lat = dtr(locat [u].lat );
locat [u].lng =dtr (locat [u].lng) ;
}
//calculate the distance between cities (0 (base) and 1-3)
for (int u=0; u<4; u++) {
double ax = locat[0].lat, ay = locat[0].lng, bx = locat[u].lat, by = locat[u].lng;
distance[u] = acos (sqrt(pow(sin((bx-ax)/2.0), 2.0)+cos(ax)*cos(bx)*pow(sin((by-ay)/2.0),2.0))) * 2 * 6371;
return distance ;
}
}
int main () {
int z=1;
do { districts [79] ;
ifstream inputFile;
inputFile.open ("districts.txt") ;
if (!inputFile.is_open()){
cout << "opening txt document" << endl;
return 0 ;
}
//shuffle
int line ;
stringstream ss;
string sdouble ;
for (line=0; line<79; line++) {
getline(inputFile, districts[line].city, ';') ;
getline(inputFile, sdouble, ';') ;
ss<< sdouble;
ss>> districts[line].lng ;
getline(inputFile, sdouble, ';' ) ;
ss<<sdouble;
ss>>districts[line].lat;
getline(inputFile, sdouble) ;
}
//shuffle the cities+ coordinates- array
srand(time(NULL));
double tempn;
int pos1,pos2;
string temp;
for (int i = 0; i < 79; ++i){
pos1 = rand()%79;
pos2 = rand()%79;
temp = districts [pos1].city ;
districts [pos1].city = districts [pos2].city;
districts [pos2].city = temp;
tempn = districts [pos1].lat;
districts [pos1].lat = districts [pos2].lat ;
districts [pos2].lat = tempn;
tempn = districts [pos1].lng ;
districts [pos1].lng = districts [pos2].lng ;
districts [pos2].lng = tempn;
}
//game
double pos [4];
double distance [3];
int loop=0, answer=0, guess, total=0;
do {
double min=999999;
//cout - city + options
cout<< endl ;
cout << "Which city is the closest to "<< districts[loop].city<< "? Pick one of the following: " <<endl;
pos [1] = loop;
loop++ ;
cout << "1) " << districts[loop].city << endl;
pos [2]= loop;
loop++ ;
cout << "2) " << districts[loop].city << endl;
pos [3] = loop;
loop++ ;
cout << "3) " << districts[loop].city << endl;
pos [4] = loop;
loop++ ;
//calculate the difference+ find answer (which is the closest)
cout << "Write your selection: " ;
cin>> guess;
for (int x=1; x<4; x++) {
if (min>distance[x] ) {
min= distance[x];
answer= x;
}
}
//if you guess the correct answer -
if (guess==answer) {
total++;
cout<< "Correct! The distances are: " << endl;
}
// if you guess the incorrect answer-
else {
cout<< "Incorrect! The distances are:" <<endl;
}
//witing the distances between 1 city
cout<< "1) " << districts[loop-3].city << "- " << distance [1] << endl;
cout<< "2) " << districts[loop-2].city << "- " << distance [2] << endl;
cout<< "3) " << districts[loop-1].city << "- " << distance [3] << endl << endl;
for (int u=0 ; u< 80; u++) {
cout << "-" ;
}
} while(loop<40) ;
//end of game
cout << endl << "Conratulations, you finished the game! Your score is: " << total << " out of 10" << endl;
int selection ;
cout <<endl << "Do you want to play again?" << endl << "1= Yes" << endl << "0= No" << endl;
cout << "Your selection: " ;
cin>> selection;
if (selection== 0) {
z= 0;
}
else {
z=1;
if (system("CLS")) system("clear") ;
}
} while (z==1 );
}
**END OF CODE**
答案 0 :(得分:0)
代码的这一部分:
double* distancecalc (double pos[], double distance[]) {
Distance locat [4] ;
District districts [79] ;
....
for (int u=posi[0]; u<posi[4]; u++) {
locat [u].lat = districts [u].lat ;
locat [u].lng = districts [u]. lng;
....
districts
未初始化。 localt
获得随机值
答案 1 :(得分:0)
你的纬度和经度都是度数,对吗?你可以避免调用函数将它们转换为弧度:
constexpr double DEG2RAD = 3.141592653589793 / 180;
那样:
for (int u=posi[0]; u<posi[4]; u++) {
locat [u].lat = districts [u].lat * DEG2RAD;
locat [u].lng = districts [u].lng * DEG2RAD;
}
然后,在您发布的链接中,公式不同,您使用的是acos
而不是asin
,但最重要的是您没有将districts[]
传递给该函数,因此它是该函数的本地和未初始化。您必须决定是否将该数组设为全局。
然后你必须在某个地方拨打distancecalc()
......