Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Лабораторная работа №5. Программирование с использованием строковых переменных

Поиск

Цель работы: познакомить с понятием "стринг" и выработать навыки работы с символьной информацией в языке программирования Pascal научиться использовать строки символов и множества при решении задач.

Общие сведения

Переменные типа String аналогичны массивам типа Char. Их отличием является то, что число символов (длина строки) может динамически меняться в интервале от единицы до заданного верхнего значения.

Тип String (строка) в Турбо Паскале широко используется для обработки текстов. Этот тип является стандартным и во многом похож на одномерный массив символов Array [0..N] of Char. Значение N соответствует количеству символов в строке и может меняться от 0 до 255. Символы, входящие в строку, занимают позиции с 1 до N. Начальный байт строки с индексом 0 содержит информацию о ее длине, т.е. это символ с кодом, равным длине строки.

Можно, также описывать переменные типа String[K], где K - целое число не больше 255. Так определяются строки с длиной не больше K. Этот тип уже не является стандартным. С символами строки можно работать как с элементами массива из символов, но в отличие от массивов, строки можно вводить целиком, сравнивать друг с другом и сцеплять операцией "+".

Сравнение строк выполняется посимвольно в соответствии с их кодами до первого несовпадения. Если одна из строк закончилась до первого несовпадения, то она считается меньшей. Пустая строка меньше любой строки. ПРИМЕР: Сравнение строк.

'abcd' > 'abcD' { 'd'>'D' } 'abcd' > 'abc' { 'd'>'' } 'abc' < 'axxc' { 'b'<'x' } 'abcd' = 'abcd'

Переменная строкового типа (String) может рассматриваться как массив элементов символьного типа (Char). Например, если в программе определены переменные S: string; C: char; и задано S:='Москва', то S[1]='М', S[2]='о' и т. д. и возможно присвоение, например: C:= S[1]; Таким образом строка может рассматриваться как линейный массив символов. Элементы массива, составляющие строку можно переставлять местами и получать новые слова, например:

for i:= 1 to N div 2 do begin C:= S[i]; S[i]:= S[N-i+1]; S[N-i+1]:= C Writeln(S); end; { исходное слово выведется справа налево: "авксоМ" }

Здесь N:= ord(S[0]); - число символов в переменной "S" хранится в переменной S[0]. Функция "ord" преобразует символьный тип в целый. N div 2 - количество перестановок для слова из "N" символов. В переменной "C" запоминается значение i-го элемента, который меняется с элементом, симметричным относительно середины строки.

Можно производить поиск и замену заданного символа в строке, например:

for i:=1 to N do if S[i]=' ' then writeln ('найден символ пробел'); for i:=1 to N do if S[i]='/' then S[i]:='\'; {замена символа "/" на "\"}

Заменяя или переставляя символы в строке по определенной схеме (закону) можно зашифровать строку. Для дешифровки используется, как правило, схема обратной перестановки или замены символов. Например:

for i:=1 to N do S[i]:= chr(ord(S[i])+2); {преобразование исходных символов в символы с кодом большим на две единицы}

Напомним, что все используемые в MS-DOS символы имеют ASCII коды от 0 до 255. Здесь удобно также использовать функции Pred(C); и Succ(C);

Существует ряд стандартных функций и процедур для работы со строками.

· Функция Length(s) выдает длину строки s.

· Функция Concat(s1,s2,..,sn) возращает строку s1+s2+..+sn.

· Функция Copy(s,p,k) возвращает фрагмент строки s, который начинается в позиции p и имеет длину k.

· Функция Pos(s1,s) ищет первое вхождение подстроки s1 в строку s и возвращает номер первого символа s1 в строке s или 0 если не нашли.

· Процедура Delete(s,p,k) удаляет из строки s фрагмент, который начинается в позиции p и имеет длину k.

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

Турбо паскаль позволяет производить преобразования числовых значений в строковые и наоборот. Для этого используются процедуры Str(X:n:d,S) и Val(S,X,e). Первая получает их числа X строку S с изображением этого числа, в которой не менее n символов и из них d знаков после запятой. Параметры n и d необязательные. Вторая процедура получает из строки S число X. При успешном результате e=0.

ПРИМЕР: Работа со строками.

var s,x,y,z: string; begin x:= 'turbo'; y:= 'pascal'; z:= x+' '+y; { z='turbo pascal' } s:= ''; { пустая строка } for c:='a' to 'z' do s:=s+c; { s='abcd..xyz' } writeln(s); end.

Примеры

Пример1. Дан текст, слова в котором, могут разделяться пробелами, запятыми, точками и т.д. Требуется напечатать все слова с удвоенной буквой "н".
Этапы решения задачи:

1. Разобьем задачу на несколько блоков
а) Формирование тела программы, объявление переменных;
б) Ввод текста;
в) Очистка текста от "ненужных" символов до первого слова;
г) Вычисление длины первого слова;
д) Поиск в слове буквы "н";
е) Подсчет стоящих рядом букв "н";
ж) Печать найденного слова;
з) Удаление первого слова;
и) Если текст не закончился возвращение к пункту (в).

2. Реализуем эти блоки на Паскале

a)

program example1; var st, st1:string; i,j,k,n:integer; flag:boolean; const znak=[' ','.',',',':',';','!','?']; begin end. Назначение переменных: t- содержит введенный текст st1 - хранит первое слово текста i,j,k,n - вспомогательные переменные flag - указывает, что данное слово искомоеб) writeln('Введите текст'); readln(st);в) repeat while st[1] in znak do delete(st,1,1);г) i:=1 while (not (st[i] in znak)) and (i<=length(st)) do inc(i); st1:=copy(st,1,i-1); flag:= false;д) while (pos('н',st1)>0) and (not flag) do beginе) j:=pos('н',st1); n:=j; k:=0; while st1[n]='н' do begin inc(n); inc(k); end; if k=2 then flag:= true; delete(st1,j,k) end;ж) if flag then writeln(copy(st,1,i-1));з) delete(st,1,i);и) until st=''; Приведем программу целиком:program example1;var st, st1:string; i,j,k,n:integer; flag:boolean;const znak=[' ','.',',',':',';','!','?']; begin writeln('Введите текст'); readln(st); repeat while st[1] in znak do delete(st,1,1); i:=1; while (not (st[i] in znak)) and (i<=length(st)) do inc(i); st1:=copy(st,1,i-1); flag:= false; while (pos('н',st1)>0) and (not flag) do begin j:=pos('н',st1); n:=j; k:=0; while st1[n]='н' do begin inc(n); inc(k); end; if k=2 then flag:= true; delete(st1,j,k) end; if flag then writeln(copy(st,1,i-1)); delete(st,1,i); until st=''; readln;end.

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

1. Как описываются строковые переменные?

2. Какая максимальная длина строки допустима в Pascal?

3. Какие операции допустимы над строковыми данными?

4. В чем отличие строковой переменной от массива символов?

5. Какие стандартные процедуры и функции для работы со строками вы знаете?

6. Что выведет функция Copy(x,Pos(' ',x)+1,18), если x='Сила есть - ума не надо'?

7. Чему равно значение x[0] после присваивания x:='вопрос'?

 

Задания

1. Вывести строку длины N (N - четное), которая состоит из чередующихся символов C1 и C2, начиная с C1.

2. Дана строка. Вывести строку, содержащую те же символы, но расположенные в обратном порядке.

3. Дана строка. Если она представляет собой запись целого числа, то вывести 1; если вещественного (с дробной частью), то вывести 2; если строку нельзя преобразовать в число, то вывести 0.

4. Дана строка S и число N. Преобразовать строку S в строку длины N следующим образом: если длина строки S больше N, то отбросить первые символы, если длина строки S меньше N, то в ее начало добавить символы "." (точка).

5. Даны два числа: N1 и N2, и две строки: S1 и S2. Получить из этих строк новую строку, объединив N1 первых символов строки S1 и N2 последних символов строки S2.

6. Даны две строки: S1 и S2. Определить количество вхождений строки S2 в строку S1.

7. Даны строки S1, S2 и символ C. После каждого вхождения символа C в строку S1 вставить строку S2.

8. Даны две строки: S1 и S2. Удалить из строки S1 все подстроки, совпадающие с S2. Если таких подстрок нет, то вывести S1 без изменений.

9. Даны три строки: S1, S2, S3. Заменить в строке S1 первое1|последнее2|все3 вхождения строки S2 на S3.

10. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Определить количество слов в строке.

11. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Определить количество слов, которые a) начинаются и заканчиваются одной и той же буквой б) содержат хотя бы одну букву "А".

12. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Определить длину самого короткого и длинного слова.

13. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Вывести строку, содержащую эти же слова (разделенные одним пробелом), но расположенные в обратном порядке.

14. Дана строка-предложение на русском языке. Подсчитать количество содержащихся в строке знаков препинания.

15. Дана строка-предложение, содержащая избыточные пробелы. Преобразовать ее так, чтобы между словами был ровно один пробел.

16. Дана строка, содержащая полное имя файла, то есть имя диска, список каталогов (путь), собственно имя и расширение. Выделить из этой строки имя файла.

