Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как написать цикл while с чтением из массива


Автор: Serhik_z 28.2.2005, 16:47
Как написать цикл while с чтением из массива. array[20..100] Числа из массива
подставляются в результат сравнения ((a/b)*(c/d)) но не
повторяясь как (20/20)*(40/40), а (25/34)*(50/23)
по формуле. Если 1,3456 = ((a/b)*(c/d)) то вывести полученные результаты
сравнения чисел которые подошли из массива в memo.
P.S. Буду очень благодарен.
smile smile smile

Автор: Marriage 28.2.2005, 16:55
НИчего не понял, напиши попонятнее...

Автор: Serhik_z 28.2.2005, 17:04
Есть число 1.23445. Нужно по форуме (a/b)*(c/d) методом перебора чисел от 20 до 100 только целые
сравнить с полученным числом 1.23445 и что сошлось с числом 1.23445 вывести результат.
тоесть Если 1.23423 = (a/b)*(c/d) - вместо "a b с d" подставляются числа от 20 до 100

Автор: Александра 28.2.2005, 17:23
Serhik_z
по идее так:

Код

const f = 1.23445;
var a,b,c,d: integer;
begin
 a := 20;
 while a <> 100 do begin
   b := 20;
   while b <> 100 do begin
     c := 20;
     while c <> 100 do begin
       d := 20;
       while d <> 100 do begin
         if {сошлось} then;
         inc(d)
       end;
       inc(c)
     end;
     inc(b)
   end;
   inc(a)
 end;


тока ничего не сойдется, нужно брать примерное. сам посмотри как тебе лучше

Автор: Snowy 28.2.2005, 17:25
Код

var
 a,b,c,d: integer;
begin
 for a:=20 to 100 do
   for b:=20 to 100 do
     for c:=20 to 100 do
       for d:=20 to 100 do
         if (a/b)*(c/d) = 1.23423 then
           Memo1.Lines.Add(Format('a=%d, b=%d, c=%d, d=%d',[a,b,c,d]));

Через for аккуратнее. Тока нет такой комбинации. Видимо число другое.

Автор: Serhik_z 28.2.2005, 17:29
Большое Спасибо, попробуем.
smile smile smile

Автор: Snowy 28.2.2005, 17:33
Цитата(Serhik_z @ 28.2.2005, 16:47)
но не
повторяясь как (20/20)*(40/40),

Для этого перед добавлением в мемо нужно добавить еще строчку
Код

if (a<>b) and (c<>d) then

Автор: Serhik_z 28.2.2005, 18:17
Snowy - спасибо.

Все работает, результат в memo не виден.
Код

procedure TForm1.RzShapeButton1Click(Sender: TObject);
var
   m: real;  
   k: real;  
   i: real;    
   c: integer;  
   d: integer;
   v: real;    
   aa,bb,cc,dd: integer;

begin

// получить исходные данные из полей ввода
m:= StrToFloat(RxCalcEdit1.Text);
k:= StrToFloat(RxCalcEdit2.Text);
i:= StrToFloat(RxCalcEdit3.Text);
// предварительные преобразования
c:= Trunc(m);
d:= Trunc(m/2) mod 10000;
// вычисление
v:=sin(((k+i/60)*pi)/180)*4.0425/m;

for aa:=20 to 100 do
  for bb:=20 to 100 do
    for cc:=20 to 100 do
      for dd:=20 to 100 do
        if ((aa/bb)*(cc/dd)) = v then
         if (aa<>bb) and (cc<>dd) then
          Memo1.Lines.Add(Format('aa=%dd, bb=%dd, cc=%dd, dd=%dd',[aa,bb,cc,dd]));

end;

smile smile smile

Автор: Александра 28.2.2005, 23:47
Serhik_z
Хм.. ты же через while хотел?

Автор: Serhik_z 1.3.2005, 02:19
Александра - Спасибо, и так попробовал.
Код

// получить исходные данные из полей ввода
m:= StrToFloat(RxCalcEdit1.Text);
k:= StrToFloat(RxCalcEdit2.Text);
i:= StrToFloat(RxCalcEdit3.Text);
// предварительные преобразования
c:= Trunc(m);  // это целая часть числа t
d:= Trunc(m/2) mod 10000; // это дробная часть числа t
// вычисление
v:=sin(((k+i/60)*pi)/180)*4.0425/m;
aa := 20;
while aa <> 100 do begin
  bb := 20;
  while bb <> 100 do begin
    cc := 20;
    while cc <> 100 do begin
      dd := 20;
      while dd <> 100 do begin
        if ((aa/bb)*(cc/dd))= v then
        if (aa<>bb) and (cc<>dd) then
        Memo1.Lines.Add(Format('aa=%dd, bb=%dd, cc=%dd, dd=%dd',[aa,bb,cc,dd]));
        inc(dd)
      end;
      inc(cc)
    end;
    inc(bb)
  end;
  inc(aa)
end;

Результат не выводится в memo
Код

Memo1.Lines.Add(Format('aa=%dd, bb=%dd, cc=%dd, dd=%dd',[aa,bb,cc,dd]));


Автор: Snowy 1.3.2005, 08:35
Ничего удивительного. Просто его нет.
Вместо
v:=sin(((k+i/60)*pi)/180)*4.0425/m;
напиши
v:=5;
Тебе столько результатов выдаст...
Может тебе нужно v как-то округлять, до 1-2 знаков после запятой.
По твоей формуле у тебя v - число с кучей знаков после запятой,
а по формуле ((aa/bb)*(cc/dd)), думаю столько знаков и не будет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)