Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
inf3.doc
Скачиваний:
15
Добавлен:
15.04.2015
Размер:
389.63 Кб
Скачать

Лабораторная работа 8 строки и множества

Цель работы

Изучение правил работы со строками типа string и множествами.

Методические указания

Для организации необходимых действий со строками в Turbo Pascal используется стандартный тип данных string. Строки записываются в виде заключенных в апострофы символов, например: ‘aurinko’, ‘солнце’, ‘’(пустая строка), ‘ ’(пробел), ‘об’’ем’(апостроф указывается дважды). Строковые переменные описываются следующим образом:

var st : string[<константное выражение>];

Значение константного выражения (обозначим его через n) называют объявленным размером строки. N измеряется в байтах и находится в следующих пределах: 0 n 255. Если размер строки не указан, то считается, что n = 255 . При вводе или присваивании строк символы, выходящие за объявленный предел, отбрасываются. Символы в стринге пронумерованы от нуля. В нулевом байте содержится информация о длине строки, представленная символом, т.е. фактический размер строки может быть определен как ord(st[0]). Приведем простой пример описания и некоторых действий со строковыми переменными.

program primer;

type stroka = string[30]; {Тип-строка, содержащая не более 30 символов}

var s : stroka;

s1 : string; {Строка максимального размера}

s2 : string[10]; {Строка из 10 символов}

begin

s2 := ‘Это string’;

s2[0] := chr(3); {Изменяем размер строки}

writeln(s2) end. {На экран будет выведено слово “Это”}

При сравнении строк большей считается та строка, в которой содержится больше символов. Если число символов в строках одинаковое, то решение принимается по первым неодинаковым символам, например ‘Это’ < ‘это’, ‘Марс’ > ‘Марк’ и т. д. Ниже приводятся стандартные процедуры и функции, используемые при работе со строками.

Функция length(s) возвращает фактический размер стринга s.

Функция pos(s1,s) возвращает позицию первого вхождения подстроки s1 в строку s.

Функция copy(s, p, n) копирует из строки s n символов, начиная с символа, находящегося на позиции p.

Процедура delete(s, p, n) удаляет из строки s n символов, начиная с символа на позиции p.

Процедура insert(s1, s, p) вставляет подстроку s1 и строку s, начиная с позиции p.

Функция concat(s1, s2, …) объединяет в одну строки s1, s2, …

Для взаимного преобразования строковых и числовых данных служат процедуры:

