X do potegi K na forze [zadanie prawie zrobione, ale nie chce działać]

0

Witam. Mam do zrobienia program w Delphi, któy będzie liczył X do potęgi K. Obydwie liczby wpisywane z klawiatury. Poprzez okienka. X ma być typu real, a K typu byte. Próbowałem już dużo róznych wersji, zawsze tam gdzie powienien być wynik mnożenia, jest 0 (zmienna z). Rzuci ktoś okiem? Tak mi to wygląda w praktyce --> http://imageshack.us/photo/my-images/543/xdokfail.jpg/

Poniżej cały kod programu... Prawdopodobnie błąd jest gdzieś w definicjach zmiennych, ale za cholerę nie mogę wymyśleć gdzie i jak powinienem zrobić żeby poszło... tzn, do wyświetlania jest dobrze i się zgadza wszystko na lajcie, tyle tylko że za nic nie chce obliczać tego co powinien. Zawsze jest zero ;f

unit X_do_K;

interface

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

type
  TForm1 = class(TForm)
    XdopotegiK: TLabel;
    wpiszX: TLabel;
    wpiszK: TLabel;
    WyswietlX: TLabel;
    WyswietlK: TLabel;
    WprowadzX: TEdit;
    WprowadzK: TEdit;
    Wprowadz: TButton;
    Label1: TLabel;
    Zakoncz: TButton;
    Rownasie: TLabel;
    WyswietlZ: TLabel;
    wyswWynik: TButton;
    procedure ZakonczClick(Sender: TObject);
    procedure WprowadzXChange(Sender: TObject);
    procedure WyswietlXClick(Sender: TObject);
    procedure WprowadzClick(Sender: TObject);
    procedure WprowadzKChange(Sender: TObject);
    procedure wyswWynikClick(Sender: TObject);
  private

  public
    { Public declarations }
  end;

var
  Form1: TForm1;
    x:double;
    k:byte;
    z:double;
    i:integer;
implementation

{$R *.dfm}

procedure TForm1.ZakonczClick(Sender: TObject);
begin
close;
end;

procedure TForm1.WprowadzXChange(Sender: TObject);
begin
 x:=StrToFloat(WprowadzX.Text);
end;

procedure TForm1.WyswietlXClick(Sender: TObject);
begin
WyswietlX.Caption:=FloatToStr(x);
end;

procedure TForm1.WprowadzClick(Sender: TObject);
var
i:integer;
k:byte;
z:double;
x:double;

begin
    x:=StrToFloat(WprowadzX.Text);
    k:=StrToInt(WprowadzK.Text);

    for i:=1 to 10 do
      begin
       z:=0;
       z:=z*x;
      end;

end;

procedure TForm1.WprowadzKChange(Sender: TObject);
begin
 k:=StrToInt(WprowadzK.Text);
end;

procedure TForm1.wyswWynikClick(Sender: TObject);
begin


 WyswietlX.Caption:=(FloatToStr(x));
 WyswietlK.Caption:=(IntToStr(k));
 WyswietlZ.Caption:=(FloatToStr(z));
end;

end.
0

tak na szybko

   for i:=1 to 10 do
      begin
       z:=0;
       z:=z*x;
      end;
  1. skoro x ma być podnoszone do potęgi k to pętla powinna chyba iść od 1 do k
  2. każdy przebieg pętli zeruje zmienną z - zmienna z powinna być przed pętlą i mieć wartość początkową 1
  3. po co to: WprowadzKChange(Sender: TObject); - przecież i tak w procedurze OnClick odczytujesz te dane

Popraw to, pojedziemy dalej... :)

0

Exis: tak jak madmike pisał. Dla potęgowania takich liczb jak opisałeś najlepiej stworzyć funckję w stylu tej poniżej...

function Potega(Podst : Real; Wykl : Byte) : Real;
var
  I : Byte;
  Res : Real;
begin
  Res := 1;
  for i := 1 to Wykl do
    Res := Res * Podst;
  Potega := Res;
end;

Poza tym właśnie te wpisywanie w OnChange jest zbędne. A jeżeli chcesz mieć pewność, że użytkownik podał prawidlowe liczby to użyj TryFloatToStr oraz TryIntToStr, które to funkcje jeżeli zwracają False oznacza, że tekst nie jest liczbą lub jest ona w nieprawidlowym formacie.

0

hmm, to tak:
źle skopiowałem już, na szybko, gdyż próbowałem czy w ogóle mi ta pętla chodzi - otóż nie, przy czymkolwiek bym nie wstawił zawsze wyjdzie 0.
jak miałem wyzerowane z wcześniej, to także było 0 na wyjściu. Przy zmianach napisanych wg Ciebie dalej jest to samo... --> http://imageshack.us/photo/my-images/30/xdokfail2.jpg/

po co tamto..nie wiem, jeśli nie potrzebne to usunę, okej, ale to raczej nie zmienia faktu, iż nadal nie wiem co jest nie tak.

0

Zero wychodzi Tobie pewnie dlatego, ponieważ nigdzie tej zmiennej nie inicjujesz. A zmienna globalna nie zainicjowana typu liczbowego będzie wynośić zawsze zero. Dla zmiennej lokalnej jej wartośc początkowa jest nieokreślona. Najlepiej użyj funkcji Potega, której kod podałem i wszystko wtedy powinno być ok.

0

Albo daj ten kod w procedurerze OnClick i teraz zobacz co wypisze :]

   x:=StrToFloat(WprowadzX.Text);
   k:=StrToInt(WprowadzK.Text);

   z:=1;
   for i:=1 to k do
      begin
       z:=z*x;
      end;

   WyswietlX.Caption:=(FloatToStr(x));
   WyswietlK.Caption:=(IntToStr(k));
   WyswietlZ.Caption:=(FloatToStr(z));
0

Okej, teraz wszystko działa sposobem madmike...jak wpisałem z:=0; nad forem to wpisałem przez przypadek x zamiast z (/facepalm, yea :P)

Dzięki wielkie Wam ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1