Меню
Видеоучебник
Видеоучебник  /  Информатика  /  10 класс  /  Информатика 10 класс (ФГОС)  /  Типовые задачи обработки массивов: заполнение массивов, поиск максимального и минимального элемента

Типовые задачи обработки массивов: заполнение массивов, поиск максимального и минимального элемента

Урок 31. Информатика 10 класс (ФГОС)

В этом уроке учащиеся продолжат рассматривать массивы и начнут изучение алгоритмов, которые наиболее часто используются для их обработки: различные варианты заполнения массивов и поиск максимального и минимального элемента в них. Будет рассмотрен принцип работы этих алгоритмов, а также их программирование на языкеPascal.

Конспект урока "Типовые задачи обработки массивов: заполнение массивов, поиск максимального и минимального элемента"

Вопросы:

·     Заполнение массивов.

·     Поиск максимального и минимального элементов в массиве.

Часто при решении некоторых задач, массив требуется заполнить некоторыми значениями, например, случайными числами. Вспомним, как можно сгенерировать случайное число. Для этого в языке Pascal есть 2 функции. Функция random без параметров, возвращает вещественное случайное число на промежутке [0; 1). Функция random с целочисленным параметром a, возвращает случайное целое число на промежутке от нуля до a - 1.

При помощи обеих функций можно получить случайное число на некотором промежутке [a; b). Если нам нужно вещественное число на указанном промежутке, то мы используем первую функцию, после чего умножим результат на ba. Таким образом, мы получим случайное вещественное число на промежутке [0, b-a). К полученному числу остаётся прибавить a и мы получим случайное число на указанном промежутке.

random () * (b – a) + a

Случайное вещественное число на промежутке [a; b)

Если же нам нужно целое число на указанном промежутке - мы используем вторую функцию, сгенерировав целое случайное число на промежутке [0, b-a). После чего нам останется лишь просуммировать полученное число и a.

random (b – a) + a

Случайное целое число на промежутке [a; b)

Задача:

Написать программу, которая:

1.  Заполняет массив из n элементов случайными целыми числами на промежутке [-50; 50).

2. Выводит заполненный массив на экран.

Напишем программу для решения задачи. Назовём её test. Для работы программы нам потребуется массив a из 100 элементов. Элементы массива будут целыми числами на промежутке [-50; 50), поэтому объявим их принадлежащими к целочисленному типу shortint. А также переменные: n для хранения размерности массива, i – индекс текущего элемента. Обе они будут принимать целочисленные положительные значения не больше ста, поэтому объявим их принадлежащими к целочисленному типу byte.

Напишем логические скобки. Тело программы будет начинаться с оператора writeln, который будет выводить на экран сообщение о том, что это программа, заполняющая массив из n элементов случайными числами. Дальше напишем оператор write, выводящий запрос на ввод n, и оператор readln, считывающий его значение. Теперь напишем цикл для заполнения массива случайными числами. Это будет цикл с параметром i, изменяющимся от 1 до n. Он будет содержать команду присваивания i-тому элементу массива А значения равного случайному числу на указанном промежутке. Для того чтобы сгенерировать случайное число на промежутке [-50; 50) нужно записать разность случайного числа на промежутке [0; 100), которое сгенерируем функцией random (100), и числа 50. Таким образом, мы заполнили первые n элементов массива a случайными числами в указанном промежутке, теперь выведем его на экран. Сначала запишем оператор write, выводящий сообщение о том, что это получившийся массив и двоеточие. Теперь запишем цикл для вывода элементов массива. Это будет цикл for i:=1 to n do. Он будет содержать оператор write, который будет выводить на экран символ пробела и значение i-того элемента массива a.

program test;

var

 a: array [1..100] of shortint;

 n, i: byte;

begin

 writeln ('Программа, заполняющая массив из n элементов случайными числами.');

 write ('n=');

 readln (n);

 for i:=1 to n do

  a[i]:=random (100)-50;

 write ('Получившийся массив:');

 for i:=1 to n do

  write (' ', a[i]);

end.

Исходный код программы

Запустим программу на выполнение и зададим n = 7. Программа действительно вывела семь элементов массива со значениями на промежутке [-50; 50).

Программа работает правильно. Задача решена.

Изменим написанную программу, чтобы массив заполнялся случайными вещественными числами на указанном промежутке. Для этого, прежде всего, изменим тип элементов массива на тип single. После этого изменим цикл заполнения массива, i-тому элементу массива будем присваивать значение разности произведения случайного числа до единицы, которое генерируется функцией random () и числа 100, а также числа 50. После этого изменим оператор вывода i-того элемента массива. Сделаем так, чтобы в нём выводилось 2 знака после запятой.

program test;

var

 a: array [1..100] of single;

 n, i: byte;

begin

 writeln ('Программа, заполняющая массив из n элементов случайными числами.');

 write ('n=');

 readln (n);

 for i:=1 to n do

  a[i]:=random*100-50;

 write ('Получившийся массив:');

 for i:=1 to n do

  write (' ', a[i]:0:2);

end.

Изменённый код программы

Снова запустим программу на выполнение и введём n = 5. Программа действительно вывела 5 вещественных элементов массива со значениями на указанном промежутке.

Программа работает правильно.

Часто встречаются задачи, в которых необходимо каким-то образом заполнить двумерный массив. Рассмотрим одну из них.

Задача: Заполнить квадратную матрицу из символов размерностью 10×10 элементов таким образом, чтобы выше главной диагонали располагались символы x, на главной диагонали – символы y, а ниже главной диагонали – символы z. Вывести заполненную матрицу на экран.

Главной диагональю квадратной матрицы называется линия, которую можно провести от первого элемента первой строки к последнему элементу последней строки. Таким образом, на главной диагонали располагаются элементы матрицы, выделенные красным цветом. Выше главной диагонали располагаются элементы синего цвета, а ниже главной диагонали – элементы зелёного цвета. При решении задачи важно понимать, что в индексах элементов массива, находящихся на главной диагонали, номер строки, назовём его i, равен номеру столбца, назовём его j. В элементах, находящихся выше главной диагонали, i < j, в элементах находящихся ниже главной диагонали – напротив i < j.

Напишем программу для решения задачи. Назовём её matrica. Для работы программы объявим двумерный массив a, размерностью 10 на 10 элементов символьного типа char. Так же, нам понадобятся переменные i и j, в которых будем перебирать индексы элементов массива. Они будут принимать значения на промежутке от 1 до 10, поэтому объявим их, принадлежащими к целочисленному типу byte.

Запишем логические скобки. Тело программы будет начинаться с цикла for i:=1 to 10 do, который будет перебирать номера строк массива. В нём будет вложенный цикл for j:=1 to 10 do, который будет перебирать номера столбцов массива. Внутри цикла запишем условный оператор, который будет проверять, находится ли элемент массива на главной диагонали. Его условием будет i = j. После слова then в этом условном операторе будет следовать оператор присваивания элементу массива с индексом i, j символа y. После слова else будет следовать ещё один условный оператор, который будет проверять находится ли элемент массива выше главной диагонали. Его условием будет i < j. После слова then в нём будет следовать оператор присваивания элементу a[i, j] символа x. Если условие в этом операторе не будет выполняться, значит элемент находится ниже главной диагонали, поэтому после слова else запишем оператор присваивания текущему элементу массива символа z.

Теперь запишем цикл для вывода элементов массива. Это будет цикл for i:=1 to 10 do. В этом цикле в логических скобках будет записан такой же цикл, но с параметром j. Он будет содержать оператор write, который будет выводить на экран элемент a[i, j]. После внутреннего цикла будет следовать оператор writeln без параметров, для перехода на следующую строку.

program matrica;

var

 a: array [1..10, 1..10] of char;

 i, j: byte;

begin

 for i:=1 to 10 do

  for j:=1 to 10 do

   if i=j

   then a[i, j]:='y'

   else if i<j

    then a[i, j]:='x'

    else a[i, j]:='z';

 for i:=1 to 10 do

 begin

  for j:=1 to 10 do

   write (a[i, j]);

  writeln ();

 end;

end.

Исходный код программы

Запустим программу на выполнение. Программа действительно вывела на экран описанную матрицу символов.

Программа работает правильно. Задача решена.

Задача: В заданном одномерном массиве из n целых чисел найти элемент с наибольшим значением и вывести его номер на экран. Если таких элементов несколько – вывести номер первого из них.

