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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2017, 01:31   #1
anaschu
Форумчанин
 
Регистрация: 21.09.2012
Сообщений: 372
По умолчанию [Delphi] Перевод из целого типа в вещественный

Добрый. Есть процедура, где мне приходиться счетчик цикла использовать внутри формулы, в которой стоят числа по типу 2,3 * 10 в минус пятнадцатой.
Потому получается ошибка

[dcc32 Error] Unit1.pas(56): E2032 For loop control variable must have ordinal type

А получиться может число порядка минус двадцатой
Ну мне кажется, что такие числа должны быть в extended или int64 или другом вещественном типе? что то я не догоняю.

Как перевести счетчик цикла в вещественный тип, что бы его потом можно было использовать внутри формулы?

Что бы не было вот этой ошибки:
\
[dcc32 Error] Unit1.pas(59): E2010 Incompatible types: 'Integer' and 'Extended'



Код:
procedure TForm1.btn_startClick(Sender: TObject);
const

  L_step=1;  ////mm
   h=1;    //minuts
   betta =0.017   ; //minuts(-1)



var
  i:real; m_transp_summ, m_transp_step, R, S, Vmax, Km: Integer  ;
  i_convert: Integer;
begin
  R := strtoint(edt_R.Text);
  S:=  strtoint(edt_S.Text);

  Vmax:=  strtoint(edt_Vmax.Text);
  Km:=  strtoint(edt_Km.Text);
  m_transp_summ:=0;
  m_transp_step:=0;

  for i:=2 to  (R+1) do    //если сделать от нуля, то для первой клетки не будет перенесенного ею азота и по формуле, и в жизни
    begin

     m_transp_step:= (3.14*(i-1)*i*betta*Vmax*S*L_step)/(S+Km);
     S:=S-0.000001;// вычитаются траты на рост из английской статьи statya_s_razdeleniem_translateds_final.docx

     m_transp_summ:=m_transp_summ + m_transp_step;

      end;

   Resalt.Caption:=FloatToStr(m_transp_summ)

end;

end.
Занимаюсь:1.зверьком- покемончиком для компьютерного затончика. 2 IT-грибами,что бы скушать потом их с вами.3. цифровым обезьянками, как куны ударяют за тянками
anaschu вне форума Ответить с цитированием
Старый 09.06.2017, 08:18   #2
GetMax
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 588
По умолчанию

Используйте while или repeat
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Для благодарностей WMR R145235935681
GetMax вне форума Ответить с цитированием
Старый 09.06.2017, 08:48   #3
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Введите переменную типа extended или int64 и присваивайте ей в цикле значение текущего i - произойдёт неявное преобразование

Или в формуле вместо i напишите (i/1) - при выполнении операции деления также происходит преобразование.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 09.06.2017, 09:13   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Просто объяви m_transp_step, S и bm_transp_summ как Extended
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.06.2017, 15:21   #5
anaschu
Форумчанин
 
Регистрация: 21.09.2012
Сообщений: 372
По умолчанию

Цитата:
Сообщение от GetMax Посмотреть сообщение
Используйте while или repeat
вопрос по while.
Если у меня идет цикл не от нуля, а от двух. как это прописать?

Цитата:
Сообщение от Sciv Посмотреть сообщение
Введите переменную типа extended или int64 и присваивайте ей в цикле значение текущего i - произойдёт неявное преобразование

Или в формуле вместо i напишите (i/1) - при выполнении операции деления также происходит преобразование.
Вот я первое уже пробовал сделать, че то не пошло, ща еще попробую
Занимаюсь:1.зверьком- покемончиком для компьютерного затончика. 2 IT-грибами,что бы скушать потом их с вами.3. цифровым обезьянками, как куны ударяют за тянками

Последний раз редактировалось Вадим Мошев; 07.07.2017 в 12:44.
anaschu вне форума Ответить с цитированием
Старый 09.06.2017, 15:29   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от anaschu Посмотреть сообщение
вопрос по while.
Если у меня идет цикл не от нуля, а от двух. как это прописать?
это "сильный" вопрос!
Простите, а Вы вообще описание и примеры использования цикла WHILE смотрели?

в общем случае это выглядит так:
Код:
mx:=2;
while mx<(R+1) do begin
  .....
  mx := max + ШагЦикла;
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.06.2017, 15:41   #7
anaschu
Форумчанин
 
Регистрация: 21.09.2012
Сообщений: 372
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Введите переменную типа extended или int64 и присваивайте ей в цикле значение текущего i - произойдёт неявное преобразование

Или в формуле вместо i напишите (i/1) - при выполнении операции деления также происходит преобразование.
вот что получилось, во всяком случае не ругается компилятор

Код:
procedure TForm1.btn_startClick(Sender: TObject);
const

  L_step=1;  ////mm
   h=1;    //minuts
   betta =0.017   ; //minuts(-1)



var
  i:shortint; m_transp_summ, m_transp_step, R_convert, S_convert, Vmax, Km: extended  ;
  {m_transp_summ, m_transp_step:extended;}
  R, S, i_convert: Integer;
  r_convert2:shortint;
begin
  R := strtoint(edt_R.Text);
  S:=  strtoint(edt_S.Text);
  R_convert:=R;
  S_convert:=S;


  Vmax:=  strtoint(edt_Vmax.Text);
  Km:=  strtoint(edt_Km.Text);
  m_transp_summ:=0;
  m_transp_step:=0;
  r_convert2:=round(r)+1;


  for i:=2 to  r_convert2 do    //если сделать от нуля, то для первой клетки не будет перенесенного ею азота и по формуле, и в жизни
    begin

     i_convert:=i;
     m_transp_step:= (3.14*(i-1)*i_convert*betta*Vmax*S_convert*L_step)/(S+Km);
     S_convert:=S_convert-0.000001;// вычитаются траты на рост из английской статьи statya_s_razdeleniem_translateds_final.docx

     m_transp_summ:=m_transp_summ + m_transp_step;

      end;

   Resalt.Caption:=FloatToStr(m_transp_summ)

