1 2 3 4 5 6 7 8 9 10 11 12 13 |
from random import randint #импорт функции randint из модуля random a = [randint(0,10) for i in range(10)] #выражение списка, где вызываем ф-цию randint "in range(10)", то есть 10 раз print(a)#вывод a a = [-1] + a + [-1]#добавим с двух сторон списка -1, #чтобы при сравнении соседей крайних элементов не вышло путаницы с индексами, #например мы хотим получить соседей 3 элемента в a=[1,2,3],i=2 набираем #a[i+1] и a[i-1], в итоге получим ошибку из-за того, что обратились к a[3], это выходит за границы списка, #то же и с первым эл-том, если набрать a[i-1] при i=0, ошибки не будет, но вернется -1 элемент, то есть последний, что также нежелательно for i in range(-2,-(len(a)),-1): #цикл по range от -2 до -длины списка, с шагом -1, то есть -2,-3,...,-(len(a)) if a[i-1]<a[i]>a[i+1]: #условие: (a[i] больше соседей) == True print((len(a)-2)+(i+1)) #если условие == True, вывести индекс, его получаем через длину -2, потому что два эл-та добавляли с концов, #и i+1, потому что при сравнении мы обращались к элементам с конца, а с конца счет идет от -1 а не от 0 как если бы мы перебирали с начала списка break #прерывание цикла |
Array33. Дан массив размера $$N$$. Найти номер его последнего локального максимума (локальный максимум — это элемент, который больше любого из своих соседей).
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <stdio.h> int main(void) { int a[10]; int n; printf(“N: “); scanf(“%i”,&n); int i; for (i=0; i<n; ++i){ printf(“a[%i] : “,i+1); scanf(“%i”,&a[i]); } if (a[n–1]>a[n–2]){ printf(“%i n”,n); } else { i = n–2; while ((i>=1) && !((a[i-1]<a[i]) &&(a[i]>a[i+1]))) { –i; } printf(“%i n”,i+1); } return 0; } |
Другие задачи из раздела Array можно посмотреть здесь.
dmitrylogvinov, Вы в корне неправильно подходите к обучению. Вам нужно больше времени проводить с учебником и изучать стандартные библиотеки (и в первую очередь – встроенные функции, обращая особое внимание на их параметры), а не пытаться решать задачи “в лоб”, раз за разом городя конструкции в стиле Delphi из базового синтаксиса, примерно одинакового для каждого языка. “Батарейки” в Python присутствуют как раз для того, чтобы не изобретать велосипеды.
Задача решается просто и элегантно:
from itertools import count
def lastmax(*sequence):
return max(zip(sequence, count()))
assert lastmax(1, 2, 3) == (3, 2)
assert lastmax(1, 2, 1, 2, 1) == (2, 3)
assert lastmax(1, 2, 3, 4, 5) == (5, 4)
assert lastmax(1, 1, 1, 1, 1) == (1, 4)
Те же самое, но без itertools:
def lastmax(*sequence):
return max(zip(sequence, range(len(sequence))))
Ещё вариант:
from operator import itemgetter
def lastmax(*sequence):
return max(enumerate(sequence), key=itemgetter(1, 0))[::-1]
И ещё:
def lastmax(*sequence):
return max({v: i for i, v in enumerate(sequence)}.items())
Есть и ещё несколько более эзотерических вариантов – например, через heapq.
Приветствуем читателей нашего сайта! Сегодня мы с вами решим задачи Array30-36.
Задачи Array30-36
Array30. Дан массив размера N. Найти номера тех элементов массива, которые больше своего правого соседа, и количество таких элементов. Найденные номера выводить в порядке их возрастания.
program array30; var A: array[1..10] of integer; N, k, i: integer; begin write('Введите N: '); readln(N); write('Введите элементы массива: '); for i := 1 to N do read(A[i]); k := 0; for i := 1 to N - 1 do if A[i] > A[i + 1] then begin inc(k); write(i, ' ') end; writeln; write(k); end.
Array31. Дан массив размера N. Найти номера тех элементов массива, которые больше своего левого соседа, и количество таких элементов. Найденные номера выводить в порядке их убывания.
program array31; var A: array[1..10] of integer; N, k, i: integer; begin write('Введите N: '); readln(N); write('Введите элементы массива: '); for i := 1 to N do read(A[i]); k := 0; for i := 2 to N do if A[i] > A[i - 1] then begin inc(k); write(i, ' ') end; writeln; write(k); end.
Array32°. Дан массив размера N. Найти номер его первого локального минимума (локальный минимум — это элемент, который меньше любого из своих соседей).
program array32; var A: array[1..10] of integer; N, i: integer; begin write('Введите N: '); readln(N); write('Введите элементы массива: '); for i := 1 to N do read(A[i]); for i := 2 to N - 1 do if (A[i] < A[i - 1]) and (A[i] < A[i + 1]) then begin write(i, ' '); exit; {завершает программу} end; writeln(0); {если минимума нет} end.
Array33. Дан массив размера N. Найти номер его последнего локального максимума (локальный максимум — это элемент, который больше любого из своих соседей).
program array33; var A: array[1..10] of integer; N, i: integer; begin write('Введите N: '); readln(N); write('Введите элементы массива: '); for i := 1 to N do read(A[i]); for i := N - 1 downto 2 do if (A[i] > A[i - 1]) and (A[i] > A[i + 1]) then begin write(i, ' '); exit; end; writeln(0); {если максимума нет} end.
Array34. Дан массив размера N. Найти максимальный из его локальных минимумов (определение локального минимума дано в задании Array32).
program array32; var A: array[1..10] of integer; N, max, i: integer; begin write('Введите N: '); readln(N); write('Введите элементы массива: '); for i := 1 to N do read(A[i]); max := -MaxInt; for i := 2 to N - 1 do if (A[i] < A[i - 1]) and (A[i] < A[i + 1]) then if A[i] > max then max := A[i]; writeln(max); end.
Array35. Дан массив размера N. Найти минимальный из его локальных максимумов (определение локального максимума дано в задании Array33).
program array35; var A: array[1..10] of integer; N, min, i: integer; begin write('Введите N: '); readln(N); write('Введите элементы массива: '); for i := 1 to N do read(A[i]); min := MaxInt; for i := N - 1 downto 2 do if (A[i] > A[i - 1]) and (A[i] > A[i + 1]) then if A[i] < min then min := A[i]; writeln(min); end.
Array36. Дан массив размера N. Найти максимальный из его элементов, не являющихся ни локальным минимумом, ни локальным максимумом (определения локального минимума и локального максимума даны в заданиях Array32 и Array33). Если таких элементов в массиве нет, то вывести 0 (как вещественное число).
program array36; var A: array[1..10] of integer; N, max, i: integer; begin write('Введите N: '); readln(N); write('Введите элементы массива: '); for i := 1 to N do read(A[i]); max := -MaxInt; for i := 2 to N-1 do if 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 if A[i] > max then max := A[i]; {проверяем те элементы, которые не были проверены в цикле} if a[1] > max then max := a[1]; if a[N] > max then max := a[N]; writeln(max); end.
На сегодня всё! Если у вас возникли вопросы, задавайте их в комментариях. И не забывайте рассказывать о нашем сайте своим друзьям!
Рассмотрим
процесс поиска максимума и его номера
на приведенном выше примере:
-
Начало
0
> – 4-5
< 09
> 09
92
<
9Результат
Amax
-4
0
0
9
9
9
9
Kmax
1
2
2
4
4
4
4
Сначала
считаем максимальным элементом первый.
Затем,
просматривая поочередно все
остальные
элементы массива, сравниваем каждый из
них с текущим значением максимума (с
Amax).
Если
текущий элемент больше Amax,
то заменяем значение Amax
на значение текущего элемента, а значение
Kmax
– на его номер.
10.
Алгоритм
(блок-схема)
Основной
алгоритм (Абстракция А0) Раскрываем
абстракцию A0.1
11.
Программный код.
Написать
самостоятельно, используя цикл for
и ветвление if
внутри него.
Подсказки
в файле spkmmu.doc
и Coding.doc,
а также A0_440.doc
Замечание
1.
При решении данной задачи можно обойтись
без переменной Amax.
При этом для сравнения с текущим элементом
и при выводе результата указать на
значение максимального элемента можно
по его индексу в массиве: a[Kmax].
Замечание
2.
В вашей задаче может быть экстремального
значения не просто самого элемента, а
заданного арифметического
выражения.
Тогда за начальное значение Amax
берется значение первого выражения (а
не просто элемента) и вводится
дополнительная переменная (Zmax,
например) для хранения текущего значения
выражения, чтобы затем сравнить его с
Amax.
Замечание
3.
Для поиска минимума
заменяем знак при сравнении текущего
и экстремального значения с “>”
на “<“. Желательно также сменить
и названия переменных на Amin,
Kmin,
Zmin
для улучшения читабельности кода.
Замечание
4.
В массиве элементы могут совпадать,
и поэтому при поиске номера требуется
уточнение: найти номер первого
(последнего)
максимума (минимума), что и было сделано
в уточненной постановке рассмотренной
задачи. Например, в массиве a
= (1, 9, 2, 3, 9, 7) Amax
=
9, Kmax
=
2 при поиске первого
максимума и Kmax
=
5 при поиске последнего
элемента с максимальным значением. Если
при поиске первого
для проверки используется знак > (<);
то при поиске
последнего:
он заменяется на >= (<=); или, не меняя
знака, элементы массива можно перебирать
с конца («последний с начала» = «первый
с конца»), тогда за начальное значение
Amax
берется значение последнего
элемента и используется цикл с
уменьшающимся параметром (for
i:=
n-1
downto
1 do)
Рис.
Раскрытие абстракции A0.1
для поиска максимума в матрице
Замечание
5.
Метод поиска экстремума Bmax
в матрице
b(nm)
из n
строк и m
столбцов и двух(!) его индексов imax,
jmax
аналогичен, но надо учесть, что все
элементы матрицы перебираются с помощью
двух вложенных один в другой циклов:
один – по строкам, другой – по столбцам
(элементам строки), и что начинаем оба
цикла с первого элемента (i
= 1, j
= 1), а не со второго, иначе потеряется
целый столбец или строка:
Рис.
Потеря
строки или столбца ри поиске не с первого
элемента
Замечание
6.
Если экстремальные элементы надо найти
для всех (каждой в отдельности) строк
или столбцов матрицы, то результатом
будет не простая
переменная
Amax,
а одномерный
массив
из n
или m
элементов соответственно.
Задание
1 для выполнения на занятии:
В заданном одномерном массиве X
из m
элементов найти номер и значение
элемента, для которого минимально
значение произведения Xi∙sin(Xi).
Только блок-схему алгоритма. Если в
массиве окажется несколько элементов
с минимальным значением, найти номер
последнего
из них двумя способами: при обходе
массива от начала к концу и при обходе
с конца в начало.
Задание
2 для выполнения на занятии:
переделать готовую блок-схемы из
предыдущего задания для аналогичного
поиска в матрице при обходе ее слева
направо сверху вниз.
Соседние файлы в папке 5. Sort
- #
- #
31.03.201525 б12input.txt
- #
31.03.201568 б11output.txt
- #
31.03.2015376 б10Sort.cfg
- #
31.03.20151.86 Кб9Sort.dof
- #
31.03.20152.44 Кб9Sort.dpr