Задание к лабораторной работе № 6




Лабораторная работа № 6

Работа со строками

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

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

Символьная константа представляется символом, заключенном в апострофы. Управляющая последовательность рассматривается как одиночный символ и ее допустимо использовать в символьных константах. Значением символьной константы является числовой код символа.Например:

' ' – пробел,

'Q' – буква Q(либо любая буква соответсвенно),

'\n' – символ новой строки, '\\' – обратная дробная черта,

'\0' – символ с нулевым кодом

В языке C++ для хранения однобайтового символа используется тип данных char. Переменную типа char можно рассматривать двояко: как целое число, занимающее 1 байт и способное принимать значения от -128 до 127 (тип signedchar, есть также беззнаковая модификация unsignedchar, принимающая значения от 0 до 255) и как один символ текста. Само по себе определение char может оказаться как знаковым, так и беззнаковым, в зависимости от операционной системы и компилятора. Поэтому использовать тип char не рекомендуется, лучше явно указывать будет ли он знаковым (signed) или беззнаковым (unsigned).

Как и целые числа, данные типа char можно складывать, вычитать, умножать и даже делить. Но если операции умножения и деления, как правило, бессмысленны, то сложение и вычитание вполне осмысленно. Например, если к символу 'A' прибавить 1, то получится символ 'B', а если вычесть 1, то получится символ '@'. То есть в следующем фрагменте кода на экран будет выведена букваB.

В этом примере видно, что переменным типа char можно присваивать значения,

равные ASCII кодам символов, если эти символы заключать в кавычки. То есть запись 'A'

будет соответствовать символу A, или ASCII коду 65.

Кроме того, этот пример показывает, что при выводе на экран переменной типа char мы увидим изображение этого символа. Значение ASCII-кода символа не нужно узнавать, сам символ – это и есть ASCII-код. Для того.чтобы вывести его на экран необходимо преобразовать значение величины типа char к значению типа int.Например:

cout<< (int) c<<endl;

Имя типа, записанное в скобочках перед значением, это и есть оператор преобразования значения к указанному типу.

Аналогично, при считывании переменной типа char через поток cout, из потока ввода считывается один символ, переменная получает значение, равное его ASCII-коду. Например, если написать программу, содержащую строку:

charc; cin>>c;

затем запустить ее, ввести символ A (без всяких кавычек!), то в переменную cбудет записано значение 65 – ASCII-код символа A.

 

Переменным типа char можно и явно присваивать числовые значения. Например:

Эта программа выведет две строки: “A 65” и “~ 126”, то есть символы с ASCII-

кодами 65 (A) и 126 (~) и сами ASCII-коды.

Организовать последовательное посимвольное считывание всего входного потока можно при помощи цикла while:

В этом примере программа будет посимвольно считывать входной поток (по умолчанию – ввод с клавиатуры), пока не встретит признак конца файла. Для того, чтобы сообщить программе о завершении входного потока при вводе с клавиатуры необходимо нажать клавиши Ctrl-d в системе Linux и Ctrl-z в системе Windows.

Эта программа при считывании данных будет игнорировать символы–разделители: пробелы, символы новой строки и табуляции. Если нужно, чтобы в переменную cсчитывались все символы, в том числе и разделители, то необходимо для потока ввода cin установить манипулятор noskipws при помощи инструкции:

cin>>noskipws;

