Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 21.10.2012, 10:49   #1 (permalink)
Alise7
Новичок
 
Регистрация: 21.10.2012
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Дан массив размера N

Дан массив размера N.найти максимальный из его элементов не являющийся ни локальным максимумом, ни локальным минимумом.
кто-нибудь может помочь?
Alise7 вне форума   Ответить с цитированием

Старый 21.10.2012, 10:49
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Вы не один, кто обращался за помощью с такой проблемой

У кого какого размера HDD
Изменения размера фотографий

Старый 21.10.2012, 10:56   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Alise7 Посмотреть сообщение
кто-нибудь может помочь?
Помочь - да. Писать эту учебную ерунду за Вас - нет. Выложите свои наработки, если таковые имеются - поможем, подскажем, исправим.
Vladimir_S вне форума   Ответить с цитированием
Старый 21.10.2012, 11:12   #3 (permalink)
Alise7
Новичок
 
Регистрация: 21.10.2012
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Помочь - да. Писать эту учебную ерунду за Вас - нет. Выложите свои наработки, если таковые имеются - поможем, подскажем, исправим.
имеются, но с паскалем сталкиваюсь впервые, поэтому большие трудности
вот
var
a: array [1..100] of integer;
i, j, k: integer;
n: integer;

begin
randomize;
writeln('Введите N: ');
readln(n);
for i := 1 to n do a[i] := random(101) - 25;
writeln('Исходный массив: ');
for i := 1 to n do write(a[i], ' ');
writeln;
for i := 2 to n - 1 do
if ((a[i] > a[i + 1]) and ((a[i] > a[i - 1]))) or ((a[i] < a[i + 1]) and ((a[i] < a[i - 1])))
then inc(k) else inc(j);
writeln('Полученное количество: ');
if j > 0 then writeln(j) else writeln(0);
end.
Alise7 вне форума   Ответить с цитированием
Старый 21.10.2012, 15:00   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Alise7 Посмотреть сообщение
имеются, но с паскалем сталкиваюсь впервые, поэтому большие трудности вот
Ну вот, совсем другое дело и совершенно другое отношение.
По выложенной программе. Написана в целом правильно и грамотно, но, увы, решает она совсем другую задачу, а именно, определяет количество локальных максимумов и минимумов в массиве, а Вам нужно найти максимальный элемент, НЕ являющийся таковым экстремумом. Решение этой задачи дано ниже, и вот несколько пояснений:
1. Прошу извинить за английский язык: возня с кириллицей для меня - заморочки. Если надо, исправьте.
2. Перестановка действий в строке, задающей элементы массива, связана с тем, что некоторые (не моя!) версии Паскаля не могут справится с ситуацией, когда из беззнакового целого вычитается бОльшая величина. Они приписывают ожидаемому результату тоже беззнаковый целый формат, а, получив отрицательное число, начинают верещать об ошибке. Сталкивался с таким. Такая вот тонкость.
3. Выводить элементы массива лучше с указанием формата, тогда, если там несколько строк, то они всегда расположатся один под другим. Просто красивее.
4. Начальное значение искомого максимума (max) задается любым, МЕНЬШИМ минимального значения элементов массива (у Вас это -25), числом. Вместо -80 можно взять -40, -1046, -513 и т.п.
5. Если Ваш Паскаль не проглотит конструкцию вида
not(bla-bla-bla),
то замените ее на
(not bla-bla-bla), где bla-bla-bla - какое-то булевское выражение. Тоже бывают закидоны разных версий Паскаля.
6. В конце программы, предполагающей вывод результата на экран, очень желательно поставить оператор readln без параметров. Тогда, дойдя до него, программа остановится и позволит полученный результат рассмотреть до нажатия клавиши "Enter". А иначе просто моргнет да и вылетит в Турбо-среду или папку, откуда Вы ее запускали.
Ну, вроде, всё.
Код:
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.
Vladimir_S вне форума   Ответить с цитированием
Старый 25.10.2012, 18:18   #5 (permalink)
Alise7
Новичок
 
Регистрация: 21.10.2012
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Ну вот, совсем другое дело и совершенно другое отношение.

спасибо большое, Владимир!

uses crt;
const size = 10;
Var
El, MaxEl, iMax, jMax, i, j : integer;
lMax, lMin, mtr : Array[1..size,1..size] of integer;
Begin
ClrScr;
Randomize;
{формируем матрицу случайным образом}
For i:=1 to size do
For j:=1 to size do
begin
mtr[i,j]:=100+ random(300);
lMax[i,j]:=0; lMin[i,j]:=0;
end;
{сначала найдем все локальные минимумы и максимумы}
For i:=1 to size do
For j:=1 to size do
begin
El:=mtr[i,j];
If i=1 then {верхняя строка}
begin
If j=1 then
begin
If (El<mtr[i ,j+1]) and
(El<mtr[i+1,j+1]) and
(El<mtr[i+1,j ]) then lMin[i,j]:=1; {пометим локальный минимум}
If (El>mtr[i ,j+1]) and
(El>mtr[i+1,j+1]) and
(El>mtr[i+1,j ]) then lMax[i,j]:=1; {пометим локальный максимум}
end
Else
If j=size then
begin
If (El<mtr[i ,j-1]) and
(El<mtr[i+1,j-1]) and
(El<mtr[i+1,j ]) then lMin[i,j]:=1;
If (El>mtr[i ,j-1]) and
(El>mtr[i+1,j-1]) and
(El>mtr[i+1,j ]) then lMax[i,j]:=1;
end
Else {неугловые элементы верхней строки}
begin
If (El<mtr[i ,j-1]) and
(El<mtr[i+1,j-1]) and
(El<mtr[i+1,j ]) and
(El<mtr[i+1,j+1]) and
(El<mtr[i ,j+1]) then lMin[i,j]:=1;
If (El>mtr[i ,j-1]) and
(El>mtr[i+1,j-1]) and
(El>mtr[i+1,j ]) and
(El>mtr[i+1,j+1]) and
(El>mtr[i ,j+1]) then lMax[i,j]:=1;
end
end
{========================}
Else
If i=size then {нижняя строка}
begin
If j=1 then
begin
If (El<mtr[i-1,j ]) and
(El<mtr[i-1,j+1]) and
(El<mtr[i ,j+1]) then lMin[i,j]:=1;
If (El>mtr[i-1,j ]) and
(El>mtr[i-1,j+1]) and
(El>mtr[i ,j+1]) then lMax[i,j]:=1;
end
Else
If j=size then
begin
If (El<mtr[i ,j-1]) and
(El<mtr[i-1,j-1]) and
(El<mtr[i-1,j ]) then lMin[i,j]:=1;
If (El>mtr[i ,j-1]) and
(El>mtr[i-1,j-1]) and
(El>mtr[i-1,j ]) then lMax[i,j]:=1;
end
Else {неугловые элементы нижней строки}
begin
If (El<mtr[i ,j-1]) and
(El<mtr[i-1,j-1]) and
(El<mtr[i-1,j ]) and
(El<mtr[i-1,j+1]) and
(El<mtr[i ,j+1]) then lMin[i,j]:=1;
If (El>mtr[i ,j-1]) and
(El>mtr[i-1,j-1]) and
(El>mtr[i-1,j ]) and
(El>mtr[i-1,j+1]) and
(El>mtr[i ,j+1]) then lMax[i,j]:=1;
end
end
Else
If j=1 then {левый столбец}
begin
If (El<mtr[i-1,j ]) and
(El<mtr[i-1,j+1]) and
(El<mtr[i ,j+1]) and
(El<mtr[i+1,j+1]) and
(El<mtr[i+1,j ]) then lMin[i,j]:=1;
If (El>mtr[i-1,j ]) and
(El>mtr[i-1,j+1]) and
(El>mtr[i ,j+1]) and
(El>mtr[i+1,j+1]) and
(El>mtr[i+1,j ]) then lMax[i,j]:=1;
end
Else
If j=size then {правый столбец}
begin
If (El<mtr[i-1,j ]) and
(El<mtr[i-1,j-1]) and
(El<mtr[i ,j-1]) and
(El<mtr[i+1,j-1]) and
(El<mtr[i+1,j ]) then lMin[i,j]:=1;
If (El>mtr[i-1,j ]) and
(El>mtr[i-1,j-1]) and
(El>mtr[i ,j-1]) and
(El>mtr[i+1,j-1]) and
(El>mtr[i+1,j ]) then lMax[i,j]:=1;
end
Else
begin
If (El<mtr[i-1,j ]) and {1}
(El<mtr[i-1,j-1]) and {2}
(El<mtr[i ,j-1]) and {3}
(El<mtr[i+1,j-1]) and {4}
(El<mtr[i+1,j ]) and {5}
(El<mtr[i+1,j+1]) and {6}
(El<mtr[i ,j+1]) and {7}
(El<mtr[i-1,j+1]) {8}
then lMin[i,j]:=1;

If (El>mtr[i-1,j ]) and {1}
(El>mtr[i-1,j-1]) and {2}
(El>mtr[i ,j-1]) and {3}
(El>mtr[i+1,j-1]) and {4}
(El>mtr[i+1,j ]) and {5}
(El>mtr[i+1,j+1]) and {6}
(El>mtr[i ,j+1]) and {7}
(El>mtr[i-1,j+1]) {8}
then lMax[i,j]:=1;

end;
end;
{ищем максимальный элемент,
не являющийся ни локальным максимумом, ни локальным минимумом}
MaxEl:=-32768;
iMax:=0; jMax:=0;
For i:=1 to size do
For j:=1 to size do
If (lMax[i,j]=0) and (lMin[i,j]=0) then
If MaxEl<mtr[i,j] then
begin
MaxEl:=mtr[i,j];
iMax:=i; jMax:=j;
end;
{выводим результат на экран}
For i:=1 to size do
Begin
For j:=1 to size do
begin
If lMax[i,j]=1 then TextColor(Red) {красные - локальные максимумы}
Else
If lMin[i,j]=1 then TextColor(Blue) {синие - локальные минимумы}
Else
If MaxEl=mtr[i,j] then TextColor(Green) {зеленый - искомый максимум}
Else TextColor(DarkGray);
Write(mtr[i,j]:4);
end;
WriteLn;
end;
ReadLn;
End. вот такой вариант еще предлагали, получается он не верен?
Alise7 вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 25.10.2012, 20:12   #6 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Alise7 Посмотреть сообщение
вот такой вариант еще предлагали, получается он не верен?
Прежде всего, определитесь, с каким массивом нужно работать - одномерным или двумерным (матрицей)? Тогда и будем двигаться дальше.
Vladimir_S вне форума   Ответить с цитированием
Старый 25.10.2012, 21:36   #7 (permalink)
Alise7
Новичок
 
Регистрация: 21.10.2012
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

массив одномерный, еще нужно упорядочить положительные эелементы второ
Alise7 вне форума   Ответить с цитированием
Старый 25.10.2012, 21:38   #8 (permalink)
Alise7
Новичок
 
Регистрация: 21.10.2012
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

массив одномерный, еще нужно упорядочить положительные элементы второй половины массива по убыванию модулей обратных значений?это совсем меня запутало(
Alise7 вне форума   Ответить с цитированием
Старый 26.10.2012, 10:06   #9 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Alise7 Посмотреть сообщение
массив одномерный,
Тогда выложенный в #5 листинг к задаче отношения не имеет: там идет обработка матрицы, а не вектора.
Цитата:
Сообщение от Alise7 Посмотреть сообщение
еще нужно упорядочить положительные элементы второй половины массива по убыванию модулей обратных значений?
Знаете что - хватит выдавать "в день по чайной ложке". Выложите задание в том виде, в котором оно Вам дано - тогда и будем разбираться. А то, боюсь, дальше последует очередное "а еще надо...".
Цитата:
Сообщение от Alise7 Посмотреть сообщение
это совсем меня запутало(
А уж о нас-то что говорить...
Vladimir_S вне форума   Ответить с цитированием
Старый 26.10.2012, 10:53   #10 (permalink)
Alise7
Новичок
 
Регистрация: 21.10.2012
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Дан массив размера N.
Найти максимальный из его элементов, не являющихся ни локальным максимумом, ни локальным минимумом(локальный минимум-это элемент, который меньше любого из своих соседей).Если таких элементов в массиве нет, вывести об этом сообщение.
упорядочить положительные элементы второй половины массива по убыванию модулей обратных значений.
для отладки программы числа последовательности сформировать с помощью генератора случайных чисел.
вот это оригинал задания.Извините, что сразу не выложила его(
Alise7 вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 17:10.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.