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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2011, 14:54   #1
all_is_fear
Пользователь
 
Регистрация: 22.05.2011
Сообщений: 13
По умолчанию операция мод применимо к типу float,проверка числа- целое или дробное

Задача такого типа : В заданной строке выделить(отфильтровать) положительные целые числа и найти их среднее арифметическое. в строке кода if StrToFloat(a[i]) mod 1 =0 then когда хочу проверить целое число или дробное выдает ошибку типа Operator not applicable to this operand type вот код:
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
s:string;
a:array[1..100] of string;
b:array[1..100] of integer;
sum:integer;
sred_ar:real;
i,j,k,z:integer;
begin
Writeln('Vvedite stroku:');
readln(s);
k:=1;
j:=1;
for i:=1 to length(s) do
  begin
    if s[i]<>';' then
     begin

        a[k]:=a[k]+s[i];
     end
     else  k:=k+1;
  end;



  z:=1;
   for i:=1 to k do
    begin
     if StrToFloat(a[i]) mod 1 =0  then
       b[z]:=StrToInt(a[i]);
      z:=z+1;
       end;

     for i:=1 to z-1 do
        if b[i]>0 then sum:=sum+b[i];

        sred_ar:=sum/z;

        write(sred_ar);
        readln;
end.
all_is_fear вне форума Ответить с цитированием
Старый 17.11.2011, 15:54   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну и правильно ругается. Ведь StrToFloat - возвращает какое число? Правильно, вещественное. А для него операция остатка от целочисленного деления НЕ ОПРЕДЕЛЕНА!

Если Вы твёрдо уверены, что Вам нужно сделать,
я бы рекомендовал Вам сделать примерно так:
Код:
  if Frac(StrToFloat(a[i]))=0  then
      b[z]:=Trunc(StrToFloat(a[i]));
      z:=z+1;
  end;
а ещё лучше (НАМНОГО) написать так:
Код:
Var 
......
   tmp, ErrCode : integer;

begin
  .....

  z:=0;
  for i:=1 to k do
    begin
       Val(a[i], tmp, ErrCode );
       if ErrCode=0 then begin  // смотри комментарий ниже
         Inc(z);
         b[z]:=tmp;
       end;
     end;
p.s. тольк у Вас же нужно выделить ПОЛОЖИТЕЛЬНЫЕ целые числа!
поэтому лучше написать:
Код:
if (ErrCode=0) and (tmp>=0) then begin
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.11.2011, 15:54   #3
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

по-моему, mod применим только к целым числам.
попробуй ExtMod из библиотеки ESBMaths.
или проверяй на целостность каким-то другим способом, например при помощи округления


Update
опоздал =)
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 17.11.2011, 16:16   #4
all_is_fear
Пользователь
 
Регистрация: 22.05.2011
Сообщений: 13
По умолчанию

большое спасибо Serge_Bliznykov за исчерпывающие объяснения, все получилось...

Mandrivnyk попробовал округлить как вы и говорили, что то не получилось, но огромное спс за совет в любом случае
all_is_fear вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разбить дробное на 2 целых числа revaldo666 Общие вопросы C/C++ 10 13.06.2011 03:12
Проверка перменной на соответствие типу Demien Общие вопросы Delphi 8 01.02.2011 19:21
Побитовая операция ИЛИ. Visual Basic. amfin Помощь студентам 1 27.12.2010 20:44
Записать дробное число в форматах Single и Double, а целое в формате Integer!!!! AlexSed Помощь студентам 4 08.01.2010 23:39