Урок 6. C++ работа со строками

Теория

Строки в 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] == ' ')
    			//что-то делаем
    	}

Строковые функции

    Find()

    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

Лабораторная работа1:

Выполнить: Дана переменная строкового типа (s="Hello world") и дан символ (переменная c) (пользователь его вводит). Проверьте, есть ли символ c среди символов строки. Создайте функцию с именем checkIfChar. Функция должна возвращать 1, если введенный символ найден, или 0 в противном случае..

Указание 1: Сигнатура функции должна быть следующей:

bool checkIfChar(string s, char c)

Примерный вывод:

lab 1
"Hello world"
введите символ:
>>> o
результат:
1

✍ Алгоритм:

  1. Откройте visual studio и создайте консольное приложение с Lesson6.
  2. Добавьте два файла .cpp в папку исходных файлов проекта (basicStrings.cpp и main.cpp) и один файл заголовка должен быть добавлен в папку заголовочные файлы.
  3. Откройте код main.cpp и добавьте все библиотеки, которые нам нужны для выполнения лабораторной работы:
  4. #include 
    #include  //
    #include  // необходим для работы со строковым типом
    using namespace std;
    
  5. В функции main() добавьте код с просьбой пользователя ввести предложение и присвойте входное значение переменной str. Не забудьте объявить переменную::
  6. int main() {
    	cout << "lab 1:" << endl;
    	string str="Hello world"; 
    	
      // ..
    }
    
  7. Затем попросите пользователя ввести символ. Присвойте значение переменной c:
  8. cout << "Enter character :" << endl;
    	char c;
    	cin >> c;
    
  9. Теперь необходимо создать функцию для проверки, находится ли символ в предложении. Функция должна быть с двумя аргументами — предложением (str) и символом (c). Добавьте заголовок объявления функции перед функцией main():
  10.  //lab 1: 
    bool checkIfChar(string s, char c)
    {
    	// выполнение
    }
    
  11. Добавьте код прохода по символам строки, используя цикл for. Внутри тела цикла мы должны проверить, соответствует ли текущий символ строки символу c. Если это так, функция должна возвращать 1, в случае, когда это не так, функция возвращает 0.
  12. for (int i=0;i<= s.size();i++){
    		if (s[i]==c){
    			return 1;
                            break;
                     }
    	}
    return 0;
    
  13. Вернитесь к функции main() и вызовите созданную функцию. Результаты функции должны быть выведены, поэтому вызов должен быть внутри инструкции cout<<:
  14. cout << "result :" << checkIfChar(str, c) << endl;
    
  15. Не забудьте добавить инструкцию, чтобы окно консоли оставалось открытым:
  16. //...
    system("pause");
    return 0;
    //...
    
  17. Запустите программу и проверьте выходные данные.
Задание 1:

Выполнить: Создайте функцию для проверки того, содержит ли вводимый текст комбинацию букв "mo". Функция должна возвращать 1 (если содержит) или 0 (если не содержит). Не допускается использование каких-либо стандартных функций.

Указание 1: Сигнатура функции должна быть следующей:

bool findMo(string s)

Указание 2: Чтобы проверить два или более условия в операторе if, вы должны использовать && (логическое И):

if (condition_1 && condition_2){
}

Примерный вывод:

Задание 1
результат для 'Hello world':
0
---
Задание 1
результат для 'My mom':
1

Задание 3:

Выполнить: Дано предложение: str = "слово1 слово2 слово3 слово4". Подсчитайте количество слов в нем. Не допускается использование каких-либо стандартных функций.

Указание 1: Вы должны подсчитать количество слов по количеству пробелов между словами.

Указание 2: Не забудьте проверить, не содержит ли предложение дополнительных пробелов в начале и конце предложения.

Указание 3: Сигнатура созданной функции должна быть следующей:

void countWords(string s, int& counter)

Примерный вывод:

задание 3
Введите предложение:
>>>  word1 word2 word3 word4
результат:
4

Задание 4:

Выполнить: Дана строка. Проверьте, совпадают ли ее первый и последний символы. Создайте функцию с идентификаторами LastAndFirst(). Не допускается использование каких-либо стандартных функций (кроме функции size()).

Указание 1: Заголовок функции:

bool LastAndFirst(string s)

Указание 2: Метод size() может быть полезен для поиска последнего символа (s.size()).

Примерный вывод:

задание 4
Для предложения Hello world
результат:
false
---
задание 4
Для предложения lucky ball
результат:
true

Строковые функции

Задание 5:

Выполнить: Создайте функцию для проверки, содержит ли текст слово 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
Лабораторная работа 2:

Выполнить: Даны две строки 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

✍ Алгоритм:

  1. Открытый файл main.cpp и в коде основной функции, под предыдущим кодом задания, добавьте комментария с номером задания. После этого объявите переменные строкового типа и инициализируйте их значениями:
  2. //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 используется для перехода на новую строку.
  3. Откройте файл basicStrings.cpp и добавьте код заголовка функции:
  4. // lab 2: 
    int countOccurrence(string s, string s0)
    {
       // to do:
    } 
    
  5. Функция должна возвращать целочисленный тип.
  6. Функция имеет два параметра строкового типа: s - строка, содержащая предложение, и s0 - подстрока, которую мы должны найти в строке s.
  7. Чтобы найти подстроку, мы собираемся использовать стандартный метод find() и переменную f типа size_t (целочисленный тип без знака). Переменная f хранит положение подстроки внутри строки s. И если нет искомой подстроки, то f сохранит число 0, так как оно будет увеличено на 1 (f+1). Когда функция find() достигнет конца строки, значение npos (npos — это константа - максимальное значение для size_t (обычно = 4294967295)) будет присвоено переменной f:
  8.  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 будет выполнен только в том случае, если при поиске подстрок мы дойдем до конца строки.
  9. Вернитесь к main.cpp файлу и внутри основной функции добавьте вызов нашей функции. Поскольку функция вернет целочисленное значение, то есть количество вхождений, мы должны сохранить результат функции в переменной:
  10. int counter = countOccurrence(str1, str2);
    cout << "result :"  << counter << endl;
    
  11. Запустите программу и посмотрите выходные данные.
Задание 6:

Выполнить: Даны строки 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
Задание 7:

Выполнить: Дана строка, содержащая по крайней мере один символ пробела. Необходимо возвратить подстроку между первым и последним пробелами строки. Если строка содержит один пробел, должна быть возвращена пустая строка.

Указание 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. Дана строка, содержащая полное имя файла. Выделить из этой строки название последнего каталога (без символов «\»). Если файл содержится в корневом каталоге, то вывести символ «\».