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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.01.2013, 14:42   #1
borof
 
Регистрация: 17.12.2011
Сообщений: 7
По умолчанию От консоли к интерфейсу

Доброго времени суток.
Задача на тему "Метод квадратичной интерполяции-экстраполяции". Сделал в консоли - работает на ура:
Код:
  1. program kvadr;
  2. {$APPTYPE CONSOLE}
  3. uses
  4. SysUtils;
  5. var
  6. xm, a, b, e, h, x:real;
  7. function fun(x: real): real;
  8. { вычисление значения функции в точке}
  9. begin
  10. fun:=0.1*x*x*x-2*x*x+10*sqrt(x)
  11. end;
  12. function mkv(h, x1, e: real; var xm: real): real;
  13. var f0, f1, f2, x0, x2, c, b: real;
  14. Begin
  15. xm:=x1;
  16. repeat
  17. x1:=xm; x0:=x1-h; x2:=x1+h;
  18. f0:=fun(x0); f1:=fun(x1); f2:=fun(x2); c:=1/2/h/h*(f0-2*f1+f2);
  19. b:=((-1)*f0*(2*x1+h)+4*f1*x1-f2*(2*x1-h))/2/h/h;
  20. xm:=(-1)*b/2/c
  21. until ((xm-x1)<e);
  22. mkv:=fun(xm);
  23. end;
  24. begin
  25. write ('Начальный шаг поиска : '); ReadLn (h);
  26. write ('Точность : '); ReadLn (e);
  27. write ('Начальное значение X : '); ReadLn (x);
  28. h:=mkv(h,x,e,xm);
  29. WriteLn ('F(x)= ', h:12:5, ' x=',xm:12:5);
  30. ReadLn;
  31. end.
Но после начинается ад. До этого момента ни разу не делал интерфейс, поэтому получается что-то вроде этого:
Код:
  1. unit Unit1;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs, StdCtrls;
  6. type
  7. TForm1 = class(TForm)
  8. edt1: TEdit;
  9. edt2: TEdit;
  10. edt3: TEdit;
  11. btn1: TButton;
  12. mmo1: TMemo;
  13. procedure btn1Click(Sender: TObject);
  14. procedure mmo1Change(Sender: TObject);
  15. private
  16. { Private declarations }
  17. public
  18. { Public declarations }
  19. end;
  20. var
  21. Form1: TForm1;
  22. implementation
  23. {$R *.dfm}
  24. procedure TForm1.btn1Click(Sender: TObject);
  25. var
  26. xm, a, b, e, h, x:real;
  27. begin
  28. h:= StrToFloat(edt1);
  29. e:=StrToFloat(edt2);
  30. x:=StrToFloat(edt3);
  31. end;
  32. function fun(x: real): real;
  33. begin
  34. fun:=0.1*x*x*x-2*x*x+10*sqrt(x);
  35. end;
  36. function mkv (h, x1, e: real; var xm: real): real;
  37. var f0, f1, f2, x0, x2, c, b: real;
  38. Begin
  39. xm:=x1;
  40. repeat
  41. x1:=xm; x0:=x1-h; x2:=x1+h;
  42. f0:=fun(x0); f1:=fun(x1); f2:=fun(x2); c:=1/2/h/h*(f0-2*f1+f2);
  43. b:=((-1)*f0*(2*x1+h)+4*f1*x1-f2*(2*x1-h))/2/h/h;
  44. xm:=(-1)*b/2/c
  45. until ((xm-x1)<e);
  46. mkv:=fun(xm);
  47. end;
  48. procedure TForm1.mmo1Change(Sender: TObject);
  49. begin
  50. mmo1.Clear;
  51. mmo1.Lines.Add('result');
  52. mmo1.Lines.Add('X=' + FloatToStr(xm));
  53. end;
  54. end.
Прошу помощи. Спасибо.
borof вне форума Ответить с цитированием
Старый 18.01.2013, 15:50   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,876
По умолчанию

Цитата:
Сообщение от borof Посмотреть сообщение
Прошу помощи
Код:
  1. procedure TForm1.btn1Click(Sender: TObject);
  2. var
  3. xm, a, b, e, h, x:real;
  4. begin
  5. h:= StrToFloat(edt1);
  6. e:=StrToFloat(edt2);
  7. x:=StrToFloat(edt3);
  8. mkv(h,x,e,xm);
  9. mmo1.Clear;
  10. mmo1.Lines.Add('result');
  11. mmo1.Lines.Add('X=' + FloatToStr(xm));
  12. end;
  13. function fun(x: real): real;
  14. begin
  15. fun:=0.1*x*x*x-2*x*x+10*sqrt(x);
  16. end;
  17. function mkv (h, x1, e: real; var xm: real): real;
  18. var f0, f1, f2, x0, x2, c, b: real;
  19. Begin
  20. xm:=x1;
  21. repeat
  22. x1:=xm; x0:=x1-h; x2:=x1+h;
  23. f0:=fun(x0); f1:=fun(x1); f2:=fun(x2); c:=1/2/h/h*(f0-2*f1+f2);
  24. b:=((-1)*f0*(2*x1+h)+4*f1*x1-f2*(2*x1-h))/2/h/h;
  25. xm:=(-1)*b/2/c
  26. until ((xm-x1)<e);
  27. mkv:=fun(xm);
  28. end;
  29. end.
Думаю, как-то так, не проверял тут просто перекроил из Вашего
phomm вне форума Ответить с цитированием
Старый 18.01.2013, 16:14   #3
borof
 
Регистрация: 17.12.2011
Сообщений: 7
По умолчанию

Спасибо за помощь, но при компиляции появляются те же ошибки: "there is no overloaded version of 'StrToFloat' that can be called with these arguments", could not compile used unid 'Unit1.pas'. Так же появилась ошибка при компилировании "vissing operator or semicolon" в стороке mkv(h,x,e,xm); за первой скобкой.

Не представляю как это исправить.

Последний раз редактировалось borof; 18.01.2013 в 16:25.
borof вне форума Ответить с цитированием
Старый 18.01.2013, 16:22   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,876
По умолчанию

Функцию mkv поместитть выше процедуры - обработчика кнопки (можно сразу после implementation)
Про strtofloat - у Вас так и было написано, я просто скопировал, я же не знал что у Вас даже не компилируется - об этом сразу надо писать. Там везде нужно указать edtX.Text где Х - номер эдита
phomm вне форума Ответить с цитированием
Старый 18.01.2013, 16:26   #5
borof
 
Регистрация: 17.12.2011
Сообщений: 7
По умолчанию

Спасибо, пробую.
Радость была преждевременной. Как оказалось, я забыл о "h:=mkv(h,x,e,xm);". В какую бы процедуру или функцию я ее не подставлял, всегда получаю "missing operator os semicolon".

Вот код, который у меня "получился":
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    edt1: TEdit;
    edt2: TEdit;
    edt3: TEdit;
    btn1: TButton;
    mmo1: TMemo;
    procedure btn1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;


implementation

{$R *.dfm}

function fun(x: real): real;


begin

   fun:=0.1*x*x*x-2*x*x+10*sqrt(x);

end;

function mkv (h, x1, e: real; var xm: real): real;

var f0, f1, f2, x0, x2, c, b: real;

Begin

     xm:=x1;

     repeat

      x1:=xm;  x0:=x1-h; x2:=x1+h;

      f0:=fun(x0); f1:=fun(x1); f2:=fun(x2); c:=1/2/h/h*(f0-2*f1+f2);

      b:=((-1)*f0*(2*x1+h)+4*f1*x1-f2*(2*x1-h))/2/h/h;

      xm:=(-1)*b/2/c

     until ((xm-x1)<e);

     mkv:=fun(xm);
end;

procedure TForm1.btn1Click(Sender: TObject);
var

   xm, a, b, e, h, x, mkv:real;

begin


  h:= StrToFloat(edt1.Text);

  e:=StrToFloat(edt2.Text);

  x:=StrToFloat(edt3.Text);



  mmo1.Clear;

  mmo1.Lines.Add('result');

  mmo1.Lines.Add('F(x)= ' + FloatToStr(h));

  mmo1.Lines.Add('X=' + FloatToStr(xm));

end;

end.
тут несколько проблем: не знаю куда подставить "h:=mkv(h,x,e,xm);" и в каком порядке все это скомпоновать. В данном виде в ответ захватывает введенное число h и некорректно считает число "xm" (оно вообще одно и тоже всегда). Менять положение функций и процедур не приносит результата, пока ошибка с "h:=mkv(h,x,e,xm);" не решена.
Что делать, не представляю.

Последний раз редактировалось borof; 18.01.2013 в 17:27.
borof вне форума Ответить с цитированием
Старый 18.01.2013, 19:13   #6
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,876
По умолчанию

Скинуть проект архивом сюда во вложении. Не знаю, почему может вообще быть такая ошибка, не должно быть такой. Если учитывать, что код на паскале верно считает, то можно ещё проверить мелкие тонкости вроде инициализации локальных переменных, и использования псевдопеременных Result в функциях вместо их имени.
Беглого взгляда мне хватает чтобы с большой долей вероятности сказать, что это не тот случай, но всё равно можно проверить под трассировкой.
phomm вне форума Ответить с цитированием
Старый 18.01.2013, 19:32   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Код:
var xm, a, b, e, h, x, mkv:real;
Возможно из-за этого? Обзовите переменную mkv по другому
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 18.01.2013, 19:35   #8
borof
 
Регистрация: 17.12.2011
Сообщений: 7
По умолчанию

Вот, если это то.
Изменение имени переменной на результат у меня никак не повлияло.
Спасибо за помощь.
Вложения
Тип файла: rar 112.rar (164.2 Кб, 18 просмотров)

Последний раз редактировалось borof; 18.01.2013 в 19:37.
borof вне форума Ответить с цитированием
Старый 18.01.2013, 19:40   #9
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,876
По умолчанию

Аватар, кстати, да, в оригинале не было её, я невнимательно смотрел второй вариант кода, полагая, что там больше нет изменений. Сейчас проверю ручками проект.
phomm вне форума Ответить с цитированием
Старый 18.01.2013, 19:47   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Код:
var
   xm, a, b, e, h, x:real;   //Убрал mkv

begin


  h:= StrToFloat(edt1.Text);

  e:=StrToFloat(edt2.Text);

  x:=StrToFloat(edt3.Text);

  h:=mkv(h,x,e,xm);


  mmo1.Clear;

  mmo1.Lines.Add('result');

  mmo1.Lines.Add('F(x)= ' + FloatToStr(h));

  mmo1.Lines.Add('X=' + FloatToStr(xm));

end;
На работу не проверял, по крайней мере компилится
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача данных по CAN интерфейсу Linore C# (си шарп) 1 22.09.2011 21:01
Нужны советы по пользовательскому интерфейсу программы alexplato Софт 5 06.09.2011 00:13
Вопрос по интерфейсу, Delphi 2006 Etrimus Общие вопросы Delphi 8 24.05.2010 13:20
Нужна помощь в подключении Access к интерфейсу Builder C++ Cvetok Помощь студентам 4 29.05.2008 16:41