tus0.gif (69 bytes)
 

ELEKTRONINĖS KNYGOS

tus0.gif (69 bytes)

Gintautas GRIGAS
PROGRAMAVIMAS PASKALIU

UŽDAVINIŲ SPRENDIMAI (ATSAKYMAI)

1.1.1.

program vidurkis3;
   var a, b, c, vid: real;
begin
  
read(a);
   read(b);
   read(c);
   vid := (a+b+c)/3;
   writeln(vid: 8: 2)
end.

1.1.2. Paskalio kalbos sistemos terpėje esančiu dorokliu renkami ir taisomi programų tekstai. Paskalio kalbos transliatorius arba kompiliatorius išverčia programos tekstą iš Paskalio kalbos į kompiuterio kalbą.

1.3.1. Taip.

1.3.2.

255   255
255     11

1.3.3. 256

1.5.1.

a(5)                     varduose skliaustai nevartojami;
Lt.                       varduose taškai nevartojami;
a'                        varduose apostrofai nevartojami;
begin vardas        negali sutapti su baziniu žodžiu;
prekės kaina        varduose negali būti tarpų.

1.5.2. Yra 3 skirtingi vardai. Sutampa:

vid     VID       Vid
Trik   Plotas   Trikplotas

1.5.3.

Sveikieji      Realieji      Simboliai       Eilutės
skaičiai       skaičiai
1998           1.25E4      '+'                 '1.25'
0                125E2        ' ' ' '              'STALAS'
-56             1.25           '  '                'a+b'
                  0.0            '5'                 'nulis'
                                                      ' '

Simboliai gali būti traktuojami kaip vieno simbolio eilutės.

1.5.4.

12E-13
3E6
-1E-9

1.5.5. Visos eilutės skirtingos. Taigi, jų yra 9.

1.5.6.

Baziniai žodžiai: program, var, begin, end.
Standartiniai vardai: read, writeln.
Programuotojo sudaryti vardai: vidurkis, a, b, vid.

1.6.1.

program pasveikinimas;
begin
  
writeln('Sveiki, visi')
end.

1.6.2. Komentarai gali būti įvairūs. Pateikiame vieną galimų variantų.

var prad: real;     { pradinė pinigų suma }
      proc: real;     { metinių palūkanų procentas }
      mn: integer;  { indėlio laikymo banke trukmė (mėn.) }
      galut: real;    { galutinė suma su palūkanomis }

2.1.1. Jeigu prieskyros sakinyje būtų užrašyta konstanta n, tai pataisius programą (kai reikia rašyti tikslesnius rezultatus), „susigadintų“ skaičiavimai.

2.2.1.

sveikojo: c, d, e.
realiojo: a, b, f.

2.2.2. a)2; b)1.

2.2.3. b, c, f, i.

2.2.4.

program GeomVidurkis;
   var a, b, geom: real;
begin
  
read(a);
   read(b);
   geom := sqrt(a*b);
   writeln(geom: 8: 2)
end.

2.2.5.

Lt := trunc(suma);
ct := round((suma-Lt)*100)

2.3.1.

22   33   22

2.3.2.

444   333   444

2.3.3. Š programa neturi prasmės, nes kompiuteriui liepiama spausdinti kintamojo a reikšmę prieš tai negu ji buvo perskaityta – atliekant pirmąjį sakinį kintamojo reikšmė dar neapibrėžta.

2.4.1.

program centai;
   var suma,                  { pinigų suma }
         mon: integer;        { monetų skaičius }
begin
  
read(suma);
   mon := suma div 50; suma := suma mod 50;
   mon := mon + suma div 20; suma := suma mod 20;
   mon := mon + suma div 10; suma := suma mod 10;
   mon := mon + suma div 5; suma := suma mod 5;
   mon := mon + suma div 2; suma := suma mod 2;
   mon := mon + suma { mod 1 };
   writeln(mon)
end.

2.4.2.

c := a;
a:= b;
b:= c;

2.4.3. a)

program SkSuma3;
   var a,                             { triženklis skaičius }
         sum: integer;             { ir jo skaitmenų suma }
begin
  
read(a);
   sum := a div 100 + a mod 100 div 10 + a mod 10;
   writeln(sum)
end.

b)
program Keitimas3;
   var a,                         { triženklis skaičius }
         atv: integer;           { perrašytas atbulai }
begin
  
read(a);
   atv := a mod 10 * 100 +
   a mod 100 div 10 * 10 +
   a div 100;
   writeln(atv)
end.

2.5.1.

program TrysBylos;
   var prad,                         { rezultatų byla }
         pirma, antra: text;       { pradinių duomenų bylos }
         x, y: integer;              { perskaityti skaičiai }
begin
  
assign(prad, 'A:\SKAIČIAI.TXT'); rewrite(prad);
   assign(pirma, 'C:\DUOMENYS\PIRMA.TXT'); reset(pirma);
   assign(antra, 'C:\DUOMENYS\ANTRA.TXT'); reset(antra);
   read(pirma, x); writeln(prad, x);
   read(antra, x, y); writeln(prad, x, y:10);
end.

2.5.2.

program TiesLygtis;
   var a, b,                         { lygties koeficientai }
         x: real;                      { lygties šaknis }
         byla: text;                 { pradinių duomenų byla }
begin
  
assign(byla, 'C:\PRAD.XXX'); reset(byla);
   read(byla, a, b);
   x := b/a;
   writeln(x)
end.

2.6.1. Ten pat, kur ir Paskalio programa.

2.6.2.

program laikas;
   var p,                         { parų skaičius }
         h,                         { valandų skaičius }
         min: integer;          { minučių skaičius }
begin
  
assign(input, 'DUOM.TXT'); reset(input);
   assign(output, 'REZ.TXT'); rewrite(output);
   read(p);
   h := p*24; write(h: 4);
   min := h*60; writeln(min: 6)
end.

 3.1.1.

a ir b: sveikųjų skaičių tipo kintamajam negalima priskirti loginės reikšmės;
e ir d: loginio tipo kintamajam neleidžiama priskirti skaičių reikšmės;
e: negalima lyginti sveikųjų skaičių su loginėmis reikšmėmis;
f ir g: aritmetinės operacijos su loginėmis reikšmėmis neatliekamos;
h: sveikųjų skaičių tipo kintamajam neleistina priskirti loginės reikšmės.

3.1.2.

TRUE
FALSE
TRUE

3.1.3. Jeigu kintamieji a ir x yra tokių duomenų tipų, kurių reikšmes galima lyginti (pvz., abi reikšmės skaičiai, abi – simboliai ir pan.), o kintamasis b yra loginio tipo, tai dviguba nelygybė virsta taisyklingu Paskalio reiškiniu, tik ji nebeturi įprastos matematinės skaičių intervalo prasmės.

3.1.4.

a

b

a<b

a<=b

a=b

a<>b

a>b

a >=b

false

false

false

true

true

false

false

true

false

true

true

true

false

true

false

false

true

false

false

false

false

true

true

true

true

true

false

true

true

false

false

true

3.1.5. a) true; b) false; c) true; d) true; e) true; f) false; g) true; h) false; i) true; k) false; l) true.

3.1.6.

a) rez := (a = b) and (b = c);
b) rez := (a <> b) and (b <> c) and (a <> c);
c) rez := (a = b) or (b = c) or (a = c);
d) rez := (a mod 2 = 0) and
            
(b mod 2 = 0) and
            
(c mod 2 = 0);
e) rez := (a > 0) and (b > 0) and (c > 0) and
            
(a <= 100) and (b <= 100) and (c <= 100).

3.1.7.

a) (a < b) and (b < c) and (c < d)
b) (a <= b) and (b <= c) and (c <= d)

3.1.8.

a)(a < b+c) and (b < a+c) and (c < a+b);
b)(a < b+c) and (b < a+c) and (c < a+b) and
  
((a = b) or (b = c) or (a = c));
c) (a = b) and (b = c).

3.1.9.

sqrt(sqr(cx-tx) + sqr(cy-ty)) < r

3.1.10.

a) a and not b and c and not d or
not
a and b and not c and d

b) a and b or c and d

c) not a and not b and not c and not d or
not
a and not d or
not
b or not d

3.1.11. a and (b or d)or
c and (b or d)

3.1.12.

(m mod 400 = 0) or (m mod 100 <> 0) and (m mod 4 = 0)

3.3.1. a =4 , b = 8

3.3.2. a = 10, b = 5 arba
a = 5, b = 10.

3.3.3. Programa teisinga ir ji duos tą patį rezultatą, kaip ir programa minimumas.

3.3.4.

if a mod 2 = 0 then f := a+b
                      else f := a*b

3.3.5. 4.

3.3.6.

program olimpiadanra;
   var metai,
         nr: integer;                         { olimpiados eilės numeris }
begin
  
read(metai);
   write(metai: 4, ' metai yra ');
   if (metai >= 1896) and (metai mod 4 = 0)
      then writeln('olimpiniai')
      else writeln('neolimpiniai')
end.

3.3.7. Jeigu rašymo sakiniuose nebūtų nurodyta tarpų, tai tarp rašomų žodžių bei skaičių taip pat nebūtų tarpų ir jie susilietų. Būtų rašoma, pavyzdžiui, taip:

Skaičius12345nedalusiš7

3.3.8. Perpratus apgaulingą uždavinio formuluotę matyti, kad tereikia pakeisti skaičiaus ženklą priešingu.

program LabaiPaprasta;
   var x: integer;
begin
  
x := -x;
   writeln(x)
end.

3.4.1. Taip, programos minimumas ir mini ekvivalenčios, t.y., visada duoda tą patį rezultatą.

3.4.2.

a) if a <> b then if a < b then b := b - a
                                     else a := a - b;
if a < b then b := b - a
            else if a > b then a := a - b

b) if a < b then a := a + 1
               else if a > b then b := b + 1

c) if a < b then b := b – 1
               else if a > b then a := a – 1

3.4.3. a) 1 2 3 4
b) 4 3 1 2

Kai a = b, tai neatliekama nė viena sąlyginio sakinio šaka, neįvedami kiti du pradiniai duomenys, kintamųjų c ir d reikšmės lieka neapibrėžtos.

3.4.4.

if a > b then begin c := 1; d := 2 end
           else begin
c := 3; d := 4 end

3.4.5. Taip

3.4.6. Ne visada. Kai a. = 5, rezultatai skiriasi: a) c = 0, b) c = 2.

3.4.7.

program perdaug;
   var a, b: integer;
begin
  
read(a, b);
   if a > 10 then b := b - 5;
      if a > 5 then begin a := 5;
                             b := b - 5
                          end;
   writeln(a, b: 6)
end.

3.4.8. a 0, b 0, c 10.

3.4.9.

a) if (a > b) and (b < c) then a := a + 1;
b) if not log then a := a + 1;

3.4.10.

program dalus7;
   var x: integer;
begin
  
read(x);
   write('Skaičius ', x, ' ');
   if x mod 7 <> 0
      then write('ne');
   writeln('dalus iš 7')
end.

3.6.1. a) 5; b) 6.

3.6.2. 2 kartus, a = 3, b = 5, s = 8.

3.6.3. a = 4, b = 2. Ciklui priklauso tik vienas sakinys, esantis po jo antraštės. Sakinys b := b + 1 ciklui nepriklauso ir atliekamas tik vieną kartą. Kad programa būtų aiškesnė ir neklaidintų skaitytojo, šį sakinį reikėtų rašyti naujoje eilutėje ir lygiuoti su ciklo antraštės pradžia:

while a <= 3 do
   
a := a+1;
b := b+1

3.6.4

program minimumas;
   var prad: text;
         sk,                        { perskaitytas skaičius }
         min: integer;           { mažiausias skaičius tarp jau perskaitytų }
         skbyla: text;           { skaičių byla }
begin
  
assign(skbyla, 'SKAIČIAI.TEK'); reset(skbyla);
   min := maxint;                         { tikrai nemažesnis už bet kurį skaičių }
   while not eof(skbyla) do
       begin
         
read(skbyla, sk);
          if sk < min                       { rastas skaičius, mažesnis už min }
              then min := sk
       end;
   writeln(min)
end.

3.7.1. a ir c.

3.7.2. Ciklo sakinys, prasidedantis žodžiu while valdo vieno sakinio kartojimą, o ciklo sakinys, prasidedantis žodžiu repeat valdo sakinių sekos kartojimą.

3.8.1.

program log1;
   const epsilon = 1E-6;                         { liekamasis narys }
   var k : integer;
         ex, narys: real;
begin
  
ex := 0.0;
   narys := 1.0;
   k := 1;
   while narys >= epsilon do
       begin
           
ex := ex + narys;
            narys := narys*ex/k;
            k := k + 1
       end;
   writeln(ex)
end.

3.8.2.

program pipi;
   const epsilon = 1E-10;                         { liekamasis narys }
   var k : integer;
         pi, narys: real;
begin
  
pi := 0.0;
   narys := 1.0;
   k := 1;
   while abs(narys) >= epsilon do
       begin
           
pi := pi + narys;
            if narys < 0 then narys := 1/k
                              else narys := -1/k;
            k := k + 2
       end;
   writeln(pi)
end.

 4.1.1. a) bevardis; d) false; f) Liūtas; g) false, kiti – netaisyklingi.

4.1.2.

{ 3, 4, 5 }    tipų vardų (asmuo, giminė) negalima vartoti prieskyros sakiniuose;
{ 7 }           abu lyginimo operacijos operandai turi būti to paties tipo;
{ 10 }          funkcijos pred parametras negali būti pirmoji tipo reikšmė.

4.1.3.

if (a = b) and (b = c) and(c = d) then forma := kv
     else if (a = b) and (c = d) or
              
(a = c) and (b = d) or
              
(a = d) and (c = b) then forma := st
                                           else forma := ne

4.1.4.

if a = sekm                         { sekmadienis – paskutinė diena }
   then gretimos := b = šešt
   else if a = pirm                { pirmadienis – pirmoji diena }
             then gretimos := b = antr
             else gretimos := (b = pred(a) or b = succ(a);

4.2.1. Visada teisingi: 3, 4;
visada neteisingi 5,6;
ne visada teisingi: 1, 2.

4.2.2.

var x1: -9..15;
      x2: -15..9;
      x3: -10..10;
      x4: -5..-1;
      x5: -50..50;
      x6: -58..66;
      x7: -28..40;

4.3.1.

program mėnuo;
   var mėnnr: integer;
begin
  
read(mėnnr);
   case mėnnr of
      1: write('sausis'); 2: write('vasaris');
      3: write('kovas'); 4: write('balandis');
      5: write('gegužė'); 6: write('birželis');
      7: write('liepa'); 8: write('rugpjūtis');
      9: write('rugsėjis'); 10: write('spalis');
      11: write('lapkritis'); 12: write('gruodis')
   end;
  
writeln
end
.

4.3.2.

if log then b := b+1
        else a := a+1

4.3.3.

program dienos;
   var metai, mėnuo, diena: integer;
begin
  
read(metai, mėnuo);
   case mėnuo of
     
1, 3, 5, 7, 8, 10, 12: diena:= 31;
      4, 6, 9, 11: diena:= 30;
      2: if (metai mod 400 = 0)
                    or ((metai mod 100 <> 0) and (metai mod 4 = 0))
              then diena := 29
              else diena := 28
   end;
   writeln(diena)
end.

4.4.1. a) 11; b) 0; c) 3; d) 1; e) 11; f) 2a+1; g) 11; h) 0.

4.4.2. 0  1  2  3  4  5

4.4.3.

program kvadratnelyg;
   var j, suma: integer;
begin
  
suma := 0;
   for j := 10 to 99 do
       if
j div 2 <> 0 then suma := suma + j*j;
   writeln(suma)
end.

4.4.4.

program GeomProgresija;
   var a,                         { pirmasis narys }
         q,                         { vardiklis }
         k: integer;
begin
  
read(a, q);
   write(a);
   for k := 2 to 10 do
     begin
       
a := a * q;
        write(a)
     end
end
.

4.4.5.

program AritmProgresija;
   var a,                         { pirmasis progresijos narys }
         d,                         { skirtumas }
         n,                         { pirmasis sumuojamas narys }
         k: integer;
begin
  
read(a, d, n);
   a := a + d*(n - 1);
   write(a);
   for k := 2 to 10 do
      begin
        
a := a + d;
         write(a: 5)
      end;
   writeln
end
.

4.4.6. 

a) n=5, m=2;
b) n=10; m=1;
c) n=10; m=0;
d) n=1; m=12;
    n=2; m=6;
    n=3; m=4;
    n=4; m=3;
    n=6; m=2;
    n=12; m=1;
e) n=1; m=13;
f) tokių reikšmių nėra.

4.4.7. 10 kartų. Reikšmės reiškinių, esančių ciklo for antraštėje, apskaičiuojamos vieną kartą, prieš atliekant ciklą. Todėl tolesni jų keitimai nebeturi įtakos ciklo kartojimų skaičiui.

4.4.8. Ne.

4.4.9. 1) Ciklo kintamojo reikšmės negalima keisti ciklo viduje (sakinys k := k+1); 2) Ciklo kintamojo reikšmė neapibrėžta baigus ciklą (sakinys writeln(k)).

4.4.10. Programoje pirma yra dvi klaidos: 1) panaudota neapibrėžta kintamojo k reikšmė ir 2) kintamojo k reikšmė atliekant ciklą paskutinį kartą viršija jo apraše nurodytą atkarpos tipo rėžį.

4.4.11. 1) Ne visi transliatoriai (tarp jų ir Turbo Paskalis) tikrina, ar keičiama ciklo kintamojo reikšmė cikle. 2) Tai, kad ciklo kintamojo reikšmė neapibrėžta, dar nereiškia, kad jis neturi jokios reikšmės. Jis gali turėti reikšmę, tiktai Paskalio kalba nenustato kokia ta reikšmė turi būti. Ta pati programa, sutransliuota kitu transliatoriumi, gali priskirti kitą reikšmę.

4.5.1.

program dalikliai3;
   var n,                         { duotas skaičius }
         dal: integer;           { kandidatas į duoto skaičiaus daliklius }
begin
  
read(n);
   dal := 1;
   while dal*dal <= n do
      begin
         if
n mod dal = 0
            then begin
                      
write(dal, ' ');
                       if n div dal <> dal
                          then writeln(' ', n div dal)
                          else writeln
                    end;
      end;
   dal := dal + 1
end.

Į vieną eilutę rašomi du skaičiai: daugiklis ir už jį didesnis jo „porininkas“. Kadangi vieneto „porininkas“ yra n, tai nebereikia programos pabaigoje spausdinti n. Dar vienas sąlyginis sakinys reikalingas tam, kad būtų išvengta dviejų vienodų daliklių rašymo, kai daliklis lygus savo „porininkui“.

4.5.2.

program daugikliai;                    { pirminiai }
   var n,                                     { duotas skaičius }
         d: integer;                         { kandidatas į duoto skaičiaus daugiklius }
begin
  
read(n);
   d := 2;
   while d >= n do
      begin
          while
n mod d = 0 do
             begin
                
writeln(d);
                 n := n div d
             end;
         
d := d + 1
      end
end
.

4.5.3.

program dalus235;
   const žingsnis = 2*3*5;
   var k: 1..10;
         sk: integer;
begin
  
sk := 0;
   for k := 1 to 10 do
      begin
        
sk := sk + žingsnis;
         writeln(sk)
      end
end
.

4.6.1. Kokie bus aritmetinių operacijų su realiaisiais skaičiais rezultatai, tiksliai pasakyti negalima. Kompiuteris, kuriame realieji skaičiai vaizduojami taip, kaip aprašyta šiame skyrelyje, turėtų pateikti tokius (apytikslius) rezultatus:

7.00000E-05
7.54321E-05

4.6.2. d ir g.

5.1.1. Ne. Pavyzdžiui, kai n = -5, tai pagal pirmąją formuluotę turi būti sumuojami skaičiai -4, -2, o pagal antrąją – -6, -4, -2.

5.2.2. Nepasakyta, kaip turi būti pateikiamas rezultatas. Formuluotę būtų galima papildyti šitaip: jeigu yra bent vienas nulis, spausdinti žodį TAIP, priešingu atveju – NE.

5.4.1. Kai a = 0, pagal pirmąjį sakinį bus atliekamas veiksmas b := 10, pagal antrąjį – b := 5

5.4.2.

a) a 15;
b) (a = 0) or (a = 1).

5.4.3.

a) ir b) a 10.

5.4.4.

a) k > 0;
b) k 0;
c) (k 0) and (k mod 2 = 0).

5.8.1.

program simboliai;
   var a, i, s: integer;
begin
  
read(a);
   s := 0;
   for i := 1 to a do
      begin
         
s := s+i*i*(i+1)
      end;
   writeln(s)
end.

5.8.2.

5

program tvarka;
   var i, s: integer;
begin
  
s := 1;
   i := 10;
   while i mod 7 = 0 do
       
i := i - 1; s := s + i*i;
   if s > 25
      then if s = 99
          then s := s+1
          else s := s div i - 2
      else s := s - 1;
   writeln(s);
end.

5

5.9.1.

program NatSuma;
   var n, suma: integer;
begin
  
read(n);
   suma := (n*n + n) div 2;
   writeln(suma)
end.

6.2.1. d) ir f) faktinių parametrų skaičius nelygus formaliųjų parametrų skaičiui;
e) faktinių parametrų tipas nesutampa su formaliųjų parametrų tipu.

6.2.2.

function min(a, b: integer): integer;
begin
   if
a <= b then min := a
                else min := b
end;

6.2.3.

function fakt(n: integer): integer;
   var f, k: integer;
begin
  
f := 1;
   for k := 1 to n do
      
f := f * k;
   fakt := f
end;

6.2.4. write(max4(a mod 10, b mod 10, c mod 10, d mod 10))

6.2.5.

function sksuma(n: integer): integer;
   var suma: integer;
begin
  
suma := 0;
   while n > 0 do
      begin
        
suma := suma + n mod 10;
         n := n div 10
      end;
   sksuma := suma
end;

6.2.6.

function progresija(a, b, c: integer): boolean;
begin.
  
progresija := b-a = c-b
end;

6.2.7.

function tūkst (n: integer);
   const priedas = 500;                      { apvalinimo konstanta }
begin
   if
n > 0 then n := n + priedas
      else n := n - priedas;
   tūkst := n div 1000
end;

6.3.1. Taip.

6.3.2. a) jeigu viena data yra prieš kalendoriaus reformą, o kita – po jos, tai iš gauto dienų skaičiaus atimti 10 (tiek dienų „dingo“ keičiant kalendorių).

b) jeigu būtų į programą įjungta funkcija, tikrinanti, ar teisingi pradiniai duomenys, tai reikėtų prie neegzistuojančių datų priskirti datas nuo 1582 m. spalio 5 d. iki tų pat metų spalio 14 d.

