Witam, ucząc się pascala, zauważyłem, że ilość obliczeń i przypisywania zmiennych pod beginem ma znaczenie na wynik programu.
Nigdzie nie mogę znaleźć informacji na temat tej prostej instrukcji, więc postanowiłem zapytać was. Jakie są ograniczenia co do obliczeń pod beginem? Ile linijek, obliczeń, przypisywać może być pod nim ? Ile pętli itp. ?
Ogranicza Cię miejsce na dysku.
- To dość logiczne, że jeśli wykonujesz
więcej operacji
, toczas wykonywania aplikacji się wydłuża
.
ale mi nie chodzi o czas wykonywania programu, tylko o wynik obliczeń programu, czasami jak mam kilka pętli i kilka warunków, wystarczy że zmieniam miejsce begina spod ifa nad ifa lub odwrotnie i wynik jest całkiem inny
Żarty sobie robisz to przecież normalne że zmieniając kod programu masz wpływ na wynik. Weź np. w matematyce 2 + 2 * 2 = 6
ale wystarczy trochę zmienić np. dodać nawias i mamy (2 + 2) * 2 = 8
. Już nie mówię nawet o zmianie znaku, bo chodzi mi że taka zmiana miejsca begin
może tworzyć jak gdyby wspomniany nawias.
Lepiej poczytaj co robi if
i begin
.
nikt sobie nie robi żartów, tekstem "poczytaj sobie" nic nie robisz prócz nabijania postów, jak nie chcesz pomóc to po prostu nie pisz, przeczytaj w jakim dziale jesteś i to co napisałem w 1 poście
No ale to pytanie jest tak przerażająco śmieszne, że turlałem się przez kilka minut ze śmiechu... Nie bardzo rozumiem, jak udało ci się napisać program z kilkoma pętlami i instrukcjami warunkowymi bez zrozumienia słowa POCZĄTEK i KONIEC i tego, że jak przesuniesz POCZĄTEK w inne miejsce, to będzie to inaczej działało?
Rozważmy taki przykład:
płeć = wczytaj_płeć();
jeżeli płeć="kobieta" to
początek
napisz("O jak ja kocham kobiety");
napisz("może za mnie wyjdziesz?")
koniec
napisz("podano płeć: ", płeć)
Napisałem go w pseudokodzie, bo to żadna różnica czy Pascal i BEGIN czy C/C++ i { czy jeszcze może inny język.
No i teraz dodam komentarze:
płeć = wczytaj_płeć(); // to się wykonuje najpierw:
jeżeli płeć="kobieta" to //sprawsza czy to kobieta
początek // jeżeli to kobieta, to zaczyna ten blok instrukcji
napisz("O jak ja kocham kobiety"); // to się dzieje tylko jeżeli płeć to kobieta
napisz("może za mnie wyjdziesz?") // i to też
koniec // koniec ifa
napisz("podano płeć: ", płeć) // a to znów zawsze, niezależnie od płci
i teraz Ty sobie optymistycznie przesuwasz POCZĄTEK przed ifa i dostajesz:
płeć = wczytaj_płeć(); // to się wykonuje najpierw:
początek // tu zaczyna się od czapy blok instrukcji, ale co to przeszkadza, zaczyna się i już
jeżeli płeć="kobieta" to //sprawsza czy to kobieta
napisz("O jak ja kocham kobiety"); // to się dzieje tylko jeżeli płeć to kobieta
napisz("może za mnie wyjdziesz?") // a to już wykonuje się zawsze, niezależnie od płci, bo nie zostało zblokowane w całość, więc do IFa należy tylko 1 instrukcja.
koniec // tu kończy się zaczęty od czapy blok instrukcji
napisz("podano płeć: ", płeć) // a to znów zawsze, niezależnie od płci
I teraz propozycja małżeństwa trafia także do facetów.
W skrócie: Generalnie programowanie nie polega na rzucaniu losowo instrukcjami w dowolne miejsca, a pytanie z pierwszego listu jest tak abstrakcyjne, że nie bardzo wiadomo jak je traktować.
Na trolling mi to nie wygląda, więc może dorzucę też coś od siebie;
@gregory888john - po pierwsze, wszystkie posty w tym wątku mają wartość merytoryczną, więc o żadnym "nabijaniu postów" nie ma mowy; Po drugie, zadajesz z pozoru dość podstawowe pytanie, jednak jest ono na tyle zabawne, że wzbudza różne emocje;
Przede wszystkim zwróć uwagę, że begin
i end
to nie są standardowe instrukcje (coś wykonujące); Służą one jedynie do grupowania kodu w bloki, które to w danym kontekście mają jakieś zastosowanie; Typowym zastosowaniem jest zgrupowanie bloku kodu procedury/funkcji, czy zgrupowanie kodu pętli For; Tych bloków można używać bądź ile - np. ten kod:
procedure Foo();
begin
Write('Foo');
end;
będzie wyglądał (na niższym poziomie) i działał dokładnie tak samo, jak ten:
procedure Foo();
begin
begin
begin
Write('Foo');
end
end
end;
Natomiast taki kod wyświetlający pary napisów w pętli For:
procedure Loop();
var
intToken: Integer;
begin
for intToken := 0 to 2 do
begin
WriteLn('Foo');
WriteLn('-----');
end;
end;
nie będzie działał tak samo, jak poniższy:
procedure Loop();
var
intToken: Integer;
begin
for intToken := 0 to 2 do
begin
WriteLn('Foo');
end;
WriteLn('-----');
end;
a przesunąłem jedynie End o jedną linijkę do góry; Dlaczego? Bo pierwszy kod pokazuje grupowanie dwóch instrukcji w bloku pętli, a drugi tylko jedną; W rezultacie pierwszy kod wyświetli sześć linijek tekstu:
Foo
-----
Foo
-----
Foo
-----
a drugi kod tylko cztery:
Foo
Foo
Foo
-----
Używanie słówek Begin i End do grupowania instrukcji ma kluczowe znaczenie, aby odpowiednie instrukcje wykonać "razem", a inne osobno; Dlatego też zmiana linijki otwierającej lub zamykającej dany blok może albo negatywnie wpłynąć na końcowy wynik, albo nawet uniemożliwić skompilowanie kodu; Grupowania instrukcji powinno się używać jedynie w przypadku, gdy tych instrukcji jest więcej niż jedna - w przeciwnym wypadku jest to zwykła nadmiarowość, wydłużająca niepotrzebnie kod;
Myślę, że w końcu załapałeś, jak ważna jest sprawa grupowania.
i wszystko jasne, dzięki