Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Символьный массив (C++) 
V
    Опции темы
Hetls
Дата 18.11.2016, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 18.10.2016
Где: Русь Матушка! !!

Репутация: нет
Всего: нет



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

Хотя бы 3 и 4 пункт сделать.
PM MAIL WWW IM Skype GTalk Jabber AOL YIM MSN   Вверх
baldman88
Дата 18.11.2016, 17:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: нет
Всего: 7



Несколько вопросов:
1. Слова состоят только из латинских букв?
2. Что значит символьный массив? Просто если язык С++, то удобнее использовать строки (класс string). Или это именно массив из char?
3. Каким образом задаются "указанное" слово и слово, которое после него нужно вставить?
PM MAIL   Вверх
Hetls
Дата 18.11.2016, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 18.10.2016
Где: Русь Матушка! !!

Репутация: нет
Всего: нет



Цитата(baldman88 @ 18.11.2016,  17:56)
Несколько вопросов:
1. Слова состоят только из латинских букв?
2. Что значит символьный массив? Просто если язык С++, то удобнее использовать строки (класс string). Или это именно массив из char?
3. Каким образом задаются "указанное" слово и слово, которое после него нужно вставить?

1) Да
2) Просто массив, который заполняется латинскими словами через пробел
3) Указанное слово (должна выводиться строка с вводом "Vvedite ukazanoe slovo" и в ней вводить любое слово, которое есть в массиве, ну а если слова нету, то выводить ошибку - "Slovo ne naideno"); Новое слово (тоже должна выводиться строка с вводом, где нужно ввести новое слово, ну а если слова нету, то так же выводить ошибку, как и с указанным словом)
PM MAIL WWW IM Skype GTalk Jabber AOL YIM MSN   Вверх
baldman88
Дата 18.11.2016, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: нет
Всего: 7



Цитата
Просто массив
Это точно С++?
PM MAIL   Вверх
Hetls
Дата 19.11.2016, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 18.10.2016
Где: Русь Матушка! !!

Репутация: нет
Всего: нет



Цитата(baldman88 @ 18.11.2016,  23:13)
Цитата
Просто массив
Это точно С++?

Да, массив в C++ (а символьный, потому что состоит из слов)
PM MAIL WWW IM Skype GTalk Jabber AOL YIM MSN   Вверх
baldman88
Дата 19.11.2016, 13:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: нет
Всего: 7



В общем вот реализация на С++ со строками (не самая оптимальная и элегантная, но, вроде как, работает):
Код
#include <iostream>
#include <string>
#include <vector>
#include <utility>
#include <algorithm>


inline bool is_space(const char ch)
{
    return (ch == ' ');
}


inline bool not_space(const char ch)
{
    return (ch != ' ');
}


std::vector<std::pair<size_t, std::string> > split(const std::string &str)
{
    std::vector<std::pair<size_t, std::string> > result;
    std::string::const_iterator i = str.begin();
    while (i != str.end())
    {
        i = std::find_if(i, str.end(), not_space);
        std::string::const_iterator j = std::find_if(i, str.end(), is_space);
        if (i != str.end())
        {
            result.push_back(std::pair<size_t, std::string>((i - str.begin()), std::string(i, j)));
            i = j;
        }
    }
    return result;
}


bool is_word_present(std::string &str, std::string &substr)
{
    bool result = false;
    std::vector<std::pair<size_t, std::string> > words = split(str);
    for (size_t i = 0; i < words.size(); ++i)
    {
        if (words.at(i).second == substr)
        {
            result = true;
        }
    }
    return result;
}


std::string swap_words(const std::string &str, int first_index, int second_index)
{
    std::string result = str;
    std::vector<std::pair<size_t, std::string> > words = split(str);
    if (first_index < second_index)
    {
        result.replace(words.at(second_index - 1).first, words.at(second_index - 1).second.length(), words.at(first_index - 1).second);
        result.replace(words.at(first_index - 1).first, words.at(first_index - 1).second.length(), words.at(second_index - 1).second);
    }
    else if (first_index > second_index)
    {
        result.replace(words.at(first_index - 1).first, words.at(first_index - 1).second.length(), words.at(second_index - 1).second);
        result.replace(words.at(second_index - 1).first, words.at(second_index - 1).second.length(), words.at(first_index - 1).second);
    }
    return result;
}