str((<число>[:n[:k]], <переменная типа string>);

val(<строка>, <переменная-число>, <номер>).

В процедурах строка может содержать только цифры и разделитель целой и дробной частей числа, номер возвращает номер ошибочно введенной позиции, n и k задают формат числа (k - число позиций, отводимых под дробную часть).

Пример1. В строке s1 заменить подстроку s2 на подстроку s3. Строки выбрать произвольно.

Ниже приведены структурограмма и программа наших действий.

program stringi;

const cs = ‘любой’;

var s, s1, s2, s3 : string;

i, n, p : byte;

begin

writeln(‘’Введите исходную строку s1);

readln(s1); {‘На любой работе надо что-то делать’}

s2 := cs; s3 := ‘этой’;

i := length(s3); {Длина s3}

n := ord(s2[0]); {Длина s2}

p := pos(s2, s1); {Первое вхождение s2 в s1}

if p <> 0 then begin

delete(s1, p, n); {Удаление s2 из s1}

insert(s3, p, i); {Вставка s3 в s1}

s := copy(s1, p, i); {Копируем s3 из s1 в s}

writeln(‘Результирующая строка: ’, s1);

writeln(‘В нее вставлена подстрока: ’, s) end

else writeln(‘Заменяемая строка не обнаружена’)

end.

Ввод (s1, s2, s3)

Вычисление длины строк s2 и s3 (n и i)

Нахождение p - позиции 1-го вхождения s2 в s1

ДА p  0 НЕТ

Удаление s2 из s1 Вывод

Вставка s3 в s1 (‘Заменяемая

Копирование s3 из s1 в s строка не

Вывод (s, s1) обнаружена’)

Тип-множество. В отличие от математического понятия множества множество в Turbo Pascal представляет собой совокупность элементов базового типа. Максимальный размер множества - 256 элементов, которые имеют порядковые номера от 0 до 255. Следовательно, в качестве базовых могут выступать стандартные типы данных byte и char, перечисляемые типы и их диапазоны. Множество включает в себя все возможные наборы элементов базового типа, т.е. все подмножества данного множества, включая пустое. Если базовый тип состоит из n элементов, то число всех подмножеств равно .

Описание типа-множества имеет вид:

type <имя типа> = set of <базовый тип>;

Приведем примеры правильного и неправильного описания.

type bukva = ‘a’..’z’; {Тип ‘строчная буква латинского алфавита’}

mn_bukv = set of bukva;

mn_byte = set of byte;

godi_ucheniya = set of 2002..2007; {Неверное описание}

mn_nat_chisel = set of 1..256; {Неверное описание}

Элементы в множестве располагаются произвольно и не повторяются. Задается множество с помощью конструктора множеств - [ ]. В нем через запятую перечисляются допустимые элементы, в том числе и диапазоны, например:

type vremena_goda = set of (vesna, leto, osen, zima);

var q, s : vremena_goda; {Множество времен года}

mn : set of 1..100; {Множество целых чисел от 1 до 100}

begin s := [ ]; {Пустое множество}

q := [vesna, leto];

mn := [1, 5..13, 27..33] …

Операции над множествами:

  1. объединение множеств A и B - A + B 

например s := [vesna] + [leto..zima]; (результат - [vesna..zima])

  1. пересечение множеств A и B - A * B 

например q := [leto] * [vesna..osen]; ([leto])

  1. разность множествA и B - A - B 

например q := [leto..zima] - [osen]; ([leto, zima])

  1. операции отношения:

- тождественность множеств A = B;

- нетождественность множеств A <> B;

- A является подмножеством B A <= B;

- B является подмножеством B A >= B.

Установить принадлежность некоторого элемента e множеству mn можно с помощью операции in, e in mn, которая возвращает значение true, если элемент e присутствует в множестве mn, и false - в противном случае. Для включения элемента в множество можно использовать процедуру include(mn, e), а для исключения элемента из множества - процедуру exclude(mn, e).

Пример 2. Из строки символов s1 удалить повторно встречающиеся символы. Структурограмма алгоритма и программа приведены ниже.

Ввод (s1) {Исходная строка}

s2 := ‘’ {Результирующая строка}

mn := [ ] {Множество символов}

i := 1 (1) length(s1)

s1[i]  mn ДА

s2 := s2 + s1[i]

mn := mn + [s1[i]]

Вывод (s1, s2)

program Symbol_Odin_Raz;

var i byte;

s1, s2 : string;

mn : set of char;

begin writeln(‘Введите строку символов’);

readln(s1); s2 := ‘’; mn := [ ];

for i := 1 to length(s1) do begin

if not s1[i] in mn then s2 := s2 + s1[i];

mn := mn + [s1[i]]

end;

writeln(‘Исходная строка: ‘, s1);

writeln(‘Результирующая строка: ‘, s2)

end.

Контрольные вопросы

  1. Охарактеризуйте тип string.

  2. На базе каких типов можно создать множество?

  3. Чем отличается стринг от массива символов?

  4. Опишите множество рабочих дней недели.

  5. Чему равно n, если: type im = (odin, dva, tri);

var n, i : byte; s : string;

begin n := 0; s := ‘129’; for i := 1 to length(s) do

if ord(s[i])-ord(‘0’)=ord(high(im)) then inc(n); ?

  1. Как изменится алгоритм примера 2, если потребуется исключить из результирующей строки символы, встретившиеся три и более раз?

  2. Как принудительно изменить размер строки типа string?

  3. Почему размер строки s можно определить как ord(s[0])?

  4. Что такое конкатенация строк?

  5. Какие операции применимы к множествам?

Варианты задания

  1. В строке, не превышающей 20 символов, установить количество

гласных букв.

  1. Установить, можно ли в предложении составить остальные слова из

букв первого слова.

  1. Установить, является ли строка палиндромом.

  2. Вывести все согласные буквы предложения.

  3. Подсчитать количество букв в каждом слове предложения.

  4. Преобразовать двоичное число в десятичное. Двоичное число - строка.

  5. Преобразовать десятичное число в двоичное. Двоичное число - строка.

  6. Вывести слова, встречающиеся в двух предложениях.

  7. Ввести две строки одинаковой длины. Если символ из второй строки имеет номер по таблице ASCII меньше номера соответствующего символа из первой строки, то поменять их местами.

  8. Создать множество целых k, удовлетворяющих условию k=m+n, где m и n - целые числа. Преобразовать элементы множества в строку.

  9. Поменять местами символы в строке: первый - с последним, второй - с предпоследним и т.д.

  10. В предложении переписать слова в обратной последовательности.

  11. Случайным образом заполнить множество рабочих дней в цикле из 6 повторений. Вывести элементы множества.

  12. В предложении из трех слов вывести слова в порядке нарастания их длины. Предложение описать как массив строк.

  13. В строке символов заменить все строчные латинские буквы на прописные и подсчитать количество цифр.

  14. Вывести на экран те символы-разделители (. , : ; - пробел), которые встречаются в строке, и найти их общее количество в ней.

  15. Вывести буквы, встречающиеся только в первой из двух строк.

  16. Вывести буквы, не встречающиеся ни в одной их двух строк.

  17. Подсчитать количество гласных и согласных русских букв в предложении.

  18. Исключить из строки все вхождения подстроки ‘ааа’.

  19. Произвести замену пробелами подстрок ‘значит’ в строке.

  20. Инициализировать множество случайными целыми числами в цикле из 20 повторений. Вывести на экран те символы из введенной строки, порядковый номер которых имеется в множестве.

  21. Получить множество простых чисел методом просеивания (Эратосфена): в исходное множество помещают все числа от 2 до 255, затем из него в цикле от 2 до 255 исключают все числа, кратные параметру цикла, кроме его самого. Вывести множество простых чисел.

  22. Переписать: в первое предложение слова второго в обратном порядке, а во второе - первого в обратном порядке. Предложение - массив строк.

  23. Вывести те символы в строке, которые встречаются в ней не более двух раз.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]