Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Символьные и строковые типы данных



 

Научившись записывать числовые данные, познакомимся с записью и использованием символьных и строковых данных. Паскаль позволяет определять тип Char, имеющий размер в один байт и содержащий один символ. Символьные константы содержат один символ, заключенный в апострофы (‘A’, ‘e’, ‘r’, ‘2’). Заметим, что ‘2’ означает символ 2, а 2 означает целое число 2 (и 2.0 – вещественное число).

 

Program DoRatio;

Var

A, B: Integer;

Ratio: Real;

Ans: Char;

Begin

Repeat

Write(‘Enter two numbers: ‘);

ReadLn(A, B);

Ratio := A / B;

WriteLn(‘The ratio is ‘, Ratio);

Wrie(‘Do it again? (Y/N) ‘);

ReadLn(Ans);

Until UpCase(Ans) = ‘N’;

End.

 

После вычисления коэффициента, выдается сообщение:

 

Do it again? (Y/N).

(Повторить? (Да/Нет)).

 

Программа находится в состоянии ожидания одного из указанных символов и нажатия клавиши “Enter”. Если Вы нажмете “n” или заглавную “N”, то условие “until” будет выполнено и цикл закончится. В случае, если Вы ответите “Y” (“y”), то выполнение цикла будет продолжено.

“N” и “n” не одно и то же, потому, что они имеют различные значения в коде ASCII. Каждый символ имеет свой код ASCII, представленный 8-битным значением (символ занимает 1 байт).

В большинстве случаев используются строки символов. В стандартном Паскале не поддерживается тип строк символов. В Turbo Pascal реализована эта возможность. Рассмотрим программу

 

Program Hello;

Var

Name: String(30);

Begin

Write(‘What is your name? ‘);

ReadLn(Name);

WriteLn(‘Hello, ‘, Name);

End.

 

Переменная Name объявлена как string (строка), и под нее резервируется 30 байт (для 30 символов). Кроме того, Turbo Pascal отводит еще один байт, в котором содержится текущая длина строки. В этом случае, независимо от того, какой длины будет введено имя, оператор WriteLn распечатает имя указанной длины. Если будет введено имя больше 30 символов, то будут использоваться только первые 30 символов, а остальные будут проигнорированы.

При описании строковой переменной можно указывать ее размер, но не более 255. По умолчанию длина строковой переменной – 255 символов.

 

 

Булевские данные

 

Встроенный тип Boolean данных в Turbo Pascal имеет два возможных значения: True и False (истина и ложь). Можно объявить переменную типа Boolean, и присвоить ей значение True или False, или же, что более важно, присвоить ей значение выражения, которое при вычислении принимает одно из этих значений.

Булевское выражение – это выражение, которое принимает значение True или False. Оно состоит из выражений отношений, булевских операторов, булевских переменных и/или других булевских выражений. Например:

 

While (Index <= Limit) and not Done do …

 

While содержит булевское выражение. Булевское выражение в этом случае все, что находится между ключевыми словами while и do. Done – это переменная (или функция) булевского типа.

 

 

Тип массив

 

Массивы содержат фиксированное число компонент одного типа – тип компоненты. В типах индекса, по одному для каждой размерности массива, указывается число элементов. Допустимыми типами индекса являются все порядковые типы, за исключением Longint. Массив может быть проиндексирован по каждой размерности всеми значениями соответствующего индекса; число элементов поэтому равно числу значений каждого индекса. Максимальное число размерностей – четыре.

Приведем пример объявления переменной типа массив:

 

Var

Mas1: array[1..100] of Real;

 

В приведенном примере объявлена матрица вектор из ста элементов вещественного типа.

Многомерные массивы можно объявлять как массив массивов:

 

Mas2: array[1..10] of array[1..10] of Integer;

 

Для объявления таких массивов обычно используют краткую форму, которая эквивалентна приведенной выше:

 

Mas2: array[1..10, 1..10] of Integer;

 

В обоих случаях объявляется матрица целых чисел размером 10х10.

Для доступа к элементам массива необходимо использовать идентификатор массива за которым указывается индекс (или набор индексов), задающий элемент. Например:

 

 

Mas1[8]      -      указывает на восьмой элемент;

 

I := 4; J := 5;

Mas2[I, J]   -      указывает на пятый элемент в четвертой строке.

 

 

Идентификаторы

 

До сих пор в примерах содержались идентификаторы переменных без описания ограничений и правил их образования. Рассмотрим их более подробно.

Имена, которые даются константам, типам данных, переменным, функциям, известны как идентификаторы.

Идентификаторы использовались для:

 

Integer, Real, String           встроенных типов данных;

Hello, DoRatio                   названия основных программ;

Name, A, B, Ratio             переменных;

Write, WriteLn, ReadLn    имен встроенных процедур.

 

Turbo Pascal имеет несколько правил образования идентификаторов. Краткое описание правил:

- все идентификаторы начинаются с буквы или знака подчеркивания (a..z, A..Z, _ ). Последующими символами могут быть буква, знак подчеркивания, цифра (0-9). Другие символы недопустимы.

- Идентификаторы рассматриваются без учета регистров (прописные и строчные буквы не различаются). Это значит, что a..z тождественно A..Z. Например index тоже самое что и Index, и INDEX.

- Идентификаторы могут иметь различную длину, но используются только первые 63 символа.

 

Операторы

 

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

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

Большинство операторов в Паскале бинарные, имеют два операнда; унарные операторы имеют один операнд. Бинарные операторы имеют обычно алгебраическую форму, например a+b. Унарный оператор предшествует своему операнду, например –b.

В сложных выражениях порядок выполнения операций определяется правилами приоритета.

 

Приоритет операторов

Таблица 4.1.

Операторы Приоритет Категория
Not Первый (высший) Унарный
*, /, div, mod, and Второй Мультпликативные
+, -, or, xor Третий Аддитивные
=, <>, <, >, <=, >=, Четвертый (низший) Отношения

 

Операция равного приоритета выполняются слева направо, хотя компилятор может их перегруппировать для генерации оптимального кода.

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

 

 

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

 

Основной операцией является операция присваивания: Ratio := A/B. В Паскале оператор присваивания – это комбинация двоеточия и знака равенства: “:=”. В примере значение выражения A/B, стоящее справа от “:=”, присваивается переменной Ratio, стоящей слева.

 

 

Арифметические операторы

 

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

- умножение (*);

- деление целых (div);

- деление вещественных с остатком (/);

- остаток от деления (mod);

- сложение (+);

- вычитание (-).

 

Кроме того, поддерживаются унарные операторы:

- унарный минус (-b) – меняет знак числа на противоположный;

- унарный плюс (+b) – ничего не выполняет, введен для полноты.

 

Операторы отношений

 

Операторы отношений сравнивают два значения, возвращая в результате булевское значение True или False. В Паскале реализуются операторы:

 

>     - больше, чем;

>=   - больше, чем или равно;

<     меньше, чем;

<=   - меньше, чем или равно;

=     - равно;

<>   - не равно;

 

Почему необходимо знать, каков результат: True или False?

Введем следующую программу:

 

Program TestGreater;

Var

A, B: Integer;

Test: Boolean;

Begin

Write(‘Введите два числа: ‘);

ReadLn(A, B);

Test := A > B;

WriteLn(‘A больше чем B’, Test);

End.

 

Результат программы: True, если А больше В, и False, если А меньше или равно В.

 

Логические операторы

 

В Паскале есть четыре логических оператора:

And - логическое И;

Or   - логическое ИЛИ;

Xor - исключающее ИЛИ;

Not - логическое отрицание.

Эти операторы работают с логическими значениями (True и False) позволяя комбинировать выражения отношений, булевские переменные и булевские выражения.

 

 

Строковые операторы

 

Существует единственный оператор – “+”, который выполняет конкатенацию (соединение) двух строк.

Вывод

 

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

 

Процедура WriteLn

 

Вы уже использовали наиболее распространенную функцию Паскаля – подпрограмму WriteLn. Назначение ее – запись (вывод) информации на экран. Ее формат прост и гибок при использовании:

 

