• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ zliczanie wystąpień podciągu w ciągu

Object Storage Arubacloud
0 głosów
2,143 wizyt
pytanie zadane 1 kwietnia 2017 w C i C++ przez Deloryn Bywalec (2,060 p.)

Cześć, piszę program mający zliczać liczbę wystąpień podanego podciągu w ciągu. Niestety nie mogę operować na stringach (chyba) ani korzystać ze specjalnych funkcji, ponieważ jest to przedmiot "programowanie niskopoziomowe"... Czy ktoś widzi błąd w kodzie? Dlaczego on nie działa poprawnie? Proszę o pomoc.

#include <stdio.h>
#define N 1000

int dlugosc_ciagu(char tab[], int ile_elementow)
{
	int licznik=0;
	for(int i=0; i<ile_elementow; i++)
	{
		if(tab[i]!='\0')licznik++;
	}
	return licznik;
}

int main()
{
	char ciag[N], podciag[N], warunek=0, l_wystapien=0;
	printf("Podaj ciag: ");
	scanf("%s",&ciag);
	printf("Podaj podciag: ");
	scanf("%s",&podciag);
	
	for(int i=0; i<N; i+=dlugosc_ciagu(podciag,N))
	{
		for(int j=0; j<dlugosc_ciagu(podciag,N); j++)
		{
			if(ciag[i+j]==podciag[j])warunek=1;
			else warunek=0;
		}
		if(warunek==1)l_wystapien++;
		warunek=0;
	}
	printf("Liczba wystapien podanego podciagu w calym ciagu: %d",l_wystapien);
	return 0;
}

 

2 odpowiedzi

+1 głos
odpowiedź 1 kwietnia 2017 przez tangarr Mędrzec (154,860 p.)
1. Po wczytaniu napisów oblicz ich długości i zapisz w zmiennych dlugosc1, dlugosc2.
2. Jeżeli długość podciągu jest większa od długości ciągu zakończ algorytm.
3. Zewnętrzną pętle iterujesz od 0 do (dlugosc1-dlugosc2-1), iterator i zwiększasz o 1 (Twój algorytm wychodzi poza długość ciągu)
4. Przed rozpoczęciem pętli wewnętrznej ustawiasz warunek na 1.
5. W pętli wewnętrznej sprawdzasz czy porównywane znaki są różne. Jeżeli tak to zmieniasz warunek na 0 i kończysz pętlę.
komentarz 2 kwietnia 2017 przez Deloryn Bywalec (2,060 p.)
Dzięki. Mam jednak pytanie co do pkt. 3. - dlaczego iteracja akurat do dlugosc1-dlugosc2-1 zamiast po prostu dlugosc1-1? Wydaje mi się jakbyśmy pomijali wtedy koncówkę ciągu
komentarz 2 kwietnia 2017 przez tangarr Mędrzec (154,860 p.)
Aby napisy były równe muszą mieć równą długość. Jeżeli ten warunek nie jest spełniony to nie ma sensu dalej sprawdzać.
+1 głos
odpowiedź 2 kwietnia 2017 przez mokrowski Mędrzec (155,700 p.)

https://pl.wikipedia.org/wiki/Algorytm_Knutha-Morrisa-Pratta To co masz jest bardzo niewydajnie.

Akurat na platformach wbudowanych nagłówek <string.h> jest obecny. Ja bym zastosował z zastrzeżeniem że wyraźnie tego nie zabroniono.

Podobne pytania

0 głosów
1 odpowiedź 204 wizyt
0 głosów
1 odpowiedź 787 wizyt
pytanie zadane 4 grudnia 2016 w C i C++ przez Akiro Bywalec (2,910 p.)
0 głosów
1 odpowiedź 4,174 wizyt
pytanie zadane 28 listopada 2015 w C i C++ przez agre Użytkownik (550 p.)

92,620 zapytań

141,474 odpowiedzi

319,815 komentarzy

62,004 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...