Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.03.18;
Скачать: [xml.tar.bz2];

Вниз

Работа с одномерными массивами   Найти похожие ветки 

 
xrumas ©   (2011-12-04 19:30) [0]

Есть матрица, одномерная, нужно найти произведение элементов между максимальным и минимальными элементами. Так вот, не знаю как сделать так, что бы если минимальный элемент стоит перед максимальным в массиве, произведение находилось от минимального до максимального, то есть наоборот. Вроде написал правильно, сначало находим максимальный элемент, присваиваем переменной, потом минимальный, то же присваиваем, потом уже произведение находим.
вот создание массива
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;


 
Jeer ©   (2011-12-04 19:42) [1]

Отсортируй, перемножь первую и вторую половины.


 
Jeer ©   (2011-12-04 19:44) [2]

А, или произведение максимального и минимального элементов ?
Опять же отсортируй и перемножь первый и последний элементы.


 
Плохиш ©   (2011-12-04 19:44) [3]


> 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;

Достаточно одного цикла

> 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!!!!!

Переставь местами или засти условия в сравнении, или начальное и конечное значение в цикле.

PS. Для проверки воспалённых фантазий мозга всегда достаточно реализовать их по шагам с помощью карандаша и бумаги.


 
Плохиш ©   (2011-12-04 19:45) [4]


> если минимальный элемент стоит перед максимальным в массиве,
>  произведение находилось от минимального до максимального,
>  то есть наоборот.

Бред какой-то.


 
Jeer ©   (2011-12-04 19:48) [5]


> Бред какой-то.


Как обычно - попытка из рандом-слов получить программу.


 
xrumas ©   (2011-12-04 19:52) [6]


А, или произведение максимального и минимального элементов  ?


Произведение между максимальным и минимальным.

Ну вот сортировку сделал вроде, теперь нужно от макс до мин найти произведение, но макс и мин не включать, вроде вот так должно быть, а что то не работает все равно.

Вроде так
for i:=maxI+1 to minI-1 do begin
pr:=pr*d[z] ;


Сортировка от минимального до максимального:
procedure TForm1.Button4Click(Sender: TObject);
var i,j,t,z :integer;  //sortirovla Massivka
begin
edit5.Clear;
 for i:=0 to n-1 do
begin
 for j:=i+1 to n-1 do
if d[i] > d[j] then
begin
 t:=d[i];
 d[i]:=d[j];
d[j]:=t
end;
end;
for z:=0 to n-1 do
edit5.Text:=edit5.text+inttostr(d[z])+"   ";
end;


 
xrumas ©   (2011-12-04 19:56) [7]


> Бред какой-то.


В одномерном массиве, состоящем из n целых элементов, вычислить  произведение элементов массива, расположенных между максимальным и минимальным элементами.


 
xrumas ©   (2011-12-04 20:11) [8]


> > 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;
>
> Достаточно одного цикла


Не получеться так сделать что то.

Я может условие не првильно понял, я понимаю так, что дан массив, например, 2 4 5 6 3 2 1 2 3, 6 это макс элемент, 1 это мин, между ними 3 и 2, вот их произведение нужно найти.


 
Dimka Maslov ©   (2011-12-04 20:11) [9]

1. Находим индексы минимального и максимального элементов (в одном цикле)
2. Если индекс минимального элемента больше индекса максимального - меняем их местами.
3. Циклом проходим все элементы для получения произведения.


 
MBo ©   (2011-12-04 20:12) [10]

for i:= Min(maxI, MinI)+1 to Max(maxI, MinI)-1


 
xrumas ©   (2011-12-04 20:55) [11]


> for i:= Min(maxI, MinI)+1 to Max(maxI, MinI)-1


в Uses нужно Math дописать ? Ругаеться что то [Error] Unit1.pas(143): Missing operator or semicolon после Min(


 
MBo ©   (2011-12-04 21:04) [12]

>в Uses нужно Math дописать ?
да


 
xrumas ©   (2011-12-04 21:42) [13]

Вообщем вот, программа работает, выкладываю с заданием.
В одномерном массиве, состоящем из n целых элементов, вычислить:
1) сумму отрицательных элементов массива;
2) произведение элементов массива, расположенных между максимальным и минимальным элементами;
3) отсортировать массив по возрастанию элементов.

unit Unit1;

interface

uses
 Windows, Math, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   Button3: TButton;
   Button4: TButton;
   Edit1: TEdit;
   Edit2: TEdit;
   Label1: TLabel;
   Edit3: TEdit;
   Label2: TLabel;
   Edit4: TEdit;
   Label3: TLabel;
   Edit5: TEdit;
   Label4: TLabel;
   Label5: TLabel;
   Label6: TLabel;
   Label7: TLabel;
   Button5: TButton;
   Button6: TButton;
   Label8: TLabel;
   Label9: TLabel;
   Edit6: TEdit;
   Edit7: TEdit;
   Label10: TLabel;
   Label11: TLabel;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure Button4Click(Sender: TObject);
   procedure Button5Click(Sender: TObject);
   procedure Button6Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 a,d: array of integer;
 n,i,j:integer;
 t,z:integer;

 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);  //sozdat" massiv
begin
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.Button2Click(Sender: TObject);  //summa otrecatel"nih elementov
var s:integer;
begin
 s:=0;
   for i:=0 to n-1 do begin
     if d[i]<0 then
   s:=s+d[i];
end;
edit3.Text:=inttostr(s);

end;

procedure TForm1.Button4Click(Sender: TObject);   //sortirovla Massivka
var i,j,t,z :integer;
begin
edit5.Clear;
 for i:=0 to n-1 do begin
   for j:=i+1 to n-1 do begin
     if d[i] > d[j] then begin
       t:=d[i];
       d[i]:=d[j];
       d[j]:=t;
    end;
   end;
  end;
 for z:=0 to n-1 do
edit5.Text:=edit5.text+inttostr(d[z])+"  ";

end;

procedure TForm1.Button5Click(Sender: TObject);  //exit
begin
form1.Close;
end;

procedure TForm1.Button6Click(Sender: TObject); //cleanse:)
begin
edit1.Text:=inttostr(0);
edit2.Clear;
edit3.clear;
edit4.clear;
edit5.clear;
edit6.clear;
edit7.clear;
end;

procedure TForm1.Button3Click(Sender: TObject);  //proizvedenie
var  maxv,minv,maxi,mini:integer;
pr:integer;
begin
maxv:=d[1];
minv:=d[1];
maxi:=1;
mini:=1;
for i:=0 to N-1 do begin
 if d[i] > maxv then begin    //nahodim max element matrici
   maxv:=d[i];
   maxI:=i;
 end;
 if d[i] < minv then begin     //nahodim min element matrici
   minv:=d[i];
   minI:=i;
 end;
end;
 pr:=1;              //proizvedenie mezhdu!
 For I:= Min(mini,maxi)+1 To Max(mini,maxi)-1 Do begin
   Pr := pr * d[i];
   end;
edit7.text:=inttostr(minv);
edit6.text:=inttostr(maxv);
edit4.Text:=inttostr(pr);
end;

end.


 
Jeer ©   (2011-12-04 22:26) [14]


> maxv:=d[1];
> minv:=d[1];
> maxi:=1;
> mini:=1;
> for i:=0 to N-1 do begin


maxi := 0;
mini := 0;
maxv := d[maxi];
minv := maxv;

for i:= 1 to N - 1 do begin
...


 
Sha ©   (2011-12-04 22:56) [15]

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


//произведение элементов между (последними) максимальным и минимальным
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;


 
Anatoly Podgoretsky ©   (2011-12-04 23:02) [16]

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

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

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


 
Sha ©   (2011-12-04 23:07) [17]

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


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


> 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-05 11:14) [19]

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

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


 
Sha ©   (2011-12-05 11:16) [20]

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


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


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

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


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

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

//произведение элементов между (последними) максимальным и минимальным
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-06 09:33) [23]


> 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-06 11:26) [24]

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

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


 
Sha ©   (2011-12-06 12:42) [25]

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

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

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

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

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


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


> Sha ©

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


 
Sha ©   (2011-12-06 20:23) [27]

> Омлет ©   (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;


 
Sha ©   (2011-12-07 10:34) [28]

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

  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;


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

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


 
Sha ©   (2011-12-07 10:49) [30]

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


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

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


 
Sha ©   (2011-12-07 11:06) [32]

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


 
Sha ©   (2011-12-07 11:11) [33]

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


 
Sha ©   (2011-12-07 11:55) [34]

для далеких сумм надо запоминать 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;



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2012.03.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.004 c
2-1323074402
gvozdkoff
2011-12-05 12:40
2012.03.18
длина строк в TStringList


4-1255265451
Alexei
2009-10-11 16:50
2012.03.18
Отслеживание моментов входа в ОС (WinXP)?


15-1321901455
KilkennyCat
2011-11-21 22:50
2012.03.18
скока стоит...


2-1323158524
Scott Storch
2011-12-06 12:02
2012.03.18
поиск по таблице бд


2-1323039127
Мишаня7-8
2011-12-05 02:52
2012.03.18
Как задать кодировку текстовому файлу





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский