Advertisement
piotrek77

Projekt22

Jan 26th, 2015
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.35 KB | None | 0 0
  1. #include <iostream>
  2. #include <windows.h>
  3. #include <fstream>
  4. #include <vector>
  5. using namespace std;
  6.  
  7. /* run this program using the console pauser or add your own getch, system("pause") or input loop */
  8.  
  9.  
  10. int poczatek = -1;
  11. int koniec = -1;
  12.  
  13.  
  14.  
  15. int szukaj(string wz, string te)
  16. {
  17.     //szuka wz w te
  18.     //znak zapytania "?" zastepuje dowolny znak
  19.     //zwracamy -1 gdy nie znajdzie
  20.     //w przeciwnym razie pozycje wz z miennej te
  21.  
  22.     int wynik = -1;
  23.  
  24.     int dlugoscWz = wz.length();
  25.     int dlugoscTe = te.length();
  26.  
  27.     //analizujemy tylko gdy dlugosc tekstu (te) jest wieksza lub rowna wzorcowi (wz)
  28.     if (dlugoscWz<= dlugoscTe)
  29.     {
  30.         //analizujemy pierwszy element wzorca i ka?dy z kolejnych elementow tekstu
  31.         for (int i = 0; (i < dlugoscTe-dlugoscWz+1) && (wynik==-1); i++)
  32.         {
  33.  
  34.             if ((te[i]==wz[0]) || (wz[0]=='?'))
  35.             {
  36.                 //sprawdzamy ka?dy element wzorca
  37.                 int j = 1;
  38.                 wynik = i;
  39.                 int k =i+1;
  40.  
  41.                 while ((j<dlugoscWz) && (wynik != -1))
  42.                 {
  43.                     if ((te[k]!=wz[j]) && (wz[j]!='?'))
  44.                     {
  45.                         wynik = -1;
  46.                     }
  47.                     j++;
  48.                     k++;
  49.                 };
  50.             }
  51.  
  52.         }
  53.  
  54.     }
  55.  
  56.  
  57.     return wynik;
  58. }
  59. string usunGwiazdki(string s)
  60. {
  61.  
  62.     while ((s[0]=='*') && (s.length()>0 ))
  63.     {
  64.         s = s.substr(1,s.length()-1);
  65.     }
  66.     while ((s[s.length()-1]=='*') && (s.length()>0))
  67.     {
  68.         s = s.substr(0,s.length()-1);
  69.     }
  70.  
  71.     return s;
  72. }
  73.  
  74. int dlugoscBezGwiazdek(string s)
  75. {
  76.     int dlugosc = 0;
  77.     for (int i = 0; i < s.length(); i++)
  78.     {
  79.  
  80.         if (s[i]!='*')
  81.         {
  82.             dlugosc ++;
  83.         }
  84.  
  85.     }
  86.     return dlugosc;
  87.  
  88. }
  89.  
  90. vector<string> podzielWzorzec(string wzorzec)
  91. {
  92.     vector<string> wektor;
  93.  
  94.     while (wzorzec.length()>0)
  95.     {
  96.         int pos = wzorzec.find('*');
  97.  
  98.         if (pos == -1 )
  99.         {
  100.             wektor.push_back(  wzorzec  );
  101.             wzorzec = "";
  102.         }
  103.         else
  104.         {
  105.             wektor.push_back( wzorzec.substr(0, pos) );
  106.             wzorzec = wzorzec.substr(pos+1,wzorzec.length()-pos);
  107.             wzorzec = usunGwiazdki(wzorzec);
  108.         }
  109.  
  110.  
  111.     }
  112.     return wektor;
  113. }
  114.  
  115.  
  116. //szuka pierwszy element wektora w stringu testk
  117. int szukajRek(vector<string> wektor, string tekst)
  118. {
  119.     //cout<<wektor[0]<<endl;
  120.     //cout<<tekst<<endl;
  121.  
  122.     if (wektor.size()==1)
  123.     {
  124.         int wynik = szukaj(wektor[0], tekst);
  125.         if ((poczatek==-1) && (wynik !=-1))
  126.         {
  127.             poczatek = wynik;
  128.         }
  129.         if ((poczatek!=-1) && (wynik !=-1))
  130.         {
  131.  
  132.             koniec = tekst.length()- wynik - wektor[0].length();
  133.         }
  134.         return wynik;
  135.  
  136.     }
  137.     else
  138.     {
  139.         int wynik = szukaj(wektor[0],tekst);
  140.         if (wynik == -1)
  141.         {
  142.             return -1;
  143.         }
  144.         else
  145.         {
  146.  
  147.             if (poczatek == -1)
  148.             {
  149.  
  150.                 poczatek = wynik;
  151.             }
  152.             string pier = wektor[0];
  153.             wektor.erase(wektor.begin());
  154.             int wynikTmp = szukajRek(wektor, tekst.substr(wynik + pier.length(),tekst.length()-wynik-pier.length()));
  155.             if (wynikTmp ==-1)
  156.             {
  157.                 return -1;
  158.             }
  159.             else
  160.             {
  161.  
  162.                 return wynik;
  163.             }
  164.         }
  165.     }
  166.  
  167.  
  168. }
  169.  
  170. int szukajMain(string wzorzec, string tekst)
  171. {
  172.     //najpierw usuwamy z wzorca gwiazdki na pocz1tku i na koncu (jako nieznacz1ce)
  173.     wzorzec = usunGwiazdki(wzorzec);
  174.  
  175.     //sprawdzamy dlugosc bez gwiazdek
  176.     //wzorzec bez gwiazdek nie moze byc dluzszy od tekstu
  177.  
  178.     int wynik = -1;
  179.  
  180.     if (dlugoscBezGwiazdek(wzorzec)<= tekst.length())
  181.     {
  182.  
  183.  
  184.         //dzielimy wzorzec na podwzorce, jako "dzielnika" uzywajac gwiazdki
  185.         //np:  tele*zor dzielimy na dwa stringi: tele, zor
  186.  
  187.         //algorytm szukania wzorca "tele*zor" polega najpier na znalezieniu wzorca "tele" i tylko w przypadku sukcesu
  188.         //szukanie wzorca "zor" ale nie w ca3ym stringu wejociowym, tylko "na prawo" znalezionego "tele"
  189.         //
  190.         //np.
  191.         //dany jest tekst: "0123456789telewizor++++++"
  192.         //najpierw szukamy "tele" - znajdujemy go na pozycji nr 10
  193.         //wtedy szukamy "zor" pocz1wszy od pozycji nr 14 (10 + dlugosc(tele))
  194.         //itd
  195.  
  196.  
  197.        vector<string> wektor = podzielWzorzec(wzorzec);
  198.  
  199.         wynik = szukajRek(wektor,tekst);
  200.         //wynik = szukaj(wzorzec, tekst);
  201.     }
  202.  
  203.     return wynik;
  204. }
  205.  
  206.  
  207. bool wyswietlZawartoscPliku( string sNazwaPliku )
  208. {
  209.     ifstream plik;
  210.     plik.open( sNazwaPliku.c_str() );
  211.     if( !plik.good() )
  212.          return false;
  213.  
  214.     string wiersz;
  215.     while( getline( plik, wiersz ) )
  216.          cout << wiersz << endl;
  217.  
  218.     plik.close();
  219.     return true;
  220. }
  221.  
  222.  
  223. bool szukajWPliku( string wzorzec,  string sNazwaPliku )
  224. {
  225.     int numerWiersza = 0;
  226.     ifstream plik;
  227.     plik.open( sNazwaPliku.c_str() );
  228.     if( !plik.good() )
  229.          return false;
  230.  
  231.     string wiersz;
  232.     while( getline( plik, wiersz ) )
  233.             {
  234.                 numerWiersza++;
  235.                  int wynik = szukajMain(wzorzec, wiersz);
  236.                  if (wynik !=-1)
  237.                  {
  238.                     string znalezionyTekst = wiersz.substr(poczatek,  wiersz.length()-koniec-poczatek);
  239.                     cout<<"Plik: "<<sNazwaPliku<<" wiersz: "<<numerWiersza<<" tekst: "<<znalezionyTekst<<endl;
  240.                     }
  241.             }
  242.  
  243.     plik.close();
  244.     return true;
  245. }
  246.  
  247.  
  248. int main(int argc, char** argv) {
  249.  
  250.     string wzorzec="";
  251.    
  252.     //jesli brak argumentów - pytamy o wzorzec
  253.     if (argc==1)
  254.    
  255.     {
  256.         cout<<"Podaj wzorzec: ";
  257.         cin>>wzorzec;
  258.         //wzorzec="p*s";
  259.     }
  260.     else
  261.     {
  262.         wzorzec = argv[1];
  263.     }
  264.  
  265.     HANDLE hFind;
  266.     WIN32_FIND_DATA FindData;
  267.  
  268.  
  269.     hFind = FindFirstFile("*.txt", &FindData);
  270.  
  271.  
  272.     //cout << FindData.cFileName << endl;
  273.     szukajWPliku( wzorzec,  FindData.cFileName );
  274.     //wyswietlZawartoscPliku(FindData.cFileName);
  275.  
  276.     while (FindNextFile(hFind, &FindData))
  277.     {
  278.         //cout << FindData.cFileName << endl;
  279.         szukajWPliku( wzorzec,  FindData.cFileName );
  280.     }
  281.  
  282.     // Close the file handle
  283.  
  284.     FindClose(hFind);
  285.     //cout<<"koniec"<<endl;
  286.     //getchar();
  287.     return 0;
  288. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement