clrscr: основное назначение и возможности
Основное назначение clrscr в Паскале заключается в том, чтобы предоставить программисту возможность создавать более чистый и структурированный вывод на экране. После выполнения команды clrscr все предыдущие выводы будут удалены, и консоль будет готова к новому выводу.
Использование команды clrscr в Паскале очень просто. Для его вызова достаточно написать clrscr в программе в том месте, где вы хотите очистить экран. Например:
clrscr;
clrscr также можно использовать в сочетании с другими командами, чтобы создавать более сложные и интерактивные визуальные эффекты. Например, вы можете использовать clrscr вместе с gotoxy, чтобы очистить экран и переместить курсор в определенное место перед выводом нового текста.
Также стоит отметить, что использование команды clrscr не всегда рекомендуется в продакшен-коде или крупных проектах, поскольку очистка экрана может сделать вывод менее интуитивно понятным для пользователя. Однако, в учебных целях или при разработке простых программ, команда clrscr может оказаться очень полезной.
Окно Call Stack — что это такое?
В IDE Паскаля есть еще одно очень удобное средство отладки — просмотр стека вызовов подпрограмм. Представьте себе, что программа имеет не только основную часть, но и несколько процедур/функций, вызывающих друг друга. В таком случае при пошаговой отладке становится сложно держать в памяти, какая именно процедура вызвала ту, что выполняется сейчас, и куда, соответственно, вернется управление после завершения текущей подпрограммы.
Да и не нужно этого держать в голове. Для этого существует такое средство, как «Call Stack» (вызывается из меню Debug → Call Stack или просто Ctrl+F3). Например, пусть наша программа имеет вид:
function fact(n longint) longint; begin if n = then fact = 1 else fact = n * fact(n - 1); end; function b(n longint) integer; begin b = 2 * fact(n); end; begin writeln( b(10) ); end.
Если начать выполнять ее пошагово, очень скоро можно запутаться в том, что именно сейчас выполняется (факториал какого числа вычисляется в данный момент, к примеру), и что еще осталось НЕзавершенным. А если программа будет в 10 раз длиннее, и будет содержать не 2, а 10 процедур/функций? В таком случае достаточно вызвать окно Call Stack (способ вызова — выше), и посмотреть, что именно в данный момент выполняется (то есть находится на першине стека вызовов), и что еще выполняться будет (находится ниже в списке), вплоть до Program, обозначающего, самый нижний уровень — основную программу…
Вот, например, в данном случае: выполняется функция вычисление факториала 8, которая вызвана из нижестоящей в списке функции вычисления факториала 9, которая в свою очередь… Ну, дальше все понятно… При продолжении пошагового выполнения этой программы в окно Call Stack будут добавляться новые и новые вызовы Fact (7), Fact(6), … до Fact(0); потом рекурсия начнет раскручиваться обратно…
Кстати, Call Stack — незаменимый помощник именно при работе с рекурсивными подпрограммами, поскольку дает возможность контролировать последовательность вызовов рекурсивной функции, и на ранней стадии определить, например, бесконечную рекурсию…
Например, здесь — совершенно очевидно, что рекурсивная функция оформлена неверно (отсутствует ветка Else), сразу после того, как в окне Call Stack появились вызовы f (-1) и f(-2)…
Еще одно полезное применение окна Call Stack — если вы случайно начали трассировку кода, который хотели бы выполнить за один шаг. В стеке вызовов вы можете найти тот вызов, который начали трассировать по ошибке, затем выбрать команду Run to Cursor, чтобы выполнить за один шаг остальную часть вызова.
1.1.4. Пустой оператор.
Пустой оператор не содержит никаких символов и не
выполняет никаких действий. Он может быть расположен в любом месте программы,
где синтаксис языка допускает наличие оператора. Как и все другие операторы,
пустой оператор может быть помечен меткой. Чаще всего пустой оператор
используется для организации выхода из середины программы или составного
оператора:begingoto Metka; {Переход в конец блока}……Metka:
{Пустой оператор помечен меткой}end.
Пустому оператору соответствует символ «;» на том
месте, где по правилам должен быть какой-либо оператор.Пример: A := B; ;
M := 7.2;
clrscr — возможные ошибки и их решения
clrscr — это функция, которая используется в программировании для очистки экрана консоли. Очистка экрана может быть полезной, когда нужно удалить предыдущий вывод и начать с нового, свежего экрана. Однако, при использовании функции clrscr могут возникнуть некоторые ошибки. Ниже перечислены некоторые из них и предложены возможные решения.
-
Ошибка: «clrscr is not declared in this scope»
Причина: Эта ошибка возникает, когда компилятор не может найти объявление функции clrscr.
Решение: В стандарте языка C++ функция clrscr не является стандартной функцией. Она является функцией, предоставляемой некоторыми компиляторами или IDE для работы с консолью. Поэтому, чтобы использовать функцию clrscr, необходимо включить библиотеку conio.h и использовать компилятор, поддерживающий эту библиотеку.
-
Ошибка: «undefined reference to clrscr»
Причина: Эта ошибка возникает при компиляции программы, когда компилятор не может найти определение функции clrscr.
Решение: Если вы используете GCC или G++, функция clrscr находится в библиотеке conio. Чтобы исправить ошибку, можно добавить опцию компилятора «-lconio» при компиляции программы. Например: g++ myfile.cpp -lconio.
-
Ошибка: «clrscr was not declared in this scope»
Причина: Эта ошибка возникает при использовании функции clrscr в неправильном месте в программе или в неправильном контексте.
Решение: Обычно функцию clrscr следует вызывать внутри функции main(), до того, как начнется вывод информации на экран. В некоторых случаях, функцию clrscr можно вызывать и в других функциях, предварительно объявив ее с помощью прототипа функции.
В результате, при использовании функции clrscr следует быть внимательным к возможным ошибкам и искать их решения. Ошибки могут возникнуть из-за отсутствия объявления функции, отсутствия определения функции или использования функции в неправильном контексте. Если компилятор не предоставляет функцию clrscr, можно использовать альтернативные способы очистки экрана, такие как использование ANSI Escape-последовательностей или специфичных функций компилятора.
2.1. Воспроизведение звука.
Персональный компьютер комплектуется встроенным динамиком, способным
генерировать звуковые сигналы в диапазоне от 30 до 32000 Гц (воспроизводятся
только чистые тона, сила звука не меняется).
Для управления частотой звука и его продолжительностью в модуле Crt
предусмотрены следующие стандартные процедуры:
- Delay(Ms: word); — выполняет задержку в выполнении программы на Ms
миллисекунд. - Sound(Hz: word); — включает внутренний динамик. Hz — задает частоту
генерируемого динамиком сигнала в Герцах. Звуковой сигнал будет звучать до тех
пор, пока не будет выключен с помощью процедуры NoSound. - NoSound; — отключает внутренний динамик.
Большая октава | Малая октава | ||||||||||||
До | Ре | Ми | Фа | Соль | Ля | Си | До | Ре | Ми | Фа | Соль | Ля | Си |
130 | 147 | 165 | 175 | 196 | 220 | 246 | 262 | 294 | 330 | 349 | 392 | 440 | 494 |
Первая октава | Вторая октава | ||||||||||||
До | Ре | Ми | Фа | Соль | Ля | Си | До | Ре | Ми | Фа | Соль | Ля | Си |
523 | 587 | 659 | 698 | 783 | 880 | 998 | 1046 | 1175 | 1319 | 1397 | 1568 | 1760 | 1976 |
Как выйти из программы
Точно также можно выйти из программы, если в этом есть необходимость. Если ваша программа,
например, обнаруживает какую-то критическую ошибку, которую не может обработать, то можно с помощью процедуры Exit выполнить выход из программы в любом месте.
Пример программы, а также примеры, где можно это использовать, вы можете найти ниже.
program exitproc; //**************************************************************** // Функция возвращает TRUE, если х меньше 10, иначе возвращает FALSE //**************************************************************** function XLess10(x : byte) : boolean; begin Result := FALSE; if x >= 10 then Exit; //Если х >= 10, то выйти из функции Result := TRUE; //и не выполнять этот код end; //**************************************************************** // Функция делит Х на Y. Если Y равен нулю, то деление отменяется, // а функция возвращает число -1000 //**************************************************************** function DivNum(x, y : byte) : single; begin if y = 0 then Exit(-1000); //Если у = 0, то выйти из функции Result := x / y; end; var N : byte; Z : single; begin Write('N = '); ReadLn(N); if XLess10(N) then WriteLn('N = 10'); Z := DivNum(100, N); if Z = -1000 then WriteLn('ERROR: Division by zero !!!') else WriteLn('100 / N = ', Z:0:4); ReadLn; Exit; //Здесь выходим из программы WriteLn('THE END'); //Этот код уже не будет выполнен ReadLn; end.
Комментарии довольно подробные. Так что всё должно быть понятно.
Здесь для примера есть две функции. Одну мы рассмотрели выше. А другая вызывает процедуру Exit, чтобы не случилось аварийное завершение программы из-за деления на ноль. Здесь также приведён пример использования процедуры Exit с параметром, возвращаемым функцией, которая вызвала процедуру Exit.
Ну и в конце выполняется прерывание программы. То есть последние две строки кода уже не будут выполнены, так как программа завершается с помощью функции Exit.
|
Как стать программистом 2.0
Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки… |
Влияние функции clrscr на код в Pascal и методы исправления
Функция clrscr в языке программирования Pascal предназначена для очистки экрана консоли перед выводом новой информации. Однако, в некоторых случаях она может не работать ожидаемым образом или вызывать ошибки.
Одна из проблем, связанных со функцией clrscr, заключается в том, что она может вызывать снижение производительности кода. Каждый раз при ее вызове происходит очистка всего экрана, что занимает довольно много времени. В результате программа может работать медленнее, особенно если clrscr используется внутри циклов или в случаях, когда очистка экрана не обязательна.
Кроме того, функция clrscr может вызвать некоторые проблемы при создании графических пользовательских интерфейсов. Она полностью стирает все содержимое окна, включая кнопки, поля ввода и другие элементы интерфейса, что делает его непригодным для использования в таких случаях.
Существуют несколько методов исправления проблем с функцией clrscr в Pascal:
- Использование альтернативных способов очистки экрана: вместо clrscr можно воспользоваться другими функциями или методами для очистки экрана. Например, в некоторых версиях Turbo Pascal можно использовать функцию TextMode(3), которая устанавливает текстовый режим и очищает экран. Также можно воспользоваться системными вызовами или вызвать команду очистки экрана из командной строки.
- Проверка необходимости очистки экрана: перед вызовом функции clrscr можно проверить, действительно ли необходимо очищать весь экран. Если выводимые данные занимают только небольшую часть экрана или clrscr используется внутри циклов, можно использовать другие методы очистки, например, перезаписывать только нужную часть экрана.
- Использование графических библиотек: если целью программы является создание графического пользовательского интерфейса, можно воспользоваться графическими библиотеками, которые обеспечивают процедуры для очистки экрана и работы с элементами интерфейса.
Вывод информации в консоль является важной частью программирования на Pascal, однако использование функции clrscr не всегда является оптимальным решением. Перед ее использованием следует тщательно оценить потенциальные проблемы и рассмотреть альтернативные способы достижения желаемого результата
1.2.12 KeyPressed
- Declaration
-
Function KeyPressed : Boolean;
Description
The Keypressed function scans the keyboard buffer and sees if a key has
been pressed. If this is the case, True is returned. If not,
False is returned. The Shift, Alt, Ctrl keys are not reported.
The key is not removed from the buffer, and can hence still be read after
the KeyPressed function has been called.
Errors
None.
See also
- Example
-
Program Example2; uses Crt; { Program to demonstrate the KeyPressed function. } begin WriteLn('Waiting until a key is pressed'); repeat until KeyPressed; { The key is not Read, so it should also be outputted at the commandline} end.
1.2.8 DelLine
- Declaration
-
Procedure DelLine ;
Description
DelLine removes the current line. Lines following the current line are
scrolled 1 line up, and an empty line is inserted at the bottom of the
current window. The cursor doesn’t move.
Errors
None.
See also
, ,
- Example
-
Program Example10; uses Crt; { Program to demonstrate the InsLine function. } begin ClrScr; WriteLn; WriteLn('Line 1'); WriteLn('Line 2'); WriteLn('Line 2'); WriteLn('Line 3'); WriteLn; WriteLn('Oops, Line 2 is listed twice,', ' let''s delete the line at the cursor postion'); GotoXY(1,3); ReadKey; DelLine; GotoXY(1,10); end.
Выполнение программы по шагам
Выполнение по шагам — это простейший способ выполнения программы по
элементарным фрагментам. Выбор команды Run → Step Over или нажатие клавиши F8 вызывает выполнение отладчиком всего кода в операторе, указанном строкой выполнения, включая любые вызываемые на ней процедуры или функции, пока управление не вернется обратно к вам. После этого строка выполнения указывает следующий выполняемый оператор.
Возьмем, например, следующую программу:
program StepTest; function Negate(X Integer) Integer; begin Negate = -X; end; var I Integer; begin for I = 1 to 10 do Writeln(Negate(I)); end.
Если в окне редактирования Вы выведете StepTest и нажмете клавишу F8, то строка выполнения перемещается на оператор begin в начале основного цикла, поскольку это первое, что выполняется в программе. Второе нажатие клавиши F8 выполняет begin и перемещает строку выполнения вниз до оператора for на следующей строке.
После этого нажатие F8 вызывает выполнение всего цикла for; на экран
пользователя выводятся числа от -1 до -10, а строка выполнения перемещается к end.
Хотя функция Negate и вызывается 10 раз, строка выполнения никогда на нее не перемещается. Выполнение по шагам позволяет отладчику не показывать детали любых вызовов для отдельной строки. Выполнение по шагам вызывает выполнение всего цикла for сразу, поэтому Вы не сможете видеть изменения в ходе выполнения цикла. Если же Вы хотите видеть подробности выполнения цикла, внесите в пример следующее простое изменение.
begin for I = 1 to 10 do WriteLn(Negate(I)); end.
Поскольку оператор Паскаля может занимать несколько строк, такая программа будет в точности эквивалентна предыдущей версии, и генерируемый код будет идентичен. Но поскольку оператор WriteLn теперь находится на отдельной строке, отладчик может интерпретировать его отдельно. Если теперь Вы будете нажимать клавишу F8, то увидите, что строка выполнения будет при выполнении цикла 10 раз возвращаться на WriteLn.
Простые операторы. Программирование алгоритмов линейной структуры
Оператор — предписание в языке программирования,
предназначенное для задания некоторого завершенного действия в процессе
переработки информации на ПЭВМ.
Основная часть программы на языке Паскаль
представляет собой последовательность операторов, каждый из которых производит
некоторое действие над данными. Операторы выполняются последовательно в том
порядке, в котором они записаны в тексте программы. Разделителем операторов
служит точка с запятой.
Все операторы языка Паскаль подразделяются на три
группы: простые, ввода-вывода и структурные. Фактически операторы ввода-вывода
являются обращением к стандартным процедурам, так как в Паскале нет специальных
операторов ввода-вывода. Однако по установившейся традиции такие обращения
называют операторами.
1.2.18 TextBackground
- Declaration
-
Procedure TextBackground (CL: Byte);
Description
TextBackground sets the background color to CL. CL can be one of the
predefined color constants.
Errors
None.
See also
, , ,
- Example
-
Program Example13; uses Crt; { Program to demonstrate the TextBackground function. } begin TextColor(White); WriteLn('This is written in with the default background color'); TextBackground(Green); WriteLn('This is written in with a Green background'); TextBackground(Brown); WriteLn('This is written in with a Brown background'); TextBackground(Black); WriteLn('Back with a black background'); end.
Замечания
Все символы на экране становятся пробелами, причем используются текущие текстовые атрибуты. Таким образом, если цвет фона, установленный с помощью процедуры TextBackground , не равен Black , то для всех символов на экране цвет фона устанавливается равным текущему. Это также относится к символам, очищаемым процедурами ClrEol , InsLine и DelLine , а также, ко всем пустым строкам, полученным при прокрутке экрана.
Процедура ClrScr является окно-относительной. Следующий отрывок программы определяет текстовое окно и очищает его.
Не всё, что изначально кажется простым, окажется таковым в конце.
В прошлый раз мы написали программу, которая здоровается с вами, выводя на экран приветственное сообщение «Привет!». Однако переключаясь в окно, где выводятся результаты выполнения программы, мы видели не только сообщение «Привет!», но и целый ряд служебных сообщений, которые Free Pascal выводит во время своего запуска.
Хотелось бы, чтобы наша программа перед выводом каких-либо сообщений очищала экран. Как это сделать? Очень просто: нужно добавить в программу вызов команды (процедуры) ClrScr (сокращение от английского «clear screen» — «очистить экран»).
Если ваша предыдущая программа hello.pas закрыта, то откройте её, нажав клавишу F3 (File | Open). Напоминаю, что все наши программы мы сохраняем в папке «C:FPC3.0.0work».
Чтобы не затереть файл hello.pas нашими модификациями, сохраним открытый файл hello.pas под другим именем. Откройте меню «File» (Alt + F) и нажмите «Save as. ». В поле «Name» напечатайте helloClr.pas ( Clr — сокр. от «clear» — очищать) и нажмите «OK», чтобы сохранить программу под новым именем. После этого модифицируйте текст программы так, чтобы он соответствовал нижеприведенному варианту:
Запустите программу, нажав Ctrl + F9.
Упс! Программа не запускается. Что говорит компилятор? (Напомню, что компилятор — Free Pascal — переводит нашу программу с языка Паскаль в машинные инструкции, понятные компьютеру). Компилятор сообщает, что у нас 3 ошибки. Одна с пометкой Error и две с пометкой Fatal. Но мы, глядя на текст сообщений, уже видим, что ошибка на самом деле ровно одна — Error: Identifier not found «ClrScr» — Ошибка: идентификатор «ClrScr» не найден.
Идентификатор — это имя. Компилятор не понимает, что такое ClrScr . Вспомним, в прошлый раз подобная ошибка у нас была, когда мы пропустили букву « e» в слове Writeln . Компилятор не знал, что такое Writln и из-за этого ругался. Может быть, мы допустили ошибку в названии процедуры (команды) ClrScr ? Смотрим внимательно. Нет ошибок? И тем не менее компилятор не понимает, что такое ClrScr .
Да, так и есть. Компилятор не знает, что такое ClrScr .
Но почему тогда он знает Writeln и не знает ClrScr ? Дело в том, что процедура (команда) Writeln относится к базовым процедурам Паскаля, а вот алгоритм работы процедуры ClrScr описан отдельно. Отдельно — означает в отдельном модуле (файле). И для того, чтобы компилятор Free Pascal знал, как работает эта процедура, вы должны указать в своей программе, что используете модуль Crt . Так называется модуль, в котором описан алгоритм процедуры ClrScr . Или как еще говорят: реализована процедура ClrScr .
Добавим к нашей программе недостающую строку « uses Crt; »:
Uses — по-английски означает «использует». Модуль Crt — тот самый модуль, в котором реализована процедура ClrScr .
Теперь мы можем запустить нашу программу (Ctrl + F9):
Что ж, на этот раз наша программа запустилась, и даже очистился экран, вот только вместо « Привет! » мы видим на экране какую-то белиберду. Т. е. Free Pascal не отображает русские буквы (кириллицу), если подключен модуль Crt и используется процедура ClrScr (эксперимент показывает, что даже если удалить строку с вызовом процедуры ClrScr , проблема с отображением кириллицы все равно остается).
Открываем браузер, и в поисковой строке гугла вбиваем «free pascal clrscr не отображает русские буквы»:
Первая же ссылка приводит нас на форум, где мы находим решение:
Чтобы исправить проблему с отображением русских букв (кириллицы), сохраняем нашу программу (F2 — File | Save), закрываем Free Pascal (Alt + X — File | Exit), и щелкаем правой кнопкой мыши на ярлыке запуска Free Pascal, расположенном на нашем Рабочем столе.
Открываем пункт «Свойства» и переходим на закладку «Шрифт».
Возвращаем «Точечные шрифты», размер выставляем «10 x 18». Нажимаем «ОК».
И снова запускаем Free Pascal:
Как видите, вид окна поменялся.
Запускаем нашу программу (Ctrl + F9), нажимаем Alt + F5, чтобы переключиться в окно результатов работы программы, и видим результат:
Экран очищен, на экран выведено сообщение « Привет! ».
Вывод данных на экран. Форматированный вывод
Вывод данных на экран и в файл в языке программирования Pascal осуществляется с помощью процедур и . Здесь будет рассмотрен вывод только на экран.
Допустим, нам требуется отобразить на экране пару фраз. Если мы хотим, чтобы каждая из них начиналась с новой строки, следует использовать , если нет – то .
нередко используется, когда надо вывести для пользователя сообщение на экран, после чего получить данные, не переводя курсора на новую строку. Например, выводим на экран и не переводим курсор на новую строку, а ждем ввода.
Еще один пример. В памяти компьютера хранятся данные. Из программы мы обращаемся к ним с помощью переменных num, fl и st. Вывести их значения на экран можно по-разному.
Во втором случае мы видим, что процедуры вывода, как , так и , позволяют конструировать выводимую информацию из различных частей (строковых литералов и переменных).
В третьем случае был осуществлен так называемый форматированный вывод. При этом для выводимого значения указывается ширина поля вывода (количество знакомест). Если мы выводим дробное значение, то вторым числом через двоеточие указывается количество знаков после запятой. Если для вещественных чисел не осуществлять форматирование, то они отобразятся так, как определено для данного компьютера. Если указать только число знакомест без фиксирования дробной части, то вывод будет в экспоненциальной форме.
Unicode (UTF8) вывод
Если вы хотите, чтобы ваша программа в режиме консоли отображала вывод Unicode (UTF8) в Windows Vista и более поздних версиях (а также, возможно, в более ранних версиях), вы можете использовать команду SetConsoleOutputCP для задания консоли набор символов UTF8.
Примечание: вам нужно будет убедиться, что шрифт консоли может отображать буквы, которые вы хотите вывести (например, греческий, кириллица, корейский).
Примечание: вам нужно будет включить модуль Windows.
См. Поддержка Unicode LCL для получения более подробной информации о поддержке Unicode в Lazarus и FPC.
Пример программы:
program uniconsole; {$mode objfpc}{$H+} {$APPTYPE CONSOLE} uses {$IFDEF UNIX} {$IFDEF UseCThreads} cthreads, {$ENDIF} {Диспетчер широких строк, необходимый для поддержки широких строк} cwstring, {$ENDIF} {$IFDEF WINDOWS} Windows, {для setconsoleoutputcp} {$ENDIF} Classes ; var UTF8TestString string; begin {$IFDEF WINDOWS} SetConsoleOutputCP(CP_UTF8); {$ENDIF} UTF8TestString:= 'rosé, водка and ούζο'; writeln ('plain: ' + UTF8TestString); {Видимо для этого нам не нужен UTF8ToConsole Фактически, UTF8ToConsole для меня ничего не сделал.} end.