
- •Лабораторный практикум
- •Лабораторный практикум
- •Содержание
- •Введение
- •61002, Харків, вул. Фрунзе, 21.
- •61002, Харків, вул. Фрунзе, 21.
- •Порядок выполнения работы
- •Теоретические сведения
- •Пример решения задачи
- •Индивидуальные задания
- •Порядок выполнения работы
- •Теоретические сведения
- •Пример решения задачи
- •Индивидуальные задания
- •Порядок выполнения работы
- •Теоретические сведения
- •Пример решения задачи
- •Индивидуальные задания
- •Порядок выполнения работы
- •Теоретические сведения
- •Пример решения задачи
- •Примеры решения задач
- •Индивидуальные задания
- •Порядок выполнения работы
- •Теоретические сведения
- •Пример решения задачи
- •Примеры решения задач
- •Индивидуальные задания
- •Константы цвета
- •Порядок выполнения работы
- •Теоретические сведения
- •Пример решения задачи
- •Примеры решения задач
- •Индивидуальные задания
- •Порядок выполнения работы
- •Теоретические сведения
- •Пример решения задачи
- •Текст программы
- •Примеры решения задач
- •Индивидуальные задания
- •Порядок выполнения работы
- •Теоретические сведения
- •Пример решения задачи
- •Текст программы
- •Примеры решения задач
- •Индивидуальные задания
Порядок выполнения работы
Выберите метод решения задачи.
Выберите стандартные функции, необходимые для решения задачи.
Выберите форму представления данных.
Разработайте алгоритм решения задачи. Для ввода данных
используйте диалоговый режим или вводите с помощью генератора
случайных чисел. Результат решения задачи выведите на экран дисплея.
Теоретические сведения
Строковые данные
Строковые типы являются одним из наиболее полезных расширений языка Паскаль. Строковый тип обобщает понятие символьных массивов, позволяя динамически изменять длину строки.
Строковый тип данных определяет множество символьных цепочек произвольной длины ( от 0 до заданного их числа). Для определения строкового типа используется служебное слово STRING, вслед за которым в квадратных скобках указывается максимальная длина строки, например:
TYPE
LINE : STRING [80]
VAR MYLINE : LINE;
В приведенном примере переменная MYLINE в качестве своего значения может иметь любую последовательность символов (каждый из которых имеет стандартный тип CHAR произвольной длины - в пределах от 0 до 80 символов). Значение строковой переменной может быть присвоено оператором присваивания либо прочитано из некоторого файла.
MYLINE := ' пример строки ';
READLN (F, MYLINE);
В определении строкового типа максимальная длина строки может быть задана целым числом или константой целого типа. Указание максимальной длины может быть опущено. В этом случае подразумевается число 255 (максимально возможное).
TYPE
LINE = STRING;
LINE1 = STRING[255];
Таким образом важнейшее отличие строк от обычных символьных массивов заключается в том, что строки могут динамически изменять свою длину, например, если после присваивания:
MYLINE := ' короткая строка ';
длина строки составит 15 символов, то следующее присваивание:
MYLINE := MYLINE + ' стала длиннее ';
увеличит ее длину до 29 символов.
В Паскале механизм динамических строк реализован весьма просто: память под переменные строкового типа отводится по максимуму, а используется лишь часть этой памяти, реально занятая символами строки в данный момент.
Более точно: для описанной строковой переменной длиной N символов отводится N+1 байтов памяти, из которых N байтов предназначены для хранения символов строки, а один байт – для значения текущей длины этой строки.
Это объясняется с помощью рисунка:
0 1 2 3 к к+1 n-1 n
|
|
|
|
. . . . . . . |
|
|
. . . . . . . . . . . . . . . . . . . . . . . . . |
|
|
занятая часть строки незанятая часть строки
значение к - текущая длина строки
Кроме операции конкатенации (сложения) над значениями строковых типов определены операции сравнения с обычным смыслом:
< <= > >= = < >
при выполнении которых действуют следующие правила:
а) более короткая строка всегда меньше более длинной;
б) если длины сравниваемых строк равны, то происходит поэлементное
сравнение символов этих строк с учетом лексикографической
упорядоченности значений стандартного символьного типа CHAR.
В случае присваивания строковой переменной строкового выражения с длиной, большей, чем максимально допустимая для данной строки, происходит обрубание строки до максимальной длины. Эта ситуация не считается ошибочной, поэтому прерывания выполнения не происходит.
Пример:
VAR SHORTSTR : STRING[5];
BEGIN
SHORTSTR := ‘ очень длинная строка ’;
WRITELN (SHORTSTR);
{ будет напечатано : очень }
Доступ к отдельным элементам строк производится аналогично доступу к элементам одномерного массива: после имени строковой переменной необходимо в квадратных скобках указать выражение целого типа, обозначающее номер элементов строки.
Данная конструкция имеет тип CHAR и является переменной, т.е. может находиться в левой части оператора присваивания, например:
VAR MYLINE : STRING;
I : INEGER;
BEGIN
. . . . . . . . . . . . . . . .
FOR I := 1 TO LENGTH (MYLINE) DO
IF MYLINE[ I ] IN [ ‘ A’ . . ‘ Z’ ] THEN
MYLINE[ J ] := CHR ( ORD (MYLINE[ I ] ) + 1);
IN ( служебное слово ) - проверка принадлежности множеству |
Встроенные процедуры обработки строк
LENGTH (‘стр’) - определение длины строки. Ее параметр - выражение
строкового типа. Эта процедура возвращает целое значение,
равное текущей длине строки-параметра.
CONCAT (‘стр’, . . . , ‘стр’, ‘стр’ ) - сцепление строк. Например:
(‘стр’ + ‘стр’ = ‘стрстр’ ).
Если результирующая строка больше, чем 255 символов, то ее размер усекается до 255. |
POS (‘стр1’, ‘стр2’) - определяет номер самого левого (первого) вхождения ‘стр1’ в ‘стр2’. (Возвращает значение 0, если ‘стр1’ не содержится в ‘стр2’).
COPY (‘стр’, N1, N2) - выделяет из строки ‘стр’ подстроку длиной N2, начиная с позиции N1.
INSERT (‘стр1’, ‘стр2’, N) - помещает ‘стр1’ внутрь ‘стр2’, начиная с позиции N;
STR ( X, S ) - преобразует число X в строку S.
VAL ( S, X, ) - преобразует строку S в целочисленное X (выдает код 0, если
преобразование прошло успешно).
DELETE (‘стр1’, N1, N2) - удаляет подстроку ‘стр1’ длиной N2, начиная с
позиции N1.
Пример:
Ввести строку произвольной длины. Заменить разделительные
знаки . , : ; ( ) на пробелы. Новую строку напечатать.
PROGRAM SCR1
CONST RAZDEL : STRING [6] = ( , . : ; ( ) );
{ разделительные знаки в предложении }
K = 60;
VAR
STROKA : STRING [K]; { входная строка }
I, J : INTEGER;
BEGIN
READ (STROKA); WRITELN (STROKA);
FOR J := 1 TO K DO
BEGIN
FOR I := 1 TO 6 DO
IF STROKA [J] = RAZDEL [I] THEN
STROKA [J] := ‘ ‘;
END;
WRITELN (STROKA);
END.