Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Массив

Автор: Wizzy 4.11.2010 15:47

Здравствуйте, появились проблемы, при решении данной задачи:
Дан массив х вещественных чисел. Получить упорядоченный по невозрастанию массив, состоящий из чисел данного массива, находящихся между предпоследним и последним отрицательным членом. (Проверить массив на наличие элементов между ними)

program mass;

var
i, j, k, n, d: integer;
x: real;
a, s: array [1..10] of real;

begin
writeln('Программа выводит элементы массива, расположенные между предпоследним и последним отрицательными числами');
writeln('Введите количество элементов массива');
read(n);
k := 0;
j := 0;
writeln('Введите элементы массива');
for i := 1 to n do {Ввод массива}
read(s[i]);

while k <> 2 do {Нахождение двух отрицательных чисел}
begin
for i := 1 to n do {Проверяем массив}
begin
if s[i] < 0 {Если элемент массива отрицателен}
then
begin
a[i] := s[i]; {присваиваем отрицательные числа массива s массива a}
k := k + 1; {счётчит отрицательных элементов массива}
end;
end;
end;




for i := 1 to n - 1 do {упорядочивание массива по убыванию}
for j := i + 1 to n do
if s[i] < s[j] then
begin
x := s[i];
s[i] := s[j];
s[j] := x;
end;

for i := 1 to n do
write(s[i], ' '); {Вывод массива}
writeln;
end.


Прошу помощи с поиском предпоследнего и поледнего отрицательного числа wacko.gif и как можно организовать вывод конечного массива, просто если я записываю отрицательные числа в другой массив, на месте положительных получаются нули.

Автор: Client 4.11.2010 16:15

ищи с конца массива первые 2 отрицательные числа, запомни их индексы, перенеси элементы в другой массив и отсортируй. выведи второй массив.

Автор: sheka 4.11.2010 16:34

Э, не)
А если в массиве 1 отрицательное число? А если их вообще нет?
Есть 2 способа решения этой задачи: проход с начала массива и до конца с перезаписью позиций последнего-предпоследнего элементов, и другой, проход с конца массива и в сторону начала массива и с помощью Break.
2й более предпочтительный.
И только потом, анализируя присутствие, как минимум последнего-предпоследнего отрицательных элементов, можно заполнять новый массив. (хотя можно поизвращаться и попытаться это сделать все сразу, но это уже как сказать что лучше..).

Автор: Unconnected 4.11.2010 17:03

Наверное, надо идти с конца и после нахождения первого отрицательного переносить все числа в другой массив, бОльшие добавляя в начало, а меньшие дописывая в конец. В одном цикле (с одним вложенным) должно получиться.

Автор: TarasBer 4.11.2010 17:09

> переносить все числа в другой массив, бОльшие добавляя в начало, а меньшие дописывая в конец

бОльшие чего?
Вот идём мы, и получаем сначала 1, потом 3, потом 2. Куда эту двойку?

Автор: Client 4.11.2010 17:10

Цитата
Э, не)
А если в массиве 1 отрицательное число? А если их вообще нет?

const
n = 10;
var
mas : array [1..n] of integer;
a : array [1..2] of byte;
i, k : byte;
s : integer;
begin
writeln('Vvedite massiv');
for i := 1 to n do read (mas[i]);
a[1] := n;
a[2] := n;
k := 2;
i := n;
s := 0;
while (i > 0) and (k > 0) do begin
if mas[i] < 0 then begin
a[k] := i;
dec(k);
end;
dec(i);
end;
for i := a[1] + 1 to a[2] - 1 do s := s + mas[i];
writeln(s);
end.

Потестируй, может найдешь баг

Автор: Wizzy 4.11.2010 17:31

Ну примерно так, массив развернул, нашёл последний и предпоследний элементы

Код
program mass;

const
  max = 10;

var
  i, j, k, n, d: integer;
  x, z: real;
  a, s, obrat: array [1..max] of real;

