Помощь - Поиск - Пользователи - Календарь
Полная версия: Одномерный массив.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Allise1
кто-нибудь может помочь?очень нужно!
Дан массив размера N.
Найти максимальный из его элементов, не являющихся ни локальным максимумом, ни локальным минимумом(локальный минимум-это элемент, который меньше любого из своих соседей).Если таких элементов в массиве нет, вывести об этом сообщение.
упорядочить положительные элементы второй половины массива по убыванию модулей обратных значений.
для отладки программы числа последовательности сформировать с помощью генератора случайных чисел.
Krjuger
Помочь можем, но именно помочь, а не сделать за вас! Покажите свои идеи и наработки,тогда, если что неверно, поправим и доведем до ума.
Гость
Цитата(Krjuger @ 9.11.2012 11:50) *

Помочь можем, но именно помочь, а не сделать за вас! Покажите свои идеи и наработки,тогда, если что неверно, поправим и доведем до ума.


var
a: array [1..100] of integer;
i,max,N: integer;

begin
randomize;
write('N (<=100)= ');
readln(N);
for i:= 1 to n do
a[i]:=-25+random(101);
writeln('Initial array: ');
for i:=1 to N do write(a[i]:4);
writeln;
max:=-80;
for i:=2 to N-1 do
if (a[i]>max) and
not((a[i]>a[i+1]) and (a[i]>a[i-1])) and
not((a[i]<a[i+1]) and (a[i]<a[i-1])) then max:=a[i];
writeln('Result: ');
if max=-80 then writeln('No such elements') else writeln('Max= ',max);
readln
end.
но эта только первая часть задания, как вторую сделать вообще понятия не имею(
нужна сортировка массива, чтоб сравнить соседние элементы и при выполнении условия поменять их местами
Krjuger
Цитата

нужна сортировка массива, чтоб сравнить соседние элементы и при выполнении условия поменять их местами

Можно воспользоваться любой сортировкой, просто чуть изменить условие.Ладно щас придумаем.
Вроде сортировка пузырьком.

var
a: array [1..100] of integer;
i,j,max,N: integer;
p:integer;

procedure swap(var x,y: integer);
var t: integer;
begin
t := x;
x := y;
y := t
end;

begin
randomize;
write('N (<=100)= ');
readln(N);
for i:= 1 to n do
a[i]:=-25+random(101);
writeln('Initial array: ');
for i:=1 to N do write(a[i]:4);
writeln;
max:=-80;
for i:=2 to N-1 do
if (a[i]>max) and
not((a[i]>a[i+1]) and (a[i]>a[i-1])) and
not((a[i]<a[i+1]) and (a[i]<a[i-1])) then max:=a[i];
writeln('Result: ');
if max=-80 then writeln('No such elements') else writeln('Max= ',max);

p:=N div 2;
for j:=1 to N-1 do
for i:=p to N-j do
if abs(-a[i]) <abs(-a[i+1]) then
swap(a[i],a[i+1]);
for i:=1 to N do
write(a[i]:4);
readln
end.


Только проверьте условие, а то
Цитата
упорядочить положительные элементы второй половины массива по убыванию модулей обратных значений.

сколько раз я не перечитывал, все равно не мог понять что хотят.
Если то, что я сделал не совсем удовлетворяет условию, то напишите входной массив и то , что должно получиться на выходе после сортировки, я тогда поправлю.
Allise1
Цитата(Гость @ 10.11.2012 18:37) *

var
a: array [1..100] of integer;
i,max,N: integer;

begin
randomize;
write('N (<=100)= ');
readln(N);
for i:= 1 to n do
a[i]:=-25+random(101);
writeln('Initial array: ');
for i:=1 to N do write(a[i]:4);
writeln;
max:=-80;
for i:=2 to N-1 do
if (a[i]>max) and
not((a[i]>a[i+1]) and (a[i]>a[i-1])) and
not((a[i]<a[i+1]) and (a[i]<a[i-1])) then max:=a[i];
writeln('Result: ');
if max=-80 then writeln('No such elements') else writeln('Max= ',max);
readln
end.
но эта только первая часть задания, как вторую сделать вообще понятия не имею(
нужна сортировка массива, чтоб сравнить соседние элементы и при выполнении условия поменять их местами



спасибо!
я делала эту часть немного по другому
Program mass;
uses crt;
const N=10;
var a,d:array [1..n] of integer;
k,i,c,b,min,max:integer;
begin clrscr;
randomize;
write ('Nachaln massiv');
writeln ('Vvedite interval [b, c]');
readln (b,c);
for i:=1 to n do begin
a[i]:=random (c-b+1)+b;
write (a[i], ' '); end;
writeln;
max:=b;
min:=c; k:=0;
for i:=2 to n-1 do begin
if (not((a[i]>a[i+1]) and (a[i]>a[i-1]))) or

(not((a[i]<a[i+1]) and
(a[i]<a[i-1]))) then begin k:=k+1;
d[k]:=a[i]; end; end;
if k=0 then writeln ('Net ') else
begin
writeln ('Massiv new');
for i:=1 to k do write (d[i]:4);
writeln ; end;
readkey;
end.
то есть создала новый массив из подходящих нам эл-в и среди них уже ищу макс.Только видимо с условием что-то не то, он в новый массив лок-е макс и минимумы собирает(Не могли бы посмотреть в чем ошибка?
Krjuger
Ну чтож начнем.
Во-первых, зачем вам максимум и минимум,если вы их нигде не используете?
Во-вторых, зачем такие сложности в условии, тем более что и оно не совсем верное.

for i:=2 to n-1 do begin
if (not((a[i]>a[i+1]) and (a[i]>a[i-1]))) or

(not((a[i]<a[i+1]) and
(a[i]<a[i-1]))) then begin k:=k+1;
d[k]:=a[i]; end; end;

Зачем здесь столько отрицаний?

for i:=2 to n-1 do
begin
if not(((a[i]>a[i+1]) and (a[i]>a[i-1])) or ((a[i]<a[i+1]) and (a[i]<a[i-1]))) then
begin
k:=k+1;
d[k]:=a[i];
end;
end;


Вот и все.
Allise1
Цитата(Krjuger @ 13.11.2012 21:45) *

Ну чтож начнем.
Во-первых, зачем вам максимум и минимум,если вы их нигде не используете?
Во-вторых, зачем такие сложности в условии, тем более что и оно не совсем верное.

for i:=2 to n-1 do begin
if (not((a[i]>a[i+1]) and (a[i]>a[i-1]))) or

(not((a[i]<a[i+1]) and
(a[i]<a[i-1]))) then begin k:=k+1;
d[k]:=a[i]; end; end;

Зачем здесь столько отрицаний?

for i:=2 to n-1 do
begin
if not(((a[i]>a[i+1]) and (a[i]>a[i-1])) or ((a[i]<a[i+1]) and (a[i]<a[i-1]))) then
begin
k:=k+1;
d[k]:=a[i];
end;
end;


Вот и все.


спасибо исправила, работает.Нам же нужно теперь из нового, образовавшегося массива найти максимальный элемент.Для этого я его и описала.только как это сделать?
Krjuger

max:=d[1];
for i:=2 to k do
if (max<d[i]) then
mas:=d[i];


При условии, что к не меньше 2 иначе бессмысленно искать максимум.
Allise1
Цитата(Krjuger @ 14.11.2012 0:17) *


max:=d[1];
for i:=2 to k do
if (max<d[i]) then
mas:=d[i];


При условии, что к не меньше 2 иначе бессмысленно искать максимум.


если не трудно напишите полностью, пожалуйста.
Krjuger
Господи, вы там что то у себя исправили, теперь массив d у вас правильно заполняется, сразу же после того, как он окончательно заполнился, вы ищите максимум, что тут сложного.
Allise1
Цитата(Krjuger @ 14.11.2012 20:22) *

Господи, вы там что то у себя исправили, теперь массив d у вас правильно заполняется, сразу же после того, как он окончательно заполнился, вы ищите максимум, что тут сложного.



все поняла и сделала)спасибо!
Krjuger
Находит, вы его просто не выводите на экран........

А вообще, когда проверяете программу, пользуйтесь дебагом, там можно построчно смотреть все значения всех интересующих вас переменных.
Allise1
Цитата(Krjuger @ 14.11.2012 23:20) *

Находит, вы его просто не выводите на экран........

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


а можете объяснить, как вторую часть делали?с сортировкой которая
Krjuger
Взял написал обычную сортировку пузырьком, в интернете про них много написано.
Давайте так, вы говорите в какой строке и что непонятно, и я обьясняю.
Если не понятен сам принцып, то в гугле вбейте "сортировка пузырьком", потому что полностью писать принцып я не хочу.
Allise1
Цитата(Krjuger @ 14.11.2012 23:44) *

Взял написал обычную сортировку пузырьком, в интернете про них много написано.
Давайте так, вы говорите в какой строке и что непонятно, и я обьясняю.
Если не понятен сам принцып, то в гугле вбейте "сортировка пузырьком", потому что полностью писать принцып я не хочу.


метод мне понятен.почему вы используете оператор div? не нужно использовать swap?
Krjuger
Потому что вы писали
Цитата
элементы второй половины массива

Операция div возвращает частное от деления, я поделил длинну массива пополам, чтобы узнать с какого места сортировать.
Единственное, я еще раз прочитал ваше условие и увидел, что сортировать надо только положительные элементы, поэтому

for j:=1 to N-1 do
for i:=p to N-j do
if (a[i]>0 and (abs(-a[i])<abs(-a[i+1])) then // <------ тут добавить в условие
swap(a[i],a[i+1]);

Allise1
[quote name='Krjuger' date='15.11.2012 0:21' post='161373']


Операция div возвращает частное от деления, я поделил длинну массива пополам, чтобы узнать с какого места сортировать.

мы же задаем
const N:=10
нельзя написать for i:=5 to n-1 ?
Krjuger
Встречный вопрос, зачем выносить N:=10, если можно написать for i:=5 to 9 ?
Ответ:
Можно, но практика программирования показывает, что любые константы лучше в самом начале записывать.Есть несколько причин.
Во-первых,если преподаватель или заказчик, в общем если понадобиться изменить число элементов в массиве, вам придется ползать по всему коду программы и менять все эти числа, у вас код маленький, а представльте, если в нем тысяча строк.... или 10 тысяч...., велика вероятность где то забыть и будут неверные результаты, а потом лазий и ищи. По этой же причине середина массива у меня не число, а вычисляемая величина, достаточно изменить длинну массива и она сама вычислиться и станет правильной и не надо ползать по программе и искать.
Отсуда же следует некий подводный камень, допустим у вас 2 цикла
for i:=5 to 9
for i:=2 to 9
Первый работает с массивом а, второй с b, возможно так, что вы возьмете и машинально измените в обоих случаях 9 на 12, например.А по заданию вас попросили поменять длинну лиш массива а, опять таки у вас появитсья ошибка.А зачастую, когда код более сложный, просто так с ходу не сообразиш за что отвечают те или иные цифры, а вот если записать
for i:=5 to n
for i:=2 to m
Сразу видно что величины никак не зависят друг от друга.
Во-вторых, когда через какое то время возвращается к коду ооочень сложно понять, что это за магические цифры в циклах функциях и тд. А если есть переменные, с более менее вменяемыми названиями,то намного проще понять что происходит. Это повышает читаемость вашего кода другими людьми, да и вами самими по прошествии времени, в учебном процессе это мало актуально, а вот дальше весьма помогает.
Allise1
Цитата(Krjuger @ 15.11.2012 19:58) *

Встречный вопрос, зачем выносить N:=10, если можно написать for i:=5 to 9 ?
Ответ:
Можно, но практика программирования показывает, что любые константы лучше в самом начале записывать.Есть несколько причин.
Во-первых,если преподаватель или заказчик, в общем если понадобиться изменить число элементов в массиве, вам придется ползать по всему коду программы и менять все эти числа, у вас код маленький, а представльте, если в нем тысяча строк.... или 10 тысяч...., велика вероятность где то забыть и будут неверные результаты, а потом лазий и ищи. По этой же причине середина массива у меня не число, а вычисляемая величина, достаточно изменить длинну массива и она сама вычислиться и станет правильной и не надо ползать по программе и искать.
Отсуда же следует некий подводный камень, допустим у вас 2 цикла
for i:=5 to 9
for i:=2 to 9
Первый работает с массивом а, второй с b, возможно так, что вы возьмете и машинально измените в обоих случаях 9 на 12, например.А по заданию вас попросили поменять длинну лиш массива а, опять таки у вас появитсья ошибка.А зачастую, когда код более сложный, просто так с ходу не сообразиш за что отвечают те или иные цифры, а вот если записать
for i:=5 to n
for i:=2 to m
Сразу видно что величины никак не зависят друг от друга.
Во-вторых, когда через какое то время возвращается к коду ооочень сложно понять, что это за магические цифры в циклах функциях и тд. А если есть переменные, с более менее вменяемыми названиями,то намного проще понять что происходит. Это повышает читаемость вашего кода другими людьми, да и вами самими по прошествии времени, в учебном процессе это мало актуально, а вот дальше весьма помогает.


нам же нужно упорядочить по убыванию модулей обратных значений?
.почему мы не пишем 1/a[i]?
Krjuger
Возможно потому что в тот момент, когда я читал, у меня слово "обратные" ассоциировалось не с 1/x, а с -x.Но от этого кординально ничег оне меняется.

for j:=1 to N-1 do
for i:=p to N-j do
if (a[i]>0 and (abs(1/a[i])<abs(1/a[i+1])) then
swap(a[i],a[i+1]);


Как бы я сразу сказал, что само условие нечетко понял, поэтому, если что, поправьте.
Allise1
Цитата(Krjuger @ 18.11.2012 23:30) *

Возможно потому что в тот момент, когда я читал, у меня слово "обратные" ассоциировалось не с 1/x, а с -x.Но от этого кординально ничег оне меняется.

for j:=1 to N-1 do
for i:=p to N-j do
if (a[i]>0 and (abs(1/a[i])<abs(1/a[i+1])) then
swap(a[i],a[i+1]);


Как бы я сразу сказал, что само условие нечетко понял, поэтому, если что, поправьте.


не могли бы вы объяснить, для чего мы вводим? procedure swap(var x,y: integer);
var t: integer;
begin
t := x;
x := y;
y := t
end;
Krjuger
Swap меняет местами для числа, девушка, ну хоть такие глупые вопросы не задавайте, ведь из самой процедуры все видно. Я не верю, что подобные вещи нельзя понять самому, нужно только подумать головой немного.
Гость
Цитата(Krjuger @ 18.11.2012 23:36) *

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


а как будет выглядеть блок схема не подскажете?
Krjuger
Не подскажу, на форуме не доступны средства,чтобы ее нарисовать. Сделайте хоть что-нибудь сами.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.