PMG/Programmierparadigmen/Seite Pascal

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Pascal</language>
== Aufgabe 1 ==

Es soll eine Funktion '''ringarea''' definiert werden, die die Fläche berechnet, die zwischen den beiden konzentrischen Kreisen mit den Radien r1 und r2 liegt. 
 


<code id="4e80d2987ce11">
 function ringarea (r1, r2:real):real;
 begin
 result:=pi*r1*r1-pi*r2*r2
 end;
</code>

<run id="4e80d2987ce77">

</run>



== Aufgabe 2 ==
Ermitteln Sie die Summe einer beliebigen Anzahl natürlicher Zahlen:
<math>S=\sum^n_{i=0}i=1 + 2 + 3 + ... + n</math>.<br />


<code id="4e82bb392f28d" >
function summe_erste_n(n:integer):integer;
var i, summe:integer;
begin
for i:=1 to n do summe:=summe+i;
result:=summe;
end;
</code>

<run id="4e82bb392f693">
writeln(inttostr(summe_erste_n(5)));
</run>

== Aufgabe 3 ==
Gegeben ist die mathematische Definition der Fakultätsfunktion:

<blockquote>
<table>
<tr>
<td width="200" align="center">
<math>n!=\prod^n_{i=1}i=1 \cdot 2 \cdot 3 \cdot ... \cdot n</math>
</td>
<td width="100" align="center">bzw. rekursiv:</td>
<td width="200" align="center">
<math>n!=\begin{cases}1,\mbox{wenn}\hspace{0.3em}n=0\\n \cdot (n-1)!\end{cases}</math>
</td>
</tr>
</table>
</blockquote>


'''Beschreibung:'''
* Die Fakultät einer Zahl ist 1, wenn die Zahl 0 ist,
* anderenfalls berechnet sie sich aus dem Produkt dieser Zahl mit der Fakultät ihres Vorgängers.


<code id="4e82bb392f512">
function fak_rek(n:integer):integer;
begin
if n=0 then result:=1
       else result:=n*fak_rek(n-1);
end;
</code>

<run id="4e82bb392f8cd"> writeln(inttostr(fak_rek(3)));
</run>

Abarbeitung für n=4:

Aufruf <math>fak</math>_<math>rek(4):=4*fak</math>_<math>rek(3)</math>;

danach "Abstieg in die Rekursionstiefe": 

      <math>fak</math>_<math>rek(4):=4*fak</math>_<math>rek(3)</math>; 
          <math>fak</math>_<math>rek(3):=3*fak</math>_<math>rek(2)</math>;
              <math>fak</math>_<math>rek(2):=2*fak</math>_<math>rek(1)</math>;
                 <math>fak</math>_<math>rek(1):=1*fak</math>_<math>rek(0)</math>;

Für n=0 liefert das Verfahren den bekannten Wert 1.<br>
Der rekursive "Aufstieg" liefert dann: 
                <math>fak</math>_<math>rek(1):=1*1=1</math>;
                <math>fak</math>_<math>rek(2):=2*1=2</math>;
                <math>fak</math>_<math>rek(3):=3*2=6</math>;
                <math>fak</math>_<math>rek(4):=4*6=24</math>;

== Aufgabe 4 ==
Bei einer Mathematikolympiade wurde folgende Aufgabe gestellt:

 ''20 m Stoff werden auf einen Stab von 5 cm Durchmesser aufgewickelt.''<br>
 ''Der Stoff ist 1 mm dick.''
 ''Wie dick wird die Rolle?''

Eine Realisierung des Sachverhalts als Programm könnte folgendermaßen aussehen:

<code id="4e82bb392f589"> 
function dick:real;
var d, l:real;
begin
l:=0;
d:=0.05;
repeat
      l:=l+pi*d;
      d:=d+0.002;
until l>=20;
result:=d
end;
</code>

<run id="4e81dd7f13567">
writeln(floattostr(dick));
</run>



