Wątek przeniesiony 2016-05-05 17:50 z C/C++ przez ŁF.

Pomoc w wyjasnieniu zadan

0

Witam,

Mam problem, a dokładniej, chodzi mi o to, iż mam jakies zadania, ktore daje wykladowca i kod, jednak nie za bardzo go rozumiem i chciałbym, by ktoś pomógł mi/nakierował mnie, co mam przeczytac, co sie pouczyć by to pojac i samodzielnie zrobić.
Głównie nie rozumiem tych pętli... Niby je ogarnąłem i pojmuje, ale ten kod jest na tyle dla mnie nie zrozumiały, że szukam tu pomocy. Liczę na jakieś wskazówki, co mam poczytać, co zrobić. :)
Dzięki

1 zadanie.

Funkcja fun otrzyma jako parametry char& i char* do dwóch ciągów znaków. Zadaniem
tej funkcji będzie znalezienie najdłuższego podciągu. Jako wynik wyświetlone
zostaną wskaźniki na początek i koniec najdłuższego podciągu.

Kod, który napisał owy Profesor:

#include<iostream>
using namespace std;




void longestSubStr(char* ciag, char& znak) {

	char* globalStart = 0;

	int globalLength = 0;



	while (*ciag) {

		if (*ciag == znak) {

			char* localStart = ciag;

			while (*ciag == znak)

				ciag++;

			if (ciag - localStart > globalLength) {

				globalStart = localStart;

				globalLength = ciag - localStart;

			}

		} else

			ciag++;

	}



	if (globalLength)

		cout << globalStart << '\n'

		     << globalStart + globalLength << endl;

}
int main() {


	{



		char* str = "aaabaacaaaa";

		longestSubStr( str, *str);

	}
} 

2 zadanie:

Utwórz trzy tablice o rozmiarze 3 elementów i wypełnij je dowolnymi wartościami.
Następnie przygotuj trzyelementową tablicę wskaźników, której elementy będą wskazywały
tablice z liczbami. Napisz funkcję show wyświetlającą na ekranie wartości
wszystkich tablic.

Kod:

 #include<iostream>
using namespace std;

void show(int** ptr) {

	int** end = ptr + 3;

	while (ptr < end) {

		int* lend = *ptr + 3;

		while (*ptr < lend) {

			cout << **ptr << endl;

			(*ptr)++;

		}

		ptr++;

	}

}
int main() {


	int tab1[] = { 10, 20, 30 };

	int tab2[] = { 40, 50, 60 };

	int tab3[] = { 70, 80, 90 };



	int* tab[] = { tab1, tab2, tab3 };



	show(tab);
}
2

Podejmuj jedno zadanie na raz. Czego konkretnie nie rozumiesz?

0

Okej, zaczynając od tego pierwszego, bo męczy mnie od paru dni.

" while (*ciag) " - nie pojmuje jaki sens ma dawanie warunku " *ciag " , niejednokrotnie sie to powtarza, a brak mi jeszcze w tym logiki, przeciez zwykle warunek posiada znaki porownawcze, a mianowicie ==, =!, <, >.. itp itd..

i dalej ten kod jest jakiś dla mnie nie zrozumialy, co sie dzieje w tej petli, w ifach, niby znam sens zadania, ale nie potrafie pojac co tak naprawde on robi..

2

while(*ciag) jest równoznaczne z while(*ciag != 0), while((*ciag != 0) == true), while(((*ciag != 0) == true) == true), while((((*ciag != 0) == true) == true) == true) itd...

Inaczej mówiąc - wykonuj pętlę dopóki nie napotkasz znaku kończącego c string.

0

No okej, fajnie że w końcu wiem na jakiej zasadzie to działa.

" if (*ciag == znak) {

        char* localStart = ciag;

        while (*ciag == znak)

            ciag++; "

Tutaj niby w ifie mamy *ciag == znak, czyli porownuje caly ciag , do tego "znak" (podciagu), przypisujemy do localStart owy ciag, gdy jest true, i dalej robimy petle ( *ciag == znak ) ...
jaki to ma sens, jeszcze mnie cos blokuje w mysleniu, no ale jak sprawdzamy ten podciag, jak porownujemy go do calego ciagu.. niby jest ten ciag++, gdzie sie przesuwamy w prawo w naszym "ciag" , i co porownujemy dalej bez tego co mamy po lewej stronie? troche chyba to zagmatwalem, ale po prostu jakos ciezko mi to rozkminic..

zaraz ide czytac o C-napisach itp, z czyms jeszcze mam sie zapoznac?

4

*ciag == *(ciag+0) == ciag[0]

0

while (*ciag) { - rozpoczynamy petle, poki =! "/0"

    if (*ciag == znak) { - sprawdzamy czy pierwszy znak jest rowny , ( pierwszemu znakowi "znak", dziala to na takiej samej zasadzie jak *ciag? )

        char* localStart = ciag; - przypisujemy do localStart ( jeden znak? z ciagu? w sensie ten akurat ktory sprawdzamy? ) 

        while (*ciag == znak) -  sprawdzamy czy pierwszy znak jest rowny , ( pierwszemu znakowi "znak", dziala to na takiej samej zasadzie jak *ciag? w sensie indeks, na ktorym akurat jestesmy? )


            ciag++;

        if (ciag - localStart > globalLength) { - jak mozna odjac ciag - localstart, przeciez to znaki/litery? ... i porownywac je do "0" inta.. jak zostalo zainicjowane? 

// moze tyle na razie, bo i tak jeszcze cieemno u mnie
globalStart = localStart;

            globalLength = ciag - localStart;

        }
3

znak to referencja do jednego znaku, nie ciągu.

if (*ciag == znak) jeśli pierwszy znak wskazywany przez ciag jest rowny znak

char* localStart = ciag; - localStart wskazuje na to samo na co wskazuje ciag, ale jeśli przesuniesz wskaźnik ciag to localStart nie zostanie zmieniony (duh)

if (ciag - localStart > globalLength) - arytmetyka wskaźników, zapraszam do google'a

0

No ide, ide :)
"if (ciag == znak) jeśli pierwszy znak wskazywany przez ciag jest rowny znak " , tak rowniez mi o to chodzilo, dzieki Twemu, wczesniejszemu objasnieniu.
"char
localStart = ciag; - localStart wskazuje na to samo na co wskazuje ciag, ale jeśli przesuniesz wskaźnik ciag to localStart nie zostanie zmieniony (duh)" , no tak o to tez mi chodzilo, tylko to nie znika, to potem "przykleja/tworzy kolejna tablice" z kolejnych znakow, na ktore wskazuje ciag?

0

Czyli jak sadzisz, z czym mam sie zapoznac.
Arytmetyka wskaznikow, c-napisy, co jeszcze??

2

Na razie ogarnij to. Do pierwszego zadania to powinno wystarczyć.

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