home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
modula2
/
library
/
fst
/
mod2brd1
/
primzahl.mod
< prev
next >
Wrap
Text File
|
1990-04-08
|
6KB
|
172 lines
MODULE prim;
(**********************************************************************
Primzahlen.
Dieses Programm kann Primzahlen zwischen 1 und 65000 berechnen.
Die Grenzen, in welchen die Primzahlen berechnet werden sollen,
können explizit angegeben werden.
Z. B. nur die Primzahlen zwischen 50 und 250.
**********************************************************************)
FROM InOut IMPORT ReadCard,
WriteCard,
WriteString,
WriteLn;
FROM MathLib0 IMPORT sqrt;
CONST
Max = 65000; (* groesztmoegliche Zahl *)
TYPE
primarray = ARRAY[1..Max] OF BOOLEAN;
VAR
primt : primarray; (* "Wahrheitswerte" der Zahlen 1 bis Max *)
k, n, anzahlprim : CARDINAL;
(*******************************************************************)
(* PROCEDURE Init *)
(*******************************************************************)
(* -Gibt eine Nachricht aus. *)
(* -Setzt die Variablen k, n auf 0. *)
(* -Setzt primt[1] auf FALSE *)
(* -Setzt primt[2..Max] auf TRUE *)
(*******************************************************************)
PROCEDURE init();
VAR
zahl : CARDINAL;
BEGIN
WriteLn; WriteLn;
WriteString('Das Programm berechnet Primzahlen nach dem Sieb ');
WriteString('des Eratosthenes.');
WriteLn;
k:=0;
n:=0;
primt[1]:=FALSE;
FOR zahl:=2 TO Max DO
primt[zahl]:=TRUE;
END;
END init;
(*******************************************************************)
(* PROCEDURE LeseZahl *)
(*******************************************************************)
(* Liest eine Zahl ein und gibt sie an das aufrufende Prg zurueck. *)
(* Die zurueckgegebene Zahl erfuellt folgende Bedingung: *)
(* min <= zahl <= max *)
(*******************************************************************)
PROCEDURE lesezahl(min, max : CARDINAL) : CARDINAL;
VAR
z : CARDINAL;
BEGIN
REPEAT
WriteString('Bitte eine Zahl zwischen ');
WriteCard(min, 0);
WriteString(' und ');
WriteCard(max, 0);
WriteString(' eingeben: ');
ReadCard(z);
WriteLn;
UNTIL (z>=min) AND (z<=max);
RETURN z;
END lesezahl;
(*******************************************************************)
(* PROCEDURE PrimBerechnung *)
(*******************************************************************)
(* Berechnet die Primzahlen von 2 bis Max. *)
(*******************************************************************)
PROCEDURE primberechnung(p : primarray);
VAR
zahl, vielfache, wurzel : CARDINAL;
maxnreal : REAL;
BEGIN
WriteLn;
WriteString('Bitte warten - es können Primzahlen von 2 bis ');
WriteCard(Max, 0);
WriteLn;
WriteString('berechnet werden.');
WriteLn;WriteLn;
maxnreal:=FLOAT(Max);
wurzel:=TRUNC(sqrt(maxnreal));
FOR zahl:=2 TO wurzel DO
IF primt[zahl] THEN
vielfache:=zahl+zahl;
WHILE (vielfache<=Max) DO
primt[vielfache]:=FALSE;
vielfache:=vielfache+zahl;
END;
END;
END;
END primberechnung;
(*******************************************************************)
(* PROCEDURE PrimAusgabe *)
(*******************************************************************)
(* -Gibt die Primzahlen zwischen min und max aus. *)
(* -Zusaetzlich wird ausgegeben, wieviele Primzahlen gefunden *)
(* wurden. *)
(*******************************************************************)
PROCEDURE primausgabe(min, max : CARDINAL);
VAR
zahl, counter : CARDINAL;
BEGIN
WriteLn;
WriteString('Primzahlentabelle:'); WriteLn;
WriteString('------------------'); WriteLn;
WriteLn;
counter:=1;
anzahlprim:=0;
FOR zahl:=min TO max DO
IF primt[zahl] THEN (* Falls Primzahl *)
WriteCard(zahl, 7); (* dann ausgeben und *)
INC(counter);
INC(anzahlprim); (* anzahlprim erhoehen *)
END;
IF (counter=11) THEN (* dient zur schoenen Ausgabe *)
counter:=1;
WriteLn;
END;
END;
WriteLn; WriteLn;
WriteCard(anzahlprim, 0);
WriteString(' Primzahlen ausgegeben.');
WriteLn; WriteLn;
END primausgabe;
(*******************************************************************)
(* PROCEDURE sde *)
(*******************************************************************)
(* Sieb des Eratosthenes: *)
(* Installiert das Programm, berechnet die Primzahlentabelle, *)
(* liest k und n ein und gibt die Primzahlen aus. *)
(*******************************************************************)
PROCEDURE sde;
BEGIN
init;
primberechnung(primt);
k:=lesezahl(1, Max-10);
n:=lesezahl(k+1, Max);
primausgabe(k, n);
WriteString('Auf Wiedersehen bis zum naechsten Mal...');
WriteLn; WriteLn;
END sde;
(*******************************************************************)
(* Hauptprogramm *)
(*******************************************************************)
BEGIN
sde;
END prim.