2016-01-21 127 views
0

我的代码有问题。所以我们的任务是创建一个代码,输入来自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

你不叫'distancecalc' ... – Jarod42

+0

“作废”是不是“功能”的同义词 - 这是一个类型。 – molbdnilo

回答

0

你的纬度和经度是度,对不对?你能避免调用函数的N到它们转化为弧度:

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()某处...

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越来越随机值

相关问题