Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Programm Analye (https://www.delphipraxis.net/186161-programm-analye.html)

FACS 9. Aug 2015 08:14


Programm Analye
 
Hallo Welt,

habe mal eine Allgemeine Frage zu einem von mir geschriebenen Quellcode:

Delphi-Quellcode:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls, Math;

type

  { Trechen_programm }

  Trechen_programm = class(TForm)
    Berechnen_Knopf: TButton;
    Beenden_Knopf: TButton;
    Label2: TLabel;
    Panel1: TPanel;
    s_Eingabe: TEdit;
    Label1: TLabel;
    s_Ausgabe: TEdit;
    procedure Beenden_KnopfClick(Sender: TObject);
    procedure Berechnen_KnopfClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  rechen_programm: Trechen_programm;

implementation

{$R *.lfm}

{ Trechen_programm }

procedure Trechen_programm.FormShow(Sender: TObject);
begin

  rechen_programm.Caption := 'Funktionsberechnung';
  s_Eingabe.Caption := '';
  s_Ausgabe.Caption := '';
  Panel1.Caption := '';
  Berechnen_Knopf.Caption := 'Berechnen';
  Beenden_Knopf.Caption := 'Beenden';

end;

procedure Trechen_programm.Beenden_KnopfClick(Sender: TObject);
begin

  close;

end;

procedure Trechen_programm.Berechnen_KnopfClick(Sender: TObject);
var i, x, z : integer;

begin

  i := 0;
  x := 0;
  z := 0;

  x := StrToInt (s_Eingabe.Text);

  while x <> 1 do begin
     if (x mod 2 = 0) then begin
         x := (x / 2);                    [B]//Bezüglich dieser Zeile gibt mir Lazarus aus unit1.pas(73,15) Error: Incompatible types: got "Double" expected "LongInt"[/B]
         Panel1.Caption := IntToStr (x);
     end

     else
         x := (x * 3) + 1;
         z := z + 1;
         s_Ausgabe.Text := IntToStr (z);
     end;
end;
end.
Das Programm wurde mit Lazarus entwickelt und nimmt die oben Fettgedruckte Zeile nicht! Wäre super, wenn ich von euch hilfsbereiten Support erhalten würde.
Vielen Dank im Voraus!

haentschman 9. Aug 2015 08:54

AW: Programm Analye
 
Hallo FACS...

Willkommen hier :dp:
Zitat:

x := (x / 2); //Bezüglich dieser Zeile gibt mir Lazarus aus unit1.pas(73,15) Error: Incompatible types: got "Double" expected "LongInt"
Die Fehlermeldung ist logisch. X ist als Integer (Ganzzahl) deklariert. Mit der Division "könnte" ein Nachkommaanteil herauskommen. Deshalb funktioniert die Zuweisung nicht.
Wenn das Ergebnis grundsätzlich eine Ganzzahl sein soll verwende div statt /.

PS: Und schau dir die Hilfe zu div an damit du verstehst.

PS2: Bitte setze deinen Quelltext in Delphi Tags. (der Button mit dem Helm)

hanvas 9. Aug 2015 09:05

AW: Programm Analye
 
Zitat:

Zitat von FACS (Beitrag 1311553)
Hallo

x := (x / 2); //Bezüglich dieser Zeile gibt mir Lazarus aus unit1.pas(73,15) Error: Incompatible types: got "Double" expected "LongInt"

Wenn Du statt / den Operator DIV verwendest sollte alles i.O sein.

Da der Compiler während des Compilierens im Allgemeinen keine Annahme darüber trifft wie das Ergebnis aussieht gibt es häufig zwei Operatoren zur Division. In Delphi wäre das eben / und DIV. Der Operator DIV führt eine Division zweier Ganzzahlen durch und vergisst den Rest, / führt eine normale Division durch und hat einen Rest - das Ergebnis ist eine Fließkommezahl.

Falls Du von C od. C++ kommst, darin unterscheidet sich Pascal von C oder C++. In C artigen Sprachen wird der Operator / sowohl für die ganzzahlige Division wie auch für die normale Division verwendet. Der Unterschied wird durch die Datentypen der beteiligten Operanden bestimmt.

C 3 / 2 Ergebnis ist 1
3 / 2.0 Ergebnis ist 1.5

Delphi 3 DIV 2 Ergebis ist 1
3 / 2 Ergebnis ist 1.5

hth Ha-Jö

mensch72 9. Aug 2015 09:27

AW: Programm Analye
 
Das ganze mal als Aufgabe erfasst:
- mit dem "Ist Mod 2 gleich 0" steht da ja, das nur gerade und somit restlos durch 2 teilbare Zahlen anschließend durch 2 ganzzahlig geteilt werden.
- ganzzahliges teilen geht in Pascal mit "div"
- ganzzahliges teilen von positiven 2er Potenzen geht auch binär mit "shr" und auch ein MOD mit 2er Potenzen geht binär mit "and"

Delphi-Quellcode:
if ((x and 1) = 0) then begin
    x := (x shr 1);                
    Panel1.Caption := IntToStr (x);
end
- wenn dir das so seltsam vorkommt.. bist du damit nicht allein und in Pascal muss man das nicht so machen (aber hilft beim Verständnis wie die Ganzzahlen intern gespeichert sind)
- wenn du verstehst warum dies auch funktioniert, dann klappt es auch ganz von alleine mit dem warum fürs "div":)
- Funktion als Text: bei geraden Zahlen ist das LSB immer 0 und das Rechtsschieben um 1 entspricht der Division durch 2

Luckie 9. Aug 2015 14:08

AW: Programm Analye
 
Und selbst wenn die Division "aufgehen" sollte ohne Nachkommastellen, bei 4:2 zum Beispiel, wird für dem Comoputer das Ergebnis 1,9999999999999999999999999999999999999 im ungünstigsten Fall sein. (4:2 war nur ein Beispiel zur Verdeutlichung.) Das liegt daran, dass die Umwandlung Dezimal/Binär und Binär/Dezimal nicht immer genau sein kann, da manche Dezimalzahlen nicht 1:1 binär abgebildet werden können.

Aber wie schon gesagt, Delphi erwartet bei der Division mit / eine Fließkommazahl als Ergebnis.


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