Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2022, 23:27   #1
MaxBrat
Пользователь
 
Регистрация: 27.09.2022
Сообщений: 32
Восклицание Подправить небольшой код на С++

У меня есть код на С++ который находит подстроку в строке, и мне его нужно переделать так что бы в нём использовалась библиотека STL – find(), find_if(), find_first(), find_end(). Заранее благодарю)).

Код:
#include <iostream>
using namespace std;

int Direct_search(const char* text,const char* search_word) {
    int string, substring; 
    int res = -1;
    string = strlen(text);  // присваивание в переменные размер всего текста и заданного слова
    substring = strlen(search_word);
    if (string == 0) {  // проверки на то был ли задан какой-то текст и слово
        cout << "Неверно заданная строка\n";
    }
    else if (substring == 0) {
        cout << "Неверно заданная подстрока\n";
    }
    else {  // метод прямого поиска
        for (int i = 0; i < string - substring + 1; i++) {
            for (int j = 0; j < substring; j++) {
                if (search_word[j] != text[i + j]) { // посимвольная проверка заданного слова с текстом
                    break;
                }
                else if (j == substring - 1) {
                    res = i;
                    break;
                }
            }
        }
    }
    return res;
}

int main() {
    setlocale(LC_ALL, "Russian");
    const char* text = "A graphics processing unit (GPU) is a specialized electronic circuit designed to rapidly manipulate and alter memory to accelerate the creation of images in a frame buffer intended for output to a display device. GPUs are used in embedded systems, mobile phones, personal computers, workstations, and game consoles.";
    const char *search_word = "unit";    // слово которое нужно найти в тексте
    int index = Direct_search(text, search_word);   // вызов функции прямого поиска
    cout << "Индекс первого вхождения заданного слова: " << index;
}

Последний раз редактировалось MaxBrat; 15.11.2022 в 23:58.
MaxBrat вне форума Ответить с цитированием
Старый 15.11.2022, 23:32   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Если не хотите оформлять код правильно, тогда разбирайтесь сами. Вот тут все написано.

И не надо плодить одинаковые темы.
macomics вне форума Ответить с цитированием
Старый 16.11.2022, 00:31   #3
MaxBrat
Пользователь
 
Регистрация: 27.09.2022
Сообщений: 32
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Если не хотите оформлять код правильно, тогда разбирайтесь сами. Вот тут все написано.

И не надо плодить одинаковые темы.
Вот всё исправил.
MaxBrat вне форума Ответить с цитированием
Старый 16.11.2022, 05:06   #4
Пётр Седов
Форумчанин
 
Регистрация: 26.10.2022
Сообщений: 119
По умолчанию

MaxBrat, у класса std::string есть метод поиска подстроки:
Код:
#include <iostream>
#include <string>
#include <locale.h>

using namespace std;

int main() {
    setlocale(LC_ALL, "Russian");
    string text = "A graphics processing unit (GPU) is a specialized electronic circuit designed to rapidly manipulate and alter memory to accelerate the creation of images in a frame buffer intended for output to a display device. GPUs are used in embedded systems, mobile phones, personal computers, workstations, and game consoles.";
    const char *search_word = "unit";    // слово, которое нужно найти в тексте
    size_t pos = text.find(search_word); // вызов функции прямого поиска
    if (pos != string::npos) {
        cout << "Индекс первого вхождения заданного слова: " << pos;
    }
    return 0;
}
В новых компиляторах ещё можно использовать класс std::string_view:
Код:
#include <iostream>
#include <string_view>
#include <locale.h>

using namespace std;

int main() {
    setlocale(LC_ALL, "Russian");
    string_view text = "A graphics processing unit (GPU) is a specialized electronic circuit designed to rapidly manipulate and alter memory to accelerate the creation of images in a frame buffer intended for output to a display device. GPUs are used in embedded systems, mobile phones, personal computers, workstations, and game consoles.";
    const char *search_word = "unit";    // слово, которое нужно найти в тексте
    size_t pos = text.find(search_word); // вызов функции прямого поиска
    if (pos != string_view::npos) {
        cout << "Индекс первого вхождения заданного слова: " << pos;
    }
    return 0;
}
Пётр Седов вне форума Ответить с цитированием
Старый 16.11.2022, 06:46   #5
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от MaxBrat Посмотреть сообщение
Вот всё исправил.
BDA не забудь сказать, что сам исправил. Он пирожком угостит.

Цитата:
Сообщение от Пётр Седов Посмотреть сообщение
MaxBrat, у класса std::string есть метод поиска подстроки:
Есть, а он сформулировал, что по заданию надо использовать find() и иже с ним.

Цитата:
Сообщение от MaxBrat Посмотреть сообщение
Код:
else if (j == substring - 1) {
                    res = i;
                    break;
                }
Вот тут вы прерываете вложенный цикл, а как же внешний? Иначе вы ищите последнее вхождение подстроки в строку.
macomics вне форума Ответить с цитированием
Старый 16.11.2022, 14:30   #6
Пётр Седов
Форумчанин
 