17. Дана строка, содержащая полное имя файла. Выделить из строки название последнего каталога (без символов "\"). Если файл содержится в корневом каталоге, то вывести символ "\".

18. Дана строка-предложение. Зашифровать ее, поместив вначале все символы, расположенные на четных местах, а затем, в обратном порядке, все символы, расположенные на нечетных местах (например, строка "Программа" превратится в "ргамамроП").

19. Дана строка, содержащая несколько круглых скобок. Если скобки расставлены правильно (то есть каждой открывающей соответствует одна закрывающая), то вывести число 0. В противном случае вывести или номер позиции, в которой расположена первая ошибочная закрывающая скобка, или, если закрывающих скобок не хватает, число -1.

Обработка текста: В следующих заданиях под словом "текст" понимается строка символов, слова в которой, разделены пробелами, ",",".","!","?",";",":" (одним или несколькими).

  1. Дан текст. а) Подсчитать количество слов в данной строке. б) Подсчитать количество букв а в последнем слове данной строки. в) Найти количество слов, начинающихся с буквы б. г) Найти количество слов, у которых первый и последний символы совпадают между собой. д) Найти длину самого короткого слова.
  2. Составить программу циклической перестановки букв в словах текста так, что i-я буква слова становится i+1-ой, а последняя - первой.
  3. В каждом слове текста замените "а" на букву "е", если "а" стоит на четном месте, и заменить букву "б" на сочетание "ак", если "б" стоит на нечетном месте.
  4. Гжатск получил новое название - город Гагарин. А в рязанской областной типографии еще не просохли гранки небольшой книги о родине первого космонавта. Конечно, книгу нужно было переделать... Написать программу, осуществляющую в некотором тексте замену слова "Гжатск" словом "Гагарин" (учесть, что слова имеют разную длину!)
  5. Дан текст, содержащий от 2 до 30 слов, в каждом из которых от 2 до 10 латинских букв; между соседними словами - не менее одного пробела. Напечатать все слова, отличные от последнего слова, предварительно преобразовав каждое из них по следующему правилу: 1) перенести первую букву в конец слова; 2) перенести последнюю букву в начало слова.
  6. Отредактировать заданное предложения текста, удаляя из него все слова с нечетными номерами и переворачивая слова с четными номерами. Например, HOW DO YOU DO -> OD OD
  7. Дан текст. Напечатать все слова, отличные от последнего слова, предварительно преобразовав каждое из них по следующему правилу: 1) оставить в слове только первые вхождения каждой буквы; 2) если слово нечетной длины, то удалить его среднюю букву
  8. Написать программу для подсчета суммы мест, на которых в словах текста стоит заданная буква.
  9. Составить таблицу слов данного текста, начинающихся с буквы "А", с указанием числа повторений каждого слова.
  10. Составить программу для вычеркивания из слов текста всех букв, стоящих на нечетных местах после буквы "а". Задачи на смекалку
  11. Составить программы для перевода арабских чисел в римские и для обратной операции. Например, 255 = CCLV = сто + сто + пятьдесят + пять Замечание. Подобными алгоритмами перевода чисел из одной системы в другую мы пользуемся по нескольку раз на дню, когда ведем денежные расчеты. Сумма денег - это арабское число, которому соответствует определенный набор банкнот и монет (аналоги римских цифр).
  12. Автоморфными называются числа, которые содержатся в последних разрядах их квадрата. Например:, 52=25, 252=625. Составить программу для нахождения нескольких автоморфных чисел.
  13. Подсчитать, сколько букв надо исправить в слове Х, чтобы получилось слово Y (Х,Y - слова одинаковой длины).
  14. Какое минимальное число букв необходимо заменить в слове X с тем, чтобы оно стало перевертышем?
  15. Составить программу для подсчета числа одинаковых букв в словах X и Y равной длины, стоящих на одних и тех же местах.
  16. Задано определенное количество конкретных сочетаний букв (например, УЩ, ЮЩ и др.). Определить, сколько таких групп символов содержится в тексте, вводимом с клавиатуры.
  17. С клавиатуры вводится текст. Подсчитать и вывести на печать количество слов текста, начинающихся с гласной.
  18. Для запоминания числа p иногда используют "магические" фразы, например: "это я знаю и помню прекрасно Пи многие знаки мне лишни напрасны" или "кто и шутя и скоро пожелаетъ Пи узнать число ужъ знаетъ". Число букв в каждом слове любой из данных фраз представляет собою некоторую цифру числа: "это"-3, "я"-1, "знаю"-4 и т.д. Составить программу, которая по указанному алгоритму будет выводить на печать число, используя любой текст.
  19. Для заданного текста определить длину содержащейся в нем максимальной серии символов, отличных от латинских букв.
  20. Записать программу, выясняющую, можно ли из букв слова X составить слово Y.

 

Задачи повышенной сложности

 

  1. Зашифровать введенную с клавиатуры строку, поменяв местами первый символ со вторым, третий с четвертым и т. д. Затем провести дополнительную шифровку результата смещением кода. Провести дешифровку.
  2. Составить процедуру создания текстового окна, окаймленного рамкой из псевдографических символов. В параметры процедуры ввести координаты левого верхнего угла, размеры и цвет окна, а также цвет рамки.
  3. Составить программу, организующую перемещение текстового окна 8х8 по экрану. См. задачу 2. Движение начинается по нажатию клавиши и заканчивается либо по нажатию клавиши, либо при достижении окном края экрана. Варианты движения: а) из левого верхнего угла в правый нижний угол. При неточном "попадании" в нижний угол смещать окно по одной из сторон до точной остановки в углу. б)из левого нижнего угла в правый верхний. в) из центра экрана к одной из боковых сторон. При достижении края размер окна по направлению движения должен уменьшаться до минимального.

 



Поделиться:


Последнее изменение этой страницы: 2016-08-06; просмотров: 1126; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.188.68.115 (0.008 с.)