WriteLn(элемент, элемент, …);

 

Каждый элемент – это то, что Вы хотите вывести на экран и может быть: значением, таким как целое или вещественное число (3, 42, -1732.3), символом (‘a’, ‘Z’), строкой (‘Здравствуй мир’), булевским значением (True). Кроме того, может быть именованная константа (имя константы), переменная, вызов функции, если она возвращает значение целого типа, вещественное число, символ, строку или булевский тип. Все элементы печатаются в строку в заданном порядке. После вывода курсор устанавливается на начало следующей строки. Если есть необходимость оставить курсор в этой же строке после последнего элемента, то используйте

 

Write(элемент, элемент, …);

 

При выводе элементов WriteLn между ними автоматически пробелы между ними не вставляются. При желании иметь их, необходимо их учесть самим:

 

WriteLn(элемент,’ ‘, элемент,’ ‘, …);

 

Следующими операторами описывается вывод:

 

A := 1; B := 2; C := 3;

Name := ‘Frank’;

WriteLn(A, B, C);                          123

WriteLn(A, ‘ ‘, B, ‘ ‘, C);               1 2 3

WriteLn(‘Hi’, Name);                     HiFrank

WriteLn((‘Hi’,’, ‘, Name, ‘.’);        Hi, Frank.

Так же можно использовать параметры определения ширины поля для данного элемента. В этом случае оператор имеет формат:

 

WriteLn(элемент: длина, …);

 

Где длина – целое выражение (литерал, константа, переменная, вызов функции), определяющее общий размер поля для вывода элемента.

Рассмотрим следующую программу и полученный в результате вывод:

 

A := 10; B := 2; C := 100;

WriteLn(A, B, C);                          102100

WriteLn(A:2, B:2, C:2);                 10 2100

WriteLn(A:3, B:3, C:3);                 10 2100

WriteLn(A, B:2, C:4);                    10 2 100

 

Заметим, что элемент дополняется начальными пробелами слева в соответствии с указанной длиной. Само значение выравнивается справа.

Что, если размер поля меньше, чем необходимо? Во втором операторе WriteLn вышеприведенного примера для С=100, длина поля меньше, чем нужно, т.е. задано 2, нужно 3. При выводе Паскаль увеличивает размер до минимально необходимого.

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

 

X := 421.53;

WriteLn(x);                         4.2153000000E+02

WriteLn(x:8);                      4.2E+02

 

Поэтому, Паскаль позволяет добавить второй операнд длины:

 

Элемент: длина: количество цифр

 

Вторая цифра указывает, сколько цифр выводить для числа с фиксированной точкой после точки:

 

X := 421.53;

WriteLn(x:6:2);                   421.53

WriteLn(x:8:2);                   421.53

WriteLn(x:8:4);                   421.5300

 

Ввод

 

В стандартном Паскале есть две основных функции ввода информации Read и ReadLn, которые используются для чтения данных с клавиатуры.

Их формат:

 

Read(элемент, элемент, …);

ReadLn(элемент, элемент, …); ,

 

Где каждый элемент – это переменная целого, вещественного, символьного типа или строка. Числа должны отделяться друг от друга пробелами или нажатием клавиш Enter.

 

Условные операторы

 

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

 

Оператор If

 

Общий формат оператора:

 

If выражение

Then оператор 1

Else оператор 2,

 

где выражение – любое булевское выражение (вырабатывающее в результате True или False); оператор 1 и оператор 2 – операторы Паскаля. Если выражение принимает значение True, то выполняется оператор 1; в противном случае – оператор 2.

Два важных момента, на которые следует обратить внимание при использовании If/then/else.

Во-первых, оператор else не является обязательным, другими словами, допустимо использовать оператор if в следующем виде:

 

If выражение

Then оператор 1.

 

В этом случае оператор 1 выполняется только тогда, когда выражение имеет значение True. В противном случае оператор 1 пропускается и выполняется следующий оператор.

Во-вторых, если необходимо выполнить более одного оператора, в случае, когда выражение принимает значение True или False, то следует использовать составной оператор.

Составной оператор – это ключевое слово Begin, несколько операторов разделенных точкой с запятой и ключевое слово End.

 

В примере используется один оператор:

 

If B = 0.0 Then

WriteLn(‘Деление на нулю невозможно.’)

Использование составного оператора в предложении Else:

 

Else

Begin

Ratio := A/B;

Writeln(‘Отношение =’, Ratio)

End;

 

 

Оператор выбора Case

 

Оператор Case – мощное средство выбора альтернатив. Он позволяет уменьшить количество операторов If.

Оператор Case состоит из выражения (селектора) и списков операторов, каждому из которых предшествует метка того же типа, что и селектор. Это значит, что в данный момент выполняется тот оператор, у которого значение совпадает с текущим значением селектора. Если совпадения значений не происходит, то не выполняется ни один из операторов, входящих в case или же выполняются операторы, стоящие после необязательного слова else (else – расширение стандартного Паскаля).

Метка case состоит из любого количества констант или поддиапазонов, разделенных запятыми, за которым следует двоеточие (:), например:

 

       Case BirdSight of

       ‘C’, ‘c’: Curlens := Curlens + 1;

      ‘H’, ‘h’: Herons := Herons + 1;

       ‘E’, ‘e’: Egrets := Egrets + 1;

       ‘T’, ‘t’: Terns := Terns + 1;

        end; {case}

 

Диапазон записывается в виде двух констант, разделенных двумя точками “..”. Тип константы должен соответствовать типу селектора. Оператор, стоящий после двоеточия (:), выполняется в том случае, если значение селектора совпадает со значением константы или, если его значение попадает в диапазон значений.

 

Цикл.

 

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

Существует три основных вида циклов: цикл while, цикл repeat и цикл for. Рассмотрим их.

 

Цикл while.

 

Цикл while используется для проверки некоторого условия в начале цикла. Введите следующую программу:

 

      Program Hello;

      Var

            Count: Integer;

       Begin

             Count: = 1;

             While (Count <= 10) do

             Begin

                    Writeln (‘ Здравствуй и прощай !’ );

                     Inc (Count);

             End;

             Writeln (‘ Это конец’);

       End.

 

Во-первых, сначала переменной Count присвоится значение равное 1. Затем, при входе в цикл проверяется условие: значение Count меньше или равно 10. Если да, то выполняется тело цикла (операторы, находящиеся между ключевыми словами begin…end.) На экран выводится сообщение «Здравствуй и прощай». Значение Count увеличивается на 1. Возврат на начало цикла. Значение Count проверяется заново и тело цикла выполняется вновь, до тех пор пока значение переменной Count удовлетворяет условию. Как только значение Count становится равным 11, цикл завершается, и на экран выводится сообщение «Это конец».

Формат оператора цикла While:

 

While выражение Do оператор;

 

В цикле While вычисляется выражение. Если оно имеет результат – True, выполняется оператор. В противном случае выполнение цикла завершается.

 

8.2. Цикл Repeat … Until

 

Второй цикл Repeat … Until рассмотрим на примере программы DORATIO.PAS:

 

Program DoRatio;

Var

A, B: Integer;

Ratio: Real;

Ans: Char;

Begin

Repeat

Write(‘Введите два числа’);

ReadLn(A, B);

Ratio := A/B;

WriteLn(‘Отношение равно’, Ratio);

WriteLn(‘Повторить? (Y/N)');

ReadLn(Ans);

Until UpCase(Ans) = ‘N’;

End.

 

Как описывалось ранее, в этой программе повторяется выполнение операторов, пока ответ на вопрос – n или N (Повторить? Y/N). Другими словами, Repeat и Until повторяются до тех пор, пока значение выражения при Until не будет True.

Формат цикла:

 

Repeat

Оператор;

Оператор;

…………

Оператор;

Until выражение.

 

Существуют три основных отличия от цикла While:

- операторы в цикле Repeat выполняются хотя бы один раз, потому что проверка выражения осуществляется в конце тела цикла. В цикле While, если значение выражения False, тело его пропускается сразу.

- цикл Repeat выполняется пока выражение не станет True, в то время, как цикл While выполняется до тех пор, пока выражение имеет значение True. При замене одного типа цикла на другой необходимо на это обращать особое внимание. Рассмотрим программу HELLO, где цикл While заменен на цикл Repeat:

 

program Hello;

var

Count: Integer;

Begin

Count := 1;

Repeat

WriteLn(‘Здравствуй и прощай!’);

Inc(Count);

Until Count > 10;

WriteLn(‘Это конец”);

End.

 

Отметим, что теперь переменная Count проверяется на значение больше 10 (а в While было Count <= 10).

В заключение, в цикле Repeat может использоваться просто группа операторов, а не составной оператор. При использовании этого цикла не используются слова Begin … End, как в случае с циклом While.

Запомните, что цикл Repeat выполнится хотя бы один раз, в то время, как цикл While может ни разу не выполниться в зависимости от значения выражения.

 

 

Цикл For

 

Цикл For существует во многих языках программирования. В Паскале тоже. Однако, вариант этого цикла в Паскале как эффективен, так и ограничен.

Обычно, набор операторов выполняется фиксированное число раз, пока переменная (индексная) принимает значение в указанном диапазоне. Модифицируем знакомую программу HELLO следующим образом:

 

Program Hello;

Var

Count: Integer;

Begin

For Count := 1 to 10 Do

WriteLn(‘Здравствуй и прощай!’);

WriteLn(‘Это конец’);

End.

 

При выполнении этой программы видно, что цикл For выполняется так же, как и циклы While и Repeat. Фактически эквивалентно циклу While. Формат цикла For:

 

For индекс:= выражение 1 to выражение 2 do оператор

Где индекс – скалярная переменная (целого типа, символьного, булевского и любого перечисленного типа);

Выражение 1 и выражение 2 – выражения типа, совместимого с типом индекса; оператор – одиночный или составной оператор. Индекс увеличивается на 1 после каждого выполнения цикла Индекс можно уменьшить на 1. Для этого ключевое слово to заменяется на downto.

 

 

Цикл for эквивалентен следующей программе с циклом while:

 

Index :=expr1;

While index <= expr2 do

Begin

  Оператор;

  Inc (index)

End;

 

Главный недостаток цикла for – это возможность уменьшить или увеличить индекс только на 1.

Основные преимущества – краткость, возможность использования символьного и перечислимого типа в диапазоне значений.

 

 

Процедуры и функции.

 

Вы изучили условное и итеративное выполнение операторов программы. Теперь посмотрим, как можно выполнить один и тот же набор команд в разных местах программы и с разными данными. Можно объединить эту группу операторов в подпрограмму, которую можно вызвать по необходимости.

В Паскале есть два вида подпрограмм: процедуры и функции.

Главное различие между ними – это то, что функция возвращает значение и может быть использована в выражении:

X := sin(A);

 В то время, как процедура может быть вызвана:

WriteLn (“это проверка”);

Однако перед знакомством с процедурами и функциями, необходимо рассмотреть структуру программ.

 

Структура программ.

 

В стандартном Паскале программы имеют жесткий формат:

Program имя программы

Label

Метки;

Const

Объявление констант;

Type

Объявление типов данных;

Var

Объявление переменных;

Procedure и function;

Begin

Тело программы

End.

Наличие всех пяти секций объявлений – Label, Const, Type, Var, Procedure и function – в Вашей программе необязательно. Однако для стандартного Паскаля, если они присутствуют, порядок их следования строго регламентирован, и в программе они должны присутствовать только один раз. За секцией объявлений, следуют процедуры и функции, и только затем тело программы.

Turbo Pascal обеспечивает более гибкую структуру программы. Главное – это оператор program должен быть первым, а тело программы последним. Порядок описания остальных секций жестко не регламентирован, но идентификаторы должны быть объявлены до их использования во избежание ошибок компиляции.

 

 


Поделиться:



Последнее изменение этой страницы: 2019-05-08; Просмотров: 184; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.166 с.)
Главная | Случайная страница | Обратная связь