Написание статей! |
В этом форуме Вы можете предложить изменения на форуме или обсудить действия администрации.
Написание статей! |
AlaRic |
Сообщение
#1
|
... Группа: Пользователи Сообщений: 1 347 Пол: Мужской Репутация: 3 |
Есть ли у кого-нибудь из участников желание попробовать себя в сабже? Любые темы связанные с паскалем(но не делфи!).
|
BlackShadow |
Сообщение
#2
|
Гость |
Мне опять делать нефиг. А ещё я вредный
Несколько коментариев к "символьным типам". Переменная символьного типа занимает 1 байт (8 бит) в памяти. Следовательно она может принимать значения от 0 до 255 (00000000 .. 11111111 в двоичной). По сути она хранит код символа, а паскаль расценивает переменную типа Char, как символ. То есть к ней нельзя прибавить или вычесть (точнее прибавить можно, но это уже будет 2 символа, а не один, но м иным кодом). Чтобы изменить код символа в переменной типа Char надо воспользоваться примерно следующим кодом: Код Var c:Char; Begin c:=#20; c:=Char(Byte(c) + $10); WriteLn(c) End. В данном случае я использовал приём называемый приведением типов. Т. е. сначала значение переменной c расценивается как значение для переменной типа Byte (т. к. Byte по размеру не меньше чем Char, то мы просто получаем значение кода). Это аналогично вызову функции Ord, но без всяких вызовов. Далее к этому значению прибавляется 16 ($10), а затем обратно всё это расценивается как код символа. Вот и получаем в c $30 (код символа '0'). Прямое приведение типов не уступает вызову соответствующих функций, возможно даже привосходит, но в этом я не уверен. Едем дальше. Упоминалась некая таблица символов. Есть такая. Она называется тблицей ASCII. В ней ровно 255 мест как раз под каждый символ. У каждого из них есть своё имя. Например символ с кодом 0 зовётся NUL, символ с кодом 7 - BEL, 13 - LF, 10 - CR, а вот 32 это всем знакомый SPC (пробел). Затем с 48 идут цифры, далее и буквы латинского алфавита... Но это всё только в первой половине таблицы (до 127). А вот вторая половина зависит как правило от языка установленного в системе. Функции ввода/вывода опираются на таблицы, в которых описан внешний вид символов, а вот эти таблицы устанавливаются либо ОС либо специальными программами типа KeyRus и т. д. То есть, когда мы пытаемся вывести символ с кодом 48, мы можем быть уверены, что это '0', а когда символ с кодом где-нибудь 200, то не стоит быть слишком уверенным, что это кусок рамки Да, если и ближе к жизни: все наверно сталкивались с проблемой, когда в досовских программах вместо русского бред какой-то. Это из-за того, что не совпадают именно эти таблички. Интереса ради можно попробывать запустить следующий код: Код Var c:Char; Begin For c:=#$00 To #$FF Do Write(c) End. Как видно, на экран будет выведена вся таблица. Теперь перейду к функции ReadKey. Она действует так: 1). Проверяет пуст ли буфер клавиатуры. 2). Если он не пуст, то берёт первый символ оттуда, удаляет его из буфера и возвращает. 3). Если не пуст, то ждёт, когда пользователь что-нибудь нажмёт, и возвращает именно это. Теперь надо отметить несколко особенностей. Клавиши типа '1', ' ', 'g' при нажатии генерируют один символ (как раз свой), а клавиши типа 'F1', '<-', и т. д. генерируют два символа: #00 и какой-то свой. Вот такая маленькая особенность. Может возникнуть ситуация, когда хочется просто проверить, не нажал ли пользователь чего, но совсем не надо останавливать программу до нажатия (например часы, которые рисуются, пока пользователь не нажмёт кнопку). Тогда функция ReadKey совсем не подходит. Но можно воспользоваться KeyPressed. Она так же объявлена в модуле CRT и возвращает True, если буфер клавиатуры не пуст. Вот пример её использования: Код Uses CRT; Var i:LongInt; Begin i:=0; While Not KeyPressed Do Begin WriteLn(i); Inc(i) End; ReadKey End. В конце программы стоит ReadKey для того, чтобы очистить буфер клавиатуры от нажатой пользователем кнопки... Вот ыроде и всё |
Текстовая версия | 18.05.2024 18:50 |