Регистрация: 26.10.2022
Сообщений: 119
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Есть, а он сформулировал, что по заданию надо использовать find() и иже с ним.
Функция std::find здесь не подходит, потому что она ищет один элемент, а нам надо найти подстроку. Если по каким-то причинам не хочется использовать классы std::string/std::string_view, то тогда уж надо использовать функцию std::search:
Код:
#include <iostream>
#include <algorithm>
#include <locale.h>
#include <string.h>

using namespace std;

int main() {
    setlocale(LC_ALL, "Russian");
    const char* text = "A graphics processing unit (GPU) is a specialized electronic circuit designed to rapidly manipulate and alter memory to accelerate the creation of images in a frame buffer intended for output to a display device. GPUs are used in embedded systems, mobile phones, personal computers, workstations, and game consoles.";
    const char *search_word = "unit";    // слово, которое нужно найти в тексте
    const char* text_end = text + strlen(text);
    const char* word_in_text = search(text, text_end, search_word, search_word + strlen(search_word)); // вызов функции прямого поиска
    if (word_in_text != text_end) {
        cout << "Индекс первого вхождения заданного слова: " << (word_in_text - text);
    }
    return 0;
}
Пётр Седов вне форума Ответить с цитированием
Старый 18.11.2022, 21:22   #7
MaxBrat
Пользователь
 
Регистрация: 27.09.2022
Сообщений: 32
По умолчанию

[QUOTE=Пётр Седов;1853481]Функция std::find здесь не подходит, потому что она ищет один элемент, а нам надо найти подстроку. Если по каким-то причинам не хочется использовать классы std::string/std::string_view, то тогда уж надо использовать функцию std::search:
Код:
#include <iostream>
#include <algorithm>
#include <locale.h>
#include <string.h>

using namespace std;

int main() {
    setlocale(LC_ALL, "Russian");
    const char* text = "A graphics processing unit (GPU) is a specialized electronic circuit designed to rapidly manipulate and alter memory to accelerate the creation of images in a frame buffer intended for output to a display device. GPUs are used in embedded systems, mobile phones, personal computers, workstations, and game consoles.";
    const char *search_word = "unit";    // слово, которое нужно найти в тексте
    const char* text_end = text + strlen(text);
    const char* word_in_text = search(text, text_end, search_word, search_word + strlen(search_word)); // вызов функции прямого поиска
    if (word_in_text != text_end) {
        cout << "Индекс первого вхождения заданного слова: " << (word_in_text - text);
    }
    return 0;
}
А нельзя както чтобы програма делала то же самое но при этом было использовано STL – find(), find_if(), find_first(), find_end()?
MaxBrat вне форума Ответить с цитированием
Старый 19.11.2022, 04:36   #8
Пётр Седов
Форумчанин
 
Регистрация: 26.10.2022
Сообщений: 119
По умолчанию

MaxBrat, так функция std::search -- тоже часть STL (как и классы std::string/std::string_view). Вместо неё можно использовать функцию std::find_end, но тогда это будет уже поиск последнего вхождения подстроки. Функции std::find/std::find_if/std::find_first_of ищут один элемент, а не подпоследовательность, и они здесь не нужны.
Пётр Седов вне форума Ответить с цитированием
Старый 19.11.2022, 05:09   #9
MaxBrat
Пользователь
 
Регистрация: 27.09.2022
Сообщений: 32
По умолчанию

Цитата:
Сообщение от Пётр Седов Посмотреть сообщение
MaxBrat, так функция std::search -- тоже часть STL (как и классы std::string/std::string_view). Вместо неё можно использовать функцию std::find_end, но тогда это будет уже поиск последнего вхождения подстроки. Функции std::find/std::find_if/std::find_first_of ищут один элемент, а не подпоследовательность, и они здесь не нужны.
А это как получиться в коде?

Последний раз редактировалось MaxBrat; 19.11.2022 в 05:17.
MaxBrat вне форума Ответить с цитированием
Старый 19.11.2022, 15:09   #10
MaxBrat
Пользователь
 
Регистрация: 27.09.2022
Сообщений: 32
По умолчанию

Цитата:
Сообщение от Пётр Седов Посмотреть сообщение
MaxBrat, так функция std::search -- тоже часть STL (как и классы std::string/std::string_view). Вместо неё можно использовать функцию std::find_end, но тогда это будет уже поиск последнего вхождения подстроки. Функции std::find/std::find_if/std::find_first_of ищут один элемент, а не подпоследовательность, и они здесь не нужны.
Мне как раз нужно чтобы было std::find_end и std::find/std::find_if/std::find_first. А как это поменять чтобы как раз з ними был код, можете показать пример?
MaxBrat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подправить vba код artbotva Microsoft Office Excel 3 14.12.2016 12:28
Как подправить код? Drego JavaScript, Ajax 1 26.06.2013 17:38
Небольшой такой вопросик ... совсем небольшой .. zipo666 Помощь студентам 0 18.12.2011 12:49
c++ подправить grom333 Помощь студентам 4 27.05.2011 21:02
Подправить код werser Помощь студентам 4 14.03.2010 23:26