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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2012, 23:16   #1
CrOsP
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 26
По умолчанию Расчет по формуле по данным из текстового файла

Здравствуйте , возникла проблема .
Нужно реализовать подсчет по формуле , а данные брать из текстового файла .
Ранее я уже делал расчет по этой формуле но брал данные из едитов .
Все работало на отлично .
А сейчас пробую считать данные из файла и посчитать по формуле . Уже выдает ошибку Invalid Floating Point ...
Коды идентичные ...
Подскажите пожалуйста по чему не работает .
Если убрать корень квадратный из формулы , то работает .

Код:
procedure TForm1.Button1Click(Sender: TObject);
var i,k:integer; x,y:real; s:string;
a,x0,step,xmax:real;
b:integer;
begin
memo1.Clear;
a:=StrToFloat(Edit1.Text);
x0:=StrToFloat(Edit3.Text);
xMax:=StrToFloat(Edit5.Text);
step:=strToFloat(Edit4.Text);
b:=StrToInt(Edit2.Text);
//Вычисление номера последней строки таблицы
k:=round((xMax-x0)/step);
//Создания заголовка таблицы
s:=format('%10s %10s',['x','y']);
memo1.Lines.Append(s);
//Цикл форматирования строк таблицы
for i:=0 to k do
x:=x0+step*i;//Очередное значение х
y:=a*sqr(x)*x-b*sin(x)+sqrt(b*Cos(x)/a);
s:=format('%10.2f %10.2f',[x,y]);
memo1.Lines.Append(s);
end;

Код:
procedure TForm1.btnCalcFormulaClick(Sender: TObject);
var i,k:integer;step:real; x,y:real;a,x0,xmax:real;b:real;
begin
  Reset(f1);   Rewrite(f2);
  read(f1,a,b,x0,xmax,step);
  k:=round((xMax-x0)/step);
  writeln(f2,'a=',a:2:2,' b=',b:2,' x0=',x0:2:2,' xmax=',xmax:2:2);
  ShowMessage(FloatToStr(a));
  ShowMessage(FloatToStr(b));
  ShowMessage(FloatToStr(x0));
  ShowMessage(FloatToStr(xmax));
  ShowMessage(FloatToStr(step));
 for i:=0 to k do
 begin
x:=x0+step*i;//Очередное значение х
y:=a*sqr(x)*x-b*sin(x)+sqrt(b*Cos(x)/a);
  writeln(f2,' y=',y:1:2,' x=',x:1:2);
  end;
  closeFile(f1);
  closeFile(f2);
  btnShowResult.Click;
end;
Если b взять интеджер - тоже самое .

Последний раз редактировалось CrOsP; 23.11.2012 в 23:31.
CrOsP вне форума Ответить с цитированием
Старый 24.11.2012, 10:51   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Если файловые переменные описаны как textfile , то у Вас не выйдет ничего загрузить таким образом.
Текстовый файл считывает (ну точнее процедура чтения считывает из файла) данные в текстовом виде, а как Вы их хотите записать в переменные целого и дробного типа, ей не понять. Тут надо тогда преобразовывать строку в число (strToInt StrToFloat) и потом уже записывать в переменные.
Ну и зависит от самого файла - какие у Вас там данные кога вы открываете файл блокнотом ? видно цифры или кракозябры ? если первое - то файл скорее всего именно текстовый и его надо читать как я указал, если кракозябры - то Ваш способ должен работать, но может давать и ошибки - надо трассировать (может отрицательное число там и корень не вычисляется)
И вообще мой Вам совет, прочтите внимательно тему работы с файлами в любом мануале по дельфи/паскалю, а то ещё миллион подобных вопросов возникнет.
phomm вне форума Ответить с цитированием
Старый 24.11.2012, 21:27   #3
alexan0308
Пользователь
 
Регистрация: 22.08.2009
Сообщений: 46
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
Если файловые переменные описаны как textfile , то у Вас не выйдет ничего загрузить таким образом.
Уважаемый Phom не прав. Цитирую.
Цитата:
Сообщение от Книга по Дельфи;
Процедура Read прекрасно приспособлена к вводу чисел. При обращении к ней за вводом очередного целого или вещественного числа процедура «перескакивает» маркеры конца строк, т. е. фактически весь файл рассматривается ею как одна длинная строка, содержащая текстовые представления чисел. В сочетании с проверкой конца файла функцией EOF процедура Read позволяет организовать простой ввод чисел, например, так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
F : TextFile;
M : Integer;
S : String;
begin
AssignFile(F, 'prog.txt'); Reset(F); S:='';
while not EOF(F) do
begin read(F, M);
S:=S+inttostr(M)+'   ';
end;
CloseFile(F) ;
Edit1.text:=S;
end;
При этом текстовой файл не должен содержать никаких других символов, кроме чисел.
Числа могут быть как целые, так и вещественные... Соответственно нужно следить за типом переменной M

Последний раз редактировалось alexan0308; 24.11.2012 в 21:34.
alexan0308 вне форума Ответить с цитированием
Старый 25.11.2012, 01:40   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
А сейчас пробую считать данные из файла и посчитать по формуле . Уже выдает ошибку Invalid Floating Point ...
Если убрать корень квадратный из формулы , то работает .
думаю, что ошибка ваша в том, что Вы НЕ контролируете значение под корнем.
cos(x) может быть меньше нуля?
Подумайте, что будет, если под корнем получится отрицательная величина..

Кстати, а Вы знаете, что при использовании тригонометрических формул (cos(X), например), функия ожидает входной параметер в радианах?


а насчёт чтения из текстового файла, то Вы правы, так можно использовать.
Только следите за правильным размещением элементов (должно совпадать, то, что в файле с тем, что вы читаете в программе)

Последний раз редактировалось Serge_Bliznykov; 25.11.2012 в 01:43.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.11.2012, 10:15   #5
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Мда, пошёл проверил, действительно читает (ну не работаю я с пас-файлами, только потоки), посыпаю голову пеплом.
Был уверен что не должен, привык что типизация строгая, а тут видимо специально сие учтено для упрощённых случаев.

Собственно я опирался и на ошибку, подразумевая что бинарное представление числа в текстовом виде может давать некое вещественное число, которое легко может приводить к ошибкам расчётов с плавающей точкой. Ну и про корень я тоже упоминал.
phomm вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Построение дерева-формулы по формуле из файла proser93 Помощь студентам 0 17.12.2011 16:20
Из текстового файла в бд!!! Poltev86 БД в Delphi 5 16.05.2010 23:18
при нажатии на кнопку должен происходить расчет по формуле vKaterinav БД в Delphi 1 12.05.2010 21:04
Построение графика функции по данным из файла Pr.AvivA Win Api 0 03.11.2009 18:38
Два XL файла, данные 1-го файла являются частью другого в формуле 2-го Кот Microsoft Office Excel 2 14.08.2007 16:56