Помощь - Поиск - Пользователи - Календарь
Полная версия: Одномерный массив
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Merlin
Помогите решить задачку :

Задан упорядоченный по невозрастанию одномерный массив.

1) Найти произведение отрицательных элементов массива;
2) Найти сумму положительных элементов массива;
3) Упорядоченный по невозрастанию массив преобразовать в упорядоченный по возрастанию, оставив по одному в каждой группе совпадающих элементов.
volvo
Используй Поиск + FAQ ... Уже десятки раз решалось.
Merlin
Насчёт пунктов 1 и 2 я почти разобрался, а вот как с 3). ? а именно :

Как сделать вот это : "оставив по одному в каждой группе совпадающих элементов."
volvo
Цитата
Как сделать вот это : "оставив по одному в каждой группе совпадающих элементов."

Вот тебе пример:
const
a: array[1 .. 10] of integer =
(1, 1, 2, 3, 4, 4, 4, 5, 6, 7);

var
i, j, n: integer;

begin
n := 10; i := 2;
while i <= n do
if a[i] = a[i - 1] then begin
for j := i to n - 1 do
a[j] := a[j + 1];
dec(n);
end
else inc(i);

for i := 1 to n do
write(a[i]:4);
writeln;
end.
Merlin
Цитата
Задан упорядоченный по невозрастанию одномерный массив


Это понимать как :

1.
 const
a: array [1..10] of integer =
('10', '9', '8', '7', '6', '5', '4', '3', '2', '1');


2. Или надо сначала задать массив, а потом упорядочить по невозрастанию ?
volvo
Ну, во-первых, у тебя в задании записано, что он уже задан как упорядоченный, значит ничего дополнительно с ним делать для этого не надо...

А во вторых, то что ты привел в предыдущем посте - ошибка, т.к. у тебя получается не массив чисел, а массив строк. Паскаль это не пропустит... Посмотри как у меня написано...
Merlin

Program z;

const
a: array [1..10] of integer =
(5, 4, 3, 2, 2, 1, -1, -2, -3, -4);
Var
i , j , P, S :integer;

Begin
n:10; P:=1;
for i:=1 to n do
if a[i] < 0 then begin { произведение отриц. элем. }
P:= P* a[i];
end;

S:=0;
for i:=1 to n do
if a[i] > 0 then begin { Сумма положит. элементов }
S:= S + a[i];
end;

i := 2;
while i <= n do
if a[i] = a[i - 1] then begin
for j := i to n - 1 do
a[j] := a[j + 1];
dec(n);
end
else inc(i);

for i := 1 to n do
write(a[i]:4);
writeln;
writeln( ' Сумма положительных элементов S=', S:3:7);
writeln( ' Произведение отрицательных элементов P=' ,P:3:7);
end.



Volvo, подскажи есть ли тут ошибки ?
GoodWind
такой вариант в ТМТ отработал на "ура", в ТП тоже все должно работать:
Program z;

const
a: array [1..10] of integer =
(5, 4, 3, 2, 2, 1, -1, -2, -3, -4);
Var
i , j , P, S,n :integer; {n ты забыл описАть}

Begin
n:=10; P:=1; {было n:10;}
for i:=1 to n do
if a[i] < 0 then begin { произведение отриц. элем. }
P:= P* a[i];
end;

S:=0;
for i:=1 to n do
if a[i] > 0 then begin { Сумма положит. элементов }
S:= S + a[i];
end;

i := 2;
while i <= n do
if a[i] = a[i - 1] then begin
for j := i to n - 1 do
a[j] := a[j + 1];
dec(n);
end
else inc(i);

for i := 1 to n do
write(a[i]:4);
writeln;
writeln( ' Сумма положительных элементов S=', S:3);
writeln( ' Произведение отрицательных элементов P=' ,P:3);{на форматирование вывода ругался}
end.

так вот rolleyes.gif
Merlin
Всё работает, спасибо good.gif , вот только


Цитата
) Упорядоченный по невозрастанию массив преобразовать в упорядоченный по возрастанию


Как вы думаете пойдёт такой способ из FAQ'а ?



for i:=1 to size-1 do begin
nmin:=i;
for j:=i+1 to size do
if mass[j] > mass[Nmin] then
Nmin:=j;

temp:=mass[i];
mass[i]:=mass[Nmin];
mass[Nmin]:=temp;

klem4
Инверсия решит ;)


for i := 1 to n div 2 do begin
temp := x[i];
x[i] := x[n-i+1];
x[n-i+1] := temp;
end;
Merlin
Код

Program z;
    
const
        a: array [1..10] of integer =
                                  (5, 4, 3, 2, 2, 1, -1, -2, -3, -4);
   Var
      i , j , P, S, n :integer;
      temp: array [1..10] of integer;
    
Begin
n:=10;   P:=1;
      for i:=1 to n do
        if a[i] < 0 then begin     { произведение отриц. элем. }
          P:= P* a[i];
end;

    S:=0;
      for i:=1 to n do
         if a[i] > 0  then begin   { Сумма положит. элементов }
           S:= S + a[i];
end;

i := 2;
  while i <= n do
    if a[i] = a[i - 1] then begin
      for j := i to n - 1 do
        a[j] := a[j + 1];
      dec(n);
    end
    else inc(i);
      
for i:= 1 to n div 2 do begin  
      temp: = a[i];                { Выдаёт ошибку type mismatch }
       a[i]:= x[n-i +1];
       a[n-i+1]:=temp;
end;

  for i := 1 to n do
    write(a[i]:4);
  writeln;
writeln( ' Сумма положительных элементов S=', S:3);
writeln( ' Произведение отрицательных элементов P=' ,P:3);
end.

    


Что с этой инверсией не так, что я сделал неправильно ?
klem4
посмотри как у тебя описана temp ... она должна быть не тип массива, а тип элемента массива
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.