Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 11 kwi 2026, o 03:23


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 3 mar 2015, o 13:06 
Offline
Użytkownik

Dołączył(a): 09 lut 2013
Posty: 45
Pomógł: 3

Witam

Jakiś czas temu zaczałem się uczyć C ale później tak wyszło, że przestałem. Postanowilem wróćić do tego. Napisałem taki prosty program. Działa, ale nie do końca rozumiem pewną kwestię.

Chodzi o pętle while i if/else. Właściwie tą petle w pętli
jesli nie umieszcze po niej return 0; lub break; to program działa tak, że po udzieleniu poprawnej odpowiedzi wyswietli kimunikat "Dobrze, twoje haslo to Lemur :-)" i następnie po wciśnieciu Enter wyświelta "Podaj T lub N." I teraz chciałbym wiedzieć jaką wartość dokładnie zwraca taka petla( podaje odpowiedź 3). To co wyrzuca po dopisaniu return 0; i break to wiem, ale jak to usunę to właśnie mnie zastanawia. Spełnienie if, przy braku return 0:/break; zakańcza ta małą pętle ale powoduje coś, że duża się nie zakańcza i nie wiem co to dokładnie jest i w sumie dlaczego ta pierwsza pętla tez się bez return/break nie zakańcza skoro warunek początkowy if (ch == 't' || ch == 'T') jest spełniony. Gdy spełnie if (ch == 'n' || ch == 'N') to wszystko działa.

Mam nadziej że za bardzo nie zamotałem

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


pozdrawiam
Piotrek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 mar 2015, o 13:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

Ogólnie nie wczytywałem się w problem, ale zastosowanie instrukcji "return" w programie głównym (main) kończy bezwzględnie jego działanie i rezultat zwracany jest to systemu lub aplikacji na której rzecz ten program został wykonany.
Pętla nie zwraca żadnej wartości, a użycie "break" kończy działanie pętli wewnętrznej.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 mar 2015, o 13:42 
Offline
Użytkownik

Dołączył(a): 09 lut 2013
Posty: 45
Pomógł: 3

Hej

Program działa dobrze. Skęk w tym, że nie bardzo rozumiem dlaczego.
Inaczej. Program z tym listingiem działa dobrze

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


z tym już nie

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Różnica polega na zastosowaniu return 0; ( jak dam tam break; też działa poprawnie).
Jaka wartość jest zwracana z tej pętli, albo co się dzieje, gdy nie dodam return 0; lub break;

Gdy uzyje pierwszego kodu główna petla zakańcza działanie po podaniu prawidowej odpowiedzi. Gdy użyje drugiego. Odpowiedź mi się wyświetli ale po nacisnięciu enter wyświetli mi się równiez prośba o podanie T lub N czyli tak jakby program nie wyszedł z tej pierwszej, głównej petli. Dlaczego?
Pozdrawiam
Piotrek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 mar 2015, o 14:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

Sprawa jest bardzo prosta. Przedstawiając to w bardzo uproszczony sposób, po użyciu "return" nie wyświetli się już absolutnie nic, bo program zakończył właśnie już swoje działanie (można powiedzieć bezpowrotnie ;)). Używając "break" opuszczasz zewnętrzną pętlę "while ((ch = getchar()) !='\n')", a więc sterowanie programu przechodzi do kolejnych linii za tą pętlą tj. " getchar(); return 0;".

Jeżeli nie przerwiesz działania zewnętrznej pętli wtedy warunek "(ch == 'n' || ch == 'N')" nie zostanie spełniony i wyświetli się komunikat "Podaj T lub N.", jednocześnie oczekując na znak końca linii (Enter). Po czym w kolejnej iteracji oczekiwany jest znak różny od '\n' i cały cykl się powtarza.

Jeszcze jedna kwestia. "while (getchar() != '\n') continue;" można uprościc do postaci "while (getchar() != '\n');". Możesz zainteresować się funkcją scanf.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 mar 2015, o 15:06 
Offline
Użytkownik

Dołączył(a): 09 lut 2013
Posty: 45
Pomógł: 3

Hej

Dzięki już jasne.

Dobra ja źle to okresliłem, trudno mi było wytłumaczyć.

Na forum jestem długo ale w sumie z pewnych powodów nic nie robiłem. teraz do tego wracam więc tak jakby mnie nie było.

Przepraszam za zamieszanie i dzięki za pomoc

Pozdrawiam
Piotrek

P.S.

W sumie błąd wyniknął ze złego zrozumienia działania pętli while i instrukcji if w niej zawartych. Prawda, mój błąd rozumowania był można powiedzieć podstawowy. Wrócę do nauki od początku książki, inaczej to niema sensu, zbyt długa była moja przerwa. Dzięki raz jeszcze i przepraszam za głupotę, jeśli tak można ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 6 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO