Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

C++ Porównanie dwóch tablic dwuwymiarowych.

Ostatnio zmodyfikowano 2021-04-09 19:31
Autor Wiadomość
Temat założony przez niniejszego użytkownika
C++ Porównanie dwóch tablic dwuwymiarowych.
» 2021-04-07 21:07:50
Witam,

Mam problem z porównaniem dwóch tablic dwuwymiarowych. Posiadam tablicę A z 20 wierszami i 2 kolumnami oraz tablicę B z 4 wierszami i 2 kolumnami. Tablica B jest tak jakby tablicą decyzyjną i chciałbym aby na jej podstawie przeszukać tablicę A i znaleźć id(znajdujące się w kolumnie nr.1) z podobnymi liczbami całkowitymi z kolumny nr.2 w dwóch tablicach, a następnie wypisać same Id do tablicy jednowymiarowej. Próbowałem robić to na kilka sposobów ale nie bardzo mam pomysł jak do tego podejść. Czy mógłbym prosić o pomoc w nakierowaniu mnie na skuteczne rozwiązanie?  

Aby lepiej wyjaśnić:

Tablica A    Tablica B      
Id | Int     Id  | Int
---------    ---------
1  |  4      2   |   1
2  |  1      4   |   1
3  |  2      5   |   3
4  |  1      10  |   4
5  |  3
...| ...
20 |  2

Chciałbym porównać obie tablice posługując się Int, jeżeli Int w 1 wierszu Tablicy B wynosi 1 to algorytm powinien przeszukać tablicę A w poszukiwaniu Int=1 i wpisać Id z tablicy A w którym Int=1 do nowej tablicy jednowymiarowej. Chciałbym jednocześnie uniknąć powtórzeń w tej nowej tablicy.

Także podsumowując dla tego przykładu powinna ukazać się tablica jednowymiarowa z pasującymi ID z tablicy A, czyli Tab={2,4,5,1}.

Prosiłbym o jakieś porady w sprawie rozwiązania.


P-178409
» 2021-04-07 21:09:40
Możesz np. posortować tablice, a następnie porównywać je czy elementy mają te same wartości.

/edit:
Możesz też utworzyć std::set i dodać do niego wszystkie wartości, a potem iterować po std::set. W ten sposób uzyskasz zbiór liczb bez powtórzeń. Kwestia co jest Twoim celem. Możesz też używać std::map do wyszukiwania wartości na podstawie klucza.
P-178410
» 2021-04-07 23:14:45
Dla każdego Inta w tablicy B szukaj Inta w tablicy A. Po prostu pętlą, jeśli nie masz specjalnych wymagań. Żeby nie znajdować drugi raz tego samego Id, możesz usunąć wpis z tablicy, albo tylko nadpisać tam Inta wartością, jakiej nie będziesz szukać.
P-178411
Temat założony przez niniejszego użytkownika
» 2021-04-08 20:53:06
Popróbowałem i wyszło mi coś takiego. Zamierzonego efektu nie osiągnałem.

C/C++
int a = 1;
int tabWyn[ a ];
for( int i = 1; i <= 20; i++ )
{
   
if( tabA[ i ][ 2 ] == tabB[ i ][ 2 ] )
   
{
       
tabWyn[ a ] = tabA[ i ][ 1 ];
   
} else cout << "blad" << endl;
   
   
++a; }

Nie bardzo wiem jak miałbym wrzucić Id porównanego Inta do nowej tabeli jednowymiarowej.
P-178412
» 2021-04-09 15:44:34
Zadanie nie jest skomplikowane musisz tylko zrozumieć problem

1. wersja uproszczona
mamy
tablicę tabA = { 4, 1, 2, 3, 5, 2, 7, 7}
tablicę tabB = { 1, 1, 3, 4}
tablicę Wyniki = { }

algorytm

pętla (B) po tablicy : tabB , iterator : iB  
   bierzemy element tej tablicy tabB[iB]
{  
  pętla (A) po tablicy : tabA , iterator : iA  
  {
    porównujemy czy  tabA[iA] == tabB[iB]
    { // równe
      { bierzemy indeks elementu tab{iA}  : iA
        pętla (W) po tablicy Wyniki              
        {
   sprawdzamy, czy taki indeks jest już w tej tablicy
          jeśli taki indeks istnieje to wychodzimy z pętli (W) -> dalej szukamy w pętli (A)

          jeśli nie ma -> to ten indeks dodajemy do tablicy Wyniki          
        } // koniec peli (W) po Wyniki          

    } // koniec porónania  tabA[iA] == tabB[iB]  
  } // koniec pętli (A) po tabA
} //koniec pętli (B) po tabB


2. wersja zadania
mamy do czynienia z tablicami dwuwymiarowymi
tablicę tabA = { (1, 4}, {2, 1}, {3, 2}, {4, 3}, {5, 5} , {6, 2}, {7, 7}, {8, 7} }
tablicę tabB = { {1, 1}, {2, 1}, {3, 3}, {4, 4} }
tablicę Wyniki = { }

algorytm z p 1 powtarzamy zastępując indeks  elementem ID


3. algorytm z p.2 musi również zadziałać dla tablic

tablicę tabA = { (31, 4}, {102, 1}, {105, 2}, {204, 3}, {302, 5} , {367, 2}, {447, 7}, {581, 7} }
tablicę tabB = { {1, 1}, {2, 1}, {3, 3}, {4, 4} }
tablicę Wyniki = { }

Powodzenia
P-178415
» 2021-04-09 19:31:08
C/C++
int a = 1;
int tabWyn[ a ];
Co tu chciałeś osiągnąć z tym a w tablicy? a jest równe 1, więc tablica ma 1 element, permanentnie. Nie powiększy się magicznie gdy zwiększysz później a. Powinieneś tu podać największą oczekiwaną liczbę wyników, co wynika z rozmiaru tablic wejściowych.

C/C++
for( int i = 1; i <= 20; i++ )
{
   
if( tabA[ i ][ 2 ] == tabB[ i ][ 2 ] )
   
{
       
tabWyn[ a ] = tabA[ i ][ 1 ];
       
// (1)
   
} else cout << "blad" << endl;
   
   
++a; }
a jest tu zawsze równe i, więc osobna zmienna jest zbędna. Co tu powinno być, to zwiększanie a w punkcie (1) i powinieneś zaczynać liczyć od zera. Żeby wypełniać tablicę w sposób ciągły, musisz zwiększać "rozmiar tablicy" razem z dodawaniem elementu. W przeciwnym razie wszędzie gdzie warunek nie jest spełniony, w tablicy wynikowej będzie pozycja z niezainicjalizowaną wartością. No i tablice indeksuje się od zera, indeks 1 to drugi element.
P-178416
« 1 »
  Strona 1 z 1