Объясните новичку.

Форум для изучающих FPC и их учителей.

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

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

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

Идём дальше.Oleg_D в вашей книге привидена таблица кодировок ASCII.Написано что от 0-31 это управляющие символы и даны их обозначения.Я запустил такую программку:

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

var n: integer;
begin
  for n:=0 to 255 do
    Writeln(n,'  ', Char(n));
  readln
end.

В результате вышло совсем не так как в таблице.Вот скрин:

Изображение

Почему так или я опять что-то путаю?Да и кстати почему когда я запускаю эту программу пищит динамик в ПК?
Oleg_D
постоялец
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Сообщение Oleg_D »

Brainenjii писал(а):Oleg_D: не знаю, считается ли это подсказкой, но если судить по книге - то к 24 главе Maxizar'овскую задачку решить вполне себе можно ^_^

Подсказкой не считается :) Это нам, опытным волкам, все кажется просто.

Добавлено спустя 13 минут 19 секунд:
Paster Fob писал(а):Идём дальше.Oleg_D в вашей книге привидена таблица кодировок ASCII.Написано что от 0-31 это управляющие символы и даны их обозначения.Я запустил такую программку:

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

var n: integer;
begin
  for n:=0 to 255 do
    Writeln(n,'  ', Char(n));
  readln
end.

В результате вышло совсем не так как в таблице.
Почему так или я опять что-то путаю?Да и кстати почему когда я запускаю эту программу пищит динамик в ПК?

Молодец, Paster Fob! Из Вас выйдет толк. Не верьте дядям на слово, все самому проверять надо. :)
Теперь попробую объяснить. Управляющие коды 0-31 были стандартизованы давно, когда еще не было дисплеев. Тогда они применялись для управления в основном принтерами и пишущими машинками. Сейчас некоторые из них используют нестандартно - для отображения всяких закорючек. Повторяю: это нестандартное применение, далеко не все редакторы текста способны их воспринять! Кстати, символ с кодом 7, называемый BELL (звонок), заставляет пищать ваш системный блок.
Аватара пользователя
Paster Fob
постоялец
Сообщения: 188
Зарегистрирован: 22.02.2011 20:53:36
Откуда: Новосибирск.

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

А как заставить компилятор вывести стандартные символы?
Про сигнал понятно.

Добавлено спустя 1 час 42 минуты 34 секунды:
Ну вот опять не задача,получается что я что-то не понял с процедурами и функциями.Задача по книге "Песни о Паскале".Значит так в книге есть программа шифрование и расшифровка строки.Я прочитал,а потом по памяти решил написать эту программку,Сразу же написал главную программу для проверки функций и возникла проблема.Почему после возвращения результата,переменная s всё равно равна первоначальному значению?

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

const ckey=2;
function Crypt(arg:char):char;
var x:char;
begin
  Crypt:=char(ord(arg)+ckey);
end;
function EnCrypt(arg:char):char;
var x:char;
begin
  EnCrypt:=char(ord(arg)-ckey);
end;
var s:char;
begin
    readln(s);
    writeln(Crypt(s));
    writeln(s);
    writeln(EnCrypt(s));
    writeln(s);
    readln;
end.

Переделал функции в процедуры и всё заработало.

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

const ckey=2;
procedure Crypt(var arg:char);
var x:char;
begin
  arg:=char(ord(arg)+ckey);
end;
procedure EnCrypt(var arg:char);
var x:char;
begin
  arg:=char(ord(arg)-ckey);
end;
var s:char;
begin
    readln(s);
    Crypt(s);
    writeln(s);
    EnCrypt(s);
    writeln(s);
    readln;
end.

Получается что результат возвращённый через функцию,далее в программе не используется.Или опять что-то не то?
Putnick
новенький
Сообщения: 62
Зарегистрирован: 18.03.2009 12:02:56

Сообщение Putnick »

Paster Fob писал(а):Получается что результат возвращённый через функцию,далее в программе не используется.Или опять что-то не то?

Ну, в Вашем случае получается именно так. Функция-то результат возвратила, а Вы его не приняли. Вот если бы Вы написали:

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

s:=Cript(s)

тогда бы переменной S было бы присвоено новое значение.
Или если бы функция Cript имела примерно такой вид:

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

var
  s:char;
function Crypt(arg:char):char;
begin
  s:=char(ord(arg)+ckey);
  Crypt:=s
end;

или такой:

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

function Crypt(var arg:char):char;
begin
  arg:=char(ord(arg)+ckey);
  Crypt:=arg
end;

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

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

Всё понял,спасибо за разъяснения.
Oleg_D
постоялец
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Сообщение Oleg_D »

Paster Fob писал(а):А как заставить компилятор вывести стандартные символы?

Вы хотите вывести то, что указано во второй колонке таблицы? Это всего лишь английские сокращения названий этих управляющих символов, например, LF - Line Feed - прогон строки. Компилятору об этих названиях ничего "не известно", это просто договоренность такая между человеками, - так их называть. Вы можете сделать такую программку сами, - вот Вам еще одно упражнение. :)
Добавлю, что управляющие символы используются по-разному в разных устройствах. Например, в модемах, часть из них служит для управления передачей данных. Вам важно понять пока лишь то, что эти символы не применяют для представления символов текста (об этом будет в следующей главе).
Аватара пользователя
teapot
незнакомец
Сообщения: 7
Зарегистрирован: 13.11.2011 15:20:23