6.3.3.

function ArDataTeisinga (m, mėn, d: integer): boolean;
   var mp: 28..31;                   { paskutinė mėnesio diena }
   function kel (m : integer): boolean;
   begin
  
kel := (m mod 400 = 0) or
            (m mod 100 <> 0) and
            (m mod 4 = 0)
   end;
begin
   case
mėn of
     
1, 3, 5, 7, 8, 10, 12: mp := 31;
      2: if kel(m) then mp := 29
                       else mp := 28;
      4, 6, 9, 11: mp := 30
   end;
   ArDataTeisinga := (m >= 1563) and (m <= 3000) and
                               mėn in [1..12] and
                               d in [1..mp]
end;

6.4.1. a) ir b) – faktinių parametrų skaičius turi būti lygus formalių jų parametrų skaičiui; c) b = 30; d) b = 20; e) b = 14; f) b = 22; g) ir h) formalųjį parametrą – kintamąjį galima keisti tik kintamuoju (ne konstanta ir ne reiškiniu); i) a = 50; k) formaliųjų ir juos atitinkančių faktinių parametrų tipai turi sutapti.

6.4.2.

kvkub(m-1, a, b);
kvkub(n, c, d);
x := c-a;
y := d-b

6.4.3.

procedure trikampis (a, b, c: integer;
   var stat, lyg: boolean);
begin
  
stat := a*a + b*b = c*c;
   lyg := (a = b) or (b = c)
end;

6.5.1.

25   30
  4     0

6.5.2. Pirmasis parametras x apvalinamas 10y tikslumu.

a) 2000; b) 0; c) 1500.

6.5.3.

procedure laipsnis (var p: integer; n: integer);
                                                         { p keliamas laipsniu n }
   var pn, i: integer;
begin
  
pn := 1;
   for i := 1 to n do
     
pn := pn * p;
   p := pn
end;

6.5.4.

procedure sek (var h, min, s: integer);
begin
   if
s < 59 then s := s+1
                else begin
                           s := 0;
                           if min < 59 then min := min+1
                              else begin
                                         min := 0;
                                         if h < 12 then h := h+1
                                            else h := 1
                                      end
                        end
end
;

Kitas variantas

procedure sekundė (var h, min, s: integer);
begin
  
s := s + 1;
   min := min + s div 60;
   s := s mod 60;
   h := h + min div 60;
   min := min mod 60;
   if h = 13 then h := 1
end;

6.5.5.

2   2   2
1   1   2
3   3   2

6.6.1.

function vid (a, b: real): real;
begin
  
vid := (a+b)/2
end;

6.6.2.

function pinigai (prad, proc: real; mn: integer): real;
begin
  
pinigai := prad + prad*(proc/100*mn/12)
end;

6.6.3.

procedure LtCt (prad, proc: real; mn: integer;
                          var Lt, ct: integer);
   var suma: real;                       { galutinė suma (su palūkanomis) }
begin
  
suma := prad + prad*(proc/100*mn/12);
   Lt := trunc(suma);
   ct := round((suma-Lt)*100)
end;

6.6.4.

type forma: (kv, st, ne);
                      { kv – kvadratas (tuo pačiu ir stačiakampis) }
                      { st – stačiakampis bet ne kvadratas }
                      { ne – ne stačiakampis }
function kvstat (a, b, c, d: real): forma;
begin
   if
(a = b) and (b = c) and(c = d) then forma := kv
      else if (a = b) and (c = d) or
                (a = c) and (b = d) or
                (a = d) and (c = b) then forma := st
                                            else forma := ne
end;

7.1.1

a) record x, y: real end;
b) record a, b, c: real end;

7.1.2 a)

function lygu (a, b: laikas): boolean;
begin
  
lygu := (a.p = b.p) and
  
(a.h = b.h) and
  
(a.min = b.min) and
  
(a.s = b.s) and
end
;

b)
function trumpesnis (a, b: laikas): boolean;
begin
  
trumpesnis := a.s + 60*(a.min + 60*(a.h + 24*a.p))
                     < b.s + 60*(b.min + 60*(b.h + 24*b.p))
end;

c)
procedure suma(a, b: laikas; var c: laikas);
   var s: integer;
begin
  
s := a.s + b.s +
          60*(a.min + b.min + 60*(a.h + b.h + 24*(a.p + b.p));
   c.s := s mod 60;
   s := s div 60;
   c. min := s mod 60;
   s := s div 60;
   c.h := s mod 24;
   c.p := s div 24
end;

Kitas variantas

procedure suma(a, b :laikas; var c: laikas);
   var s: integer;
         p: 0..1;
begin
  
s := a.s + b.s;
   c.s := s mod 60; p := s div 60;
   s := a.min + b.min + p;
   c. min := s mod 60; p := s div 60;
   s := a.h + b.h +p;
   c.h := s mod 24; p := s div 24
   c.p := a.p + b.p + p
end;

d)
function paros (a: laikas); real;
begin
  
