Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Несколько полезных приемов обработки строк
Убрать из строки пробелы в начале строки. Проверяем первый символ строки. Если это пробел, то удаляем его. После чего следующий символ становится первым. Var s: string; i: integer; Begin Readln(s); While s[1]=' ' do Delete(s,1,1); Writeln(s); End. Убрать из строки пробелы в конце строки. Проверяем последний символ и, если он «пробел», удаляем его. Var s: string; i: integer; Begin Readln(s); {между апострофами один пробел} While s [length(s)]=' ' do Delete(s,length(s),1); Writeln(s); End. Убрать из строки все пробелы. Пока в строке есть пробелы, функция Pos будет возвращать позицию (номер) пробела, если пробелов нет, то ноль. Функция Delete удаляет пробел в этой позиции. Var s: string; Begin Readln(s); While Pos (' ', s)<>0 do {между апострофами один пробел} Delete(s, Pos(' ',s),1); Writeln(s); End. Убрать из строки «лишние» пробелы. Ищем в строке два соседних пробела и удаляем один из них. Var s: string; Begin Readln (s); While pos (' ', s)<>0 do {между апострофами два пробела} Delete(s, pos(' ',s),1); Writeln (s); Readln End. Подсчитать количество цифр в натуральном числе. Вспомните как умно и красиво мы решали эту задачу с использованием операций mod и div. Теперь преобразуем число в строку и определим ее длину. И все! Var x: integer; s: string; Begin readln (x); Str(x, s); Writeln (Length (s)); Readln End. Заменить фрагмент R в строке S на фрагмент T. Идея проста: пока фрагменты вида R в строке есть (pos(R, S) <>0), определяем позицию первого вхождения K, удаляем его и вставляем на его место фрагмент вида T. While Pos(R, S)<> 0 do Begin K:=Pos(R, S); Delete(S, K, Length(R)); Insert(T, S, K); End; Обратите внимание, что в каждом цикле дважды обращаемся к функции Pos? Один раз в заголовке цикла и второй при вычислении позиции первого вхождения. Улучшим программу, вычисляя К перед каждым выполнением цикла. Теперь одно вычисление K за циклом, а в цикле только одно. K:=Pos(R, S); While K<>0 do Begin Delete(S,K, Length(R)); Insert(T, S, K); k:=pos(R, S); End; Наберите эту программу на компьютере, добавив описания переменных и ввод – вывод. Придумайте тесты для проверки программы. «Хитрый» тест: программа не сможет выполнить задачу, если во вставляемом фрагменте содержится заменяемый. Например, R='12' и T='123'. Объясните возникшие проблемы. На соревнованиях такие «хитрые» тесты вполне возможны. Строка палиндром Строка, которая читается одинаково в обоих направлениях, называется строкой палиндромом (строка «перевертыш»).
Надеемся, что предыдущий материал позволит вам самостоятельно разобраться в программе и понять использованный там алгоритм. Основная идея: проверять симметрию строки с двух концов до середины. В качестве тестовых примеров введите строки с четным и нечетным числом букв. Var s: String; Function palindro (s: String): Boolean; {алгоритм реализован в виде функции} Var n, i: Byte; Begin i:=1; n:=length (s); While (i<=n div 2) and(s[i]=s[n-i+1]) Do inc(i); If i>n div 2 Then palindro:=true Else palindro:=false; End; Begin{основная программа} Readln(s); If palindro(s) Then write('yes') Else write('no'); Readln End. Выделение слов из строки Под словами будем понимать последовательности символов разделенных пробелами (кроме, соответственно, первого и последнего слов). Пусть s='мама мыла раму'. Признаком конца слова можно считать пробел, кроме последнего слова. Чтобы не обрабатывать последнее слово специальным образом, добавим в конец строки оператором S:=s+' ' символ «пробел». Просмотрим все элементы строки и если символ не пробел, то добавляем его к строке t. Если пробел, то в t уже целое слово. Выдаем его на экран, и начинаем формировать в t новое слово. Перед формированием «очищаем» слово t (t:=''- пустая строка).
Var s, r, t: string; i: integer; Begin Readln(s); s:=s+' '; t:=''; {t пустая строка} For i:=1 to length(s) do If s[i]<>' ' then t:=t+s[i] else Begin Writeln(t); t:=''; End; readln End. Используем эту идею для решения более сложной задачи: найти в строке самое длинное слово – палиндром. Для этого формируем как прямое слово t:=t+s[i], так и обратное r:=s[i]+r. Кроме того, последовательно проверяем длины слов и ищем самое длинное. Var s, r, t, wmax: string; i, lmax, l: integer; Begin Readln(s); s:=s+' '; r:='';{"обратное" слово-пустая строка} t:='';{"прямое" слово-пустая строка } wmax:='';{искомое слово – пустая строка} For i:=1 to length(s) do If s[i]<>' ' then {символ не равен пробелу} Begin r:=s[i] + r; t:=t + s[i] End else Begin If r = t then If length(r)>length (wmax) then wmax:=r; r:=''; t:=''; {готовимся формировать новые слова} End; Write(wmax); Readln End. Теперь представим, что «очень много» символов последовательно записано в текстовом файле (на олимпиадах обычно бывает именно так). Тогда последним символом окажется код #26 (признак конца файла). Но, если при создании файла в конце строки будет нажата клавиша «Enter», то в конце файла могут появиться и символы #13 (CR) или (и) #10 (LF). Не забудьте об этом при участии в соревнованиях, именно из этого символа команда СГАУ на четвертьфинале чемпионата мира сдала программу только с третьей попытки, заработав 40 минут штрафного времени. Обязательно закрывайте выходной файл, иначе результат в нем может не появиться.
Используем стандартные файлы ввода и вывода. Тогда их можно не описывать и не указывать их имена в операторах ввода и вывода Будем считывать символы из файла последовательно и по алгоритму, изложенному выше, решим задачу. Var r, t, wmax: string; ch: char; Begin Assign (input, 'input.txt'); Reset(input); Assign (output, 'output.txt'); Rewrite(output); r:=''; t:=''; wmax:=''; Repeat Read (ch); If (ch<>' ')and(ch<>#26)and(ch<>#10)and(ch<>#13) then Begin r:=ch+r; t:=t+ch End else Begin If r=t then If length (r)>length (wmax) then wmax:=r; r:=''; t:=''; End; Until (ch=#26) or (ch=#10) or (ch=#13); Write (wmax); Close (output); End. Множества Предлагаем изучить множества самостоятельно по [1, 2]. При изучении обратите внимание на типы данных в множествах и организации ввода и вывода множеств. Дадим лишь краткие пояснения и рекомендации. Практика программирования показывает, что наиболее полезным видом множеств является множество символов. Появляется новая для вас операция In (проверка принадлежности элемента множеству), операции объединения множеств (+), пересечения множеств (*) и вычитания (-). Все остальные пояснения в примерах. Множество символов в строке Множество символов, принадлежащих строке легко получить по следующей программе: Var M:set of char; S:string; i: integer; Begin S:='мама мыла раму'; For i:=1 to Length(S) do M:=M+[s[i]]; {просто символ нельзя добавит к множеству М} {нужно построить из него множество []} {и объединить его с множеством М} End.
|
||||||
Последнее изменение этой страницы: 2019-12-25; просмотров: 114; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.220.178.207 (0.022 с.) |