end;

end.
Занимаюсь:1.зверьком- покемончиком для компьютерного затончика. 2 IT-грибами,что бы скушать потом их с вами.3. цифровым обезьянками, как куны ударяют за тянками
anaschu вне форума Ответить с цитированием
Старый 09.06.2017, 15:43   #8
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от anaschu Посмотреть сообщение
Вот я первое уже пробовал сделать, че то не пошло, ща еще попробую
Извиняюсь, я не обратил внимание, что у Вас все переменные целыми объявлены и насоветовал глупость сделать.

Достаточно сделать, как сказал Аватар - объявить их extended. В этом случае независимо от типа переменной i выполнится приведение к результирующему типу - то есть к extended. Поэтому:

Код:
i_convert:=i;
лишнее.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 09.06.2017 в 15:45.
Sciv вне форума Ответить с цитированием
Старый 09.06.2017, 16:44   #9
anaschu
Форумчанин
 
Регистрация: 21.09.2012
Сообщений: 372
По умолчанию

обьявить экстендет пойдет для того, что бы работа формула. но i тогда не заработает в цикле.
i все равно надо будет переобьявлять.
Потому что даже если убрать все для конвертации в другие типы, работать не будет

Код:
var
  i:shortint; m_transp_summ, m_transp_step, R,S,Vmax, Km: extended  ;

begin
  R := strtoint(edt_R.Text);
  S:=  strtofloat(edt_S.Text);



  Vmax:=  strtofloat(edt_Vmax.Text);
  Km:=  strtofloat(edt_Km.Text);
  m_transp_summ:=0;
  m_transp_step:=0;


  for i:=2 to  R+2 do    //если сделать от нуля, то для первой клетки не будет перенесенного ею азота и по формуле, и в жизни
    begin


     m_transp_step:= (3.14*(i-1)*i*betta*Vmax*S*L_step)/(S+Km);
     S:=S-0.000001;// вычитаются траты на рост из английской статьи statya_s_razdeleniem_translateds_final.docx

     m_transp_summ:=m_transp_summ + m_transp_step;

      end;
Цитата:
Сообщение от Sciv Посмотреть сообщение
Извиняюсь, я не обратил внимание, что у Вас все переменные целыми объявлены и насоветовал глупость сделать.

Достаточно сделать, как сказал Аватар - объявить их extended. В этом случае независимо от типа переменной i выполнится приведение к результирующему типу - то есть к extended. Поэтому:

Код:
i_convert:=i;
лишнее.
Ну да. Только может статься, что и ваше тоже сработает...Пока мне пришлось все strtoint заменить на strToFloat
Занимаюсь:1.зверьком- покемончиком для компьютерного затончика. 2 IT-грибами,что бы скушать потом их с вами.3. цифровым обезьянками, как куны ударяют за тянками

Последний раз редактировалось anaschu; 09.06.2017 в 16:52.
anaschu вне форума Ответить с цитированием
Старый 09.06.2017, 16:45   #10
anaschu
Форумчанин
 
Регистрация: 21.09.2012
Сообщений: 372
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Поэтому:

Код:
i_convert:=i;
лишнее.

пока что работает вот так:

Код:
procedure TForm1.btn_startClick(Sender: TObject);
const

  L_step=1;  ////mm
   h=1;    //minuts
   betta =0.017   ; //minuts(-1)



var
  i:shortint; m_transp_summ, m_transp_step, R_convert, S_convert, Vmax, Km: extended  ;
  {m_transp_summ, m_transp_step:extended;}
  R, S, i_convert: extended;
  r_convert2:shortint;
begin
  R := strtoint(edt_R.Text);
  S:=  strtofloat(edt_S.Text);
  R_convert:=R;
  S_convert:=S;


  Vmax:=  strtofloat(edt_Vmax.Text);
  Km:=  strtofloat(edt_Km.Text);
  m_transp_summ:=0;
  m_transp_step:=0;
  r_convert2:=round(r)+1;


  for i:=2 to  r_convert2 do    //если сделать от нуля, то для первой клетки не будет перенесенного ею азота и по формуле, и в жизни
    begin

     i_convert:=i;
     m_transp_step:= (3.14*(i-1)*i_convert*betta*Vmax*S_convert*L_step)/(S+Km);
     S_convert:=S_convert-0.000001;// вычитаются траты на рост из английской статьи statya_s_razdeleniem_translateds_final.docx

     m_transp_summ:=m_transp_summ + m_transp_step;

      end;

   Resalt.Caption:=FloatToStr(m_transp_summ)

end;

end.
Занимаюсь:1.зверьком- покемончиком для компьютерного затончика. 2 IT-грибами,что бы скушать потом их с вами.3. цифровым обезьянками, как куны ударяют за тянками
anaschu вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Описать функцию LineCount(S) целого типа santafer Общие вопросы Delphi 3 19.03.2016 17:39
Перевод времени из целого числа в вещественный Алексей_2012 Общие вопросы C/C++ 4 03.11.2014 21:13
Visual Basic: Описать функцию DigitN (K, N) целого типа, возвращающую N-ю цифру целого положительного числа К Екатерина23 Помощь студентам 1 10.12.2013 09:25
перевод типа из Delphi в C++ Karina89 Помощь студентам 4 09.11.2011 21:13
Перевод поля типа Character в тип Integer [Delphi] Pinkygirl Помощь студентам 2 22.10.2009 21:54