größter gemeinsamer Teiler
Turmbau zu Babel
Es gibt schöne Programmiersprachen, es gibt häßliche Programmiersprachen, elegante und umständliche, leicht lesbare und kryptische.
Ich habe mir den Spaß gemacht, Programme zur Berechnung des größten gemeinsamen Teilers (ggT) in verschiedenen Programmiersprachen zu basteln – und zu sammeln. An diesen Programmen sieht man, dass Informatik sehr wohl etwas mit Kunst und Ästhetik zu tun hat, mit Kreativität, die in der Informatik sehr wichtig ist. Und mit Chaos und Durcheinander.
Auf meiner alten Homepage war diese Sammlung ein Renner, allerdings nur deshalb, weil die Berechnung des größten gemeinsamen Teilers in Java oder C++ eine beliebte Aufgabe für Einstiegskurse ins Programmieren ist. ich finde jedoch, dass es gerade für Programmiereinsteiger wichtig ist, sich an diesem Problem selber zu versuchen. Ich hoffe, dass diese Sammlung inspirierend wirkt und Lust am Programmieren mit sich bringt; damit das funktionieren kann, darf hier natürlich keine C++ oder Java-Variante dabei sein, ich bitte dies zu entschuldigen.
Alle folgenden Programme sind auf einem real existierenden Computer gelaufen, sie wurden von einem real existierenden Compiler übersetzt bzw. von einem Interpreter interpretiert; etwas betagte Rechner, Compiler, Interpreter vielleicht – aber das passt ja auch zu den betagten Programmiersprachen. Es sind keine “Fantasieprogramme” oder “Trockenprogramme” dabei.
Ada
--
-- Programm ggT.Ada
-- Berechnet den größten gemeinsamen Teiler
-- zweier Zahlen
-- Programmiersprache: Ada
--
WITH small_SP;
USE small_SP;
PROCEDURE do_ggT IS
FUNCTION ggT (x: Integer; y: Integer) Return Integer IS
BEGIN
IF x <= 0 THEN
Return y;
ELSE
Return ggT (y MOD x, x);
END IF;
END ggT;
Zahl1, Zahl2: Integer;
BEGIN
Put_Line ("Berechnung des größten "
"gemeinsamen Teilers zweier Zahlen.");
Put ("Erste Zahl eingeben: ");
Get (Zahl1);
Put ("Zweite Zahl eingeben: ");
Get (Zahl2);
Put ("Der größte gemeinsame Teiler ist: ");
Put_Line (ggT (Zahl1, Zahl2));
END do_ggT;
Forth
(
Programm ggT.4th
Berechnet den größten gemeinsamen Teiler
zweier Zahlen
Programmiersprache: Forth
)
: ggt
dup 0 = if drop else
over 0 = if swap drop else
over mod swap ggt then then ;
: start ." Größter gemeinsamer Teiler zweier Zahlen" cr
." Bitte erste Zahl eingeben: " accept
dup 1 < abort" Groesser als 0 sollte sie schon sein."
." Bitte zweite Zahl eingeben: " accept
dup 1 < abort" Groesser als 0 sollte sie schon sein."
ggt ." Der größte gemeinsame Teiler ist " . ;
COBOL
IDENTIFICATION DIVISION.
PROGRAM-ID.
GGT.
AUTHOR.
JÜRGEN.
DATE-WRITTEN.
21 JULI 1996.
REMARKS.
Dieses Programm berechnet den
größten gemeinsamen
Teiler zweier einzugebender Zahlen.
Programmiersprache: COBOL
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER.
Z80.
OBJECT-COMPUTER.
Z80.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 ZAHL-1 PICTURE IS 9(5).
01 ZAHL-2 PICTURE IS 9(5).
01 HILFSVARIABLEN.
05 X PICTURE IS 9(5).
05 Y PICTURE IS 9(5).
05 REST PICTURE IS 9(5).
05 DIV-ERG PICTURE IS 9(5).
05 MULT-DIV-ERG PICTURE IS 9(5).
01 ERGEBNIS PICTURE IS 9(5).
PROCEDURE DIVISION.
EINGABE.
DISPLAY 'Größter gemeinsamer Teiler.'.
DISPLAY 'Erste Zahl eingeben:'.
ACCEPT ZAHL-1.
IF ZAHL-1 IS LESS THAN 1
THEN PERFORM ZAHL-ZU-KLEIN.
DISPLAY 'Zweite Zahl eingeben:'.
ACCEPT ZAHL-2.
IF ZAHL-2 IS LESS THAN 1
THEN PERFORM ZAHL-ZU-KLEIN.
MOVE ZAHL-1 TO X.
MOVE ZAHL-2 TO Y.
BERECHNUNG.
IF X IS EQUAL TO 0 THEN
MOVE Y TO ERGEBNIS
GO TO FERTIG.
* REST = Y - (Y / X) Gerundet * X.
DIVIDE X INTO Y GIVING DIV-ERG ROUNDED.
MULTIPLY DIV-ERG BY X GIVING
MULT-DIV-ERG.
SUBTRACT MULT-DIV-ERG FROM Y
GIVING REST.
MOVE X TO Y.
MOVE REST TO X.
GO TO BERECHNUNG.
FERTIG.
DISPLAY 'Der größte gemeinsame Teiler von ',
ZAHL-1, ' und ', ZAHL-2, ' ist: ', ERGEBNIS.
STOP RUN.
ZAHL-ZU-KLEIN.
DISPLAY 'Na, größer als 0 sollte die Zahl '
'schon sein.'
STOP RUN.
Fortran
*
* Programm ggT.For
* Berechnet den größten gemeinsamen Teiler
* zweier Zahlen
* Programmiersprache: FORTRAN 77
*
Integer Zahl1, Zahl2
Integer ggT
Print *, 'Berechnung des ggT zweier positiver Zahlen.'
Print *, 'Bitte erste Zahl eingeben: '
Read (*,*) Zahl1
If (Zahl1 .le. 0) Then
Print *, 'Na, größer als 0 sollte die Zahl schon sein.'
Stop
EndIf
Print *, 'Bitte zweite Zahl eingeben: '
Read (*,*) Zahl2
if (Zahl2 .lt. 0) Then
Print *, 'Na, größer als 0 sollte die Zahl schon sein.'
Stop
Endif
write (*,33) Zahl1, Zahl2, ggT (Zahl1, Zahl2)
stop
33 format ('Der größte gemeinsame Teiler von ',
1 i8,' und ',i8,' ist ',i8)
End
Integer Function ggT (a, b)
Integer a, b, rest
If (a .lt. 0 .or. b .lt. 0) Then
ggT = 0
Return
EndIf
Loop
rest = b - (b / a) * a
b = a
a = rest
Until (rest .eq. 0)
ggT = b
Return
End
Lisp
;
; Programm ggT.L
; Berechnet den größten gemeinsamen Teiler
; zweier Zahlen
; Programmiersprache: LisP
;
(defun ggT (a b)
(cond ((< a 1) b)
((< b 1) a)
(t (ggT (mod b a) a))
)
)
(defun start ()
(patom "Berechnung des größten gemeinsamen "
"Teilers zweier Zahlen\n")
(patom "Bitte erste Zahl eingeben: ")
(setq x (read))
(patom "Bitte zweite Zahl eingeben: ")
(setq y (read))
(patom "Der größte gemeinsame Teiler ist: ")
(patom (ggT x y))
(patom "\n")
)
Logo
to ggt:y if (equalp
0) [output :y] output ggt (remainder :y
)
end to start print [Groesster gemeinsamer Teiler zweier Zahlen] print [Bitte erste Zahl eingeben:] make "zahl1 readword if lessp :zahl1 1 [pr [Positiv sollte die Zahl schon sein] stop] print [Bitte zweite Zahl eingeben:] make "zahl2 readword print [Groesster gemeinsamer Teiler ist:] if lessp :zahl2 1 [pr [Positiv sollte die Zahl schon sein] stop] print ggt :zahl1 :zahl2 end
ProLog
%
% Programm ggT.Pro
% Berechnet den größten gemeinsamen Teiler
% zweier Zahlen
% Programmiersprache: ProLog
%
ggT(N,0,N).
ggT(N,M,T):-
M > 0,
R is N mod M,
ggT(M,R,T).
start():-
write("Größter gemeinsamer Teiler."),
nl,
write("Bitte erste Zahl eingeben: "),
read(X),
write("Bitte zweite Zahl eingeben: "),
read(Y),
ggT(X,Y,Z),
write("Groesster gemeinsamer Teiler ist: "),
write(Z),
nl.