IPB
ЛогинПароль:

> Прочтите, прежде чем создать тему.

В этом форуме Вы можете предложить изменения на форуме или обсудить действия администрации.

> Написание статей!
сообщение
Сообщение #1


...
*****

Группа: Пользователи
Сообщений: 1 347
Пол: Мужской

Репутация: -  3  +


Есть ли у кого-нибудь из участников желание попробовать себя в сабже? Любые темы связанные с паскалем(но не делфи!).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Мне опять делать нефиг. А ещё я вредный smile.gif
Несколько коментариев к "символьным типам".

Переменная символьного типа занимает 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, то не стоит быть слишком уверенным, что это кусок рамки smile.gif Да, если и ближе к жизни: все наверно сталкивались с проблемой, когда в досовских программах вместо русского бред какой-то. Это из-за того, что не совпадают именно эти таблички.
Интереса ради можно попробывать запустить следующий код:
Код

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 для того, чтобы очистить буфер клавиатуры от нажатой пользователем кнопки...

Вот ыроде и всё smile.gif
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 18.05.2024 18:50
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name