2015-05-26 5 views
1

Извините за мой английский, так как я из Германии.Калькулятор экспонентов Delphi

Я построил программу: http://i.epvpimg.com/I0xie.png

И я хочу экспоненту калькулятор (я учусь на тест в школе), но у меня есть проблема ...

Если я номер «Zahl» (что означает «число» на немецком языке). Например: Number= "2", затем я делаю exponent = "1".

Обычно я должен получить результат 2, но я получаю 4, почему?

В чем проблема?

Вот мой код:

unit unit_oberflaeche; 

{$mode objfpc}{$H+} 

interface 

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

type 

    { TForm1 } 

    TForm1 = class(TForm) 
    Button1: TButton; 
    Edit1: TEdit; 
    Edit2: TEdit; 
    Label1: TLabel; 
    Label2: TLabel; 
    Panel1: TPanel; 
    procedure Button1Click(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 

    private 
    { private declarations } 
    public 
    { public declarations } 
    end; 

var 
    Form1: TForm1; 
    rechner: Texponentrechner; 

implementation 

{$R *.lfm} 

{ TForm1 } 


procedure TForm1.FormCreate(Sender: TObject); 
begin 
    rechner := Texponentrechner.Create; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
VAR i, LVexponent, LVzahl, result: INTEGER; 
    BEGIN 
    LVexponent := StrToInt(Edit2.Text); 
    LVzahl  := StrToInt(Edit1.Text); 
    rechner.set_exponent(LVexponent); 
    rechner.set_zahl(LVzahl); 
     FOR i := 1 TO LVexponent DO 
      BEGIN 
       result := result * LVzahl 

      end; 
     //result := LVzahl; 
    Panel1.Caption := IntToStr(result); 
    end; 

end. 

А вот другая часть:

unit unit_inhalt; 

{$mode objfpc}{$H+} 

interface 

uses 
    Classes, SysUtils; 


TYPE 
    Texponentrechner = class 
    private 
    { private declarations } 
    Fexponent : INTEGER; 
    Fzahl  : INTEGER; 

    public 
    { public declarations } 

    procedure set_exponent (WPexponent:INTEGER); 
    procedure set_zahl  (WPzahl:INTEGER); 

    function berechne_betrag():INTEGER; 
    end; 




implementation 

procedure Texponentrechner.set_exponent(WPexponent:INTEGER); 
BEGIN 
     Fexponent := WPexponent; 
end; 

procedure Texponentrechner.set_zahl(WPzahl:INTEGER); 
BEGIN 
     Fzahl := WPzahl; 
end; 

function Texponentrechner.berechne_betrag():INTEGER; 
BEGIN 
     result := Fzahl * Fzahl; 
end; 

end. 
+0

переменная 'result' не инициализируется (она инициализируется как 0 компилятором, но вы не уверены); Не называйте переменные и т. Д. На каком-либо языке, кроме английского: может быть, ваша программа будет использовать как-то, кто не понимает немецкий, но почти все программисты понимают английский. Вы имеете в виду «Exponent» - e^n (e = 2.71828)? – Abelisto

ответ

0

Я предполагаю, что ваш расчет показателя должно быть сделано в Texponentrechner классе. Во-первых, ваш расчет неверен, потому что он возвращает ваш номер, умноженный на себя, а во-вторых, вы никогда не называете эту функцию в первую очередь.

Так что ваша berechne_betrag функция должна выглядеть следующим образом:

function Texponentrechner.berechne_betrag(): integer; 
var i: integer; 
begin 
    Result := 1; 
    for i := 1 to Fexponent do 
    Result := Result * Fzahl; 
end; 

Тогда вы должны на самом деле назвать эту функцию, чтобы получить результат

rechner.set_exponent(LVexponent); 
rechner.set_zahl(LVzahl); 
result := rechner.berechne_betrag; 
Panel1.Caption := IntToStr(result); 

Также вы создаете rechner экземпляр объекта в FormCreate, но вы никогда не выпускают его, и поэтому вы создаете утечку памяти. Вы должны позвонить rechner.Free, когда закончите использовать объект. Поскольку вы сделали его глобальным var, вы создаете в FormCreate, надлежащее место для его выпуска будет находиться в FormDestroy

Но даже лучшей практикой было бы сделать его локальным для метода Button1Click.

... 
type 
    TForm1 = class(TForm) 
    Button1: TButton; 
    Edit1: TEdit; 
    Edit2: TEdit; 
    Label1: TLabel; 
    Label2: TLabel; 
    Panel1: TPanel; 
    procedure Button1Click(Sender: TObject); 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.lfm} 

{ TForm1 } 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    LVexponent, LVzahl, result: integer; 
    rechner: Texponentrechner; 
begin 
    rechner := Texponentrechner.Create; 
    try 
    LVexponent := StrToInt(Edit2.Text); 
    LVzahl  := StrToInt(Edit1.Text); 
    rechner.set_exponent(LVexponent); 
    rechner.set_zahl(LVzahl); 
    result := rechner.berechne_betrag; 
    Panel1.Caption := IntToStr(result); 
    finally 
    rechner.Free; 
    end; 
end; 

end.