paros := ((a.s/60 + a.min)/60 + a.h)/24 + p
end;

7.1.3.

type kampas = record
                           laipsn: 0..maxint;
                           min, s: 0..59
                       end;
function radianai (k: kampas): real;
   const pi = 3.1415926536;
begin
  
radianai := ((k.s/60 + k.min)/60 + k.laipsn)/360*2*pi
end;

7.1.4.

type matas = record
                        jardas: 0..maxint;
                        pėda: 0..2;
                        colis: 0..11
                     end;
procedure sudėti (a, b: matas; var c: matas);
   var x: integer;
begin
  
x := a.colis + b.colis +
          12*(a.pėda + b.pėda + 3*(a.jardas + b.jardas));
   c.colis := x mod 12;
   x := x div 12;
   c.pėda := x mod 3;
   c.jardas := x div 3
end;
function metrai (a: matas): real;
begin
  
metrai := (((a.jardas * 3) +
   a.pėda) * 12 + a.colis)*25.4/1000
end;

7.2.1.

record
    
n: 3..maxint;             { kampų skaičius }
    a: real                      { kraštinės ilgis }
end;

7.2.2.

function plotas (t: trikampis): real;
   var atk: atkarpa;
         a, b, c,                         { kraštinių ilgiai }
         p: real;                         { pusė perimetro }
begin
  
atk.a := t.a; atk.b := t.b;
   a := ilgis(atk);
   atk.a := t.b; atk.b := t.c;
   b := ilgis(atk);
   atk.a := t.c; atk.b := t.a;
   c := ilgis(atk);
   p := (a + b + c)/2;
   plotas := sqrt(p*(p-a)*(p-b)*(p-c)
end;

7.3.1.

type temp = array[1..12] of
   record
     
vid, min, max: real
   end

7.3.2. a)

procedure kalendorius(mėn: kalend);
   var sav: savnr;
         sd: savd;
begin
   for
sd := pirm to sekm do
      begin
         for
sav := 1 to 6 do
            if mėn[sav, sd] <> 0
               then write(mėn[sav, sd]: 3)
               else write(' ');
         writeln
      end
end
;

b)
procedure kalendorius (mėn: kalend);
   var sav: savnr;
         sd: savd;
begin
   for
sav := 1 to 6 do
      begin
         for
sd := pirm to sekm do
            if mėn[sav, sd] <> 0
               then write(mėn[sav, sd]: 3)
               else write(' ');
         writeln
      end
end

7.3.3. Vidiniame cikle operaciją < pakeisti operacija >.

7.4.1. a ir c

7.5.1.

type spalva = (balta, žalia, raudona, oranžinė, mėlyna);
        siena = array [1..3] of
                       array [1..3] of spalva;
        šonas = (kairė, dešinė, priekis, užpakalis, viršus, apačia);
        kubas = array [šonas] of siena

7.5.2.

function Rubikas(x: kubas): boolean;
   var spal: array [spalva] of 0..54;
         sp: spalva;
         š: šonas;
         i, j: 1..3;
         b: boolean;
begin
   for
sp := balta to mėlyna do
     
spa[sp] := 0;
   for š := kairė to apačia do
      for
i := 1 to 3 do
         for
j := 1 to 3 do
            begin
               
sp := kubas[š][i][j];
               spal[sp] := spal[sp] + 1
            end;
   b := true;
   for sp := balta to mėlyna do
     
b := b and (spal[sp] = 9);
   Rubikas := b
end;

7.6.1. d.

7.6.2. a=b, c=d.

7.6.3.

b) abu operandai (ir antrasis!) turi būti aibės;
c) operacijos in pirmasis operandas turi būti aibės elemento tipo;
e) neteisinga antrojo operando aibė: antrasis atkarpos rėžis turi būti nedidesnis už pirmąjį.

7.6.4.

program skirtingi;
   var byla: text;                   { skaičių byla }
         skirtingi: boolean;        { ar visi perskaityti skaičiai skirtingi }
         sk: integer;                 { perskaitytas skaičius }
         esami: set of 0..99;     { perskaitytų skaičių aibė }
begin
  
assign(byla, 'SK.TEK'); reset(byla);
   skirtingi := true;
   while not eof(byla) do
      begin
        
read(byla, sk);
         if sk in [0..99]
            then
               begin
                  if
sk in esami then skirtingi := false;
                  esami := esami + [sk]
               end
      end
