Вопросы по теме книги

Книга адресована школьникам средних и старших классов, желающим испытать себя в «олимпийских схватках». Может быть полезна студентам-первокурсникам и преподавателям информатики.

Модераторы: Oleg_D, Модераторы

Вопросы по теме книги

Сообщение mpeg » 09.09.2012 17:13:34

Текст книги:
Глава 5.
"...В первых строчках видим служебное сообщение о запуске IDE Free Pascal, – не смотрите туда.
Нам важна последняя строка, где мы видим долгожданный «Привет!».
Полюбовавшись на него, вернитесь в IDE, для чего нажмите любую клавишу.
Хотите повторить удовольствие? Так запустите программу еще пару раз («Ctrl+F9») и полюбуйтесь на результат («Alt+F5»)."

Вопрос знатокам!

В QuikBasic есть очень удобная команда "cls", которая очищает мне экран просмотра выполнения моей программы в Интегри́рованной среде разрабо́тки.
Я ставлю её в вверху каждой учебной программы и... смотрю результаты на экране только самого свежего запуска программы на выполнение.

Как того же добиться в Free Pascal?

Я форматирую текст своих учебных программ в процессе экспериментов методом:
const Line = ’---------------------------’;
Writeln(Line);
, но это помогает слабо.

Хотелось бы оператор узнать который автоматом чистит чёрный экран просмотра от оставшихся строк старых запусков программы на выполнение в среде Free Pascal.

P.S: Надеюсь понятно объяснил суть проблемы... :roll:
mpeg
новенький
 
Сообщения: 14
Зарегистрирован: 19.04.2012 15:29:05

Re: Вопросы по теме книги

Сообщение Vadim » 09.09.2012 18:40:57

Нужно подключить модуль Crt и там есть процедура очистки экрана под названием ClrScr.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Вопросы по теме книги

Сообщение Oleg_D » 09.09.2012 21:41:15

Vadim писал(а):Нужно подключить модуль Crt и там есть процедура очистки экрана под названием ClrScr.

К этому добавлю что я сознательно не подключал модуль Crt, как и другие модули, чтобы сохранить переносимость примеров (ведь есть ещё Delphi и PascalABC). Альтернативный способ очистки экрана может быть таким:
Код: Выделить всё
for i:=1 to 25 do Writeln;
Oleg_D
постоялец
 
Сообщения: 390
Зарегистрирован: 09.05.2011 11:28:36

Re: Вопросы по теме книги

Сообщение tema » 09.09.2012 22:59:38

Вот из исходников фрипаскаля:
Код: Выделить всё
procedure ClrScr;
var
  DestCoor: TCoord;
  numChars, x : DWord;
begin
  DestCoor.X := WindMinX - 1;
  DestCoor.Y := WindMinY - 1;
  numChars := (WindMaxX - WindMinX + 1);

  repeat
    FillConsoleOutputAttribute(GetStdHandle(STD_OUTPUT_HANDLE), TextAttr,
      numChars, DestCoor, x);
    FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), #32,
      numChars, DestCoor, x);
    inc(DestCoor.Y);
  until DWord(DestCoor.Y)=WindMaxY;

  GotoXY(1, 1);
end; { proc. ClrScr }

А для юникса чуть по другому:
Код: Выделить всё
Procedure ClrScr;
{
  Clear the current window, and set the cursor on 1,1
}
Var
  CY,i      : Longint;
  oldflush  : boolean;
  blank_with_attribute : TCharAttr;

Begin
  { See if color has changed }
  if OldTextAttr<>TextAttr then
   begin
     i:=TextAttr;
     TextAttr:=OldTextAttr;
     ttyColor(i);
   end;
  oldflush:=ttySetFlush(Flushing);
  if FullWin then
   begin
     if not OutputRedir then
      ttySendStr(#27'[H'#27'[2J');
     CurrX:=1;
     CurrY:=1;
     blank_with_attribute.ch   := ' ';
     blank_with_attribute.attr := TextAttr;
     FillWord(ConsoleBuf^,ScreenWidth*ScreenHeight,word(blank_with_attribute));
   end
  else
   begin
     For Cy:=WindMinY To WindMaxY Do
      DoEmptyLine(Cy,WindMinX,WindMaxX);
     GoToXY(1,1);
   end;
  ttySetFlush(oldflush);
End;
tema
постоялец
 
Сообщения: 375
Зарегистрирован: 24.03.2011 20:19:27

Re: Вопросы по теме книги

Сообщение Vapaamies » 10.09.2012 00:15:23

Oleg_D писал(а):
Код: Выделить всё
for i:=1 to 25 do Writeln;

Если уж на то пошло, то (по аналогии с Delphi):
Код: Выделить всё
Write(StringOfChar(sLineBreak, 25));

Если FreePascal полностью совместим с Delphi по System, должно сработать.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 291
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: Вопросы по теме книги

Сообщение Vadim » 10.09.2012 02:50:59

Oleg_D писал(а):К этому добавлю что я сознательно не подключал модуль Crt, как и другие модули, чтобы сохранить переносимость примеров (ведь есть ещё Delphi и PascalABC).

А я принципиально не изобретаю велосипед, если есть уже готовое решение, притом кроссплатформенное. ;)

Если кто не занл, для Delphi тоже есть модуль CRT. Можно взять на ихнем сайте. Ссылку не привожу, потому, что там нужно регистрироваться, иначе скачать ничего не дадут.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Вопросы по теме книги

Сообщение Oleg_D » 10.09.2012 08:30:17

Oleg_D писал(а):
Vadim писал(а):Нужно подключить модуль Crt и там есть процедура очистки экрана под названием ClrScr.

К этому добавлю что я сознательно не подключал модуль Crt, как и другие модули, чтобы сохранить переносимость примеров (ведь есть ещё Delphi и PascalABC). Альтернативный способ очистки экрана может быть таким:
Код: Выделить всё
for i:=1 to 25 do Writeln;

А вот ещё один альтернативный способ:
Код: Выделить всё
const Clr = #10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10;
begin
  Writeln(Clr);
  Readln
end.

Я не применял uses Crt как для совместимости, так и по дидактическим соображениям, поскольку модульное программирование рассматривается в конце книги. Не хотелось вынуждать новичка вставлять в программу то, чего он не понимает.

Добавлено спустя 17 минут 48 секунд:
И ещё: при подключении модуля Crt необходимо также указать путь к папке со стандартными модулями. Для неопытного пацана эта миссия иногда может оказаться невыполнимой.
Oleg_D
постоялец
 
Сообщения: 390
Зарегистрирован: 09.05.2011 11:28:36

Re: Вопросы по теме книги

Сообщение mpeg » 10.09.2012 20:09:43

Спасибо большое за ответы. :D

Меня устроил такой вариант:

Код: Выделить всё
const Clr = #10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10;
begin
  Writeln(Clr);
  Бла - Бла - Бла - здесь моя тестовая учебная программа... :)
end.


Vadim писал(а):Нужно подключить модуль Crt и там есть процедура очистки экрана под названием ClrScr.

Этот вариант что-то не получился у меня.
Вроде подключил всё как положено в гл.59... экран чистится - это без проблем. Но!
Русские буквы в программе заменились на крякозябры.
Пробовал во Free Pascal 2.6.0 :|
----------------------------------------------------
Ещё раз всем спасибо за советы. :D
mpeg
новенький
 
Сообщения: 14
Зарегистрирован: 19.04.2012 15:29:05

Re: Вопросы по теме книги

Сообщение Paster Fob » 11.09.2012 06:55:19

Раздел описания модулей объявляется до раздела описания констант.В главной программе сразу после служебного слова begin нужно указать процедуру очистки экрана clrscr.
Код: Выделить всё
uses
  crt;
const
  ....;
type
  .....;
var
  ...;
begin
  clrscr;
  .......
end.
Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

Re: Вопросы по теме книги

Сообщение Vadim » 11.09.2012 13:34:57

mpeg писал(а):Этот вариант что-то не получился у меня.
Вроде подключил всё как положено в гл.59... экран чистится - это без проблем. Но!
Русские буквы в программе заменились на крякозябры.
Пробовал во Free Pascal 2.6.0 :|

Это потому, что винду давно надо на помойку выбросить. У неё для одного языка 47,5 кодировок. :D
Я себя от этого подстраховал, поставив кодировку консоли кв реестре. ;)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Вопросы по теме книги

Сообщение mpeg » 11.09.2012 17:41:31

Я в Turbo Pascal модуль Crt подключил ради эксперимента...
дык... подключения этого модуля сделало невозможным вообще уже в самом тексте программы русскими буквами писать.

Хотя без этого модуля в Turbo Pascal пишу тексты русскими буквами спокойно.
Без проблем компилирую и получаю выполнение с русскими же буквами.

Вывод: не дружит данный модуль с русскими буквами кажется... :D
mpeg
новенький
 
Сообщения: 14
Зарегистрирован: 19.04.2012 15:29:05

Re: Вопросы по теме книги

Сообщение Paster Fob » 13.09.2012 15:35:25

Я пытаюсь разобраться с функцией Fillchar описанной в главе 46.С массивами всё ясно,а вот со строками непонятка.
пример:
Код: Выделить всё
var s:string;
    ch:char;
begin
  writeln(sizeof(s));
  readln(ch);
  fillchar(s,sizeof(s),ch);
  writeln(s);
  readln
end.

функция sizeof показывает что в строке 256 байтов(1 нулевой).Но при заполнении этих самых байтов символами строка заполняется только до позиции символа в кодировке почему так?И что происходит с нулевым байтом?
Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

Re: Вопросы по теме книги

Сообщение Oleg_D » 13.09.2012 15:58:51

Paster Fob писал(а):Но при заполнении этих самых байтов символами строка заполняется только до позиции символа в кодировке почему так?И что происходит с нулевым байтом?

Вы сами и ответили, - в нулевой байт тоже попадает заполняющий код. А поскольку он играет особую роль, так и получается. Вообще, процедуру FillChar для строк обычно не применяют, - не имеет особого смысла, особенно для современных динамических строк. В данном случае над воспользоваться циклом.
Oleg_D
постоялец
 
Сообщения: 390
Зарегистрирован: 09.05.2011 11:28:36

Re: Вопросы по теме книги

Сообщение tema » 13.09.2012 16:02:12

Код: Выделить всё
  fillchar(s,sizeof(s),ch);
  setlength(s,255);


Добавлено спустя 1 минуту 42 секунды:
Можно и
Код: Выделить всё
  setlength(s,sizeof(s));
tema
постоялец
 
Сообщения: 375
Зарегистрирован: 24.03.2011 20:19:27

Re: Вопросы по теме книги

Сообщение Vapaamies » 14.09.2012 03:55:38

tema писал(а):Можно и
Код: Выделить всё
  setlength(s,sizeof(s));

Сомнительно. Я бы попробовал функцию High вместо SizeOf.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 291
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

След.

Вернуться в Книга "Песни о Паскале"

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru
cron