Автор материалов — Лада Борисовна Есакова.
Самая распространенная ошибка, которую нужно найти и исправить – это неправильное использование вложенных условных операторов. Для усложнения поиска возможно неправильное форматирование текста (неправильно поставленные отступы).
Для того, чтобы найти ошибку, нужно поставить в соответствие друг другу все части условного оператора if и else.
Помним, что часть else относится к ближайшему if. При этом наличие части else не обязательно.
Кроме того, часто присутствует ошибка при вводе или выводе. Обязательно нужно проверить, та ли информация выводится на экран.
Особого внимания требует инициализация переменных.
Формат книги не позволяет рассмотреть все основные типы задач 2 части, рассмотрим лишь те, которые встречались на проверочных и экзаменационных работах последних двух лет.
На обработку поступает положительное целое число, не превышающее 109. Нужно написать программу, которая выводит на экран сумму цифр этого числа, меньших 7. Если в числе нет цифр, меньших 7, требуется на экран вывести 0. Программист написал программу неправильно. Ниже эта программа для Вашего удобства приведена на пяти языках программирования.
Последовательно выполните следующее.
1. Напишите, что выведет эта программа при вводе числа 456.
2. Приведите пример такого трёхзначного числа, при вводе которого программа выдаёт верный ответ.
3. Найдите все ошибки в этой программе (их может быть одна или несколько). Известно, что каждая ошибка затрагивает только одну строку и может быть исправлена без изменения других строк. Для каждой ошибки:
1) выпишите строку, в которой сделана ошибка;
2) укажите, как исправить ошибку, т.е. приведите правильный вариант строки.
Достаточно указать ошибки и способ их исправления для одного языка программирования. Обратите внимание, что требуется найти ошибки в имеющейся программе, а не написать свою, возможно, использующую другой алгоритм решения. Исправление ошибки должно затрагивать только строку, в которой находится ошибка.
Решение использует запись программы на Паскале. Допускается использование программы на любом из четырёх других языков.
1. Программа выведет число 4.
2. Пример числа, при вводе которого программа выдаёт верный ответ: 835.
3. В программе есть две ошибки.
Первая ошибка. Неверное увеличение суммы.
Строка с ошибкой:
sum := sum + digit;
Вторая ошибка. Неверный вывод ответа на экран.
Для заданного положительного вещественного числа A необходимо найти максимальное целое число K, при котором выполняется неравенство
(при K = 0 сумма считается равной 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 после завершения цикла, но эти действия не разрешены по условию задачи.
Поэтому для исправления ошибки можно просто скорректировать значение при выводе.
Благодарим за то, что пользуйтесь нашими статьями.
Информация на странице «Задача №24. Исправление ошибок в программе.» подготовлена нашими авторами специально, чтобы помочь вам в освоении предмета и подготовке к ЕГЭ и ОГЭ.
Чтобы успешно сдать нужные и поступить в высшее учебное заведение или техникум нужно использовать все инструменты: учеба, контрольные, олимпиады, онлайн-лекции, видеоуроки, сборники заданий.
Также вы можете воспользоваться другими материалами из данного раздела.
Поиск и исправление ошибок
При поиске ошибок большим подспорьем является возможность () программы с параллельным отслеживанием того, как меняются в ходе неё значения переменных. В среде Turbo Pascal для этого имеются следующие инструменты:
- Нажатие клавиши F4 выполнит программу до той строки, на которой установлен курсор, затем приостановит выполнение.
- Нажатие клавиши F7 или F8 позволяет выполнять программу пошагово: по одному оператору (различие между этими функциями состоит в том, производится или нет текстов подпрограмм).
Более подробно эти возможности описаны в руководствe по среде Turbo Pascal.
Можно дать несколько полезных советов, касающихся локализации ошибок в программе.
Совет 16. Пользуйтесь всеми доступными инструментами .
Совет 17. На всех ключевых участках, а также на границах логически самостоятельных блоков вставляйте в программу печати, которые позволят вам проследить изменение состояния основных переменных. Эта процедура не всегда может быть заменена просмотром изменений, который можно осуществить с помощью окна Watch. Зачастую бывает необходимо иметь перед собой для сравнения результаты нескольких последовательных итераций, либо нужно видеть одновременно первые и последние результаты, либо в процессе прогонки возвращаться по списку выдачи назад, к предыдущим результатам. Ничего этого параллельный просмотр в Watch сделать не позволяет.
Если отладочная выдача настолько объёмна, что не помещается целиком на экран, её приходится производить в файл.
Совет 18. Следите за тем, чтобы отладочная печать выдавала именно то, что нужно. Совершенно невозможно отловить ошибку в программе, если под именем проверяемой переменной вам выдаётся значение другой переменной!
Самый легкий случай, — когда из–за опечатки полностью меняется вид вывода. Например, правильный оператор (a + 1) должен выдать число, если же вместо числа на экране вдруг появляется слово FALSE, то это явный признак того, что произошла опечатка и выдаётся результат сравнения переменной а с единицей: (a = 1).
Однако не всегда удаётся так легко отделаться, поэтому обязательно удостоверьтесь в том, что правильной является и конечная печать результата: выдаётся значение нужной переменной, значение выводится в правильном формате и т. п. Такие ошибки возникают только из–за невнимательности и бывают подчас трудноуловимыми.
Совет 19. Если вы уже локализовали небольшой участок программы, в котором находится ошибка, удалите операторы отладочной печати из остальных частей программы, а в отлаживаемом участке, наоборот, увеличьте их количество.
Совет 20. Пишите «» для ещё не отлаженных процедур и функций. Это значит, что вместо того, чтобы мучиться одновременно с несколькими подпрограммами, вы вынуждаете большую их часть возвращать не тот результат, какой они реально вырабатывают, а тот, который они должны были бы возвращать при правильной работе.
Совет 21. За один раз исправляйте ровно одну ошибку. Нет ничего хуже, чем гадать, которое из внесённых исправлений оказало решающее влияние на поведение программы.
Правила составления тестов
Для того, чтобы отладить программу, нужно проверить её работоспособность на каких–то входных данных. Следовательно, эти входные данные нужно каким–то образом подобрать. Затем, после выполнения программы на этих входных данных, нужно сравнить полученный результат с тем, который должен получиться, если программа работает правильно. Этот процесс и называется тестированием.
Заметим, что если полученный результат отличается от эталонного, то считается удачным (!), потому что он помог обнаружить ошибку. А если полученный ответ совпал с правильным — радоваться рано. Один не может полностью проверить всю программу, ошибка вполне могла затаиться в той части, которая осталась на сей раз невыполненной. Для того, чтобы протестировать всю программу, проверить все возможные частные случаи, составляют не один , а набор .
И здесь существуют следующие правила.
Правило 1. Любой должен состоять не только из входных, но и из соответствующих им выходных данных. Ведь для того, чтобы понять, верный или неверный результат выдала вам программа, необходимо самому знать правильный ответ.
Проверяйте вручную результаты , с помощью которых вы отлаживаете программу. Немногого можно добиться, если выдаваемый программой правильный ответ вы считаете неверным и продолжаете поиск несуществующей ошибки. Хуже того — если вы всё–таки добьётесь, чтобы программа выдавала ожидаемый вами неверный результат, объяснить её неправильное поведение на других вам будет ещё сложнее.
Из двух предыдущих абзацев вытекает очень важный вывод: нельзя строить тесты при помощи генератора случайных чисел. Конечно, вы можете случайным образом составить входные данные, но как быть с правильным ответом? Откуда его взять, если вы сами понятия не имеете, что там подаётся на вход?
Правило 2. После того, как программа начала правильно работать на одном или нескольких простых , усложните задания, введите на граничные условия или , содержащий значения, выходящие за рамки формата входных данных. Иногда ошибка может скрываться в тех частях программы, которые кажутся самыми прозрачными. Например, в проверке нескольких переменных на равенство между собой. Если до сих пор все переменные в были разными, попробуйте прогнать программу через , в которых сравниваемые значения будут совпадать — все сразу или только некоторые из них в разных комбинациях.
Правило 3. Не ограничивайтесь только похожими .
Все можно разделить на три группы: регулярные, граничные и критические. Например, при заданных ограничениях на параметр 0 <= x <= 100 регулярными будут все , где 1 <= x <= 99; граничными, где и х = 100; остальные — критическими. Если ваша программа правильно работает для пяти–шести из какой–либо группы, можно предположить, что она выдаст правильный результат и для всех остальных из этой группы.
В , составленном для проверки программ, обязательно должны присутствовать первых двух групп, а для проверки работоспособности «защиты от дурака» (см. ) — и третьей тоже. Если входных параметров несколько — комбинируйте! Пусть в одном и том же первый параметр будет граничным, второй — регулярным, а третий — критическим. Всегда интересно посмотреть, достаточно ли надёжна ваша программа, справится ли она с таким заданием.
В хорошей, надёжной программе всегда нужно писать проверку того, что файл ввода существует, не пуст и содержит данные в правильном формате, что считываемые из входного файла данные попадают в определённые условием задачи диапазоны.
Правило 4. Исправления, вносимые в программу, могут повлиять на результаты нескольких .
После того, как вы нашли и исправили ошибку, вновь выполните программу на всех тех , которые раньше не были успешными (то есть, выдавали правильные ответы) — а вдруг найдётся новая ошибка?
Вообще же, составление исчерпывающих для тестирования любой программы — задача очень нетривиальная, зачастую требующая математического доказательства полноты.
Процесс уже написанной программы начинается только после того, как вы убедились, что ваша программа работает правильно. Стараться неправильную программу бессмысленно, правильнее она от этого не станет, поскольку — это замена некоторых программных кусков эквивалентными им с точки зрения результата, но более экономичными с точки зрения выполнения.
Основная часть процесса приходится на этап выбора наилучшего алгоритма. Однако даже при правильном неграмотное кодирование может привести к неэффективно работающему результату. Чтобы такого не происходило, внимательнее относитесь к тому, что и как вы пишете, реализуя выбранный вами алгоритм. Не всегда те действия, которые кажутся оптимальными с точки зрения логики алгоритма, стоит пытаться запрограммировать «в лоб».
Если же алгоритм выбран и запрограммирован «почти» правильно, можно попытаться улучшить его, внося изменения, сокращающие его работу.
В первую очередь стоит оптимизировать часто повторяющиеся куски программы, то есть циклы. Старайтесь не допускать ситуаций, когда в теле цикла раз за разом производятся одни и те же вычисления, никак не изменяющие состояние переменных. И вообще, избегайте вносить в повторяющиеся участки «тяжёлые» операции.
Например, ясно, что из двух эквивалентных кусков
k i b k k i b (b )
a b (b )k i b k k i a
второй является и более быстрым (особенно если b = 10000), и более компактным, чем первый.
Лишние вычисления, лишние действия с файлами или структурами, лишние пересылки элементов из одной ячейки памяти в другую (и список этот далеко не полон!) — всё это снижает эффективность программы. Старайтесь помнить о том, что лаконичность приветствуется всегда и везде, а особенно в программировании.
Успехов вам в написании красивых и полезных программ!
Сообщения об ошибках периода компиляции
Среда Турбо Паскаля дает исчерпывающую информацию о характере и месте обнаруженной компилятором ошибки. При обнаружении ошибки среда автоматически загружает в окно редактора исходный файл и помещает курсор около того места, где в исходном тексте обнаружена ошибка. При этом в верхней строке редактора появляется диагностическое сообщение. После нажатия на любую клавишу (кроме F1) верхняя строка восстанавливает свой первоначальный вид и среда переходит к режиму редактирования.
Если после появления сообщения об ошибке нажать F1, на экране появится окно справочной службы с детальной информацией об ошибке и рекомендациями по ее устранению. Некоторые ошибки в исходном тексте обнаруживаются не сразу, а в ходе продолжающегося контекстного разбора. Например, несоответствие типов в операторе присваивания не может быть обнаружено до тех пор, пока не будет вычислено целиком выражение в правой части этого оператора. В таких случаях ищите ошибку слева от курсора или в предыдущей строке текста.
Ниже приводятся сообщения об ошибках в том виде, в каком они появляются в верхней строке редактора, а также перевод сообщений справочной службы.
На экране после кода ошибки (цифры) нет точки, поэтому ее нет и в соответствующем месте текста.
1 Out of memory (Выход за границы памяти).
Компилятору не хватает памяти. Имеется ряд возможных решений этой проблемы:
- если в опции COMPILE/DESTINATION установлено значение MEMORY, замените эту опцию на DISK;
- если в опции OPTIONS/LINKER/LINK BUFFER установлено значение MEMORY, замените эту опцию т DISK;
- если Вы используете резидентные обслуживающие программы, такие как SIDEKICK, NORTON, удалите их из памяти;
- если Вы используете интегрированную среду TVRBO.EXE, то попробуйте воспользоваться компилятором ТРС.ЕХЕ – он занимает меньше памяти.
Если ни одна из рекомендаций не помогает, то, возможно, Ваша программа просто слишком велика, чтобы компилировать ее в таком объеме памяти. В этом случае Вы должны разбить ее на два или более модулей.
2 Identifier expected (Не указан идентификатор).
В этом месте должен находиться идентификатор. Возможно, Вы пытаетесь использовать в качестве идентификатора зарезервированное слово.
3 Unknown identifier (Неизвестный идентификатор).
Этот идентификатор не был описан.
4 Duplicate identifier (Двойной идентификатор).
Попытка дважды описать один и тот же идентификатор.
5 Syntax error (Синтаксическая ошибка).
В исходном тексте найден недопустимый символ. Возможно, Вы забыли заключить в апострофы строковую константу.
6 Error in real constant (Ошибка в вещественной константе).
7 Error in integer constant (Ошибка в целой константе).
Синтаксис констант целого типа описан в гл.4. Учтите, что после целых действительных чисел, превышающих диапазон представления целых чисел (-2147483648..+2147483647), должны ставиться точка и ноль, например, 12345678912.0.
8 String constant exceeds line (Строковая константа превышает допустимые размеры).
Вероятно, Вы забыли поставить апостроф в конце строковой константы.
9 Too many nested files (Слишком много вложенных файлов).
Компилятор допускает не более пяти уровней вложенности включаемых файлов (т.е. в исходном файле есть ссылка на включаемый файл, в котором есть ссылка на еще один включаемый файл и т.д.).
Ошибки в программировании. Примеры ошибок в языке Паскаль
Ошибки в программировании бывают двух типов: синтаксические и логические. Синтаксические ошибки это неправильное написание ключевых слов и символов языка программирования. Все виды синтаксических ошибок могут быть найдены компьютером в 99 % случаев.
Логические ошибки связаны с неправильной программной реализацией логики алгоритма. В 99 % случаев компьютер будет выполнять программу, но результат работы будет неправильный.
Примеры синтаксических ошибок в языке Паскаль и их исправление:
1) Не поставлена точка с запятой. После пуска программы, нажатием клавиш + , в верхней строке экрана появится написанное красным цветом сообщение:
Error 85: «;» expected.
(Ошибка 85: «;» отсутствует.)
Редактор установит курсор на следующий символ после пропущенного знака. После нажатия любой клавиши, сообщение об ошибке исчезает, и редактор переходит в режим вставки. Надо подвести курсор к нужному месту, поставить точку с запятой — “;” и продолжить работу.
2) В описании переменных не записана переменная, а в программе она присутствует. После пуска программы, будет выдано сообщение:
Error 3: Unknown identifier.
(Ошибка 3: Неизвестный идентификатор.)
Курсор будет установлен на эту переменную. Надо исправить ошибку, т.е. записать переменную в раздел описаний переменных и продолжить работу.
3) Не поставлена точка после оператора end в конце программы. Сообщение компилятора будет таким:
Error 10: Unexpected end of file.
(Ошибка 10: Неправильный конец файла.),
Курсор установится на букву «e» в слове «end». Надо поставить точку и снова выполнить программу.
Выполнение программы. Ключевые кнопки
После того, как программа набрана, можно попробовать ее выполнить.
Для этого нажимаем клавиши + (удерживая клавишу , нажать клавишу ). Эту же операцию можно выполнить, перейдя в основное меню, нажав клавишу , а затем перемещением указателя выбрать опцию Run и нажать клавишу .
Теперь надо найти в новом меню опцию RUN (пуск) и нажать клавишу .
Если не было ошибки при вводе текста, то, спустя несколько секунд, произойдет смена изображения на экране. Турбо Паскаль предоставляет экран в распоряжение работающей программы пользователя. Такой экран называется окном программы.
После завершения прогона (работа программы часто называется ее прогоном) на экране вновь появится окно редактора с текстом программы. Если Вы не успели разглядеть изображение окна программы, то нажмите Alt-F5. При этом окно редактора скроется и вы сможете увидеть результаты работы программы. Чтобы вернуть экран в режим воспроизведения окна редактора, надо нажать на любую клавишу.
Первые ошибки и их исправление
1. Не поставлена точка с запятой, например, после оператора readln(a). После пуска программы, нажатием клавиш + , в верхней строке экрана появится написанное красным цветом сообщение:
Редактор установит курсор на следующий символ после пропущенного знака, в нашем примере на переменную b. После нажатия любой клавиши, сообщение об ошибке исчезает и редактор переходит в режим вставки. Надо подвести курсор к нужному месту, поставить точку с запятой — “;” и продолжить работу.
2. В описании переменных не записана переменная, а в программе она присутствует, например переменная c. После пуска программы, будет выдано сообщение:
Курсор будет установлен на эту переменную, в нашем примере на переменную c. Надо исправить ошибку, т.е. записать переменную c в раздел описаний переменных и продолжить работу.
3. Не поставлена точка после оператора end в конце программы. Сообщение компилятора будет таким:
Помощь в “PASCAL”.
В Турбо Паскаль имеется справочная служба, охватывающая все возможные вопросы по написанию программ. Главное – это подсказки по ключевым словам языка.
Меню опции HELP
CONTENTS. Выводит на экран содержание справочной службы.
INDEX. Выводит на экран алфавитный список всех ссылок справочной службы. Вызывается из редактора командой Shift-F1.
TOPIC SEARCH. Осуществляет поиск в окрестности курсора зарезервированного слова или имени стандартной процедуры (функции) и дает соответствующую справку. Вызывается из редактора командой Ctrl-F1.
PREVIOUS TOPIC. Выводит на экран предыдущее справочное сообщение. Вызывается из редактора командой Alt-F1.
HELP ON HELP. Дает справку о том, как пользоваться справочной службой. Отметим, что в сообщениях справочной службы все перекрестные ссылки выделяются цветом. Вы можете подвести к любой из них указатель мыши и двойным нажатием на ее левую кнопку вызвать на экран соответствующее справочное сообщение (или сместить к ней указатель с помощью клавиш перевода курсора и нажать Enter).
FILES. С помощью этой опции Вы можете установить нужные файлы справочной службы.
COMPILER DIRECTIVES. Показывает справку о директивах компилятора.
RESERVED WORDS. Показывает справку о зарезервированных словах.
STANDARD UNITS. Показывает справку о стандартных модулях.
TURBO PASCAL LANGUAGE. Показывает справку о языке Турбо Паскаль.
ERROR MESSAGES. Показывает справку о сообщениях об ошибках.
ABOUT. Выводит информацию об авторских правах и версии Турбо Паскаля.
Лекция №7 Процедуры. Программирование рекурсивных алгоритмов.
Дедуктивный метод программирования
Программист должен видеть в целом программу, которая решает какую-то задачу, а потом разбивает ее на отдельные части, составляет на выбранном языке программирования эти части программы, объединяет их в единое целое и получает программу.
Итак, весь творческий процесс можно разбить (разумеется, чисто условно) на следующие этапы:
1) основная идея решения задачи;
2) общая конструкция программы;
3) выделение отдельных, элементарных частей программы;
4) практическая реализация на языке программирования этих частей программы;
5) объединение их в единую программу.
Такой процесс программирования называют структурным или нисходящим. Более подробно с этим процессом мы познакомимся позже, когда изучим хотя бы основы языка программирования, но об отдельных частях, «кирпичиках», составляющих программу узнаем на этом занятии.
Подпрограммой называется группа операторов, к которой обращаются из основной программы несколько раз. Иногда это может быть 2, 3 раза, а очень часто, каждый раз из выполняемого цикла основной программы.
Вполне понятно, что писать несколько раз одинаковые группы операторов трудно, проделывается много «технической» работы, а в некоторых случаях просто невозможно (если обращаться приходиться каждый раз при выполнении цикла).
Для облегчения такой работы и созданы подпрограммы.
Использование подпрограмм позволяет:
1) сделать основную программу более наглядной и компактной;
2) уменьшить объем используемой памяти ЭВМ;
3) сократить время отладки программы.
На языке Паскаль подпрограммы бывают двух видов, — это процедуры и функции.
Рассмотрим следующий простой пример, с помощью которого попробуем разобраться в конструкции процедур на Паскале.
Пример. Составить программу, которая бы проверяла, являются ли три числа взаимно простыми.
Мы знаем, что числа называются взаимно простыми, если их наибольший общий делитель (НОД) равен 1. Значит, для решения этой задачи нам придется дважды находить НОД чисел. Если заданы три числа: a, b, c, то найти НОД(a, b), а затем найти НОД(НОД(a, b), c).
Дважды писать операторы для нахождения НОД нам не хочется, поэтому оформим операторы для НОД в виде процедуры.
Посмотрите, как это будет выглядеть в программе:
a, b, c, k : integer;
Procedure nod(a, b : integer; var n : integer);
write(‘Введите три натуральных числа ‘); readln(a, b, c);
if k = 1 then writeln(‘Числа взаимно простые’)
else writeln(‘Числа не взаимно простые’)
В разделе описаний, после описания переменных, записывается заголовок процедуры: Procedure
Это слово является служебным и зарезервировано в Паскале. В одной строке с ним, через пробел, записывается имя процедуры, которое должно удовлетворять всем требованиям, предъявляемым к именам, основными из которых являются: начинаться с буквы и не иметь пробелов, т. е., требования такие же, как и к имени программы (имя нашей процедуры — nod):
Далее, в скобках, записываются имена переменных и их типы, значения которых будут вводиться в процедуру из основной программы, в нашем случае, их две (a, b) и они имеют тип integer.
Сразу надо заметить, что имена этих переменных могут не совпадать с именами переменных в основной программе, скажем мы могли их обозначить m, n или любыми другими именами.
После точки с запятой и зарезервированного слова var, записываются переменные и их типы, значения которых будет являться результатом работы процедуры и выводятся из нее в основную программу. Такая переменная в нашем примере одна — n. Она выведет значение НОД чисел a и b. Ее имя также может иметь одноименное в основной программе и это нисколько не отразится на работе процедуры.
Обратите внимание, что перед переменными, значения которых вводятся из основной программы, не ставится слово var, а перед переменной, значение которой выводится в основную программу, это слово записано. Это очень важное обстоятельство!
Так, если поставить var перед a и b, то компилятор будет воспринимать эти переменные как выходные и вводимые для них значения воспринимать не будет, и, наоборот, если var не будет записано перед выходной переменной, то компилятор воспримет ее как входную и выводить ее значение в основную программу не будет.
Дальнейшее построение процедуры строится также, как и основная программа на Паскале.
Описываются переменные, которые будут участвовать в ее работе, но их имена не должны повторять имена уже описанных входных и выходных параметров в заголовке программы. Далее описываются необходимые для работы операторы.
В нашем примере процедура nod будет такой:
Основная программа строится обычным образом, но там, где необходимо найти НОД чисел, обращается к процедуре. Как?
Для этого обращаются к ней по имени, а в скобках записывают фактические значения входных переменных (в нашем случае для переменных a и b), а также имена выходных переменных (в нашем случае k).
Из приведенного ниже участка программы видно, что при первом обращении к процедуре nod определяется НОД чисел a и b (nod(a, b, k)) и результат запоминается в переменную k, далее, изменяются значения переменных a и b
и снова вызывается процедура nod, которая уже находит НОД чисел k и c и результат присваивает переменной k.
Вы можете видеть основную часть программы:
Сделаем общие выводы для построения и работы процедур
Процедуры помещаются в разделе описаний и начинается зарезервированным (служебным) словом
Процедуре обязательно дается имя, которое должно удовлетворять тем же требованиям, что и имена переменных, т.е. это может быть одна или несколько букв, комбинация букв и целых чисел, но без пробелов, начинаться с буквы и т.д.
После имени, в скобках записываются переменные — параметры и их тип: входные, значения которых используются для вычисления в качестве аргументов.
Выходные параметры — это те переменные, в которых получается результат выполнения процедуры.
Входные и выходные параметры процедуры называются формальными параметрами.
Фактические, конкретные, значения формальные параметры должны получить в основной программе после обращения к ней (а пока в процедуре они являются не чем иным, как «пустышками«).
После формальных параметров, описываются переменные, которые необходимы непосредственно для работы процедуры.
Это параметры процедуры. Они нужны в ней, как и в любой другой программе и описываются также. Их имена должны отличаться от имен входных и выходных параметров.
Надо заметить, что процедура может быть такой, что в ней не будет вообще параметров, достаточно тех, которые будут введены из программы.
Описание процедуры имеет вид:
Она помещается в основной программе в разделе описаний.
По входным и выходным параметрам процедуры могут быть следующих типов:
1) иметь и входные и выходные параметры:
Мы только познакомились с программой такого типа.
2) иметь входные параметры, но не иметь выходных:
3) иметь выходные параметры, но не иметь входных:
4) не иметь ни входных, ни выходных параметров:
В зависимости от этого различаются процедуры по своей конструкции и выполняемым функциям.
Далее следует раздел операторов, который составляется по тем же правилам, как и в других программах.
Процедура описана и после этого начинается основная программа.
Как происходит вызов подпрограммы — процедуры?
Обязательно указывается имя процедуры. В скобках задаются фактические значения входных параметров и те переменные, в которые будут «запоминаться» выходные значения.
Рассмотрим пример, где может быть использована процедура второго типа: имеет входные параметры, но не имеет выходных.
Процедуру составим по следующему способу. Пусть задано число n. Нам необходимо найти такие два числа a и b, чтобы сумма их квадратов была равна n, т.е. решить в целых числах уравнение:
Возникает естественное желание испытывать натуральные числа от 1 и до . А вот до какого значения неизвестно. Если их брать до числа n, то это будет слишком много лишней и бесполезной работы.
Чтобы выяснить этот вопрос, можно организовать цикл, в котором проверять сколько чисел a надо, чтобы выполнялось неравенство:
Здесь, в качестве b взято наименьшее натуральное число 1. Организовав такой цикл, и подсчитав, сколько чисел a потребуется, мы узнаем сколько чисел надо просматривать, чтобы найти решение уравнения.
Этот цикл может быть таким:
while a*a + 1 2 + 4 2 = 20 и 4 2 + 2 2 = 20.
Чтобы избежать повторения чисел, цикл для чисел b можно организовать либо от 1 до a, либо от k до а.