Здравствуйте, появились проблемы, при решении данной задачи: Дан массив х вещественных чисел. Получить упорядоченный по невозрастанию массив, состоящий из чисел данного массива, находящихся между предпоследним и последним отрицательным членом. (Проверить массив на наличие элементов между ними)
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.
Прошу помощи с поиском предпоследнего и поледнего отрицательного числа и как можно организовать вывод конечного массива, просто если я записываю отрицательные числа в другой массив, на месте положительных получаются нули.
Автор: 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
так какое окончательное решение задачи то? я запуталась честно говоря уже))