Задачи на исправление ошибок в программах - Программирование

Информатика: Новый полный справочник для подготовки к ЕГЭ - 2018 год

Задачи на исправление ошибок в программах - Программирование

Конспект

Конструкция ветвления в языке Паскаль

Полная

Неполная

Если блоки команд состоят только из одного оператора каждый, то использовать операторные скобки begin ... end не обязательно:

Полная

Неполная

Конструкции циклов в языке Паскаль

Цикл с предусловием:

Цикл с постусловием:

image371

Цикл со счётчиком:

Цикл с шагом 1

Цикл с шагом —1

Операторы досрочного завершения цикла

Оператор языка Паскаль

Описание

continue

Оператор продолжения — выполнение данного оператора прекращает текущее выполнение тела цикла и передает управление на проверку условия цикла

break

Оператор прерывания — выполнение данного оператора прекращает выполнение цикла и передает управление на следующий оператор после цикла

Разбор типовых задач

Задача 1. На обработку поступает последовательность из четырёх неотрицательных целых чисел (некоторые числа могут быть одинаковыми). Нужно написать программу, которая выводит на экран количество нечётных чисел в исходной последовательности и максимальное нечётное число. Если нечётных чисел нет, требуется на экран вывести “NO”. Известно, что вводимые числа не превышают 1000. Программист написал программу неправильно.

image372

Последовательно выполните следующее.

1. Напишите, что выведет эта программа при вводе последовательности: 2 9 4 3.

2. Приведите пример такой последовательности, содержащей хотя бы одно нечётное число, что, несмотря на ошибки, программа печатает правильный ответ.

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

1) выпишите строку, в которой сделана ошибка;

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

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

Решение

1) Начинаем с общего анализа алгоритма, помня, что в нем возможны отдельные ошибки. (Что делает программа, описано в условии, но умение анализа алгоритма требуется нам как для поиска ошибок в нем, так и потому, что в последующих вариантах ЕГЭ назначение программы в условии может быть не указано — в качестве дополнительного усложнения задания.)

• В начале программы инициализируются (получают начальные значения) две переменных — count (обнуляется) и maximum (приравнивается 999). Уже из названия этих переменных можно предположить, что count — это счётчик чего-либо, а переменная maximum предназначена для определения максимального значения.

• Далее следует цикл с параметром, выполняемый 4 раза (константное значение п задается равным 4):

— считывается очередное значение х,

— проверяется его нечётность (неравенство нулю остатка при делении на 2): если х нечётно, то счётчик увеличивается на 1, а конструкция

— это хорошо знакомый приём определения максимума,

— случай чётного х не обрабатывается (ветвь else отсутствует), проход цикла завершается;

• после цикла проверяется счётчик, если он больше нуля, то выводятся значения count и maximum, иначе выводится сообщение “NO”.

Итак, назначение и общие принципы работы программы ясны. Принимая на входе последовательность чисел, она должна определять максимальное значение среди нечётных таких чисел и одновременно подсчитывать количество нечётных чисел.

2) Сразу же можно понять скрытые в тексте программы ошибки (тем самым отвечая на третий вопрос в задании).

Первая ошибка — в определении максимума:

В типовом алгоритме поиска максимума (и аналогично для минимума) если текущее значение последовательности больше предполагаемого максимума, то предполагаемому максимуму присваивается это большее него текущее значение. То есть х. А здесь переменной maximum присваивается значение i.

Строка с ошибкой: maximum : = i

Правильная строка: maximum : = х

Согласно условию, в качестве ошибочной можно указать только одну строку. Поэтому оператор if х > maximum then (формально правильный) в запись ответа не входит.

Вторая ошибка — в начальном присваивании переменной maximum значения 999. В качестве исходного значения предполагаемого максимума нужно брать число, меньшее самого меньшего возможного числа в последовательности или в массиве. В условии указано, что числа вводимой последовательности — неотрицательные, значит, в качестве изначального предполагаемого максимума можно взять число 0 или любое отрицательное значение.

Строка с ошибкой: maximum := 999;

Правильная строка: maximum : = 0 ;

3) Что программа выведет при вводе последовательности 2 9 4 3?

Программа, несмотря на ошибки, верно выполняет подсчет количества нечётных чисел (в строках с переменной count ошибок нет). Поэтому значение count (первое выводимое на экран число) определится верно и будет равно 2 (так как в последовательности — два нечётных числа).

Что же касается поиска максимума, нетрудно догадаться: из-за того, что первоначально переменной maximum присвоено значение, заведомо большее любого из введённых чисел, условие х > maximum никогда не будет истинным. Так что значение maximum так и останется равным 999 и будет выведено на экран вторым числом.

Теперь мы можем дать ответ на первый вопрос задания. При вводе последовательности чисел 2 9 4 3 программа выведет два числа: 2 и 999.

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

Так как строки с переменной count не содержат ошибок, количество нечётных чисел определяется верно. Следовательно, в вводимой последовательности может быть любое количество нечётных значений. Возможно даже, что все числа последовательности — чётные, например: 2 4 6 8. В этом случае count окажется равно нулю, программа выдаст ответ “NO”, а ошибки в определении максимума будут просто “обойдены”.

Если же в введённой последовательности есть хотя бы одно нечётное число, то нужно “подогнать” эту последовательность так, чтобы выводимое значение maximum, равное 999, было правильным. Очевидно, это возможно, если в последовательности действительно будет иметься хотя бы одно число (нечётное!), которое равно 999, и причём это число действительно будет максимальным среди прочих нечётных значений. А значит, правильными будут, например, следующие последовательности:

2 4 6 999 (единственное нечётное число равно 999),

2000 4444 88888 999 (хотя остальные числа превышают 999, они — чётные, поэтому в определении максимума среди нечётных чисел не участвуют),

1 3 5 999 (999 — максимальное значение среди всех нечётных),

999 999 999 999 (все числа равны 999, следовательно, и максимум тоже равен 999).

Любой такой ответ (равно как и последовательность только из чётных чисел) — правилен.

В качестве ответа на второй вопрос задания можно записать любую последовательность, в которой максимальное нечётное значение равно 999, либо в которой нет ни одного нечётного значения.

Ответ:

1) При вводе последовательности 2 9 4 3 программа выведет два числа: 2 и 999.

2) Программа выдает правильный результат, например, при вводе последовательности 1 2 3 999.

3) Ошибки в программе и их исправление (по порядку следования строк в программе):

Строка с ошибкой: maximum := 999;

Правильная строка: maximum : = 0 ;

Строка с ошибкой: maximum : = i

Правильная строка: maximum : = х

В подобных заданиях важно не только указать все имеющиеся ошибки, но и не указать в качестве “ошибочной” правильную строку.

Как правило, в таких задачах под ошибками понимаются существенные искажения алгоритма, приводящие к тому, что программа не выполняет заявленное для неё предназначение. Искомыми ошибками не являются:

• использование оператора write или read вместо writeln или readln соответственно и прочие необязательные элементы функционала программы, связанные с выводом ответа на экран (кроме, например, указания в операторе вывода не той переменной, которая нужна);

• отсутствие точки с запятой в конце оператора и т.д.

Задача 2. Требовалось написать программу, при выполнении которой с клавиатуры считывается положительное целое число N, не превосходящее 109, и определяется сумма цифр этого числа. Программист торопился и написал программу неправильно.

image373

Последовательно выполните следующее.

1. Напишите, что выведет эта программа при вводе числа 256.

2. Приведите пример такого трёхзначного числа, при вводе которого программа выдаёт правильный результат.

3. Найдите все ошибки в этой программе (их может быть одна или несколько). Для каждой ошибки:

1) выпишите строку, в которой сделана ошибка;

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

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

Решение

1) Анализируем алгоритм.

• Вводится число N.

• Инициализируется переменная sum, в которой будет накапливаться искомая сумма (ей присваивается значение 1).

• Цикл выполняется, пока значение N остается больше нуля:

— оператор d : = N mod 10; — в переменную d заносится последняя цифра числа N,

— оператор N : = N div 10; — отбрасывание последней цифры числа,

— оператор sum : = d; — записывает в переменную sum очередную цифру числа;

• После выполнения цикла значение sum выводится на экран.

2) Очевидна первая ошибка: значение суммы цифр должно накапливаться в переменной sum, т.е. соответствующий оператор должен иметь вид:

sum := sum + d;, а не sum := d;.

Строка с ошибкой: sum := d;

Правильная строка: sum := sum + d;

Вторая ошибка тоже понятна: при инициализации переменной, в которой накапливается сумма, эту переменную нужно обнулять (единица — это инициализационное значение для произведения).

Строка с ошибкой: sum : = 1 ;

Правильная строка: sum : = 0 ;

3) При вводе числа 256 программа разобьёт его на отдельные цифры: 6, 5 и 2. Поскольку на каждом проходе цикла в переменную sum записывается очередная цифра, после выполнения цикла значение sum будет равно последней обработанной цифре. Цифры отделяются и обрабатываются по порядку справа налево, поэтому sum после выполнения цикла будет равно 2, это число и будет выведено на экран.

4) Выданный программой результат будет правильным, если последняя обработанная цифра числа будет в точности равна сумме цифр этого числа. Следовательно, все остальные цифры (кроме самой первой в числе) должны быть нулевыми. Количество же цифр в числе может быть любым. Например, это могут быть числа: 2, 30, 4000 и т.д. Однако поскольку значение sum изначально инициализируется неверно (этой переменной присваивается значение 1 вместо 0) вводимое число не может быть нулём (в этом случае программа выведет неправильный ответ 1 вместо правильного 0).

Ответ:

1) При вводе числа 256 программа выведет число 2.

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

3) Ошибки в программе и их исправление (по порядку следования строк в программе):

Строка с ошибкой: sum : = 1 ;

Правильная строка: sum : = 0;

Строка с ошибкой: sum := d;

Правильная строка: sum := sum + d;






Для любых предложений по сайту: [email protected]