begin
  writeln('Программа выводит элементы массива, расположенные между предпоследним и последним отрицательными числами');
  writeln('Введите количество элементов массива');
  read(n);
  k := 0;
  j := 0;  
  writeln('Введите элементы массива');
  for i := 1 to n do  {Ввод массива}
    read(s[i]);
  
  for i := 1 to max do
    obrat[max - i + 1] := s[i];
  
  begin
    for i := 1 to max do {Проверяем массив}
    begin
      if obrat[i] < 0 {Если элемент массива отрицателен}
      then
      begin
        a[i] := obrat[i]; {присваиваем отрицательные числа массива s массива a}
        k := k + 1; {счётчит отрицательных элементов массива}
        if k = 2 then break;
      end;
    end;
  end;  
  
  for i := 1 to max - 1 do {упорядочивание массива по убыванию}
    for j := i + 1 to max do
      if a[i] < a[j] then
      begin
        x := a[i];
        a[i] := a[j];
        a[j] := x;
      end;
  
  for i := 1 to max do
    write(a[i], ' ');  {Вывод массива}
  writeln;
end.


подскажите, как дальше поступать?

Автор: volvo 4.11.2010 17:35

Цитата
подскажите, как дальше поступать?
То есть, вопрос "что делать если НЕТ двух отрицательных чисел" проигнорирован?

Автор: Wizzy 4.11.2010 17:48

Ну вроде как написано указание "(Проверить массив на наличие элементов между ними(отрицательными числами))", мне кажется, что их наличие обязательно...

Автор: Client 4.11.2010 17:57

Цитата
Проверить массив на наличие
о чем говорит? Что надо проверить, а не что они там обязательны
я выложил код, который считает сумму элементов между последними отрицательными (сам не знаю почему), а тебе надо отсортировать. Пару строк изменить и все.

Автор: Wizzy 4.11.2010 17:57

Код
const
   n = 10;
var
   mas : array [1..n] of integer;
   a : array [1..2] of byte;
   i, k : byte;
   s : integer;
begin
        writeln('Vvedite massiv');
        for i := 1 to n do read (mas[i]);
        a[1] := n;
        a[2] := n;
        k := 2;
        i := n;
        s := 0;
        while (i > 0) and (k > 0) do begin
                if mas[i] < 0 then begin
                        a[k] := i;
                        dec(k);
                end;
                dec(i);
        end;
        for i := a[1] + 1 to a[2] - 1 do s := s + mas[i];
        writeln(s);
end.

ну тут, как я понял записыфваются индексы этих чисел, только вот как их можно испльзовать?

Добавлено через 1 мин.
я понял, спасибо, сейчас попробую

Автор: TarasBer 4.11.2010 18:00

Зачем массив разворачивать?!
Убери переменную obrat, пока меня кондратий не хватил!
Для обхода массива с конца существует оператор downto, если что.

Автор: Wizzy 4.11.2010 18:05

Код
const
  n = 10;

var
  mas, m: array [1..n] of integer;
  a: array [1..2] of byte;
  i, k: byte;
  j, x: integer;

begin
  writeln('Программа выводит элементы массива, расположенные между предпоследним и последним отрицательными числами');
  writeln('Введите массив');
  for i := 1 to n do read(mas[i]);
  a[1] := n;
  a[2] := n;
  k := 2;
  i := n;
  while (i > 0) and (k > 0) do
  begin
    if mas[i] < 0 then begin
      a[k] := i;
      dec(k);
    end;
    dec(i);
  end;
  for i := a[1] + 1 to a[2] - 1 do
    m[i] := mas[i];
  for i := 1 to n - 1 do {упорядочивание массива по убыванию}
    for j := i + 1 to n do
      if m[i] < m[j] then
      begin
        x := m[i];
        m[i] := m[j];
        m[j] := x;
      end;
      for i:=1 to n do
      write (' ', m[i]);
end.

спасибо огромное )

Автор: Аленка 4.10.2013 22:56

так какое окончательное решение задачи то? я запуталась честно говоря уже)) wacko.gif