Форум: "Начинающим";
Текущий архив: 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