Co jest nie tak?? NAPISY C++

0

Witam. Mam takie zadanie:

Dane są dwa ciągi znaków zakończone '*'. Napisz program, który porówna te dwa ciągi w poszukiwaniu pierwszych identycznych znaków i policzy ile jest znaków, które się pokrywają. Na koniec program wypisze podciąg, który został znaleziony.

Mój kod wygląda tak:


#include <iostream>
#include <cstdlib>
#include <conio.h>

using namespace std;

int main()
{
    setlocale(LC_ALL, "Polish");
    string napis1;
    string napis2;
    int licznik=0;
    cout<<"Wczytaj ciąg 1: "<<endl;
    getline(cin,napis1);
    cout<<"Wczytaj ciąg 2: "<<endl;
    getline(cin,napis2);
    string pom;
    cout<<"\n";
    for(int i=0; i<napis1.length(); i++)
    {
        for(int j=0; j<napis2.length(); j++)
        {
            if(napis2.at(j) == napis1.at(i))
            {
                pom = napis2.at(j);
                cout<<pom<<" ";

                licznik++;
            }
    }

    }
    cout<<"\n";
    cout<<"Znakow pokrywających się jest = "<<licznik<<endl;

    return 0;
}

Przykładowe dane:

aligator
liga

---> powinno wyswietlić "liga" i ze tych znakow jest 4

alabama
obama

---> powinno wyświetlić "bama" i ilość 4

Jednak wyskakuje mi jakiś błąd, lub dodaje niepotrzebne litery np. a l i g a (i w tym przypadku ilosc 5 zamiast 4) - zamiast l i g a

Proszę o pomoc.

0

A co powinien program wyświetlić przy danych

tama
mata
0

tama
mata

jeżeli ma sprawdzać czy są takie same pierwsze no to nie są, czyli 1 literka odpada, pokrywają się tylko dwie literki 'a'. Dobrze myślę?

0

Ja nie wiem, Ty pisałeś o pierwszych literkach i dałeś taki przykład:

alabama
obama

---> powinno wyświetlić "bama" i ilość 4

0

Takie dane przykładowe są podane do tego zadania.. Nie rozumiem go do końca, dlatego zwracam się o pomoc..

0

Źle sprawdzasz znaki program dobrze podaje.

 for(int i=0; i<napis1.length(); i++)
    {
        for(int j=0; j<napis2.length(); j++)
        {
            if(napis2.at(j) == napis1.at(i))
            {
                pom = napis2.at(j);
                cout<<pom<<" ";

                licznik++;
            }
    }

    } 

nie musisz chyba stosować .at(), możesz się odwoływać przez [] bo i tak nie wyjdzie to poza zakres w pętli for. Zwróć uwagę jak Ty sprawdzasz czy znak występuje, bierzesz pierwszy znak z napis1.at(i) a następnie porównujesz go po kolei z ze wszystkimi znakami napis2 (druga pętla). W ten sposób właśnie otrzymujesz wynik "aliga" i 5, bo pierwszy znak w aligator to 'a' i wytępuje w drugim napisie na ostniej pozycji.

0

for(int i=0; i<napis1.length(); i++)
    {
        for(int j=0; j<napis2.length(); j++)
        {
            if(napis2[j] == napis1[i+1])
            {
                pom = napis2[j];
                cout<<pom<<" ";

                licznik++;
            }
    }

Poprawiając kod w ten sposób dla danych: aligator , liga działa dobrze, bo wypisuje "l i g a" i wielkosc 4, jednak dla alabama , obama - działa nieprawidłowo bo wypisuje a a b a m a a a

1

@Jambor w takim przypadku właśnie powinnienś użyć funkcji at(), bo wychodzisz poza zakres stringa.

Napisałem takie coś, dla podanych danych testowych działa prawidłowo.

 size_t j = 0;
    size_t i = 0;
    int licznik = 2;
    std::string ciag;
    bool b = false;
    int wynik;
    while (j <= napis1.length()-licznik)
    {

        if ((napis1.substr(j, licznik)) == (napis2.substr(i, licznik)))
        {
            wynik = licznik;
            ciag = napis2.substr(i, licznik);
            licznik++;
            b = true;
            if (j + licznik <= napis1.length())
            continue;
            else break;
        }
        if (b) break;
        if (i < napis2.length() - licznik) ++i;
        else {
            i = 0;
            ++j;
        }
    }

Nie wstawiam using namespace std; bo dla mnie to jest jak gotować rosół a do garka wrzucić wszystko co mam w lodówce :)

Mam nadzieję że to pomoże.

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