 |
Coders' city Nasza pasja to programowanie!
|
| Zobacz poprzedni temat :: Zobacz następny temat |
| Autor |
Wiadomość |
jacek666 Gość
|
Wysłany: Pon Gru 05, 2011 1:32 am Temat postu: [TP] Program rysujący trójkąt z gwiazdek |
|
|
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
|
Wysłany: Pon Gru 05, 2011 1:55 am Temat postu: |
|
|
| 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 |
|
 |
jacek666 Gość
|
Wysłany: Pon Gru 05, 2011 2:35 am Temat postu: |
|
|
| 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
|
Wysłany: Pon Gru 05, 2011 7:20 am Temat postu: |
|
|
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 |
|
 |
jacek666 Gość
|
Wysłany: Pon Gru 05, 2011 9:15 pm Temat postu: |
|
|
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ń
|
Wysłany: Pon Gru 05, 2011 9:39 pm Temat postu: |
|
|
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 |
|
 |
jacek666 Gość
|
Wysłany: Pon Gru 05, 2011 10:12 pm Temat postu: |
|
|
| Chyba nie przeczytałeś dokładnie mojej wypowiedzi |
|
| Powrót do góry |
|
 |
samolot
Dołączył: 26 Sty 2006 Posty: 5404 Skąd: Toruń
|
Wysłany: Pon Gru 05, 2011 10:24 pm Temat postu: |
|
|
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 |
|
 |
jacek666 Gość
|
Wysłany: Wto Gru 06, 2011 12:20 am Temat postu: |
|
|
| 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
|
Wysłany: Wto Gru 06, 2011 3:22 am Temat postu: |
|
|
| 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 |
|
 |
|
|
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
|