Как сделать чтобы паскаль сам исправил ошибки
- Out of memory (выход за границы памяти) Компилятору не хватает памяти. Имеется ряд возможных решений этой проблемы:
- Если в опции COMPILE/DESTINATION установлено значение MEMORY, замените эту опцию на DISK.
- Если в опции OPTIONS/COMPILER/LINK установлено значение MEMORY, замените эту опцию на DISK.
- Если Вы используете постоянно помещенные в память (резидентные) обслуживающие программы, такие как WINDOWS, SIDEKICK, NORTON
удалите их из памяти. - Если Вы используете интегрированную среду TURBO.EXE, то попробуйте воспользоваться компилятором ТРС.ЕХЕ, он занимает меньше памяти.
- Если ни одна из рекомендаций не помогает, то, возможно, Ваша программа просто слишком велика, чтобы компилировать ее в таком объеме памяти. В этом случае Вы должны разбить её на два или более модулей.
-
Ваш исходный файл закончился перед последним END основного раздела
Если блоки команд состоят только из одного оператора каждый, то использовать операторные скобки 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;
Библиотека образовательных материалов для студентов, учителей, учеников и их родителей.
Наш сайт не претендует на авторство размещенных материалов. Мы только конвертируем в удобный формат материалы из сети Интернет, которые находятся в открытом доступе и присланные нашими посетителями.
Если вы являетесь обладателем авторского права на любой размещенный у нас материал и намерены удалить его или получить ссылки на место коммерческого размещения материалов, обратитесь для согласования к администратору сайта.
Разрешается копировать материалы с обязательной гипертекстовой ссылкой на сайт, будьте благодарными мы затратили много усилий чтобы привести информацию в удобный вид.
§ Если в меню Options?Linker?Link Buffer, установлен параметр Memory, переключите его в значение Disk.
§ несоответствующее количество begin и end (не забудьте, что оператор case также заканчивается словом end);
§ включаемый файл заканчивается в середине раздела операторов. Каждый раздел операторов должен целиком помещаться в одном файле;
§ несовместимые типы переменной и выражения в операторе присваивания;
§ несовместимые типы фактического и формального параметров в обращении к процедуре или функции;
§ тип выражения, несовместимый с типом индекса при индексировании массива;
§ Идентификатор обозначает абсолютную переменную.
§ Операнд ссылается на перемещаемый идентификатор, который не был определен в сегменте CODE или в сегменте DATA.
-75%
Компьютерная грамотность для учителей
Получите комплекты видеоуроков + онлайн версии
Язык программирования Паскаль. Найди ошибки в программах. (11.03 KB)
Читайте также: