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;
}
}
}
}
}