Dodaj do ulubionych

Precudury -POMOCY!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!

14.01.06, 17:51
Może ktoś z was to porafi zrobić ja nie bardzo do doszłem trochę sam ale nie
rozumiem dlczego ma być wynik 10,20,10, 30, 30 (mógłby któś to trochę
ropzisać?)

W miejsce kropek wpisz wynik działania programu

program DwieProcedury;
var a : integer;

procedure Proc1(a : integer);
begin
a := 20;
write(a:3);
end;

procedure Proc2(var a : integer);
begin
a := 30;
write(a:3);
end;

BEGIN
a := 10;
write(a:3);
Proc1(a);
write(a:3);
Proc2(a);
writeln(a:3);
END.
(Odp jest 10,20,10,30,30) ale dlaczego?

zadanie 2. Podobne (tez wpisać wynik)
program procedury;
var n1,n2:integer;

procedure Zmiana(x: integer;
var y: integer);
var m: integer;
begin
m := x;
y := y + m;
x := y;
end;

BEGIN
n1 := 10;
n2 := 7;
Zmiana(n1,n2);
writeln(n1:3,n2:3);
END.

z góry dzięki za jakieś wskazówki
Obserwuj wątek
    • jasnoniebieski.5 Re: Precudury -POMOCY!!!!!!!!!!!!!!!!!!!!!!!!!! ! 14.01.06, 19:51
      hey
      Jezeli ktos zadal takie zadanie to albo wczesniej omowil jego poszczegolne
      elementy a po prostu Ty nie uwazales na lekcji/wykladach, albo ktos kto to zadal
      jest tak malo kompetentny ze nie omowil tego wczesniej...

      Zacznijmy od tego, ze a:3 to nie dzielenie liczby a przez 3, tylko wypisanie
      ilosci miejsc w lewo od przecinka (gdyby bylo tam a:1 lub a:2 to wynik
      wygladalby tak:1020103030. Poniewaz jest a:3 a wynikiem sa tylko dwie liczby a
      zera przed nimi sie nie pisze to wynikiem jest:_10_20_10_30_30. Gdyby bylo tam
      a:4 to wynikiem byloby:__10__20__10__30__30 i tak dalej...)

      Czyli wiemy ze gdy pisze a:3 to wynikiem jest a poprzedzone "niewidzialnym" zerem.
      Zaczynamy analize 1 zadania:
      > BEGIN
      > a := 10;
      > write(a:3);
      =======
      czyli po pierwszym wypisaniu mamy:"_10"

      nastepnie mamy:
      > Proc1(a);
      czyli wywolanie procedury Proc1:
      > procedure Proc1(a : integer);
      > begin
      > a := 20;
      > write(a:3);
      > end;
      w a mamy 20, a poniewaz to a jest na stosie statycznym (czyli takim, ze to "a"
      ma wartosc 20 tylko przez czas wykonywania procedury, czyli to "a" ktore zostalo
      zadeklarowane lokalnie. No i patrzymy co sie dzieje: w "a" masz 20, wypisujesz
      go nadal w jednej linii (write) wiec:"_20")

      Patrzymy dalej:
      > write(a:3);
      > Proc2(a);
      Poniewaz wyszlismy z procedury, to "a" zostaje znowu przypisane to co bylo na
      poczatku, czyli 10 (wynik:"_10")
      > procedure Proc2(var a : integer);
      > begin
      > a := 30;
      > write(a:3);
      > end;
      Teraz widzimy, ze w Proc2 jest "var" - to var jest bardzo wazne, poniwaz
      przypisuje wartosc juz do "a" globalnego, czyli podmienia 10 na 30. (Mimo tego
      ze wprocedura sie skonczyla, w "a" jest nadal 30, stad wynik:"_30").

      No i na koncu mamy write(a:3), czyli to "a" gdzie siedzi 30, wiec wypisujemy je
      znowu.
      Po zakonczeniu mamy wynik:"_10_20_10_30_30"

      ======================
      ZADANIE2
      ======================
      Podobnie mamy zadeklarowane globalne wartosci:
      var
      n1,n2:integer;
      > BEGIN
      > n1 := 10;
      > n2 := 7;
      > Zmiana(n1,n2);

      Analizujemy procedure Zmiana:
      > procedure Zmiana(x: integer; var y: integer);
      > var m: integer;
      > begin
      > m := x;
      > y := y + m;
      > x := y;
      > end;
      Poniwaz mamy w procedurze: (x: integer; var y: integer);
      to znaczy, ze x zmienia wartosc tylko w obrebie procedury ale "y", ktoremu
      przypisano var zmieni wartosc juz globalnie, w tym przypadku bedzie to n2,
      patrzymy co sie dzieje z "y" w procedurze:
      m:=x {czyli n1, czyli wartosc 10}
      y:=y+m {czyli n2, czyli wartosc 7 + 10 (patrz powyzej)}
      x:=y {oczywiscie x zostanie przypisanie tylko na chwile 17, bo po wyjsciu ta
      wartosc zostanie wyczyszczona}
      no i co nam zostalo?
      > writeln(n1:3,n2:3);
      czyli wypisanie n1(10-bez zmian) no i wypisanie n2(17-bo y:=y+m)

      Cale dwa programy - mama nadzieje ze pomoglem, prosciej chyba nie potrafie :)

Nie masz jeszcze konta? Zarejestruj się


Nakarm Pajacyka