AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Umrechnen von Zahlensystem

Ein Thema von Ghose · begonnen am 7. Nov 2009 · letzter Beitrag vom 8. Jan 2010
Antwort Antwort
Seite 1 von 3  1 23      
Ghose

Registriert seit: 7. Nov 2009
Ort: Herzebrock-Clarholu
3 Beiträge
 
#1

Umrechnen von Zahlensystem

  Alt 7. Nov 2009, 17:39
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
Angehängte Dateien
Dateityp: rar neu_105.rar (2,9 KB, 12x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#2

Re: Umrechnen von Zahlensystem

  Alt 7. Nov 2009, 17:55
Erstmal herzlich willkommen in der 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
Wolfgang Mix
if you can't explain it simply you don't understand it well enough - A. Einstein
Mein Baby:http://www.epubli.de/shop/buch/Grund...41818516/52824
  Mit Zitat antworten Zitat
Benutzerbild von patti
patti

Registriert seit: 20. Okt 2004
Ort: Mittelfranken
665 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Umrechnen von Zahlensystem

  Alt 7. Nov 2009, 18:08
Zumindest das hier kann ich dir erklären:

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:

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
Patrick Kreutzer
[Informatik-Student im 4. Semester]
http://www.patti-k.de/
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Umrechnen von Zahlensystem

  Alt 7. Nov 2009, 23:35
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Ghose

Registriert seit: 7. Nov 2009
Ort: Herzebrock-Clarholu
3 Beiträge
 
#5

Re: Umrechnen von Zahlensystem

  Alt 9. Nov 2009, 15:05
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#6

Re: Umrechnen von Zahlensystem

  Alt 9. Nov 2009, 15:19
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
Marvin
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

Re: Umrechnen von Zahlensystem

  Alt 9. Nov 2009, 16:43
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Ghose

Registriert seit: 7. Nov 2009
Ort: Herzebrock-Clarholu
3 Beiträge
 
#8

Re: Umrechnen von Zahlensystem

  Alt 10. Nov 2009, 15:22
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;
  Mit Zitat antworten Zitat
Sekkuar

Registriert seit: 10. Dez 2009
11 Beiträge
 
#9

Re: Umrechnen von Zahlensystem

  Alt 10. Dez 2009, 21:58
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#10

Re: Umrechnen von Zahlensystem

  Alt 10. Dez 2009, 22:20
Welche Delphi-Version nutzt du?

ReverseString liegt mindestens seit Delphi 7 in StrUtils rum.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es 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

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:15 Uhr.
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