Pascal jak sprawdzić czy liczba jest kwadratem

0

Cześć,
chciałem prosić o jakieś podpowiedzi jak mogę sprawdzić czy podana liczba jest kwadratowa? Trzeba zastosować warunek if z sqrt?

0

no

3

A jak matematycznie byś to sprawdził? Jeśli int(sqrt(x))*int(sqrt(x)) == x to znaczy ze liczba x jest kwadratem liczby naturalnej.

0

Czyli program będzie tak wyglądał? Nie mam kompilatora, żeby sprawdzić czy działa.

program kwadrat;
var
  x:integer;
begin
  writeln('Podaj kwadrat');
  Readln(x);
if (sqrt(x)*sqrt(x))=x then write(x,' jest liczba kwadratowa') else write('podana liczba calkowita nie jest liczba kwadratowa');
end.
3

Po pierwsze to powinieneś podać nazwę środowiska/kompilatora, w którym chcesz testować program; Dla przykładu, pod FPC Twój kod działa nieprawidłowo, bo uznaje liczbę 5 jako kwadratową, a taką ta liczba nie jest (w innych nie sprawdzałem);

Przede wszystkim trzeba zauważyć, że funkcja Sqrt zwraca wartość zmiennoprzecinkową, a nie całkowitoliczbową, więc jeśli z klawiatury wprowadzasz liczbę typu Integer, to pierwiastekowi liczby trzeba obciąć część ułamkową; Do tego celu służy funkcja Trunc; Na koniec podnieść trzeba ten obcięty pierwiastek liczby do kwadratu i porównać z liczbą wprowadzoną przez użytkownika;

Przykład poprawnie działającego kodu pod FPC:

program SquareNumber;

{$mode objfpc}{$H+}

var
  intNumber, intSqRt: Integer;
begin
  Write('Put a number: ');
  ReadLn(intNumber);

  intSqRt := Trunc(SqRt(intNumber));

  if intSqRt * intSqRt = intNumber then
    Write('Number is square')
  else
    Write('Number is not square');

  ReadLn();
end.

Inny przykład - http://ideone.com/ThBmp0

0

Da się to zrobić bez pętli np.
Tylko jak daje liczbe z minusem od razu jakiś błąd jest.

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  a, x:real;
begin
writeln('Podaj liczbe kwadratowa: ');
readln(a);

x:=sqrt(a);

if x*x=a then writeln('Jest kwadratowa') else writeln('Nie jest liczba kwadratowa');

readln;
end.

lub przy użyciu integer

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  a, x:integer;
begin
writeln('Podaj liczbe kwadratowa: ');
readln(a);

x:=trunc(sqrt(a));

if x*x=a then writeln('Jest kwadratowa') else writeln('Nie jest liczba kwadratowa');

readln;
end.
0

A można wyciągać (rzeczywiste) pierwiastki kwadratowe z liczb ujemnych?

0

czyli te dwa programy spełniają swoją funkcje? Jeszcze mam pytanie jak zapisać potęgę lub pierwiastek większego stopnia?

0

Nie spełniają. Musisz dopisać sprawdzenie czy a >= 0, i jeśli a okaże się ujemne to skorzystaj z:

writeln('Nie jest liczba kwadratowa');
0

Teraz jest dobrze?

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  a, x:real;
begin
writeln('Podaj liczbe kwadratowa: ');
readln(a);
if a>=0 then x:=sqrt(a);
if x*x=a then writeln('Jest kwadratowa') else writeln('Nie jest liczba kwadratowa');


readln;
end.
0

Tak.

0

Technicznie tak, ale praktycznie masz wykorzystanie niezainicjowanej jawnie zmiennej x (w domyśle jako globalna ma wartość zero, lecz nie wiem czy to reguła, a na pewno tracisz przy tym na czytelności).

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