Cześć,
chciałem prosić o jakieś podpowiedzi jak mogę sprawdzić czy podana liczba jest kwadratowa? Trzeba zastosować warunek if z sqrt?
no
A jak matematycznie byś to sprawdził? Jeśli int(sqrt(x))*int(sqrt(x)) == x
to znaczy ze liczba x
jest kwadratem liczby naturalnej.
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.
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
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.
A można wyciągać (rzeczywiste) pierwiastki kwadratowe z liczb ujemnych?
czyli te dwa programy spełniają swoją funkcje? Jeszcze mam pytanie jak zapisać potęgę lub pierwiastek większego stopnia?
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');
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.
Tak.
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).