2017-05-10 1 views
2

두 개의 .txt 파일이 있습니다. t1.txt에는 좌표가있는 두 개의 열이 있습니다. t2.txt에는 세 개의 열 (좌표 및 값)이 있습니다. t1.txt의 좌표에 대해 t2.txt에서 세 번째 열을 추출하고 싶습니다. 지금 내 코드는 두 .txt 파일에서 동일한 번호를 찾고 있습니다. 불행하게도, 좌표는 같지 않고 가장 가까운 좌표를 찾아야합니다. 내 코드를 변경하는 방법? 나는 약간의 정보를 찾으려고했지만, 나는 초보자이며 아무것도 도와주지 못합니다.C++에서 두 파일의 가장 가까운 숫자를 비교하고 추출하는 방법

내 코드 : 등호 복식 비교에 의존하지 마십시오

#include <iostream> 
#include <fstream> 
#include <iomanip> 
using namespace std; 

double** alokujPamiec(int,int); 
void deleteAlokujPamiec(double**&); 

int main() 
{ 

int liczba=0; 
fstream plik1("t1.txt",ios::out | ios::in); // 2 columns 
fstream plik2("t2.txt", ios::out | ios::in); //3 columns 
ofstream plik5("wynik.txt"); 
    plik5 << setprecision(5) << fixed; // precision 
int p1=0,p2=0; 
char buff[255]; 
if(plik1.is_open()){ 
    while(plik1.getline(buff,255)){ 
     p1++; // number of lines 
    } 
}else cout <<"Error in opening file 1"<<endl; 

if(plik2.is_open()){ 
    while(plik2.getline(buff,255)){ 
    p2++; 
    } 
}else cout <<"Error in opening file 2"<<endl; 

cout << "lines in t1.txt" << "\t" <<p1<<endl; 
cout << "lines in t2.txt" << "\t" <<p2<<endl; 

plik1.close(); 
plik2.close(); 

fstream plik3("t1.txt",ios::out | ios::in); 
fstream plik4("t2.txt", ios::out | ios::in); 

double** dane1 = alokujPamiec(p1, 2); 
double** dane2 = alokujPamiec(p2, 3); 
int h=1; 
cout <<"Loading data...."<<endl; 

if(plik4.is_open()){ 
for(int i=0;i<p2;i++) 
{ 
    for(int j=0;j<3;j++){ 
      plik4>>dane2[i][j]; 
      } 
    } 
}else cout << "Error 4"<<endl; 

if(plik3.is_open()){ 
    for(int i=0;i<p1;i++) 
{ 
    for(int j=0;j<2;j++){ 
      plik3>>dane1[i][j]; 
      } 
    } 
}else cout << "Error 3"<<endl; 

cout <<"Comparison and writing... "<<endl;  

for(int i=0;i<p1;i++) 
    { 
     for(int j=0;j<p2;j++) 
      { 
       if(dane1[i][0]==dane2[j][0] && dane1[i][1]==dane2[j][1]) 
        { 
        plik5<<dane1[i][0]<<"\t"<<dane1[j][1]<<"\t"<<dane2[j][0]<<"\t"<<dane2[i][1]<<"\t"<<dane2[i][2]<<endl; 
        liczba++;       
        } 
      } 
    } 

    cout <<"Number of found objects"<<"\t"<<liczba<<endl; 

    plik3.close(); 
    plik4.close(); 
    plik5.close(); 

    deleteAlokujPamiec(dane1); 
    deleteAlokujPamiec(dane2); 
    getchar(); 
    return 0; 
    } 

    double ** alokujPamiec(int iloscWierszy, int iloscKolumn) 
    { 
    double** tab2d = new double*[iloscWierszy]; 
     double* dumm = new double[iloscWierszy*iloscKolumn]; 

      for (int i = 0; i < iloscWierszy; i++) 
      tab2d[i] = dumm + i*iloscKolumn; 
     return tab2d; 
     } 

     void deleteAlokujPamiec(double**& tab2d) { 
     delete [] tab2d[0]; 
     delete [] tab2d; 
     tab2d = 0; 
     } 

답변

4

올바른 접근 방식을 가져야한다 복잡한 문제는 그것을 무너 뜨리는 것입니다. 몇 가지 작은 문제로 나누고 각 문제를 개별적으로 해결하십시오. 모두 해결하면 최종 결과를 얻을 수 있습니다.

"가장 가까운"좌표의 의미를 정의하는 것으로 시작하십시오. 대답은 물론 the Pythagorean theorem입니다. (x1, y1)(x2, y2)의 두 좌표가있을 때 이들 사이의 거리는 sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1))입니다. 기존 코드는 이미 좌표에 double을 사용하므로이 공식을 코드에 직접 꽂아 넣으면됩니다.

이렇게하면 "가장 가까운"것이 의미하는 문제가 해결됩니다. 숫자가 작을수록 표현식의 결과가 더 작아집니다. 결과가 0이면 두 좌표가 동일합니다. 하나의 좌표가 있다면 다른 좌표의 쌍, 가장 가까운 쌍은 피타고라스 거리가 수치 적으로 더 작은 좌표입니다.

다음 문제 : 하나의 좌표 집합이 (x1, y1)입니다. 이제 다른 좌표에서로드 한 다른 좌표의 전체 목록을 얻었습니다. (x1, y1)에 가장 근접한 다른 파일의 좌표는 어떻게 찾습니까? 이것은 이제 고전적인 솔루션 인 사소한 간단한 프로그래밍 작업이되었습니다. 다른 파일의 각 좌표를 반복합니다. 다른 파일의 각 좌표는 (x2, y2)이됩니다. Pythagoren 정리에 연결하여 거리를 구하고 루프가 가장 가까운 좌표를 추적하도록하십시오. 고전적인 해결책은 미리 다른 파일로부터 첫 번째 좌표까지의 거리를 계산하는 것입니다. 거리를 가져온 다음 나머지 좌표를 반복하고 각 거리를 계산하여 저장 한 다음 계산 거리가 작 으면 좌표를 저장하고 저장된 좌표를이 좌표로 바꿉니다. 하찮은.

루프의 끝에서 가장 가까운 좌표는 (x1, y1)입니다. 이것은 이제 간단하고 간단한 프로그래밍 작업입니다.

솔루션의 마지막 단계는 첫 번째 파일의 모든 좌표에 대해 이렇게하는 것입니다. 다시 말하지만, 이것은 이제 첫 번째 파일의 각 좌표를 반복적으로 반복하고 각각의 위 단계를 실행하는 간단한 프로그래밍 작업입니다. 따라서 다른 파일에서 각 좌표의 가장 가까운 좌표를 찾습니다.

임무 완수.

+0

피타고라스 정리는 좌표가 매우 가깝기 때문에 평평한 서피스가 구에 대한 근사가 될 정도로만 유효하므로주의해야합니다. 또한, 좌표가 실제로 작은 오차로 동일하다고 가정하기 때문에 합당한 엡실론과 각 값을 비교하면 충분합니다. –

+0

이것은 기본적으로 내가했을 것입니다. 필요한 출력에 따라 필자는 임계 값 (ε)을 사용하여't1.txt'의 '엡실론'거리 내에 있거나 (@Sam으로) 지적한 't2.txt'의 모든 좌표를 찾고, 가장 가까운 지점을 추적하고 그 중 가장 가까운 지점을 걷어차십시오. –

+0

자, 제안 해 주셔서 감사합니다! 오류는 작기 때문에 두 가지 방법을 모두 사용하려고합니다. – raquela

관련 문제