Функции для работы со строками
VAR
S, S2 : STRING;
N, Poz : INTEGER;
1. LENGTH (S) – определяет текущую длину строки S. Результатом является значение целого типа.
Пример:
Значение S | Выражение | Результат |
‘test-5’ | Length(S) | |
‘(A+B)*C’ | Length(S) |
2. COPY (S, Poz,N) - копирует из строки S строку длиной N символов, начиная с позиции Poz.
Пример:
Значение S | Выражение | Результат |
‘ABCDEFG’ | Copy(S,2,3) | ‘BCD’ |
‘ABCDEFG’ | Copy(S,4,4) | ‘DEFG’ |
3. DELETE (S,Poz,N) - удаляет N символов из строки S, начиная с позиции Poz. Результат строкового типа.
Пример:
Исходное значение S | Оператор | Конечное значение S |
‘abcdefg’ | Delete(S,3,2) | ‘abefg’ |
‘abcdefg’ | Delete(S,2,6) | ‘a’ |
4. INSERT (S1, S2, Poz) - вставляет строку S1 в строку S2, начиная с позиции Poz. Результат - строка S2 (если она содержит символов больше, чем объявлено, то лишние символы отбрасываются).
Пример:
Исходное значение S2 | Оператор | Конечное значение S2 |
‘ЭВМ PC’ | Insert(‘IBM-‘,S2,5) | ‘ЭВМ IBM-PC’ |
‘Рис. 2’ | Insert(‘№’,S2,6) | ‘Рис. №2’ |
5. CONCAT (S1, S2, …, SN) – выполняет сцепление (конкатенцию) строк S1, S2, …, SN в одну строку. Результат строкового типа.
6. POS (S1, S2) – обнаруживает первое появление в строке S2 подстроки S1. Результат – целое число, равное номеру позиции, где находится первый символ подстроки S1. Если в строке S2 подстроки S1 не обнаружено, то результат равен 0.
Пример:
Значение S2 | Выражение | Результат |
‘abcdef’ | Pos(‘cd’,S2) | |
‘abcdcdef’ | Pos(‘cd’,S2) | |
‘abcdef’ | Pos(‘k’,S2) |
Пример:
Ввести строку длиной не менее 15 символов. Подсчитать общее количество введенных символов строки и количество знаков “+”, начиная с 7 символа по 15.
PROGRAM PRIMER8;
USES CRT;
LABEL
1;
VAR
S:STRING [100];
K,KP,I:INTEGER;
OTV: CHAR;
BEGIN
1:CLRSCR;
WRITELN (‘Введите строку длиной не менее 15 символов’);
READLN (S);
WRITELN (‘Введенная строка символов’);
WRITELN (S);
K:=LENGTH(S);
WRITELN (‘Количество символов в введенной строке=’,K:3);
KP:=0;
FOR I:=7 TO 15 DO
IF S[I]=‘+’
THEN KP:=KP+1;
WRITELN (‘Количество символов +, начиная с 7 по 15 символ=’,KP:2);
WRITELN (‘Будете вводить новые данные (Y/N)?’);
READLN (OTV);
IF (OTV=’Y’) OR (OTV=’y’)
THEN GOTO 1
END.
Задачи для самостоятельного решения:
1. Дана строка S, состоящая не более чем из 40 символов. В этой строке все вхождения букв ‘ABC’ заменить на ‘123’.
2. Используя функции для работы со строками получить из слова: а) «ВЕЛИЧИНА» слово «НАЛИЧИЕ»; б) «СТРОКА» слово «СЕТКА».
3. Сформировать символьную строку, состоящую из n звездочек (n – целое число, 1≤ n≤ 255).
4. Дан текст, в конце которого стоит точка. Подсчитать количество слов в тексте (слово – подстрока, не содержащая пробелов).
записи (комбинированный тип)
При решении экономических и информационных задач, которые обрабатывают ведомости, документы, списки и т.д., возникает необходимость объединять различные типы данных в одну группу. Для этого в языке Паскаль введено понятие записи (RECORD).
Запись – это совокупность ограниченного числа логически связанных компонент различного типа.
Каждая компонента записи называется полем.
Запись, как и другие переменные, объявляется в разделе описания и используется в разделе операторов. Описание записи можно делать как в разделе описания типов TYPE, так и в разделе описания переменных VAR.
Синтаксис описания записи:
TYPE
имя типа=RECORD
имя элемента 1:тип;
имя элемента 2:тип;
…..
имя элемента N:тип
END;
VAR
имя записи:имя типа;
Служебное слово RECORD (запись) выполняет роль открывающейся операторной скобки, END - закрывающейся операторной скобки. Внутри операторных скобок описываются элементы записи.
Для обращения к компонентам (полям) записи необходимо указать идентификатор записи, за которым ставится точка, а затем идентификатор поля (составное имя).
имя записи.имя поля
Имена полей внутри записи не должны повторяться. В языке Паскаль нет ни одной операции, которая воспринимала бы запись как нечто целое. Однако значение записи можно пересылать в другие переменные записи с помощью операторов присваивания.
Пример:
TYPE
STUDENT= RECORD
FIO: STRING [20];
D1, D2: 2..5;
PR: INTEGER
END;
VAR
GRUPPA: ARRAY [1..25] OF STUDENT;
В данном примере был создан тип STUDENT, который представляет собой запись, включающую фамилию, оценки по двум дисциплинам и количество пропусков. Эти данные по каждому студенту объединены в группу, т.е. получен массив записей GRUPPA. Этот массив содержит 25 записей типа STUDENT. Обращение к отдельным элементам записей: GRUPPA [15]. FIO
GRUPPA [24]. PR
GRUPPA [13]. D1
При обращении к компонентам записи необходимость указывать составные имена приводит к удлинению программы и громоздкости. Для устранения этого неудобства в языке Паскаль используется оператор присоединения, который позволяет осуществлять доступ к компонентам записи, таким образом, как, если бы они были простыми переменными.
Синтаксис оператора:
WITH
имя записи DO
BEGIN
операторы, содержащие имена элементов записи
END;
Внутри этого оператора к компонентам записи можно обращаться только с помощью имени компонент.
Пример:
Для каждого студента указаны фамилия, оценки по пяти дисциплинам. Требуется вычислить средний балл каждого студента.
PROGRAM PRIMER9;
USES CRT;
LABEL 1;
TYPE
VED = RECORD
FIO: STRING[30];
B1, B2, B3, B4, B5: 2..5;
SB: REAL
END;
VAR
GRUPPA: ARRAY[1..25] OF VED;
I, K: INTEGER;
OTV: CHAR;
BEGIN
1: CLRSCR;
WRITELN('ВВЕДИТЕ КОЛИЧЕСТВО СТУДЕНТОВ В ГРУППЕ');
READLN(K);
FOR I := 1 TO K DO
BEGIN
WRITELN('ВВЕДИТЕ ДАННЫЕ ', I:2, '-ГО СТУДЕНТА:');
WITH GRUPPA[I] DO
BEGIN
WRITELN ('ВВЕДИТЕ ФАМИЛИЮ И ИМЯ СТУДЕНТА');
READLN (FIO);
WRITELN ('ВВЕДИТЕ 5 ОЦЕНОК ПО ДИСЦИПЛИНАМ');
READLN (B1);
READLN (B2);
READLN (B3);
READLN (B4);
READLN (B5);
SB:=(B1+B2+B3+B4+B5)/5
END;
END;
{ВЫВОД ВЕДОМОСТИ НА ЭКРАН}
CLRSCR;
WRITELN('----------------------------------------------------');
WRITELN('| ФИО | 1 | 2 | 3 | 4 | 5 | СР.БАЛЛ |');
WRITELN('----------------------------------------------------');
FOR I := 1 TO K DO
BEGIN
WITH GRUPPA[I] DO
BEGIN
WRITE ('|', FIO:20, '|');
WRITE (B1:2, ' |');
WRITE (B2:2, ' |');
WRITE (B3:2, ' |');
WRITE (B4:2, ' |');
WRITE(B5:2, ' |');
WRITE(SB:7:2, ' |');
WRITELN
END
END;
WRITELN('----------------------------------------------------');
WRITELN('БУДЕТЕ ВВОДИТЬ НОВЫЕ ДАННЫЕ (Y/N)?');
READLN(OTV);
IF (OTV = 'Y') OR (OTV = 'Y')
THEN GOTO 1
END.
Задачи для самостоятельного решения:
1. Дана ведомость учащихся, занимающихся в кружке по информатике, и их оценка по информатике. Определить количество учащихся, занимающихся на «5», и количество учащихся с фамилией, начинающееся на букву «А».
2. Дана ведомость учащихся, и количество их пропусков за семестр (в часах). Определить количество учащихся, не имеющих пропусков, и количество учащихся, имеющих пропусков более 20 часов.