Программирование на Pascal / Delphi / Методичка - Borland Pascal 7.0 / ЛР6_И_Строки и записи
.pdfМинистерство образования и науки Российской Федерации Государственное образовательное учреждение
высшего профессионального образования Уфимский государственный авиационный технический университет
ПАСКАЛЬ (СТРОКИ И ЗАПИСИ)
МЕТОДИЧЕСКИЕ УКАЗАНИЯ
к лабораторным работам по курсу «Информатика»
Составитель Гельштейн Я.М.
Уфа 2004
|
СОДЕРЖАНИЕ |
|
Лабораторная работа № 1................................................................................... |
3 |
|
СТРОКИ...................................................................................................................... |
3 |
|
1.ЦЕЛЬ РАБОТЫ...................................................................................................... |
3 |
|
2. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ............................................................................... |
3 |
|
2.1 |
Основные понятия и определения............................................................... |
3 |
2.2 |
Операции со строками ................................................................................... |
4 |
2.3 |
Процедуры для обработки строк.............................................................. |
7 |
2.4 |
Функции для обработки строк.................................................................. |
8 |
3. ПРИМЕР РЕШЕНИЯ ЗАДАЧИ ОБРАБОТКИ СТРОКОВЫХ |
|
|
ДАННЫХ.................................................................................................................... |
8 |
|
3.1 |
Задание .............................................................................................................. |
8 |
3.2 |
Блок-схема алгоритма.................................................................................... |
9 |
3.3 |
Текст программы.......................................................................................... |
10 |
3.4 |
Протокол работы программы .................................................................... |
11 |
4. ЗАДАНИЕ........................................................................................................... |
11 |
|
5.КОНТРОЛЬНЫЕ ВОПРОСЫ........................................................................... |
12 |
|
Лабораторная работа № 2...................................................................................... |
13 |
|
ЗАПИСИ.................................................................................................................... |
13 |
|
1.ЦЕЛЬ РАБОТЫ.................................................................................................... |
13 |
|
2. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ............................................................................. |
13 |
|
2.1 |
Основные понятия и определения............................................................. |
13 |
2.2 |
Оператор присоединения WITH ................................................................ |
15 |
2.3 |
Записи с вариантами.................................................................................... |
17 |
3. ПРИМЕР РЕШЕНИЯ ЗАДАЧИ С ИСПОЛЬЗОВАНИЕМ ДАННЫХ |
|
|
ТИПА «ЗАПИСЬ» ................................................................................................... |
18 |
|
3.1 |
Задание ............................................................................................................ |
18 |
3.2 |
Блок-схема алгоритма.................................................................................. |
18 |
3.3 |
Текст программы......................................................................................... |
19 |
3.4 |
Протокол работы программы................................................................. |
20 |
4. ЗАДАНИЕ........................................................................................................... |
20 |
|
5.КОНТРОЛЬНЫЕ ВОПРОСЫ........................................................................... |
22 |
|
ТРЕБОВАНИЯ К ОФОРМЛЕНИЮ ОТЧЕТА ................................................. |
22 |
|
ЛИТЕРАТУРА......................................................................................................... |
23 |
|
Приложение. Таблица обмена информацией (фрагмент) ASCII CODE |
|
|
CARD.......................................................................................................................... |
23 |
Лабораторная работа № 1
СТРОКИ
1.ЦЕЛЬ РАБОТЫ
Целью работы является приобретение навыков алгоритмизации и программирования задач, оперирующих строковыми типами данных:
-ввод и вывод строковых данных;
-обработка строковых данных;
-использование стандартных процедур и функций языка Pascal для обработки строковых данных.
2. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ
2.1Основные понятия и определения
ВПаскале существует тип данных STRING (строка), специально предназначенный для обработки строк (цепочек символов). Этот тип данных занимает промежуточное положение между простыми типами данных (целочисленные, вещественные, логические, символьные, интервальные, перечисляемые) и структурированными типами данных (массивы, записи, множества).
Обработка строковых данных является необходимым элементом программ, работающих с текстами. К таким программам относятся программы лингвистического анализа текстов, текстовые редакторы, программы, работающие в диалоговом (интерактивном) режиме, программы, содержащие текстовые пояснения результатов своей работы.
Строка – последовательность символов (от 0 до 255), заключенная в апострофы. При составлении программ используются строковые константы и строковые переменные.
Строковые константы – элементы данных, значения которых известны заранее, описаны в разделе описания констант и в ходе выполнения программы не изменяются. Формат описания строковых констант
CONST
<идентификатор> = <значение>;
Например,
CONST
ZAG = `Результат расчета`;
VAR1 = ` Вариант №1 `;
VAR2 = ` Вариант № 2`;
KNIGA = `Паскаль 7.0`;
Строковые переменные – элементы данных, которые по ходу выполнения программы могут изменять значение и количество символов в пределах от 0 до
числа, равного заданной программистом максимальной длины строковой переменной. Определить строковую переменную можно двумя способами.
1. Определение через описание типа в разделе описания типов. Формат
TYPE
<имя типа> = STRING [максимальная длина строки];
VAR
<идентификатор1, идентификатор2,…> : <имя типа>;
где
STRING – зарезервированное слова (строка); максимальная
длина строки – наибольшее допустимое количество символов переменной данного типа ( ≤ 255).
Например,
TYPE
FLO = STRING [130];
FTK = STRING; {По умолчанию длина строки равна 255}
VAR
ST1 : FLO;
ST2, ST3 : FTK;
2. Определение непосредственно в разделе описания переменных
Формат
VAR
ST4, ST5 : STRING [60]; ST6,ST7 : STRING;
2.2 Операции со строками
Выражения, в которых операндами служат данные строкового типа, называются строковыми выражениями. Они могут состоять из:
-строковых констант;
-строковых переменных;
-знаков операций;
-указателей процедур;
-указателей функций.
Над строковыми данными допустимо выполнять операции сцепления и операции отношения.
Операции сцепления (+) применяются для сцепления нескольких строк в одну результирующую строку, длина которой не должна превышать 250 символов. Например, выражение
`Процессор ` + ` Intel ` + ` Celeron ` + ` 1.7/20 GHz`
дает результат
`Процессор Intel Celeron 1.7/20 GHz`,
а выполнение операторов
STR1 := `Группа студентов `; STR2 := `ФК418`;
STR3:= STR1+STR2;
дает строку `Группа студентов ФК418`. Такой же результат можно получить и так
STR3:= STR1+`ФК418`.
Операции отношения (=, <> , < , > , >= , <=) проводят сравнение двух строковых операндов и имеют приоритете более низкий, чем операции сцепления. Это значит, что сначала выполняются все операции сцепления (если они присутствуют в данном строковом выражении), а затем операции отношения.
Сравнение строк производится слева направо до первого несовпадающего символа, и та строка считается больше, в которой первый несовпадающий символ имеет больший номер в стандартной таблице обмена информацией (см. Приложение).
Результат выполнения операций отношения над строковыми данными всегда имеет булевский тип (boolean), и равен TRUE, если выражение истинно, и FALSE, если выражение ложно.
Например, |
|
Выражение |
Результат |
`COM1` < `KOM2` |
TRUE |
`DOS1.0` > `DOC1.0` |
TRUE |
`АККОРД` < `AKKORD` |
FALSE |
Строки считаются равными, если они равны по длине и содержат одни и те же символы.
Если строки имеют различную длину. Но в общей части символы полностью совпадают, считается, что более короткая строка меньше.
Для присваивания строковой переменной результата строкового выражения используется оператор присваивания (:=).
Например,
STR10:= `Название факультета`;
STR11:= STR10 + `ФЭМФ`;
Если значение переменной после выполнения оператора присваивания превышает по длине максимально допустимую величину, указанную при описании этой переменной, то все лишние символы справа отбрасываются.
Например, |
|
|
Описание |
Строковое выражение |
Получаемое значение |
переменной А |
|
переменной А |
A : STRING [14]; A : STRING [9]; A : STRING [6];
A := `Группа ФК-418`; A := `Группа ФК-418`; A := `Группа ФК-418`;
`Группа ФК-418` `Группа ФК` `Группа`
В одно выражение допускается включать операнды строкового и литерного (CHAR) типа. Если при этом литерной переменной присваивается значение строкового типа, фактическая длина строки должна быть равна единице, иначе возникает ошибка выполнения. Например,
VAR
LITERA : CHAR;
ST1, ST2: STRING [12]; BEGIN
LITERA := `A`; ST1 := ‘КЛАСС ’;
ST2 := ST1 + LITERA; {Дает результат « КЛАСС А»} ST1 := ‘B’;
LITERA := ST1; ST2 := ‘B2’;
LITERA := ST2; {Ошибка, т.к. литерной переменной нельзя присваивать значения длиной более одного символа}
К отдельным символам строки можно обращаться по номеру (индексу) данного символа в строке. Индекс определяется выражением целочисленного типа, которое записывается в квадратных скобках. Например, после выполнения присваивания
STR5 := ‘Специальность ФК’;
выражение STR5[1] дает обращение к первому символу, а выражение
STR5[15] + STR5[16]
дает значение «ФК».
Запись STR5[0] дает доступ к нулевому байту, содержащему значение текущей длины строки. Это значение не должно превышать число 255.
Замечание.
При вводе и обработке строковых данных кроме непосредственного указания входящих в эти строки символов для обозначения символов можно использовать соответствующие им ASCII коды. В этом случае перед числом, обозначающим код ASCII символа, необходимо поставить знак #. Таким образом можно в качестве элементов строк задавать и символы, не обозначенные на клавиатуре.
Например
VAR
ST1: STRING [32]; BEGIN
ST1:= ‘TEKST’ + ‘ ‘ + #3;
Переменной ST1 будет присвоено значение
‘TEKST ♥’
Фрагмент таблицы обмена информацией ASCII CARACTER CODE CARD приведен в Приложении.
2.3 Процедуры для обработки строк
Рассмотрим ряд процедур, используемых для обработки строк.
DELETE (ST, POZ, N) – удаление N символов строки ST, начиная с пози ции POZ.
Например, для значения ST ’ АБВГДЕ’ выражение DELETE (ST, 4,2) дает результат ‘АБВГ’.
|
INSERT (ST1, ST2, POZ) – вставка строки ST1 в строку ST2 начиная с |
по- |
зиции POZ. |
|
Например, |
|
VAR |
|
ST1, ST2, ST3: STRING; |
|
BEGIN |
|
ST2:= ‘Компьютер 2.0 GHz’; |
|
ST1:= ‘Celeron’; |
|
ST3:= INSERT (ST1, ST2, 11); |
|
В результате получается строка ST3, равная |
|
‘Компьютер Celeron 2.0 GHz’ |
STR (IBR, ST) – преобразование числового типа (integer, byte, real) значе ния величины IBR и помещение результата в строку ST. После имени переменной IBR может быть указан формат вывода.
Например, при значении переменной IBR, равном 2680, выражение
STR (IBR:7, ST) дает результат ‘ 2680’.
VAL (ST, IBR, COD) - преобразование значения ST в величину типа integer, byte, real и помещение результата в IBR. Значение ST не должно содержать незначащих про белов в начале и конце.
COD - целочисленная переменная.
Если при выполнении операции преобразования ошибки не обнаружено, рации преобразования ошибки не обнаружено, COD = 0. Если обнаружена ошибка, то COD будет содержать номер позиции первого ошибочного символа в ST, значение IBR будет неопределенно.
Например, при ST равном ‘1526’ выражение VAL (ST,IBR,COD) дает результат 1526, COD=0.
2.4 Функции для обработки строк
Рассмотрим ряд функций, используемых для обработки строк.
LENGTH (ST) - вычисляет длину в символах строки ST. Результат – целочисленного типа.
Например, при ST, равном ‘длина строки’, выражение LENGTH (ST) дает результат 12.
COPY (ST, POZ, N) – выделяет из строки ST подстроку длиной N символов, начиная с позиции POZ. POZ, N – целочисленные выражения.
Если POZ > LENGTH (ST), то результатом будет пробел;
Если POZ > 255, возникнет ошибка при выполнении.
Например, при значении ST= ‘ABCDEFG’, выражение COPY (ST,2,3) дает результат ‘BCD’.
CONCAT (STR1, STR2,…, STRN) – выполняет конкатенацию (сцепление)
строк STR1,STR2,…,STRN в том по рядке, в каком они указаны в списке параметров. Сумма символов всех сцепляемых строк должна быть не более 255.
Например, выражение CONCAT (‘AA’, ’BB’, ’CC’) дает результат
‘AABBCC’.
POS (ST1, ST2) – обнаруживает первое появление в строке ST2 подстроки ST1. Результат целочисленного типа и равен номеру той позиции, в которой находится первый символ подстроки ST1. Если в ST2 не найдено ST1, то результат равен 0.
Например, для значения ST2 ‘ABCDEFGH’ выражение POS (‘DE’,ST2) дает результат, равный 4.
UPCASE (CH) - преобразует строчную букву в прописную. Параметр и результат имеют тип CHAR. Обрабатывает только буквы латинского алфавита.
Например, для значения CH = ‘f’, выражение UPCASE (CH) дает резуль-
тат ‘F’.
3.ПРИМЕР РЕШЕНИЯ ЗАДАЧИ ОБРАБОТКИ СТРОКОВЫХ ДАННЫХ
3.1Задание
Разработать программу, удаляющую из вводимой с клавиатуры строки пробелы между словами и записывающую в массив N длину (число символов) каждого слова. Длина текста – не более 80 символов. Число слов – не более 10.
Наличие более одного символа ‘пробел’ подряд свидетельствует о конце строки.
3.2 Блок-схема алгоритма
На рис. 3.1 представлена блок-схема алгоритма. Используемые в блоксхеме и программе идентификаторы приведены в таблице 3.1.
|
|
Табл. 3.1 |
Обозначения |
Тип данных |
Примечание |
A |
STRING |
Исходный текст, символьные данные |
K |
INTEGER |
Количество символов в слове |
L |
INTEGER |
Порядковый номер слова |
I |
INTEGER |
Параметр цикла |
A[I] |
|
Текущий символ исходного текста |
N |
ARRAY |
Массив, содержащий значения длины каждого |
|
[1…10] OF |
слова исходного текста |
|
INTEGER |
|
N[L] |
|
Значение длины слова номер L |
J |
INTEGER |
Параметр цикла, используемого для перемеще- |
|
|
ния всех следующих символов исходного текста |
|
|
на одну позицию влево после того, как обрабо- |
|
|
тано очередное слова. |
PR |
INTEGER |
Переменная для управления повторной работой |
|
|
программы |
OTVET |
BYTE |
Переменная для управления началом обработки |
|
|
введенной строки |
3.3 Текст программы
Program Prim1;
Uses Crt;
Label 4; VAR
N: ARRAY [1..10] OF INTEGER; I, J, K, L: INTEGER;
A: STRING [80]; PR, OTVET:BYTE;
BEGIN CLRSCR;
REPEAT REPEAT
WRITELN (' Введите через пробел'); READLN (A);
WRITELN('Исходная строка'); WRITELN(A);
WRITELN ('Работаем дальше? 1 -да,0 -нет'); READLN (OTVET);
UNTIL OTVET=1; K:=0;
L:=0;
PR:=0;
FOR I:=1 TO length(a) DO IF (A[I]= ' ') THEN
BEGIN L:=L+1; N[L]:=K;
IF (A[I+1]=' ')THEN GOTO 4; FOR J:=i TO length(a) DO
A[J]:= A[J+1]; K:=1
|
END |
ELSE |
|
|
|
|
|
|
|
begin |
|
|
|
K:=K+1; |
|
|
|
N[L+1]:= K-l; |
|
4:WRITELN |
|
end; |
|
('Результирующая строка'); |
|||
WRITELN |
(A); |
|
число букв'); |
WRITELN |
('№ слова |
||
WRITELN |
(' |
FOR I:=1 TO L+1 DO |
|
N[',I,'] =',N[I]:6); |
WRITELN('Обработать еще одну строку? 1 –да 0 -нет'); READLN(PR);
UNTIL PR=0
END.