Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wyszukiwanie czy jeden wyraz zawieta sie w drugim

Ostatnio zmodyfikowano 2017-06-05 20:55
Autor Wiadomość
Szkodnik78
Temat założony przez niniejszego użytkownika
Wyszukiwanie czy jeden wyraz zawieta sie w drugim
» 2017-06-05 19:21:24
Cześć!

Zaczynam dopiero moją przygode z C++ i chciałem napisać program który sprawdzi czy pierwszy wyraz zawiera sie w drugim.
Oto co napisałem:
C/C++
#include <iostream>
#include <cstring>

using namespace std;

char pw[ 30 ], dw[ 30 ];
int dp = 0, dd = 0, i = 0, x = 0;


int main()
{
    cout << "Podaj pierwszy wyraz: ";
    cin >> pw;
    cout << "Podaj drugi wyraz: ";
    cin >> dw;
    dp = strlen( pw );
    dd = strlen( dw );
    if( dp > dd )
    {
        cout << "Pierwszy wyraz jest dluzszy od drugiego!!";
    }
    else
    {
        while( i < dd || x < dp )
        {
            if( pw[ x ] == dw[ i ] )
            {
                x++;
                i++;
            }
            else
            {
                if( x > 0 )
                {
                    x = 0;
                }
                else
                {
                    i++;
                }
            }
        }
        if( dp == x )
        {
            cout << "Pierwszy wyraz zawiera sie w drugim!!";
        }
        else
        {
            cout << "Pierwszy wyraz nie zawiera sie w drugim!!";
        }
    }
    return 0;
}
Gdyby nie ten drugi if w pętli np. program potwierdziłby, że słowo "kot", zawiera sie w słowie "kombat". Lecz gdy dodałem tego if'a program wysypuje się gdy musi to sprawdzić.
Mołgby mi ktoś pomóc?

Pozdraiwam :)

P-162091
latajacaryba
» 2017-06-05 20:10:52
Po pierwsze używaj typu string, nie c-string (c-string czyli tablicy char)
Poczytaj sobie o stringach i zrób to tak:
sprawdzasz, czy litera o indeksie n wyrazu 1 wystepuje w wyrazie 2.
Jeśli tak to sprawdzasz kolejny
Jeśli nie, to wypisujesz na ekran, że wyraz1 nie zawiera sie w wyrazie2

Jeśli wszystkie znaki wyraz1 wystepuja w wyraz2 to kończysz program.

Kurs o stringach masz w dziale kursy. Przyda Ci sie funkcja napis.length(); ktory zwraca Ci ilość liter
Jeśli nie będziesz mógł sobie poradzić, to tu masz kod (ale spróbuj najpierw sam)

C/C++
/**
*
*
*
Spojler :p
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
**/
#include <iostream>
#include <string>
using namespace std;

int main()
{
   
    string slowo1;
    string slowo2;
   
    cin >> slowo1 >> slowo2;
   
    if( slowo1.length() > slowo2.length() ) //chyba logiczne :D
    {
        cout << "slowo 1 jest dluzsze od slowa 2 wiec sie w nim nie zawiera!\n";
        return 0;
    }
   
    bool brakLitery = false; // jesli w slowie1 jest litera ktorej nie ma w slowie 2 to znaczy, ze nie zawiera sie w slowie 2
   
    for( int j = 0; j < slowo1.length(); j++ )
    {
        brakLitery = true; // zakladamy, ze litery o indeksie 'j' w slowo1 brakuje w slowo2.
       
        for( int k = 0; k < slowo2.length(); k++ )
        {
            if( slowo1[ j ] == slowo2[ k ]; // czy litera o indeksie 'j' w slowo1 jest rowna jakiejkolwiek literze w slowo2
            {
                brakLitery = false; // oho, wystepuje, czyli to nie prawda, ze jej brakuje
                break; // skoro znalezlysmy to przerywamy petle
            }
        }
        if( brakLitery == true )
        {
            cout << "wyraz1 nie zawiera sie w wyraz2\n";
            return 0;
        }
       
    }
   
    cout << "zawiera sie";
    return 0;
} // koniec main'a
P-162096
Szkodnik78
Temat założony przez niniejszego użytkownika
» 2017-06-05 20:55:44
@latajacaryba

Mam za zadanie zrobić to w tablicy char i problem jest w tym jednym błędzie.

Ale tak jak ty piszesz to nie będzie zawsze działać, ponieważ nie zawsze gdy wyraz2 zawiera wszyskie litery wyrazu1 to wyraz1 zawiera się w wyrazie2.

Chciałbym bardziej dowiedzieć się dlaczego tak jak ja to zrobiłem nie działa. Chodziło mi oto, żeby program sprawdzał czy x litera wyrazu1 jest taka sama jak y litery wyrazu2. Gdy nie to program dodaje do y+1 i sprawdza dalej. Jeśli tak dodaje do x+1 i y+1. Ale jeśli x>0, więc program przeszedł już do kolejnej litery i ta kolejna litera nie jest taka sama to wraca z x do stanu początkowego i sprawdza pierwszą litere wyrazu1 od ostatniej na której stanął program. Lecz tak jak już pisałem gdy dodałem w pętli drugiego if'a program sie wysypuje
P-162100
« 1 »
  Strona 1 z 1