Не всё, что изначально кажется простым,
окажется таковым в конце.
В прошлый раз мы написали программу, которая здоровается с вами, выводя на экран приветственное сообщение «Привет!». Однако переключаясь в окно, где выводятся результаты выполнения программы, мы видели не только сообщение «Привет!», но и целый ряд служебных сообщений, которые Free Pascal выводит во время своего запуска.
Хотелось бы, чтобы наша программа перед выводом каких-либо сообщений очищала экран. Как это сделать? Очень просто: нужно добавить в программу вызов команды (процедуры) ClrScr (сокращение от английского «clear screen» — «очистить экран»).
Если ваша предыдущая программа hello.pas закрыта, то откройте её, нажав клавишу F3 (File | Open). Напоминаю, что все наши программы мы сохраняем в папке «C:\FPC\3.0.0\work».
Чтобы не затереть файл hello.pas нашими модификациями, сохраним открытый файл hello.pas под другим именем. Откройте меню «File» (Alt + F) и нажмите «Save as…». В поле «Name» напечатайте helloClr.pas (Clr — сокр. от «clear» — очищать) и нажмите «OK», чтобы сохранить программу под новым именем. После этого модифицируйте текст программы так, чтобы он соответствовал нижеприведенному варианту:
program helloClr; begin ClrScr; Writeln( 'Привет!' ); end.
Запустите программу, нажав 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;»:
program helloClr; uses Crt; begin ClrScr; Writeln( 'Привет!' ); end.
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, чтобы переключиться в окно результатов работы программы, и видим результат:
Экран очищен, на экран выведено сообщение «Привет!».
Краткое содержание урока
✔ Мы узнали как правильно закрывать Free Pascal (раньше вы, скорее всего, просто нажимали на крестик в правом верхнем углу окна):
- Alt + X (File | Exit) — закрыть Free Pascal.
✔ Дополнили нашу программу «Привет!» очисткой экрана:
program helloClr; uses Crt; begin ClrScr; Writeln( 'Привет!' ); end.
✔ Узнали новое ключевое слово языка Паскаль:
- uses — ключевое слово, после которого перечисляются все модули, используемые нами в программе.
✔ Познакомились с еще одной процедурой:
- ClrScr — очищает экран от текста.
✔ Узнали о существовании модуля Crt.
✔ И наконец, мы впервые столкнулись с проблемой на уровне инструмента (Free Pascal): когда после подключения модуля Crt у нас перестали отображаться русские буквы (кириллица) в окне результатов. Мы не разобрались, почему это происходит, т. к. причины скрыты внутри модуля Crt. Можно ли выяснить причины, по которым у нас возникла проблема с кириллицей? Чисто теоретически, да. Но для этого нам бы понадобились знания, которые выходят за рамки наших уроков. Поэтому мы воспользовались обходным решением (workaround) — поменяли используемый в программе шрифт Lucida Console на точечный шрифт.
И вот здесь я хочу остановиться подробнее
При реализации нашей программы у нас возникла проблема с кириллицей, которую мы решили. Казалось бы — вопрос снят: экран очищается, сообщение отображается. Но обратите внимание, что мы отказались от использования шрифта Lucida Console, который смотрится гораздо опрятнее точечного шрифта. Т. е. наше решение (или правильнее, обходное решение) далеко от идеального.
Приведу аналогию. Представьте себе, что вы — работник дорожной службы, которому поручили на такой-то улице нарисовать «зебру» и поставить соответствующие знаки пешеходного перехода. Вы приехали на заданную улицу и обнаружили, что в том месте, где вам надо рисовать «зебру», из-под асфальта бьет фонтан воды, и образовалась лужа. Какие у вас есть варианты действий:
- Выяснить откуда вода (скорее всего, прорвало трубу), устранить течь, высушить лужу и уже после этого рисовать «зебру».
- Нарисовать «зебру» 50 метрами ниже (или выше) — там, где нет воды, и где дорожные условия позволяют это сделать.
Так вот, второй вариант — это и есть обходное решение (workaround). Оно может иметь серьезные недостатки. Например, школа находится именно там, где и надо было изначально рисовать «зебру», и если вы нарисуете её ниже (выше), то далеко не все школьники дойдут до этой зебры, а значит, на изначальном участке дороги будет повышенная аварийность из-за школьников, перебегающих дорогу в неположенном месте.
А что нужно, чтобы пойти по пути первого варианта? Другие компетенции. Если вы не владеете нужными навыками (и инструментами) — у вас нет экскаватора, чтобы добраться до трубопровода, сварочного аппарата и т. д. — то вам нужно ждать, когда другие люди решат возникшую проблему, прежде чем вы сможете нарисовать «зебру» именно там, где вам надо. В нашем примере это означает, что вы должны написать письмо разработчикам Free Pascal, описать возникшую проблему (некорректное отображение кириллицы после подключения модуля Crt), и ждать, когда разработчики устранят эту ошибку в модуле Crt. На всё это может уйти неопределенное время. Или разработчикам Free Pascal будет вообще не до этой проблемы, и ваша «лужа» так никуда и не денется.
Другой сценарий: обладая нужными навыками, устранить самому эту проблему в модуле Crt. А для этого нужно знать, что такое дизассемблирование, обратная разработка (reverse engineering) и т. д.
Идеальный вариант — это, конечно, когда лужу устраняют те, кто за нее отвечают. Т. е. разработчики Free Pascal. Но мы живем не в идеальном мире, и поэтому нам иногда приходится использовать обходные решения.
И последнее: когда ваши программы перестанут вмещаться на одну страницу экрана, и будут занимать сотни, а то и больше, страниц, у вас могут тоже возникать подобные ситуации. Когда что-то идет не так и нужно найти причины проблемы, а потом её решение. И вот тут может возникнуть соблазн «передвинуть «зебру» на 50 метров выше или ниже» (использовать обходное решение) вместо того, чтобы разбираться, почему возникла проблема и как её устранить. В случае, когда речь идет о вашей зоне ответственности, такой подход, в целом, недопустим (!). Вы должны всегда понимать, что и почему происходит в вашей программе. Если оказывается, что программа ведет себя не так, как вы это задумывали, надо разбираться, почему она себя так ведет (откуда лужа?), а не цепляться за первое попавшееся решение, которое вроде бы «решает» вашу проблему.
Задания
- Что будет выведено на экране после запуска следующей программы?
program helloClr; uses Crt; begin ClrScr; ClrScr; Writeln( 'Привет!' ); end.
- А после запуска такой программы?
program helloClr; uses Crt; begin ClrScr; Writeln( 'Привет!' ); ClrScr; Writeln( 'Пока!' ); end.
- Исправьте все ошибки в следующей программе, и запустите исправленный вариант:
progrann helloClr; use Crt; begin ClrScr Writeln( Привет!' ); end;
Языковая подсказка:
«illegal character» переводится как «некорректный символ».
Задания повышенной сложности
- Напишите программу, которая выведет на чистый экран текст программы hello.pas (см. урок 1).
Подсказки:
1) чтобы вывести на экран пустую строку, используйте команду «Writeln;» (без скобок и одинарных кавычек);
2) для отступов используйте по 3 пробела;
3) чтобы вывести одинарные кавычки на экран, используйте по 2 одинарных кавычки, например: «Writeln( »’Привет»’ );» напечатает на экране не просто Привет, а ‘Привет’.
Непонятно почему в скобках по 3 кавычки? Смотрите: самая левая и самая правая одинарные кавычки обрамляют тот текст, который мы хотим вывести на экран, например:
Writeln( ‘Кафе Огонёк’ );
А что делать, если нам нужно в сообщении вывести одинарные кавычки? Ведь они задействованы в качестве служебных символов, по которым Free Pascal определяет, где наша строка в программе начинается, а где заканчивается. Вот поэтому Free Pascal говорит: хочешь вывести в своей строке одну одинарную кавычку, поставь их две (!) друг за дружкой, и я буду знать, что это не конец строки, а всего лишь обычная одинарная кавычка, которую ты хочешь напечатать.
Например, вот так:
Writeln( ‘Кафе »Огонек» открывается сегодня’ );
Команда выше выведет на экран сообщение:
Кафе ‘Огонек’ открывается сегодня
- Подумайте, легко ли написать программу, которая выведет на экран саму себя, т. е. свой собственный текст (такая программа называется куайн — по-английски, quine)?
{Для з*д***ых epsil:(0..1) и x вычисляется S(n;x)=Sum(i:0..n) u(i;x), где u(i;x)=((-)^i*x^(2i)/(2i)! и n=Min[k>=0:Abs(u(k;x))<=epsil] } uses crt; type Float=Single; var x, {*ргуме*т} epsil, {п*р*метр точ*ости} s:Float; l,n:Integer; fout:Text; procedure cost(x,eps:Float;var s:Float;var n:Integer); {Вычисле*ие ч*стич*ой суммы ряд* s; выход*ые п*р*метры: x-*ргуме*т фу*кции, eps-п*р*метр точ*ости; выход*ые п*р*метры: s-з**че*ие ч*стич*ой суммы, n-*омер послед*его сл*г*емого, *еяв*о з*д*в*емый к*к n=Min[k>=0:Abs(u(k;x))<=epsil] } {Д*лее при з*писи утвержде*ий использов**ы обоз**че*ия: s(i)=Sum(j:0..i) u(j), u(j)=(-)^j*x^(2j)/(2j)!. Вычисле*ия производятся по рекурре*т*ым соот*оше*иям: u(i)=u(i-1)*(-x*x)/(d(i); d(i)=2i(2i);d(i)=d(i-1)+dd(i); dd(i)=8i;dd(i)=dd(i-1)+8; } var u, {сл*г*емое} w:Float; i,d,dd:Integer; begin {sint} i:=0; dd:=0; d:=0; u:=x; s:=x; w:=-x*x; {s=s(i)& u=u(i)& i=0} while abs(u)>eps do begin {s=s(i)& u=u(i)& d=d(i)& dd=dd(i)& i<n } i:=i+1; dd:=dd+8; d:=d+dd; u:=u*w/d; s:=s+u; {s=s(i)& u=u(i)& d=d(i)& dd=dd(i)& i<=n) } end {while}; {s=s(n)& u=u(n) } i:=n end {sint}; procedure Input(var eps:Float); {З*прос и вычисле*ие п*р*метр* точ*ости eps в*еш*ий эффект: ввод с кл*ви*туры целого p>0, т*кого, что Eps=10^(-p); выход*ой п*р*метр eps-п*р*метр точ*ости. } var p:Byte; begin {Input} Writeln('Epsilon=10^(-p);Введите p(p>0):');Readln(p); eps:=exp(-p*ln(10.0)); end {Input}; begin {Main} clrscr; Assign(fout,'sinSngl.dat'); Rewrite(fout); Write(fout,'Single... '); Input(epsil); {ввод п*р*метр* точ*ости} Writeln(fout,'Epsilon=',epsil:10); x:=Pi/6; for l:=1 to 6 do begin Write(fout,'x=',x:10:7); cost(x,epsil,x,n); Writeln(fout,'S(x)=',s:16,':: Cos x=',Cos(x):16,'n=',n:4); x:=x+2.*Pi; end {for}; Close(fout); readln end.
![](data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%200%200'%3E%3C/svg%3E)
Author
Topic: ClrScr; Error: Identifier not found «ClrScr» (Read 14543 times)
Faab
- New Member
- Posts: 14
-
I want use in my code function for screenclearing:
ClrScr;
But i have an error: Error: Identifier not found «ClrScr»
Why?
« Last Edit: April 10, 2013, 06:40:00 pm by Faab »
Logged
Add unit «Crt» to your uses.
Logged
Faab
- New Member
- Posts: 14
-
THX
Logged
INTELLIGENT WORK FORUMS
FOR COMPUTER PROFESSIONALS
Contact US
Thanks. We have received your request and will respond promptly.
Log In
Come Join Us!
Are you a
Computer / IT professional?
Join Tek-Tips Forums!
- Talk With Other Members
- Be Notified Of Responses
To Your Posts - Keyword Search
- One-Click Access To Your
Favorite Forums - Automated Signatures
On Your Posts - Best Of All, It’s Free!
*Tek-Tips’s functionality depends on members receiving e-mail. By joining you are opting in to receive e-mail.
Posting Guidelines
Promoting, selling, recruiting, coursework and thesis posting is forbidden.
Students Click Here
doubt in clrscrdoubt in clrscr(OP) Hai friends, In this simple program: program test(input,output); Here, in this program in line 3 (ie) clrscr; Its giving an error saying unknown identifier. I want to clear the screen and show the output. Kindly advice me as regards this. Regards Red Flag SubmittedThank you for helping keep Tek-Tips Forums free from inappropriate posts. |
Join Tek-Tips® Today!
Join your peers on the Internet’s largest technical computer professional community.
It’s easy to join and it’s free.
Here’s Why Members Love Tek-Tips Forums:
Talk To Other Members
- Notification Of Responses To Questions
- Favorite Forums One Click Access
- Keyword Search Of All Posts, And More…
Register now while it’s still free!
Already a member? Close this window and log in.
Join Us Close
Recommended Answers
The sqrt function returns a value of type Extended. ( number with a decimal point in it.) Internally these numbers are stored differently then Integer or LongInt.
That’s why they are called incompatible types.
Jump to Post
If I where you I would not make the calculation with integers.
This is typically something where real numbers (and even complex numbers!) are involved. So get rid of the DIV, make A,B,C etc. real or extended.
Jump to Post
On which line do you get the error?
You also must test if InsideRoot is negative or not.
Ever took the square root of a negative number? That’s where complex numbers creep in…
Jump to Post
All 10 Replies
ddanbe
2,724
Professional Procrastinator
Featured Poster
The sqrt function returns a value of type Extended. ( number with a decimal point in it.) Internally these numbers are stored differently then Integer or LongInt.
That’s why they are called incompatible types.
Oohhh, that makes sense… Cheers mate.
Is there anyway i can change the output of the Sqrt to Integer? Setting it to 2 d.p. or anything?
ddanbe
2,724
Professional Procrastinator
Featured Poster
If I where you I would not make the calculation with integers.
This is typically something where real numbers (and even complex numbers!) are involved. So get rid of the DIV, make A,B,C etc. real or extended.
i’ve made the quadratic bit into a separate program, i got it working and changed a few things as you suggested, but now i get error 127 whenever i run it, i cant see where this comes from.. any help?
(the error comes up after i type in C and says Exitcode 217)
Program Quadratic;
Uses Crt, Math;
Label 1;
Var
A, B, C, InsideRoot, MinusB, TWOA, Final1, Final2 : Real;
Answer1, Answer2, SqrtInside, SqrtInside2 : Extended;
Begin
1:Clrscr;
Write('Now for this, ill need a b and c.');
Readln;
ClrScr;
Write('Please enter a:');
Readln(A);
Write('Please enter b:');
Readln(B);
Write('Please enter c:');
Readln(C);
MinusB := 0-B;
InsideRoot := (B*B) - (4*A*C);
SqrtInside := Sqrt(InsideRoot);
SqrtInside2 := Round(SqrtInside);
Answer1 := (-B + SqrtInside2) / (2*A);
Answer2 := (-B - SqrtInside2) / (2*A);
Writeln('Your answer is: ', Answer1);
Write('Or: ', Answer2);
Readln;
ClrScr;
Write('Press any key to continue..');
Readkey;
Goto 1;
End.
ddanbe
2,724
Professional Procrastinator
Featured Poster
On which line do you get the error?
You also must test if InsideRoot is negative or not.
Ever took the square root of a negative number? That’s where complex numbers creep in…
How do i find what line the error appears on? it doesnt say >.>
(im really bad at this, started today at my teachers suggestion, im doing Computing next year)
Edit: also, how do i check if its negative? Although with quadratics, if its a negative it means its unsolvable or you’ve typed it in wrong..
ddanbe
2,724
Professional Procrastinator
Featured Poster
The if statement was invented for that.
if InsideRoot < 0 then —>negative, give a message about complex roots and stop(for the moment)
else —>continue the calculation
I don’t know what exitcode 217 means, have you documentation about the errors?
Delete line 21, why should you Round SqrtInside?
okay, i’ve changed it to this…
Program Quadratic;
Uses Crt, Math;
Label 1;
Var
A, B, C, InsideRoot, BSquared, SecondPart : Real;
Answer1, Answer2, SqrtInside, SqrtInside2 : Extended;
Begin
1:Clrscr;
Write('Now for this, ill need a b and c.');
Readln;
ClrScr;
Write('Please enter a:');
Readln(A);
Write('Please enter b:');
Readln(B);
Write('Please enter c:');
Readln(C);
BSquared := B*B;
SecondPart := 4*A*C;
InsideRoot := BSquared - SecondPart;
If insideroot <= 0 then
Begin
Write('Please make sure you tpyed it in correctly.');
Writeln('This equation does not work, please try again');
Readkey;
Goto 1;
End;
If insideroot > 0 then
Begin
SqrtInside := Sqrt(InsideRoot);
Answer1 := ((0-B) + SqrtInside) / (2*A);
Answer2 := ((0-B) - SqrtInside) / (2*A);
Writeln('Your answer is: ', Answer1);
Write('Or: ', Answer2);
Readln;
ClrScr;
Write('Press any key to continue..');
Readkey;
Goto 1;
End;
End.
The exception has gone, but now it ALWAYS says the equation does not work…
NEVERMIND, i got the equation wrong, it should be -4*A*C
Thanks Dude, helped me get it working.
ddanbe
2,724
Professional Procrastinator
Featured Poster
Check your if statements once again. 0 is a perfectly legal value to calculate here, it will give you two equal roots which have the value -b/2a.
Glad to be of help, mark this as solved.
Reply to this topic
Be a part of the DaniWeb community
We’re a friendly, industry-focused community of developers, IT pros, digital marketers,
and technology enthusiasts meeting, networking, learning, and sharing knowledge.