home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / nummern / nummern2.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-10-31  |  4.7 KB  |  207 lines

  1. program nummerungstechnik;
  2. (* Version für TURBO/QUICK PASCAL                *)
  3. (* Statische Methode, expliziter SELF-Bezeichner *)
  4. (* QUICK-Pascal würde aufgrund des SELF-Bezeichners selbst zwischen *)
  5. (* formalen Parametern und lokalen Variablen unterscheiden können. *)
  6. (*
  7.    Damit das Programm auch unter QUICK-Pascal läuft,
  8.    muß folgendes ergänzt werden:
  9.     Compiler-Direktive M+
  10.    Ferner im Hauptprogramm:
  11.     new(alle)
  12.     new(ekonsnr); new(eannr); new(isbnnr)
  13.     dispose(alle)
  14. *)
  15.  
  16. uses CRT;
  17.  
  18. const max = 10;     (* Maximallänge der Gewichtungen *)
  19.  
  20. type zk = string;
  21.      bereich = array[1..max] of integer;
  22.      modus_typ = (berechnen,pruefen);
  23.      nummern_typ = (kontonr,artikelnr,buchnr);
  24.  
  25.      nummer =  object
  26.       no: zk;
  27.       gewicht: bereich;
  28.       modus: modus_typ;
  29.       nummern: nummern_typ;
  30.       summe,laenge,anzahl: integer;
  31.       pz: char;
  32.       procedure init(initno:zk;initmodus:modus_typ;
  33.                      initnummer:nummern_typ);
  34.       procedure zgs;
  35.       procedure ausgabe;
  36.       function pruefziffer_modulo10:char;
  37.       function pruefziffer_modulo11:char;
  38.       function gueltig:boolean;
  39.       procedure bilden;
  40.     end;
  41.  
  42.     ekons = object(nummer)
  43.       procedure initgewichtung;
  44.     end;
  45.  
  46.     ean = object(nummer)
  47.       procedure initgewichtung;
  48.     end;
  49.  
  50.     isbn = object(nummer)
  51.      procedure initgewichtung;
  52.     end;
  53.  
  54. var ekonsnr: ekons;
  55.     eannr: ean;
  56.     isbnnr: isbn;
  57.     alle: nummer;
  58.     nr: zk;
  59.     m: modus_typ;
  60.     n: nummern_typ;
  61.  
  62. procedure eingabe(var nr: zk;var modus:modus_typ;
  63.                   var nummerung:nummern_typ);
  64. const maxlaenge:array[1..6] of integer = (0,0,12,13,9,10);
  65. var c: char; h,l: integer;
  66. begin
  67.  repeat
  68.   write('EKONS (1), EAN (2), ISBN (3) oder ENDE (0): ');
  69.   c := ReadKey; writeln(c); h := ord(c)-48;
  70.  until h in [0..3];
  71.  case h of
  72.   0: halt;
  73.   1: n := kontonr;
  74.   2: n := artikelnr;
  75.   3: n := buchnr
  76.  end;
  77.  repeat
  78.   write('Modus (1 = erzeugen, 2 = prüfen): ');
  79.   c := ReadKey; writeln(c)
  80.  until c in ['1'..'2'];
  81.  if c = '1' then modus := berechnen else modus := pruefen;
  82.  repeat
  83.   write('Eingabe: '); readln(nr); l := length(nr)
  84.  until (h = 1) or (l = maxlaenge[h*2-1]+ord(modus))
  85. end;
  86.  
  87. procedure nummer.init(initno:zk;initmodus:modus_typ;
  88.                       initnummer:nummern_typ);
  89. begin
  90.  self.no := initno;
  91.  self.modus := initmodus;
  92.  self.nummern := initnummer;
  93.  self.laenge := length(self.no)
  94. end;
  95.  
  96. procedure nummer.bilden;
  97. var h: string[1];
  98. begin
  99.  self.zgs;
  100.  if n = buchnr then
  101.   h := self.pruefziffer_modulo11
  102.  else
  103.   h := self.pruefziffer_modulo10;
  104.  self.no := concat(self.no,h)
  105. end;
  106.  
  107. procedure nummer.ausgabe;
  108. begin
  109.  writeln(self.no)
  110. end;
  111.  
  112. procedure ekons.initgewichtung;
  113. begin
  114.  with self do begin
  115.   anzahl := 3;
  116.   gewicht[1] := 7; gewicht[2]:= 3;gewicht[3] := 1
  117.  end
  118. end;
  119.  
  120. procedure ean.initgewichtung;
  121. begin
  122.  self.anzahl := 2;
  123.  self.gewicht[1] := 3; self.gewicht[2] := 1
  124. end;
  125.  
  126. procedure isbn.initgewichtung;
  127. var i: integer;
  128. begin
  129.  self.anzahl := 10;
  130.  for i := 1 to 10 do self.gewicht[i] := self.anzahl - i + 1
  131. end;
  132.  
  133. procedure nummer.zgs;
  134. var i, wert, x: integer;
  135. begin
  136.  i := self.anzahl - self.laenge mod self.anzahl;
  137.  if self.modus = pruefen then i := i + 1;
  138.  if i > self.anzahl then i := 1;
  139.  self.summe := 0; x := 0;
  140.  repeat
  141.   x := x + 1;
  142.   if upcase(self.no[x]) = 'X' then wert := 10
  143.   else
  144.   wert := ord(self.no[x]) - 48;
  145.   self.summe := self.summe + wert * self.gewicht[i];
  146.    writeln(x:3,i:3,wert:5,self.gewicht[i]:3,
  147.            wert * self.gewicht[i]:5,self.summe:10);
  148.   i := i + 1;
  149.   if i > self.anzahl then i := 1
  150.  until x = self.laenge
  151. end;
  152.  
  153. function nummer.pruefziffer_modulo10:char;
  154. var h: integer;
  155. begin
  156.  h := 10 - self.summe mod 10;
  157.  if h = 10 then h := 0;
  158.  pruefziffer_modulo10 := chr(h + 48)
  159. end;
  160.  
  161. function nummer.pruefziffer_modulo11:char;
  162. var h: integer;
  163. begin
  164.  h := 11 - self.summe mod 11;
  165.  if h = 11 then h := 0;
  166.  if h = 10 then h := 40;
  167.  pruefziffer_modulo11 := chr(h + 48)
  168. end;
  169.  
  170. function nummer.gueltig:boolean;
  171. begin
  172.  self.summe := 0;
  173.  self.zgs;
  174.  if n = buchnr then
  175.   gueltig := self.summe mod 11 = 0
  176.  else
  177.   gueltig := self.summe mod 10 = 0
  178. end;
  179.  
  180. begin
  181.  eingabe(nr,m,n);
  182.  case n of
  183.   kontonr: begin
  184.             ekonsnr.initgewichtung; alle := ekonsnr
  185.            end;
  186.   artikelnr: begin
  187.               eannr.initgewichtung; alle := eannr
  188.              end;
  189.   buchnr: begin
  190.            isbnnr.initgewichtung; alle := isbnnr
  191.           end;
  192.  else begin writeln('Undefinierter Nummerntyp'); halt end
  193.  end;
  194.  with alle do
  195.   begin
  196.    init(nr,m,n);
  197.    if m = berechnen then
  198.     begin
  199.      bilden;
  200.      ausgabe
  201.     end
  202.    else
  203.    if gueltig then writeln('GÜLTIG') else writeln('UNGÜLTIG');
  204.   end;
  205.   readln
  206. end.
  207.