Einzelnen Beitrag anzeigen

Slashmob

Registriert seit: 28. Okt 2011
45 Beiträge
 
#11

AW: Funktionen und Prozeduren

  Alt 6. Jan 2012, 14:16
Hier die versprochene Aufgabenstellung und die Codes. Wie gesagt ich komme mit der Aufgabenstellung nicht klar und die Programme, die schon gegeben sind, sind für mich als Anfänger unübersichtlich und "schwierig nachzuvollziehen". Wäre um Aufklärung und Hilfe sehr dankbar!


Code:
 AUFGABENSTELLUNG
Es wurde ein „Programmierplatz“ für eine Bahnsteuerung besprochen
und zum Download zur Verfügung gestellt.
Nun soll ein Steuerungsprogramm geschrieben werden, das das früher erstellte „DIN“-Programm einliest, und auf Verwertbarkeit und Fehlerhaftigkeit testet.
Die Eingabedatei, die von Ihrem Zeilenparser zerlegt werden soll, könnte nach einer Änderung durch den Bediener folgendermaßen aussehen:

// Programmanfang
HF0 // Kommentar 1
// Kommentarzeile
X100 Y80 // hier Fehler melden
X100X80 // hier Fehler melden
HF 1 // hier Fehler melden
X96Y151 // hier Fehler melden
DEL TAX-4DELTAY-66 // hier Fehler melden

Um Fehler zu entdecken und nach Verbesserung der Eingabedatei wieder das
ursprüngliche Bild zu zeigen, muss das Programm folgende Funktionen haben:

Datei öffnen bzw. schließen.
Zeilen einlesen und abarbeiten:
-Kommentarzeilen verwerfen
-Kommentare hinter Hilfsfunktionen oder Datensätzen verwerfen
-Führende Leerzeichen verwerfen
-Klein-/Großschreibung ignorieren
-Hilfsfunktion erkennen und Linientyp und Linienfarbe setzen
-Datensatz erkennen und absolute Koordinaten berechnen
-Fehler im Datensatz erkennen und melden.

Das Programm soll einen Datensatz von einer Hilfsfunktion unterscheiden.
Die Hilfsfunktion steuert wie im mitgelieferten Programm für die Erstellung der Textdatei
die Farben und den Linientyp.
Der Datensatz wird benutzt, um absolute Koordinaten zu ermitteln und eine Geometrie auf ein Imagefeld zu zeichnen.
Für jedes Werkzeug, bzw. jede Hilfsfunktion ist zusätzlich die Bearbeitungsstrecke zu berechnen und in einem Stringgrid (mit Überschriften) auszugeben.
Nach Erledigung der Aufgabe soll es eine Vollzugsmeldung geben.
Ein Prototyp des Programms, der zum Endprodukt weiter verfeinert werden soll, ist
im Internet abzuholen.
BAHNSTEUERUNG
Delphi-Quellcode:
unit Unit1;
// dieser Programmrumpf ist alleine nicht lauffähig!
{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, ExtCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Image1: TImage;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  strecke_HF : array[0..4] of double; // Streckenspeicher
  aktuelle_Hilfsfunktion : integer;
  new_x,
  new_y,
  last_X,
  last_Y : double;

implementation

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject); // "Memo auf Datei"
   begin

end;

procedure TForm1.Button2Click(Sender: TObject);
    var dateiname,s : string;
        f : textfile;
        lx,
        index,
        zeilenzaehler : integer;
        werte : array[1..4] of double;
        lage : array[1..4] of integer;

    function Verwerfe_Kommentarzeile(s:string):boolean;
    // führt zum Überspringen der Kommentarzeile
    var return_wert:boolean;
       posi:integer;
       begin
    end;

    procedure loesche_fuehrende_Leerzeichen(var s:string);
       begin
            while s[1]= ' do
            delete (s,1,1); // löscht erstes Zeichen (das Leerzeichen) im String
       end;

    procedure erlaube_gross_Kleinschreibung(var s:string);
       begin

    end;

    procedure bereinige_Datensatz_von_Kommentaren(var s:string);
    // löscht im Datensatz den folgenden Kommentar
    var
       posi:integer;
       begin
    end;

    procedure berechne_absolutwerte(deltax,deltay:double);
    // berechnet die Absolutwerte mit Hilfe der incrementellen
       begin
    end;

    function berechne_strecke:double;
    // berechnet für jedes Werkzeug die Summe der zurückgelegten Wege
       begin
    end;

    function extrahiere_werte(s:string):boolean;
    // diese Prozedur speichert die exrahierten Werte global
       var
           test_zaehler, // nur zwei positionen besetzt?
           posi1,
           posi2,
           index :integer;
           resultat : boolean;
           hilfsstring : string;
           strecke,
           x,y,deltax,deltay : double;
       begin

       result:=resultat;
    end;

    function ermittle_Hilfsfunktion(s:string):boolean;
        var return_wert:boolean;
            posi:integer;
        begin
    end;

    function zeile_bearbeiten(s:string):boolean;
       var ergebnis:boolean;
           strecke: double;
    // im Fehlerfall wird ergebnis "false"

       begin
       ergebnis:=true;
       loesche_fuehrende_Leerzeichen(s);
       if Verwerfe_Kommentarzeile(s) then exit;
       erlaube_gross_Kleinschreibung(s);
       bereinige_Datensatz_von_Kommentaren(s);
       if not ermittle_Hilfsfunktion(s) then // wenn Datensatz gefunden
          begin
          if not extrahiere_werte(s) then
             begin
             ergebnis:=false;
             result:=ergebnis;
             exit;
          end;
       end;
       result:=ergebnis;
    end;

    begin
    last_X:=0.0;
    last_Y:=0.0;
    for index:=0 to 4 do strecke_HF[index]:=0.0;
    // hier holen des Dateinamens mit opendialog!

    assignfile(f,dateiname);
    reset(f);
    zeilenzaehler:=0;
    while not eof(f) do
       begin
       readln(f,s);
       inc(zeilenzaehler);
       if not zeile_bearbeiten(s) then
          begin
          showmessage('Fehler in Zeile '+inttostr(zeilenzaehler));
          closefile(f);
          exit;
       end;
    end;
    closefile(f);
    // Strecken ausgeben
    for lx:=0 to 4 do
       begin
       showmessage('strecke'+inttostr(lx)+'='+floattostr(strecke_HF[lx]));
    end;
end;

initialization
  {$I unit1.lrs}

end.
DIN-PROGRAMM
Delphi-Quellcode:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,StdCtrls, ExtCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Image1: TImage;
    Label1: TLabel;
    Label2: TLabel;
    RadioGroup1: TRadioGroup;
    Button1: TButton;
    RadioGroup2: TRadioGroup;
    SaveDialog1: TSaveDialog;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure RadioGroup1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1 : TForm1;
  Stiftzustand,
  Koordinaten,
  xglob,
  yglob,
  xold,
  yold,
  h,
  w : integer;
  o_string,
  dateiname : string;
  f : textfile;
  dateioffen : boolean;

implementation

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer); // Koordinatenanzeige in Labels
   begin
   label1.Caption:='x= '+inttostr(x);
   label2.Caption:='y= '+inttostr(y);
end;

procedure TForm1.FormCreate(Sender: TObject);
   begin
   h:=image1.Height; // Höhe des Bildes zwischenspeichern
   w:=image1.Width; // Breite des Bildes zwischenspeichern
   image1.Canvas.Brush.Color:=clwhite; // Farbe zum Löschen setzen
   image1.Canvas.FillRect(rect(0,0,w,h)); // Löschen
   image1.Cursor:=crcross;
   dateiname:='default.txt';
   xold:=0;
   yold:=0;
   dateioffen:=false;
   button3.Enabled:=false;
end;

procedure TForm1.Button1Click(Sender: TObject); // "Punkt speichern"

   procedure absolut; // Absolut - Punkt anfahren
      begin
      o_string:='X'+inttostr(xglob);
      o_string:=o_string+'Y'+inttostr(yglob);
   end;

   procedure relativ; // Realtiv - Punkt anfahren
      begin
      o_string:='DELTAX'+inttostr(xglob-xold);
      o_string:=o_string+'DELTAY'+inttostr(yglob-yold);
   end;

   begin
   Stiftzustand:=radiogroup1.ItemIndex; // Stiftzustand wählen
   Koordinaten:=radiogroup2.ItemIndex; // Koordinatenart wählen
   case Koordinaten of
      0: absolut;
      1: relativ;
   end;
   // o_string:=o_string+'HF'+inttostr(stiftzustand); ????
   case stiftzustand of
      0: begin // HF0 - Eilgang
         image1.Canvas.Pen.Style := psDot;
         image1.Canvas.Pen.Color:=clred;
         image1.Canvas.LineTo(xglob,yglob);
         end;
      1: begin // HF1 - Schneiden
         image1.Canvas.Pen.Style := psSolid;
         image1.Canvas.Pen.Color:=clblack;
         image1.Canvas.LineTo(xglob,yglob);
         end;
      2: begin // HF2 - Koernern
         image1.Canvas.Pen.Style := psdashdot;
         image1.Canvas.Pen.Color:=clblue;
         image1.Canvas.LineTo(xglob,yglob);
         end;
      3: begin // HF3 - Markieren
         image1.Canvas.Pen.Style := psdash;
         image1.Canvas.Pen.Color:=clgreen;
         image1.Canvas.LineTo(xglob,yglob);
         end;
      else
         showmessage('erst Werkzeug wählen!');
         exit;
      end;

   xold:=xglob;
   yold:=yglob;
   if dateioffen then
      begin
      writeln(f,o_string);
   end
   else
      begin
      showmessage('Datei nicht offen '+o_string);
   end;
end;

procedure TForm1.Button2Click(Sender: TObject); // "Datei" speichern
   begin
   if savedialog1.execute then
      begin
      dateiname:=savedialog1.filename;
   end
   else
      dateiname:='default.txt';
   assignfile(f,dateiname);
   rewrite(f);
   dateioffen:=true;
   button2.Enabled:=false;
   button3.Enabled:=true;
   button4.Enabled:=false;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
   begin
   xglob:=x;
   yglob:=y;
end;

procedure TForm1.Button3Click(Sender: TObject); // "Datei schließen"
   begin
   if dateioffen then
      begin
      dateioffen:=false;
      closefile(f);
      button2.Enabled:=true;
      button3.Enabled:=false;
      button4.Enabled:=true;
      end
   else
      showmessage('Datei ist nicht geöffnet, kann also nicht geschlossen werden');
end;

procedure TForm1.Button4Click(Sender: TObject); // "Prgm beenden"
   begin
   close;
end;

procedure TForm1.RadioGroup1Click(Sender: TObject);
Var o_string:string;
   begin
   o_string:='HF'+inttostr(RadioGroup1.itemindex);
   if dateioffen then
      begin
      writeln(f,o_string);
   end
   else
      begin
      showmessage('Datei nicht offen '+O_string);
   end;
end;




initialization
  {$I unit1.lrs}

end.
EINGABEDATEI (Textdatei) sieht dann z.B. so aus
Zitat:
HF0
X32Y40
HF1
X31Y97
X81Y96
X80Y40
X32Y41
HF0
X41Y35
X86Y40
HF1
DELTAX-1DELTAY56
DELTAX46DELTAY-1
DELTAX-4DELTAY-53
DELTAX-40DELTAY-4
DELTAX-1DELTAY4
HF0
DELTAX10DELTAY-6
DELTAX42DELTAY4

Geändert von Slashmob ( 6. Jan 2012 um 22:41 Uhr)
  Mit Zitat antworten Zitat