Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Umrechnen von Zahlensystem (https://www.delphipraxis.net/143001-umrechnen-von-zahlensystem.html)

Ghose 7. Nov 2009 17:39


Umrechnen von Zahlensystem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Abend,

und es werden sich jetzt wahrscheinlich wieder alle denken, warum kommt der mit diesem alten Thema wieder...

Es ist so, ich bin komplett neu in der Programmierung und haben keinen Schimmer davon wie ich damit anfangen soll. Ich habe mir jetzt schon ein Buch und diverse Tipps & Tricks angeguckt, jedoch ist es für mich immernoch schwierig, die gestellte Aufgabe zu meistern.

Es ist so das ich einen Umrechner für Dez, Binär und Hex erstellen muss.
Und dabei auch schon einiges mir jetzt zusammengebastelt habe und manches sogar halbwegs funktioniert. Nur steh ich zur Zeit einfach vor der Aufgabe wie ich Ausnahmen einbringe in meinen ganzen Code und ob ich es nicht einfacher haben könnte.

Der Rechner sollte von Dez, Bin und Hex nach Dez, Bin und Hex umrechnen können also 9 Umrechnungsarten sogesagt bzw. 6 da das andere ja nur eine Kopie ist.

Ich werde nun einfach mal meinen Quellcode hier reinschreiben und zu jeder Umrechnung entweder in den Quellcode mit Klammern oder darunter etwas schreiben bzw. fragen:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Math, StrUtils;

type
  TForm1 = class(TForm)
    Eingaberadiogroup: TRadioGroup;
    Ausgaberadiogroup: TRadioGroup;
    Eingabeedit: TEdit;
    Eingabe: TLabel;
    Ausgabe: TLabel;
    Berechnungsbutton: TButton;
    Ausgabeedit: TEdit;
    procedure BerechnungsbuttonClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
      { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  x: integer;
  BinArray: Array [1..16] of Integer; /// Array mit 16 Speicherstellen von 1 bis 16 ///
  laenge: Integer;
  Zahl: Integer;
implementation

{$R *.dfm}

procedure TForm1.BerechnungsbuttonClick(Sender: TObject);
Var
     a ,b, i : Integer;
     c : extended;
     s : string;
     i1, i2 : Integer;
begin

    Ausgabeedit.Text:= '';

   
                               /// Hexadezimal in Dezimal ///
    IF ((Eingaberadiogroup.ItemIndex= 2) and (Ausgaberadiogroup.ItemIndex= 0)) then
      Begin
         i2 := StrToInt('$'+Eingabeedit.Text); // Umwandlung in INTEGER
         Ausgabeedit.Text := IntToStr(i2);
      end;


                              ///Dezimal in Hexadezimal///

    IF ((Eingaberadiogroup.ItemIndex=0) and (Ausgaberadiogroup.ItemIndex=2)) then
       begin
          i1 := StrToInt(Eingabeedit.Text);      // wandelt String in Ganzzahl um
          Ausgabeedit.Text := Format('%x',[i1]); // Ausgabe als HEX
       end;


                               /// Dezimal in Binär///
    IF (( Eingaberadiogroup.ItemIndex=0) and (Ausgaberadiogroup.ItemIndex =1)) then


    x:= StrtoInt (Eingabeedit.text);             // Eingabe //

    ///***Beginn Umrechnung von Dezimal in Binär***///

          For i:= 1 to 16 do

              Begin
                BinArray[i]:= x mod 2;
                x := x div 2;
                Ausgabeedit.Text:= InttoStr(BinArray[i]) + Ausgabeedit.Text;
                  If x = 0 Then
                  break;
              End;


                            ///Binär in Dezimal///

    IF ((Eingaberadiogroup.ItemIndex=1) and (Ausgaberadiogroup.Itemindex=0))then

    s:= reverseString(Eingabeedit.Text); /// Drehen des Eingabestrings
    a:= Length(s);                      /// Ermittlung der Länge des Eingabestrings
    C:= 0;                              /// C wird auf 0 deklariert

              ///*** Beginn der Umrechnung von Binär in Dezimal ***///
      For b:= 1 to a do
        begin
          c := c+ Strtoint(s[b]) * power(2 , (-1 + b) ); (Ich habs in Internet gefunden aber versteh es kein bisschen!)
        end;
            Ausgabeedit.Text := FloattoStr(c);   //*** Ausgabe aufs Ergebnisedit ***//


Jetzt zu den Fragen speziell:

1. Wenn ich in der RadioGroup nach einer Umrechnung noch eine andere Umrechnung machen möchte, kommt immer Null raus.
2. Zudem funktionieren die Umrechnungen für sich alleine alle, jedoch wenn ich alle zusammen ohne ausklammern, mitnehme, kommt ebenfalls immer 0 raus.
3. Wie kann ich in den einzelnen Umrechnungen Ausnahmen einfügen, dass zum Beispeil bei Hex nur Buchstaben bis F eingegeben werden können und ab G dann eine Message aufblingt unzulässiger Buchstabe man dann jedoch einfach weitertippen, sofern man den unzulässigen Buchstaben gelöscht hat.
4. Bei Dezimal dürfen einfach garkeine Buchstaben auftauchen und er soll sofort meckern sofern etwas nicht zulässiges eingeben wird.
5. Bei Binär muss sich komplett auf 1 und 0 beschränkt werden.(sonderzeichen dürfen bei allen abfragen natürlich auch nicht eingegeben werden)
6. Wie erreiche ich, dass ich bei einer Hex Eingabe auch große Werte wie FFFFFFFF eingeben kann ohne das Delphi abstürzt oder hängt es vielleicht einfach mit meinen Quellcode zusammen.
7. Kann ich die Ausgabe auch über ein anderes Element wie das EditFenster erreichen, da ich beim Label (auch bei Label.Cation statt Edit.Text) immer Probleme hatte.


Das sind erstmal die Fragen die mir gerade spontan einfallen.

Sofern jetzt Ersatzquellcodes zwecks vereinfachung oder vorschlägen kommen, erklärt diese bitte sehr ausführlich da ich wirklich kompletter Anfänger bin und es einfach nicht verstehe.

Das Projekt ist unter http://ul.to/axurnz runterzuladen, damit man auch einen Eindruck gewinnt wie das ganze nachher aussehen soll bzw. vielleicht gibt es hier auch schon vereinfachungen.

Ich hoffe ihr könnt mir helfen, da ich oft bei der Suche nach Umrechnungen in diesem Forum gelandet bin, dachte ich mir das ich hier genau richtig sein muss.

Mit freundlichen Grüßen

Ghose

Wolfgang Mix 7. Nov 2009 17:55

Re: Umrechnen von Zahlensystem
 
Erstmal herzlich willkommen in der Dp :dp: :dp:
In der der CodeLib sind viele Anregungen zu finden, z.B. hier

Außerdem wäre es nett, wenn Du Deinen Code in Dephi-Tags einschließen würdest,
dann läßt er sich besser lesen.

Grüß

Wolfgang

patti 7. Nov 2009 18:08

Re: Umrechnen von Zahlensystem
 
Zumindest das hier kann ich dir erklären:

Zitat:

Zitat von Ghose
///Binär in Dezimal///
c := c+ Strtoint(s[b]) * power(2 , (-1 + b) ); (Ich habs in Internet gefunden aber versteh es kein bisschen!)

Überlege dir mal, wie eine Binärzahl aufgebaut ist. Sie besteht nur aus Einsen und Nullen, also z.B.

Code:
10010
Dabei ist die erste Ziffer die signifikanteste, die Binärzahl wird also "von hinten" gelesen (die hinterste Ziffer hat den kleinsten Wert, die vorderste den größten, siehe "Big Endian")

Aus der Binär-Zahl ergibt sich daher:

Code:
0 * 2^0 = 0
1 * 2^1 = 2
0 * 2^2 = 0
0 * 2^3 = 0
1 * 2^4 = 16
-------------
= 18
Vor deiner Schleife drehst du den Binär-String um, also wird aus 10010 nun 01001. Dann gehst du Zeichen für Zeichen deiner Binär-Zahl von links nach rechts durch, also von der Ziffer mit der niedrigsten Wertigkeit zu der höchsten (da umgedreht). Strtoint(s[b]) liefert dir dabei die jeweilige Ziffer aus der Binär-Zahl, also entweder 0 oder 1. Diese Ziffer wird mit power(2,(b-1)) multipliziert, also mit der Wertigkeit der jeweiligen Ziffer. Für das erste Zeichen (bei uns 0) ergibt sich also 0*2^0 = 0. Dieser Wert wird zu c hinzuaddiert. Das zweite Zeichen (also bei b=2) ist 1, also ergibt sich ein Wert von 1*2^1 = 2, welcher wieder zu c addiert wird. Dies machst du für jedes Zeichen deines Binär-Strings, am Ende erhälst du die gesuchte Dezimal-Zahl c.

Patti

EDIT:

Zu deiner 3. Frage: Wenn du die Eingabe auf bestimmte Zeichen beschränken willst, kannst du beispielsweise im OnKeyPress der Edit-Komponente darauf reagieren:

Delphi-Quellcode:
if not(Key in['0'..'9', 'A'..'F']) then Key := #0; // Bei HEX
Wenn der Benutzer versucht, ein Zeichen einzugeben, das nicht erlaubt ist, erscheint es nicht im Edit

3_of_8 7. Nov 2009 23:35

Re: Umrechnen von Zahlensystem
 
Er kann es aber immer noch über die Zwischenablage einfügen - dem Benutzer zu "verbieten", etwas ainzugeben, ist nicht sonderlich sinnvol. Besser ist es, die Eingabe auf Fehler zu überprüfen, sobald der Benutzer sie verarbeiten lassen will, das heißt einmal durch den String durchgehen und wenn ein Zeichen gefunden wurde, das da nicht rein gehört, löschen.

Ghose 9. Nov 2009 15:05

Re: Umrechnen von Zahlensystem
 
3_of_8 wie mache ich denn das von dir beschriebene programmiertechnisch ?

Ich bin zur Zeit echt am verzweifeln hier, denn eigentlich hatte alles vorher einzeln funktioniert nur wenn ich jetzt das Programm starte, funktioniert nur noch Binär zu Dezimal und der Rest kriegt immer 0 als Ergebnis.
Weiß da vielleicht einer woran es liegt.

Der Link aus der CP bringt mich leider garnicht weiter, da ich dort garnichts verstehe. Da dort irgendwelche Funktionen programmiert werden womit man wahrscheinlich nachher weiterarbeiten kann, aber ich steig da echt nicht durch.

Kann mir denn keiner einen Tipp in die richtige Richtung geben ?

implementation 9. Nov 2009 15:19

Re: Umrechnen von Zahlensystem
 
Damit kannst du den String auf verbotene Zeichen prüfen:
Delphi-Quellcode:
function StringUeberpruefenHex(s:string): string;
var i: cardinal;
begin
  if s<>'' then for i := 0 to Length(s)-1 do
    if s[i] in ['0'..'9','A'..'F','a'..'f'] then
      Result := Result+s[i]
end;
// Mit Dez und Bin gehts genauso, nur musst du dann
['0'..'9','A'..'F','a'..'f']
// durch
['0'..'9']
// bzw.
['0','1']
// ersetzen

p80286 9. Nov 2009 16:43

Re: Umrechnen von Zahlensystem
 
Zitat:

Zitat von Ghose
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Math, StrUtils;

type
  TForm1 = class(TForm)
    Eingaberadiogroup: TRadioGroup;
    Ausgaberadiogroup: TRadioGroup;
    Eingabeedit: TEdit;
    Eingabe: TLabel;
    Ausgabe: TLabel;
    Berechnungsbutton: TButton;
    Ausgabeedit: TEdit;
    procedure BerechnungsbuttonClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
      { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  x: integer;
  BinArray: Array [1..16] of Integer; /// Array mit 16 Speicherstellen von 1 bis 16 ///
  laenge: Integer;
  Zahl: Integer;
implementation

{$R *.dfm}

procedure TForm1.BerechnungsbuttonClick(Sender: TObject);
Var
     a ,b, i : Integer;
     c : extended;
     s : string;
     i1, i2 : Integer;
begin

    Ausgabeedit.Text:= '';

   
                               /// Hexadezimal in Dezimal ///
    IF ((Eingaberadiogroup.ItemIndex= 2) and (Ausgaberadiogroup.ItemIndex= 0)) then
      Begin
         i2 := StrToInt('$'+Eingabeedit.Text); // Umwandlung in INTEGER
         Ausgabeedit.Text := IntToStr(i2);
      end;


                              ///Dezimal in Hexadezimal///

    IF ((Eingaberadiogroup.ItemIndex=0) and (Ausgaberadiogroup.ItemIndex=2)) then
       begin
          i1 := StrToInt(Eingabeedit.Text);      // wandelt String in Ganzzahl um
          Ausgabeedit.Text := Format('%x',[i1]); // Ausgabe als HEX
       end;


                               /// Dezimal in Binär///
    IF (( Eingaberadiogroup.ItemIndex=0) and (Ausgaberadiogroup.ItemIndex =1)) then
{ hier fehlt ein BEGIN -------------------------------------------------------------------------}       

    x:= StrtoInt (Eingabeedit.text);             // Eingabe //

    ///***Beginn Umrechnung von Dezimal in Binär***///

          For i:= 1 to 16 do

              Begin
                BinArray[i]:= x mod 2;
                x := x div 2;
                Ausgabeedit.Text:= InttoStr(BinArray[i]) + Ausgabeedit.Text;
                  If x = 0 Then
                  break;
              End;

{und hier das zugehörige END ---------------------------------------------------------------------------}
                            ///Binär in Dezimal///
 
    IF ((Eingaberadiogroup.ItemIndex=1) and (Ausgaberadiogroup.Itemindex=0))then
{ hier fehlt ein BEGIN -------------------------------------------------------------------------}       

    s:= reverseString(Eingabeedit.Text); /// Drehen des Eingabestrings
    a:= Length(s);                      /// Ermittlung der Länge des Eingabestrings
    C:= 0;                              /// C wird auf 0 deklariert

              ///*** Beginn der Umrechnung von Binär in Dezimal ***///
      For b:= 1 to a do
        begin
          c := c+ Strtoint(s[b]) * power(2 , (-1 + b) ); (Ich habs in Internet gefunden aber versteh es kein bisschen!)
        end;
            Ausgabeedit.Text := FloattoStr(c);   //*** Ausgabe aufs Ergebnisedit ***//
{und hier das zugehörige END ---------------------------------------------------------------------------}

Wieviele Deiner Fragen bleiben jetzt noch übrig?

Gruß
K-H

Ghose 10. Nov 2009 15:22

Re: Umrechnen von Zahlensystem
 
p80286 das ist schonmal eine riesen Erleichterung weil es jetzt funktioniert. Zumindestens die Umrechnungen, wie ich aber nur die Überprüfungsmethode von implementation mit einbringe fehlt mir noch komplett.

Nur fehlt mir jetzt auch noch der Ansatz wie ich von Binär direkt in Hex umrechne.
Zudem habe ich heute erfahren, dass wir nicht die vorgegebenen Funktionen von Delphi wie ich sie jetzt benutzt habe, zum Umrechnen von Hex in Dez und Dez in Hex.

Jetzt muss ich anscheinend dafür eigene Prozeduren schreiben aber da hab ich einfach keine Ahnung wie das funktionieren soll.
Dezimal zu Binär ist da wohl das Musterbeispiel weil dieses auch Vorort programmiert haben zusammen mit unserem Lehrer.


Könnte denn vielleicht mal einer anhand meines Quellcodes (ich weiß es ist keine Meisterleistung aber dafür bin ich auch noch blutiger Anfänger), diese Abfrage einfach bei irgendeiner Umrechnungsmethode mit einbringen dann würde ich wenigstens mal sehen wie es sein muss.

Die Abfrage an sich verstehe ich ja nur wie ich sie halt einbaue ist nicht immer so leicht.



Mfg. Ghose und schonmal VIELEN DANK an ALLE die mich hier unterstützen!



So habe gerade nochmal weitergedoktort^^ und ich hab den Überprüfenstring mit ins Programm eingebunden jedoch zeigt er mir jetzt selbst nach eingabe von normalen Zahlen oder Buchstaben bis F bei Hex in Dez eine Fehlermeldung an.

Hier der Quellcode:
Anfangs halt im Implementation hinzugefügt und nachher unten mit ausgeführt.
Delphi-Quellcode:
implementation

function StringUeberpruefenHex(s:string): string;
var i: cardinal;

begin
  if s<>'' then for i := 0 to Length(s)-1 do
    if s[i] in ['0'..'9','A'..'F','a'..'f'] then
      Result := Result+s[i]
      else Showmessage ('Ungültige Eingabe');
    end;




                       /// Hexadezimal in Dezimal ///
    IF ((Eingaberadiogroup.ItemIndex= 2) and (Ausgaberadiogroup.ItemIndex= 0)) then
      Begin
      s:= Eingabeedit.Text;
      StringUeberpruefenHex(s);
      Begin
         i2 := StrToInt('$'+Eingabeedit.Text); // Umwandlung in INTEGER
         Ausgabeedit.Text := IntToStr(i2);
      end;
      end;

Sekkuar 10. Dez 2009 21:58

Re: Umrechnen von Zahlensystem
 
Hi,

ich muss zur Zeit auch von der Schule aus eine Umrechner zusammen basteln. Hab den auch schon soweit das er von Dez-Dual; Dez-Hex; und von Hex-Dez umrechnet. Jetz ist das problem hab hier gerade mal reingeguckt und mal den code für Dual-Dez ausprobiert und das sagt mir mein Delphi er kennt den reverseString nicht. kann mir da vll jemand ne ander möglichkeit sagen wie ich das ausrechne und wenn es geht auch noch für Hex_Dual und Dual-Hex.
mfg sekkuar

himitsu 10. Dez 2009 22:20

Re: Umrechnen von Zahlensystem
 
Welche Delphi-Version nutzt du?

ReverseString liegt mindestens seit Delphi 7 in StrUtils rum.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:45 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz