Einführung
in die imperative Programmierung
WS 2018/19
for-Schleife
program ForSchleife;
var
i: integer;
summe: integer;
BEGIN
summe:=0;
for i:=1 to 100 do
begin
summe:= summe + i;
end;
writeln(i,' ',summe)
END.
while-Schleife
program WhileSchleife;
var
i: integer;
summe: integer;
BEGIN
summe:=0;
i:=0;
while (i<100) do
begin
i:=i+1;
summe:= summe + i;
end;
writeln(i,' ',summe)
END.
repeat-Schleife
program RepeatSchleife;
var
i: integer;
summe: integer;
BEGIN
summe:=0;
i:=0;
repeat
i:=i+1;
summe:= summe + i;
until i=100;
writeln(i,' ',summe)
END.
Strings
program zeichenkette;
var
wort: string;
laenge,i: integer;
BEGIN
readln(wort);
laenge := length(wort);
for i:= laenge downto 1 do
write(wort[i]);
writeln;
END.
Aufgabe 1
program aufg1;
var
Eingabe,Maximum: integer;
BEGIN
readln(Eingabe);
Maximum:=Eingabe;
while Eingabe<>0 do
begin
if Eingabe > Maximum then
Maximum := Eingabe;
readln(Eingabe);
if Eingabe=0 then
writeln('Maximum: ',Maximum);
end;
if (Maximum=0) then
writeln('Leere Eingabefolge')
END.
Aufgabe 2
program merge (input, output);
{ liest ohne Eingabeueberpruefung zwei sortierte Felder mit
integer-Zahlen ein; beide Felder werden in einem weiteren Feld
sortiert zusammengefuegt; das Ergebnis wird ausgegeben; ist
die Eingabe unsortiert, so ist das Ergebnisfeld undefiniert }
const
FELDLAENGE1 = 5;
FELDLAENGE2 = 8;
ERGEBNISFELDLAENGE = 13; { FELDLAENGE1 + FELDLAENGE2 }
type
tFeld1 = array [1..FELDLAENGE1] of integer;
tFeld2 = array [1..FELDLAENGE2] of integer;
tErgebnisFeld = array [1..ERGEBNISFELDLAENGE] of integer;
var
Feld1 : tFeld1;
Feld2 : tFeld2;
ErgebnisFeld : tErgebnisFeld;
i : integer;
j : integer;
k : integer;
begin
{ sortierte Felder einlesen }
writeln ('Bitte', FELDLAENGE1:2, ' Werte des ersten Feldes ',
'sortiert eingeben!');
for i := 1 to FELDLAENGE1 do
readln (Feld1[i]);
writeln ('Bitte', FELDLAENGE2:2, ' Werte des zweiten Feldes ',
'sortiert eingeben!');
for j := 1 to FELDLAENGE2 do
readln (Feld2[j]);
{ Verschmelzungsprozess beginnen }
i:=1;
j:=1;
k:=1;
repeat
if Feld1[i]>=Feld2[j] then
begin
ErgebnisFeld[k]:= Feld2[j];
j:=j+1;
end
else
begin
ErgebnisFeld[k]:= Feld1[i];
i:=i+1;
end;
k:=k+1;
until (i>FELDLAENGE1) or (j>FELDLAENGE2);
if i<=FELDLAENGE1 then
for j:=k to ERGEBNISFELDLAENGE do
begin
ErgebnisFeld[j]:= Feld1[i];
i:=i+1;
end
else
for i:=k to ERGEBNISFELDLAENGE do
begin
ErgebnisFeld[i]:= Feld2[j];
j:=j+1;
end;
writeln ('Das Ergebnisfeld ist:');
for k := 1 to ERGEBNISFELDLAENGE do
write (ErgebnisFeld[k], ' ');
writeln
end.
Brüche
program brueche;
type
tBruch = record
zaehler: integer;
nenner: integer;
end;
var
bruch1, bruch2, bruch3: tBruch;
function ggt(a,b:integer): integer;
begin
while a<>b do
if a>b then
a:=a-b
else
b:=b-a;
ggt:=a;
end; {ggt}
function kuerzen(b: tBruch): tBruch;
var
teiler:integer;
begin
teiler:=ggt(b.zaehler, b.nenner);
kuerzen.zaehler:= b.zaehler div teiler;
kuerzen.nenner:= b.nenner div teiler;
end; {kuerzen}
function addiere(x,y: tBruch) : tBruch;
var
ergebnis: tBruch;
begin
if x.nenner<>y.nenner then
begin
ergebnis.nenner:= x.nenner*y.nenner;
ergebnis.zaehler := x.nenner*y.zaehler + x.zaehler*y.nenner;
end
else
begin
ergebnis.nenner:= x.nenner;
ergebnis.zaehler := x.zaehler + y.zaehler;
end ;
addiere:=kuerzen(ergebnis);
end;
BEGIN
write('Bruch1 ');
readln(bruch1.zaehler);
readln(bruch1.nenner);
write('Bruch2 ');
readln(bruch2.zaehler);
readln(bruch2.nenner);
bruch3:= addiere( bruch1, bruch2);
write('Ergebnis: ', bruch3.zaehler, '/', bruch3.nenner);
END.
3+1-Problem
program dreipluseins;
var
Zahl: integer;
BEGIN
readln(Zahl);
while Zahl<>1 do
begin
if odd(Zahl) then
Zahl := Zahl*3+1
else
Zahl:= Zahl div 2;
writeln(Zahl);
end
END.
Fakultät rekursiv
{R+}
program fak;
var
n : integer;
function fak(n: integer): integer;
begin
if n=0 then
fak:=1
else
fak := fak(n-1) * n;
end;
BEGIN
readln(n);
writeln('Fakultät: ', fak(n));
END.
ggT rekursiv
program ggtRek;
var
a,b : integer;
function ggt(x,y: integer): integer;
begin
writeln(x,' ',y);
if x=y then
ggt:=x
else
if x>y then
ggt := ggt(x-y,y)
else
ggt := ggt(x,y-x)
end;
BEGIN
readln(a);
readln(b);
writeln('ggT: ', ggt(a,b));
END.
Türme von Hanoi
program hanoiRek;
var
n : integer;
step:integer;
procedure hanoi(n: integer;
von, ueber, nach: string);
begin
if n=1 then
begin
step:=step+1;
writeln(step,': ',von,'->',nach)
end
else
begin
hanoi(n-1,von, nach,ueber);
hanoi(1,von,ueber, nach);
hanoi(n-1,ueber,von,nach);
end;
end;
BEGIN
readln(n);
step:=0;
hanoi(n, 'A', 'B', 'C');
END.