|
Registriert seit: 28. Okt 2011 45 Beiträge |
#11
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:
BAHNSTEUERUNG
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.
Delphi-Quellcode:
DIN-PROGRAMM
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.
Delphi-Quellcode:
EINGABEDATEI (Textdatei) sieht dann z.B. so aus
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. ![]() 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 21:41 Uhr) |
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |