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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2013, 16:09   #1
LLIALLIJIbIK
Пользователь
 
Регистрация: 26.08.2010
Сообщений: 51
По умолчанию Циклы Delfi

Прошу помощи. Нужно найти значение точки пересечения двух линий в диапазоне частот 5-10000 Гц. Для точности вычисления нужно задать маленький шаг. Объявляю массив - Frequency:array[5..10000] of double;
Если пишу такой цикл,

for i:=5 to 10000 do
begin
Frequency[i]:=i+0.0001;
ff1:=2*pi*Frequency[i]*Mei;
ff2:=(power(fp,3)*Me)/Frequency[i];
if ff1=ff2 then begin
break;
FF:=Frequency[i];
end;
end;
Form9.Edit3.Text:=FloatToStr(FF);

то программа выводит последнее значение массива с приплюсованным шагом.

Если такой,

i:=5;
while i<=10000 do
begin
Application.ProcessMessages;
Frequency[i]:=i+0.0001;
ff1:=2*pi*Frequency[i]*Mei;
ff2:=(power(fp,3)*Me)/Frequency[i];
if ff1=ff2 then begin
break;
FF:=Frequency[i];
end;
end;
Form9.Edit3.Text:=FloatToStr(FF);

то программа выводит значения других переменных в другие эдиты на этой форме, а тот который надо пуст. Но такое впечатление как-будто вычисление идет. Главная форма при этом не закрывается.
LLIALLIJIbIK вне форума Ответить с цитированием
Старый 11.04.2013, 16:52   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Если пишу такой цикл,

for i:=5 to 10000 do
begin
Frequency[i]:=i+0.0001;
ff1:=2*pi*Frequency[i]*Mei;
ff2:=(power(fp,3)*Me)/Frequency[i];
if ff1=ff2 then begin
break;
FF:=Frequency[i];
end;
end;
Form9.Edit3.Text:=FloatToStr(FF);

то программа выводит последнее значение массива с приплюсованным шагом.
Не верю, она выводит случайно совпавшее с нужным.
Код:
for i:=5 to 10000 do
begin
Frequency[i]:=i+0.0001;
ff1:=2*pi*Frequency[i]*Mei;
ff2:=(power(fp,3)*Me)/Frequency[i];
if abs(ff1-ff2)<0.000001 then begin // вещественные числа очень редко совпадают. на проверять когда их разность будет меньше чего-то
FF:=Frequency[i];
break; // сначала установили FF:= потом break;
end;
end;
Form9.Edit3.Text:=FloatToStr(FF);
Цитата:
i:=5;
while i<=10000 do
Цитата:
Но такое впечатление как-будто вычисление идет.
и будет идти до конца света.
В цикле нет изменения i. =>бесконечный цикл.

Цитата:
Application.ProcessMessages;
в данном случае только вреден, поскольку маскирует зависание программы (кнопочки нажимаются и т.п. а толку нет).
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 11.04.2013, 17:17   #3
LLIALLIJIbIK
Пользователь
 
Регистрация: 26.08.2010
Сообщений: 51
По умолчанию

for i:=5 to 10000 do
begin
Frequency[i]:=i+0.0001;
ff1:=2*pi*Frequency[i]*Mei;
ff2:=(power(fp,3)*Me)/Frequency[i];
if abs(ff1-ff2)<0.001 then begin
FF:=Frequency[i];
break;
end;
end;
Form9.Edit3.Text:=FloatToStr(FF);

В таком случае в эдит выдается ноль. Не врубаюсь.
LLIALLIJIbIK вне форума Ответить с цитированием
Старый 11.04.2013, 21:06   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Вы хотите найти точку пересечения кривых ff1 и ff2?
Это делается не так.
Нужно не находить совпадение точек (пусть даже с некоторой погрешностью), а пересечение отрезков, каждый из которых есть сегмент ломаной из предыдущей точки (ее значение нужно запоминать) в текущую (т.е. только что вычисленную).
Т.е.
1. i := 5;
2. Вычисляем CurrFF1.
3. Вычисляем CurrFF2.
4. Начало цикла.
5. PrevFF1 := CurrFF1;
6. PrevFF2 := CurrFF2;
7. Инкрементируем i.
8. Вычисляем CurrFF1.
9. Вычисляем CurrFF2.
10. Определяем пересекаются ли отрезки (PrevFF1-CurrFF1) и (PrevFF2-CurrFF2).
11. Если нет пересечения - на 3.
s-andriano вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
delfi to c# evander2711 Помощь студентам 0 22.12.2012 17:51
ПОДПРОГРАММЫ DELFI!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! EllRay Помощь студентам 1 25.12.2010 21:07
Задание в Delfi WedGE Помощь студентам 3 26.05.2010 15:26
Delfi RS219 Свободное общение 1 18.05.2010 12:32