Помощь - Поиск - Пользователи - Календарь
Полная версия: Массив
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Wizzy
Здравствуйте, появились проблемы, при решении данной задачи:
Дан массив х вещественных чисел. Получить упорядоченный по невозрастанию массив, состоящий из чисел данного массива, находящихся между предпоследним и последним отрицательным членом. (Проверить массив на наличие элементов между ними)
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
ищи с конца массива первые 2 отрицательные числа, запомни их индексы, перенеси элементы в другой массив и отсортируй. выведи второй массив.
sheka
Э, не)
А если в массиве 1 отрицательное число? А если их вообще нет?
Есть 2 способа решения этой задачи: проход с начала массива и до конца с перезаписью позиций последнего-предпоследнего элементов, и другой, проход с конца массива и в сторону начала массива и с помощью Break.
2й более предпочтительный.
И только потом, анализируя присутствие, как минимум последнего-предпоследнего отрицательных элементов, можно заполнять новый массив. (хотя можно поизвращаться и попытаться это сделать все сразу, но это уже как сказать что лучше..).
Unconnected
Наверное, надо идти с конца и после нахождения первого отрицательного переносить все числа в другой массив, бОльшие добавляя в начало, а меньшие дописывая в конец. В одном цикле (с одним вложенным) должно получиться.
TarasBer
> переносить все числа в другой массив, бОльшие добавляя в начало, а меньшие дописывая в конец

бОльшие чего?
Вот идём мы, и получаем сначала 1, потом 3, потом 2. Куда эту двойку?
Client
Цитата
Э, не)
А если в массиве 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
Ну примерно так, массив развернул, нашёл последний и предпоследний элементы
Код
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
Цитата
подскажите, как дальше поступать?
То есть, вопрос "что делать если НЕТ двух отрицательных чисел" проигнорирован?
Wizzy
Ну вроде как написано указание "(Проверить массив на наличие элементов между ними(отрицательными числами))", мне кажется, что их наличие обязательно...
Client
Цитата
Проверить массив на наличие
о чем говорит? Что надо проверить, а не что они там обязательны
я выложил код, который считает сумму элементов между последними отрицательными (сам не знаю почему), а тебе надо отсортировать. Пару строк изменить и все.
Wizzy
Код
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
Зачем массив разворачивать?!
Убери переменную obrat, пока меня кондратий не хватил!
Для обхода массива с конца существует оператор downto, если что.
Wizzy
Код
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.

спасибо огромное )
Аленка
так какое окончательное решение задачи то? я запуталась честно говоря уже)) wacko.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.