Основы программирования (947332), страница 23
Текст из файла (страница 23)
Структурные типы данныхПример 4.22. Разработать программу, которая для строки символов, введенной с клавиатуры и состоящей из нескольких слов, разделенных пробелами, определяет множество гласных, которые:• встречаются в каждом слове строки;• встречаются только в одном слове строки;• встречаются хотя бы в одном слове строки;• встречаются более чем в одном слове строки.Для решения задачи определим тип «множество символов ASCII».
Множество гласных букв русского языка зададим с помощью типизированнойконстанты множественного типа. Определим переменные множественноготипа для хранения результатов и промежуточных значений:resl - множество гласных, входящих в каждое слово,res2 - множество гласных, входящих не более чем в одно слово,res3 - множество гласных предложения,res4 - множество гласных, входящих более чем в одно слово,mnsl - множество гласных, встретившихся в текущем слове.В программе введем строку и. будем последовательно выделять из нееслова. Для каждого слова построим множество встретившихся гласных буквmnsl.Если в строке содержится одно слово, тоresl = res2 = res3 = mnsl,a множество res4 пусто.Если в строке более одного слова, то каждое новое слово изменяет результирующие множества следующим образом:1) множество гласных, входящих в каждое слово, будет равно пересечению уже найденного множества гласных, входящих в каждое слово, и множества гласных слова:resl п mnsl;2) множество гласных, входящих более чем в одно слово, res4 увеличится (объединение) на повторяющиеся буквы нового слова:res4 U (res3 n mnsl);3) множество гласных в предложении res3 увеличится (объединение) намножество гласных слова:res3 U mnsl .Множество гласных, входящих только в одно слово, res2 будем определять после обработки всех слов как разность множества гласных букв предложения и множества гласных, входящих более чем в одно слово предложения:res3 \ res4.133Часть I.
Основы алгоритмизации и процедурное программированиеProgram ex;Type setchar=set of char;Const G: setchar - ['а\'я\у\'ю\'э\'е'у'о\'ё\^и\'ы^];{типизированная константа «множество гласных букв»}Var resl, {множество гласных, входящих в каждое слово}res2, {множество гласных, входящих только в одно слово}res3, {множество гласных в предложении}res4, {множество гласных, входящих более чем в одно слово}mnsUsetchar; {множество гласных текущего слова}st,slovo: string;ch: char;ik:integer;first: boolean;BeginWriteLn('Введите исходную строку:');ReadLn(st); {читаем исходную строку}st:=st'^ * V {добавляем в конец пробел для простоты обработки}first:"^true; {признак «первое слово»}while st<> " do {цикл выделения и обработки слов}begink:=pos(* \st);slovo:=Copy(stJ,k'l);{выделяем слово}Delete(stJ,k);{удаляем слово из строки}{определяем множество гласных, входящих в данное слово}mnsl:=fj;{исходное состояние «пустое множество»}for i:=l to к'1 doifslovofij in G then{если гласная буква, то}mnsl:=mnsl+fslavefiJJ; {добавляем к множеству}{формируем множества результатов}if first then {если первое слово, то}beginresl:=mnsl; {входят в каждое слово}res2:=mnsl; {входят не более чем в одно слово}res3:-mnsl; {встретившиеся гласные}res4:-[];{входят более чем в одно слово}first:=false;{выключаем признак «первое слово»}endelse{если не первое слово предложения, то}beginresl:=resl*mnsl;{входят в каждое слово}res4:='res4+res3*mnsl; {входят более чем в одно слово}res3:=res3-^mnsl;{встретившиеся гласные}endend;res2:=res3'res4; {входящие в одно слово}1344.
Структурные типы данных{выводим результаты анализа предложения}WnteLn(*DiacHbie, которые входят в каэюдое слово: *);for ch:=#0 to #255 do ifch in resl then Write(ch:2);WriteLn;WriteLn('Гласные, входящие только в одно слово:');for ch:=#0 to #255 do ifch in resl then Write(ch:2):WriteLn;WriteLn(Tлacныe, входящие хотя бы в одно слово:');for ch:=#0 to #255 do ifch in res3 then Write(ch:2):WriteLn;WriteLn('Гласные, входящие более чем в одно слово: ');for ch:=#0 to #255 do ifch in res4 then Write(ch:2);WriteLn;EndЗадания для самопроверкиЗадание 1. Дан текст, содержащий несколько слов, разделенных пробелом, вконце точка. Разработайте программу, которая, используя множественный тип, определяет количество слов текста, содержащих специальные символы «@, #, $, ^, &, _,*, %, ~».
Вывести исходную последовательность, количество искомых слов, а такжеих номера в тексте.Задание 2. Дан текст, содержащий несколько слов, разделенных пробелом, вконце точка. Разработайте профамму, которая, используя множественный тип, удаляет из последовательности все слова, включающие хотя бы одну цифру. Вывестиисходный и преобразованный текст. Если слов с цифрами не окажется, вывести соответствующее сообщение.Задание 3. Дана строка, состоящая из последовательности целых чисел в символьном изображении. Числа разделены пробелами (например: «345 6785 1235 54657»).
Разработайте программу, которая формирует множество цифр, присутствующих в записи всех чисел последовательности. Вывести исходную последовательность и сформированное множество. (Для приведенной последовательности множество.состоит из одного элемента 5.)Задание 4. Дана строка, содержащая последовательность слов, разделенныхпробелами. В словах содержатся буквы латинского и русского алфавита. Разработайте программу, которая формирует и выводит в алфавитном порядке два множества:множество латинских и множество русских строчных букв (кроме ё), встретившихся в исходной строке.Задание 5.
Дана строка, содержащая последовательность слов из латинскихстрочных букв, разделенных пробелами. Разработайте программу, которая, используя множество, вычеркивает из каждого слова строки буквы i, j , к, I, m, п. Вывестиисходную и преобразованную строки.135Часть 1. Основы алгоритмизации и процедурное программирование4.8. ЗаписиЗапись - это структура данных, состоящая из фиксированного числаршнотипных компонент, называемых полями записи.
Записи используются дляпредставления разнородной, но логически связанной информации. Каждоеполе записи имеет имя, которое дается ему при объявлении записи.В Borland Pascal определены записи двух типов: записи с фиксированными полями и вариантные записи (рис. 4.33).Записи с фиксированными полями. Синтаксическая диаграмма записи с фиксированными полями представлена на рис.
4.34.Как любой тип данных языка, записи можно определить двумяспособами:• при объявлении переменных, например:Var ZapLZapl: record {две записи, состоящие из 5 полей}F,S:real; {два поля вещественного типа}А, В .'integer; {два поля целого типа}C:char;{поле символьного типа}end;Zap3: record {запись, состоящая из 3 полей}S: string /80/; {символьная строка длиной 80 байт}А: array [1..20] of real; {одномерный массив на 20вещественных чисел}Flag:: boolean; {поле логического типа}end;...• предварительно объявив тип записи, например:А record j I А Фиксированнаячастьto,endВариантнаячастьРис.
4.33. Синтаксическая диаграмма <Объявление типа записи>J Идентификаторполяо-Тип-о- "0--Рис. 4.34. Синтаксическая диаграмма<Фиксированная часть записи>1364. Структурные типы данныхТуре Ztl = record{тип «запись, состоящая из 5 полей»}F,S:real;{два поля вещественного типа}AyB:integer;{два поля целого типа}C'char;{поле символьного типа}end;Zt2 = record{тип «запись, состоящая из 3 полей»}S: string [80]; {символьная строка длиной 80 байт }А: array [1..20] о/ге^^/;{одномерный массив на20 вещественных чисел}Flag: boolean; {поле логического типа}end;Var ZapU Zap2:Ztl;{две переменные типа Ztl}Zap3:Zt2; ...{переменная типа Zt2 }В качестве полей записи можно использовать другие записи, определенные как ранее, так и внутри записи, например:Туре Human=record{запись о сотруднике}Fio: record{поле типа «запись из 3 полей»}Fam,{фамилия}Name,{имя}Otch: string;{и отчество сотрудника»}end; {Fio}BirthDay: record{поле типа «запись из 3 полей»}Day:!.,31;{день}Month: 1..12;{месяц}Year: word;{год рождения}end; {Birthday}end; ...{Humein}илиType Data = recordDay:L.31;Month: L.12;Year: word;end;Famio = recordFam, Name, Otch: string;end;Human = record {тип «запись о сотруднике»}Fio: Famio;{поле типа Famio }BirthDay: Data {поле типа Data }end;...137Часть 1.
Основы алгоритмизации и процедурное программированиеИдентификаторполяИдентификаторзаписиРис. 4.35. Синтаксическая диаграмма<Доступ к полям записи >Можно объявить как отдельные переменные программы, так и массивызаписей, например:Var Sotr: Human;Otdel: array [1..20J of Human;Инициализация записей. Присвоить начальное значение конкретнойзаписи можно, используя типизированные константы. Начальное значениеполей записи при этом указывается в скобках через точку с запятой, причемдля каждого поля указывается имя и значение через двоеточие, например:ConstBirthDay: Data = (Year: 1973; Month:6; Day:30); ...Операции над записями.