Pascal: Занятие №1. Часть 3: Типы данных в Паскаль
Типы данных в Паскале
Паскаль — это типизированный язык программирования. Это означает, что переменные, в которых хранятся данные, имеют определенный тип данных. Т.е. программе напрямую надо указать, какие данные могут храниться в той или иной переменной: текстовые данные, числовые данные, если числовые — то целочисленные или дробные, и т.п. Это необходимо в первую очередь для того чтобы компьютер «знал», какие операции можно выполнять с этими переменными и как правильно их выполнять.
Например, сложение текстовых данных, или как это правильно называется в программировании — конкатенация — это обычное слияние строк, тогда как сложение числовых данных происходит поразрядно, кроме того, дробные и целые числа складываются тоже по-разному. То же самое касается и других операций.
Рассмотрим наиболее распространенные в Pascal типы данных.
Целочисленные типы данных в Паскаль
Тип
Диапазон
Требуемая память (байт)
byte
0..255
1
shortint
-128..127
1
integer
-32768.. 32767
2
word
0..65535
2
longint
-2147483648..2147483647
4
Нужно иметь в виду, что при написании программ в паскале integer (в переводе с англ. целое) является наиболее часто используемым, так как диапазон значений наиболее востребуем. Если необходим более широкий диапазон, используется longint (long integer, в переводе с англ. длинное целое). Тип byte в Паскале используется, когда нет необходимости работать с отрицательными значениями, то же самое касается и типа word (только диапазон значений здесь значительно больше).
Примеры того, как описываются (объявляются) переменные в Паскале:
Pascal
PascalABC.NET
program a1; var x,y:integer; <целочисленный тип>myname:string; <строковый тип>begin x:=1; y:=x+16; myname:=’Петр’; writeln (‘имя: ‘,myname, ‘, возраст: ‘, y) end.
program a1; begin var x, y: integer; <целочисленный тип>var myname: string; <строковый тип>x := 1; y := x + 16; myname := ‘Петр’; print($’имя: , возраст: ‘) end.
Результат: имя: Петр, возраст: 17
Комментарии в Паскале
[Название файла: L1task5.pas ]
Вещественные типы данных в Паскаль
Вещественные числа в Паскале и вообще в программировании — это название дробных чисел.
Тип real в Паскале — наиболее часто используемый из вещественных типов.
Выше были представлены простые типы данных в Паскаль, к которым относятся:
Для вывода значений переменных вещественного типа обычно используется форматированный вывод:
Наряду с простыми типами в языке еще используются структурированные типы данных и указатели, которым будут посвящены последующие уроки по Паскалю.
Константы в Паскале
Зачастую в программе заранее известно, что переменная будет принимать какое-то конкретное значение и не менять его на протяжении выполнения всей программы. В таком случае необходимо использовать константу.
Объявление константы в Паскале происходит до объявления переменных (до служебного слова var ) и выглядит следующим образом:
Пример описания константы в Паскале:
Pascal
PascalABC.NET
const x=17; var myname:string; begin myname:=’Петр’; writeln (‘имя: ‘,myname, ‘, возраст: ‘, х) end.
const x = 17; begin var myname := ‘Петр’; print($’имя: , возраст: ‘) end.
«Красивый» вывод целых и вещественных чисел
Для того чтобы после вывода значений переменных оставались отступы, чтобы значения не «сливались» друг с другом, принято через двоеточие указывать какое количество символов нужно предусмотреть для вывода значения:
Вывод вещественных чисел
Арифметические операции в Паскале
ДЕЙСТВИЕ
РЕЗУЛЬТАТ
СМЫСЛ
2 + 3
5
плюс
4 — 1
3
минус
2 * 3
6
умножить
17 div 5
3
целочисленное деление
17 mod 5
2
остаток от целочисленного деления
Порядок выполнения операций
var a: integer; b: real; begin a := 1; writeln(‘a := 1; a = ‘,a); a += 2; // Увеличение на 2 writeln(‘a += 2; a = ‘,a); a *= 3; // Умножение на 3 writeln(‘a *= 3; a = ‘,a); writeln; b := 6; writeln(‘b := 6; b = ‘,b); r /= 2; writeln(‘b /= 2; b = ‘,b); end.
Стандартные арифметические процедуры и функции Pascal
Здесь стоит более подробно остановиться на некоторых арифметических операциях.
Пример операции inc:
Более сложное использование процедуры inc: Inc(x,n) где x — порядкового типа, n — целого типа; процедура inc увеличивает x на n.
Пример использования функции odd:
begin WriteLn(Odd(5)); WriteLn(Odd(4)); end.
Пример использования процедуры sqr в Pascal:
var x:integer; begin x:=3; writeln(sqr(x)); <ответ 9>end.
Однако в компиляторе pascal abc возведение в степень осуществляется значительно проще:
Пример использования процедуры sqrt в Pascal:
var x:integer; begin x:=9; writeln(sqrt(x)); <ответ 3>end.
Итак, уважаемые, позвольте мне представить мой туториал №1. 😀
Внимание: Данные эксперименты не совсем совместимы с модулем Graph, поэтому крайне нежелательно его включать.
Для использования примеров вам необходима карточка VGA, имеющая режим 320*200, TP версии 6.0 и выше, и желание разобраться.
В сегодняшней, первой части, я расскажу о том, что из себя представляет режим 320*200 8 бит, как его врубить, и как с ним работать.
Этот режим имеет номер 13 в шеснацатеричной системе счисления или 19 в десятичной. В дальнейшем 16-теричный вид будет отмечаться буквой h (Например 13h) а десятичный отмечатся не будет (19).
2.Мы можем работать с 2^8=256 цветами (в отличие от 16 в пасе).
3. Базовый адрес памяти, начиная с которого изображение в графических режимах выводится на монитор, равен 0A000:0000h. следующие 64000(320*200) байта в данном режиме как раз и выводятся на экран.
5. Для возврата из графического режима я буду использовать текстовый режим № 3(80*25*16)
Ну так вот, для того, чтобы менять режимы будем использовать функцию BIOS установки режима:
Ну. для начала давайте очистим экран
А теперь, давайте я пасскажу о ней поподробнее.
В языках программирования используют несколько переменных, которые содержат сегменты, это cs,ds,es,ss,gs,fs. В паскале реально используются лишь первые 4.
Обычно, для адресации я.п. используют индексные регистры di и si, но можно использовать и любые другие.
Сегмент и смещение занимают по 16 бит(2 байта) и преобразуются в 20-ти битный адрес.
Двумя этими командами мы помещаем в регистр es сегмент адреса видеопамяти(A000). Напрямую помещать адрес нельзя, т.е. запись типа mov es,0a000h является неверной!! По-моему это связано с отсутсвием кода команд в системе операций процессора.
Эта команда очищает регистр индекса di, для того, чтобы в es:di лежал полный адрес начала выводимой памяти. Индекс di используется для «скольжения» по сегменту, т.е. он адресует ячейку памяти с номером, указанную в нем. Внимание! Запись вида mov di,5 обозначает адресацию 5-ой ячейки, а запись вида mov [di],5 обозначает что в ячейку es:di будет помещено значение 5. Правда, в паскале это не так. В паскале для помещения значения 5 по адресу es:di оное значение помещается в регистр, допустим, аl и используется запись вида mov es:[di],al.
Здесь я помещаю в al номер цвета закраски фона.
команда цикла rep повторяет следующую команду. количество повторов лежит в регистре CX. Ее можно заменить на команду цикла loop:
Команда rep сначала проверяет регистр cx на равенство 0, а затем, если он не равен, убавляет его на 1, если равен, то цикл прекращается и программа идет дальше, в отличие от команды loop, которая сначала уменьшает cx на 1, а затем проверяет его на 0. Т.е. если вы поместите в cx 0, то команда rep не выполнится ни разу, а команда loop будет выполняться 65535 раз(по максимальному размеру cx)
команда StosW: es[di]=ax; di=di+2;
З.Ы.Ы. Если вы хотите посмотреть, как будет выполнятся программа, можете ее прогнать пошагово, открыв окно Debug->Registers и нажимая F7.
Copyright by Dark. Моя почта: darkmaze@yandex.ru ;D
Бывалый
Группа: Пользователи Сообщений: 282
Репутация: 0
Профи
Группа: Пользователи Сообщений: 775 Пол: Мужской
Репутация: 0
Знаток
Группа: Пользователи Сообщений: 408 Пол: Мужской
Репутация: 3
А вот что я думаю: Сегмент и смещение ВМЕСТЕ составляют ЛОГИЧЕСКИЙ адрес, который в результате сдвига сегмента на 4 бита и сложения со смещением дает РЕАЛЬНЫЙ адрес объекта(20 бит).
А может есть 2 понятия слова сегмент? ;D ;D ;D
Знаток
Группа: Пользователи Сообщений: 408 Пол: Мужской
Репутация: 3
Мне не сложно переписывать туториал столько раз, сколько это понадобится, главное, чтобы это не превратилось в манию ;D
Знаток
Группа: Пользователи Сообщений: 408 Пол: Мужской
Репутация: 3
Профи
Группа: Пользователи Сообщений: 775 Пол: Мужской
Репутация: 0
Иногда, просто нужно нажраться. Держи.
Се начнем повесть сию. Не начнем, а продолжим. 😉
Внимание: Данные эксперименты не совсем совместимы с модулем Graph, поэтому крайне нежелательно его включать. В каком месте?? Для использования примеров вам необходима карточка VGA, имеющая режим 320*200, TP версии 6.0 и выше, и желание разобраться. Не думаю, что сейчас хоть у кого-нибудь есть чиста VGA-адаптер; напиши совместимый. В сегодняшней, первой части, я расскажу о том, что из себя представляет режим 320*200 8 бит, как его врубить, и как с ним работать.
Этот режим имеет номер 13 в шеснацатеричной системе счисления или 19 в десятичной. В дальнейшем 16-теричный вид будет отмечаться буквой h (Например 13h) а десятичный отмечатся не будет (19). Не надо думать, что все на свете такие валенки; хотя также на твое усмотрение. Немного теории:
Ну так вот, для того, чтобы менять режимы будем использовать функцию BIOS установки режима:
Здесь я помещаю в al номер цвета закраски фона.
mov cx,64000 rep StosB
команда цикла rep повторяет следующую команду. количество повторов лежит в регистре CX. Ее можно заменить на команду цикла loop:
Команда rep сначала проверяет регистр cx на равенство 0, а затем, если он не равен, убавляет его на 1, если равен, то цикл прекращается и программа идет дальше, в отличие от команды loop, которая сначала уменьшает cx на 1, а затем проверяет его на 0. Т.е. если вы поместите в cx 0, то команда rep не выполнится ни разу, а команда loop будет выполняться 65535 раз(по максимальному размеру cx)
procedure set13h; begin asm mov ax,0013h int 10h cld end; end;
procedure close13h; begin asm mov ax,0003h int 10h end; end;
procedure clscr(col:byte); begin asm push 0a000h pop es xor di,di mov cx,64000 mov al,col rep stosb end; end;
begin randomize; set13h; repeat clscr(random(256)); delay(20000); until keypressed; close13h; end.
Copyright by Dark. Моя почта: darkmaze@yandex.ru Debugged & corrected by GLuk
Бывалый
Группа: Пользователи Сообщений: 282
Репутация: 0
пример для туториала: если начиная с адреса ds:di в ОП находится следующая последовательность байт: DF 10 01 FA CD 13 то после выполнения команды | память изменится следующим образом mov byte ptr [di],5 05 10 01 FA CD 13 mov word ptr [di],5 05 00 01 FA CD 13 mov dword ptr [di],5 05 00 00 00 CD 13
Народ кто-нибудь кроме нас это читает?
Lonely_Raven
Группа: Пользователи Сообщений: 640 Пол: Мужской
Репутация: 1
Бывалый
Группа: Пользователи Сообщений: 282
Репутация: 0
Профи
Группа: Пользователи Сообщений: 775 Пол: Мужской
Репутация: 0
2 ___Alex___: По поводу цитаты: это в плане я неправильно что-то подправил.
Бывалый
Группа: Пользователи Сообщений: 282
Репутация: 0
Профи
Группа: Пользователи Сообщений: 775 Пол: Мужской
Репутация: 0
Можно попробовать; Только где народу набрать. 🙂
А по поводу ерунды, ты написал то же самое что и я, поэтому и возник квестчин