Строковая константа (литерал) – последовательность символов (включая строчные и прописные буквы русского и латинского а также цифры) заключенные в кавычки (").Например: "Школа №19", "город Майкоп", "YZPT КОД".

Все управляющие символы, кавычка ("), обратная дробная черта (\) и символ новой строки в строковом литерале и в символьной константе представляются соответствующими управляющими последовательностями. Каждая управляющая последовательность представляется как один символ. Например, при печати литерала "Школа \n №19" его часть "Школа" будет напечатана на одной строке, а вторая часть "№19" на следующей строке.

В памяти в конец каждого строковой константы компилятором добавляется нулевой символ (признак конца строки), представляемый управляющей последовательностью\0.

Строки имеют тип char[]. Это означает, что строка рассматривается как массив символов.

Отметим, что тип char используется для представления символа. Значением объекта типа char является код (размером 1 байт), соответствующий представляемому символу. Для представления символов русского алфавита, модификатор типа идентификатора данных имеет вид unsignedchar, так как коды русских букв превышают величину127.


Строки в языке C++

Текстовая строка – это последовательность символов. Поскольку символы в строке пронумерованы, то естественным представлением для строки был бы массив символов. Так строки и представлялись в языке C – строкой считался массив символов, а для обозначения конца строки использовался символ с ASCII-кодом 0, что позволяло хранить строки переменной длины (то есть в массиве char[n] можно было хранить строки любой длины, не превосходящей n-1. Такой способ хранения строк порождал ряд неудобств: любая строка была ограничена по длине размером массива, а чтобы вычислить длину строки необходимо было пройти по всей строке до появления нулевого символа, то есть определение длины строки требует количество операций, пропорциональное этой длине.

В языке C++ для представления строк существует более совершенный тип данных string, в основе которого лежит такой же массив символов, завершающийся нулевым символом, но содержащий еще ряд дополнительных возможностей. Для работы со строками языка C++ необходимо в начале программы подключить описание типа string, которое находится в одноименном файле:

#include<string>

Переменная для хранения строковых данных объявляется так:

stringS;

Присвоить строковой переменной некоторое константное значение можно так:

S = "Hello, world!";

В рассмотренных ранее примерах мы уже встречались записью строк в тексте программы в кавычках – когда выводили текст в поток cout. Обратите внимание – константы типа char записываются в одинарных кавычках, а строки – в двойных кавычках. В частности, 'A' – это символ, а "A" – это строка, состоящая из одного символа. Поэтому переменной типа char нельзя присвоить значение "A", поскольку они имеют несовместимые типы данных.

По сути, переменная типа string является массивом символов и с каждым символом этой строки можно работать по отдельности, обращаясь к ним по индексу, как к элементам массива.Например:

 

Вот пример реализации той же задачи но с использованием массива char

Для определения длины строки есть метод size(), применяемый к строке. Он возвращает целое число – количество символов в строке. Его можно использовать так:

 

Каквымоглизаметить, строкабылавведеналатиницей, хотяибылподключенрусскийязык.

Типstringнапрямуюнеподдерживаеткирилицу. Вотчтопроисходитесливводитьрусскиебуквыприсчитываниеstring.

Для решения данной проблемы нужно использовать тип данных wstring. Но у него ряд ограничений. Во первых для считывания и вывода надо использовать wcinи wcout. Во вторых при выводе текста перед кавычками необходимо писать специальный символ L. И самое главное нужно в начале кола указать тип кодирования текста при считываение с помощью команды wcin.imbue(locale(“.866”));

 

Так же, если использовать массив char, то ничего дополнительного подключать не надо, так как char понимает кириллицу, но посчитать количество символов будет сложнее.

Основная операция над строками – сложение: например, при сложении строк "Hello, " и "world!" получится строка "Hello, world!". Такая операция над строками называетсяконкатенацией.

Пример использования конкатенации строк:

Другая операция – изменение размера строки. Для этого существует метод resize,

который применяется к строке. У метода resize есть две формы записи: с одним и с двумя


параметрами. Если он вызывается с одним параметром, то этот параметр задает новую длину строки. Например, так:

Второй параметр метода resize задает символ, которым будут заполнены символы в строке, если размер строки увеличивается в результате изменения размера. Например:

При считывании строк из входного потока считываются все символы, кроме символов–разделителей (пробелов, табуляций и новых строк), которые являются границами между строками. Например, если при выполнении следующей программы

StringS1, S2, S3; // объявили 3 строки

cin>>S1>>S2>>S3;

ввести текст ‘Мама мыла раму’ (с произвольным количеством пробелов между словами), то в массив S1 будет записана строка "Мама", в S2 – "мыла", в S3 – "раму".

Таким образом, организовать считывание всего файла по словам, можно следующим образом:

strings;

while (cin>>s) // Цикл пока считывание успешно

{ // Делаем необходимыедействия

}

Если нужно считать строку со всеми пробелами, то необходимо использовать функцию getline следующим образом:

string S; getline(cin, S);

В данном случае если запустить эту программу и ввести строку "Мама мыла раму",

то именно это значение и будет присвоено строке S. Считать же весь входной поток по строкам можно при помощи следующего кода:

string S;

while (getline(cin, S)) // Цикл пока считывание успешно

{ // Делаем необходимыедействия

Пример 1. Заменить во введенном с клавиатуры тексте все встречающиеся символы "n" на символ"b".

Словесный алгоритм будет иметь вид:

а) Формирование тела программы, объявление переменных; б) Ввод текста;

в) Выяснение, не пустая ли строка;

г) Если строка не пуста, то цикл, в котором сравнение очередного символа введенной строки с искомой переменной, с последующей заменой ее на определенный символ.

На языке С++ данный алгоритм будет реализован следующей программой:

