[C++] "Czytanie" programów

syylwia
Użytkownik
Użytkownik
Posty: 60
Rejestracja: 30 kwie 2009, o 20:02
Płeć: Kobieta
Podziękował: 20 razy
Pomógł: 1 raz

[C++] "Czytanie" programów

Post autor: syylwia »

Hej:)
Wie ktos w jaki sposob mozna nauczyc sie odczytywać program widząc fragment jego kodu? Nie wiem jak się zabarać do nauki. Np. niby wiem jak jest zbudowana pętla for, ale jak np. widze taki fragment programu:

Kod: Zaznacz cały

int x;
for(x=100; x>=10; ++x)
{
x=x/2-5;
}

To nie wiem czemu wynik ma być 5? Trzeba to jakoś po kolei liczyć czy jest jakiś sposób jak sie tego nauczyc?? Pomocy..
Awatar użytkownika
Althorion
Użytkownik
Użytkownik
Posty: 4541
Rejestracja: 5 kwie 2009, o 18:54
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 9 razy
Pomógł: 662 razy

[C++] "Czytanie" programów

Post autor: Althorion »

Po pierwsze, za zapisanie tak nieczytelnego kodu dostaje się po uszach od współpracowników. Nie musisz tak naprawdę umieć się męczyć z takimi skomplikowanymi zapisami, nie używa się ich, właśnie po to, aby skrócić czas analizy programu.

A tej nie sposób wykonać inaczej niż licząc. Z czasem co prawda będziesz „widziała” jak zachowują się większe bloki kodu, ale to wcale tak wiele nie przyspiesza — i czasem myli (właśnie straciłem 20 minut na analizie cudzego kodu, gdzie wartość bezwzględna została zapisana „a = a ? : -a” — wygląda w porządku, prawda? Nie, nie prawda, dla najmniejszej możliwej wartości zmiennej będzie źle działać, jako że kres górny zmiennej jest o jeden mniejszy od modułu kresu dolnego).

W tym wypadku x wynosi kolejno (po wykonaniu pętli) 46, 19 i wreszcie 5, które to jest mniejsze od dziesięciu, tak więc pętla nie wykona się ponownie.
NN19
Użytkownik
Użytkownik
Posty: 14
Rejestracja: 19 sty 2013, o 12:33
Płeć: Mężczyzna
Lokalizacja: Wszechświat
Podziękował: 3 razy
Pomógł: 1 raz

[C++] "Czytanie" programów

Post autor: NN19 »

Polecam ci kursy na youtube, tam jest to bardzo przystępnie wytłumaczone, a ponadto książki Technik Informatyk od WSIP i Helion. Rozkładasz kod na składowe, aby go zrozumieć (przynajmniej ja tak robię).W tej pętli masz zadeklarowaną zmienną x, a następnie:

Kod: Zaznacz cały

x=100
- pętla zaczyna od wartości 100

Kod: Zaznacz cały

x>=10
- pętla powtarza się taką ilość razy dopóki spełniony jest ten warunek, czyli x większe lub równe 10
- pętla przed wykorzystaniem wartości do instrukcji pętli dodaje do niego wartość 1 po każdym kolejnym wykonaniu (!czyli oprócz pierwszego)

1.Wczytuje wartość 100 dzieli przez 2 i odejmuje 5 -> 45
2.Wczytuje wartość 45 dodaje 1 dzieli przez 2 i odejmuje 5 -> 18
3.Wczytuje wartość 18 dodaje 1 dzieli przez 2 i odejmuje 5 -> 4.5, a w przypadku typu int 4.
5.Dodaje 1 i sprawdza warunek. 5 jest mniejsze od 10, a więc pętla nie wykona się.

Pozdrawiam
Ostatnio zmieniony 19 sty 2013, o 16:51 przez NN19, łącznie zmieniany 1 raz.
Awatar użytkownika
Althorion
Użytkownik
Użytkownik
Posty: 4541
Rejestracja: 5 kwie 2009, o 18:54
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 9 razy
Pomógł: 662 razy

[C++] "Czytanie" programów

Post autor: Althorion »

1.Wczytuje wartość 100 dzieli przez 2 i odejmuje 5 -> 45
2.Wczytuje wartość 45 dodaje 1 dzieli przez 2 i odejmuje 5 -> 18
3.Wczytuje wartość 18 dodaje 1 dzieli przez 2 i odejmuje 5 -> 4.5, a w przypadku typu int 4.

4 jest mniejsze od 10, a więc pętla nie wykona się.
Zapominasz, że w pętli jest ++x; tak więc po jej wykonaniu x będzie zwiększony o jeden, tak więc po pierwszym przejściu będzie 46, nie 45; po drugim 19, nie 18 i wreszcie 5, nie cztery.
NN19
Użytkownik
Użytkownik
Posty: 14
Rejestracja: 19 sty 2013, o 12:33
Płeć: Mężczyzna
Lokalizacja: Wszechświat
Podziękował: 3 razy
Pomógł: 1 raz

[C++] "Czytanie" programów

Post autor: NN19 »

C++ zwiększą po każdym wykonaniu o 1, a więc jeżeli blok się nie wykonał to nie zwiększy wartości o 1 co już napisałem. łatwo to sprawdzić przez wypisanie.
Awatar użytkownika
Althorion
Użytkownik
Użytkownik
Posty: 4541
Rejestracja: 5 kwie 2009, o 18:54
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 9 razy
Pomógł: 662 razy

