кто-нибудь может помочь?очень нужно! Дан массив размера N. Найти максимальный из его элементов, не являющихся ни локальным максимумом, ни локальным минимумом(локальный минимум-это элемент, который меньше любого из своих соседей).Если таких элементов в массиве нет, вывести об этом сообщение. упорядочить положительные элементы второй половины массива по убыванию модулей обратных значений. для отладки программы числа последовательности сформировать с помощью генератора случайных чисел.
Krjuger
9.11.2012 15:50
Помочь можем, но именно помочь, а не сделать за вас! Покажите свои идеи и наработки,тогда, если что неверно, поправим и доведем до ума.
Гость
10.11.2012 21:37
Цитата(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
11.11.2012 4:21
Цитата
нужна сортировка массива, чтоб сравнить соседние элементы и при выполнении условия поменять их местами
Можно воспользоваться любой сортировкой, просто чуть изменить условие.Ладно щас придумаем. Вроде сортировка пузырьком.
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
13.11.2012 23:28
Цитата(Гость @ 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
14.11.2012 0: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;
Вот и все.
Allise1
14.11.2012 2:41
Цитата(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
14.11.2012 3:17
max:=d[1]; for i:=2 to k do if (max<d[i]) then mas:=d[i];
При условии, что к не меньше 2 иначе бессмысленно искать максимум.
Allise1
14.11.2012 23:02
Цитата(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
14.11.2012 23:22
Господи, вы там что то у себя исправили, теперь массив d у вас правильно заполняется, сразу же после того, как он окончательно заполнился, вы ищите максимум, что тут сложного.
Allise1
15.11.2012 1:11
Цитата(Krjuger @ 14.11.2012 20:22)
Господи, вы там что то у себя исправили, теперь массив d у вас правильно заполняется, сразу же после того, как он окончательно заполнился, вы ищите максимум, что тут сложного.
все поняла и сделала)спасибо!
Krjuger
15.11.2012 2:20
Находит, вы его просто не выводите на экран........
А вообще, когда проверяете программу, пользуйтесь дебагом, там можно построчно смотреть все значения всех интересующих вас переменных.
Allise1
15.11.2012 2:34
Цитата(Krjuger @ 14.11.2012 23:20)
Находит, вы его просто не выводите на экран........
А вообще, когда проверяете программу, пользуйтесь дебагом, там можно построчно смотреть все значения всех интересующих вас переменных.
а можете объяснить, как вторую часть делали?с сортировкой которая
Krjuger
15.11.2012 2:44
Взял написал обычную сортировку пузырьком, в интернете про них много написано. Давайте так, вы говорите в какой строке и что непонятно, и я обьясняю. Если не понятен сам принцып, то в гугле вбейте "сортировка пузырьком", потому что полностью писать принцып я не хочу.
Allise1
15.11.2012 3:17
Цитата(Krjuger @ 14.11.2012 23:44)
Взял написал обычную сортировку пузырьком, в интернете про них много написано. Давайте так, вы говорите в какой строке и что непонятно, и я обьясняю. Если не понятен сам принцып, то в гугле вбейте "сортировка пузырьком", потому что полностью писать принцып я не хочу.
метод мне понятен.почему вы используете оператор div? не нужно использовать swap?
Krjuger
15.11.2012 3:21
Потому что вы писали
Цитата
элементы второй половины массива
Операция 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]);
Операция div возвращает частное от деления, я поделил длинну массива пополам, чтобы узнать с какого места сортировать.
мы же задаем const N:=10 нельзя написать for i:=5 to n-1 ?
Krjuger
15.11.2012 22: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 Сразу видно что величины никак не зависят друг от друга. Во-вторых, когда через какое то время возвращается к коду ооочень сложно понять, что это за магические цифры в циклах функциях и тд. А если есть переменные, с более менее вменяемыми названиями,то намного проще понять что происходит. Это повышает читаемость вашего кода другими людьми, да и вами самими по прошествии времени, в учебном процессе это мало актуально, а вот дальше весьма помогает.
Allise1
18.11.2012 19:47
Цитата(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
19.11.2012 2: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]);
Как бы я сразу сказал, что само условие нечетко понял, поэтому, если что, поправьте.
Allise1
19.11.2012 2:40
Цитата(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
19.11.2012 3:36
Swap меняет местами для числа, девушка, ну хоть такие глупые вопросы не задавайте, ведь из самой процедуры все видно. Я не верю, что подобные вещи нельзя понять самому, нужно только подумать головой немного.
Гость
23.11.2012 23:41
Цитата(Krjuger @ 18.11.2012 23:36)
Swap меняет местами для числа, девушка, ну хоть такие глупые вопросы не задавайте, ведь из самой процедуры все видно. Я не верю, что подобные вещи нельзя понять самому, нужно только подумать головой немного.
а как будет выглядеть блок схема не подскажете?
Krjuger
24.11.2012 20:27
Не подскажу, на форуме не доступны средства,чтобы ее нарисовать. Сделайте хоть что-нибудь сами.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.