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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2008, 12:38   #1
Auster
Пользователь
 
Регистрация: 22.04.2008
Сообщений: 11
По умолчанию Ошибки при линейной интерполяции в Delphi((

Здравствуйте, уважаемые знатоки. Очень нужна Ваша помощь. Привожу код - линейная интерпол. массивов вещественных чисел. Никак не могу одолеть. Помогите пожалуйста.
Код:
type
  TForm1 = class(TForm)
    DATA: TEdit;
    Inter: TEdit;
    Button6: TButton;
    procedure Button6Click(Sender: TObject);
  private
    { Private declarations }
     public
    { Public declarations }
  end;
var
  Form1: TForm1;
  var
  X:array[1..3] of Real=(0.1, 0.2, 0,3); //вообще элементов около 30, регулярного шага нет, кол-во постоян., и известно заранее
  Y:array[1..3] of Real=(0.5, 0.7, 0,9);
[Error] Unit1.pas(26): Number of elements differs from declaration
  X:array[0..3] of Real=(0.1, 0.2, 0,3);
  Y:array[0..3] of Real=(0.5, 0.7, 0,9);
Я так понимаю, в этом случае 0..3=4элемента? Или нет? Ошибки не возникает -ПОЧЕМУ? 
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button6Click(Sender: TObject);
begin
 for i:=1 to 3 do
[Error] Unit1.pas(46): For loop control variable must be simple local variable
Что не так?
   if StrToFloat(Data.Text)<=X[i]
then if StrToFloat(Data.Text)>=X[i+1]
then begin
Inter.Text:=FloatToStr(y[i]+((y[i+1]-y[i])/(x[i+1]-x[i]))*(StrToFloat(Data.Text)-x[i]))
i:=i-1
end
else
Как замкнуть цикл и проверять следующие элементы?
end;
end.
Заранее спасибо.

Последний раз редактировалось AlDelta; 23.04.2008 в 12:56.
Auster вне форума Ответить с цитированием
Старый 23.04.2008, 12:59   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Объявите в процедуре Button6Click переменную i : integer, уберите вот это: "i:=i-1" и оформите, пожалуйста, листинг тэгом <CODE> (# в окне редактирования), сил нет глаза ковырять. Потом можно будет разбираться с математикой. Массивы объявляются с указанием крайних значений, в массиве [0..3] четыре элемента.
B_N вне форума Ответить с цитированием
Старый 23.04.2008, 13:16   #3
Auster
Пользователь
 
Регистрация: 22.04.2008
Сообщений: 11
По умолчанию

Спасибо за ответ. В таком виде код нормально? Добавил переменную i, убрал i=i-1, скомпилировалась, выдает ошибку при вводе 0,1 и т.п.
"0.1- is not a valid floating point value". Я так понимаю еще рано компилировать. Вопрос: как правильно записать кол-во элементов массива если из 5 - [0..4] или [1..5]?
# type
TForm1 = class(TForm)
DATA: TEdit;
Inter: TEdit;
Button6: TButton;
procedure Button6Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
var
X:array[1..3] of Real=(0.1, 0.2, 0,3); //вообще элементов около 30, регулярного шага нет, кол-во постоян., и известно заранее
Y:array[1..3] of Real=(0.5, 0.7, 0,9);
//выдает ошибку [Error] Unit1.pas(26): Number of elements differs from declaration - допустим 3 элемента, в другом случае норм.?
хотя получается 4-ре элемента???
X:array[0..3] of Real=(0.1, 0.2, 0,3);
Y:array[0..3] of Real=(0.5, 0.7, 0,9);
//Я так понимаю, в этом случае 0..3=4элемента? Или нет? Ошибки не возникает -ПОЧЕМУ?
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button6Click(Sender: TObject);
var
i:integer;
begin
for i:=1 to 3 do
//[Error] Unit1.pas(46): For loop control variable must be simple local variable
Что не так?
if StrToFloat(Data.Text)<=X[i]
then if StrToFloat(Data.Text)>=X[i+1]
then begin
Inter.Text:=FloatToStr(y[i]+((y[i+1]-y[i])/(x[i+1]-x[i]))*(StrToFloat(Data.Text)-x[i]))
end
else
//Как замкнуть цикл и проверять следующие элементы?
end;
end.[/CODE]
Предидущие посты мы читаем невнимательно?

Последний раз редактировалось Auster; 23.04.2008 в 13:51.
Auster вне форума Ответить с цитированием
Старый 23.04.2008, 13:28   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Код:
X:array[1..3] of Real=(0.1, 0.2, 0,3);
Y:array[1..3] of Real=(0.5, 0.7, 0,9);
//--------------------------------
X:array[0..3] of Real=(0.1, 0.2, 0,3);
Y:array[0..3] of Real=(0.5, 0.7, 0,9);
Вещественные константы определяются через точку, а не через запятую - отсюда несоответствие количества. Проясните назначение "Data.Text".

Последний раз редактировалось B_N; 23.04.2008 в 13:32.
B_N вне форума Ответить с цитированием
Старый 23.04.2008, 13:40   #5
Auster
Пользователь
 
Регистрация: 22.04.2008
Сообщений: 11
По умолчанию

Поясите тупому эта запись X:array[0..3] of Real=(0.1, 0.2, 0,3);
означает, что 0-му элементу соответствует значение 0.1, 1-му - 0.2, а какому номеру значение 0.3? 2-му или 3-му?
"Data.Text" - это просто имя TEdita, куда пользователь вводит значения X-ов. "Inter.Text" - это имя TEdita, для вывода полученной величины.
Inter -это очепятка от Enter).
Auster вне форума Ответить с цитированием
Старый 23.04.2008, 13:44   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
"Data.Text" - это просто имя TEdita
В общем ты во всем догадался правильно окромя того что это не имя эдита а обращение к его свойству.
А в остальном ты в целом прав.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.04.2008, 13:50   #7
Auster
Пользователь
 
Регистрация: 22.04.2008
Сообщений: 11
По умолчанию

Спасибо, однако вопросы остались открытыми(.
1. Как правильно объявить кол-во элементов массива и присвоить им значения и обращаться к ним в теле цикла? 2. Замкнуть цикл, пока одни ошибки(
Auster вне форума Ответить с цитированием
Старый 23.04.2008, 13:51   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Auster Посмотреть сообщение
Поясите тупому эта запись X:array[0..3] of Real=(0.1, 0.2, 0,3);
означает, что 0-му элементу соответствует значение 0.1, 1-му - 0.2, а какому номеру значение 0.3? 2-му или 3-му?
"Data.Text" - это просто имя TEdita, куда пользователь вводит значения X-ов. "Inter.Text" - это имя TEdita, для вывода полученной величины.
Inter -это очепятка от Enter).
Запись
Код:
X:array[0..3] of Real=(0.1, 0.2, 0,3);
означает
Код:
X[0] := 0.1;
X[1] := 0.2;
X[2] := 0;
X[3] := 3;
Следите внимательно за запятыми.
B_N вне форума Ответить с цитированием
Старый 23.04.2008, 13:55   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
1. Как правильно объявить кол-во элементов массива и присвоить им значения и обращаться к ним в теле цикла?
Например так как прописано в примере.
Цитата:
Замкнуть цикл, пока одни ошибки(
Какие ошибки?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.04.2008, 15:04   #10
Auster
Пользователь
 
Регистрация: 22.04.2008
Сообщений: 11
По умолчанию

Прога компелируется не выдавая замечаний, но при попытке внести исходные данные - любую дробную величину выдается:
message "0.1 is not a valid floating point value." Process stopped.
Где собака зарыта? Еше раз код привожу. Р.S. при вводе значений массива попутал . и , спасибо.

#
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExcelXP, OleServer, Menus, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
DATA: TEdit;
Button6: TButton;
Enter: TEdit;
procedure Button6Click(Sender: TObject);
private
{ Private declarations }

public
{ Public declarations }

end;

var
Form1: TForm1;
var
X:array[1..3] of Real=(0.1, 0.2, 0.3);
Y:array[1..3] of Real=(0.5, 0.7, 0.9);

implementation
uses Unit2, Unit3;
{$R *.dfm}

procedure TForm1.Button6Click(Sender: TObject);
var
i:integer;
begin
if StrToFloat(Data.Text)<=X[i]
then if StrToFloat(Data.Text)>=X[i+1]
then begin
Enter.Text:=FloatToStr(y[i]+((y[i+1]-y[i])/(x[i+1]-x[i]))*(StrToFloat(Data.Text)-x[i]))
end
end;
end.
Auster вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибки delphin100 Операционные системы общие вопросы 12 17.04.2008 14:15
Задачка в delphi, вылазят ошибки... Absent Помощь студентам 3 17.02.2008 15:54
Ошибки Terran Общие вопросы Delphi 3 05.02.2008 20:47
[Основы ТАУ]Решение задачи идентификации линейной динамической системы... Tanzilit Помощь студентам 1 17.01.2008 03:09
соединение точек с помощью линейной интерпаляции и интерпаляции кубическими сплайнами. yulia Помощь студентам 6 09.10.2007 07:38