Сообщение teapot »

Paster Fob, мне тоже далеко за 20 и я в качестве хобби изучаю (вернее, пытаюсь вспомнить школьный курс) паскаль по книге уважаемого Олега. Хоть Вас давно не было на форуме, позвольте присоединиться.
Андрей131289
незнакомец
Сообщения: 6
Зарегистрирован: 27.11.2011 13:02:56

Сообщение Андрей131289 »

Подскажите пожалуйста что за ошибка
<1.1> Error: Illegal Expression
Graph прописан выше в самой програме;

Procedure doroga;
var i:integer;
begin
setcolor(6);
line(0,850,1440,850);
i:=0;
While i<=1440 do
begin
setcolor(2);
line(10+i,850,i,900);
i:=i+1;
end;
end.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Андрей131289 писал(а):<1.1>

Первая строка, самая первая буква. Только не в куске текста, что Вы привели, а в программе.
Текста программы нет - подсказать невозможно.
Аватара пользователя
informat
новенький
Сообщения: 62
Зарегистрирован: 27.10.2010 09:44:20
Откуда: http://informat.name
Контактная информация:

Сообщение informat »

Андрей131289 писал(а):Подскажите пожалуйста что за ошибка
<1.1> Error: Illegal Expression
Graph прописан выше в самой програме;

Procedure doroga;
var i:integer;
begin
setcolor(6);
line(0,850,1440,850);
i:=0;
While i<=1440 do
begin
setcolor(2);
line(10+i,850,i,900);
i:=i+1;
end;
end.


Да. Нужен весь текст.
Написанное здесь уже содержит ошибку.
Процедура не может заканчиваться точкой.
Андрей131289
незнакомец
Сообщения: 6
Зарегистрирован: 27.11.2011 13:02:56

Сообщение Андрей131289 »

Спасибо, что посмотрели процедуру! Хорошо, что есть такой форум...Одному тяжело учить. Чуть позже напишу всю програму

Добавлено спустя 1 час 28 минут 47 секунд:
Вот вся програма... Жду критики ))

Program Mashunka;
uses crt,graph;
var detect,mode,i:integer;
begin
clrscr;
initgraph(detect,mode,'');
setbkcolor(7);
procedure doroga;
var i:integer;
begin
setcolor(6);
line(0,850,1440,850);
i:=0;
While i<=1430 do
begin
setcolor(2);
line(10+i,850,i,900);
i:=i+1;
end;
end;
procedure Znak;
begin
setcolor(0);
bar(1280,300,1300,850);
setcolr(15);
bar(1180,50,1400,300);
settextstyle(0,0,3);
setcolor(4);
outtextxy(1180,175,'START');
end;
procedure mashunca;
var i:integer;
begin
i:=10;
While i<=750 do
begin
setcolor(0);
circle(90+i,750,100);
circle(490+i,750,100);
line(190+i,750,390+i,750);
line(590+i,750,690+i,750);
line(690+i,750,690+i,600);
line(690+i,650,40+i,600);
line(690+i,600,440+i,450);
line(440+i,450,90+i,450);
line(440+i,450,440+i,600);
line(90+i,450,-10+i,750);
line(240+i,450,240+i,600);
i:=i+10;
end;
end;
end.
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

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

Program Mashunka;
uses crt,graph;

var i:integer;
     detect, mode: SmallInt;

  procedure doroga;
  var i:integer;
  begin
    setcolor(6);
    line(0,850,1440,850);
    i:=0;
    While i<=1430 do begin
      setcolor(2);
      line(10+i,850,i,900);
      i:=i+1;
    end;
  end;

  procedure Znak;
  begin
    setcolor(0);
    bar(1280,300,1300,850);
    setcolor(15);
    bar(1180,50,1400,300);
    settextstyle(0,0,3);
    setcolor(4);
    outtextxy(1180,175,'START');
  end;

  procedure mashunca;
  var i:integer;
  begin
    i:=10;
    While i<=750 do begin
      setcolor(0);
      circle(90+i,750,100);
      circle(490+i,750,100);
      line(190+i,750,390+i,750);
      line(590+i,750,690+i,750);
      line(690+i,750,690+i,600);
      line(690+i,650,40+i,600);
      line(690+i,600,440+i,450);
      line(440+i,450,90+i,450);
      line(440+i,450,440+i,600);
      line(90+i,450,-10+i,750);
      line(240+i,450,240+i,600);
      i:=i+10;
    end;
  end;

begin
  clrscr;
  initgraph(detect, mode, '');
  setbkcolor(7);
end.
Андрей131289
незнакомец
Сообщения: 6
Зарегистрирован: 27.11.2011 13:02:56

Сообщение Андрей131289 »

Спасибо, за коррективы! Но я от Вас еще не отстану... Не запускается графический режим(а точнее запускается, но сразу же завершается работа модуля Graph) Дайте пожалуйста совет. B компиляторе пишет Ranning "c:\fpc\2.4.4\bin\i386-win32\9.exe "

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

Сообщение Vadim »

Андрей131289
Надо сделать задержку завершения программы. Например, после того, когда все необходимые рисунки нарисованы, поставить волшебное слово ReadLn.
Андрей131289
незнакомец
Сообщения: 6
Зарегистрирован: 27.11.2011 13:02:56

Сообщение Андрей131289 »

Спасибо, всегда ставил Readln, а в этот раз как-то вилетело с головы.
Ответить