Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 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; просмотров: 186; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.156 (0.009 с.) |