- •Министерство Образования Российской Федерации
- •Московский Государственный Индустриальный Университет
- •Филиал в г. Вязьме
- •Отчет по лабораторной работе № 6
- •Строковый тип данных.
- •Представление алгоритма в виде блок-схемы:
- •Текст программы:
- •Тестовый примеры:
- •Наиболее часто встречающиеся пары- 1
- •Наиболее часто встречающиеся пары- все пары встречаются по одному разу
- •Наиболее часто встречающиеся пары- 1,3
Министерство Образования Российской Федерации
Московский Государственный Индустриальный Университет
Филиал в г. Вязьме
Отчет по лабораторной работе № 6
Дисциплина: «Информатика и программирование»
Тема: «Строковый тип переменных»
Вариант: 5
Группа: 03Ид1
Студент: Афанасьев Виктор Валерьевич
Преподаватель: Соколова Н.В.
2003 г.
Тема: написание программ на языке программирования Паскаль, позволяющих обрабатывать массивы символов Turbo Pascal 7.0.
Цель: разработать алгоритм решения задачи и реализовать его в виде программы на языке программирования Паскаль.
Задание: составить программу на языке Паскаль для решения следующей задачи: дана последовательность из 32 символов. В ней есть слова, которые отделяются друг от друга запятыми. Длина слов от 3 до 7 символов, считается, что длиннее 7 символов слов нет. Проанализировать слова введённой последовательности символов. Среди пар ai и bi, где ai – первая, а bi
-последняя буквы i – слова последовательности определить наиболее часто встречающуюся пару.
Результаты полученных подсчётов и все возможные пары вывести на экран.
Краткие теоретические сведения:
Строковый тип данных.
Строка представляет собой последовательность нумерованных, начиная с 0, символов, к ней можно обращаться как к единому целому и каждому элементу по отдельности. Для объявления переменной типа строка используется идентификатор String, являющийся зарезервированным словом:
Var s: String;
Количество элементов в строке s в процессе выполнения программы может быть любым, но не более чем 255 символов. Строки можно использовать так же, как массивы. Например, объявленная выше строка занимает столько же памяти и имеет такую же структуру, как и массив s1:Array[0…255] of Char. Однако по сравнению с массивами использование строк даёт значительные преимущества. Строки можно вводить, выводить и сравнивать как единое целое. Поэтому, например, программа, которая вводит слова и расставляет их в алфавитном порядке, при использовании строк реализуется значительно проще, чем при использовании массивов.
Программа 1:
{Сортировка пяти слов в алфавитном порядке}
Const n=5;
Var MasArray[1…n] of String;
i, j: Byte;
Exchange: String;
Begin
{Ввод слов}
For I:=1 To n Do
Begin
Write (’Введите слово’);
Readln (mas[I]);
End;
{Сортировка}
For I: =1 To n-1 Do
For j: =1 To n-I Do
If Mas[j]>Mas[j+1];
Mas [j+1]:=Exchange;
End;
{Вывод слов, расположенных по алфавиту}
For I:=1 To n Do
Writeln (Mas[I]);
End.
Введём 5 слов: Озеро, Пруд, Река, Море, Бассейн. Программа расположит их в алфавитном порядке и выведет следующую последовательность:
Бассейн
Море
Озеро
Пруд
Река.
При сравнении строк меньшей считается та из них, у которой меньше первый символ. Если символы совпадают, то сравниваются вторые, и так далее. Если одна строка является частью второй, например, «кот» и «котёнок», то более короткая строка является меньшей. Нужно согласиться, что реализовать подобный алгоритм сравнения для массивов сложнее, чем сравнить две строки.
Строкам, как и простым переменным, можно присваивать значение константы, которая представляет собой последовательность символов, заключённых в апострофы.
S: =’Строка’;
L: =’символов’;
Кроме операций сравнения для строк определена операция конкатенации, то есть сцепления (слияния, соединения) двух строк в одну. Эта операция обозначается знаком «+», как и операция арифметического сложения для чисел. Результатом применения операции конкатенации S+L к определённым выше строкам будет строка B, содержащая последовательность символов “Строка символов”. Если выполнить оператор B:=L+S, то строка В получит значение “символов Строка”.
Если заранее известно, что длина строки не превысит заданной величины, максимальное количество элементов можно задать при объявлении строки, указав его в квадратных скобках после слова String, например, Var s:String [20]. Если теперь мы попробуем ввести более двадцати элементов, то в строку запишутся только первые 20 из них. В памяти строка S всегда будет занимать 21 байт и соответствовать массиву S:Array[0…20] of Char.
Первый элемент строки, то есть элемент с индексом 0, содержит в памяти число, равное количеству элементов, записанному в строку. Однако, поскольку все элементы в строке, в том числе и первый. Рассматриваются только как символы, это число, находящееся в диапазоне от 0 до 255, представляет собой код некоторого символа. Поэтому для того, чтобы им воспользоваться как числом, надо применить функцию Ord, возвращающую числовое значение кода символьной переменной, например, как это сделано в следующей программе, определяющей количество заданных символов во введённой строке.
Программа 2:
Var
Stroka: string;
Symvol: Char;
I,n: Byte;
Begin
{Ввод строки}
Write (‘Введите символ’)
Readln(Symvol);
n:=0;
{Определение количества символов Symvol в строке Stroka}
For I:=1 To Ord(Stroka[0]) Do
If Stroka[I]=Symvol Then Inc(n);
Writeln (‘Строка’,’Stroka’,’содержит’,n:4,’символов’,Symvol);
End.
Каждый элемент строки, начиная с первого, сравнивается с введённым символом. При их совпадении выполняется процедура Inc(n), записывающая в переменную n (счётчик повторений) следующее по порядку значение. Цикл сравнения завершается по достижении последнего элемента строки, то есть символа с номером Ord (Stroka[0]).
В Turbo Pascal 7.0 определено 9 процедур и функций, выполняющих операции над строками или их частями.
Функция Length(s) вычисляет длину строки s. Оператор y:=Length(s) даёт тот же результат, что и оператор y:=Ord(s[0]).
Функция Copy (s, start, len) возвращает часть строки s, начинающуюся с символа с порядковым номером start. Количество возвращаемых символов равно len. В результате выполнения операторов
s:=’булавка’;
s1:=Copy(s, 3, 5);
в переменную s1 будет записано слово “лавка”.
Процедура Delete (s, start, len) удаляет часть строки s, начинающуюся с порядковым номером start. Количество удаляемых символов равно len. После выполнения операторов
s:=’булавка’;
Delete (s, 3, 3);
В переменной s будет записано слово “бука”.
Процедура Insert(ins, s, start) вставляет в строку s, начиная с позиции start, все символы строки ins. После выполнения операторов
s:=’булка’;
ins:=’aв;
Insert (ins, s, 4);
в переменной s будет записано слово “булавка”.
Функция Pos (sub, s) определяет, является ли строка sub частью строки s.Если это так, то она возвращает порядковый номер первого символа в стоке s, начиная с которого элементы этих строк совпадают. Если sub не является частью s, то возвращается 0. В результате выполнения операторов
s:=’булавка’;
sub: =’aв;
n:=Pos (sub, s);
в переменную n будет записано число 3.
Функция Concat (s1, s2,…,sn) выполняет операцию конкатенации, объединяя несколько строк в одну. В результате выполнения операторов
First: =’бул’;
Second: =’aв;
Third: =’ка’;
Wrd: = Concat (first, second, third);
В переменную word будет записано слово “булавка”. Количество символов в объединённой строке не может превышать максимальной длины word, лишние символы отсекаются.
Процедура Fillchar (s[n], m, c) заполняет строку s, начиная с позиции n, m одинаковыми символами, образец символа находится в переменной c. В результате выполнения операторов
C:=’+’;
Fillchard (s [5], 10, c);
В переменную s будет записано 10 звёздочек, начиная с пятого символа. Данная процедура заполняет смежную область памяти, не проверяя границы расположения переменных. Поэтому, если максимальная длина строки s задана равной 11, последние 3 символа будут записаны в ячейке памяти, соседние с ячейками переменной s. В этом случае возможно нарушение данных в смежной с s переменной.
Процедура Stx (x, s) преобразует число, записанное в переменной x, в строку. Переменная x может быть любого целого или вещественного типа. После выполнения операторов
X:=14;
Str (x, s);
В переменную s типа String будет записано слово “14”. В результате выполнения операторов
X real:=145/3;
Str (x real, s);
В переменную s типа String будет записано слово “4.83333333E+01”.
В процедуре Str допускается использовать формат так же, как и при выводе значений. Поэтому выполнение следующих операторов
X real: =145/3;
Str (x real: 6:2,s);
приведёт к тому, что в переменную s будет записано слово “48.33”
Процедура Val(s, x, err) преобразует последовательность символов, записанную в строке s, в числовое значение и сохраняет его в числовой переменной x. Тип переменной x должен соответствовать типу преобразуемого числа. Если это не наблюдается или в строке s записано не число, то преобразование не будет выполнено, значение x не изменится, а в переменной err будет записан код ошибки, представляющей собой номер первого символа в строке, при анализе которого произошла ошибка преобразования. Если ошибки в задании исходных данных нет, то в переменной err возвращается 0.
В языке Pascal, начиная с версии Turbo Pascal 7.0, введён ещё один тип строк- Pchar, который позволяет использовать значительно более длинные строки. Максимальное число символов для строки типа Pchar равно 65535. Следует, однако, иметь в виду, что при использовании типа Pchar необходимо обязательно установить режим расширенного синтаксиса. Это можно сделать, установив опцию Extended syntax (Расширенный синтаксис) в панели Syntax options (Опции синтаксической обработки) пункта Compile (Компиляция) меню Option (Опции), либо включив в начало программы, использующей строку данного типа, директиву {$x+}.Если режим расширенного синтаксиса не включить, то переменная типа Pchar будет эквивалентна переменной типа Char.
Строки типа Pchar называются ASCIIZ-строками, то есть ASCII строками, заканчивающимися нулём (Zero). Аббревиатура ASCII является названием общепринятого способа кодирования символов, а буква z-Zero- означает, что данная строка завершается символом с кодом, равным нулю, который и является признаком конца этой строки.