Writeln('Нет таких элементов')
⇐ ПредыдущаяСтр 2 из 2 else writeln(i); Это второй вариант решения задачи. 14) Сложность в том, что нужно найти не максимальный элемент, а второй по величине. Можно, конечно, сначала найти максимум, а потом искать следующий за ним, но можно сделать это за один проход по массиву. Нам нужны две переменные, max (максимальный элемент) и max2 (второй максимум). Сначала выбираем максимальный из первых двух элементов и записываем его значение в max, а второй по величине записываем в max2: if a[1] > a[2] then begin max:=a[1]; max2:=a[2]; End Else begin max:=a[2]; max2:=a[1]; end; Затем в цикле перебираем все элементы, начиная с 3-го (первые два уже «задействованы»!) до последнего, 30-ого. Если очередной элемент a[i] больше, чем max, записываем значение max в max2 (предыдущий максимум становится вторым), а значение a[i] – в max. Иначе, если a[i] больше, чем max2, записываем значение a[i] в max2. После завершения цикла выводим значение переменной max2. Вот решение на Паскале: const N=30; var a: array [1..N] of integer; i, k, max, max2: integer; Begin for i:=1 to N do readln(a[i]); if a[1] > a[2] then begin max:=a[1]; max2:=a[2]; End Else begin max:=a[2]; max2:=a[1]; end; for i:=3 to N do if a[i] > max then begin max2:= max; max:= a[i]; End else if a[i] > max2 then max2:= a[i]; writeln(max2); End. 15) Очевидно, что нужно считать найденные положительные элементы (например, с помощью переменной k) и, когда k станет равно 3, запомнить номер текущего элемента (в переменной j). Решение на естественном языке. Записываем в переменную k начальное значение 0. Затем в цикле перебираем все элементы массива с 1-ого по 30-ый. Если очередной элемент больше нуля, увеличиваем счетчик k. Если k=3, записываем номер текущего элемента в переменную j. Если после окончания цикла k<3, выводим сообщение, что в массиве меньше трех положительных элементов, иначе выводим значение переменной j.
Решение на Паскале. const N=30; var a: array [1..N] of integer; i, j, k: integer; Begin for i:=1 to N do readln(a[i]); k:=0; for i:=1 to N do if a[i] > 0 then begin k:=k+1; if k = 3 then j:= i; end; if k < 3 then Writeln('Меньше трех положительных элементов') else writeln(j); End.
16) Обратим внимание, что нужно найти не длину, а сумму наибольшей (то есть, самой длинной!) возрастающей последовательности (то есть, такой, в которой каждый следующий элемент строго больше предыдущего). В переменных l и s будем хранить длину и сумму текущей (рассматриваемой сейчас) последовательности, а в переменных lmax и smax – значения для наибольшей последовательности. Решение на естественном языке. Записываем в переменную lmax начальное значение 0, в переменную l – значение 1, а в переменную smax – значение первого элемента массива. В цикле рассматриваем все элементы массива, начиная со 2-ого до Решение на Паскале. const N=30; var a: array [1..N] of integer; i, l, lmax, s, smax: integer; Begin for i:=1 to N do readln(a[i]); lmax:=0; l:=1; s:=a[1]; for i:=2 to N do begin if a[i] > a[i-1] then begin l:=l+1; s:=s+a[i]; End Else begin l:=1; s:=a[i]; end; if l > lmax then begin lmax:=l; smax:=s; end; end; writeln(smax); End.
17) Сначала нужно найти (в переменной s) среднее арифметическое всех элементов массива – считаем в цикле их сумму и делим на N. Затем перебираем во втором цикле все элементы массива и ищем тот, для которого модуль разности этого элемента и среднего арифметического наименьший. Решение на естественном языке. Записываем в переменную s начальное значение 0. В цикле для всех элементов с 1-го до 30-го добавляем значение текущего элемента к переменной s. После окончания цикла делим значение переменной s на N, таким образом, получаем в переменной s среднее арифметическое всех элементов массива. Записываем в переменную k начальное значение 1. В цикле рассматриваем все элементы со 2-ого до 30-ого, если модуль разности текущего элемента и переменной s меньше, чем модуль аналогичной разности для k -ого элемента, записываем в переменную k номер текущего элемента. После окончания цикла выводим значение переменной k.
Решение на Паскале. const N=30; var a: array [1..N] of integer; i, k: integer; s, min: real; Begin for i:=1 to N do readln(a[i]); s:=0; for i:=1 to N do s:=s+a[i]; s:=s/N; k:=1; for i:=2 to N do if abs(a[i]-s) < abs(a[k]-s) then k:=i; writeln(k); End. 18) Очевидно, что нужно вывести номера минимального элемента массива и «второго» минимума. Поэтому эта задача решается аналогично задаче 14 (меняем названия переменных и знаки > на знаки <, храним в переменных min и min2 не значения, а номера элементов): const N=30; var a: array [1..N] of integer; i, k, min, min2: integer; Begin for i:=1 to N do readln(a[i]); if a[1] < a[2] then begin min:= 1; min2:= 2; End Else begin min:= 2; min2:= 1; end; for i:=3 to N do if a[i] < a[min] then begin min2:= min; min:= i; End else if a[i] < a[min2] then min2:= i; writeln(min, ' ', min2); End. 19) В этой задаче нужно перебрать все пары различных элементов. Для этого нужен двойной (вложенный) цикл. Чтобы не сравнивать элемент сам с собой, будем рассматривать только пары (a[i],a[j]), где j>i. Поэтому во внешнем цикле переменная i меняется от 1 до N-1 (до предпоследнего), а во внутреннем – переменная j меняется от i+1 до N (до конца массива): for i:=1 to N-1 do for j:=i+1 to N do ... Решение на естественном языке. Сначала считаем, что нужная пара – это первые два элемента. Записываем в переменные min и min2 значения 1 и 2 соответственно, а в переменную s – модуль их разности. Организуем вложенный цикл. Во внешнем цикле перебираем значения переменной i от 1 до N-1. Во внутреннем цикле перебираем значения переменной j от i+1 до N. В теле цикла: если модуль разности a[i]-a[j] оказывается меньше значения переменной s, записываем в переменную s этот модуль разности, а в переменные min и min2 значения переменных i и j соответственно. После окончания двойного цикла выводим значения переменных min и min2. Решение на Паскале. const N=30; var a: array [1..N] of integer; i, j, min, min2, s: integer; Begin
for i:=1 to N do readln(a[i]); min:=1; min2:=2; s:=abs(a[1]-a[2]); for i:=1 to N-1 do for j:=i+1 to N do if abs(a[i]-a[j]) < s then begin s:=abs(a[i]-a[j]); min:=i; min2:=j; end; writeln(min, min2); End.
20) Среднее арифметическое – это сумма всех нужных элементов, деленная на их количество. Если значение в десятичной системе оканчивается на 5, это значит, что остаток от его деления на 10 (основание системы счисления) равен 5. Кроме того, есть еще один тонкий момент: при вычислении на компьютере остатка от деления отрицательных чисел (например, с помощью оператора mod в Паскале) этот остаток получается отрицательным [2], например -25 mod 10 = -5. Нам нужно использовать две переменных: счетчик найденных элементов и сумму; обе переменные сначала необходимо обнулить. Затем надо пройти в цикле весь массив, и если очередной элемент при делении на 10 дает остаток 5 или –5, увеличить счетчик на 1, а сумму – на значение этого элемента. Затем считаем среднее как отношение суммы к количеству. Поскольку сказано, что хотя бы один такой элемент есть, можно не опасаться деления на ноль. Решение на естественном языке. Записываем в переменные x и y нулевые значения. В цикле перебираем значения переменной i от 1 до N. Если очередной элемент при делении на 10 дает в остатке 5 или –5, увеличиваем счетчик x на 1 и сумму y – на значение этого элемента. После окончания цикла записываем в переменную s результат деления y на x. Выводим значение переменной s. Решение на Паскале. При проверке остатка можно использовать сложное условие: if (a[i] mod 10 = 5) or (a[i] mod 10 = -5) then begin... end; или перед применением операции mod взять модуль очередного элемента массива: if abs(a[i]) mod 10 = 5 then begin... end; Один из вариантов решения: const N=30; var a: array [1..N] of integer; i, x, y: integer; s: real; Begin for i:=1 to N do readln(a[i]); x:=0; y:=0; for i:=1 to N do if abs(a[i]) mod 10 = 5 then begin x:= x + 1; y:= y + a[i]; end; s:= y / x; writeln(s); End. Варианты задачи. Если требуется определить среднее арифметическое четных или нечетных элементов, нужно проверять делимость на 2, а не на 10. Если остаток от деления на 2 равен 0, то число четное. 21) Это вариант предыдущей задачи, меняется только условие отбора. Для нечетных элементов остаток от деления на 2 равен 1, поэтому условие выглядит так:
if a[i] mod 2 = 1 then begin... Решение на естественном языке. Записываем в переменные x и y нулевые значения. В цикле перебираем значения переменной i от 1 до N. Если очередной элемент при делении на 2 дает в остатке 1, увеличиваем счетчик x на 1 и сумму y – на значение этого элемента. После окончания цикла записываем в переменную s результат деления y на x. Выводим значение переменной s. Решение на Паскале. const N=30; var a: array [1..N] of integer; i, x, y: integer; s: real; Begin for i:=1 to N do readln(a[i]); x:=0; y:=0; for i:=1 to N do if a[i] mod 2 = 1 then begin x:= x + 1; y:= y + a[i]; end; s:= y / x; writeln(s); End. 22) Это вариант задачи, разобранной на с. 3 а файле C3.doc. Однако нужно учитывать, что счетчики в самом начале и при обнаружении неотрицательного элемента нужно устанавливать в 0. Решение на естественном языке. Записываем в переменные k и kMax нулевые значения. В цикле перебираем значения переменной i от 1 до N. Если очередной элемент массива A[i] отрицательный, увеличиваем счетчик k, который обозначает длину текущей последовательности отрицательных элементов. Если очередной элемент массива A[i] неотрицательный, записываем в счетчик k ноль. Если k>kMax, записываем в kMax значение k. После окончания цикла выводим значение переменной kMax. Решение на Паскале. const N =30; var A: array[1..N] of integer; i, k, kMax: integer; Begin for i:=1 to N do readln(A[i]); { ввод массива } k:= 0; kMax:= 0; for i:=1 to N do begin { проходим весь массив } if A[i] < 0 then { цепочка продолжается } k:= k + 1 else k:= 0; { цепочка закончилась } if k > kMax then kMax:= k; end; writeln(kMax); End. 23) Фактически нужно найти максимум среди всех отрицательных элементов. Здесь есть тонкость – что записать в переменную max? Очевидно, что нельзя записать первый элемент массива (как это делается в классическом алгоритме поиска максимума), потому что он может не быть отрицательным. Выход – записать большое по модулю отрицательное число, которого заведомо нет в массиве, например, -100. При этом первый же отрицательный элемент окажется больше этого числа и начальное значение max будет заменено. Если значение -100 в переменной max останется после просмотра массива, то это будет означать, что отрицательных элементов нет. Решение на естественном языке. Записываем в переменную max начальное значение -100. В цикле перебираем значения переменной i от 1 до N. Если очередной элемент массива A[i] отрицательный и больше max, записываем в max значение этого элемента. После окончания цикла выводим значение переменной max.
Решение на Паскале. const N=30; var A: array [1..N] of integer; i, max: integer; Begin for i:=1 to N do readln(A[i]); max:=-100; { любое число <= -20 } for i:=1 to N do if (A[i] < 0) and (A[i] > max) then max:=A[i]; writeln(max); End.
24) Среднее арифметическое – это сумма элементов, деленная на их количество. Главная диагональ квадратной матрицы A размера N на N – это элементы, у которых индексы строки и столбца совпадают: A[1,1], A[2,2], A[3,3],..., A[N,N] Главная ловушка таких задач: кажется, что если используется матрица, то в решении будет двойной цикл. Например, некоторые считают сумму элементов главной диагонали так:
В самом деле, в этом цикле каждый элемент главной диагонали добавляется в сумму N раз. Для того, чтобы понять ошибку, можно посмотреть на то, как расположены нужные нам элементы в матрице – они «вытянуты» в одну линию. В то же время, вложенный цикл предназначен для обработки областей (например, прямоугольных или треугольных). Второй цикл здесь не нужен, вот правильное решение: S:=0; for i:=1 to N do S:=S+A[i,i]; Далее все просто: делим сумму на N (количество элементов главной диагонали) и получаем среднее арифметическое. Решение на естественном языке. Записываем в переменную S начальное значение 0. В цикле перебираем значения переменной i от 1 до N. На каждом шаге цикла добавляем к сумме S значение очередного элемента главной диагонали матрицы A[i,i]. После окончания цикла выводим значение S/N. Решение на Паскале. const N=5; var A: array [1..N,1..N] of integer; i, S: integer; Begin { ввод матрицы A } S:=0; for i:=1 to N do S:=S+A[i,i]; writeln(S/N); End.
25) Эта задача похожа на задачу 23. Здесь нужно найти минимальное из трехзначных чисел, то есть из таких, которые удовлетворяют условию (100 <= A[i]) and (A[i] < 1000) В переменную min вначале мы должны записать начальное значение, которое заведомо больше любого трехзначного числа в массиве, например, 1000. Если это значение останется в переменной min после проверки всего массива, это значит, что в массиве нет трехзначных чисел. Решение на естественном языке. Записываем в переменную min начальное значение 1000. В цикле перебираем значения переменной i от 1 до N. Если очередной элемент массива – трехзначное число (больше или равно 100 и меньше 1000) и меньше, чем значение переменной min, записываем значение этого элемента в min. После окончания цикла проверяем значение min: если оно равно 1000, выводим на экран сообщение «Нет таких элементов», иначе выводим значение min. Решение на Паскале. const N=30; var A: array [1..N] of integer; i, min: integer; Begin for i:=1 to N do readln(A[i]); min:=1000; for i:=1 to N do if (100 <= A[i]) and (A[i] < 1000) and (A[i] < min) then min:= A[i]; if min = 1000 then
Воспользуйтесь поиском по сайту: ![]() ©2015 - 2025 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|