Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Разное > Работа: предложения и спрос
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.03.2011, 07:44
woc131 woc131 вне форума
Прохожий
 
Регистрация: 11.02.2011
Сообщения: 13
Репутация: 10
По умолчанию Нужно написать/дописать простую прогу

Нужно сделать / доделать программу : решает не сложное уравнение с одним параметром и пишет при каком параметре это решение находится . примерно так.

П.С. Есть код, на 90% (на мой взгляд) готовый . - 10% из-за не знания синтаксиса.

П.П.С. Моя идея такая: есть массив 1,2,3,4..100, каждый элемент массива подставляется в уравнение и смотрим решается оно или нет. Решается - значит end. Но алгоритм решения задачи не столь важен

Вот в принципе и всё

Последний раз редактировалось woc131, 06.03.2011 в 07:50.
Ответить с цитированием
  #2  
Старый 06.03.2011, 12:19
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Если нужен принцип, то будет примерно так:
Код:
function Calc(Param: Integer): String;
begin
 if // Проводим вычисления подставляя переменную Param в вашу формулу
 then Result := 'Решается'
 else Result := 'Не решается';
end;
Var
 Arr: Array[1..100] of integer;
begin
 //Перед циклом массив уже должен быть заполнен значениями
 for i := 1 to 100
 do ShowMessage(Calc(Arr[i]));
end.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 07.03.2011, 14:12
woc131 woc131 вне форума
Прохожий
 
Регистрация: 11.02.2011
Сообщения: 13
Репутация: 10
По умолчанию

Можно ли так заполнить массив ? есть файл - оттуда массив переводится в stringgrid - потом из таблицы в массив. Как делать напрямую ? чтоб из файла сразу в массив, никак не разберу
PHP код:
procedure TForm1.Button2Click(SenderTObject);
begin
  assignfile
(f'angles.txt');
  
reset(f);
  
readln(ftemp);
  for 
:= 0 to stringgrid1.rowcount do
    
begin
     readln
(Ftempstr);
      
stringgrid1.cells[0y] := tempstr;
    
end;
   
closefile(f);
a[i]:= StrToFloatDef(StringGrid1.Cells[0,y],1);

end
Ответить с цитированием
  #4  
Старый 07.03.2011, 14:26
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

У меня сразу 3 непонятки по вашему коду:
Код:
  readln(f, temp);
- зачем?
Код:
a[i]:= StrToFloatDef(StringGrid1.Cells[0,y],1);
i откуда возьмется? Так использовать y после цикла не рекомендуется. Есть шанс получить в y ахинею.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 10.03.2011, 06:35
woc131 woc131 вне форума
Прохожий
 
Регистрация: 11.02.2011
Сообщения: 13
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Код:
  readln(f, temp);
- зачем?
да это забыл убрать. лишняя строка.просто строка, никакого смысла

Код:
a[i]:= StrToFloatDef(StringGrid1.Cells[0,y],1);
Заполняет массив из stringgrid.
Цитата:
i откуда возьмется?
i задана выше.не стал весь текст выкладывать, думал много будет.
Цитата:
Так использовать y после цикла не рекомендуется. Есть шанс получить в y ахинею.
Этот прием заполнения взял на заметку на форуме, кто-то так делал. Не думал, что могут быть нюансы.
А как заполнить массив напрямую. Прошелся по форуму и не понял. Как например заполнить массив a[i] значениями 0..100 с шагом 0,01 ? без всяких string grid ? скажите пожалуйста )
Ответить с цитированием
  #6  
Старый 10.03.2011, 07:18
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

Можно так:
Код:
var
  i:integer;
  a:array of double; //real
begin
  setlength(a, 10001);
  for i:=0 to 10000 do a[i]:=(i/100);
end;
Но этот алгоритм довольно медленный из-за деления (хотя для 10000 операций, на глаз это не заметно), но можно и быстрее:
Код:
var
  x:double;
  i:integer;
  a:array of double; //real
begin
  setlength(a, 10001);
  i:=0;
  x:=0;
  while i < 10001 do
    begin
    a[i]:=Real(x);
    inc(i);
    x:=x+0.01;
    end;
end;

либо

var
  i:integer;
  x:double;
  a:array of double; //real
begin
  setlength(a, 10001);
  x:=0;
  for i:=0 to 10000 do
    begin
    a[i]:=x;
    x:=x+0.01;
    end;
end;
Этот код, работает в сотни раз быстрее, но! почему-то (соответственно вопрос профессионалам) увеличение сбивается со временем на бесконечно малые величины, результат исполнения:
Код:
  ..
  2,27
  2,28
  2,29
  2,29999999999999
  2,30999999999999
  2,31999999999999
  ..
  2,75999999999999
  2,76999999999998
  2,77999999999998
  ..
  3,22999999999998
  3,23999999999997
  ..
  ..
  99,9900000000142
  100,000000000014
Того, кто ответит мне на этот вопрос, одарю малым призом

Последний раз редактировалось Asinkrit, 10.03.2011 в 07:21.
Ответить с цитированием
  #7  
Старый 10.03.2011, 07:38
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Цитата:
Весьма часто простые дроби вроде 0.1 или 0.7 не могут конвертироваться в их внутренние двоичные представления без потери точности. Это может привести к парадоксальным результатам: например, floor((0.1+0.7)*10) обычно возвращает 7 вместо ожидаемого 8 как результат внутреннего представления приблизительного числа 7.9999999999....

Причиной является то, что невозможно точно выразить некоторые дроби в десятичной нотации конечным количеством цифр. Например, 1/3 в десятичной форме имеет вид 0.3333333...
Кстати, если взять тип Extended а не Double или Real, то точность сильно возрастает... вернее для данной задачи погрешности не наблюдается
Код:
var
  i:integer;
  x:Extended;
  a:array of Extended;
begin
  setlength(a, 10001);
  x:=0;
  for i:=0 to 10000 do
    begin
    a[i]:=x;
    x:=x+0.01;
    end;
end;
Для понимания вопроса стоит почитать о форме представления числа с плавающей точкой/запятой .
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.

Последний раз редактировалось dr. F.I.N., 10.03.2011 в 07:43.
Ответить с цитированием
  #8  
Старый 11.03.2011, 09:22
woc131 woc131 вне форума
Прохожий
 
Регистрация: 11.02.2011
Сообщения: 13
Репутация: 10
По умолчанию

Спасибо, все ок, массив заполнен, но возникла следующая загвоздка - при операциях с массивом чтото не сходится. При подсчете значений син и кос - ошибка :
PHP код:
procedure TForm1.Button6Click(SenderTObject);
 var 
a1,a2,a3,a4,a5:extended;
begin
  i
:=1     ;
  
found:=false;
   
a1:=123456.111// постоянная extended 
    
repeat
    a2
:=no2*no2*sin(a[i])*sin(a[i]); //вот здесь ошибка invalid floating point operation
    
a3:=ne2*ne2*cos(a[i])*cos(a[i]);
    
obr:=Round((a1+(ne2*no2/sqrt(a2+a3))/l2)*10000 10000) ;
 if 
g=obr        // g:=1.1175
 
then
      found 
:= TRUE
    
else
      
:= 1;


  
until found=true

Ошибка скорее всего из-за a[i], но как тогда посчитать синусы при всех значениях a[i] ? Как это оформить ?

Последний раз редактировалось woc131, 12.03.2011 в 07:18.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:18.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter