2014-10-28 4 views
0

for 루프를 사용하여 사용자에게 std::cin을 사용하여 입력을 요청한 후 두 경도/위도 점 사이의 거리를 얻기위한 연산을 수행합니다. 그러나 루프의 첫 번째 반복 후 std::cin은 루프의 첫 번째 반복에 저장된 변수를 실행하고 다시 사용하지 못합니다.Cin이 루프의 첫 번째 반복 수행 후 실행하지 못함

#include<iostream> 
#include<string> 
#include<cmath> 
#include<sstream> 
#include<vector> 
#include<iterator> 
using namespace std; 

int main() 
{ 
    string startingLocation; 
    int numDest; 
    string arrStart[3]; 

    getline (cin, startingLocation); 
    stringstream ssinStart(startingLocation); 

    int k = 0; 
    string airport = ""; 

    while (ssinStart.good() && k < 3) 
    { 
     if (k < 2) 
     { 
      ssinStart >> arrStart[k]; 
      ++k; 
     } 
     else 
     { 
      string mid; 
      ssinStart >> mid; 
      arrStart[k].append(mid); 
      arrStart[k].append(" "); 
     } 
    } 

    cin >> numDest; 

    string* destinations = new string[numDest]; 
    double* distDest = new double[numDest]; 
    string dest; 

    for (int i = 0; i < numDest; i++) 
    { 
     cin >> dest; 

     string arrDest[3]; 
     stringstream ssinDest(dest); 

     int j = 0; 
     while(ssinDest.good() && j < 3) 
     { 
      if (j < 2) 
      { 
       ssinDest >> arrDest[j]; 
       ++j; 
      } 
      else 
      { 
       string mid; 
       ssinDest >> mid; 
       destinations[i].append(mid); 
       destinations[i].append(" "); 
      } 
     } 

     string delimiter = "/"; 

     double lat1 = atof(arrStart[0].substr(0, arrStart[0].find(delimiter)).c_str()); 
     double lat2 = atof(arrDest[0].substr(0, arrDest[0].find(delimiter)).c_str()); 
     double lon1 = atof(arrStart[1].substr(0, arrStart[1].find(delimiter)).c_str()); 
     double lon2 = atof(arrDest[1].substr(0, arrDest[1].find(delimiter)).c_str()); 

     if (*arrStart[0].rbegin() == 'S') 
     { 
      lat1 = -lat1; 
     } 
     if (*arrDest[0].rbegin() == 'S') 
     { 
      lat2 = -lat2; 
     } 
     if (*arrStart[1].rbegin() == 'W') 
     { 
      lon1 = -lon1; 
     } 
     if (*arrDest[1].rbegin() == 'W') 
     { 
      lon2 = -lon2; 
     } 

     double dlat = lat1 - lat2; 
     double dlon = lon1 - lon2; 
     double R = 3959.9; 

     double a = pow(sin(dlat/2), 2) + cos(lat1) * cos(lat2) * pow(sin(dlon/2), 2); 
     double c = 2 * atan2(sqrt(a), sqrt(1-a)); 
     double d = R * c; 

     distDest[i] = d; 

    } 

    for (int i = 0; i < numDest; i++) 
    { 
     cout << destinations[i] << ": " << distDest[i] << endl; 
    } 

    return 0; 
} 

입력 후, 입력 3 개 위치로 사용자에게 메시지를 표시한다 (이 경우에 3)의 시작 위치, 목적지의 다음 번호 걸린다. 그러나 첫 번째 위치를 입력 한 후 루프를 반복하여 남은 횟수만큼 끝까지 복식을 출력합니다 (서로 합성 됨). 루프 내에서 정의 된 변수가 반복 사이에 이월되고 있기 때문에 이것이 메모리 문제라고 가정합니다. 그러나 문제에 대한 검색은 없었습니다.

내가

159.123/N 145.22/W Los Angeles 
3 
124.22/N 23.1222/W San Francisco 

O

: 10919 
: 9065.76 
: 7619.9 
+0

C++을 만지지는 않았지만 실제로 문자열 입력에'cin' 만 사용해야합니까? 'getline'은 어떨까요 –

+0

문자열 입력을 수집하는 더 좋은 방법을 제안합니까? 'getline' 메소드를 사용하지 않으려 고 시도했습니다 – asdf

+0

입력 및 출력을 표시 할 수 있습니까? – Shadow

답변

1

std::cin 단지까지 공백을 읽습니다. 따라서 입력 할 때 124.22/N 23.1222/W 샌프란 시스코 cin은 그것을 4 개의 문자열로 읽습니다. 따라서 모든 반복에 대해 충분한 입력을 제공했습니다. 이전에 사용한 것처럼 완전한 라인을 읽으려면 getline 방법을 사용하십시오.

관련 문제