Исправьте ошибки в программе запишите ее с отступами каждый оператор в отдельной строке
Для того, чтобы найти ошибку, нужно поставить в соответствие друг другу все части условного оператора if и else.
Помним, что часть else относится к ближайшему if. При этом наличие части else не обязательно.
Кроме того, часто присутствует ошибка при вводе или выводе. Обязательно нужно проверить, та ли информация выводится на экран.
Особого внимания требует инициализация переменных.
Формат книги не позволяет рассмотреть все основные типы задач 2 части, рассмотрим лишь те, которые встречались на проверочных и экзаменационных работах последних двух лет.
На обработку поступает положительное целое число, не превышающее 10 9 . Нужно написать программу, которая выводит на экран сумму цифр этого числа, меньших 7. Если в числе нет цифр, меньших 7, требуется на экран вывести 0. Программист написал программу неправильно. Ниже эта программа для Вашего удобства приведена на пяти языках программирования.
Бейсик
Python
INPUT N
WHILE N > 0
DIGIT = N MOD 10
IF DIGIT < 7 THEN
END IF
WEND
Паскаль
Алгоритмический язык
begin
readln(N);
while N > 0 do
begin
digit := N mod 10;
if digit < 7 then
N := N div 10;
end;
writeln(digit)
нач
цел N, digit, sum
ввод N
нц пока N > 0
если digit < 7 то
все
кц
вывод digit
Си
int main()
int N, digit, sum;
while (N > 0)
if (digit < 7)
Последовательно выполните следующее.
1. Напишите, что выведет эта программа при вводе числа 456.
2. Приведите пример такого трёхзначного числа, при вводе которого программа выдаёт верный ответ.
3. Найдите все ошибки в этой программе (их может быть одна или несколько). Известно, что каждая ошибка затрагивает только одну строку и может быть исправлена без изменения других строк. Для каждой ошибки:
1) выпишите строку, в которой сделана ошибка;
2) укажите, как исправить ошибку, т.е. приведите правильный вариант строки.
Достаточно указать ошибки и способ их исправления для одного языка программирования. Обратите внимание, что требуется найти ошибки в имеющейся программе, а не написать свою, возможно, использующую другой алгоритм решения. Исправление ошибки должно затрагивать только строку, в которой находится ошибка.
Решение использует запись программы на Паскале. Допускается использование программы на любом из четырёх других языков.
1. Программа выведет число 4.
2. Пример числа, при вводе которого программа выдаёт верный ответ: 835.
Программа работает неправильно из-за неверной выводимой на экран переменной и неверного увеличения суммы. Соответственно, программа будет работать верно, если в числе старшая цифра (крайняя левая) равна сумме цифр, меньших 7.
3. В программе есть две ошибки.
Первая ошибка. Неверное увеличение суммы.
Строка с ошибкой:
sum := sum + digit;
Вторая ошибка. Неверный вывод ответа на экран.
Строка с ошибкой:
Для заданного положительного вещественного числа A необходимо найти максимальное целое число K, при котором выполняется неравенство
(при K = 0 сумма считается равной 0).
Для решения этой задачи ученик написал такую программу.
Бейсик
Python
DIM K AS INTEGER
INPUT A
WHILE S < A
WEND
PRINT K
Алгоритмический язык
Паскаль
нач
вещ a, s
цел k
ввод a
нц пока s<a
кц
вывод k
k: integer;
begin
read(a);
while s<a do begin
end;
write(k);
Си
int main()
double a, s;
int k;
while (s<a)
return 0;
Последовательно выполните следующее.
1. Напишите, что выведет эта программа при вводе числа 1.2.
2. Приведите пример числа, при вводе которого программа даст верный ответ.
3. Найдите в программе все ошибки (их может быть одна или несколько).
Для каждой ошибки выпишите строку, в которой она допущена, и приведите эту же строку в исправленном виде.
Обратите внимание: вам нужно исправить приведённую программу, а не написать свою. Вы можете только исправлять ошибочные строки; удалять строки или добавлять новые строки нельзя. Постарайтесь также не внести новые ошибки – за это оценка снижается.
Решение использует запись программы на Паскале. Допускается использование программы на других языках.
1. При вводе числа 1.2 программа выведет число 2.
2. Примеры чисел, при вводе которых программа выводит верный ответ: 1.6, 2.05.
Программа содержит две ошибки, одна из которых приводит к увеличению ответа, другая – к уменьшению.
В некоторых случаях эти ошибки компенсируют друг друга, и ответ оказывается правильным. Это происходит, если значение A попадает в один из следующих диапазонов: 1.5 < A < 1.83, 2 < A < 2.08.
3. Программа содержит две ошибки.
1) Неверная инициализация. Начальное значение S должно быть равно нулю.
В приведённом варианте вычисленная сумма оказывается на 1 больше правильного значения.
Строка с ошибкой:
2) Неверное определение ответа. Приведённая программа находит не максимальное K, при котором выполняется неравенство, а минимальное, при котором оно не выполняется, то есть увеличивает верное значение на 1.
Кроме того, использованный порядок действий в цикле (увеличение K после увеличения S) приводит к увеличению ещё на 1. Это можно было бы исправить, изменив порядок действий в цикле и уменьшив K после завершения цикла, но эти действия не разрешены по условию задачи.
Поэтому для исправления ошибки можно просто скорректировать значение при выводе.
Ошибка отступа в Python
Согласно соглашениям, принятым в PEP8, должно быть четыре пробела, где это необходимо. Для каждого программиста идеально использовать правильные отступы, чтобы улучшить читаемость кода.
Что вызывает ошибку отступа в Python?
- Ты используешь и пробелы и табуляции в вашем коде. Если оба они взаимозаменяемы, интерпретатор не сможет определить, какой элемент использовать.
- Вы поместили отступ неправильно. Если практика отступления не будет соблюдена, эта ошибка неизбежно возникнет.
- Вы забыли сделать отступ составные высказывания такие как «если», «для», «пока» и т. д.
- Вы забыли сделать отступ пользовательские функции или классы.
Решение 1. Проверка на наличие неправильных пробелов / вкладок
Нет мгновенного решения этой проблемы. Так как код ваш, вы должны пройти каждую строку и посмотреть, где вы допустили ошибку. В коде есть несколько блоков относительно структуры. Если есть оператор «Если», то должен быть отступ для кода, который следует за ним.
Блочная структура, визуализирующая отступ
Проверьте схему выше. Обратите внимание, что отступ для конкретного блока остается неизменным во всем коде, даже если новый блок вводится посередине. Убедитесь, что ваш отступ соответствует. Если вы используете пробелы, всегда используйте пробелы, а если вы используете вкладки, всегда используйте вкладки. Смешивание двух приведет к проблемам.
Пример отступа
Правильный отступ показан в примере выше. Смотрите цикл «для» для начинающих. Все внутри цикл «for» должен иметь отступ. Внутри цикла «для» у нас есть выражение «если». Внутри выражения «если» все должно быть в дальнейшем отступ.
Вы можете легко проверить, где произошла ошибка отступа, проверив журнал ошибок и увидев строку, откуда возникла ошибка.
Решение 2. Включение символов табуляции / пробела в редакторе
Если вам трудно сделать отступ в коде с помощью «угадай», как это делают все программисты, вы можете включить символы табуляции / пробела в вашей IDE или редакторе кода. Эта опция включит маленькие «точки» в вашем коде, где каждая точка представляет пробел или табуляцию. Вы можете использовать это для более правильного отступа в коде и убедиться, что нет дополнительного отступа или что-то отсутствует.
В этом примере мы возьмем Notepad ++ и посмотрим, как вы можете включить символы. Если вы используете другое программное обеспечение для редактирования кода, вы можете включить настройку, специфичную для него.
Пример кода с правильным отступом
Проверьте пример выше. Смотрите отступ, реализованный после каждого класса. Каждое пространство представлено одной точкой. После внесения изменений в неправильный отступ в вашем коде, запустите его снова и посмотрите, решит ли это проблему.
Ошибка отступа в Python
Согласно соглашениям, принятым в PEP8, должно быть четыре пробела, где это необходимо. Для каждого программиста идеально использовать правильные отступы, чтобы улучшить читаемость кода.
Что вызывает ошибку отступа в Python?
- Ты используешь и пробелы и табуляции в вашем коде. Если оба они взаимозаменяемы, интерпретатор не сможет определить, какой элемент использовать.
- Вы поместили отступ неправильно. Если практика отступления не будет соблюдена, эта ошибка неизбежно возникнет.
- Вы забыли сделать отступ составные высказывания такие как «если», «для», «пока» и т. д.
- Вы забыли сделать отступ пользовательские функции или классы.
Решение 1. Проверка на наличие неправильных пробелов / вкладок
Нет мгновенного решения этой проблемы. Так как код ваш, вы должны пройти каждую строку и посмотреть, где вы допустили ошибку. В коде есть несколько блоков относительно структуры. Если есть оператор «Если», то должен быть отступ для кода, который следует за ним.
Блочная структура, визуализирующая отступ
Проверьте схему выше. Обратите внимание, что отступ для конкретного блока остается неизменным во всем коде, даже если новый блок вводится посередине. Убедитесь, что ваш отступ соответствует. Если вы используете пробелы, всегда используйте пробелы, а если вы используете вкладки, всегда используйте вкладки. Смешивание двух приведет к проблемам.
Пример отступа
Правильный отступ показан в примере выше. Смотрите цикл «для» для начинающих. Все внутри цикл «for» должен иметь отступ. Внутри цикла «для» у нас есть выражение «если». Внутри выражения «если» все должно быть в дальнейшем отступ.
Вы можете легко проверить, где произошла ошибка отступа, проверив журнал ошибок и увидев строку, откуда возникла ошибка.
Решение 2. Включение символов табуляции / пробела в редакторе
Если вам трудно сделать отступ в коде с помощью «угадай», как это делают все программисты, вы можете включить символы табуляции / пробела в вашей IDE или редакторе кода. Эта опция включит маленькие «точки» в вашем коде, где каждая точка представляет пробел или табуляцию. Вы можете использовать это для более правильного отступа в коде и убедиться, что нет дополнительного отступа или что-то отсутствует.
В этом примере мы возьмем Notepad ++ и посмотрим, как вы можете включить символы. Если вы используете другое программное обеспечение для редактирования кода, вы можете включить настройку, специфичную для него.
Пример кода с правильным отступом
Проверьте пример выше. Смотрите отступ, реализованный после каждого класса. Каждое пространство представлено одной точкой. После внесения изменений в неправильный отступ в вашем коде, запустите его снова и посмотрите, решит ли это проблему.
Если блоки команд состоят только из одного оператора каждый, то использовать операторные скобки begin . end не обязательно:
Конструкции циклов в языке Паскаль
Цикл с предусловием:
Цикл с постусловием:
Цикл со счётчиком:
Операторы досрочного завершения цикла
Оператор языка Паскаль
Оператор продолжения — выполнение данного оператора прекращает текущее выполнение тела цикла и передает управление на проверку условия цикла
Оператор прерывания — выполнение данного оператора прекращает выполнение цикла и передает управление на следующий оператор после цикла
Разбор типовых задач
Задача 1. На обработку поступает последовательность из четырёх неотрицательных целых чисел (некоторые числа могут быть одинаковыми). Нужно написать программу, которая выводит на экран количество нечётных чисел в исходной последовательности и максимальное нечётное число. Если нечётных чисел нет, требуется на экран вывести “NO”. Известно, что вводимые числа не превышают 1000. Программист написал программу неправильно.
Последовательно выполните следующее.
1. Напишите, что выведет эта программа при вводе последовательности: 2 9 4 3.
2. Приведите пример такой последовательности, содержащей хотя бы одно нечётное число, что, несмотря на ошибки, программа печатает правильный ответ.
3. Найдите все ошибки в этой программе (их может быть одна или несколько). Известно, что каждая ошибка затрагивает только одну строку и может быть исправлена без изменения других строк. Для каждой ошибки:
1) выпишите строку, в которой сделана ошибка;
Обратите внимание, что требуется найти ошибки в имеющейся программе, а не написать свою, возможно, использующую другой алгоритм решения. Исправление ошибки должно затрагивать только строку, в которой находится ошибка.
1) Начинаем с общего анализа алгоритма, помня, что в нем возможны отдельные ошибки. (Что делает программа, описано в условии, но умение анализа алгоритма требуется нам как для поиска ошибок в нем, так и потому, что в последующих вариантах ЕГЭ назначение программы в условии может быть не указано — в качестве дополнительного усложнения задания.)
• В начале программы инициализируются (получают начальные значения) две переменных — count (обнуляется) и maximum (приравнивается 999). Уже из названия этих переменных можно предположить, что count — это счётчик чего-либо, а переменная maximum предназначена для определения максимального значения.
• Далее следует цикл с параметром, выполняемый 4 раза (константное значение п задается равным 4):
— считывается очередное значение х,
— проверяется его нечётность (неравенство нулю остатка при делении на 2): если х нечётно, то счётчик увеличивается на 1, а конструкция
— это хорошо знакомый приём определения максимума,
— случай чётного х не обрабатывается (ветвь else отсутствует), проход цикла завершается;
Итак, назначение и общие принципы работы программы ясны. Принимая на входе последовательность чисел, она должна определять максимальное значение среди нечётных таких чисел и одновременно подсчитывать количество нечётных чисел.
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, не превосходящее 10 9 , и определяется сумма цифр этого числа. Программист торопился и написал программу неправильно.
Последовательно выполните следующее.
1. Напишите, что выведет эта программа при вводе числа 256.
2. Приведите пример такого трёхзначного числа, при вводе которого программа выдаёт правильный результат.
3. Найдите все ошибки в этой программе (их может быть одна или несколько). Для каждой ошибки:
1) выпишите строку, в которой сделана ошибка;
Достаточно указать ошибки и способ их исправления для одного языка программирования. Обратите внимание, что требуется найти ошибки в имеющейся программе, а не написать свою, возможно, использующую другой алгоритм решения. Исправление ошибки должно затрагивать только строку, в которой находится ошибка.
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;
Библиотека образовательных материалов для студентов, учителей, учеников и их родителей.
Наш сайт не претендует на авторство размещенных материалов. Мы только конвертируем в удобный формат материалы из сети Интернет, которые находятся в открытом доступе и присланные нашими посетителями.
Если вы являетесь обладателем авторского права на любой размещенный у нас материал и намерены удалить его или получить ссылки на место коммерческого размещения материалов, обратитесь для согласования к администратору сайта.
Разрешается копировать материалы с обязательной гипертекстовой ссылкой на сайт, будьте благодарными мы затратили много усилий чтобы привести информацию в удобный вид.
Читайте также: