Upline: Infos & Dokus Programmierung Delphi Delphi HowTo

Delphi HowTo Teil 4 Mathetool


Konsolenprogramm für Gleichungssysteme

Was ist eine Konsolenanwendung und wozu ist sie gut?

Konsolenprogramme sind für verschiedene Anwendungen auch heute noch durchaus praktisch. Das wohl wichtigste Anwendungsgebiet sind kleine Tools, die administrative Aufgaben übernehmen und somit dem Administrator die Arbeit erleichtern. Aber auch für andere kleine Programme, die ohne eine Benutzerführung auskommen, sollte man sich als Programmierer Gedanken darüber machen, ob die Konsole nicht reichen könnte. Der entscheidenste Vorteil einer Konsolenanwendung ist, dass der doch recht beachtliche Speicherbedarf für die grafische Oberfläche entfällt. Allein die ausführbare exe-Datei wird ohne grafische Oberfläche und ein paar Buttons schnell 150-200kB kleiner, als mit diesen oft nicht benötigten Features.



Um Ein Konsolenprogramm zu erstellen, kann man entweder bequem per Datei-Menü "Neues Projekt" die Konsolenanwendung auswählen oder man erstellt ein normales Projekt, speichert dieses und paßt anschließend die Delphi-Project-Datei (*.dpr) an und entfernt die überflüssigen Dateien aus dem Projektverzeichnis. Wie man an dem unten zu sehenden Sourcecode zu diesem Beispiel erkennen kann, ist der Aufbau einer Konsolenanwendung sehr einfach. Es werden kaum Units etc. benötigt.

Das Hauptprogramm

Zu Beginn wird per randomize der Zufallsgenerator initialisiert und anschließend wird der Kopfbereich ausgegeben. Mit der Funktion paramstr() kann man beim Programmstart übergebene Parameter auslesen. Anschließend werden einige Tests an den Parametern durchgeführt. Im Fehlerfall (also falsche Parametereingabe) wird die Prozedur fehler() aufgerufen und das Programm beendet. Aus dieser Prozedur läßt sich auch erkennen, wie das kleine Tool aufgerufen werden muss.
Die ersten Erklärungen zu diesem Artikel habe ich am 12.06.2006 hier eingetragen, weitere Erklärungen zum Sourcecode folgen später ...
Quelltext:
program Project1;
{$APPTYPE CONSOLE}
uses
  sysutils;

var a,i,nks,fnks:integer;
    s,zs:string;

function zz:real;
begin
 if zs='-n'then zz:=random(10)+1
 else if zs='-z'then zz:=random(20)-10
 else if zs='-q'then zz:=random(2000)/100-10
 else if zs='-r'then zz:=random(2000)/100/(random(200)/10+1)-10;
end;

function zahlzustr(zahl:real;vz:boolean):string; // mit Vorzeichen
var zh:string;
begin
 zh:=floattostrf(zahl,ffFixed,nks+3,nks);
 if zh[1]<>'-'then if vz then zh:='+'+zh else zh:=' '+zh;
 zahlzustr:=zh;
end;

procedure glsyst(u:integer);
var a1,a2,a3,b1,b2,b3,c1,c2,c3,d1,d2,d3,x,y,z:real;
    g1,g2,g3,gh:string;
const r=10;
begin
 a1:=zz;a2:=zz;
 b1:=zz;b2:=zz;
 c1:=zz;c2:=zz;
 x:=zz;y:=zz;
 d1:=a1*x+b1*y;
 d2:=a2*x+b2*y;
 if u=3then begin
  a3:=zz;b3:=zz;c3:=zz;z:=zz;
  d1:=d1+c1*z;
  d2:=d2+c2*z;
  d3:=a3*x+b3*y+c3*z;
 end;
 writeln;
 g1:=' I    '+zahlzustr(d1,false)+' = '+zahlzustr(a1,false)+'x '+
     zahlzustr(b1,true)+'y ';if u=3then g1:=g1+zahlzustr(c1,true)+'z';
 writeln(g1);
 g2:=' II   '+zahlzustr(d2,false)+' = '+zahlzustr(a2,false)+'x '+
     zahlzustr(b2,true)+'y ';if u=3then g1:=g1+zahlzustr(c2,true)+'z';
 writeln(g2);
 if u=3then begin
  g3:=' III  '+zahlzustr(d3,false)+' = '+zahlzustr(a3,false)+'x '+
      zahlzustr(b3,true)+'y '+zahlzustr(c3,true)+'z';
  writeln(g3);
 end;
 write(' Loesung: x=',x:2:2,' y=',y:2:2);if u=3then write(' z=',z:2:2);
 writeln;
end;

procedure quadrgl;
begin
end;

procedure fehler(f:real);
begin
 writeln('Fehler ',f:1:1,' bei Parameterueberpruefung');
 writeln;writeln('Aufruf:');writeln;
 writeln(' mathetool [-g2|-g3|-q] [-n|-z|-q|-r] ');
 writeln;
 writeln('  1.Parameter');
 writeln('   -g2 Gleichungssysteme mit 2 Unbekannten');
 writeln('   -g3 Gleichungssysteme mit 3 Unbekannten');
 writeln('   -q Quadratische Gleichung');
 writeln;
 writeln('  2.Parameter');
 writeln('   -n nat. Z.');
 writeln('   -z ganze Z.');
 writeln('   -q rat. Z.');
 writeln('   -r reelle Z.');
 writeln;
 writeln(' Bsp.: mathetool -g3 -n 5 -> 5x Gl.Syst. (nat. Z.) mit 3 Unb.');
 writeln;
 halt;
end;

begin
 randomize;
 Write('========================================');
 Writeln('=======================================');
 Writeln('Mathe-Tool zur Aufgabenerstellung by Norbert Schroeder in 2002');
 Write('----------------------------------------');
 Writeln('---------------------------------------');
 s:=paramstr(3);
 if(length(s)=1)or(length(s)=2)then begin
  if not(s[1]in['1','2','3','4','5','6','7','8','9','0'])then fehler(3.1);
 end else if(length(s)=2)then begin
  if not(s[2]in['1','2','3','4','5','6','7','8','9','0'])then fehler(3.2);
 end else fehler(3.3);
 a:=strtoint(s);
 zs:=paramstr(2);
 if length(zs)=2then begin
  if(zs[1]<>'-')then fehler(2.1);
  if(zs[2]='n')or(zs[2]='z')then begin nks:=0;fnks:=1 end
  else if zs[2]='q'then begin nks:=2;fnks:=100 end
  else if zs[2]='r'then begin nks:=6;fnks:=1000000 end else fehler(2.2);
 end else fehler(2.3);
 if paramstr(1)='-g2'then                            //gl.syst. 2 unbekannte
  for i:=1to a do begin
   writeln;writeln('Aufgabe ',i);
   glsyst(2);
  end
 else if paramstr(1)='-g3'then                       //gl.syst. 3 unbekannte
  for i:=1to a do begin
   writeln;writeln('Aufgabe ',i);
   glsyst(3);
  end
 else if paramstr(1)='-q'then                        //quadr. gl.
  for i:=1to a do begin
   writeln;writeln('Aufgabe ',i);
   quadrgl;
 end else fehler(1);
end.
Da dieses Beispiel als Konsolenprogramm kein Formular nutzt, ist ein Download überflüssig. Es genügt, den obigen Sourcecode in die Delphi-IDE reinzukopieren.