Теория
Строки в C++
- Для работы со строкой должна быть включена библиотека
string
: - Переменные строкового типа можно понимать как массив символов.
- К определенному символу в строке можно получить доступ как в обычном массиве, то есть по его индексу:
#include <string> |
string str="it's possible to understand it"; cout << str[2] << endl; // вывод: ' for (int i = 0; i <= str.size(); i++) { // для перебора символов строки if (str[i] == ' ') //что-то делаем } |
Строковые функции
size_t find
(const string& str, size_t pos = 0) const;
pos
, поиск включает только символы в позиции pos
или после нее, игнорируя любые возможные вхождения, которые включают символы перед позицией pos
.size_t
— это целочисленный тип без знака, размер любого объекта в байтах.npos
— максимальное значение size_t
(обычно = 4294967295)len
(или sublen)
в функциях-членах string, означает «до конца строки».-1
, которое, поскольку size_t
является целым типом без знака, является максимально возможным представимым значением для этого типа.string str="it's possible to understand it"; string substr="it"; size_t f = -1; int counter = 0; while (true) // infinite loop { // f = str.find(substr); //значение f будет равно 0 // 'f+1' требуется для перехода на следующую позицию после найденного совпадения f = str.find(substr, f+1); // на 2-й итерации f = 28 // на 3-й итерации f = 4294967295 это означает, что совпадений больше нет // string::npos = 4294967295 if (f == string::npos) break; counter++; } cout << counter; |
Управляющие (специальные) символы используются для представления определенных специальных символов в строковых литералах и символьных литералах: \‘
— одинарная кавычка
char c = '\'' |
Лабораторные работы
Правила оформления работ:
- Для выполнения заданий необходимо использовать перечисления и оператор switch.
- Все задания должны выполняться с помощью функций, результаты должны проверяться оператором
assert
в заголовочном файле. - Все функции и файлы должны сопровождаться комментариями с постановкой задания.
Тип String
Выполнить: Дана переменная строкового типа (s="Hello world"
) и дан символ (переменная c
) (пользователь его вводит). Проверьте, есть ли символ c
среди символов строки. Создайте функцию с именем checkIfChar
. Функция должна возвращать 1, если введенный символ найден, или 0 в противном случае..
Указание 1: Сигнатура функции должна быть следующей:
bool checkIfChar(string s, char c) |
Примерный вывод:
lab 1 "Hello world" введите символ: >>> o результат: 1
✍ Алгоритм:
- Откройте visual studio и создайте консольное приложение с Lesson6.
- Добавьте два файла
.cpp
в папку исходных файлов проекта (basicStrings.cpp
иmain.cpp
) и один файл заголовка должен быть добавлен в папку заголовочные файлы. - Откройте код
main.cpp
и добавьте все библиотеки, которые нам нужны для выполнения лабораторной работы: - В функции
main()
добавьте код с просьбой пользователя ввести предложение и присвойте входное значение переменнойstr
. Не забудьте объявить переменную:: - Затем попросите пользователя ввести символ. Присвойте значение переменной
c
: - Теперь необходимо создать функцию для проверки, находится ли символ в предложении. Функция должна быть с двумя аргументами — предложением (
str
) и символом (c
). Добавьте заголовок объявления функции перед функциейmain()
: - Добавьте код прохода по символам строки, используя цикл
for
. Внутри тела цикла мы должны проверить, соответствует ли текущий символ строки символуc
. Если это так, функция должна возвращать 1, в случае, когда это не так, функция возвращает 0. - Вернитесь к функции
main()
и вызовите созданную функцию. Результаты функции должны быть выведены, поэтому вызов должен быть внутри инструкцииcout<<
: - Не забудьте добавить инструкцию, чтобы окно консоли оставалось открытым:
- Запустите программу и проверьте выходные данные.
#include#include using namespace std;// #include // необходим для работы со строковым типом
int main() { cout << "lab 1:" << endl; string str="Hello world"; // .. }
cout << "Enter character :" << endl; char c; cin >> c;
//lab 1: bool checkIfChar(string s, char c) { // выполнение }
for (int i=0;i<= s.size();i++){ if (s[i]==c){ return 1; break; } } return 0;
cout << "result :" << checkIfChar(str, c) << endl;
//... system("pause"); return 0; //...
Выполнить: Создайте функцию для проверки того, содержит ли вводимый текст комбинацию букв "mo
". Функция должна возвращать 1 (если содержит) или 0 (если не содержит). Не допускается использование каких-либо стандартных функций.
Указание 1: Сигнатура функции должна быть следующей:
bool findMo(string s) |
Указание 2: Чтобы проверить два или более условия в операторе if
, вы должны использовать &&
(логическое И):
if (condition_1 && condition_2){ } |
Примерный вывод:
Задание 1 результат для 'Hello world': 0 --- Задание 1 результат для 'My mom': 1
Выполнить: Дано предложение: str = "слово1 слово2 слово3 слово4"
. Подсчитайте количество слов в нем. Не допускается использование каких-либо стандартных функций.
Указание 1: Вы должны подсчитать количество слов по количеству пробелов между словами.
Указание 2: Не забудьте проверить, не содержит ли предложение дополнительных пробелов в начале и конце предложения.
Указание 3: Сигнатура созданной функции должна быть следующей:
void countWords(string s, int& counter) |
Примерный вывод:
задание 3 Введите предложение: >>> word1 word2 word3 word4 результат: 4
Выполнить: Дана строка. Проверьте, совпадают ли ее первый и последний символы. Создайте функцию с идентификаторами LastAndFirst()
. Не допускается использование каких-либо стандартных функций (кроме функции size()
).
Указание 1: Заголовок функции:
bool LastAndFirst(string s) |
Указание 2: Метод size()
может быть полезен для поиска последнего символа (s.size()
).
Примерный вывод:
задание 4 Для предложения Hello world результат: false --- задание 4 Для предложения lucky ball результат: true
Строковые функции
Выполнить: Создайте функцию для проверки, содержит ли текст слово cat. Выведите позицию (индекс) слова в тексте. Необходимо использовать стандартную функцию поиска (find).
Указание 1: Заголовок функции:
void findCatFunction(string s, string s0) |
Указание 2: Функция find()
:
s.find(s0) // возвращает -1, если в тексте s нет совпадений с s0 |
Примерный вывод:
задание 5 для текста: cat word1 word3 word4 результат: 0 --- задание 5 для текста: word1 word3 word4 результат: cat не найдено --- задание 5 для текста: word1 cat word3 word4 результат: cat найдено в позиции 6
Выполнить: Даны две строки S
и S0
(вводятся). Найдите количество вхождений строки S0
в строку S
.
Указание 1: В задании удобно использовать функцию find
класса string, которая возвращает позицию вхождения типа size_t
(целое число без знака) или значение string :: npos в случае, если вхождение не было найдено. Рассмотрите пример, чтобы понять, как их использовать.
Указание 2: Заголовок функции:
int countOccurrence(string s, string s0) |
Примерный вывод:
Lab 2 строка 1: it's possible to understand it строка 2: it результат: 2
✍ Алгоритм:
- Открытый файл
main.cpp
и в коде основной функции, под предыдущим кодом задания, добавьте комментария с номером задания. После этого объявите переменные строкового типа и инициализируйте их значениями: - Откройте файл
basicStrings.cpp
и добавьте код заголовка функции: - Функция должна возвращать целочисленный тип.
- Функция имеет два параметра строкового типа:
s
- строка, содержащая предложение, иs0
- подстрока, которую мы должны найти в строкеs
. - Чтобы найти подстроку, мы собираемся использовать стандартный метод
find()
и переменнуюf
типаsize_t
(целочисленный тип без знака). Переменнаяf
хранит положение подстроки внутри строкиs
. И если нет искомой подстроки, тоf
сохранит число 0, так как оно будет увеличено на 1 (f+1). Когда функцияfind()
достигнет конца строки, значениеnpos
(npos
— это константа - максимальное значение дляsize_t
(обычно = 4294967295)) будет присвоено переменнойf
: - Вернитесь к
main.cpp
файлу и внутри основной функции добавьте вызов нашей функции. Поскольку функция вернет целочисленное значение, то есть количество вхождений, мы должны сохранить результат функции в переменной: - Запустите программу и посмотрите выходные данные.
//lab 2 cout << "lab 2:" << endl; string str1, str2; str1 = "it's possible to understand it"; str2 = "it"; cout << "string 1: " << str1 << "\n string 2: "<< str2 << endl;
\n
используется для перехода на новую строку.// lab 2: int countOccurrence(string s, string s0) { // to do: }
size_t f = -1; int res = 0; // counter of the numbers of occurrences while (true) // infinite loop { f = s.find(s0,f+1); if (f == string::npos) // if the end of the string is reached break; // exit loop ++res; } return res;
break
будет выполнен только в том случае, если при поиске подстрок мы дойдем до конца строки.int counter = countOccurrence(str1, str2); cout << "result :" << counter << endl;
Выполнить: Даны строки S
и S0
. Создайте функцию для удаления последней подстроки, соответствующей S0
, из строки S
. Если совпадающих подстрок нет, то верните неизмененную строку S
.
Указание 1: Вы можете использовать функцию rfind класса string, чтобы найти последнее вхождение подстроки, или можете использовать функцию erase для удаления.
Указание 2: Заголовок функции:
string eraseLast(string s, string s0) { // to do: // // return s; } |
Примерный вывод:
задание 6: строка 1: it's possible to understand it строка 2: it результат: it's possible to understand
Выполнить: Дана строка, содержащая по крайней мере один символ пробела. Необходимо возвратить подстроку между первым и последним пробелами строки. Если строка содержит один пробел, должна быть возвращена пустая строка.
Указание 1: Можно использовать функцию substr member function of the string.
Указание 2: Заголовок функции:
string betweenSpaces(string s) { size_t f1, f2; f1 = s.find(" "); // индекс первого пробела f2 = s.rfind(" "); // индекс последнего пробела // ...; // ...; return // ...; } |
Примерный вывод:
задание 7: строка: it's possible to understand it результат: possible to understand
Указания: задания следует сохранить в файле с именем задания, и обязательно в коде вставить комментарий с постановкой задачи.
STRING:
String13. Дана строка. Подсчитать количество содержащихся в ней цифр.
String28. Дан символ C и строка S. Удвоить каждое вхождение символа C в строку S.
String35. Даны строки
S
и S0
. Удалить из строки S
все подстроки, совпадающие с S0
. Если совпадающих подстрок нет, то вывести строку S
без изменений.String43. Дана строка, состоящая из русских слов, набранных заглавными буквами и разделенных пробелами (одним или несколькими). Найти количество слов, которые содержат хотя бы одну букву «А».
String61. Дана строка, содержащая полное имя файла. Выделить из этой строки название последнего каталога (без символов «
\
»). Если файл содержится в корневом каталоге, то вывести символ «\
».