Pascal gyakorló feladatok

Néhány feladat megoldása megtalálható a http://www.hit.bme.hu/anonftp/szandi/pascal/gyak/ címen.


E03

Írjon programot, amely meghatározza a bekért szám legkisebb osztóját. (Pongor könyv 1.9 példák)

E03a

A programot módosítsa úgy, hogy kiírja az összes osztót.

E03b

A programot módosítsa úgy, hogy kiírja a prímtényezős felbontást (azon prímszámok, amelyek szorzata a szám).

E04

Írjon programot, amely eldönti egy számról, hogy prím-e?

E05

Írjon programot, amely meghatározza az n. prímszámot.


E01

Írjon programot, amely meghatározza, hogy az adott gépen hány biten ábrázolják az egész számokat.
A program megírásához tudni kell, hogy a számítógépek kettes számrendszerben ábrázolják a számokat (bitek); a PASCAL-ban a legnagyobb pozitív egész szám az előre definiált MAXINT konstans; a bitek száma 1-el több, mint a MAXINT bitjeinek száma, mert a legmagasabb helyiértékű bit az előjel ábrázolására szolgál.

E02

Írjon programot, amely kiszámítja a bekért szám faktoriálisát, amennyiben az ábrázolható az adott implementációban, azaz kisebb mint MAXINT.

E09

Adott egy x,y középpontú, r sugarú kör. Írjon olyan programot, amely meghatározza hogy a körön belül hány egész értékű koordinátapont van.

E08

Írjon programot, amely megoldja a következő egyenletet különböző n (n=1,2,...) értékekre:
Meddig van értelme n értékét növelni? Különbözik-e ez az érték az egyes implementációkban?

E11

Írjon programot, amely meghatározza, hogy az adott gépen hány értékes tizedes jegy használható a valós számok esetében!

E13

Közelítsük a  értékét úgy, hogy a kör kerülete helyett egyre növekvő oldalszámú szabályos érintő/húr-sokszögek kerületével számolunk. Meddig van értelme az oldalszám növelésének?

E25

Írjon programot, amely kiszámítja az n-edik Fibonacci számot.
Ehhez tudjuk: F0=0, F1=1, ... Fn=Fn-1+Fn-2, ahol n=2,3,4,5,...

M12d

Oldja meg numerikusan a következő egyenletet.

     sin(x)=x^2

M13b

Számítsa ki numerikus integrálással a következő integrált. A számítást különböző módszerekkel is végezze el.
 

E15

Olvasson be két dátumot (év, hónap, nap) és állapítsa meg a közöttük levő napok számát!


E26

Írjon programot, amely kiszámítja a beolvasott utolsó 10 valós szám átlagát. A számok végét a 0 jelzi, mely már nem számít az átlagba. Értelemszerűen, ha nem érkezik 10 szám, akkor a meglevő számok átlagát kell kiszámolni.

R08

Írjon programot, amely beolvas maximum N pozitív egész számot! A beolvasás végét a 0 érték jelzi. A beolvasott számokat rendezze (tetszőleges módszerrel) növekvő sorrendben.

R10

Írjon programot, amely rendez egy maximum NxN méretű mátrixot soronként a k-adik oszlop szerint! A mátrix elemei lehetnek véletlen számok vagy beolvashatók az inputról.



S01

Írjunk programot, amely beolvas egy sort N méretű szabványos PASCAL stringbe. Ha sor rövidebb, mint N a string vége szóközöket tartalmazzon. Tegyük fel, hogy nem használhatja a read utasítást közvetlenül a szabványos PASCAL string beolvasására.

S02

Írjunk programot, amely megkeres stringet egy másik stringben. Értelemszerűen a rész string rövidebb, ezért értelmezzük úgy, hogy az első szóköz karakterig tart.

S03

Írjunk programot, amely megfordít stringet.

S04

Írjunk programot, amely az összes előforduló c karaktert törli a beolvasott stringből.

S05

Írjunk programot, amely egyesít két stringet. A stringet logikailag a szóköz karakterig tartanak.

S06

Írjon karakterkészlet fordító programot: adott egy char indexű és char elemű tömb, melynek c1 edik indexű helyén az a karakter van, melyet c1 helyére kell tenni. Csak az ábrázolható karakterekkel foglalkozzunk, azaz legyen a tömb indexe 32 és 127 között. Töltse fel fordítva! Kódoljon egy beolvasott stringet ilyen módszerrel.

S07

A Turbo Pascal string implementációját használva rendezzen egy neveket tartalmazó tömböt tetszőleges módszerrel, majd keressen a tömbben lineáris és bináris kereséssel.



R03

