СТРОКИ
ЦЕЛЬ РАБОТЫ
Целью работы является приобретение навыков алгоритмизации и программирования задач, оперирующих строковыми типами данных:
- ввод и вывод строковых данных;
- обработка строковых данных;
- использование стандартных процедур и функций языка Pascal для обработки строковых данных.
КОНТРОЛЬНЫЕ ВОПРОСЫ
1.Как можно описать в программе строковые данные?
2.Перечислите процедуры для обработки строк.
3.Перечислите функции для обработки строк.
4.Какие операции можно выполнять над строковыми данными?
5.Укажите область применения строковых данных.
1.
В Паскале существует тип данных STRING (строка), специально предназначенный для обработки строк (цепочек символов). Этот тип данных занимает промежуточное положение между простыми типами данных (целочисленные, вещественные, логические, символьные, интервальные, перечисляемые) и структурированными типами данных (массивы, записи, множества).
Строка – последовательность символов (от 0 до 255), заключенная в апострофы. При составлении программ используются строковые константы и строковые переменные.
Строковые константы – элементы данных, значения которых известны заранее, описаны в разделе описания констант и в ходе выполнения программы не изменяются. Формат описания строковых констант.
2.
Процедуры для обработки строк Рассмотрим ряд процедур, используемых для обработки строк.
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.
3.
Функции для обработки строк
Рассмотрим ряд функций, используемых для обработки строк.
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’.
4. Операции со строками
Выражения, в которых операндами служат данные строкового типа, называются строковыми выражениями. Они могут состоять из:
- строковых констант;
- строковых переменных;
- знаков операций;
- указателей процедур;
- указателей функций.
Над строковыми данными допустимо выполнять операции сцепления и операции отношения.
Операции сцепления (+) применяются для сцепления нескольких строк в одну результирующую строку, длина которой не должна превышать 250 символов.
Операции отношения (=, <>, <, >, >=, <=) проводят сравнение двух строковых операндов и имеют приоритете более низкий, чем операции сцепления. Это значит, что сначала выполняются все операции сцепления (если они присутствуют в данном строковом выражении), а затем операции отношения.
Сравнение строк производится слева направо до первого несовпадающего символа, и та строка считается больше, в которой первый несовпадающий символ имеет больший номер в стандартной таблице обмена информацией (см. Приложение).
Результат выполнения операций отношения над строковыми данными всегда имеет булевский тип (boolean), и равен TRUE, если выражение истинно, и FALSE, если выражение ложно.
5.
От 0 до 255.
ЗАПИСИ
ЦЕЛЬ РАБОТЫ
Целью работы является приобретение навыков алгоритмизации и программирования задач, оперирующих совокупностью данных различного типа, логически относящихся к одному и тому же объекту.
КОНТРОЛЬНЫЕ ВОПРОСЫ
1.Могут ли компоненты записи быть различных типов?
2.Как осуществляется доступ к полям записи?
3.Поясните правила применения оператора WITH.
4.Что такое составной оператор?
5.Как можно сократить длину идентификаторов при обработке нескольких
записей?
6. Поясните правила применения оператора СASE
1. ЗАПИСЬ – структурированный тип данных, состоящий из фиксированного числа компонентов разного типа. Определение типа записи начинается идентификатором RECORD и заканчивается зарезервированным словом END. Между ними заключен список компонентов, называемых полями, с указанием идентификаторов полей и типа каждого поля.
Тип данных RECORD предоставляет возможность объединять в одну связную структуру различные по типу и смыслу поля. Причем элементами записи могут быть и структурированные типы данных, например, массивы и другие (подчиненные) записи. Для обработки доступна как вся запись целиком, так и ее отдельные поля.
2.
Доступ к полям записи осуществляется через переменные ST1, ST2,ST3 и ST4 типа STR (запись).
Существует возможность описывать переменные типа RECORD непосредственно в разделе описания переменных.
Например,
VAR
GRUPPA: ARRAY [1..30] OF RECORD
FAM: STRING [35];
NAME: STRING [15];
GOD_R: INTEGER;
END;
Идентификатор поля должен быть уникальным только в пределах записи, но во избежание ошибок его целесообразно делать уникальным в пределах всей программы.
3. Оператор присоединения WITH
Обращение к отдельным компонентам записи при помощи составных имен приводит к удлинению текста программы и к ее излишней громоздкости (особенно при использовании идентификаторов из 5 и более символов). Для устранения этого неудобства в языке Турбо Паскаль используется оператор присоединения WITH, который позволяет осуществлять доступ к компонентам записи таким образом, как если бы они были обычными переменными, т.е отпадает необходимость указывать при обращении к отдельному полю записи кроме его собственного идентификатора еще и идентификатор записи.
Формат оператора присоединения
WITH < переменная типа запись > DO < оператор >;
Внутри оператора WITH можно обращаться к компонентам записи по именам полей без указания перед идентификаторами поля имени переменной, определяющей запись. Так, ввод данных для хранения информации по группе студентов из предыдущего примера можно осуществить следующим образом:
FOR I:= 1 TO 30 DO
WITH GRUPPA [I] DO
READLN (FAM, B1, B2, B3, B4, B5);
4.
Составное имя можно использовать везде, где допустимо применение типа соответствующего поля. Например,
ST3.SB:= (ST3.B1 + ST3.B2 + ST3.B3 + ST3.B4 + ST3.B5) / 5;
Составные имена можно использовать в операторах ввода-вывода. На-пример,
READ (ST1.FAM, ST1.B1, ST1.B2, ST1.B3, ST1.B4, ST1.B5);
WRITELN (ST2.FAM, ST2.SB);
Для присваивания полям значений используется оператор присваивания.
Значения полей записи могут быть использованы в выражениях. Обращение к значению поля осуществляется с помощью идентификатора переменной и идентификатора поля, разделенных точкой. Такая комбинация называется СО-СТАВНЫМ ИМЕНЕМ.
5.
Идентификатор поля должен быть уникальным только в пределах записи, но во избежание ошибок его целесообразно делать уникальным в пределах всей программы.
6.
Вариантная часть формируется с помощью оператора CASE, который задает особое поле записи – поле признака, определяющее, какой из вариантов в данный момент будет активизирован. Значением признака в каждый текущий момент выполнения программы должна быть одна из расположенных далее констант. Константа, служащая признаком, задает вариант записи и называется константой выбора.
РЕШЕНИЕ ЗАДАЧ
Проверить, встречается ли в заданном предложении словосочетание «Сальдо счета».
uses crt;
var
b:array[1..30] of string;
slovo, text:string;
i,k,n: byte;
begin clrscr;
writeln('Vvedite text, zakon4iv ego to4koy.');
read(text);
k:=1; slovo:=''; n:=0;
for i:=1 to length(text) do
if (text[i]=' ')or(text[i]='.') then begin b[k]:=slovo; k:=k+1; slovo:='';end
else slovo:=slovo+text[i];
for i:=1 to k do
if (b[i]='saldo') and (b[i+1]='scheta') then n:=1;
if n=1 then writeln('Vstrechaetsya')
else writeln('Ne vstrechaetsya');
readln;readln;
end.
Вывести на экран анкетные данные студентов, чьи фамилии начина-ются на букву Б, их даты рождения и количество сданных ими сес-сий. N = 6.
uses crt;
type pupil=record
fam:string[20];
inn,date,datep,dateb,oc,gr:string[13];
kurs,ks: integer;
sb:real;
end;
var a:array[1..6] of pupil;
buf: pupil;
i,j:byte;
n,k:integer;
ans:char;
begin
clrscr;
writeln('Vvesti dannie? y/n');
readln(ans);
if ans='y' then
for i:=1 to 6 do begin
write('fio ',i,'studenta [20]: '); readln(a[i].fam);
write('inn ',i,'studenta [10]: '); readln(a[i].inn);
write('data polu4eniya inn',i,'studenta [dd.mm.yyyy]: '); readln(a[i].date);
write('data rozhdeniya ',i,'studenta [dd.mm.yyyy]: '); readln(a[i].dateb);
write('data postupleniya ',i,'studenta [dd.mm.yyyy]: '); readln(a[i].datep);
write('kurs ',i,'studenta [1<number<5]: '); readln(a[i].kurs);
write('gruppa ',i,'studenta [10]: '); readln(a[i].gr);
write('kol-vo sessii ',i,'studenta [0<number<10]: '); readln(a[i].ks);
write('ocenki ',i,'studenta [m m m m], 7 cifr: '); readln(a[i].oc);
end
else begin
a[1].fam:='Белов'; a[1].inn:='45345452563'; a[1].date:='01.09.2007';
a[1].dateb:='01.06.1991'; a[1].datep:='01.09.2008';
a[1].kurs:=1; a[1].gr:='MIE'; a[1].ks:=0; a[1].oc:='5 3 5 5 4 5 5';
a[2].fam:='Чернов'; a[2].inn:='4523453543254'; a[2].date:='23.08.2000';
a[2].dateb:='19.10.1990'; a[2].datep:='01.09.2007';
a[2].kurs:=2; a[2].gr:='MO'; a[2].ks:=2; a[2].oc:='5 5 5 4 4 4 5';
a[3].fam:='Краснов'; a[3].inn:='65824523432754'; a[3].date:='01.09.2007';
a[3].dateb:='23.11.1989'; a[3].datep:='01.09.2006';
a[3].kurs:=3; a[3].gr:='UTS'; a[3].ks:=4; a[3].oc:='5 5 5 5 5 3 3';
a[4].fam:='Путин'; a[4].inn:='65824523432754'; a[4].date:='01.09.2007';
a[4].dateb:='23.11.1989'; a[4].datep:='01.09.2006';
a[4].kurs:=3; a[4].gr:='UTS'; a[4].ks:=4; a[4].oc:='5 5 5 5 5 3 3';
a[5].fam:='Медведев'; a[5].inn:='65824523432754'; a[5].date:='01.09.2007';
a[5].dateb:='23.11.1989'; a[5].datep:='01.09.2006';
a[5].kurs:=3; a[5].gr:='UTS'; a[5].ks:=4; a[5].oc:='5 5 4 5 5 3 3';
a[6].fam:='Березовский'; a[6].inn:='65824523432754'; a[6].date:='01.09.2007';
a[6].dateb:='23.11.1989'; a[6].datep:='01.09.2006';
a[6].kurs:=3; a[6].gr:='UTS'; a[6].ks:=4; a[6].oc:='4 4 5 5 5 3 3';
end;
writeln('studenty:');
for i:=1 to 6 do begin
with a[i] do begin
writeln(fam,' ',inn,' ',date,' ',dateb,' ',datep,' ',kurs,' ',ks,' ',gr,' ',oc);
end;end;
writeln;
for i:=1 to 6 do begin
with a[i] do begin
if fam[1]='Б' then writeln(fam,' ',dateb,' ',ks);
end;end;
readln;
end.