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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2011, 12:14   #1
SilAs
 
Регистрация: 14.02.2011
Сообщений: 7
По умолчанию Решение уравнения.массив

Здравствуйте! Задачу не могу решить.Есть массив чисел (extended), есть уравнение, переменной является значение из массива. Другими словами, перебирая значения из массива смотрим, решается уравнение или нет.И в конце выводится значение из массива, которое удовлетворяет уравнению.
Код:
PHP код:
procedure TForm1.Button4Click(SenderTObject);
var 
            
a:array [0..360of extended;     
            
foundboolean
            
iinteger
begin
  a
[i]:= StrToFloatDef(StringGrid1.Cells[0,y],0);       
  
obr := no3/l3;
  
found := FALSE
  
:= 1;
end;  


procedure TForm1.Button5Click(SenderTObject);
begin
  repeat
    
if 
(
no1/l1+
(
ne2*no2/sqrt(no2*no2*sin(a[i])*sin(a[i])+ne2*ne2*cos(a[i])*cos(a[i])))/l2) = obr  then  // вот здесь при вычислении ошибка
      
found := TRUE
    
else
      
:= 1;
  
until foundTRUE;   //or (i > SIZE) ;

begin


    
if found then
    ShowMessage
('результат найден ')//+ IntToStr(i) +  + 'Поиск успешен.')

  
else
    
ShowMessage('результат не найден');

end
Ошибка при вычислении выражения. Что может быть не так? Все слагаемые в уравнении - extended.
Заранее спасибо
Изображения
Тип файла: jpg Screenshot - 12.02111111.jpg (15.0 Кб, 50 просмотров)
SilAs вне форума Ответить с цитированием
Старый 14.02.2011, 12:24   #2
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

системный разделитель плавающих чисел не совпадает с тем, что ты вводишь
на русской раскладке он считается запятой, на англ - точкой

можно установить в программе сразу, не помню сейчас выражения


хотя, скорее всего проблема в другом, попробуй раздели на короткие команды все вычисления, и поймешь, где падает на пошаговой отладке
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 14.02.2011, 12:47   #3
SilAs
 
Регистрация: 14.02.2011
Сообщений: 7
По умолчанию

Ошибка в button5click. я думаю, что ошибка изза того что в выражение подставляется массив a[i]. Но как тогда с ним работать ?
Если подставить в выражение конкретное число, то все считает.
SilAs вне форума Ответить с цитированием
Старый 14.02.2011, 23:17   #4
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

Цитата:
Ошибка в button5click
ну ты жжошь :DDD

грю же, пройдись пошаговой отладкой!!!!
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 15.02.2011, 09:33   #5
SilAs
 
Регистрация: 14.02.2011
Сообщений: 7
По умолчанию

Видимо я не совсем тебя понимаю. Пошаговая отладка для того чтобы выяснить в какой строке при какой операци ошибка ?
SilAs вне форума Ответить с цитированием
Старый 15.02.2011, 20:32   #6
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

Цитата:
Пошаговая отладка для того чтобы выяснить в какой строке при какой операци ошибка ?
все верно, только длинное выражение раздели на короткие и поймешь, где рушится при каких условиях
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 16.02.2011, 18:15   #7
SilAs
 
Регистрация: 14.02.2011
Сообщений: 7
По умолчанию

Переделал вот так
PHP код:
procedure TForm1.Button5Click(SenderTObject);
var 
a1,a2,a3,a4,a5:extended;
begin
    a1
:=no1/l1;
    
a2:=no2*no2*sin(a[i])*sin(a[i]);
    
a3:=ne2*ne2*cos(a[i])*cos(a[i]);
    
obr:=Round((a1+(ne2*no2/sqrt(a2+a3))/l2)*10000 10000);//округляем до 10000-ых.
  
repeat
 
if obr g then  // g- константа =1,0000
      
found := TRUE
    
else
      
:= 1;
begin
    
if found then
    ShowMessage
('совпадение есть')

  else
    
ShowMessage('совпадения нет');
end
.Все работает, считает, перебирает. Но в конце выдает что совпадений нет... странно... вроде формат числа такой же - 0,0000 . а в массиве сам в ручную нашел значение 1,0000. т.е. должно совпасть а выдает что нет совпадений... Почему так может быть?
SilAs вне форума Ответить с цитированием
Старый 22.02.2011, 10:28   #8
SilAs
 
Регистрация: 14.02.2011
Сообщений: 7
По умолчанию

Кто знает в чем может быть проблема ? Уже месяц бьюсь с этой программой О_о
SilAs вне форума Ответить с цитированием
Старый 22.02.2011, 10:55   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вещественные числа нельзя сравнивать по строгому равенству.
там может быть 0,99999999999999 или 1,0000000000001(образно говоря)
и это не равно 1,0
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.02.2011, 11:27   #10
SilAs
 
Регистрация: 14.02.2011
Сообщений: 7
По умолчанию

А разве ROUND не переводит формат чисел типа 1,0000000001 в 1,0000 в приведенном коде ?
SilAs вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение уравнения Патагон3000 Помощь студентам 0 04.03.2010 19:22
Решение уравнения Datrav Паскаль, Turbo Pascal, PascalABC.NET 2 06.06.2008 08:23
Решение квадратного уравнения Stiv Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 30.11.2007 15:15