Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Skrócony regulamin

[TP] Program rysujący trójkąt z gwiazdek

Idź do strony 1, 2  Następny

 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Pascal, Delphi, ...
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
jacek666
Gość





PostWysłany: Pon Gru 05, 2011 1:32 am      Temat postu: [TP] Program rysujący trójkąt z gwiazdek Odpowiedz z cytatem Pisownia

Witam!
Mam pewien problem w szkole miałem za zadanie napisać program rysujący na ekranie:

*****
****
***
**
*

W/w figurę. Trochę pomyślałem, pokombinowałem i się udało, ale rzecz w tym że sam kod wygląda tak jakby nie miał logicznie sensu natomiast program robi to co chciałem. Program kompilowałem w Hugo bodajże 2.21
i dev-Pascal i działał tak samo, więc to na pewno nie wina kompilatora i być może jest coś o czym nie wiem.
Kod:
program trojkat;
uses crt;
var
   i,j:integer;
begin
     j:=5;
     for i:=1 to 5 do
     begin
          for j:=1 to j do
          write('*');
          writeln;
          j := j-1 ;
     end;
     readkey;
end.

Przechodząc do sedna według mnie bez sensu logicznego jest linijka 9 ponieważ przy definicji pętli zmienna j otrzymuje wartość 1 a skoro w/w pętla ma się wykonywać zgodnie z kodem do j to logicznie powinna się wykonać raz a wykonuje się 5 razy i z każdym kolejnym razem o 1 raz mniej. Czy ktoś mógłby objaśnić dlaczego tak jest i ewentualnie wyjaśnić linijka po linijce od begin do end co się dzieje?

Tytuł wątku zmieniony przez moderatora. Pisz sensowne tematy! marcin_an
Powrót do góry
Mgr.Dobrowolski



Dołączył: 18 Cze 2006
Posty: 475

PostWysłany: Pon Gru 05, 2011 1:55 am      Temat postu: Odpowiedz z cytatem Pisownia

Kod:
for i:=5 downto 1 do begin
    for j:=1 to i do
        write('*');
    writeln
end;
prawda, że proste?[/code]
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Numer GG Tlen
jacek666
Gość





PostWysłany: Pon Gru 05, 2011 2:35 am      Temat postu: Odpowiedz z cytatem Pisownia

Wiem że jest mnóstwo metod łatwiejszych i trudniejszych ale mi chodziło o logiczne wyjaśnienie kodu źródłowego który podałem a nie podawania nowego sposobu na rozwiązanie tego samego zadania.
Powrót do góry
Mgr.Dobrowolski



Dołączył: 18 Cze 2006
Posty: 475

PostWysłany: Pon Gru 05, 2011 7:20 am      Temat postu: Odpowiedz z cytatem Pisownia

Przeprasza, rzuciłem tylko okiem a Twojego pytania w zasadzie nie przeczytałem
i założyłem..., mój błąd.

Tak to już w Pascalu jest z pętlą FOR
Wartości graniczne pętli obliczane są tylko raz przed rozpoczęciem pętli i zapamiętywane w lokalnych niewidocznych zmiennych (które są stałe :-). Można np. napisać FOR x:= x-1 TO x+1 DO (trzy obroty)
Większość kompilatorów wygeneruje kod w którym po opuszczeniu pętli wartość zmiennej sterującej równa jest górnej/końcowej wartości, większość ale nie wszystkie. Inaczej niż np. C.
Wg standardu wartość zmiennej sterującej po opuszczeniu pętli jest nieokreślona, czyli w zasadzie ten kod jest błędny, a działa bo akurat działa.

można by to zapisać:
Kod:
var
   i, j , _x54_carramba_, _j23_kloss_:integer;
begin
     j:=5;
     for i:=1 to 5 do
     begin
          _j23_kloss_ :=1;    
          _x54_carramba_ := j;
          for j:= _j23_kloss_ to _x54_carramba_ do
               write('*');
          writeln;
          j := j-1 ;
     end;
end.
Takie rozwiązanie ma wady i zalety, trzeba to wiedzieć.

prawda, że proste? :-)
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Numer GG Tlen
jacek666
Gość





PostWysłany: Pon Gru 05, 2011 9:15 pm      Temat postu: Odpowiedz z cytatem Pisownia

Powiedzmy że średnio rozumiem.
Właściwie to trochę źle sprecyzowałem pytanie. Mam rozumieć że w linijce 9 (mam na myśli kod z cytatu) zmienna j przy definicji pętli to nie ta sama zmienna co w linijce 4? Bo skoro w linijce 4 j ma wartość 5 a w 9 przypisuje się jej wartość 1 i w moim kodzie ma się wykonywać do j to dlaczego nie wykonuje się jeden raz tylko 5. Twój kod rozumiem bo ma już logiczny sens, ale czy to dokładnie to samo co w moim?
Powrót do góry
samolot