;
   write('Byloje SK.TEK ');
   if not skirtingi then write('ne');
   writeln('visi skaičiai iš [0; 99] yra skirtingi')
end.

8.1.1.

function laip (n: integer): integer;
begin
   if
n = 0 then laip := 1
               else laip := laip(n - 1) * 2
end;

8.1.2. a) 2; b) 1; c) 14; div.

8.1.3. Rekursija būtų nebaigtinė.
Sąlygą n = 1 reikėtų pakeisti sąlyga n < 1.

8.1.4.

function narys (n: integer): integer;
begin
   if
n = 1
      then narys := 1
      else if n mod 2 = 0
         then narys := narys(n div 2
         else narys := narys(n div 2) + narys(n div 2 + 1)
end;

8.1.5.

function suma (n, d: integer): integer;              { rekursinė }
begin
   if
n < 0
      then suma := 0
      else suma := n*n + suma(n-d)
end;
function suma (n, d: integer): integer; { ne rekursinė }
   var s: integer;
begin
  
s := 0;
   while n > 0 do
      begin
        
s := s + n*n;
         n := n-d
      end;
   suma := s
end;

8.1.6.

function ff (n: integer): integer;
begin
   if
(n = 0) or (n = 1)
      then ff := 1
      else ff := n*ff(n-2)
end;

8.3.1.

function bdd (a, b: integer): integer;
begin
   if
a = b then bdd := a
      else if a < b then bdd := bdd(a, b-a)
         else bdd := bdd(a-b, b)
end

8.3.2.

program dalikliai;
   var d, daliklis: integer;
   function dbd(x, y: integer): integer;
   begin
      if
x = 0 then dbd := y
         else dbd := dbd(y mod x, x)
   end;
begin
  
daliklis := 0;
   read(d);
   while d <> 0 do
      begin
        
daliklis := dbd(daliklis, abs(d));
         read(d)
      end;
   write(daliklis)
end.

8.3.3.

program kartotiniai;
   var k, kartotinis: integer;
   function mbk(a, b: integer): integer;
      function dbd(x, y: integer): integer;
      begin
         if
x = 0 then dbd := y
                    else dbd := dbd(y mod x, x)
      end;
   begin
     
mbk := a div dbd(a, b) * b
   end;
begin
  
kartotinis := 1;
   for k := 2 to 10 do
     
kartotinis := mbk(kartotinis, k);
   writeln(kartotinis)
end.

8.3.4.

function tarpusavyp (a, b: integer): boolean;
   function dbd (x, y: integer): integer;
   begin
      if
x = 0 then dbd := y
         else dbd := dbd(y mod x, x)
   end;
begin
  
tarpusavyp := dbd(a, b) <= 1
end;

8.4.1.

15   14   13   12   11   10
10   11   12   13   14   15

8.4.2. a) kai n 5, rašoma *; kai n < 5, skaičiavimas nesibaigs;
b) kai b = false, nebus atliekami jokie veiksmai; kai b = true, skaičiavimas nesibaigs.

9.1.1. Prieš skaitymą procedūra readreal byla turi būti paruošta analogiškai kaip ir prieš skaitymą standartine procedūra read.

9.1.2.

type skai = 0..9;
        simb = '0'..'9';
function sk (si: simb): skai;
begin
  
sk := ord(si) - ord('0')
end;
function si (sk: skai): simb;
begin
  
si := chr(ord('0') + sk + 1)
end;

9.1.3.

procedure readsveikas (var byla: text; var p: integer);
   var s: char;
         neigiamas: boolean;
begin
  
p:= 0; neigiamas := false;
   read(byla, s);
   while s = ' ' do                 { praleidžiami tarpai }
      read(byla, s);
   if s = '-'
      then begin
               
neigiamas := true;
                read(byla, s)
              end
      else if
s = '+' then read(byla, s);
   while s in ['0'..'9'] do
      begin
       
p := p*10 + (ord(s) - ord('0'));
        read(byla, s)
      end;
   if neigiamas then p := -p
end;

 

9.2.1.

function mažr (s : char) : char;
   const dr = 'AĄBCČDEĘĖFGHIYĮJKLMNOPQRSŠTUŲŪWVXZŽ';
            mr = 'aąbcčdeęėfghiyįjklmnopqrsštuųūwvxxž';
   var nr: integer;                         { raidės numeris }
         ss: string;
begin
  
nr := pos(s, dr);
   if nr = 0 then ss := s
      else ss := copy(mr, nr, 1);
   mažr := ss[1]
end;

9.2.2. Abiem atvejais – ne.

E Ankstesnis puslapis

3 Turinys

Kitas puslapis F

tus0.gif (69 bytes)