<font color="darkgreen">Sie werden festgestellt haben, dass unsere Lösung für die Problemstellung keinem Algorithmus entspricht. Es wird lediglich ein konkretes Problem durch Programmierung gelöst!</font>
<br>
<font color="darkgreen">'''Die Aufgabe wird im Folgenden also verallgemeinert. Der aufzustellende Algorithmus löst dann eine Klasse gleichartiger Probleme, wobei die Abarbeitung abhängig von den Eingaben eindeutig, endlich erfolgt und unter gleichen Bedingungen zum gleichen Ergebnis führt.'''</font>

'''''Stoff beliebiger Länge wird auf einen Stab mit beliebigem Durchmesser aufgewickelt.''<br>'''
'''''Der Stoff ist beliebig dick.'''''
'''''Wie dick wird die Rolle?''<br><br>'''

<code id="4e82bb392f5f8">
function dick3(stofflaenge,d,dicke:real):real;
var l:real;
begin
l:=0;
repeat
 l:=l+pi*d;
 d:=d+2*dicke;
until l>=stofflaenge;
result:=d
end;
</code>

<run id="4e82bb392f948">
writeln(floattostr(dick3(20,0.05,0.001)));
</run>

== Aufgabe 5 ==
Ein Turtlebeispiel

<canvas w=400></canvas>


<run id="4e82bb392f9ec">
selectCanvas(1);
canvas_clear(); // Zeichenfläche löschen
turtle_move(200,100); // Turtle in die Mitte stellen
turtle_penWidth(5);
turtle_penColor(255,0,0);  
turtle_forward(50);  
turtle_right(90); 
turtle_penColor(255,255,0);  
turtle_forward(50);  
turtle_right(90); 
turtle_penColor(0,255,0);  
turtle_forward(50);  
turtle_right(90); 
turtle_penColor(0,0,255);  
turtle_forward(50);  
turtle_right(90); 
turtle_hide();
</run>

== Aufgabe 6 ==
<code id="4e8aff45129cc">
function idealgewicht (groesse:real):real;
begin
result:=groesse-100-((groesse - 100) * 0.1);
end;
</code>
<run id="4e8affa478609">
writeln (idealgewicht(170))
</run>

== Aufgabe 6a ==
<code id="4e8aff45129cc">
function normalgewicht(groesse:real):real;
begin
result:=groesse-100;
end;
</code>
<run id="4e8affa478609">
writeln (normalgewicht(180))
</run>


==Aufgabe 7 ==
<code id="4e8b03e42dd3d">
procedure BMI (groesse, gewicht:real);
var b : real;
begin
b:=groesse-100;
if gewicht<=b*0.9 then writeln('Untergewicht')
                  else if (gewicht>b*0.9) and (gewicht<b) then writeln ('Idealgewicht')
                                                        else if gewicht>b*1.1 then writeln('Übergewicht') 
                                                                              else writeln ('Normalgewicht'); 
end;
</code>

<run id="4e8b03e42de22">
BMI(172,68);
</run>

== Aufgabe 8 ==


Aufgabe: Wie groß kann ich eine Pixelgrafik höchstens ausdrucken? 
Prinzipiell gilt, dass die Auflösung des Ausdruckes mindestens 300 dpi (Pixel pro Zoll) betragen soll, wenn man in guter Qualität drucken will. Eine Funktion "Papierformat" soll das größtmögliche Standardpapierformat (9x13, 10x15, 13x18, A5, A4, A3 usw.) ausgeben. Eingabeparameter sind die Länge und Breite des Pixelgrafik. Hinweis: 1 Zoll = 2,54 cm
<code>
function papierformat(x_pix,y_pix:integer):string;
var langeseite:integer;
var laenge_im_bild:real;
begin
if x_pix>y_pix then langeseite:=x_pix else langeseite:=y_pix;
laenge_im_bild:=langeseite/300*2.54;
case floor(laenge_im_bild)of
0..12: result := 'nicht druckbar';
13..14: result := '9x13';
15..17: result := '10x15';
18..20: result := '13*18';
21..28: result :='A5';
29..41: result :='A4';
else result:= 'egal';
end; //of case
end;

</code>

<run id="4e8b041bc9931">
</run>