Zadanie maturalne 2009 inf. poprawienie i ulepszenie

0

Witam. Staram się sam nauczyć do przyszłorocznej matury z informatyki i mam problem..
Treść zadania wygląda nastepująco:

http://www.cke.edu.pl/images/stories/Arkusze_matura_09/informatyka/PR/PR_2.pdf

**Zadanie 5. **

Oto co stworzylem:


#include <iostream>
using namespace std;

#include <string>
#include <fstream>

//zliczające odpowiedzi do poleceń danych
//////////////////////////////
int palindromy=0;
int bb_pary=0;
int cc_pary=0;

//////////////////////////////

void palindrom(string tab)
{
     bool jest=true;
     for(int i=0;i<tab.length()/2;i++)
     {
             if(tab[i]!=tab[tab.length()-i-1]) jest=false; break;
     }
     if(jest) 
     {palindromy++;
      }
}

/////////////////////////////////////////////////////
//porównanie stringów czy wyraz 1 zawiera drugi
int parowanie(string aa,string bb)
{    int ret=0;
     string::size_type pozycja = aa.find(bb);
     if(pozycja != string::npos)
     {bb_pary++; ret=3;}
     return ret;
}
////////////////////////////
//sprawdza czy pierwsze czy 3 znaki  ciągu drugiego zawierają się
//w początku ciągu znaków pierwszego
int sufiksyprefiksy_beta(const string aa, const string bb)
{
     int zawiera=5;
     
     int dlug1=aa.size();
          
     for(int i=0;i<3;i++)
     {
             if(aa[dlug1-3+i] != bb[i]) {zawiera=-1; break;}
     }
     return zawiera;
}
/////////////////////////////
// podobnie jak wyżej tylko odwrotnie czy począek ciągu znaków drugiego(pierwsze 3 znaki)
// zawierają się w końcówce ciągu pierwszego.
int sufiksyprefiksy(const string aa,const string bb)
{
     int zawiera=2;
     
     int dlug2=bb.size();
     
     for(int i=0;i<3;i++)
     {
             if(aa[i] != bb[dlug2-3+i]) {zawiera=-1; break;}
     }
     

     
     return zawiera;
}
/////////////////////////////
//funkcja ma na celu sprawdzanie sprawdzić co trzeba zrobić
// aby powstał wyraz C! 
//
string podpunkt_d(const string aa,const string bb)
{
       
string wynik;
    cout << "Jestem w funkcji podpunkt_d" << endl;
    int dlug2=bb.size();
    int dlug1=aa.size();  
    
    int a1=sufiksyprefiksy(aa,bb);
    int a2=sufiksyprefiksy_beta(aa,bb); 
    int a3=parowanie(aa,bb);       
    cout << a1 << endl;
    cout << a2 << endl;
    cout << a3 << endl;
    
    if(a3==3){wynik=aa;}
    else {
         if(a1==2)
           {
                  wynik=bb;
                  wynik.insert(dlug2+1,aa,3,dlug1-3);    
            } else {
                   if(a2==5)
                      {
                               wynik=bb;
                                wynik.insert(dlug1+1,bb,3,dlug2-3);
                        } else{           
                  wynik=aa;
                   wynik.insert(dlug1,bb);}}} 
    cout << wynik << endl;            
    return wynik; 
}
/////////////////////////////
// wartości jakie funkcje zwracają.
// zawierają się w sobie zwraca: 3 
// jesli A ma na poczatku B: 2
// jesli A ma na koncu B:  5





main()
{
       fstream zapis("zad_5.txt", ios::out | ios::trunc);
       fstream dane("dane.txt", ios::in);
       fstream odpa("slowa.txt", ios::out | ios::trunc);

       while(!zapis)
       {cout << "blad !!!" << endl;
        _sleep(2000);
        dane.clear(dane.rdstate()& ~ios::failbit);}

while(!dane.eof())
{   
    int ccc=0; 
    string ddd;
    string slowa[2];  
      
    
    dane >> slowa[0];
    dane >> slowa[1];
    palindrom(slowa[0]);
    palindrom(slowa[1]);
    parowanie(slowa[0],slowa[1]);   
    //jesli jedyną opcją stworzenia C jest połaczenie A i B
    ccc += sufiksyprefiksy(slowa[0],slowa[1]);
    ccc += sufiksyprefiksy_beta(slowa[0],slowa[1]);
    if(ccc==-2) cc_pary++;
    //###################################################
    
    ddd=podpunkt_d(slowa[0],slowa[1]);     
    odpa << ddd;
    odpa << "\n";           
                              
}


zapis << "AAAAA: " <<  palindromy << "\n"; 
zapis << "BBBBB:" << bb_pary << "\n";
zapis << "CCCCC: " << cc_pary << "\n";

zapis.close();
odpa.close();
dane.close();
system("Pause");
return 0;
}

Zawartość 20 linijek z 200 dodatkowego pliku z danymi:

000110011110 101010111
1100001101 110
11000100 000
01101110 0001101
101011001100001 100110000
1110110001 101110100
111001000001 011001
10 00
0100101 101110
10100101111111110001 10101001101
00010110 01001
10010001001110100011 01001101010
0001101101 0000101
00001011000 10
1101110000000110000 10100110111
00001 01
101101101000000 0001011011
111100001101 10010100011
111101011011000 1000001
11011 10

Wszystko działa dobrze, jednak nie mam pojęcia dlaczego przy 9 linijce mi się program po prostu ZAMYKA, bez żadnego błędu.

W celach edukacyjnych jestem otwarty na wszelakie porady pomysły, jak to zrobić LEPIEJ, poprawić, skrócić. Wszystko aby tylko lepiej się nauczyć do tej matury!

Pozdrawiam i dziękuje:)

PS:
*tresc chcialem dodac w spoilerze zeby sie zasmiecala calego posta jednak nie dziala link z pomocy: http:*4programmers.net/Pomoc/Formatowanie_tre%C5%9Bci_na_forum

1

zerknij tu być może zapomniałem o jakimś warunku czy jakieś tam możliwości ale to nie jest istotne teraz. Kod ten prezentuje zastosowanie "algorithm" z c++. Poczytaj o tym, zapoznaj się z możliwościami i funkcjami tam zawartymi. Gdy będziesz dobrze władał biblioteką standardową c++ to maturę z infy zdasz na 100% (albo coś około tego) bo nie musisz wymyślać koła na nowo i dlatego właśnie c++ góruje na maturze nad innymi językami. Olej algorytmy, żmudne pętle czy jakieś sortowania. To wszystko jest już zaimplementowane, a na maturze szkoda czasu na pisanie tego od nowa. Musisz się tylko umiejętnie posłużyć tym co masz, a matura stanie się pryszczem. Jedyny minus zastosowania c++'a na maturze jest reprezentacja graficzna jakiegoś problemu (jak w przypadku zadania wcześniejszego z tego arkusza) ale w końcu masz excel'a więc i to nie powinno być dużym utrudnieniem ;)

pozdrawiam

0

Trochę wątek przepadł przez miesiąc, jednak accessa i excelu ogarnąłem w większym stopniu. Nie o tym tu mowa.

Poprawiony kod na podstawie Pana wyżej: rzeczywiście jest różnica z 170 linijek do 70~ , jednak. Nie mogę dojść dlaczego w podpunkcie c) mam błędą odpowiedź. Źle zlicza kiedy jedyną możliwością utworzenia jest a + b. Bez prefiksów i sufiksów. Wdzięczny będę jak ktoś rzuci okiem:)
Pozdrawiam

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int zawarte=0;
int tylko_laczone=0;
bool palindrom_spr(const string &s)
{
     for(int i=0;i<s.size()/2;i++)
     {
             if(s[i]!=s[s.size()-i-1]) return false;
     }
     return true;
}

string su(const string &a, const string &b)
{
       string::size_type pozycja = a.find(b);
       if(pozycja != string::npos) 
                  {zawarte++;return a;}
                  
       if(b.size()>3){
       string sufixB = b.substr(b.size()-3,string::npos);
       string prefiksB= b.substr(0,3);
       if(sufixB == a.substr(0,3)) return (b + a.substr(3,string::npos));
       if(prefiksB == a.substr(a.size()-3,string::npos)) 
                   return(a + b.substr(3,string::npos));
       }            
                   
       tylko_laczone++;            
       return (a+b);
       
}



main()
{
       fstream zapis("zad_5.txt", ios::out | ios::trunc);
       fstream dane("dane.txt", ios::in);
       fstream odpd("slowa.txt", ios::out | ios::trunc);

string A;
string B;
int palindromy=0;

string wynik;
int linijki=0;

while(dane >> A >> B)
{
    if(palindrom_spr(A)) palindromy++;
    if(palindrom_spr(B)) palindromy++;    
    
            
    string wrot=su(A,B); 
    odpd << wrot << "\n";         
                  
                     
}
zapis << "a) " << palindromy << "\n"
      << "b) " << zawarte << "\n"
      << "c) " << tylko_laczone << "\n";

 
dane.close();odpd.close();zapis.close(); 
cout << endl;
system("Pause");      
return 0;
}
0

Niestety muszę odświeżyć wątek;/ Dalej mam problem z podpunktem C;/

1 użytkowników online, w tym zalogowanych: 0, gości: 1