Свойства ячейки памяти. Переменные и константы 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Свойства ячейки памяти. Переменные и константы



Компьютерные программы, для написания которых предназна­чен алгоритмический язык Паскаль, обрабатывают данные, которые хранятся в оперативной памяти компьютера. Каждое элемен­тарное данное имеет некоторый смысл (например, число или символ) и занимает один или несколько байтов памяти[3]. Эту область памяти часто называют ячейкой памяти. Для того, чтобы ячейки памяти можно было различать и использовать их в программе, каждой ячейке дается имя. Таким образом, ячейка памяти характеризуется своим именем и содержимым (т. е. данным, которое в ней хранится). Кроме того, ячейка имеет адрес (адресом ячейки считается адрес младшего из занимаемых ею байтов). В программе имена ячеек участвуют как имена переменных, т. е. переменные программы - это, по существу, ячейки памяти. При написании программ считают, что ячейка памяти обладает следующими свойствами:

1. Информация в ячейке памяти хранится всё время выполнения программы.

2. При записи нового содержимого в ячейку предыдущее содержимое не сохраняется. Запись содержимого в ячейку называется присваиванием. Оператор присваивания описан в п.1.3.1.

3. При считывании содержимое ячейки не изменяется.

4. Если в ячейку на протяжении программы не было ничего записано, то ее содержимое считается неопределенным. Отметим, что это свойство не всегда выполняется в реализациях алгоритмических языков (например, все переменные в Borland Pascal при объявлении обнуляются).

Под константой в программировании понимается значение, не изменяющееся в процессе выполнения программы. Константам, также как и переменным, соответствуют ячейки памяти. Можно считать, что эти ячейки защищены от записи. В программе, кроме констант обозначенных или именованных (т. е. имеющих имя), могут использоваться явные константы, заданные своим значением. Например, можно использовать константу с именем epsilon, предварительно задав ей значение 0.0001, а можно использовать в программе явную константу 0.0001[4].

В качестве имен переменных и констант, также как в качестве других имен, в языках программирования (в том числе Паскале) используются идентификаторы. Под идентификатором понимается последовательность букв, символов подчеркивания и цифр, начинающаяся с буквы или символа подчеркивания. В Паскале при формировании имен (а также служебных слов) прописные и соответствующие строчные буквы не различаются.


 

Типы данных

Кроме разделения данных на переменные и константы, существует классификация данных по типу. Описание переменных прежде всего состоит в объявлении их типа. Тип данных характеризует форму их представления в памяти компьютера, и, следовательно, область значений. Каждый тип характеризуется набором выполняемых над данными операций. Традиционно в универсальных языках программирования имеются такие стандартные типы, как целый, вещественный, символьный и логический[5].

Существование двух числовых типов (целого и вещественного) связано с двумя возможными формами представления чисел в памяти компьютера.

Данные целого типа хранятся в форме представления с фиксированной точкой. Для нее характерны абсолютная точность представления чисел и выполнения операций над ними, а также ограниченный диапазон значений чисел. Целый тип используется для данных, которые в принципе не могут иметь дробной части (количество людей, машин, и т. д., номера и счетчики).

Тип вещественный соответствует форме представления чисел с плавающей точкой, для которой характерны приближенное представление числа с заданным количеством значащих цифр (знаков мантиссы) и большим диапазоном порядка числа, что обеспечивает возможность представления как очень больших, так и очень малых по абсолютной величине чисел. В силу приближенного представления данных вещественного типа сравнение их на равенство является некорректным.

В современных реализациях универсальных языков программирования обычно существует несколько целых и несколько вещественных типов, каждый из которых характеризуется определенным размером отводимой под одно значение памяти и, соответственно, определенным диапазоном значений чисел, а для вещественных типов - и определенной точностью (числом цифр мантиссы).

Данные символьного типа принимают значения на всем множестве допустимых для данного компьютера символов. Каждому символу соответствует двоичный код, все коды символов собраны в специальные стандартные таблицы кодирования. В настоящее время используются таблицы ANSI (в которой для хранения одного символьного значения отводится один байт) и UNICODE (код одного символа занимает два байта). Эти таблицы совместимы: первые 256 кодов UNICODE совпадают с кодами ANSI. Существование двух кодовых таблиц объясняется необходимостью поддержки приемственности программного обеспечения при развитии компьютерной техники: для уже устаревших 16-разрядных компьютеров используется таблица ASCII, первая половина которой совпадает с ANSI.

В Паскале для описания данных символьного типа используется ключевое слово char. В версии Borland Pascal используется только система кодированияANSI. В Object Pascal, кроме типа char, имеется тип widechar, поддерживающий кодировку UNICODE.

Данные логического типа в Паскале описываются с помощью ключевого слова boolean.

Используемые в различных версиях Паскаля целые и вещественные типы представлены в таблицах 1-4.

