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

  1. program nummerungstechnik;
  2. (* Version TURBO-Pascal 6.0 mit virtuellen Methoden *)
  3. (* i.e späte Bindung                                *)
  4. uses CRT;
  5.  
  6. const max = 10;
  7.  
  8. type zk = string;
  9.      bereich = array[1..max] of integer;
  10.      nummer_ptr = ^nummer;
  11.      modus_typ = (berechnen,pruefen);
  12.      nummern_typ = (kontonr,artikelnr,buchnr);
  13.  
  14.      nummer =  object
  15.       no: zk;
  16.       gewicht: bereich;
  17.       modus: modus_typ;
  18.       nummern: nummern_typ;
  19.       summe,laenge,anzahl: integer;
  20.       pz: char;
  21.       constructor init(initno:zk;initmodus:modus_typ;
  22.                      initnummer:nummern_typ);
  23.       procedure zgs; virtual;
  24.       procedure ausgabe; virtual;
  25.       function pruefziffer_modulo10:char; virtual;
  26.       function pruefziffer_modulo11:char; virtual;
  27.       function gueltig:boolean; virtual;
  28.       procedure bilden; virtual;
  29.       destructor done; virtual;
  30.     end;
  31.  
  32.     ekons = object(nummer)
  33.       procedure initgewichtung;
  34.     end;
  35.  
  36.     ean = object(nummer)
  37.       procedure initgewichtung;
  38.     end;
  39.  
  40.     isbn = object(nummer)
  41.      procedure initgewichtung;
  42.     end;
  43.  
  44. var ekonsnr: ^ekons;
  45.     eannr: ^ean;
  46.     isbnnr: ^isbn;
  47.     alle: ^nummer;
  48.     nr: zk;
  49.     m: modus_typ;
  50.     n: nummern_typ;
  51.     speicher, belegt: real;
  52.  
  53. (* ------------------------------------------------------------*)
  54. (*   Prozeduren, die keine Methoden sind                       *)
  55. (* ------------------------------------------------------------*)
  56.  
  57. procedure eingabe(var nr: zk;var modus:modus_typ;
  58.                   var nummerung:nummern_typ);
  59. const maxlaenge:array[1..6] of integer = (0,0,12,13,9,10);
  60. var c: char; h,l: integer;
  61. begin
  62.  repeat
  63.   write('EKONS (1), EAN (2), ISBN (3) oder ENDE (0): ');
  64.   c := ReadKey; writeln(c); h := ord(c)-48;
  65.  until h in [0..3];
  66.  case h of
  67.   0: halt;
  68.   1: n := kontonr;
  69.   2: n := artikelnr;
  70.   3: n := buchnr
  71.  end;
  72.  repeat
  73.   write('Modus (1 = erzeugen, 2 = prüfen): ');
  74.   c := ReadKey; writeln(c)
  75.  until c in ['1'..'2'];
  76.  if c = '1' then modus := berechnen else modus := pruefen;
  77.  repeat
  78.   write('Eingabe: '); readln(nr); l := length(nr)
  79.  until (h = 1) or (l = maxlaenge[h*2-1]+ord(modus))
  80. end;
  81.  
  82. procedure report(heapfrei_vor,belegt:real);
  83. var heapfrei_nach: real;
  84. begin
  85.   heapfrei_nach := MemAvail;
  86.   if heapfrei_vor = heapfrei_nach then
  87.    begin
  88.     writeln('Objekt belegt ',belegt:10:0,' Byte.');
  89.     writeln('Verbrauchter Heap ist wieder verfügbar.');
  90.    end;
  91. end;
  92.  
  93. constructor nummer.init(initno:zk;initmodus:modus_typ;
  94.                       initnummer:nummern_typ);
  95. var i: integer;
  96. begin
  97.  no := initno;
  98.  modus := initmodus;
  99.  nummern := initnummer;
  100.  laenge := length(no)
  101. end;
  102.  
  103. procedure nummer.bilden;
  104. var h: string[1];
  105. begin
  106.  zgs;
  107.  if n = buchnr then
  108.   h := nummer.pruefziffer_modulo11
  109.  else
  110.   h := nummer.pruefziffer_modulo10;
  111.  no := concat(no,h)
  112. end;
  113.  
  114. procedure nummer.ausgabe;
  115. begin
  116.  writeln(no)
  117. end;
  118.  
  119. procedure ekons.initgewichtung;
  120. begin
  121.  anzahl := 3;
  122.  gewicht[1] := 7; gewicht[2]:= 3; gewicht[3] := 1
  123. end;
  124.  
  125. procedure ean.initgewichtung;
  126. begin
  127.  anzahl := 2;
  128.  gewicht[1] := 3; gewicht[2] := 1
  129. end;
  130.  
  131. procedure isbn.initgewichtung;
  132. var i: integer;
  133. begin
  134.  anzahl := 10;
  135.  for i := 1 to 10 do gewicht[i] := anzahl - i + 1;
  136. end;
  137.  
  138. procedure nummer.zgs;
  139. var startindex, wert, x, i: integer;
  140. begin
  141.  startindex := anzahl - laenge mod anzahl;
  142.  if modus = pruefen then startindex := startindex + 1;
  143.  if startindex > anzahl then startindex := 1;
  144.  summe := 0; x := 0; i := startindex;
  145.  repeat
  146.   x := x + 1;
  147.   if upcase(no[x]) = 'X' then wert := 10
  148.   else
  149.   wert := ord(no[x]) - 48;
  150.   summe := summe + wert * gewicht[i];
  151.    writeln(x:3,i:3,wert:5,gewicht[i]:3,
  152.            wert * gewicht[i]:5,summe:10);
  153.   i := i + 1;
  154.   if i > anzahl then i := 1
  155.  until x = laenge
  156. end;
  157.  
  158. function nummer.pruefziffer_modulo10:char;
  159. var h: integer;
  160. begin
  161.  h := 10 -  summe mod 10;
  162.  if h = 10 then h := 0;
  163.  pruefziffer_modulo10 := chr(h + 48)
  164. end;
  165.  
  166. function nummer.pruefziffer_modulo11:char;
  167. var h: integer;
  168. begin
  169.  h := 11 -  summe mod 11;
  170.  if h = 11 then h := 0;
  171.  if h = 10 then h := 40;
  172.  pruefziffer_modulo11 := chr(h + 48)
  173. end;
  174.  
  175. function nummer.gueltig:boolean;
  176. begin
  177.  summe := 0;
  178.  zgs;
  179.  if n = buchnr then
  180.   gueltig := summe mod 11 = 0
  181.  else
  182.   gueltig := summe mod 10 = 0
  183. end;
  184.  
  185. destructor nummer.done;
  186. begin
  187. end;
  188.  
  189. begin
  190.  eingabe(nr,m,n);
  191.  speicher := MemAvail;
  192.  case n of
  193.   kontonr: begin
  194.             new(ekonsnr);
  195.             ekonsnr^.init(nr,m,n);
  196.             ekonsnr^.initgewichtung;
  197.             alle := ekonsnr;
  198.            end;
  199.   artikelnr: begin
  200.               new(eannr);
  201.               eannr^.init(nr,m,n);
  202.               eannr^.initgewichtung;
  203.               alle := eannr
  204.              end;
  205.   buchnr: begin
  206.            new(isbnnr);
  207.            isbnnr^.init(nr,m,n);
  208.            isbnnr^.initgewichtung;
  209.            alle := isbnnr
  210.           end;
  211.  else begin writeln('Undefinierter Nummerntyp'); halt end
  212.  end;
  213.  belegt := speicher - MemAvail;
  214.  with alle^ do
  215.   begin
  216.    if m = berechnen then
  217.     begin
  218.      bilden;
  219.      ausgabe
  220.     end
  221.    else
  222.    if gueltig then writeln('GÜLTIG') else writeln('UNGÜLTIG');
  223.   end;
  224.   dispose(alle,done);
  225.   report(speicher,belegt);
  226.   readln
  227. end.
  228.