Реализовав данную программу в интегрированной среде программирования,

получим результирующее окно, представленное на рисунках

Пример 2. Дан текст, слова в котором будут разделяться пробелами. Требуется напечатать все слова с удвоенной буквой"n".

Этапы решения задачи:

Разобьем задачу на несколько блоков

а) формирование тела программы, объявление переменных; б) ввод текста;

в) определение начальных переменных и выяснение, не пустая ли строка; г) если строка не пустая, то организуем цикл пока она не кончится;

д) сбрасываем flag и заполняем строку s1 пробелами;

е) организуем цикл до окончания строки с текстом (выйдем, как только встретим пробел). Если очередной символ строки s0 не пробел, то копируем его в строку s1;

ж) поиск в строке s1 (очередное слово) удвоенных букв "n" и печать найденного слова;

з) удаление найденного слова из строки s0, включая последующий пробел.и) если текст не закончился возвращение к пункту (д).

 

Реализовав данную программу в интегрированной среде программирования,

получим результирующее окно, представленное на рисунке.

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

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

Какая максимальная длина строки допустима вС++? Какие операции допустимы над строковыми данными?

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

Какие стандартные процедуры и функции для работы со строками вы знаете? Что выведет функция Copy(x,Pos(' ',x)+1,18), если x='Сила есть - ума ненадо'? Чему равно значение x[0] после присваиванияx:='вопрос'?

 

Задание к лабораторной работе № 6

В отчете должны находиться:

1) Все набранные примеры.

2) программа (код и скриншот выполнения), которая решает поставленную задачу вашего варианта

3) Уметь отвечать на контрольные вопросы и любые дополнительные.

Задание № 1.

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. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Вывести строку, содержащую эти же слова (разделенные одним пробелом), но расположенные в обратномпорядке.


Задание № 2.

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

1. Дан текст. а) Подсчитать количество слов в данной строке. б) Подсчитать количество букв а в последнем слове данной строки. в) Найти количество слов, начинающихся с буквы б. г) Найти количество слов, у которых первый и последний символы совпадают между собой. д) Найти длину самого короткогослова.

2. Составить программу циклической перестановки букв в словах текста так, что i-

я буква слова становится i+1-ой, а последняя - первой.

3. В каждом слове текста замените "а" на букву "е", если "а" стоит на четном месте, и заменить букву "б" на сочетание "ак", если "б" стоит на нечетномместе.

4. Гжатск получил новое название – город Гагарин. А в рязанской областной типографии еще не просохли гранки небольшой книги о родине первого космонавта. Конечно, книгу нужно было переделать... Написать программу, осуществляющую в некотором тексте замену слова "Гжатск" словом "Гагарин" (учесть, что слова имеют разнуюдлину!)

5. Дан текст, содержащий от 2 до 30 слов, в каждом из которых от 2 до 10 латинских букв; между соседними словами - не менее одного пробела. Напечатать все слова, отличные от последнего слова, предварительно преобразовав каждое из них по следующему правилу: 1) перенести первую букву в конец слова; 2) перенести последнюю букву в началослова.

6. Отредактировать заданное предложения текста, удаляя из него все слова с нечетными номерами и переворачивая слова с четными номерами. Например, HOW DO YOU DO → ODOD

7. Дан текст. Напечатать все слова, отличные от последнего слова, предварительно преобразовав каждое из них по следующему правилу: 1) оставить в слове только первые вхождения каждой буквы; 2) если слово нечетной длины, то удалить его среднююбукву

8. Написать программу для подсчета суммы мест, на которых в словах текста стоит заданнаябуква.

9. Составить таблицу слов данного текста, начинающихся с буквы "А", с указанием числа повторений каждогослова.

10. Составить программу для вычеркивания из слов текста всех букв, стоящих на нечетных местах после буквы "а". Задачи насмекалку

11. Составить программы для перевода арабских чисел в римские и для обратной операции. Например, 255 = CCLV = сто + сто + пятьдесят + пять Замечание. Подобными алгоритмами перевода чисел из одной системы в другую мы пользуемся по нескольку раз на дню, когда ведем денежные расчеты. Сумма денег - это арабское число, которому соответствует определенный набор банкнот и монет (аналоги римскихцифр).

12. Автоморфными называются числа, которые содержатся в последних разрядах их квадрата. Например:, 52=25, 252=625. Составить программу для нахождения нескольких автоморфныхчисел.

13. Подсчитать, сколько букв надо исправить в слове Х, чтобы получилось слово Y (Х,Y - слова одинаковойдлины).

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2018-01-31 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: