Para slow (matura 2009)
Kod był wyświetlany 3881 razy.
    /*
  Name: Para slow (matura 2009)
  Copyright: GPL GNU
  Author: Przemyslaw Sierocinski
  Date: 30-05-10 13:49
  Description: 
        
        Mając daną parę słów A i B, można znaleźć najkrótsze słowo C, które 
        będzie zawierać w sobie oba dane słowa A i B. 
        Przyjmijmy, że słowa zawierają wyłącznie znaki ‘0’ i ‘1’.
    
    Przykłady:
        * dla A = 10011101 oraz B = 111
            słowo C = A, ponieważ A zawiera w sobie słowo B
        * dla A = 10011101 oraz B = 1100
            słowo C = 110011101 (wspolna czesc: 100)
        * dla A = 10011101 oraz B = 1010
            słowo C = 100111010 (wspolna czesc: 101)
        * dla A = 10011101 oraz B = 000
            słowo C jest wynikiem sklejenia słów A i B, w dowolnej kolejności,
            np. C = 10011101000 lub C = 00010011101
            
    W pliku tekstowym o nazwie dane.txt, znajdują się pary słów utworzonych ze 
    znaków „0” i „1”. Każda para słów umieszczona jest w osobnym wierszu pliku, 
    słowa oddzielone są od siebie pojedynczym znakiem odstępu.
    Liczba znaków w pierwszym słowie każdej pary słów jest nie mniejsza niż 
    liczba znaków w drugim słowie.
    Odpowiedzi do podpunktów: a, b, c umieść w pliku o nazwie zad_5.txt, wyniki
    z podpunktu d w pliku o nazwie slowa.txt. 
    Odpowiedzi poprzedź literą oznaczającą dany podpunkt.
    Korzystając z danych zapisanych w pliku o nazwie dane.txt, 
    wykonaj poniższe polecenia:
        
        a) Podaj, ile słów spośród wszystkich słów umieszczonych w pliku o 
        nazwie dane.txt, to palindromy (słowa, które czytane od przodu i od tyłu
        sa takie same).
        b) Podaj, ile par słów (A, B) zapisanych w pojedynczych wierszach pliku 
        o nazwie dane.txt, ma tę właściwość, że słowo B jest zawarte wewnątrz 
        słowa A.
        c) Podaj, ile par słów (A, B) zapisanych w pojedynczych wierszach pliku 
        o nazwie dane.txt, ma tę właściwość, że jedyną możliwością utworzenia 
        słowa C jest sklejenie słów A i B.
        d) Dla każdej z par słów (A, B) umieszczonych w kolejnych wierszach 
        pliku o nazwie dane.txt:
         • utwórz najkrótsze słowo C zawierające w sobie oba słowa z danej pary;
         • zapisz skonstruowane przez Ciebie słowa wynikowe C w pliku tekstowym
         o nazwie slowa.txt, każde słowo w osobnym wierszu, w kolejności
         odpowiadającej parom (A, B) z pliku o nazwie dane.txt.

*/

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    bool spr;
    int i,j,n,p,l1,l2;
    string *dane,s1,s2;
    ifstream wej("dane.txt");
    ofstream wyniki("zad5.txt"),slowa("slowa.txt");
    if(!wej||!wyniki||!slowa)
    {
        cout<<"\n\n\tBlad pliku.";
        getchar();
        return 0;
        }
    
    for(n=0;!wej.eof();n++) // przeliczenie ilosci slow w pliku
    wej>>s1;
    n--;

    dane=new string[n]; // dynamiczna tablica na dane
    
    wej.clear();
    wej.seekg(0,ios::beg); // przewiniecie pliku do poczatku
    for(i=0;i<n;i++) // wczytanie danych
    wej>>dane[i];
    
    wej.close(); // zamkniecie pliku z danymi
    
    /* a) */
    for(i=0,p=0;i<n;i++)
    {
        spr=true;
        s1=dane[i];
        l1=s1.length();
        for(j=0;j<l1/2;j++)
        {
                if(s1[j]!=s1[l1-1-j])
                { // porownanie liter w tej samej odleglosci od srodka slowa
                    spr=false;
                    break;
                    }
                }
        if(spr==true)
        p++;
        }
    
    wyniki<<"a): "<<p;
    
    /* b) */
    for(i=0,p=0;i<n;i+=2)
        if(dane[i].find(dane[i+1])!=string::npos) // A zawiera B
        p++;
    
    wyniki<<"\nb): "<<p;
    
    /* c) */
    for(i=0,p=0;i<n;i+=2)
    {
        s1=dane[i];
        s2=dane[i+1];
        if(s1.find(s2)!=string::npos)
        continue; // jezeli A zawiera B to nie trzeba sklejac
        l1=s1.length();
        l2=s2.length();
        spr=true;
        for(j=1;j<l2;j++)
        {
            if(s1.compare(0,l2-j,s2.substr(j,l2-j))==0)
            { // porownanie poczatku A z koncem B
                spr=false;
                break;
                }
            if(s1.compare(l1-l2+j,l2-j,s2.substr(0,l2-j))==0)
            { // porownanie konca A z poczatkiem B
                spr=false;
                break;
                }
            }
        if(spr)
        p++;
        }
    
    wyniki<<"\nc): "<<p;
    
    wyniki.close(); // zamkniecie pliku z wynikami
    
    /* d) */
    slowa<<"d):\n";
    for(i=0;i<n;i+=2)
    {
        s1=dane[i];
        s2=dane[i+1];
        if(s1.find(s2)!=string::npos)
        { 
            slowa<<s1<<endl; // C = A
            continue;
            }
        l1=s1.length();
        l2=s2.length();
        spr=true;
        for(j=1;j<l2;j++)
        {
            if(s1.compare(0,l2-j,s2.substr(j,l2-j))==0)
            { // porownanie poczatku A z koncem B
                spr=false;
                slowa<<s2.substr(0,j)<<s1<<endl; // C = ( B \ (A n B) ) u A
                break;
                }
            if(s1.compare(l1-l2+j,l2-j,s2.substr(0,l2-j))==0)
            { // porownanie konca A z poczatkiem B
                spr=false;
                slowa<<s1<<s2.substr(l2-j,j)<<endl; // C = ( A \ (A n B) ) u B
                break;
                }
            }
        if(spr)
        slowa<<s1+s2<<endl; // C = A u B
        }
    slowa.close(); // zamkniecie pliku z utworzonymi slowami
    
    cout<<"\n\n\tGotowe. Sprawdz pliki zad5.txt i slowa.txt.";
    getchar();
    return 0;
}
    
Pobierz plik tekstowy
Administrator WJL
PHP&SQL coded by NOVA-IT