Írjon olyan rendező eljárást megvalósító programot, amely egy integer elemeket tartalmazó tömböt úgy rendez, hogy a legkisebb elem kerüljön az 1. helyre, a következő a 20. helyre, az ezt követő a 2. helyre, majd a 19. helyre stb. (orgonasíp).

R02

Adott a következő deklaráció:

const     N=10;
type    tomb = array [1..N] of integer;
    dtomb = array [1..2*N] of integer;
var    tt1,tt2:tomb;
    tt:dtomb
Tegyük fel, hogy a tt1,tt2 tömbök rendezettek, és adottak! Írjunk programot, amely előállítja a tt tömböt az előző kettőből, úgy hogy azoknak minden elemét tartalmazza, és rendezett legyen! A tömbök elemeit beolvasással töltsük fel, majd rendezzük, vagy eleve rendezetten adjuk meg.


E24

Meg kell állapítani, hogy az alábbi programrészek hatására mi fog kiíródni. Az is fontos, hogy mi kerül új sorba. A részletek egy olyan programban helyezkednek el, amelynek a deklarációs része a következő:
const   n=2;
type  tomb =array [1..n] of boolean;
      r    =record
              nev :packed array [1..2] of char;
              suly :integer;
            end;
      rectomb =array [1..3] of r;
      halmaz  =set of 1..30;
lakas =(alberlet,tarsberlet,foberlet,orok,kastely);
var  e1,e2,e3 :integer;
     v1,v2,v3 :real;
     b1,b2,b3 :boolean;
     ch1,ch2,ch3 :char;
     rect  :rectomb;
     t1 :array [1..10] of integer;
     t2 :array [1..n] of tomb;
     l1,l2 :lakas;
     h1,h2,h3 :halmaz;
procedure s (var j :integer;  k :integer);
  var  e1 :integer;
  begin
    e1:=j+1;
    j:=j div k;
    k:=k-e1;
    writeln(e1:5, j:5, k:5);
  end;
function  f (l,m :integer) :boolean;
  begin
    f:=l+m<10;
  end;

E24a

e1:=6; b1:=odd(e1); b2:=not odd( succ( succ(e1) ) );
t2[1,1]:=b1;
t2[1,2]:=not b2;
t2[2,1]:=(ord( not b1 ) + ord( b2 )) mod 2 = 0;
t2[2,2]:=t2[1,1] or t2[2,1];
for e1:=1 to 2 do
for e2:=1 to 2 do  write (t2[e1,e2]:6);

E24b

ch1:='a'; ch2:='b'; e3:=0;
for e1:=3 downto 1 do with rect[e1] do
begin
   e3:=e3+e1;
   nev[1]:=ch1; nev[2]:=ch2; suly:=e3;
   ch1:=succ(ch1); ch2:=succ(ch2);
end;
for e1:=1 to 3 do
   writeln(rect[e1].nev,rect[e1].suly:4);

E24c

h1:=[]; l1:=alberlet;
while l1<orok do begin  l1:=succ(l1); h1:=h1+[ord(l1)]; end;
h2:=[];
for l1:=alberlet to kastely do
 if odd( ord(l1) ) then h2:=h2+[ord(l1)];
h3:=h1-h2;
for e1:=1 to 10 do
   if e1 in h3 then write(e1:3);
writeln;

E24d

e1:=7;  e2:=2;
while  f(e1,e2) do
begin
   s(e1,e2);
   e1 := e1+2*e2;  e2:=pred(e2) + e2 mod 2;
end;

E24e

h1:=[2];
for e1:=3 to 20 do
begin
   b1:=false; e2:=2;
   while not b1 and (e2<e1) do
   begin
      if e2 in h1 then b1 := e1 mod e2 = 0;
      e2 := e2+1;
   end;
   if not b1 then h1 :=h1+[e1];
end;
for e1:=1 to 20 do if e1 in h1 then write(e1:3);
writeln;

R01

Írjunk programot, amely képes maximum 100 számjegyű pozitív egész számokat összeadni. A 'nagy' számokat egy karakter tömbben célszerű ábrázolni. A számokat soronként érdemes beolvasni. A sor végét az EOLN függvény jelzi. Az egyes részfeladatokat (beolvasás, öszeadás, kiiratás, esetleg szorzás) külön eljárással, vagy függvénnyel valósítsa meg!

E22

Írjon programot, amely alkalmas valós számok közötti műveletek végzésére! Az input soronként
szám
műveleti jel
szám
műveleti jel
...
A megengedett műveleti jelek:   + - * / ^ =
Az utolsó jel az egyenlőségjel (=) a ^ hatványozást jelöli.
A műveletek között nincs precedencia, azaz mindegyiket azonnal el kell végezni.

E23

Írjon programot, amely alkalmas egész számok közötti műveletek végzésére! Az input legyen egy sor! Például:
123+23-8^2=
Feltehetjük, hogy az eredmény ábrázolható egész számként, azaz a túlcsordulást elég szorgalmi feladatként figyelembe venni.


M11

Írjon programot amely egy (PostScript) file-ban talált ún. literálokat kiírja. Literálnak a "("-lel kezdődő és ")"-el végződő karaktersorozatokat nevezzük. Egy ilyen (PostScript) file-ban egymásba ágyazott "(" ")" jelek még literálon belül is előfordulhatnak. Azokat a "(" ,")" jeleket amik nem párban fordulnak elő a következőképpen kell megadni :
\\ ---> \
\( ---> (
\) ---> )
Ha a "\" karakter után más egyéb karakter van, akkor a "\" karaktert figyelmen kívül hagyjuk. Jelezze, ha a file végéig nincs meg minden "("-nak a ")" párja!

M08

Írjon programot, amely kiszűri az inputon beolvasott PASCAL programból a megjegyzéseket! Ügyeljen arra, hogy a szabványos PASCAL-ban egyaránt megengedett a {...} és a (*...*) komment-pár, valamint ezek tetszőleges kombinációja. Továbbá ügyeljen arra is, hogy a szövegkonstansokon ('...') belül a megjegyzés zárójelek elvesztik jelentésüket!



E28

Adott a következő program:
PROGRAM E28(INPUT,OUTPUT);
VAR A,B:INTEGER;
   FUNCTION F(VAR I:INTEGER;J:INTEGER):BOOLEAN;
   VAR X:INTEGER;
      PROCEDURE P(X:INTEGER;VAR Y:INTEGER);
      VAR Z:INTEGER;
      BEGIN
      Z:=1;
      WHILE X+Y+Z<5 DO
         BEGIN
         P(X+1,Z);
         Y:=X+Z;
         END;
      END;
   BEGIN
   X:=4;
   P(J,I);
   I:=X-1;
   F:=I+J+X<10;
   END;
BEGIN
A:=1;
B:=A+1;
WHILE F(A,B) DO
   B:=B+2;
END.
Mennyi az A és B változó értéke a program záró END-je előtt?
Hány példány él egyszerre legtöbb a P eljárásból?
Hány deklarációs szinttel van feljebb ekkor az A változó?
Hány hívási szinttel van feljebb ekkor a B változó?
Mennyi ekkor a nevük szerint elérhető (látható) változók száma?
Mennyi ekkor a nevük szerint elérhető (látható) szegmensek száma?

P02

Írjon olyan eljárást. mely a Pascal háromszög egy sorát írja ki. Az eljárás paramétere a sor száma. Emlékeztetőül: a Pascal háromszög n. sora (n=0,1,2,...) tartalmazza az   mennyiségeket, ahol k=0,1,2,...n. A következőképpen kezdődik a Pascal háromszög:
                        1
                    1        1
                1        2        1
            1        3        3        1
        1        4        6        4        1
    1        5        10        10        5        1
Oldjuk meg a feladatot ciklussal és rekurzióval is. Figyeljük meg a rekurzív megoldás előnyét!

P03

Írjunk programot, amely megoldja a 'Hanoi tornyai' néven ismert feladványt. Adott három pálcika, az egyiken különböző nagyságú korongok. A legnagyobb korong van legalul, a legkisebb legfelül. Mozgassuk át a korongokat egy másik pálcikára úgy, hogy végül ott is a legnagyobb legyen legalul, de a mozgatás során egyszer se forduljon elő, hogy egy nagyobb korong egy kisebb tetejére kerül.

P10

Írjon programot, amely kiszámítja két pozitív egész szám legnagyobb közös osztóját.

P04

Írjunk programot, amely generálja az összes olyan 'a' és 'b' karakterekből álló adott hosszúságú (max.40) szót, amely nem tartalmaz két egymást követő 'b' betűt.

P05

Írjunk programot, amely beolvas egy karaktersorozatot (pld. EOLN-ig), majd kiírja a beolvasott betűk összes permutációját (az esetleges ismétlődéseket ne vizsgálja).
Például:
abc --> abc, bca, cab, cba, bac, acb.


D01

A standard inputról sorokat olvasunk. Minden sor szerkezete azonos, és feltehetjük, hogy egyik sor sem hibás. A sor elején betűk állnak, amelyek egy helységnevet reprezentálnak. A helységnevek végét egy space karakterrel érzékelhetjük. 20 betűnél hosszabb helységnevünk biztos, hogy nincs. A helységnév után annak irányítószáma áll, majd vége is van a sornak. Nem tudjuk előre, hogy mennyi helységnevet fogunk olvasni, de azt tudjuk, hogy befér a memóriába.