Dołączył: 26 Sty 2006
Posty: 5404
Skąd: Toruń

PostWysłany: Pon Gru 05, 2011 9:39 pm      Temat postu: Odpowiedz z cytatem Pisownia

Wykona sie 5 razy bo w linii 9 zmienna j przyjmuje warość zmiennej _j23_kloss_
czyli 1 (bo taka jej została przypisana wartośc w linii 7)
i pętla przebiega do wartosci [i]_x54_carramba_[/i],
której wcześniej została przypisana w lini 8 wartość zmiennej j

(o ile sie nie pomyliłem, bo Pascala nie znam, ale konstrukcja petli, myslę, jest w miarę zrozumiała dla mnie)


PS. Na tych nazwach zmiennych to sobie prawie palce połamałem :)

_________________
Vista SP2+VB 2008 EE + .NET 3.5 + IE 9.0.8112 /431 przykładowych programów do Warsztatu programisty (Helion)
W życiu bowiem istnieją rzeczy , o które warto walczyć do samego końca. (P. Coelho)
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
jacek666
Gość





PostWysłany: Pon Gru 05, 2011 10:12 pm      Temat postu: Odpowiedz z cytatem Pisownia

Chyba nie przeczytałeś dokładnie mojej wypowiedzi
Powrót do góry
samolot



Dołączył: 26 Sty 2006
Posty: 5404
Skąd: Toruń

PostWysłany: Pon Gru 05, 2011 10:24 pm      Temat postu: Odpowiedz z cytatem Pisownia

Nie odpowiedziałem Ci na pierwszą część pytania,
wiec, wg mnie, to jest nadal ta sama zmienna, tylko tu przyjmuje inną wartość.

Co do nie zrozumienia, to raczej Ty nie rozumiesz mej wypowiedzi,
Odpowiada ona na drugą część Twojego pytania.
Przeczytaj jeszcze raz, a dokładnie.

_________________
Vista SP2+VB 2008 EE + .NET 3.5 + IE 9.0.8112 /431 przykładowych programów do Warsztatu programisty (Helion)
W życiu bowiem istnieją rzeczy , o które warto walczyć do samego końca. (P. Coelho)
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
jacek666
Gość





PostWysłany: Wto Gru 06, 2011 12:20 am      Temat postu: Odpowiedz z cytatem Pisownia

jacek666 napisał:
Powiedzmy że średnio rozumiem.
Właściwie to trochę źle sprecyzowałem pytanie. Mam rozumieć że w linijce 9 (mam na myśli kod z cytatu) zmienna j przy definicji pętli to nie ta sama zmienna co w linijce 4? Bo skoro w linijce 4 j ma wartość 5 a w 9 przypisuje się jej wartość 1 i w moim kodzie ma się wykonywać do j to dlaczego nie wykonuje się jeden raz tylko 5. Twój kod rozumiem bo ma już logiczny sens, ale czy to dokładnie to samo co w moim?

Samolot przeczytaj to co wytłuszczone. ty odpowiedziałeś mi na pytanie w oparciu o kod Mgr.Dobrowolski a to o co pytam w drugiej części odnosi się do kodu z mojego pierwszego postu. kod Mgr.Dobrowolski jest dla mnie w pełni zrozumiały i ma dla mnie sens logiczny co już napisałem w zacytowanej tutaj wypowiedzi i nie trzeba mi go tłumaczyć w przeciwieństwie do tego mojego.
Powrót do góry
Mgr.Dobrowolski



Dołączył: 18 Cze 2006
Posty: 475

PostWysłany: Wto Gru 06, 2011 3:22 am      Temat postu: Odpowiedz z cytatem Pisownia

Mgr.Dobrowolski napisał:
[...]Wartości graniczne pętli obliczane są tylko raz przed rozpoczęciem pętli[...]


samolot napisał:
[...]PS. Na tych nazwach zmiennych to sobie prawie palce połamałem :)
Nie znasz szpiega z krainy Deszczowców ani Stawki większej niż szycie?
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Numer GG Tlen
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Pascal, Delphi, ... Wszystkie czasy w strefie CET (Europa)
Idź do strony 1, 2  Następny
Strona 1 z 2

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.08389 sekund, zapytan = 9
contact

| Darmowe programy i porady Jelcyna | VB4all | Tansze zakupy w Helionie |