Для решения этой задачи мы будем проверять, элементы массива от первого к последнему. Сначала мы предположим, что элемент с наибольшим значением первый и запомним его номер. После этого, мы будем сравнивать с ним элементы массива начиная со второго, пока элементы массива не закончатся. Если мы найдём элемент массива больший, чем предполагаемый, то предположим, что он наибольший, запомним его номер и будем сравнивать его с оставшимися элементами. Перебрав все элементы массива, мы докажем, что предполагаемый элемент действительно наибольший.

Напишем программу для решения задачи. Назовём её max. Для работы программы нам потребуется массив, назовём его a. Укажем, что он будет состоять из 100 элементов типа integer. Также нам потребуется ещё несколько переменных: размерность массива – n, номер текущего элемента – i и номер наибольшего элемента – m. Объявим их принадлежащими к целочисленному типу byte. Запишем логические скобки. Тело программы будет начинаться с оператора writeln, который будет выводить на экран сообщение от том, что это программа поиска в массиве наибольшего из элементов. Дальше будет следовать оператор write, выводящий на экран запрос на ввод n, а также оператор readln, считывающий его значение. Теперь запишем цикл для ввода элементов массива. Это будет цикл с параметром i, изменяющимся от 1 до n. В логических скобках запишем тело цикла. Оно будет содержать оператор write, выводящий на экран запрос на ввод i-того элемента массива, и оператор readln, считывающий его значение. Теперь будем искать максимальный элемент массива. Предположим, что максимальным является первый элемент массива, поэтому присвоим переменной m значение 1. Дальше запишем цикл для перебора последующих элементов массива. Это будет цикл for i:=2 to n do. Он будет содержать условный оператор, который будет проверять больше ли текущий элемент массива предполагаемого. Его условием будет то, что i-тый элемент массива больше элемента массива с индексом m. Если это условие выполняется, то текущий элемент массива больше предполагаемого, поэтому мы должны предположить, что он наибольший. Для этого после слова then в этом условном операторе, напишем оператор присваивания m:=i. По окончании работы цикла переменная m будет содержать номер максимального элемента массива. Напишем оператор write, который будет выводить на экран сообщение о том, что первым из наибольших является элемент массива с номером m.

program max;

var

 a: array [1..100] of integer;

 n, i, m: byte;

begin

 writeln ('Программа поиска в массиве из n элементов наибольшего.');

 write ('n=');

 readln (n);

 for i:=1 to n do

 begin

  write ('a[', i, ']=');

  readln (a[i]);

 end;

 m:=1;

 for i:=2 to n do

  if a[i]>a[m]

  then m:=i;

 write ('Первым из наибольших является элемент с номером ', m);

end.

Исходный код программы

Запустим программу на выполнение. Зададим массив из 5 элементов, равных соответственно: 8, 14, 9, 17, 2. Программа вывела сообщение о том, что массива первый из наибольших элемент с номером 4.

Ещё раз запустим программу. Зададим массив из 4 элементов, равных соответственно: 3, 11, 9, 11. Программа вывела сообщение о том, что второй элемент массива первый из наибольших.

Программа работает правильно. Задача решена.

Изменим нашу программу, так чтобы она искала первый из наименьших элементов массива. Для этого в первом операторе вывода изменим слово «наибольшего» на «наименьшего». В условии условного оператора, в последнем цикле программы, изменим знак «больше» на противоположный. В последнем операторе вывода в сообщении изменим третье слово на слово «наименьших».

program max;

var

 a: array [1..100] of integer;

 n, i, m: byte;

begin

 writeln ('Программа поиска в массиве из n элементов наименьшего.');

 write ('n=');

 readln (n);

 for i:=1 to n do

 begin

  write ('a[', i, ']=');

  readln (a[i]);

 end;

 m:=1;

 for i:=2 to n do

  if a[i]<a[m]

  then m:=i;

 write ('Первым из наименьших является элемент с номером ', m);

end.

Исходный код программы

Снова запустим программу на выполнение и зададим массив из 4 элементов равных соответственно: 8, 3, 1, 5. Программа вывела сообщение о том, что третий элемент массива первый из минимальных.

 

Программа работает правильно.

3543

Комментарии 0

Чтобы добавить комментарий зарегистрируйтесь или на сайт