Program : "systemy pozycyjne" - problem

0

Witam,
dostałem polecenie napisania programu który, oblicza wartosci liczby zapisanej w systemie pozycyjnym o podstawie p. Postanowiłem zrealizować zagadnienie w Delphi. Stworzyłem sobie interfejs i napisałem kod, tylko nie wiem czemu podczas uruchamiania czepia się rodzaju zadeklarowanych zmiennych. Jestem początkującym programistą i pewnie ten problem wydaje się banalny, ale dla mnie taki nie jest. Myślę, że dla społeczności tego forum, która jak sądzę składa się z programistów nie będzie problemu z odpowiedzeniem na moje pytanie na podstawie kodu źródłowego, który poniżej zamieszczam: co jest źle w tym kodzie co powinienem zmienić, tak ażeby działał?

Oto kod źródłowy:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Button1: TButton;
    GroupBox1: TGroupBox;
    Label4: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var
  s : string;
  p,w,L,i,c : cardinal;

begin
  p:= StrToFloat (Edit1.text);
  s:= StrToFloat (Edit2.text);

  w := 1; L := 0;

    for i := length(s) downto 1 do
  begin
    c := ord(s[i]) - ord('0');
    inc(L, w * c);
    w := w * p;
  end;
    Label4.Caption:= FloatToStr(c);

end;

end.

Z góry dziękuję za pomoc i pozdrawiam.

0

zamiast FloatToStr użyj IntToStr
zamiast StrToFloat użyj StrToInt
Cardinal to typ całkowity a używasz funkcji dla zmiennoprzecinkowych .

0
  p:= StrToInt (Edit1.text);
  s:= Edit2.text;

Tak jak Piotr wspomniał:

Cardinal to typ całkowity a używasz funkcji dla zmiennoprzecinkowych

0

Jak zawszę na ludzi z tego forum można liczyć, dziękuje :), program zadziałał, ale źle liczy, albo wyświetla (ale to już moja wina) bo liczba 23314(5) to 1709(10) a mnie pokazuje tylko 2 :/, co tym razem może być źle może coś tu tym razem ?

  w := 1; L := 0;

    for i := length(s) downto 1 do
  begin
    c := ord(s[i]) - ord('0');
    inc(L, w * c);
    w := w * p;
  end;
    Label4.Caption:= FloatToStr(c);
0
Tchemik napisał(a)

Jak zawszę na ludzi z tego forum można liczyć, dziękuje :), program zadziałał, ale źle liczy, albo wyświetla (ale to już moja wina) bo liczba 23314(5) to 1709(10) a mnie pokazuje tylko 2 :/, co tym razem może być źle może coś tu tym razem ?

w := 1; L := 0;

for i := length(s) downto 1 do

begin
c := ord(s[i]) - ord('0');
inc(L, w * c);
w := w * p;
end;
Label4.Caption:= FloatToStr(c);



Pokazuje dokładnie to, co mu każesz pokazywac - c := ord(s[i]) - ord('0') z pierwszego znaku stringu :) (bo taką wartośc ma i na zakończeniu pętli)
0

Witam, moich zmagań z tym zagadnieniem ciąg dalszy :). Teraz dostałem polecenie przerobienia tego programu, tak ażeby liczył do podstawy 16, teraz liczy tylko do 10 ponadto program ma działać też w drugą stronę tzn jak mamy już jakąś liczbe systemie powiedzmy o podstawie 16 to program ma miec rowniez mozliwość ponownego przeliczenia jej z 16 na 10. Czy ktoś z was wie jak to zrealizować w Delphi, poniżej zamieszczam jeszcze raz cały kod mojego programu. Jak należy go przerobić tak ażeby działał wg powyższego schematu? Z góry dziękuje za pomoc.

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Button1: TButton;
    GroupBox1: TGroupBox;
    Label4: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var
  s : string;
  p,w,L,i,c : cardinal;

begin
  p:= StrToInt (Edit1.text);
  s:= Edit2.text;

  w := 1; L := 0;

    for i := length(s) downto 1 do
  begin
    c := ord(s[i]) - ord('0');
    inc(L, w * c);
    w := w * p;
  end;
    Label4.Caption:= IntToStr(L);

end;

end.

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