[C++] "Czytanie" programów

Post autor: Althorion »

Ano, racja, mój błąd. Twoje wartości są poprawne.
syylwia
Użytkownik
Użytkownik
Posty: 60
Rejestracja: 30 kwie 2009, o 20:02
Płeć: Kobieta
Podziękował: 20 razy
Pomógł: 1 raz

[C++] "Czytanie" programów

Post autor: syylwia »

Dziękuje bardzo za odpowiedzi Troche pomogło:) Niestety takie głupie zadania mamy na kolokwium:/
m-2
Użytkownik
Użytkownik
Posty: 55
Rejestracja: 4 maja 2011, o 13:37
Płeć: Mężczyzna
Podziękował: 2 razy
Pomógł: 14 razy

[C++] "Czytanie" programów

Post autor: m-2 »

NN19, wytłumacz mi, dlaczego na wyjściu pojawia się jednak 5:


Althorion ma chyba rację, trzecia część w pętli for jest wykonywana po wykonaniu się zawartości pętli:
NN19
Użytkownik
Użytkownik
Posty: 14
Rejestracja: 19 sty 2013, o 12:33
Płeć: Mężczyzna
Lokalizacja: Wszechświat
Podziękował: 3 razy
Pomógł: 1 raz

[C++] "Czytanie" programów

Post autor: NN19 »

Tak dokładnie trzecia część jest wykonywana po wykonaniu instrukcji, dlatego za pierwszym razem mamy 100 (bo nic się jeszcze nie wykonało), które dzielimy przez 2 i odejmujemy 5, co daje nam 45, a potem dodawane jest do wyniku pierwszego 1 co daje 46 przechodzące przez instrukcje ponownie.
Co do wyniku 5 to jest to już wynik poza pętlą i po ostatnim wykonaniu została ostatni raz dodana wartość 1 do 4 co daje nam 5, można to dokładniej sprawdzić przez typ danych double czy float, który daje nam wynik zmiennoprzecinkowy.
m-2
Użytkownik
Użytkownik
Posty: 55
Rejestracja: 4 maja 2011, o 13:37
Płeć: Mężczyzna
Podziękował: 2 razy
Pomógł: 14 razy

[C++] "Czytanie" programów

Post autor: m-2 »

Chyba nie rozumiesz o co mi chodzi. Wcześniej napisałeś:
4 jest mniejsze od 10, a więc pętla nie wykona się.
Zatem rozumując w Twój sposób, gdyby pętla wyglądała tak:

Kod: Zaznacz cały

int x;
for(x=100; x >= 5; ++x)
{
     x=x/2-5;
}
To wartość \(\displaystyle{ x}\) po wyjściu z pętli byłaby taka sama, czyli 5 (bo 4 jest mniejsze od 5). A tymczasem to nie jest prawda, bo wynik wynosi -2. Chodzi o to, że \(\displaystyle{ x}\) jest inkrementowane po części właściwej pętli, ale przed kolejnym sprawdzeniem warunku w pętli.
NN19
Użytkownik
Użytkownik
Posty: 14
Rejestracja: 19 sty 2013, o 12:33
Płeć: Mężczyzna
Lokalizacja: Wszechświat
Podziękował: 3 razy
Pomógł: 1 raz

[C++] "Czytanie" programów

Post autor: NN19 »

Nie zapominaj że mamy większe lub równe, a więc jeżeli zmienisz warunek na większe lub równe 5, to przed sprawdzeniem warunku dodawane jest 1 do 4 co daje nam 5 (preinkrementacja), a następnie sprawdzany jest warunek, który jest prawdziwy. Sprawdzanie warunku to ostatnia operacja tej pętli.
m-2
Użytkownik
Użytkownik
Posty: 55
Rejestracja: 4 maja 2011, o 13:37
Płeć: Mężczyzna
Podziękował: 2 razy
Pomógł: 14 razy

[C++] "Czytanie" programów

Post autor: m-2 »

W zasadzie powtórzyłeś to, co przed chwilą powiedziałem.
Nie zapominaj że mamy większe lub równe, a więc jeżeli zmienisz warunek na większe lub równe 5
Wcześniej też było większe lub równe.
preinkrementacja
To tutaj nie ma znaczenia, mogłoby być x++ i wartość na końcu byłaby taka sama:

Pierwsza odpowiedź: ... n-for-loop

Po prostu chciałem, żebyś się ustosunkował do swojego argumentu zatrzymania się pętli (4 jest mniejsze od 10). Pętla się zatrzymała, bo 5 jest mniejsze od 10 (wcześniej zwiększyliśmy \(\displaystyle{ x}\)), a z tego co napisałeś (pierwszy post) można wywnioskować, że albo ostatnia inkrementacja w ogóle nie nastąpiła (z 4 na 5) albo nastąpiła tylko, że po sprawdzeniu warunku (\(\displaystyle{ 4<10 \Rightarrow}\) kończymy pętle i inkrementujemy \(\displaystyle{ x}\)).
NN19
Użytkownik
Użytkownik
Posty: 14
Rejestracja: 19 sty 2013, o 12:33
Płeć: Mężczyzna
Lokalizacja: Wszechświat
Podziękował: 3 razy
Pomógł: 1 raz

[C++] "Czytanie" programów

Post autor: NN19 »

Masz rację, poprawiłem ten błąd. A typ inkrementacji (pre czy post) nie wpływa na wynik w tym programie.
ODPOWIEDZ