Таблица 1.

Стандартные целые типы данных Borland Pascal
(операционная среда MS DOS)

Тип данных Размер, байты Диапазон значений
byte   0...255
shortint   -128...127
word   0...65535
integer   -32768...32767
longint   -2147483648...2147483647

Таблица 2.

Стандартные целые типы данных Object Pascal
(операционная среда Windows)

Тип данных Размер, байты Диапазон значений
byte   0...255
shortint   -128...127
word   0...65535
smallint   -32768...32767
integer   -2147483648...2147483647
longint   -2147483648...2147483647
longword   0…4294967295
int64   -263…+263-1

Таблица 3.
Стандартные вещественные типы данных Borland Pascal (операционная среда MS DOS)

Тип данных Размер, байты Диапазон порядка Число цифр мантиссы
single   -45...+38 7…8
real   -39…+38 11…12
double   -324...+308 15…16
extended   -4951...+4932 19…20
comp[6]   -263-1…+263-1 19…20

Таблица 4.
Стандартные вещественные типы данных Object Pascal
(операционная среда Windows)

Тип данных Размер, байты Диапазон порядка Число цифр мантиссы
single   -45...+38 7…8
real48   -39…+38 11…12
real   -324...+308  
double   -324...+308 15…16
extended   -4951...+4932 19…20
comp[7]   -263-1…+263-1 19…20
currency[8]   ‑922337203685477.5808…922337203685477.5807 19…20

 

Заметим, что помнить эти таблицы совершенно необязательно. Для написания программ первой части пособия нам потребуются всего два числовых типа: вещественный real и целый integer.

Все рассмотренные в этом параграфе типы относятся к стандартным (т. е. встроенным в язык) типам Паскаля. У пользователя имеется возможность задать собственные, нестандартные типы в разделе TYPE программы – об этом см. §§1.5.2, 1.6.

Правила записи констант

Мы рассмотрим простейшие[9] правила записи явных констант. Целая десятичная константа - это последовательность десятичных цифр, например, 12678909. Последовательность шестнадцатеричных цифр (0, 1,..., 9, A, B, C, D, E, F), перед которой записан символ доллара $, представляет собой целую шестнадцатеричную константу; например, $FF - шестнадцатеричное представление числа 255.
Соответствующие отрицательные значения получаются в результате применения унарной операции минус (-), см. п.1.2.5.

Простейшие правила записи вещественных констант состоят в следующем: разделителем между целой и дробной частью числа является точка; можно использовать показатель десятичного порядка Е (большую или малую латинскую букву). Пример вещественных констант: 100.01, 3.44Е3 (значение 3.44*103), 1.0 Е-2 (значение 0.01).

Для представления числовых констант в памяти компьютера выбирается подходящий тип в соответствии с таблицами 1-4. Естественно, при этом следует выбирать минимальный диапазон и минимальное число значащих цифр. Такой выбор не только уменьшает память и время работы программы, но и повышает ее надежность, так как компилятор может обеспечить контроль над значениями переменных (чтобы они находились в указанных границах).

Символьная константа - это соответствующий символ клавиатуры, заключенный в апострофы. Примеры: 'a', '5', '?'. Другой способ задания констант - в виде # код, например, #32 –пробел, #90 буква Z.

Уже при написании простейших программ при записи операторов вывода (а иногда и ввода) нам потребуется понятие строковой константы. Это последовательность символов, заключенная в одинарные кавычки (апострофы). Например: ‘Введите исходные данные'.

Логические константы обозначаются следующим образом: false – ложь, true - истина

1.2.4. Описание переменных и именованных констант
в Паскале

Пока мы рассматриваем данные, занимающие одну ячейку памяти. Такие данные называются простыми. Простые переменные описываются в разделе переменных после слова Var с помощью инструкций вида:

Var список_имен_переменных: тип;

Слово список при описании фрагментов алгоритмического языка обычно означает, что элементы списка перечисляются через запятую. Инструкции в Паскале разделяются точкой с запятой (обратите внимание на этот знак в конце описания).

Пример описания:

Var a, b:real; n,i, j,k:integer;

Именованные константы описываются в разделе констант после ключевого слова Const с помощью инструкций вида:

Const имя_константы=значение константы;

Здесь ключевое слово const показывает, что определяемое данное имеет постоянное значение, т. е. доступно только для чтения. Тип константы определяется по ее значению.

Общепринятый (обязательный для стандартной версии Паскаля, но необязательный в реализациях) порядок следования разделов такой: сначала идет раздел констант, потом раздел переменных. В Паскале требуется, чтобы все используемые имена (в том числе переменные и константы) были описаны.

 

Выражения

Выражения в Паскале, как и в других алгоритмических языках, различаются по типу (в зависимости от участвующих в выражении операндов и операций) и бывают арифметическими (числовыми), логическими (булевскими), символьными. Напомним очевидное определение: выражение - это операнды, соединенные знаками операций. Тип операндов должны быть согласован с операциями, используемыми в выражении. Операнд - это либо константа, либо переменная (простая или с индексами), либо указатель функции, либо выражение, заключенное в скобки. Особенность логических операндов состоит в том, что логическим операндом может быть и соотношение.

Правила записи выражений в различных алгоритмических языках отличаются допустимым набором операций, их обозначениями, приоритетом выполнения. В алгоритмическом языке Паскаль имеются следующие операции:

Арифметические: * (умножение), div (деление нацело), mod (остаток от целочисленного деления), / (деление), + (сложение), - (вычитание).

Логические: NOT (отрицание), OR (дизъюнкция), AND (конъюнкция).

Соотношения: = (равно), <> (неравно), < (меньше), > (больше), <= (меньше или равно), >= (больше или равно), IN (вхождение в множество).

Операции DIV и MOD, естественно, применимы только к целым операндам.

Действия выполняются слева направо с учетом следующих приоритетов (перечислены в порядке убывания):

1) NOT;

2) мультипликативные операции: *, /, div, mod, AND;

3) aддитивные операции: +, -, OR;

4) соотношения: =, <>, <, >, <=, >=, IN.

Программистам, привыкшим к СИ и Фортрану, следует быть внимательными: приоритеты отличны от принятых в этих языках.

Например, в паскалевском выражении

(a>0.1) AND (b<0)

скобки обязательны: при их отсутствии первой будет выполняться операция AND, что логически неверно. Заметим, что компилятор при этом выдаст сообщение о несоответствии типа операндов (0.1 и b) типу операции AND.

Смешивать типы операндов допустимо лишь для арифметических выражений (один операнд типа integer, другой - типа real). Тип результата в этом случае определяется следующим образом: операции *, +, - при целых операндах дают целый результат; если хотя бы один операнд вещественный, то эти операции дают вещественный результат. Операция / дает вещественный результат при любых операндах (в отличии от СИ и Фортрана).

В таблице 5 приведены некоторые часто используемые стандартные функции Паскаля.


Таблица 5. Некоторые встроенные функции Паскаля

Обозначение Паскаля Смысл (математическое обозначение) Тип аргумента Тип результата
abs(x) abs(x) числовой совпадает с типом аргумента
arctan(x) arctg(x) вещественный вещественный
cos(x) cos(x) вещественный вещественный
exp(x) ex вещественный вещественный
ln (x) ln x вещественный вещественный
sin (x) sin x вещественный вещественный
sqr(x) x2 числовой совпадает с типом аргумента
sqrt(x) вещественный вещественный
round(x) преобразование из вещественного в целое с округлением вещественный целый
trunc(x) преобразование из вещественного в целое с отбрасыванием дробной части вещественный целый
odd(x) целый булевский
ord(x) номер х в последовательности значений порядкового типа[10] любой порядковый целый
succ(x) следующее значение порядкового типа любой порядковый совпадает с типом аргумента
pred(x) предыдущее значение порядкового типа любой порядковый совпадает с типом аргумента

 


 

1.3. Операторы преобразования данных

Оператор присваивания

Оператор присваивания осуществляет преобразование внутренних данных. Он имеет вид

<переменная>:=<выражение>

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

Переменная и выражение должны иметь одинаковый тип; имеются два исключения из этого правила:

§ можно использовать вещественные или целые типы разной мощности (например, integer – shortint), при этом значение результата должно принадлежать диапазону допустимых значений для типа переменной – см. таблицы 1-4;

§ переменой вещественного типа можно присваивать выражение целого типа (но не наоборот!).

Очень часто переменная, стоящая слева от знака присваивания, участвует и в выражении, стоящем справа. В этом случае новое значение переменной вычисляется через предыдущее (старое) ее значение. Такие ситуации называются накапливанием.

Примеры

k:=k+1;{увеличение значение k на единицу}

S:=S+a; {значение переменной S увеличивается на a}

p:=p*i; {значение переменной р увеличивается в i раз}

Необходимо, чтобы накапливаемой переменной до оператора накапливания было задано некоторое начальное значение. Операторы такого вида обычно используются в циклах (см. §1.4.4).

Понятие ввода и вывода

Под вводом понимается процесс передачи данных с внешних устройств в память компьютера, под выводом - передачи данных из памяти компьютера на внешние устройства. Ввод и вывод являются важнейшими операторами, так как с их помощью осуществляется общение пользователя с программой. Без операторов вывода программа вообще не имеет права на существование: если она ничего не сообщает пользователю, то зачем она нужна?

Вводу подлежат исходные данные. Это переменные, начальные значения которых меняются от одного выполнения алгоритма к другому. Выводятся, естественно, результаты программы. Соответствующие данные называются выходными данными. Все остальные данные называются промежуточными. Разделение данных на исходные, выходные и промежуточные называется классификацией данных по функциональному признаку. Определение, какие данные будут исходными, а какие выходными, является первым и важнейшим этапом разработки алгоритма и программы.

Последовательность значений на входном (или выходном) устройстве часто называют потоком.

В Паскале для ввода и вывода используются встроенные в язык стандартные подпрограммы, и операторы ввода и вывода являются обращениями к этим подпрограммам.

В этом разделе пособия мы рассмотрим только операторы ввода с клавиатуры и вывода на экран монитора. Работа с внешней памятью (файлами на магнитных дисках) будет рассмотрена в третьей части пособия.

Оператор вывода

Оператор вывода имеет вид:

WRITE(V1,V2,...,VN)

и означает вывод на экран монитора значений выражений V1,V2,...,VN (без перехода к следующей строке по окончании вывода). Последовательность V1,V2,...,VN называется списком вывода. В частности, элементом списка вывода Vi, i=1,...,M, может являться переменная (простая или с индексом[11]) или константа.

Оператор WRITELN означает переход к новой строке (т.е. вывод символа конца строки).

Оператор WRITELN(V1,V2,...,VN) эквивалентен двум операторам

WRITE(V1,V2,...,VN); WRITELN

Вместо Vi (i=1,2,...,N) может стоять группа:

Vi:Li:Mi,

где Li - минимальная длина поля значения переменной (если длина поля избыточна, то поле слева заполняется пробелами; если недостаточна, то транслятор автоматически увеличивает длину); если Li не указано, то используется стандартное для данной среды программирования значение.

Mi - длина дробной части, указывается только для вещественных чисел; если параметр Мi указан, то вещественное число выводится в формате с фиксированной точкой, иначе - в экспоненциальном формате, причем используется стандартный для данной среды программирования вид экспоненциального формата.

Программисты, работавшие с Фортраном, будут разочарованы: в Паскале (как и в Си) массивы вводятся и выводятся только поэлементно.

Пример.

Var s:real; a,b:integer;

begin…

writeln(‘a=’,a, ‘ b=’,b);

writeln(‘ s=’, s:4:1);…

end.

На экран будет выведена информация в виде:

a=<a> b=<b>

s=<s>

Здесь конструкция <имя переменной> означает значение этой переменной. Заметим, что следующие значения будут выводиться с новой строки, так как для вывода s использовался оператор writeln. Такое схематичное изображение выводимой (или вводимой) информации называется формой вывода (ввода).

Если a=-2, b=93, s=3.22, то на экране получим:

a=-2 b= 93

s= 3.2

Примеры оператора WRITELN также представлены на рис.1.

 

Оператор ввода

Оператор

READ(V1,V2,...,VN)

означает ввод значений переменных V1,V2,..., VN. Переменные могут иметь индексы. Константы и выражения в списке ввода недопустимы, так как не подлежат изменению.

Встретив оператор ввода, компьютер приостанавливает выполнение программы до окончания задания значений исходных данных пользователем (в профессиональной терминологии программистов - организуется прерывание для ввода). Вводимые значения могут разделяться пробелами (одним или несколькими) или переводом строки (нажатием клавиши Enter); допустимы в качестве разделителей значений исходных данных и некоторые другие символы. Обратите внимание, что после последнего введенного значения надо обязательно нажать Enter. До нажатия клавиши Enter вводимые значения накапливаются в буфере ввода, нажатие этой клавиши служит командой для передачи этих значений в память.

Приведенный выше оператор эквивалентен последовательности операторов:

READ(V1);READ(V2);...;READ(VN)

Оператор READLN предусматривает пропуск вводимых символов до нажатия клавиши Enter, т. е. до ввода символа конца строки (END OF LINE).

Оператор READLN(V1,V2,...,VN) эквивалентен двум операторам

READ(V1,V2,...,VN); READLN

или последовательности операторов

READ(V1);READ(V2);...;READ(VN);READLN

Оператор ввода с клавиатуры всегда предваряется выводом фразы, приглашающей к вводу. Иначе пользователь может только догадываться, по какой причине программа находится в состоянии ожидания; такая ситуация является необъяснимым остановом и может интерпретироваться как “зависание” компьютера.

Пример.

Var i:integer; a:real;

begin

writeln(‘Введите i и a’); { вывод приглашения к вводу }

readln(i, a);...{оператор ввода}

Форма ввода:

Введите i и a

В фигурные скобки принято заключать альтернативные фрагменты формы ввода или вывода. В данном примере значения i и a можно располагать на одной строке экрана, разделяя их пробелами, а можно на разных строках, разделяя их нажатием клавиши Enter.



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 941; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.89.56.228 (0.098 с.)