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

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

Работа с одномерными массивами [D7]


Страницы:   1 2

xrumas ©   (2011-12-04 19:30:00) 

Есть матрица, одномерная, нужно найти произведение элементов между максимальным и минимальными элементами. Так вот, не знаю как сделать так, что бы если минимальный элемент стоит перед максимальным в массиве, произведение находилось от минимального до максимального, то есть наоборот. Вроде написал правильно, сначало находим максимальный элемент, присваиваем переменной, потом минимальный, то же присваиваем, потом уже произведение находим.
вот создание массива
procedure TForm1.Button1Click(Sender: TObject);
begin   //sozdat' massiv
edit2.Clear;
n:=strtoint(edit1.Text);
setlength(d,n);
randomize;
for i:=0 to n-1 do
begin
d[i]:=round(40*random-20);
edit2.text:=edit2.text+inttostr(d[i])+'  ';
end;
end;


Нахлждение произведения
procedure TForm1.Button3Click(Sender: TObject);  //pr
var  max,min,maxi,mini,pr,pr1:integer;
begin
pr:=1;
pr1:=1 ;
max:=d[1];
min:=d[1];
maxi:=1;
mini:=1;
for i:=0 to N-1 do begin //nahodim max element matrici
if d[i]>max then begin
max:=d[i];
maxI:=i;
end;
edit6.text:=inttostr(max);
end;
for i:=0 to N-1 do  begin  //nahodim min element matrici
if d[i]<min then begin
min:=d[i];
minI:=i;
end;
edit7.text:=inttostr(min);
end;
if maxi > mini then begin  //KAK ETO SDELAT' TO??? NIFIGA NE RABOTAET ZHE!!!!!!
for i:=maxI+1 to minI-1 do begin
pr:=pr*d[i] ;
end;
edit4.Text:=inttostr(pr); //VSEGDA EDINICA!!!!!
end;
end;


Sha   (2011-12-07 11:55:00) [1]

для далеких сумм надо запоминать 4 позиции вместо двух,
как-то так должно быть:

//не отлажено!!!
//сумма элементов между наиболее удаленными максимальным и минимальным
function GetSum(const a: ArrayType): ElementType;
var
 i, imax, imin: integer;
 first: array[2..3] of integer;
 sum: array[0..3] of ElementType;
begin;
 i:=Length(a)-1;
 imin:=i; imax:=i; first[2]:=i; first[3]:=i;
 sum[0]:=0; sum[1]:=0; sum[2]:=0; sum[3]:=0;
 Result:=0;
 while i>0 do begin;
   dec(i);
   Result:=Result+a[i];
   if a[imax]<=a[i] then begin;
     imax:=i;
     sum[1]:=Result;
     if a[imax]<a[i] then begin;
       first[3]:=i;
       sum[3]:=Result;
       end;
     end
   else if a[imin]>a[i] then begin;
     imin:=i;
     sum[0]:=Result;
     if a[imin]>a[i] then begin;
       first[2]:=i;
       sum[2]:=Result;
       end;
     end;
   end;
 if imax=imin then Result:=0
 else if first[3]-imin>first[2]-imax
      then Result:=sum[0]-sum[3]-a[imin]
      else Result:=sum[1]-sum[2]-a[imax];
 end;


Sha   (2011-12-07 11:11:00) [2]

хотя нет, погорячился, "далекие суммы" могут пересекаться


Sha   (2011-12-07 11:06:00) [3]

Кроме правых/левых, есть еще далекие/близкие, с max/min суммой.
Можно как угодно сделать, просто добавь воды внутрь ifов.


Омлет   (2011-12-07 10:55:00) [4]

Логично, если расстояние между элементами будет либо минимальным, либо максимальным. Только правые или только левые - неправильно, по-моему.


Sha   (2011-12-07 10:49:00) [5]

чтобы брать левые, достаточно цикл крутить в другую сторону


Омлет   (2011-12-07 10:43:00) [6]

Тут особенность: берутся правые минимальный и максимальный элементы.
sum([1, 1, 2, 2]) = 2.
Не знаю, насколько это корректно, в задаче просто не оговорено.


Sha   (2011-12-07 10:34:00) [7]

в конце должно быть

  if imax<imin then Result:=sum[1]-sum[0]-a[imax]
  else if imax>imin then Result:=sum[0]-sum[1]-a[imin]
  else Result:=0;


Sha   (2011-12-06 20:23:00) [8]

> Омлет ©   (06.12.11 09:33) [23]
> Есть такая идея...

ее воплощение для суммы

//сумма элементов между (последними) максимальным и минимальным
function GetSum(const a: ArrayType): ElementType;
var
 i, imax, imin: integer;
 sum: array[0..1] of ElementType;
begin;
 i:=Length(a)-1;
 imax:=i;
 imin:=i;
 sum[0]:=0;
 sum[1]:=0;
 Result:=0;
 while i>0 do begin;
   dec(i);
   Result:=Result+a[i];
   if a[imax]<a[i] then begin;
     imax:=i;
     sum[1]:=Result;
     end
   else if a[imin]>a[i] then begin;
     imin:=i;
     sum[0]:=Result;
     end;
   end;
 if imax<imin then Result:=sum[1]-sum[0]-a[imax]
 else if imax>imin then Result:=sum[0]-sum[1]-a[imin];
 end;


