Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Упростить выражение


Страницы:   1 2

Гость ©   (2010-03-03 10:26:00) 

Добрый день. подскажите, пожалуйста, как можно сократить вот такую запись, при этом неувеличив размер программы:
type
   TBlok = array[1..32] of byte;

var
   B: TBlok;
begin
{Что-то делаем..}
if (B[16] or B[17] or B[18] or B[19] or B[20] or
         B[21] or B[22] or B[23] or B[24] or B[25] or
         B[26] or B[27] or B[28] or B[29] or B[30] or
         B[31] or B[32] or B[15]) = 0 then {Что-то делаем..}
end


grammar-nazi   (2010-03-04 11:56:00) [1]

i := 15; v := 0;
while (i <= 32) and (v = 0) do begin v := v or B[i]; inc(i) end;


123   (2010-03-04 11:39:00) [2]

for i -> Бн = random
b15 = 0


> B[15]*B[16]*B[17]*B[18]*B[19]*B[20]*B[21]*B[22]*B[23]*B[24]*B[25]*B[27]*B[28]*B[  
> 29]*B[30]*B[31]*B[32]=0


oldman   (2010-03-03 20:13:00) [3]


> if (B[16] or B[17] or B[18] or B[19] or B[20] or
>          B[21] or B[22] or B[23] or B[24] or B[25] or
>          B[26] or B[27] or B[28] or B[29] or B[30] or
>          B[31] or B[32] or B[15]) = 0 then


if B[15]*B[16]*B[17]*B[18]*B[19]*B[20]*B[21]*B[22]*B[23]*B[24]*B[25]*B[27]*B[28]*B[ 29]*B[30]*B[31]*B[32]=0 then

:)


MBo   (2010-03-03 17:09:00) [4]

Задачу опишите подробнее


Игорь Шевченко   (2010-03-03 16:44:00) [5]

Гость   (03.03.10 15:14) [24]

Очевидно, что если их сотня или две, то нужно данные иначе организовать.


12   (2010-03-03 15:21:00) [6]

а ежели матрицу const ввести?
const
MatrixRule : array [1..32] of byte = (0,0,00,0,1,2,,,4,4,33,);
ее довольно хорошо можно править, а код сравнения везде будет одинаковый


12   (2010-03-03 15:17:00) [7]

Ё..

bb:=true
for i:= 15 to 32 do bb := bb and b[i]=0
if bb then {Что-то делаем..}
else {отдыхаем..}


Гость   (2010-03-03 15:14:00) [8]

Игорь Шевченко, согласен с Вами, но как-то оно смотриться не очень... хочется компактности.. а если бы там сотня этих элементов бы была или 2 сотни?
Вроде бы так можно, но все равно 2 лишние переменные и лишние операции..
       

Bool := false;
for i := 15 to 32 do
    Bool := Bool or (Block[i] <> 0);
if not Bool then  .....


12   (2010-03-03 15:13:00) [9]

if 1=0 then {Что-то делаем..}
else {отдыхаем..}


brother   (2010-03-03 15:11:00) [10]

блин, туплю


brother   (2010-03-03 15:10:00) [11]

;)
type
  TBlok = array[1..32] of byte;
var
  B: TBlok;
  i: integer;
begin
{Что-то делаем..}
 if b[15] = 0 then
   for i:= 16 to 32 do
     if (b[i-1] = b[i]) and (i=32) then {Что-то делаем..}
end;


Игорь Шевченко   (2010-03-03 14:52:00) [12]

не надо ничего сокращать, запись достаточно понятная, очевидная и легко изменяемая в будущем


12   (2010-03-03 14:41:00) [13]

да, похоже проще

> CompareMem


Плохиш   (2010-03-03 14:26:00) [14]


> brother ©   (03.03.10 14:23) [17]

Продолжай, это опять не верно.
Там все проверяемые должны быть равны нулю.


brother   (2010-03-03 14:23:00) [15]

те так:

type
 TBlok = array[1..32] of byte;

var
 B: TBlok;
 i: integer;
 ok: boolean;
begin
{Что-то делаем..}
ok:= false;
for i:= 15 to 32 do
  if B[i] = 0 then
  begin
    ok:= true;
    Break;
  end;
if ok then {Что-то делаем..}
end


картман   (2010-03-03 14:21:00) [16]


> brother ©   (03.03.10 14:20) [15]

там же "или"


brother   (2010-03-03 14:20:00) [17]

может так? ;)
type
  TBlok = array[1..32] of byte;

var
  B: TBlok;
  i: integer;
  ok: boolean;
begin
{Что-то делаем..}
 ok:= true;
 for i:= 15 to 32 do
   if B[i] = 0 then
   begin
     ok:= false;
     Break;
   end;
 if ok then {Что-то делаем..}
end


Agrh   (2010-03-03 13:40:00) [18]

Да ступил, признаю.. :)


Palladin   (2010-03-03 13:19:00) [19]


> Agrh   (03.03.10 13:00) [10]

на кой городить цикл если все зависит от состояния последнего элемента?

type
TBlok = array[1..32] of byte;

var Block: TBlok;
 i: byte;
 B: Boolean;
begin
    Block[31] := 0;
    Block[32] := 2;
    for i := 15 to 32 do
       B := Block[i] = 0;

    if B then  ShowMessage('Agrh Blok is zero');
end

и все, результат не верный. ты точно верно понимаешь логику операции or ?


Ega23   (2010-03-03 13:15:00) [20]


> Palladin, почему неверное?

type
TBlok = array[1..32] of byte;

var Block: TBlok;
  i: byte;
  B: Boolean;
begin
     Block[31] := 2;
     Block[32] := 0;
     for i := 15 to 32 do
        B := Block[i] = 0;

     if B then  ShowMessage('Agrh Blok is zero');
end


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо