Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
22
Добавлен:
19.05.2015
Размер:
248.32 Кб
Скачать

© К. Поляков, 2009-2012

C2(высокий уровень, время – 30 мин)

Тема: Обработка массива (написать программу из 10-15 строк на языке программирования или алгоритм на естественном языке).

Что нужно знать:

  • массив– это набор однотипных элементов, имеющих общее имя и расположенных в памяти рядом

  • для обращения к элементу массива используют квадратные скобки, запись A[i]обозначает элемент массиваAс номером (индексом)i

  • для обработки всех элементов массива используется цикл вида1

for i:=1 to N do begin

{ что-то делаем с элементом A[i] }

end;

переменная iобозначает номер текущего элемента массива, она меняется от 1 до N с шагом 1, то есть мы «проходим» последовательно все элементы

  • матрица(двухмерный массив) – это прямоугольная таблица однотипных элементов

  • если матрица имеет имя A, то обращениеA[i,k]обозначает элемент, расположенный на пересечении строкиiи столбцаk

k

i

A[i,k]

  • каждая строка матрицы – это обычный (одномерный, линейный) массив; для того, чтобы обработать строку iв матрице изMстолбцов, нужно использовать цикл, в котором меняется номер столбцаk:

for k:=1 to M do begin

{ что-то делаем с элементом A[i,k] }

end;

  • каждый столбец матрицы – это обычный (одномерный, линейный) массив; для того, чтобы обработать столбец kв матрице изNстрок, нужно использовать цикл, в котором изменяется номер строкиi:

for i:=1 to N do begin

{ что-то делаем с элементом A[i,k] }

end;

Пример задания:

Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от 0 до 1000. Опишите на русском языке или на одном из языков программирования алгоритм, позволяющий найти и вывести минимальное значение среди элементов массива, которые имеют чётное значение и не делятся на три. Гарантируется, что в исходном массиве есть хотя бы один элемент, значение которого чётно и не кратно трем.

Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но использовать все описанные переменные не обязательно.

Естественный язык:

Объявляем массив A из 20 элементов.

Объявляем целочисленные переменные I, J, MIN.

В цикле от 1 до 20 вводим элементы массива A с 1-го по 20-й.

Паскаль:

const N=20;

Var a: array [1..N] of integer;

I, j, min: integer;

begin

for i:=1 to N do

readln(a[i]);

end.

Решение:

  1. даже если вы хорошо владеете программированием, сначала лучше (прежде всего, для себя) написать алгоритм на русском языке

  2. здесь требуется найти минимальный элемент из всех, которые имеют чётное значение и не делятся на 3

  3. делимость одного целого числа на другое проверяется с помощью операции взятия остатка (в Паскале – операция mod): первое число делится на второе, если остаток от деления равен 0

  4. тогда условие, определяющее отбор нужных элементов, запишется в виде

(a[i] mod 2 = 0) and (a[i] mod 3 <> 0)

  1. стандартный цикл поиска минимального элемента, удовлетворяющего условию, выглядит так:

for i:=1 to N do

if <условие верно> and (a[i] < min) then

min := a[i];

  1. остается один вопрос: каким должно быть начальное значение переменной min? его нужно выбрать таким, чтобы для первого же «подходящего» элемента выполнилось условиеa[i] < min, и это «временное» начальное значение было бы заменено на реальное

  2. к счастью, диапазон входных чисел ограничен (от 0 до 1000), поэтому можно выбрать любое значение, больше 1000, например, 1001 или 99992

  3. таким образом, решение задачи на естественном языке выглядит так:

Записываем в переменную min значение 1001. Затем в цикле просматриваем все элементы массива, с первого до последнего. Если остаток от деления очередного элемента на 2 равен 0 и остаток от его деления на 3 не равен нулю и значение элемента меньше, чем значение переменной min, записать в переменную min значение рассматриваемого элемента массива. Затем переходим к следующему элементу. После окончания работы цикла выводим значение переменной min.

  1. аналогичное решение на Паскале:

min:=1001;

for i:=1 to N do

if (a[i] mod 2=0) and (a[i] mod 3<>0) and (a[i]<min) then

min:=a[i];

writeln(min);

Возможные проблемы:

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

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

  • просмотрите внимательно диапазон, в котором находятся исходные числа; дело в том, что во многих языках, например, в Паскале и в Си, остаток от деления отрицательного числа на положительное – число отрицательное, например (-7) mod 3 = -1, поэтому определять, например, нечётность элемента массива с помощью условия a[i] mod 3 = 1 нельзя (не будет работать для отрицательных чисел), нужно использовать условие a[i] mod 3 <> 0

Соседние файлы в папке ЕГЗ_2012_Поляков_май