Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2012, 19:37   #11
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию

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

И тем не менее:
Код:
function checkelem(x:real):boolean;
var
  y:integer;//таким образом выполняем условие "найдите элементы, корни кубические из которых, являлись бы целыми числами"
begin
  if x>=0 then
    x:=exp(ln(abs(x))/3)
  else
    x:=-exp(ln(abs(x))/3); //хотя в данной задаче это не принципиально
  y:=round(x);
  if y=x then
    checkelem:=true
  else
    checkelem:=false;
end;

begin
  writeln(checkelem(27));        //true
  writeln(checkelem(-27));       //true
  writeln(checkelem(125));       //true
  writeln(checkelem(126));       //false
  writeln(checkelem(126.5));    //false
  writeln(checkelem(0.125));    //false
  readln
end.
Нахождение кубического корня стырил отсюда

Цитата:
Сообщение от Dellc Посмотреть сообщение
пишет что не понимает что такое дельта
У тебя эта переменная даже не объявлена, естественно, что он не понимает
Все тривиальное просто

Последний раз редактировалось whatever; 25.03.2012 в 19:40.
whatever вне форума Ответить с цитированием
Старый 25.03.2012, 23:21   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от whatever
Нахождение кубического корня стырил
Код:
x:=exp(ln(abs(x))/3)
там ещё не хватает проверки на нулевое значение.
Попробуйте найти таким методом корень из нуля - получите ошибку.

да и GreenWizard прав - если мы испльзуем вещественные числа, нужно быть готовым к тому, что они имеют ограниченную точность.
например, для вашего кода "нехорошее" число:
Код:
var 
  NoGood : real;
begin
  NoGood := 1003003000.9988;
  WriteLn('число равно ',NoGood:15:7);
  writeln(checkelem(NoGood));
Вы, вероятно, будете удивлены, но код сообщит, что корень целый (TRUE)...


Dellc, Вы объявили целочисленный массив.
На самом деле, в условии задачи про это ничего не сказано
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.03.2012, 13:23   #13
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Вы, вероятно, будете удивлены, но код сообщит, что корень целый (TRUE)...
После Ваших слов я действительно удивлен, ибо вот:



Я не пытаюсь кому-либо что-то доказать, мне действительно хочется разобраться. Код такой же, как в моем предыдушем сообщении, только модуль crt подключил и clrscr добавил. Ну и предложенные операции с NoGood'ом, естественно.

P.S. По поводу нуля не подумал, но это тоже решается при помощи if-else.

Update: Похоже я понял, о чем Вы.
Попробовал с 21545*21545*21545=10000909453625 (т.е. nogood:=10000909453624.9988), получилось так, как и было написано.

И все-таки я думаю, что для данной задачи это несущественно, в том смысле, что врядли ТС будет оперировать с такими огромными числами.

Update2:
Еще вариант придумал:
Код:
function checkelem(x:real):boolean;
var
  str:string;
begin
  if x<>0 then
    begin
      str:=floattostr(X);
      if pos('.',str)=0 then
        checkelem:=false
      else
        begin
          if x>0 then
            x:=exp(ln(abs(x))/3)
          else
            x:=-exp(ln(abs(x))/3);
          str:='';
          str:=floattostr(x);
          if (POS('.',str)=0) then
            checkelem:=true
          else
            checkelem:=false;
          writeln(str);
        end;
      end
  else
    checkelem:=false;//для нуля же будет false?
end;
Для нашего старого знакомого 10000909453624.9988 выдает FALSE
Правда не будет работать в Турбо Паскале, В Free работет, если подключить SysUtils.
Все тривиальное просто

Последний раз редактировалось whatever; 26.03.2012 в 15:40.
whatever вне форума Ответить с цитированием
Старый 26.03.2012, 17:22   #14
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
          str:='';
          str:=floattostr(x);
          if (POS('.',str)=0) then
да ну бросьте. Это уже вообще никуда не годится. Мало того, что в TurboPascal отродясь не было функции FloatToStr, так Вы ещё строки впутываете в алгоритм, да ещё и позицию точки ищите! это всё ОТ ЛУКАВОГО!

я бы уже тогда рекомендовал брать Frac(X) и проверять, что оно либо равно нулю, либо, меньше чем заведомо малая величина.
т.е.:
Код:
  checkelem := frac( abs(x) ) < 0.000000001;
или так:
Код:
  checkelem := frac( abs(x) ) = 0;
а ещё лучше, уйти от вещественных чисел К ЦЕЛЫМ.
вот так примерно:
Код:
function checkelem(x:LongInt):boolean;
var Y : Longint;
begin
  if x=0 then checkelem := true {или false - не суть!}
  else begin
      if x>0 then
            Y:= trunc( exp(ln(abs(x))/3) )
          else
            Y:= - trunc( exp(ln(abs(x))/3));
     checkelem := sqr(Y)*Y = x;
  end;
end;

Цитата:
Код такой же, как в моем предыдушем сообщении, только модуль crt подключил и clrscr добавил.
Думаю, что FP оперирует с более высокой точностью вычислений, чем TurboPascal.. что лишний раз показывает коварство и ненадёжность работы с вещественными числами!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.03.2012, 19:26   #15
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А так: считаем что исходные данные целые. Дробные отбрасываем, поскольку заведомо корень не может быть целым
Код:
var x,y: Integer; {или int64, если паскаль позволяет}
...
    y:=Round(exp(ln(abs(x))/3)+0.1);   +0.1 для того, чтобы результат типа 2,999 в 3 превратить
    if y*y*y=x then ВСЕ OK!
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 26.03.2012 в 19:30.
Аватар вне форума Ответить с цитированием
Старый 28.03.2012, 19:40   #16
Dellc
 
Регистрация: 24.03.2012
Сообщений: 8
По умолчанию

Всем спасибо, этот вариант прокатил
Код:
program laba_5;
var
N:array [1..10] of integer;
i:integer;
x:real;
begin
WriteLn('Vvedite massiv n');
for i:=1 to 10 do
Read(n[i]);
for i:=1 to 10 do
begin
x:=exp(ln(N[i])/3);
if round(x)=x then
Writeln('Koren is',N[i],'=',x);
end;
readln;
readln;
end.
Dellc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
корень кубический Небесный Общие вопросы Delphi 6 30.05.2010 12:50
Кубический подграф Chelmgn Помощь студентам 3 23.05.2010 21:18
кубический корень числа UnrealSP Помощь студентам 0 02.11.2009 18:04
Кубический корень от отрицательного числа Vito89 Помощь студентам 9 29.09.2009 14:40