Омлет   (2011-12-06 13:31:00) [9]


> Sha ©

Похоже, только для суммирования и подходит. Нули делают этот способ нерабочим.


Sha   (2011-12-06 12:42:00) [10]

Только надо исправить оператор

Result := Max(minMul, maxMul) div Min(minMul, maxMul);

или (в случае суммирования)

Result := Max(minMul, maxMul) - Min(minMul, maxMul);

чтобы учесть возможное наличие отрицательных чисел.
Для этого надо сравнивать imin с imax.


Sha   (2011-12-06 11:26:00) [11]

> Омлет ©   (06.12.11 09:33) [23]
> Есть такая идея...
> Не доделано. Например массив, где есть ноль, не примет.

По крайней мере, для суммирования она должна работать.


Омлет   (2011-12-06 09:33:00) [12]


> Sha ©   (05.12.11 22:21) [22]
> по-видимому, это самый простой вариант

Есть такая идея:

function GetMulOm(const a: array of integer): int64;
var
 i, imin, imax: integer;
 minMul, maxMul: int64;
begin
 Result := 1;
 if length(a) > 2 then
 begin
   imin := low(a);
   imax := low(a);
   minMul := a[imin];
   maxMul := a[imax];
   for i := low(a) + 1 to high(a) do
   begin
     if a[i] <= a[imin] then begin
       imin := i;
       minMul := Result;
     end
     else if a[i] >= a[imax] then begin
       imax := i;
       maxMul := Result;
     end;
     Result := a[i]*Result;
   end;
   Result := Max(minMul, maxMul) div Min(minMul, maxMul);
   if Min(imin, imax) > low(a) then
     Result := Result div a[Min(imin, imax)];
 end;
end;


Не доделано. Например массив, где есть ноль, не примет.


Sha   (2011-12-05 22:21:00) [13]

по-видимому, это самый простой вариант

//произведение элементов между (последними) максимальным и минимальным
function GetMul(const a: ArrayType): ElementType;
var
 i, imax, imin: integer;
 mul: ElementType;
begin;
 Result:=1;
 i:=Length(a);  
 if i>2 then begin;
   dec(i);
   imax:=i;
   imin:=i;
   mul:=1;
   while i>0 do begin;
     dec(i);
     if a[imax]<a[i] then begin;
       if imax<imin then mul:=mul * a[imax] * Result;
       imax:=i;
       Result:=mul;
       mul:=1;
       end
     else if a[imin]>a[i] then begin;
       if imin<imax then mul:=mul * a[imin] * Result;
       imin:=i;
       Result:=mul;
       mul:=1;
       end
     else mul:=mul * a[i];
     end;
   end;
 end;


Омлет   (2011-12-05 11:21:00) [14]


> Sha ©   (05.12.11 11:14) [19]

Я задачу неверно понял.. Подумал, что между - это в уже отсортированном массиве.


Sha   (2011-12-05 11:16:00) [15]

но упростить в [15] есть что, конечно


Sha   (2011-12-05 11:14:00) [16]

> Омлет ©   (05.12.11 11:03) [18]

не нравится ей массив [2, 1, 3]


Омлет   (2011-12-05 11:03:00) [17]


> Sha ©   (04.12.11 22:56) [15]

Можно проще:

Result := 1;
if length(a) > 2 then
begin
 minValue := Min(a[0], a[1]);
 maxValue := Max(a[0], a[1]);
 for i := 2 to high(a) do
 begin
   if a[i] > maxValue then
   begin
     Result := Result * maxValue;
     maxValue := a[i];
   end
   else if a[i] < minValue then
   begin
     Result := Result * minValue;
     minValue := a[i];
   end
   else Result := Result * a[i];
 end;
end;


Sha   (2011-12-04 23:07:00) [18]

в мозгах студента матрица и таблица - синонимы


Anatoly Podgoretsky   (2011-12-04 23:02:00) [19]

> xrumas  (04.12.2011 19:30:00)  [0]

> Есть матрица, одномерная

Матрица по определению двумерная.


Sha   (2011-12-04 22:56:00) [20]

Вроде можно за один проход массива найти произведение. Не отлажено.


//произведение элементов между (последними) максимальным и минимальным
function GetMul(const a: ArrayType): ElementType;
var
 i, imax, imin: integer;
 max, min, mul: ElementType;
begin;
 Result:=1;
 i:=Length(a);
 if i>=3 then begin;
   dec(i);
   imax:=i;
   imin:=i;
   max:=a[i];
   min:=a[i];
   mul:=1;
   while i>0 do begin;
     dec(i);
     if max<a[i] then begin;
       if imax>=imin then Result:=mul else Result:=Result*max*mul;
       max:=a[i];
       imax:=i;
       mul:=1;
       end
     else if min>a[i] then begin;
       if imin>=imax then Result:=mul else Result:=Result*min*mul;
       min:=a[i];
       imin:=i;
       mul:=1;
       end
     else mul:=mul * a[i];
     end;
   end;
 end;


Страницы:   1 2

Наверх

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