Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Umrechnung in die interne Zahlendarstellung eines Rechners (https://www.delphipraxis.net/144931-umrechnung-die-interne-zahlendarstellung-eines-rechners.html)

sahry 20. Dez 2009 00:14


Umrechnung in die interne Zahlendarstellung eines Rechners
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich brauche dringend Hilfe für mein letztes Uni Projekt. Mir fehlt nur noch dieser eine Schein und dann kann ich auch meine Diplom Arbeit abgeben, aber leider habe ich mich auf eine Projektarbeit eingelassen in einer Gruppe und wurde nun von dieser im Stich gelassen.. Ich hab die Aufgabe ein Umrechnungsprogramm zur internen Zahlendarstellung (im Hexsystem unn im Binärsystem) in Pascal zu schreiben. Was die Benutzeroberfläche angeht haben wir relativ strikte vorgaben. Ich glaub das hab ich richtig gelöst.
Ich bräuchte dringend Hilfe und das so schnell wie möglich. Ich würde echt nicht Fragen wenn ich mehr Zeit hätte, aber mich hat es schon 3 Wochen gekostet die Benutzeroberfläche zu erstellen weil ich mich mit Delphi/Pascal wirklich null auskenne. Vielleicht möchte mir ja jemand Helfen und hat sogar spaß an der Aufgabe.



Delphi-Quellcode:
unit EINGABE1;

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls, Buttons, Mask, ExtCtrls;

type
  TFormular = class(TForm)
    LabelUeberschrift: TLabel;
    RadioGroupAusgabetyp: TRadioGroup;
    RadioButtonFestpunkt: TRadioButton;
    RadioButtonIBMDW: TRadioButton;
    RadioButtonIBMExt: TRadioButton;
    RadioButtonIEEELReal: TRadioButton;
    RadioButtonIEEEExtReal: TRadioButton;
    LabelEingabe: TLabel;
    MaskEditEingabeInt: TMaskEdit;
    MaskEditEingabeReal: TMaskEdit;
    LabelAusgabe: TLabel;
    EditAusgabeHex: TEdit;
    EditAusgabeBin: TEdit;
    BitBtnExit: TBitBtn;
    BitBtnUmrechnen: TBitBtn;
    GroupBoxEingabetyp: TGroupBox;
    RadioButtonInteger: TRadioButton;
    RadioButtonReal: TRadioButton;
    LabelSedezimal: TLabel;
    LabelBinaer: TLabel;
    procedure RadioButtonIntegerClick(Sender: TObject);
    procedure RadioButtonRealClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure BitBtnUmrechnenClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Formular: TFormular;

implementation

{$R *.DFM}

procedure TFormular.RadioButtonIntegerClick(Sender: TObject);
begin
  RadioButtonIBMDW.Enabled      := FALSE;
  RadioButtonIBMExt.Enabled     := FALSE;
  RadioButtonIEEELReal.Enabled  := FALSE;
  RadioButtonIEEEExtReal.Enabled := FALSE;
  RadioButtonFestpunkt.Enabled  := TRUE;
  RadioButtonFestpunkt.Checked  := TRUE;
  MaskEditEingabeInt.Visible    := TRUE;
  MaskEditEingabeReal.Visible   := FALSE;

end;

procedure TFormular.RadioButtonRealClick(Sender: TObject);
begin
  RadioButtonIBMDW.Enabled      := TRUE;
  RadioButtonIBMExt.Enabled     := TRUE;
  RadioButtonIEEELReal.Enabled  := TRUE;
  RadioButtonIEEEExtReal.Enabled := TRUE;
  RadioButtonFestpunkt.Enabled  := FALSE;
  RadioButtonFestpunkt.Checked  := FALSE;
  RadioButtonIBMDW.Checked      := TRUE;
  MaskEditEingabeInt.Visible    := FALSE;
  MaskEditEingabeReal.Visible   := TRUE;
end;

procedure TFormular.FormShow(Sender: TObject);
begin
  RadioButtonInteger.Checked := TRUE;
end;


{ NEU }

procedure TFormular.BitBtnUmrechnenClick(Sender: TObject);


begin { TFormular.BitBtnUmrechnenClick }
  IF (RadioButtonFestpunkt.Checked AND(MaskEditEingabeInt.Text = ''))
     OR (RadioButtonReal.Checked AND (MaskEditEingabeReal.Text = ''))
  THEN Exit;

  IF RadioButtonFestpunkt.Checked
  THEN BEGIN  { Ganzzahlige Umrechnung }

         { ===> Code für ganzzahlige Umrechnung einfügen }

         { Ausgabe nach EditAusgabeHex.Text und EditAusgabeBin.Text }

       END
  ELSE BEGIN  { Realzahlige Umrechnung }
         IF RadioButtonIBMDW.Checked
            OR RadioButtonIBMExt.Checked
         THEN BEGIN

                { ===> Code für Umrechnung IBM-Gleitpunktformate einfügen }

                { Ausgabe nach EditAusgabeHex.Text und EditAusgabeBin.Text }

              END
         ELSE BEGIN

                { ===> Code für Umrechnung IEEE-Gleitpunktformate einfügen }

                { Ausgabe nach EditAusgabeHex.Text und EditAusgabeBin.Text }
              END;
       END;

end  { TFormular.BitBtnUmrechnenClick };


end.


Die Benutzeroberfläche sind dementsprechend so aus:

(Siehe Anhang)

So jetzt fehlen mir natürlich die Code Teile für die Umrechnungen. Wenn jemand mir helfen möchte einfach hier melden.

Edit: Ahso für die Eingaefelder gibt es auch Beschränkungen.
Wenn es Integer ist dann dürfen nur ganze Zahlen eingegeben werden und Vorzeichen.
Bei Real darf auch noch ein Komma eingegeben werden.
Damit hab ich mich schon beschäftigt und dachte an diese Lösung:

Delphi-Quellcode:
procedure TFormular.MaskEditEingabeIntKeyPress(Sender: TObject;
  var Key: Char);
   begin
     if not (Key in ['0'..'9', '+', '-', #8]) then
     begin
     SysUtils.Beep;
     ShowMessage('Bitte geben Sie eine ganze Zahl ein');
     Key := #0;

        end;
     end;

procedure TFormular.MaskEditEingabeRealKeyPress(Sender: TObject;
  var Key: Char);
begin
     if not (Key in ['0'..'9', ',', '+', '-', #8]) then
     begin
     SysUtils.Beep;
     ShowMessage('Bitte geben Sie eine Zahl ein');
     Key := #0;

     end;
      end;
Für weitere und genauere Infos steh ich zur Verfügung

[edit=SirThornberry]Bild in Anhang gepackt damit der Beitrag nicht irgendwann wertlos/unvollständig wird wenn das Bild vom externen Server verschwindet. Mfg, SirThornberry[/edit]

SirThornberry 20. Dez 2009 00:44

Re: Brauche dringend Hilfe für letztes Uni Projekt
 
Kannst du bitte deinem Beitrag einen aussagekräftigen Titel geben der das Problem ansatzweise beschreibt? :) Titel wie "Problem bei Schulprojekt", "Brauche Hilfe bei Programm" etc. sagen leider rein gar nichts darüber aus worum es bei dem Thema geht. ("Hilfe", "Dringend" etc. können übrigens weg gelassen werden da so ziemlich jeder der eine Frage hat Hilfe benötigt und diese möglichst schnell haben will).
Aus deinem Beitrag geht übrigens auch nicht hervor bei was konkret du Probleme hast. Du schreibst nur
Zitat:

So jetzt fehlen mir natürlich die Code Teile für die Umrechnungen.
Aber welches Problem konkret dich da aufhält verschweigst du so das wir dir nur schwer helfen können.

Die Muhkuh 20. Dez 2009 00:52

Re: Brauche dringend Hilfe für letztes Uni Projekt
 
Zitat:

Zitat von sahry
Ich würde echt nicht Fragen wenn ich mehr Zeit hätte, aber mich hat es schon 3 Wochen gekostet die Benutzeroberfläche zu erstellen weil ich mich mit Delphi/Pascal wirklich null auskenne. Vielleicht möchte mir ja jemand Helfen und hat sogar spaß an der Aufgabe.

:lol:

Sorry, selbst ein Anfänger kann die von Dir gezeigte Oberfläche in einer Stunde zusammenklicken.

Wie rechnest Du die Zahlen denn von Hand um? Nichts anderes musst Du in Delphi machen.

Luckie 20. Dez 2009 00:57

Re: Brauche dringend Hilfe für letztes Uni Projekt
 
Und die viel verschmähte und oft gemiedene Forensuchen ist auch mal einen Blick wert. ;)

sahry 20. Dez 2009 01:12

Re: Brauche dringend Hilfe für letztes Uni Projekt
 
Wie ich sie von Hand umrechne ist mir schon klar.
Bei den ganzen Zahlen würde ich es wohl so machen
Delphi-Quellcode:
x:= StrToInt(MaskEditEingabeInt.Text);
i:=x;
repeat
y:=(i mod 16);
i:=trunc(int(i/16));
hexa:=s[y]+hexa
until i=0;
und bei dem binär System halt mir mod 2.

Da weiß ich aber nich wie ich die Vorzeichen sinnvoll einfügen kann.


Aber was ist den mit dem Kommazahlen?

da müsste ich theoretisch einmal die Vorkommazahl und die Nachkommazahl seperat berechnen lassen dann noch die Zahl normieren oder wie das heißt und dann noch den Exponenten umrechnen und dann aus allem zusammen die Gleitkommazahl der internen Darstellung bilden oder wie? Weil ich soll ja die Interne Darstellung des Rechners angeben und nich einfach umrechnen. Das ist doch ein Unterschied.

Weil 18,4 einfach umgerechnet ist: 10010,011001100110011...
als Gleitkommazahl dagegen ist 18,4= 0 10000011 00100110011001100110011

Medium 20. Dez 2009 02:42

Re: Umrechnung in die interne Zahlendarstellung eines Rechne
 
Da dürfte dich zum einen dieser Artikel interessieren, genauer aber wohl eher der hier, der sich auf die in Computern meist verwendeten Fließkommazahlen bezieht, und u.a. auch Umrechnungsmöglichkeiten angibt.
Edit: Ich seh grad, dass ihr sehr spezifische Normen, u.a. auch 128Bit Floats umrechnen müsst. Da wäre der erste Artikel erstmal interessanter, da er generell auf Floats eingeht. Der 2. bezieht sich auf die heutzutage in Home-PCs üblicherweise verwendeten Normen. Der folgende Tipp ist daher nur eingeschränkt in deinem Beispiel verwendbar.

Für den Fall, dass ihr die Umrechnung nicht unbedingt bauen müsst, sondern es eher um die Anzeige geht, kann man sich auch mit ein wenig "Tricksen" (variante Records) behelfen:
Delphi-Quellcode:
type
  TDoubleRec = record
    case Boolean of
      true: Float: Double;
      false: Bytes: packed array[0..7] of Byte;
    end;
  end;
Wenn du einer Variablen von dem Typ (nennen wir sie mal "Foo") nun via "Foo.Float := 3.1415629;" einen Wert zuweist, stehen im Array "Foo.Bytes[]" die einzenen Bytes die zu der internen Darstellung gehören. Die Bytes nun wie gewohnt in Binärdarstellung bringen und hintereinander schreiben, und du müsstest es haben. Eventuell muss man dabei noch die Endianness beachten.

himitsu 20. Dez 2009 10:18

Re: Umrechnung in die interne Zahlendarstellung eines Rechne
 
Zitat:

Zitat von Medium
Edit: Ich seh grad, dass ihr sehr spezifische Normen, u.a. auch 128Bit Floats umrechnen müsst.

Jupp, genau hier muß man wohl selber die Darstllung errechnen und kann nicht abgucken, so wie bei den IEEE-Formaten, welche Windows, bzw. der PC kennt.
Also vermute ich mal, daß diese IEEE-Typen auch selber berechnet werden sollen.


PS: Was ist ein 32-Bit-Festpunkt?
Das sagt mir nichts in welchem Format und mit wieviel Nachkommastellen das sein soll.

Currency ist z.B. ein 64-Bit Festpunkttyp mit 4 Nachkommestellen und in der Zweierkomplement-Darstellung,
also Int64/10000.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:29 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