[Delphi] Erkennung von gerade Dualzahlen- Automat

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Tischbombe, 5. Juni 2007 .

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 5. Juni 2007
    Erkennung von gerade Dualzahlen- Automat

    So liebe Jungs. Um meine Note in Informatik zu retten brauch ich bis Morgen früh , sprich Mittwoch morgen, einen Automaten in Delphi der folgendes kann: Erkennung von geraden Dualzahlen ohne Führende 0. Brauche halt eine .exe und den Quelltext. Gegenleistung(en) ist natürlich selbst verständlich

    als hilfe kann ich euch das gleiche programm anbieten nur halt keine dualzahlen sondern natürliche zahlen:

    hier der quelltext:
    Code:
    unitmNatZahlof0;
    
    (* 
    
     * Erkennender Automat für ganze Zahlen ohne die führende '0'
    
    
    
     *)
    
    interface 
    
    usesStdCtrls;
    
     
    
    type 
    
     FEHLER = (keineEingabe, zeichenFalscheStelle, zeichenNichtErlaubt,
    
     unerwartetesEnde);
    
     ZUSTAND = (S0, S1, SF);
    
     NatZahlof0 = class
    
     private
    
     kenntEingabe: TEdit;
    
     kenntAusgabe: TMemo;
    
     zFehler: integer;
    
     zFPos: integer;
    
     sZeile: String;
    
     public
    
     constructorerzeuge (pEingabe: TEdit; pAusgabe: TMemo);
    
     destructor gibFrei;
    
     procedurepruefe;
    
     private
    
     procedurescanOk;
    
     proceduremeldeFehler (pStelle: Integer; pFehler: FEHLER);
    
     end;
    
    implementation 
    
     
    
     constructorNatZahlof0.erzeuge (pEingabe: TEdit; pAusgabe: TMemo);
    
     begin
    
     kenntEingabe := pEingabe;
    
     kenntAusgabe := pAusgabe;
    
     end; // erzeuge
    
     
    
     destructorNatZahlof0.gibFrei;
    
     begin
    
     end; // gibFrei
    
     
    
     procedureNatZahlof0.pruefe;
    
     var
    
     count: Integer;
    
     marke: String;
    
     begin
    
     sZeile := kenntEingabe.Text;
    
     if(length(sZeile) > 0) then
    
     begin
    
     scanOk; // eigentlicher Automat
    
     // Der Rest ist Fehlerdiagnose
    
     if(zFehler = 0) then
    
     begin
    
     kenntAusgabe.lines.add('Zahl '+ sZeile + ' richtig eingegeben!');
    
     end
    
     else
    
     begin
    
     casezFehler of
    
     0: kenntAusgabe.lines.add('Es wurde nichts eingegeben');
    
     1: kenntAusgabe.lines.add('Zeichen an dieser Stelle nicht
    
     erlaubt!');
    
     2: kenntAusgabe.lines.add('Zeichen nicht im Alphabet enthalten!');
    
     3: kenntAusgabe.lines.add('Zu früh aufgehört!');
    
     end;
    
     kenntAusgabe.lines.add(sZeile);
    
     marke := '';
    
     forcount := 1to(zFPos - 1) do
    
     begin
    
     marke := marke + ' ';
    
     end;
    
     marke := marke + '^';
    
     kenntAusgabe.lines.add(marke);
    
     end;
    
     end;
    
     end; // pruefe
    
     
    
     procedureNatZahlof0.meldeFehler (pStelle: Integer; pFehler: FEHLER);
    
     begin
    
     zFPos := pStelle;
    
     zFehler := Ord(pFehler);
    
     end;
    
     
    
     procedureNatZahlof0.scanOk;
    
     (*
    
     * Hier ist der Automat untergebracht
    
     *)
    
     var
    
     fStelle: Integer;
    
     lZustand: ZUSTAND;
    
     index: Integer;
    
     lZeichen: String;
    
     
    
     begin
    
     lZustand := S0;
    
     index := 0;
    
     while((index < length(sZeile)) and(lZustand <> SF)) do
    
     begin
    
     index := index + 1;
    
     lZeichen := copy (sZeile, index, 1);
    
     case(pos (lZeichen, '0123456789')) of
    
     2..10:
    
     caselZustand of
    
     S0: lZustand := S1;
    
     S1: lZustand := S1;
    
     end;
    
     1:
    
     caselZustand of
    
     S1: lZustand := S1;
    
     else
    
     fStelle := index;
    
     meldeFehler (fStelle, zeichenFalscheStelle);
    
     lZustand := SF;
    
     end;
    
     else
    
     fStelle := index;
    
     meldeFehler (fStelle, zeichenNichtErlaubt);
    
     lZustand := SF;
    
     end; // switch (zeichen)
    
     end;
    
     caselZustand of
    
     S1: zFehler := 0;
    
     S0: beginfStelle := length(sZeile) - 1;
    
     meldeFehler (fStelle, unerwartetesEnde);
    
     end;
    
     end;
    
     end; // scanOk
    
     
    
    end.
     
  2. 6. Juni 2007
    AW: Erkennung von gerade Dualzahlen- Automat

    ca. 12 h eher und ich hätt mich ran gesetzt .. sollte ja nicht so schwer sein....
    schließlich nur in normal zahlen umwandeln .... und dann herausfinden ob gerade oder nicht und ausschließen das halt vorn keine Null steht so wie ich das verstanden habe....

    aber einen Tag bräuchte ich zumal ich nach 7 h autofahrt jetzt erstmal pennen geh ^^
     
  3. 6. Juni 2007
    Zuletzt von einem Moderator bearbeitet: 15. April 2017
    AW: Erkennung von gerade Dualzahlen- Automat

    Da der mitwoch morgen erreiht ist hat sich das eh erledigt!

    Außerdem doch eher nen kanidat für den:

    [X] Der Ich-suche-Programmierer-Thread

    ~Close~

    Knusperkeks
     
  4. 6. Juni 2007
    AW: Erkennung von gerade Dualzahlen- Automat

    Auch wenn ich was völlig eigenes geschrieben hab und nicht deins die Grudlage ist heir meine Lösung:



    Code:
    unit Unit1;
    
    interface
    
    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, StdCtrls;
    
    type
     TForm1 = class(TForm)
     Edit1: TEdit;
     Button1: TButton;
     Label1: TLabel;
     Label2: TLabel;
     Label3: TLabel;
     procedure Button1Click(Sender: TObject);
     procedure Edit1Click(Sender: TObject);
     procedure Edit1KeyPress(Sender: TObject; var Key: Char);
     private
     { Private-Deklarationen }
     public
     { Public-Deklarationen }
     end;
    
    function BinToInt(const AsValue : string) : integer;
    
    var
     Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    function BinToInt(const AsValue : string) : integer;
    
    const
     _aBinDigits = ['0','1'];
    
    var
     iPowerOfTwo : integer;
     i : integer;
    
    begin
     Result := 0;
     iPowerOfTwo := 1;
    
     if (length(AsValue) < 1) or (length(AsValue) > 32) then
     begin
     raise Exception.Create('Die Zahl muss zwischen 1 und 32 Stellen haben.');
     end;
    
     for i := length(AsValue) downto 1 do
     begin
    
     if not (AsValue[i] in _aBinDigits) then
     begin
     raise Exception.Create('Es dürfen nur die Ziffern 0 und 1 vorkommen.');
     end;
    
     if AsValue[i] = '1' then
     begin
     Result := Result or iPowerOfTwo;
     end;
     iPowerOfTwo := iPowerOfTwo shl 1;
     end;
    end;
    
    
    
    
    procedure TForm1.Button1Click(Sender: TObject);
    var ergebnis: integer;
    begin
     ergebnis:= bintoint(edit1.Text);
     label2.caption:=inttostr(ergebnis);
    if odd(ergebnis) = true
     then
     label1.Caption:='Die Zahl ist ungerade'
     else
     label1.caption:='Die Zahl ist gerade' ;
    end;
    
    
    
    procedure TForm1.Edit1Click(Sender: TObject);
    begin
     edit1.Clear;
    end;
    
    procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
     if not ((key='0') OR (key='1') OR (key=#8)) then key:= #0;
    end;
    
    end.
    
    und hier die fertige exe:
    XUP

    Und alle zugehörigen Datein zum Projekt:
    XUP



    Ich hoffe ich habe keine Bugs offen gelassen.


    S
     
  5. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.