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

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

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

mpeg
новенький
Сообщения: 14
Зарегистрирован: 19.04.2012 15:29:05

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

Сообщение mpeg »

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

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

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

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

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

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

P.S: Надеюсь понятно объяснил суть проблемы... :roll:
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Нужно подключить модуль Crt и там есть процедура очистки экрана под названием ClrScr.
Oleg_D
постоялец
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Сообщение Oleg_D »

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

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

Код: Выделить всё

for i:=1 to 25 do Writeln;
tema
постоялец
Сообщения: 376
Зарегистрирован: 24.03.2011 19:19:27

Сообщение tema »

Вот из исходников фрипаскаля:

Код: Выделить всё

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;
Аватара пользователя
Vapaamies
постоялец
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Vapaamies »

Oleg_D писал(а):

Код: Выделить всё

for i:=1 to 25 do Writeln;

Если уж на то пошло, то (по аналогии с Delphi):

Код: Выделить всё

Write(StringOfChar(sLineBreak, 25));

Если FreePascal полностью совместим с Delphi по System, должно сработать.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

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

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

Если кто не занл, для Delphi тоже есть модуль CRT. Можно взять на ихнем сайте. Ссылку не привожу, потому, что там нужно регистрироваться, иначе скачать ничего не дадут.
Oleg_D
постоялец
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Сообщение Oleg_D »

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 необходимо также указать путь к папке со стандартными модулями. Для неопытного пацана эта миссия иногда может оказаться невыполнимой.
mpeg
новенький
Сообщения: 14
Зарегистрирован: 19.04.2012 15:29:05

Сообщение mpeg »

Спасибо большое за ответы. :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
Аватара пользователя
Paster Fob
постоялец
Сообщения: 188
Зарегистрирован: 22.02.2011 20:53:36
Откуда: Новосибирск.

Сообщение Paster Fob »

Раздел описания модулей объявляется до раздела описания констант.В главной программе сразу после служебного слова begin нужно указать процедуру очистки экрана clrscr.

Код: Выделить всё

uses 
  crt;
const
  ....;
type
  .....;
var
  ...;
begin
  clrscr;
  .......
end.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

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

Это потому, что винду давно надо на помойку выбросить. У неё для одного языка 47,5 кодировок. :D
Я себя от этого подстраховал, поставив кодировку консоли кв реестре. ;)
mpeg
новенький
Сообщения: 14
Зарегистрирован: 19.04.2012 15:29:05

Сообщение mpeg »

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

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

Вывод: не дружит данный модуль с русскими буквами кажется... :D
Аватара пользователя
Paster Fob
постоялец
Сообщения: 188
Зарегистрирован: 22.02.2011 20:53:36
Откуда: Новосибирск.

Сообщение Paster Fob »

Я пытаюсь разобраться с функцией 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 нулевой).Но при заполнении этих самых байтов символами строка заполняется только до позиции символа в кодировке почему так?И что происходит с нулевым байтом?
Oleg_D
постоялец
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Сообщение Oleg_D »

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

Вы сами и ответили, - в нулевой байт тоже попадает заполняющий код. А поскольку он играет особую роль, так и получается. Вообще, процедуру FillChar для строк обычно не применяют, - не имеет особого смысла, особенно для современных динамических строк. В данном случае над воспользоваться циклом.
tema
постоялец
Сообщения: 376
Зарегистрирован: 24.03.2011 19:19:27

Сообщение tema »

Код: Выделить всё

  fillchar(s,sizeof(s),ch);
  setlength(s,255);


Добавлено спустя 1 минуту 42 секунды:
Можно и

Код: Выделить всё

  setlength(s,sizeof(s));
Аватара пользователя
Vapaamies
постоялец
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Vapaamies »

tema писал(а):Можно и

Код: Выделить всё

  setlength(s,sizeof(s));

Сомнительно. Я бы попробовал функцию High вместо SizeOf.
Ответить