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