Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Как заработать в Интернет" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
← Октябрь 2005 → | ||||||
1
|
||||||
---|---|---|---|---|---|---|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
16
|
|
17
|
18
|
19
|
20
|
21
|
23
|
|
24
|
25
|
26
|
27
|
28
|
29
|
30
|
31
|
Автор
Статистика
736 подписчиков
0 за неделю
0 за неделю
Программирование с нуля для инженера - выпуск 6
Информационный Канал Subscribe.Ru |
Программирование с нуля для инженера - переменные, основные типы данных (выпуск 6)
Содержание
Вступление
Язык Object Pascal, или Delphi, как его принято называть сейчас,
является потомком языка Pascal. Pascal был создан Никлаусом Виртом в 1971 году и до сих пор
является популярным языком программирования. Сам Pascal используется в основном для учебных
целей, как правило, все школьники и студенты начинают обучение программированию именно с него.
Его потомок Object Pascal (ныне Delphi) является одним из наиболее популярных универсальных
языков программирования. В сравнении с многими другими языками он более прост в освоении.
Состав программы на языке Delphi
Текст программы на Delphi можно разделить на лексемы и разделители
между лексемами.
Лексема - минимально значимая единица текста программы. К лексемам относятся идентификаторы (имена переменных, объектов, процедур, типов и.т.д.), числа, строки, константы, операторы, ключевые слова, другие специальные символы. Коротко опишу лексемы, назначение которых необходимо знать для понимания материала выпуска.
Лексема - минимально значимая единица текста программы. К лексемам относятся идентификаторы (имена переменных, объектов, процедур, типов и.т.д.), числа, строки, константы, операторы, ключевые слова, другие специальные символы. Коротко опишу лексемы, назначение которых необходимо знать для понимания материала выпуска.
- Идентификаторы. Каждый объект в программе имеет своё имя - идентификатор. Оно должно быть уникальным в пределах области видимости данного идентификатора. Идентификатор может начинаться с символа подчёркивания или с латинской буквы, последующие его символы могут являться либо буквой, либо цифрой. Русские буквы в идентификаторах запрещены. Максимальная длина идентификатора в Delphi - 255 символов.
- Ключевые слова. Это слова, написание и значение которых строго зафиксировано и которые специальным образом используются компилятором для построения программы.
- Операторы - языковые конструкции. Оператор состоит из символьного
обозначения оператора и операндов, над которыми он выполняет действия. Каждый оператор
заканчивается точкой с запятой - ;. Операндами могут являться переменные, константы,
числовые или строковые значения, а также сложные выражения.
Операторы бывают простыми и составными. Составной оператор - это последовательность простых операторов, заключённая в операторные скобки Begin...End;. Пример оператора вы увидите ниже.
В качестве лексемы рассматривается только символьное обозначение оператора.
Переменные
Любая программа, выполняющая полезные действия, производит обработку
данных. Эти данные должны где-то храниться. На машинном уровне они хранятся в ячейках памяти,
а в языках высокого уровня для этого используются переменные.
Каждая переменная имеет два свойства - тип и значение. А также
у каждой переменной есть уникальное в пределах области видимости имя.
Тип в общем случае описывает способ представления переменной в памяти. Важнейшей характеристикой типа данных является количество байт, занимаемых переменной этого типа в памяти. Тип переменной задаётся один раз при её объявлении и не может быть изменён в процессе работы программы, в отличие от значения переменной. По правилам языка Delphi, каждая переменная перед использованием должна быть объявлена в разделе описания переменных.
Тип в общем случае описывает способ представления переменной в памяти. Важнейшей характеристикой типа данных является количество байт, занимаемых переменной этого типа в памяти. Тип переменной задаётся один раз при её объявлении и не может быть изменён в процессе работы программы, в отличие от значения переменной. По правилам языка Delphi, каждая переменная перед использованием должна быть объявлена в разделе описания переменных.
// раздел описания переменных начинается с ключевого слова Var
// Var - переменная (от английского variable)
Var
X: Integer;// объявление переменной X. Сначала указывается имя
// переменной, затем двоеточие и её тип. Тип переменной
// X - Integer (целое число).
Y: Integer;// переменная Y типа Integer.
R: Real; // переменная R типа Real (вещественное число).
A, B, C: String;// переменные A, B, C строкового типа.
// возможно описание нескольких однотипных
// переменных через запятую, но первый вариант
// предпочтительней!
// Var - переменная (от английского variable)
Var
X: Integer;// объявление переменной X. Сначала указывается имя
// переменной, затем двоеточие и её тип. Тип переменной
// X - Integer (целое число).
Y: Integer;// переменная Y типа Integer.
R: Real; // переменная R типа Real (вещественное число).
A, B, C: String;// переменные A, B, C строкового типа.
// возможно описание нескольких однотипных
// переменных через запятую, но первый вариант
// предпочтительней!
Значение переменной - это те данные, которые содержат ячейки
памяти, используемые переменной. Значение всегда занимает определённое число байт памяти, а
отсюда следует, что количество состояний, которое может иметь значение переменной, ограничено.
Минимальный размер переменной - 1 байт. Это ограничение продиктовано не языком программирования,
а устройством оперативной памяти. Ячейки памяти имеют размер 1 байт, и это минимальная адресуемая
единица памяти.
При написании программ для доступа к переменным используются их имена. Имена
переменных отождествляются с их значениями, и обычно переменную не подразделяют на тип и значение.
Например, говоря "переменная X равна 10", имеют в виду её значение. Заглавные и строчные буквы
в именах переменных и любых идентификаторах не различаются. То есть, например, имена aX1 и ax1
считаются одинаковыми, и при попытке создать две переменные с такими именами компилятор выдаст
сообщение о повторном объявлении переменной. В общем случае совпадение двух идентификаторов в
одном именном пространстве (области видимости) запрещено. Например, создать переменную, имя
которой совпадает с ключевым словом, нельзя.
// пример - нахождение среднего арифметического двух целых чисел.
Procedure GetArithmeticMean;
Var
X: Integer;
Y: Integer;
R: Real;
Begin
X := 10; // присваивание переменной X значения 10
Y := 5;// присваивание переменной Y значения 5
R := (X + Y) / 2; // вещественной переменной R присваивается
// значение выражения (X + Y) / 2. Сумма X + Y
// делится на 2. Cкобки нужны потому, что у
// операции деления более высокий приоритет,
// чем у сложения и вычитания.
// если записать X + Y / 2, то Xсложится с
// Y, делённым на 2. То есть будет так: X + (Y/2)
// здесь используется оператор присваивания ":="
// он присваивает переменной, стоящей слева,
// явное значение, значение переменной или
// значение выражения, стоящего справа
End;
Procedure GetArithmeticMean;
Var
X: Integer;
Y: Integer;
R: Real;
Begin
X := 10; // присваивание переменной X значения 10
Y := 5;// присваивание переменной Y значения 5
R := (X + Y) / 2; // вещественной переменной R присваивается
// значение выражения (X + Y) / 2. Сумма X + Y
// делится на 2. Cкобки нужны потому, что у
// операции деления более высокий приоритет,
// чем у сложения и вычитания.
// если записать X + Y / 2, то Xсложится с
// Y, делённым на 2. То есть будет так: X + (Y/2)
// здесь используется оператор присваивания ":="
// он присваивает переменной, стоящей слева,
// явное значение, значение переменной или
// значение выражения, стоящего справа
End;
При компиляции программы имена переменных превращаются в адреса ячеек памяти.
Эта процедура - GetArithmeticMean - в таком виде бессмысленна, так как она не выводит на экран
результат работы. В принципе, нельзя сказать, выполняет ли она задуманные действия
правильно или нет.
Вашим заданием будет доработка процедуры и программы, в которой она реализована (в первой программе архива с примерами), до приличного вида, чтобы она выводила результат на экран, в любом удобном вам виде. Также подумайте и проверьте, что произойдёт, если тип результирующей переменной R в процедуре сменить с Real на Integer. В качестве примера возьмите код второй программы из архива.
Вашим заданием будет доработка процедуры и программы, в которой она реализована (в первой программе архива с примерами), до приличного вида, чтобы она выводила результат на экран, в любом удобном вам виде. Также подумайте и проверьте, что произойдёт, если тип результирующей переменной R в процедуре сменить с Real на Integer. В качестве примера возьмите код второй программы из архива.
Основные типы данных
Существует несколько основных типов данных, которые являются наиболее
часто используемыми и встроены в компилятор. Это в первую очередь числовые типы данных, работа с
которыми реализована на уровне процессора. Числа, как известно, можно подразделить на целые и
вещественные. Ещё можно выделить натуральные как подмножество целых. Подобным образом организованы
числовые типы данных в языках программирования. Ниже представлены таблицы числовых типов данных.
Целые числа | ||
Название типа | Допустимый диапазон чисел | Формат типа |
ShortInt | -128...127 | 8-битовое знаковое |
SmallInt | –32768...32767 | 16-битовое знаковое |
Integer | –2147483648...2147483647 | 32-битовое знаковое |
LongInt | –2147483648...2147483647 | 32-битовое знаковое |
Int64 | -263...263-1 | 64-битовое знаковое |
Byte | 0...255 | 8-битовое беззнаковое |
Word | 0...65535 | 16-битовое беззнаковое |
LongWord | 0...4294967295 | 32-битовое беззнаковое |
Cardinal | 0...4294967295 | 32-битовое беззнаковое |
Байт состоит из 8 бит. Бит - элемент памяти, имеющий 2 состояния: 0 и 1.
Память компьютера состоит из ячеек-байт, которые в свою очередь состоят из бит. Если посчитать
число возможных различных значений одного байта памяти, получится 28, или 256. Как
можно распределить эти 256 значений? Можно от 0 до 255, а можно от -128 до 127. Таким образом
получаются 2 формата чисел - 8-битовое беззнаковое (0...255) и 8-битовое знаковое (-128 ...127).
То есть когда переменная содержит только положительные числа, у неё может быть один знак -
всегда + (беззнаковое число). Иначе 2 знака: + и - (знаковое число). В последнем случае диапазон
делится на 2 равных части - положительную и отрицательную, при этом 0 считается положительным
числом. 256 / 2 = 128 . Отсюда получаются границы диапазонов.
Для других типов, имеющих больший размер, диапазоны получаются аналогично. Отличие
в том, что у них диапазон шире.
Вещественные числа | |||
Название типа | Допустимый диапазон чисел | Число знаков после запятой | Размер в байтах |
Single | -1.5*1045...1.7*1038 | 7-8 | 4 |
Real | -5*10324...1.7*10308 | 15-16 | 8 |
Double | -5*10324...1.7*10308 | 15-16 | 8 |
Extended | -3.6*104951...1.1*104932 | 19-20 | 10 |
Comp | -263+1...263-1 | 19-20 | 8 |
Currency | –922337203685477.5808... 922337203685477.5807 | 19-20 | 8 |
Вещественные числа представляются и обрабатываются гораздо сложнее целых. Число
представляется в виде M * 10E, где M - мантисса, E - экспонента.
Отведённые под переменную биты делятся на 2 части, хранящие мантиссу и экспоненту. Мантисса -
множитель числа, находящийся в диапазоне от 0 до 10. Экспонента - степень десятки.
Одна из сложностей заключается в том, что под хранение каждой части числа отводится
не целое число байт. Есть другая, гораздо более значимая сложность - появление погрешностей при
расчётах с вещественными числами. Диапазон чисел, который могут позволить содержать переменные
вещественного типа, значительно шире диапазона целых чисел. Но диапазон вещественных чисел,
как и у целых, дискретен, когда как в реальности он должен быть непрерывным и бесконечным.
За счёт этого последние разряды вещественного числа всегда будут давать погрешность. Если вы
не занимаетесь специальными расчётами, требующими точности более чем 15 знаков после запятой,
стандартные типы вас вполне устроят.
Могу дать совет из личного опыта: не используйте тип Single! Он может дать
погрешность даже в первом знаке после запятой! В приведённом ниже примере уже при присваивании
переменной значения 3.14 ей присваивается "немного не такое" значение. Смотрите вторую программу
из архива примеров.
Procedure TMainForm.SingleDemo;
Var
X: Single;
Y: Single;
Z: Single;
Begin
X := 10.0;// разделителем целой и дробной части служит точка
X := 10;// эти две записи эквивалентны
Y := 3.14;
Z := X * Y * Y;
// в следующем выпуске будет подробнее описана работа со строками
// и преобразования чисел в строки и наоборот
// этот участок кода можете пока пропустить
InputDataLB.Caption := 'Исходные данные:'#13#10'X = ' +
FloatToStr(X) + #13#10'Y = ' +
FloatToStr(Y);
ResultLB.Caption := 'Результат: '#13#10'X * Y * Y = ' +
FloatToStr(Z);
End;
Var
X: Single;
Y: Single;
Z: Single;
Begin
X := 10.0;// разделителем целой и дробной части служит точка
X := 10;// эти две записи эквивалентны
Y := 3.14;
Z := X * Y * Y;
// в следующем выпуске будет подробнее описана работа со строками
// и преобразования чисел в строки и наоборот
// этот участок кода можете пока пропустить
InputDataLB.Caption := 'Исходные данные:'#13#10'X = ' +
FloatToStr(X) + #13#10'Y = ' +
FloatToStr(Y);
ResultLB.Caption := 'Результат: '#13#10'X * Y * Y = ' +
FloatToStr(Z);
End;
Операции с вещественными числами работают в десятки раз медленнее операций с
целыми. При написании программ следует это учитывать и не использовать ресурсоёмких типов там,
где это не требуется.
Символьный тип данных - Char
Переменные символьного типа занимают, как правило, один байт, и при этом содержат
один строковый символ. Символы в языке Delphi пишутся в одинарных кавычках, например 'А'.
Каждый символ имеет свой числовой код. Зная этот код, можно задавать символ двумя способами.
Смотрите пример:
Var
C: Char;// Char - символ в переводе с английского
Begin
C := 'Q'; // присваиваем переменной символ Q
C := #13; // присваиваем значение через код символа
// 13 - код клавиши Enter
C := Chr(13); // то же самое, с использованием функции Chr
// функция Chr принимает код символа, а
// возвращает символ
End;
При этом символ и его код - это одно и то же, ведь символ хранится в памяти в виде кода!
C: Char;// Char - символ в переводе с английского
Begin
C := 'Q'; // присваиваем переменной символ Q
C := #13; // присваиваем значение через код символа
// 13 - код клавиши Enter
C := Chr(13); // то же самое, с использованием функции Chr
// функция Chr принимает код символа, а
// возвращает символ
End;
Строковый тип данных - String
Наверное, интуитивно понятно, что строка с точки зрения языка - последовательность
символов. Строку также называют массивом символов, но понятие массива у нас ещё не рассмотрено.
Задаётся строка таким же образом, что и символ - в одинарных кавычках пишется последовательность
символов. Строка при присвоении должна быть размещена в одной строке редактора кода. Если она
слишком длинна, можно разбить её на более короткие строки. Строка, в отличие от символа, может
быть пустой. Обозначается такая строка просто двумя одинарными кавычками. Присваивая строковой
переменной какое-либо значение, можно включать в последовательность символов коды. Для этого часть
строки сначала закрывается одинарной кавычкой, затем пишется последовательность кодов, затем
символьная часть строки продолжается, начиная с открывающей одинарной кавычки.
Строка представляет из себя массив символов, поэтому к ней можно обращаться по индексу,
работая при этом с соответствующим символом.
Для строк определена очень полезная операция - сложение (или конкатенация, или
склеивание). Сложив две строки, вы получите новую, которая будет состоять из символов первой строки
и символов второй строки, "приписанных" к ней.
Var
S1: String;
S2: String;
S3: String;
Begin
S1 := 'test''String'; // две кавычки подряд означают
// включение кавычки в строку
ShowMessage(S1);// покажем окно с сообщением
// в качестве строки сообщения - S1
S1 := 'test'#13#10'string'; // #13#10 - перевод на новую строку
ShowMessage(S1);
S1 := 'Hello,';
S2 := ' world';
S3 := S1 + S2 + '!!!'; // S3 будет равна 'Hello, world!!!'
ShowMessage(S3);
End;
S1: String;
S2: String;
S3: String;
Begin
S1 := 'test''String'; // две кавычки подряд означают
// включение кавычки в строку
ShowMessage(S1);// покажем окно с сообщением
// в качестве строки сообщения - S1
S1 := 'test'#13#10'string'; // #13#10 - перевод на новую строку
ShowMessage(S1);
S1 := 'Hello,';
S2 := ' world';
S3 := S1 + S2 + '!!!'; // S3 будет равна 'Hello, world!!!'
ShowMessage(S3);
End;
Строки - очень полезный тип данных. Только строки могут быть использованы для вывода
текстовой информации на экран. Число, например, необходимо сначала преобразовать его в строку,
а уже после этого выводить на экран. Компоненты, которые предназначены для ввода данных, получают
их в строковом представлении. При обращении к соответствующему свойству компонента (к примеру,
свойство Text у Edit) вы получаете строку. А при расчёте каких-либо параметров результатом
является число. Преобразование строк и чисел - тема следующего выпуска рассылки.
Булев тип данных - Boolean
Переменные типа Boolean содержат логические значения. Таковых всего два - ложь
и истина. В языке они обозначаются константами False и True,
соответственно. False тождественно равняется нулю, True - единице. Булева переменная обычно
занимает 1 байт. Реально необходим только один бит этого байта, но переменная не может иметь
размер меньше байта. Булевы переменные могут использоваться для сохранения результата логических
выражений, или в качестве индикаторов. Логические операции и выражения будут рассмотрены позже.
Область видимости переменных
Об области видимости переменных я уже писал в 3 выпуске, но здесь хотел
бы ещё раз напомнить. Область видимости - та область кода, из которой переменная доступна (видима).
У переменных, объявленных в разных участках кода, различные области видимости.
- При объявлении в интерфейсной части модуля - переменная видима во всей программе.
- При объявлении в реализационной части модуля - переменная видима внутри реализации модуля, во всех его подпрограммах.
- При объявлении внутри подпрограммы - переменная видима только внутри подпрограммы.
Заключение
Ссылка на
примеры.
В следующем выпуске будут рассмотрены преобразования чисел и строк.
В следующем выпуске будут рассмотрены преобразования чисел и строк.
Subscribe.Ru
Поддержка подписчиков Другие рассылки этой тематики Другие рассылки этого автора |
Подписан адрес:
Код этой рассылки: comp.soft.others.prog2eng Архив рассылки |
Отписаться
Вспомнить пароль |
В избранное | ||