Загрузка данных


ЛАБОРАТОРНАЯ РАБОТА №10
Обработка строк
Вариант №6

================================================================================
ЗАДАНИЕ 1
================================================================================

Текст задания:
Вводится строка произвольного текста. Вывести на экран все знаки препинания
из этой строки. Если таких символов нет, вывести -1.

Назначение переменных:
- punct – строка, содержащая все знаки препинания (.,!?:;)
- str – исходная строка, введённая пользователем
- strTemp – строка для накопления найденных знаков препинания

Описание кода:
Программа запрашивает у пользователя строку. Затем проходит по всем символам
строки с конца к началу. Для каждого символа проверяет, является ли он знаком
препинания. Если является, добавляет его в начало строки strTemp.
После цикла, если длина strTemp меньше или равна 1, выводит -1.
Иначе выводит найденные знаки препинания.

Текст программы:
--------------------------------------------------------------------------------
#include <iostream>
using namespace std;

int main()
{
    string punct = ".,!?:;";
    string str = "";
    string strTemp = "";
    
    cout<<"Введите строку:"<<"\n";
    getline(cin, str); 
    
    for (int i = str.length(); i > 0; i = i - 1)
    {
        for (int j = 0; j <= punct.length(); j = j + 1)
        {
            if (punct[j] == str[i]) 
            {
                strTemp = str[i] + strTemp;
            }
        }
    }
    
    if (strTemp.length() <= 1)
    {
        cout<<"-1"<<"\n";
    }
    else
    {
        cout<<"Знаки препинания:"<<strTemp<<"\n";
    }
    
    return 0;
}

================================================================================
ЗАДАНИЕ 2
================================================================================

Текст задания:
Вводится строка произвольного текста. Удалить все пробелы в этой строке.
Вывести преобразованную таким образом строку.

Назначение переменных:
- str – исходная строка, введённая пользователем
- strTemp – строка для накопления символов, не являющихся пробелами

Описание кода:
Программа запрашивает строку. Затем проходит по всем символам строки.
Если символ не является пробелом, он добавляется в строку strTemp.
После завершения цикла выводится строка без пробелов.

Текст программы:
--------------------------------------------------------------------------------
#include <iostream>
using namespace std;

int main()
{
    string str = "";
    string strTemp = "";
    
    cout<<"Введите строку:"<<"\n";
    getline(cin, str); 
    
    for (int i = str.length(); i >= 0; i = i - 1)
    {
        if (str[i] != ' ') 
        {
            strTemp = str[i] + strTemp;
        }
    }
    
    cout<<"Строка без пробелов:"<<strTemp<<"\n";
    
    return 0;
}

================================================================================
ЗАДАНИЕ 3
================================================================================

Текст задания:
Вводится строка символов. Определить количество букв в последнем слове.
Предусмотреть вариант, когда в конце строки есть пробелы.

Назначение переменных:
- count – счётчик количества букв в последнем слове
- str – исходная строка
- number – индекс, используемый для прохода по строке с конца

Описание кода:
Программа запрашивает строку. Переменная number устанавливается на последний
символ строки. Первый цикл пропускает пробелы в конце строки.
Второй цикл проходит по символам последнего слова, пока не встретит пробел
или не дойдёт до начала строки. Для каждого символа проверяется, является ли
он буквой с помощью isalpha. Если да, счётчик увеличивается.
В конце выводится количество букв в последнем слове.

Текст программы:
--------------------------------------------------------------------------------
#include <iostream>
using namespace std;

int main()
{
    int count = 0;
    string str = "";
    
    cout<<"Введите строку:"<<"\n";
    getline(cin, str); 
    int number = str.length() - 1;

    while (number >= 0 && str[number] == ' ') 
    {
        number = number - 1;
    }

    while (number >= 0 && str[number] != ' ') 
    {
        if (isalpha(str[number]))
        {   
            count = count + 1;
        }
        number = number - 1;
    }
    
    cout<<"В последнем слове "<<count<<" букв\n";
    
    return 0;
}

================================================================================
ЗАДАНИЕ 4
================================================================================

Текст задания:
Вводится строка символов, которые разделены на слова. Пробелы являются
разделителями между словами, причём слова могут разделяться более чем одним
пробелом, в начале и конце строки пробелы также допускаются.
Вывести на экран все слова.

Назначение переменных:
- str – исходная строка
- tempstr – временная строка для накопления текущего слова

Описание кода:
Программа запрашивает строку. Затем проходит по всем символам строки.
Если символ не является пробелом и является буквой, он добавляется во
временную строку tempstr. Если встречается пробел или конец строки,
и длина tempstr больше 0, программа выводит tempstr (найденное слово),
затем очищает tempstr для следующего слова.

Текст программы:
--------------------------------------------------------------------------------
#include <iostream>
using namespace std;

int main()
{
    int count = 0;
    string str = "";
    string tempstr = "";
    
    cout<<"Введите строку:"<<"\n";
    getline(cin, str); 
    int number = 0;
    
    for (int i = 0; i <= str.length(); i = i + 1)
    {
        if (str[i] != ' ' && isalpha(str[i]))
        {
            tempstr = tempstr + str[i];
        }
        else
        {
            if (tempstr.length() > 0)
            {
                cout<<tempstr<<"\n";
            }
            tempstr = "";
        }
    }
    
    return 0;
}

================================================================================
ЗАДАНИЕ 5
================================================================================

Текст задания:
Вводится строка символов, которые разделены на слова. Пробелы являются
разделителями между словами, причём слова могут разделяться более чем одним
пробелом, в начале и конце строки пробелы также допускаются.
Удвоить слово с заданным номером, сохраняя пробелы до и после слова.
Номер слова вводится. Если такого номера нет, оставить строку без изменения.

Назначение переменных:
- number – номер слова, которое нужно удвоить
- counter – счётчик найденных слов
- str – исходная строка
- tempstr – временная строка для хранения текущего слова

Описание кода:
Программа запрашивает строку и номер слова. Затем проходит по строке,
собирая слова во временную строку tempstr. При обнаружении конца слова
(пробел или конец строки) счётчик counter увеличивается. Когда counter
становится равным заданному номеру, программа вставляет копию слова
в строку на его место с помощью insert и завершает работу.

Текст программы:
--------------------------------------------------------------------------------
#include <iostream>
#include <cctype>

using namespace std;

int main()
{
    int number = 0;
    int counter = 0;
    string str = "";
    string tempstr = "";
    string newstr = "";
    
    cout<<"Введите строку:"<<"\n";
    getline(cin, str); 
    cin>>number;
    
    for (int i = 0; i <= str.length(); i = i + 1)
    {
        if (str[i] != ' ' && isalpha(str[i]))
        {
            tempstr = tempstr + str[i];
        }
        else
        {
            if (tempstr.length() > 1)
            {
                counter = counter + 1;
                if (number == counter) 
                {
                    str.insert(i, tempstr);
                    break;
                }
            }
            tempstr = " ";
        }
    }
    cout<<str;
    
    return 0;
}

================================================================================
ЗАДАНИЕ 6
================================================================================

Текст задания:
Вводится строка символов, которые разделены на слова. Пробелы являются
разделителями между словами. В предпоследнем слове поменять местами первый
символ с последним. Если в строке только одно слово или совсем нет слов –
оставить строку без изменения. Вывести преобразованную таким образом строку.

Назначение переменных:
- str – исходная строка
- totalWords – общее количество слов в строке
- temp – временная строка для хранения текущего слова
- currentWord – номер текущего обрабатываемого слова

Описание кода:
Программа сначала подсчитывает общее количество слов в строке.
Затем снова проходит по строке, выделяя слова. Когда доходит до
предпоследнего слова (currentWord равен totalWords - 1), программа
меняет местами первый и последний символы этого слова. После этого
старое слово удаляется, а изменённое вставляется на его место.

Текст программы:
--------------------------------------------------------------------------------
#include <iostream>
#include <string>

using namespace std;

int main() {
    string str;
    cout<<"Введите строку: \n";
    getline(cin, str);

    int totalWords = 0;
    string temp = "";

    for (int i = 0; i < str.length(); i = i + 1) 
    {
        if (str[i] != ' ') 
        {
            temp = temp + str[i];
        } 
        else 
        {
            if (temp.length() > 0) 
            {
                totalWords = totalWords + 1;
            }
            temp = "";
        }
    }
    if (temp.length() > 0) 
    {
        totalWords = totalWords + 1;
    }

    int currentWord = 0;
    temp = "";
    
    for (int i = 0; i < str.length(); i = i + 1) 
    {
        if (str[i] != ' ') 
        {
            temp = temp + str[i];
        } 
        else 
        {
            if (temp.empty() == false) 
            {
                currentWord = currentWord + 1;

                if (currentWord == totalWords - 1) 
                {
                    char first = temp[0];
                    temp[0] = temp[temp.length() - 1];
                    temp[temp.length() - 1] = first;
                    
                    str.insert(i, " " + temp); 
                    str.erase(i - temp.length(), temp.length()); 
                    break; 
                }
                temp = "";
            }
        }
    }

    cout<<"Результат: "<<str;

    return 0;
}

================================================================================
ВЫВОД
================================================================================

В ходе выполнения лабораторной работы были освоены основные приёмы обработки
строк в языке C++ с использованием типа string:
- поиск символов в строке;
- удаление символов;
- выделение подстрок;
- разбиение строки на слова;
- вставка и замена фрагментов строки;
- работа с индексами и длиной строки.

Все задания, предусмотренные для варианта №6, успешно выполнены.