std::string insert_word(const std::string &str, const std::string &searched_word, const std::string &inserted_word)
{
    std::string result = str;
    size_t position;
    std::vector<std::pair<size_t, std::string> > words = split(str);
    for (size_t i = 0; i < words.size(); ++i)
    {
        if (words.at(i).second == searched_word)
        {
            position = words.at(i).first + words.at(i).second.length();
            break;
        }
    }
    result.insert(position, " " + inserted_word);
    return result;
}


int main()
{
    std::string str;
    std::string searched_word;
    std::string inserted_word;
    int first_index;
    int second_index;
    std::cout << "Vvedite slova razdelennie probelami >>> ";
    std::getline(std::cin, str);
    std::vector<std::pair<size_t, std::string> > words = split(str);
    int words_count = words.size();
    std::cout << "Vvedeno " << words_count << " slov." << std::endl;
    std::cout << "Vvedite slovo dlya poiska >>> ";
    std::getline(std::cin, searched_word);
    if (is_word_present(str, searched_word) == true)
    {
        std::cout << "Slovo naideno." << std::endl;
    }
    else
    {
        std::cout << "Slovo ne naideno!" << std::endl;
    }
    std::cout << "Vvedite nomer pervogo slova dlya zameni (ot 1 do " << words_count << ") >>> ";
    std::cin >> first_index;
    std::cout << "Vvedite nomer vtorogo slova dlya zameni (ot 1 do " << words_count << ") >>> ";
    std::cin >> second_index;
    if ((first_index <= words_count) && (second_index <= words_count))
    {
        std::cout << swap_words(str, first_index, second_index) << std::endl;
    }
    else
    {
        std::cout << "Vvedeni nevernie nomera slov!" << std::endl;
    }
    std::cout << "Vvedite slovo, posle kotorogo nujno vstavit novoe slovo >>> ";
    std::cin.ignore();
    std::getline(std::cin, searched_word);
    if (is_word_present(str, searched_word) == true)
    {
        std::cout << "Vvedite slovo, kotoroe nujno vstavit >>> ";
        std::getline(std::cin, inserted_word);
        std::cout << insert_word(str, searched_word, inserted_word) << std::endl;
    }
    else
    {
        std::cout << "Vvedennoe slovo ne naideno!" << std::endl;
    }
    return 0;
}

PM MAIL   Вверх
Hetls
Дата 19.11.2016, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 18.10.2016
Где: Русь Матушка! !!

Репутация: нет
Всего: нет



Цитата(baldman88 @ 19.11.2016,  13:01)
В общем вот реализация на С++ со строками (не самая оптимальная и элегантная, но, вроде как, работает):
Код
#include <iostream>
#include <string>
#include <vector>
#include <utility>
#include <algorithm>


inline bool is_space(const char ch)
{
    return (ch == ' ');
}


inline bool not_space(const char ch)
{
    return (ch != ' ');
}


std::vector<std::pair<size_t, std::string> > split(const std::string &str)
{
    std::vector<std::pair<size_t, std::string> > result;
    std::string::const_iterator i = str.begin();
    while (i != str.end())
    {
        i = std::find_if(i, str.end(), not_space);
        std::string::const_iterator j = std::find_if(i, str.end(), is_space);
        if (i != str.end())
        {
            result.push_back(std::pair<size_t, std::string>((i - str.begin()), std::string(i, j)));
            i = j;
        }
    }
    return result;
}


bool is_word_present(std::string &str, std::string &substr)
{
    bool result = false;
    std::vector<std::pair<size_t, std::string> > words = split(str);
    for (size_t i = 0; i < words.size(); ++i)
    {
        if (words.at(i).second == substr)
        {
            result = true;
        }
    }
    return result;
}


std::string swap_words(const std::string &str, int first_index, int second_index)
{
    std::string result = str;
    std::vector<std::pair<size_t, std::string> > words = split(str);
    if (first_index < second_index)
    {
        result.replace(words.at(second_index - 1).first, words.at(second_index - 1).second.length(), words.at(first_index - 1).second);
        result.replace(words.at(first_index - 1).first, words.at(first_index - 1).second.length(), words.at(second_index - 1).second);
    }
    else if (first_index > second_index)
    {
        result.replace(words.at(first_index - 1).first, words.at(first_index - 1).second.length(), words.at(second_index - 1).second);
        result.replace(words.at(second_index - 1).first, words.at(second_index - 1).second.length(), words.at(first_index - 1).second);
    }
    return result;
}


std::string insert_word(const std::string &str, const std::string &searched_word, const std::string &inserted_word)
{
    std::string result = str;
    size_t position;
    std::vector<std::pair<size_t, std::string> > words = split(str);
    for (size_t i = 0; i < words.size(); ++i)
    {
        if (words.at(i).second == searched_word)
        {
            position = words.at(i).first + words.at(i).second.length();
            break;
        }
    }
    result.insert(position, " " + inserted_word);
    return result;
}


int main()
{
    std::string str;
    std::string searched_word;
    std::string inserted_word;
    int first_index;
    int second_index;
    std::cout << "Vvedite slova razdelennie probelami >>> ";
    std::getline(std::cin, str);
    std::vector<std::pair<size_t, std::string> > words = split(str);
    int words_count = words.size();
    std::cout << "Vvedeno " << words_count << " slov." << std::endl;
    std::cout << "Vvedite slovo dlya poiska >>> ";
    std::getline(std::cin, searched_word);
    if (is_word_present(str, searched_word) == true)
    {
        std::cout << "Slovo naideno." << std::endl;
    }
    else
    {
        std::cout << "Slovo ne naideno!" << std::endl;
    }
    std::cout << "Vvedite nomer pervogo slova dlya zameni (ot 1 do " << words_count << ") >>> ";
    std::cin >> first_index;
    std::cout << "Vvedite nomer vtorogo slova dlya zameni (ot 1 do " << words_count << ") >>> ";
    std::cin >> second_index;
    if ((first_index <= words_count) && (second_index <= words_count))
    {
        std::cout << swap_words(str, first_index, second_index) << std::endl;
    }
    else
    {
        std::cout << "Vvedeni nevernie nomera slov!" << std::endl;
    }
    std::cout << "Vvedite slovo, posle kotorogo nujno vstavit novoe slovo >>> ";
    std::cin.ignore();
    std::getline(std::cin, searched_word);
    if (is_word_present(str, searched_word) == true)
    {
        std::cout << "Vvedite slovo, kotoroe nujno vstavit >>> ";
        std::getline(std::cin, inserted_word);
        std::cout << insert_word(str, searched_word, inserted_word) << std::endl;
    }
    else
    {
        std::cout << "Vvedennoe slovo ne naideno!" << std::endl;
    }
    return 0;
}

Третий пункт (строка) не сохраняется при переходе на четвёртый и нету выдачи на печать указанного слова в тексте ("Vvesti ukazanoe slovo texta, dla vidochi ego na pechat", "Slovo ne naideno").

И если можно, то сделать комментарии (особенно в верхней части кода, чтобы я мог разобраться)

Это сообщение отредактировал(а) Hetls - 19.11.2016, 14:20
PM MAIL WWW IM Skype GTalk Jabber AOL YIM MSN   Вверх
baldman88
Дата 19.11.2016, 14:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: нет
Всего: 7



Я ничего не понял. Так?
Код
#include <iostream>
#include <string>
#include <vector>
#include <utility>
#include <algorithm>


// Проверяем, является ли символ пробелом.
// Если является, то возвращает true, в противном случае -- false
inline bool is_space(const char ch)
{
    return (ch == ' ');
}


// Проверяем, не является ли символ пробелом.
// Если не является, то возвращает true, в противном случае -- false
inline bool not_space(const char ch)
{
    return (ch != ' ');
}


// Разделяем предложение на слова.
// Результат сохраняется в вектор, содержащий пары значений:
// (позиция первого символа слова в строке; само слово)
std::vector<std::pair<size_t, std::string> > split(const std::string &str)
{
    // Объявление вектора пар
    std::vector<std::pair<size_t, std::string> > result;
    // Итератор указывающий на первый символ строки.
    // Почитайте что такое итераторы и как они работают! иначе ничего не поймете!
    std::string::const_iterator i = str.begin();
    // Пока итератор i не равен концу строки делать ...
    while (i != str.end())
    {
        // Найти первый непробельный символ (с которого начинается слово) начиная с позиции i
        i = std::find_if(i, str.end(), not_space);
        // Найти первый пробельный символ после позиции первой буквы в слове
        std::string::const_iterator j = std::find_if(i, str.end(), is_space);
        if (i != str.end())
        {
            // Добавить в вектор пару (позиция первого символа слова в строке; само слово).
            // Позиция вычисляется вычетом из текущей позиции итератора позиции первого символа строки,
            // а само слово это символы от i (первая буква) до j (позиция пробела после текущего слова)
            result.push_back(std::pair<size_t, std::string>((i - str.begin()), std::string(i, j)));
            // На следующей итерации поиск будет производиться с позиции пробела за текущим словом
            i = j;
        }
    }
    return result;
}


// Проверить есть ли слово (substr) в строке.
// Усли есть, то вернуть true, в противном случае -- false
bool is_word_present(std::string &str, std::string &substr)
{
    // Изначально предпологаем, что слова нет
    bool result = false;
    // Разделяем строку на слова
    std::vector<std::pair<size_t, std::string> > words = split(str);
    // В цикле сравниваем искомое слово (substr) с каждым словом строки
    for (size_t i = 0; i < words.size(); ++i)
    {
        // Само сравнение
        if (words.at(i).second == substr)
        {
            // Если слово совпало, то присваиваем переменной result значение true
            result = true;
        }
    }
    return result;
}


// Меняем местами два слова с заданными индексами
std::string swap_words(const std::string &str, int first_index, int second_index)
{
    // Создаем копию исходной строки
    std::string result = str;
    // Разделяем исходную строку на слова
    std::vector<std::pair<size_t, std::string> > words = split(str);
    // Проверяем какой из индексов больше. Для нормальной замены нужно сначала заменить слово,
    // которое расположено ближе к концу строки. Ведь у меняемых слов может быть разная длина.
    // А при разделении слов мы сохраняем индекс первой буквы слова с троке. Таким образом,
    // если мы сначала поменяем слово ближе к концу, это никак не отразится на позиции первой буквы
    // слова, которое ближе к началу. Почитайте про std::string.replace(), чтобы понять что идет дальше.
    // Объяснить в коментарии я этого не смогу!
    // Если первый индекс меньше (например введены числа 1 и 2)
    if (first_index < second_index)
    {
        result.replace(words.at(second_index - 1).first, words.at(second_index - 1).second.length(), words.at(first_index - 1).second);
        result.replace(words.at(first_index - 1).first, words.at(first_index - 1).second.length(), words.at(second_index - 1).second);
    }
    // А это если второй индекс меньше (например введены числа 2 и 1)
    else if (first_index > second_index)
    {
        result.replace(words.at(first_index - 1).first, words.at(first_index - 1).second.length(), words.at(second_index - 1).second);
        result.replace(words.at(second_index - 1).first, words.at(second_index - 1).second.length(), words.at(first_index - 1).second);
    }
    // ВОзвращаем строку с поменяными местами словами.
    return result;
}


// Вставляем слово (inserted_word) после заданного слова (searched_word)
std::string insert_word(const std::string &str, const std::string &searched_word, const std::string &inserted_word)
{
    // Создаем копию исходной строки
    std::string result = str;
    size_t position;
    // Разделяем исходную строку на слова
    std::vector<std::pair<size_t, std::string> > words = split(str);
    // В цикле сравниваем искомое слово (searched_word) с каждым словом строки
    for (size_t i = 0; i < words.size(); ++i)
    {
        // Если слово совпало
        if (words.at(i).second == searched_word)
        {
            // Вычисляем позицию порвого символа для втавки слова (позиция первого символа
            // искомого слова + его длина)
            position = words.at(i).first + words.at(i).second.length();
            // Прерываем цикл. Ведь слово мы уже нашли, значит перебирать дальше смысла нет.
            break;
        }
    }
    // Вставляем заданное слово (inserted_word) в позицию после искомого слова (searched_word).
    // Заодно добавляем перед вставляемым словом пробел, чтобы оно не слилось с искомым.
    result.insert(position, " " + inserted_word);
    // Возвращаем строку со вставленным словом.
    return result;
}


int main()
{
    std::string str;
    std::string searched_word;
    std::string inserted_word;
    int first_index;
    int second_index;
    std::cout << "Vvedite slova razdelennie probelami >>> ";
    std::getline(std::cin, str);
    std::vector<std::pair<size_t, std::string> > words = split(str);
    int words_count = words.size();
    std::cout << "Vvedeno " << words_count << " slov." << std::endl;
    std::cout << "Vvedite slovo dlya poiska >>> ";
    std::getline(std::cin, searched_word);
    if (is_word_present(str, searched_word) == true)
    {
        std::cout << "Slovo \"" << searched_word << "\" naideno." << std::endl;
    }
    else
    {
        std::cout << "Slovo \"" << searched_word << "\" ne naideno!" << std::endl;
    }
    std::cout << "Vvedite nomer pervogo slova dlya zameni (ot 1 do " << words_count << ") >>> ";
    std::cin >> first_index;
    std::cout << "Vvedite nomer vtorogo slova dlya zameni (ot 1 do " << words_count << ") >>> ";
    std::cin >> second_index;
    if ((first_index <= words_count) && (second_index <= words_count))
    {
        // Присваиваем исходной строке строку с поменяными местами словами.
        str = swap_words(str, first_index, second_index);
        std::cout << str << std::endl;
    }
    else
    {
        std::cout << "Vvedeni nevernie nomera slov!" << std::endl;
    }
    std::cout << "Vvedite slovo, posle kotorogo nujno vstavit novoe slovo >>> ";
    std::cin.ignore();
    std::getline(std::cin, searched_word);
    if (is_word_present(str, searched_word) == true)
    {
        std::cout << "Vvedite slovo, kotoroe nujno vstavit >>> ";
        std::getline(std::cin, inserted_word);
        std::cout << insert_word(str, searched_word, inserted_word) << std::endl;
    }
    else
    {
        std::cout << "Vvedennoe slovo \"" << searched_word << "\" ne naideno!" << std::endl;
    }
    return 0;
}


Это сообщение отредактировал(а) baldman88 - 19.11.2016, 15:11
PM MAIL   Вверх
baldman88
Дата 19.11.2016, 15:23 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: нет
Всего: 7



По поводу замены слов местами. Представим, что у нас есть строка "hello my dear friend". После разбиения на слова, вектор пар будет выглядеть так (позиция первого символа слова, само слово):
(0, hello)
(6, my)
(9, dear)
(14, friend)
Если мы поменяем слово "dear" на слово "sweet", то значение индекса первой буквы слова "friend" уже будет неправильным. Оно уже будет не 14, а 15, так как "sweet" на одну букву длинее "dear". А вот значения индексов слов до слова "dear" останутся прежними. Именно поэтому мы смотрим какие номера слов нам ввели для замены. И если какой-то хитрец задумает коварный план введя сначала больший номер, а потом меньший, то мы не дадим ему нас одурачить =)
PM MAIL   Вверх
Hetls
Дата 19.11.2016, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 18.10.2016
Где: Русь Матушка! !!

Репутация: нет
Всего: нет



Большое спасибо за оказанную помощь!
PM MAIL WWW IM Skype GTalk Jabber AOL YIM MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0903 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.