2015-10-11 3 views
0

Я хочу вставить номер, и программа сообщает мне, является ли число квадратом натурального числа или не. До сих пор он говорит, что что-то не так в , если (х ДИВ КОРЕНЬ (х) = SQRT (х))есть способ написать if (x div sqrt (x) = sqrt (x)), потому что он не работает

program Naturalnumbers; 
var 
    x : integer; 
begin 
    writeln (' is the inserted number a square of a natural number? '); 
    readln (x); 

    if (x div sqrt(x)=sqrt(x)) then 
    writeln('yes') 
    else 
    writeln('no') 

    readln; 
end; 
+0

Эй! У меня есть несколько предложений по улучшению вашего вопроса, который заставит кого-то быстро ответить на него. Во-первых, в заголовке введите описание проблемы и задайте только вопрос в теле. Кроме того, включите немного более длинное описание того, что вы пытаетесь сделать, и какое сообщение об ошибке/нежелании вы получаете, когда вы пробовали то, что вы пробовали. Во-вторых, отметьте весь свой исходный код как таковой. Удачи! – Yuval

ответ

1

Вы пытаетесь сделать x div sqrt(x) где x является Integer. Функция возвращает Extended. Это число с плавающей запятой. Оператор div является подразделением для номеров Integer. Поэтому он не может быть использован здесь.

Вы можете сохранить возвращаемое значение Sqrt в переменной Extended. Затем вы можете отрезать часть за десятичным разделителем, используя Trunc, Ceil или Floor и сохранить значение в другой переменной Integer, чтобы умножить ее позже на себя и сравнить ее с x. Это выглядит следующим образом:

program project1; 

var 
    x, truncatedSquareRoot : integer; 
    squareRoot: extended; 

begin 
    writeln (' is the inserted number a square of a natural number? '); 
    readln (x); 

    squareRoot := sqrt(x); 
    truncatedSquareRoot := Trunc(squareRoot); 

    if ((truncatedSquareRoot * truncatedSquareRoot) = x) then 
    writeln('yes') 
    else 
    writeln('no'); 

    readln; 
end.     

Это полезно для хранения результата дорогом расчета как Sqrt в переменной, чтобы не делать это дважды.

1

Это можно сделать быстрее в одной строке кода и без дополнительных переменных: просто сравните результат sqrt с его укороченным значением. Например:

для x=64: sqrt(64)=8, trunc(sqrt(64))=8, =>(sqrt(64) = trunc(sqrt(64))) = true;

для x=65: sqrt(65)=8,062..., trunc(sqrt(65))=8, =>(sqrt(65) = trunc(sqrt(65))) = false;

program Naturalnumbers; 
var 
    x : integer; 
begin 
    writeln (' is the inserted number a square of a natural number? '); 
    readln (x); 

    if trunc(sqrt(x))=sqrt(x) then 
    writeln('yes') 
    else 
    writeln('no') 

    readln; 
end; 

Или даже без if then else заявление.

program Naturalnumbers; 
var 
    x: integer; 
const 
    Answ: array [False .. True] of string = ('No', 'Yes'); 
begin 
    writeln(' is the inserted number a square of a natural number? '); 
    readln(x); 
    write(Answ[trunc(sqrt(x)) = sqrt(x)]); 
    readln 
end; 
+0

Это на самом деле тот же подход, что и мой. Я использую переменные, чтобы облегчить начинающим. Я предполагаю, что ОП является новичком. – Wosi

+0

@Wosi Я был бы рад согласиться, но я не могу. Конечно, вы используете код, но вы делаете ненужное умножение 'CeiledSquareRoot' и сравниваете его с' x' (это может путать начинающего). Мой ответ готовит OP для обработки чисел (результат функции). Кроме того, мой код показывает основополагающий ответ на вопрос: «Как узнать, что число естественное?» Это было причиной публикации моего ответа и объяснения. Извините, если я вас обидел! –

+0

Нет, конечно, ты меня не оскорбил. Я делаю умножение, потому что это быстрее, чем вычисление квадратного корня два раза. – Wosi

0

Первая ошибка в строке

if (x div sqrt(x)=sqrt(x)) then 

является то, что приоритет в «=» оператора больше, чем у оператора Дива. Таким образом, компилятор считает, что вы просите

if (x div (sqrt(x) = sqrt(x)) then 

, который является эквивалентом

if (x div TRUE) then 

вместо

if ((x div sqrt(x)) = sqrt(x)) then 

Но даже последний будет иметь ошибку, потому что оператор ДИВ хочет два целых числа для работы, а функция sqrt возвращает число с плавающей запятой. Вы можете проверить это, пытаясь составить такую ​​строку, как

y := x div 0.1 

, за которое компилятор все равно будет жаловаться.

Таким образом, вы могли бы «исправить» вещи по замене DIV с/написать

if ((x/sqrt(x)) = sqrt(x)) then 

Это будет компилировать, но он все еще не гарантировано, чтобы обеспечить правильный ответ, как функция SQRT будет иметь округло которые могут привести к ошибкам. Другие ответы, предоставленные Wosi и asd-tm, охватывают эти проблемы.