Wyszukiwanie wzorca w tablicy dwuwymiarowej.

0

Witam, staram się zaimplementować algorytm naiwny wyszukujący wzorca dwuwymiarowego w macierzy. Niestety w trakcie porównywania zmienia prawidłowy znak ASCII na inny (w moim przypadku uśmiechniętą buźkę). Nie wiem czy to jest jedyny błąd. Czy ktoś mógłby zajrzeć do kodu i zastanowić się co jest nie tak?

 
#include <fstream>
#include <iostream>

using namespace std;

main()
{
    ////////////////////////////////////////////////////
    /////////////  CZESC WCZYTUJACA   //////////////////
    ////////////////////////////////////////////////////
   string wiersz;
   int liczba_kolumn;
   int liczba_wierszy = 0;
    std::fstream plik;
    plik.open( "tekst.txt", std::ios::in | std::ios::out );

    //  ODCZYTYWANIE ROZMIARU MACIERZY
        if (plik.fail()) {
                cout << "Pliku nie mozna otworzyc" << endl;
        }
        while  (! plik.eof())  {
          getline(plik,wiersz); //metoda getline czytajaca z otwartego pliku cały wiersz
          liczba_kolumn = wiersz.length()+1; // liczba kolumn macierzy odczytana z pierwszego wiersza

          liczba_wierszy++;
   }
   cout << "Liczba kolumn w macierzy: " << liczba_kolumn;
   cout << "\nLiczba wierszy w macierzy: " << liczba_wierszy << "\n\n\n";
   plik.close();

   //  WYPEŁNIANIE MACIERZY DANYMI
   char map_xy[liczba_wierszy][liczba_kolumn];
   int linia = 0;
        plik.open( "tekst.txt", std::ios::in | std::ios::out );
        while  (! plik.eof())  {
          getline(plik,wiersz);
          for (int i = 0; i <= liczba_kolumn; i++)
          {
            map_xy[linia][i] = wiersz[i];  //wypelniamy macierz
          }

          linia++;
   }

   for (int j = 0; j <= liczba_wierszy-1; j++)
   {
       for (int k = 0; k <= liczba_kolumn-1; k++)
       {
           cout << map_xy[j][k];
       }
       cout << "\n";
   }
   plik.close();

   //  ODCZYTYWANIE ROZMIARU MACIERZY WZORCA
   int liczba_kolumn2 = 0;
   int liczba_wierszy2 = 0;
    std::fstream plik2;
    plik2.open( "wzorzec.txt", std::ios::in | std::ios::out );


        if (plik2.fail()) {
                cout << "Pliku nie mozna otworzyc" << endl;
        }
        while  (! plik2.eof())  {
          getline(plik2,wiersz); //metoda getline czytajaca z otwartego pliku cały wiersz
          liczba_kolumn2 = wiersz.length()+1; // liczba kolumn macierzy odczytana z pierwszego wiersza

          liczba_wierszy2++;
   }
   cout << "\n\n\nLiczba kolumn w macierzy: " << liczba_kolumn2;
   cout << "\nLiczba wierszy w macierzy: " << liczba_wierszy2 << "\n\n\n";
   plik2.close();

   //  WYPEŁNIANIE MACIERZY WZORCA DANYMI
   char map2_xy[liczba_wierszy2][liczba_kolumn2];   //mapa wzorca
   linia = 0;
        plik2.open( "wzorzec.txt", std::ios::in | std::ios::out );
        while  (! plik2.eof())  {
          getline(plik2,wiersz);
          for (int i = 0; i <= liczba_kolumn2; i++)
          {
            map2_xy[linia][i] = wiersz[i];  //wypelniamy macierz
          }

          linia++;
   }

   for (int j = 0; j <= liczba_wierszy2-1; j++)
   {
       for (int k = 0; k <= liczba_kolumn2-1; k++)
       {
           cout << map2_xy[j][k];
       }
       cout << "\n";
   }
   plik2.close();

    ////////////////////////////////////////////////////
    /////////////  CZESC OBLICZENIOWA  /////////////////
    ////////////////////////////////////////////////////

    int x = 0;  //
    int y = 0;  //     x i y - wspolrzedne wzorca w tekscie
    int z;      // zmienna pomocnicza
    int takie_cos;
    int spr_dalej = 0;


   for (int j = 0; j <= liczba_wierszy-liczba_wierszy2-1; j++)
   {
       for (int k = 0; k <= liczba_kolumn-1; k++) //odejmujemy dlugosc wzorca zeby nie przekroczyc tablicy
       {
           cout << "\nPrzesuwamy ";
            if (map_xy[j][k] == map2_xy[0][spr_dalej])  //jesli zgadza sie pierwszy znak z kolumny...
            {
                cout << "\nPierwszy znak jest ok: " << map2_xy[0][spr_dalej] << " i " << map_xy[j][k] << " na wspolrzednych: " << j << " i " << k;
                for (int l = 1; l <= liczba_wierszy2-1; j++)  //...to sprawdzamy czy zgadzaja sie inne w pionie
                {
                    takie_cos++;
                        z = j + l;
                    if (map_xy[z][k] /= map2_xy[l][spr_dalej]) // jesli jakis element w pionie sie nie zgadza..
                    {

                        cout << "\nNie zgadza sie " << map2_xy[l][spr_dalej] << " z " << map_xy[z][k] << " na wspolrzednych: " << z << " i " << k;
                        spr_dalej = 0;
                        takie_cos = 0;
                        l = liczba_wierszy2;           //...zerujemy spr_dalej i takie_cos, nastepnie wychodzimy z petli
                    }
                }
                if (takie_cos > 0)             //jesli takie_cos jest wieksze od zera to znaczy ze caly wzorzec w linii sie zgadza
                {
                    cout << "\nTo sie zgadza";
                    if (spr_dalej == 0)        //jesli to jest pierwsza linia wzorca to zapamietujemy
                    {
                        cout << "\nZapamietujemy";
                        x = z;
                        y = k;
                    }
                    spr_dalej++;
                    if (spr_dalej == liczba_kolumn)
                    {
                        cout << "\n\nZnaleziono wzorzec na x = " << x << ", oraz y = " << y << endl;
                        spr_dalej = 0;             //skoro znalezlismy juz wzorzec to szukamy nastepnego
                    }
                    takie_cos = 0;
                }
            }
       }
   }

}
0
  1. Podziel program na funkcje
  2. Zmień nazwę zmiennej takie_cos na bardziej czytelną
  3. Uruchom debuggera i przeanalizuj jak działa
1

Błąd w

if (map_xy[z][k] /= map2_xy[l][spr_dalej])

powinno być:

if (map_xy[j][z] != map2_xy[j][spr_dalej])

dodanie znaczników <code class="cpp"> - Furious Programming

0

Dzięki wielkie, problem rozwiązany.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.