Категория C1 • задача №3

 
 
 

Условие задачи

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

const
    N = 10;
var
    a : array[1..N] of integer;
    i, min, k : integer;
begin
    writeln('Введите элементы массива');
    for i := 1 to N do
        readln(a[i]);
    min := a[1];
    for i := 2 to N do
        if(a[i] <= min) then
        begin
            k := i;
            min := a[i];
        end;
    writeln(k);
end.

 

Найти:
последовательно выполните следующее:

  1. приведите пример таких исходных данных, при которых программа работает неправильно;

  2. укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы.

 

 

Решение

I этап: алгоритмическая часть

Рассмотрим решение данной задачи графико-аналитическим способом. Рассмотрим одномерный целочисленный массив, состоящий из 10 элементов. Элементы данного массива принимают произвольные значения из диапазона [1 ... 10]:

38853104559значение
12345678910индекс

Нашей целью является определение минимального значения среди всех элементов данного массива. Очевидно, что самым наименьшим значением среди всех значений элементов массива является значение равное три. Причем, значение три имеют сразу два элемента (то есть получается массив содержит два минимальных элемента). Но в условии задачи сказано, что необходимо детерминировать номер первого минимального, следовательно, нас интересует элемент, позиционирующийся в позиции с номером один:

38853104559значение
12345678910индекс

Промежуточный вывод: первый минимальный элемент находится в элементе с индексом один.

 

II этап: детально исследуем каждую строку заданного фрагмента программы

{раздел объявления константных величин}
const
{отвечает за количество элементов массива}
    N = 10;
{раздел декларации переменных}
var
{одномерный целочисленный массив, состоящий из десяти элементов}
    a : array[1..N] of integer;
{  i - счетчик цикла
 min - отвечает за минимальное значение среди всех элементов массива
   k - отвечает за номер минимального элемента}

    i, min, k : integer;
{начало главного блока программы}
begin
{диалог пользователю о предстоящем заполнении массива целыми числами}
    writeln('Введите элементы массива');
{в цикле запрашиваем информацию от пользователя}
    for i := 1 to N do
{с клавиатуры считывается целое число и записывается в соответствующий элемент массива}
        readln(a[i]);
{отталкиваемся от предположения, что минимальным элементом является самый первый элемент массива}
    min := a[1];
{циклически просматриваем элементы массива со второго элемента до последнего}
    for i := 2 to N do
{если значение текущего элемента массива меньше или равно самому минимальному значению среди проверенных элементов массива, то}
        if(a[i] <= min) then
{запоминаем номер текущего элемента и значение текущего элемента}
        begin
            k := i;
            min := a[i];
        end;
{выпечатываем на экран номер первого наименьшего элемента массива}
    writeln(k);
{конец тела главного блока программы}
end.

Очевидны становятся ошибки, допущенные разработчиком данной программы:

  1. в условной конструкции находится следующая проверка

if(a[i] <= min) then

и в случае, когда массив имеет следующий вид:

A = {8, 3, 9, 6, 3, 6, 5, 10, 10, 10}

то программа выведет номер последнего минимального элемента (число пять), а не первого (число два). Причиной тому является "нестрогое неравенство". Для исправления данной неточности достаточно изменить условие с "нестрогого" на "строгое", то есть, переписать условную конструкцию следующим образом:

if(a[i] < min) then

  1. если рассмотреть массив следующего вида:

A = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

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

if(a[i] <= min) then

и переменная k не получит никакого значения. Но возникает вопрос, почему будет ноль, если переменная k не инициализируется никаким значением? Ответ прост - по умолчанию, все целочисленные переменные инициализируются в языке программирования Pascal нулями. Для исправления данной неточности достаточно переменной k задать начальное значение равное один.

 

III этап: доработка исходной программы, используя язык программирования Pascal 7.0.

{раздел объявления константных величин}
const
{отвечает за количество элементов массива}
    N = 10;
{раздел декларации переменных}
var
{одномерный целочисленный массив, состоящий из десяти элементов}
    a : array[1..N] of integer;
{  i - счетчик цикла
 min - отвечает за минимальное значение среди всех элементов массива
   k - отвечает за номер минимального элемента}

    i, min, k : integer;
{начало главного блока программы}
begin
{диалог пользователю о предстоящем заполнении массива целыми числами}
    writeln('Введите элементы массива');
{в цикле запрашиваем информацию от пользователя}
    for i := 1 to N do
{с клавиатуры считывается целое число и записывается в соответствующий элемент массива}
        readln(a[i]);
{отталкиваемся от предположения, что минимальным элементом является самый первый элемент массива}
    min := a[1];
    k := 1;
{циклически просматриваем элементы массива со второго элемента до последнего}
    for i := 2 to N do
{если значение текущего элемента массива меньше самого минимального значения среди проверенных элементов массива, то}
        if(a[i] < min) then
{запоминаем номер текущего элемента и значение текущего элемента}
        begin
            k := i;
            min := a[i];
        end;
{выпечатываем на экран номер первого наименьшего элемента массива}
    writeln(k);
{конец тела главного блока программы}
end.

 
 
Рейтинг:
 
Проголосовало: 1
Количество просмотров: 1687
 
 
 

Категория C1 • задача №3

 

Комментарии

Для комментирования или зарегистрируйтесь
 

Остальные решения из билета №3 для подготовки к ЕГЭ по информатике 2013

 
Условие задачи
(наведите курсор мыши на ссылку)
Аудиовизуальное
решение
Мультимедийная
видеопрезентация
Решение в формате
слайд-шоу
Текстовое
решение
 
© 2011-2024 ООО "СтадиМен". Все права сохранены.
Перепечатка и использование материалов с данного сайта, разрешена только по согласию с владельцем.
Владелец оставляет за собой право воспользоваться 146 статьей УК РФ при нарушении авторских и смежных прав.
 
 
 
 
Авторизация на сайте
 
 
 
Обнаружили
ошибку на сайте?