D01a

Olvassuk be az adatokat egy egyirányú láncolt listába, de a lista az irányítószám szerint legyen rendezett, azaz már a beolvasás során kerüljenek helyükre az adatok. Így tulajdonképpen megyénként tudjuk csoportosítani a helységneveket. Csak standard pascal utasításokat használjunk! Egy kiíratással ellenőrizzük megoldásunk helyességét!

D01b

Feladatunkat módosítsuk úgy, hogy használjunk ún. strázsákat. Ennek lényege, hogy a listában van két olyan elem, amelyet csak arra használunk, hogy a lista eleje és vége ne legyen kitüntetve. Ez akkor lehetséges, ha a rendezés szempontjából fel lehet venni abszolút minimumot, ill. maximumot. Esetünkben ez teljesül, hiszen biztos, hogy minden irányítószám 999 és 10000 között van.

D01c

Feladatunkat módosítsuk úgy, hogy a lista két irányban legyen láncolva.

D01d

A feladatot tovább módosítva, oldjuk meg, hogy a rendezés ne csak irányítószám szerint, hanem a helységnevek szerint is történjen meg. Így logikailag két listát kezelünk, de valójában tároljuk ezeket közös adatszerkezetben! Ne foglalkozzunk az ékezetes betűkkel.


D03

A standard inputról sorokat olvasunk. A sorok elejét (vagy a teljes sort) adott hosszú karakterláncokban tároljuk. A sorok hátralevő részét hagyjuk figyelmen kívül.

D03a

Tegyük bináris fába a karakterláncokat, tárolva az esetleges ismétlődések darabszámát is.

D03b

Írjuk ki az így kapott bináris fa alapján a beolvasott karakterláncokat ABC sorrendben.

D03c

Keressünk egy karakterláncot a bináris fában.

D03d

Mentsük el egy állományba a bináris fát.


R04

Írjunk programot, amely kiírja egy bináris file-ba egy adott konstansig (pld. 100) az összes pozitív egész számot!

R05

Írjunk programot, amely egy adott nevű (pld. 'alma.bin'), integer típusú adatokat tartalmazó bináris file-ban levő értékeket összeadja, és kiírja az eredményt! A megoldáshoz használni kell a nem szabványos, de elterjedt assign eljárást.

R09

Adott a következő deklaráció:
type myfile = file of real;
procedure merge(var f1,f2,f3:myfile);
Az f1 és f2 file tartalma rendezett, és egyik sem üres. Írjuk meg a merge eljárást, amely az f3 file tartalmát úgy állítja elő az előző kettőből, hogy azoknak minden adatát tartalmazza, és szintén rendezett lesz. Az f1 és f2 file-ok olvasásra, az f3 file értelemszerűen írásra van megnyitva. A file ok tartalma nem fér be a memóriába.


R07

Egy számítógépes programmal a következő személyi adatokat szeretnénk nyilvántartani:
    - Név (max 30 betű)
    - Lakóhely helység (max 20 betű)
    - Közelebbi cím - pld. utca, házszám (max 20 betű)
    - Irányítószám
    - Születési dátum - (11 karakter) pld. 1993.11.03.
    - Nem (férfi/nő)
    - Státusz, úgymint: gyerek, felnőtt, nyugdíjas
        - Gyermekek esetén a közösségben eltöltött évek száma
        - Felnőttek esetében az éves bruttó jövedelem
        - Felnőtt férfiak esetében a leszolgált katonaidő hónapokban
        - Felnőtt nők esetében a gyermekek száma
        - Nyugdíjasok esetében a havi nyugdíj összege

R07a

Definiálja a feladat megoldásához szükséges adatszerkezetet! Feltehetjük, hogy maximum 500 adatunk lesz.

R07b

Írjon egy programot, amely a standard inputról feltölti az adatszerkezetet! Használja a standard input átirányítást! Célszerű minden rekordot egy sorban ábrázolni.

P09

Írjon programot, amely el tudja dönteni, hogy a kakaó automatából tudunk-e kakaót vásárolni. Feltesszük, hogy az automata csak pontos értéket fogad el. Bemeneti adat a kakaó ára és a nálunk levő pénzérmék címletei és azok darabszáma címletenként.

P11

Írjon programot, amely megoldja a 8 kiránynő problémát.

P12

Egy adott mátrix sorait rendezzük át úgy, hogy a főátlóban levő elemek monoton csökkenő sort alkossanak.