Liczby Mersenne'a - zmiana kodu z konsolowego na obiektowy

0

Witam mam problem. Mam program napisany w konsoli, ale muszę go zmienić na program obiektowy. Ogólnie treść zadania brzmi tak :
Liczba Mersenne'a to liczba pierwsza postaci 2^p-1, przy czym p samo jest

Tu jest kod który wypisuje te liczby, ale kompletnie nie wiem co gdzie przypisać.

program Liczba;

{$APPTYPE CONSOLE}

uses
  Math,
  SysUtils;

function ND(N: Int64): Int64;
var
  i: Int64;
begin
  if N<2 then  ND := 0
   else
    if N<4 then  ND := N
     else
      if (N mod 2=0) then ND := 2
       else
        if (N mod 3=0) then ND := 3
         else
          begin
            ND := N;   i := 1;
            while 6*i-1<=Int(Power(N, 0.5)) do
             begin
               if N mod(6*i-1)=0 then
                begin
                  ND := 6*i-1;   Break;
                end
                else
                 if N mod(6*i+1)=0 then
                  begin
                    ND := 6*i+1;   Break;
                  end;
               if i mod 1000000=0 then
                 Write( #13, i div 1000000, 'M (',
                        100.0*i/Int(Power(N, 0.5)): 0:1, '%)'#13 );
               Inc(i);
             end
          end;
end;

var
  znak: Char;
  i, iND, M, K: Int64;
  mar:real;

begin
  Writeln( 'Program szuka liczb Mersenne '
           + 'z podanego zakresu.' );
  repeat
    Write(#13#10#13#10'Podaj poczatek zakresu: ');   Readln(M);
    Write('Podaj koniec zakresu:   ');   Readln(K);
    if (M=1) or (M=2) then
      writeln (2, ' - ', 3);
    if (M mod 2=0)then  M := M + 1;
    i:=M;
    while i<K do
     begin
       iND := ND(i);
       if (iND=i) then
        begin
          mar := Power (2,i) -1;
          Writeln(i, ' - ',mar:0:0);
        end;
      i := i + 2;
     end;
    Write(#13#10#13#10'Czy rozpoczac nowe wyszukiwanie [T/N]? ');  Readln(znak);
   until UpCase(znak)<>'T';
   end.

W załączniku wysyłam zdjęcie jak to ma mniej więcej wyglądać.

1
  1. Zamień komponent Edit na SpinEdit - on może przyjmować tylko liczby, więc odpadnie sprawdzanie czy w kontrolce faktycznie użytkownik podał liczbę;
  2. W designerze, po dwukrotnym kliknięciu w przycisk, zostanie wygenerowane zdarzenie; W tym zdarzeniu sprawdź dane wejściowe czy się zgadzają, a następnie wykonaj obliczenia i wpisuj wyniki do komponentu; Możesz Memo zamienić na ListBox;
  3. Zamień wywołania procedury Write na Memo.Lines.Add, a wewnątrz nawiasów wsadź funkcję IntToStr lub Format, aby przekonwertować liczbę na łańcuch znaków;
  4. Czas możesz liczyć z dokładnością do milisekund - funkcja GetTickCount będzie odpowiednia; Pobierz czas za pomocą wymienionej funkcji przed wywołaniem funkcji liczącej, a po jej wykonaniu pobierz ponownie, na koniec wyniki odejmij - otrzymasz liczbę milisekund trwania obliczeń.
0

Nie wiem dlaczego, ale teraz chcąc podnieść liczbę do potęgi za pomocą funkcji POWER wyskakuje mi, że power to zmienna, która jest niezdeklarowana.

0

Rzadko piszę to się wydrę teraz. BACZNOŚĆ I CZYTAJ UWAŻNIE: NAJPIERW GOOGLUJ I KOMBINUJ SAMODZIEKNIE DO BÓLU A PYTAJ O COKOLWIEK GDZIEKOLWIEK W OSTATECZNOŚCI. Spocznij i uważnie przeczytaj Power

0
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Samples.Spin;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    SpinEdit1: TSpinEdit;
    procedure FormCreate(Sender: TObject);
    procedure Memo1Change(Sender: TObject);
    procedure SpinEdit1Change(Sender: TObject);
  private
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

{$APPTYPE CONSOLE}
function IntToStr(Value: Integer): string; overload;
function IntToStr(Value: Int64): string; overload;
function Power(const Base, Exponent: Extended): Extended;
function ND(N: Int64): Int64;
var
  i, iND, M, K,ND: Int64;
  mar:string;
begin
 memo1.Lines.Clear;
  if N<2 then  ND := 0
   else
    if N<4 then  ND := N
     else
      if (N mod 2=0) then ND := 2
       else
        if (N mod 3=0) then ND := 3
         else
          begin
            ND := N;   i := 1;
            while 6*i-1<=Int(Power(N, 0.5)) do
             begin
               if N mod(6*i-1)=0 then
                begin
                  ND := 6*i-1;   Break;
                end
                else
                 if N mod(6*i+1)=0 then
                  begin
                    ND := 6*i+1;   Break;
                  end;
               if i mod 1000000=0 then
                 Write( #13, i div 1000000, 'M (',
                        100.0*i/Int(Power(N, 0.5)): 0:1, '%)'#13 );
               Inc(i);
             end
          end;
end;

var
  i, iND, M, K: Int64;
  mar:real;

begin

    M:=1;
    K:= SpinEdit1.Value;
    if (M=1) or (M=2) then
      memo1.Lines.add(IntToStr(3));
    if (M mod 2=0)then  M := M + 1;
    i:=M;
    while i<K do
     begin
       iND := ND(i);
       if (iND=i) then
        begin
          mar := Power (2,i) -1;

        end;
      i := i + 2;
     end;


end;
end.

Za wszystkie poprzednie odpowiedzi dziękuję. Mam teraz takie błędy :

E2250 There is no overloaded version of 'IntToStr' that can be called with these arguments
E2029 ';' expected but '.' found
E2029 Declaration expected but end of file found
E2029 ';' expected but end of file found
E2065 Unsatisfied forward or external declaration: 'TForm1.Memo1Change'
E2065 Unsatisfied forward or external declaration: 'TForm1.SpinEdit1Change'

Nie wiem za bardzo o co chodzi z tym IntToStr i końcem tego programu.

1

po pierwsze oddziel obliczenia i ich wyniki od wizualizacji wyników
u Ciebie funkcja 'function ND(N: Int64): Int64' nie zwraca nic , żadnego wyniku , za to w kodzie wyświetla jakieś dane.
na razie zostaw na bok programowanie obiektowe i zajmij się takim zbudowaniem funkcji ND aby ta zwracała tylko wynik obliczeń , ale nic nie wyświetlała . Użycie "write" albo "writeln" albo jakiegokolwiek innego mechanizmu wizualizującego wynik obliczeń w ciele funkcji numerycznej to programistyczna zbrodnia :)
pomijam już to że "write" i "writeln" nie działają w aplikacji okienkowej

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