1 / 1 / 0
Регистрация: 23.06.2017
Сообщений: 153

Функция для удаления всех знаков препинания

24.06.2017, 12:34. Показов 1974. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть набор строк, написать функцию, которая принимает на вход этот набор строк и возвращает новый набор строк, где в каждом из строк удалено все знаки препинания: ",.!:" Используя: std::remove_if, std::erase, std::transform
То что я написал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include "stdafx.h"
#include "string"
#include "vector"
#include <iostream>
#include <algorithm>
#include <iterator>
 
 
bool remove(char words, char* array)
{
    const std::size_t size = sizeof(array) / sizeof(array[0]);
    for (int index = 0; index < size; ++index) 
    {
        if ((array[index] != '.') && (array[index] != ';') && (array[index] != '!') && (array[index] != ':'))
        {
            array[index] = words;
        }
    }
}
 
bool shouldBeRemoved(char words) 
{
    std::vector<char> vector;
    for (int index = 0; index < vector.size(); ++index)
        vector.emplace_back(words);
    vector.erase(std::remove_if(vector.begin(), vector.end(), remove), vector.end());
       return std::transform(vector.begin(), vector.end(), vector.begin(), (char(*)(char))std::toupper);
}
 
int main()
{
    char words[] = { "The requested page title was invalid, empty, or: an incorrectly linked inter-language! or inter-wiki title. It may contain one or more, characters that cannot, be used in titles." };
    shouldBeRemoved(*words);
    return 0;
}
Я сделал как знал, теперь нужна ваша помощь . Посмотрите на мой код, и скажите что есть гуд, а что отстой и нужно переделать
У меня две функции:
C++
1
bool remove(char words, char* array)
я ищу препинания и не записываю их, функция должна ткое делать
C++
1
bool shouldBeRemoved(char words)
моя основная функция
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.06.2017, 12:34
Ответы с готовыми решениями:

Программа для вывода на экран знаков препинания(с указанием их АСКИ-кода) знаков препинания
Напишите и отладьте программу для вывода на экран(с указанием их АСКИ -кода) знаков препинания

Написать метод удаления знаков препинания из StringBuilder
Добрый вечер. Метод ничего не принимает и не возвращает. Задача метода, удалить все знаки препинания из объекта класса StringBuilder. Я...

Функция на возврат знаков препинания
Написать функцию, которая возвращает количество знаков препинания в строке, переданной в качестве аргумента.

22
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.06.2017, 13:02
Цитата Сообщение от dimaSlon Посмотреть сообщение
Посмотрите на мой код, и скажите что есть гуд, а что отстой и нужно переделать
весь код - отстой.
и UB.

http://rextester.com/CIEX29365

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
 
void shouldBeRemoved(auto& lines, const auto& punctuations) 
{
    const auto this_symbols = [&punctuations](const auto& ch) 
    { 
        const auto founded 
            = std::find(std::begin(punctuations), std::end(punctuations), ch);
        return founded != std::end(punctuations);
    };
    
    const auto cutter = [&this_symbols](auto& line) -> auto&
    {
        const auto it = std::remove_if(std::begin(line), std::end(line), this_symbols);
        line.erase(it, line.end());
        return line;
    };
    
    std::transform(std::begin(lines), std::end(lines), std::begin(lines), cutter);
}
 
int main()
{
    std::string lines[] = {
        "The requested page title was invalid, empty, or: an incorrectly linked inter-language! or inter-wiki title. It may contain one or more, characters that cannot, be used in titles.",
        "The requested page title was invalid, empty, or: an incorrectly linked inter-language! or inter-wiki title. It may contain one or more, characters that cannot, be used in titles.",
        "The requested page title was invalid, empty, or: an incorrectly linked inter-language! or inter-wiki title. It may contain one or more, characters that cannot, be used in titles." 
    };
    
    shouldBeRemoved(lines, ".!:,");
    
    for(const auto& line: lines)
         std::cout << line << std::endl;
}
2
1 / 1 / 0
Регистрация: 23.06.2017
Сообщений: 153
24.06.2017, 13:15  [ТС]
hoggy, спасибо. но я многое не понял в вашем кода. сложный для меня.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
24.06.2017, 13:37
Цитата Сообщение от dimaSlon Посмотреть сообщение
C++
1
const std::size_t size = sizeof(array) / sizeof(array[0]);
sizeof(array), в данном случае, выдаст размер указателя, а не массива.
0
1 / 1 / 0
Регистрация: 23.06.2017
Сообщений: 153
24.06.2017, 15:37  [ТС]
hoggy, как этот кусок кода можна переписать через функции?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
const auto this_symbols = [&punctuations](const auto& ch) 
    { 
        const auto founded 
            = std::find(std::begin(punctuations), std::end(punctuations), ch);
        return founded != std::end(punctuations);
    };
    
    const auto cutter = [&this_symbols](auto& line) -> auto&
    {
        const auto it = std::remove_if(std::begin(line), std::end(line), this_symbols);
        line.erase(it, line.end());
        return line;
    };
Добавлено через 34 минуты
hoggy, и Ваш код не компилюется)
http://rextester.com/l/cpp_online_compiler_visual

Добавлено через 4 минуты
Я понимаю что я наглею, но код hoggy для меня сложный(я думаю можно разбить на разные функции) и при том не работает. Помогите доделать(передалеть) мой код.
Буду рад помощи
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.06.2017, 15:50
Цитата Сообщение от dimaSlon Посмотреть сообщение
как этот кусок кода можна переписать через функции?
http://rextester.com/WODNM75320


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <functional>
 
using namespace std::placeholders;
using namespace std;
 
bool find_characters(const char* src, const size_t size, const char ch) 
{ 
    return std::find(src, src + size, ch) != src + size;
}
 
std::string& remove_characters(std::string& line, const char* targets, const size_t size) 
{
    line.erase( 
        std::remove_if(line.begin(), line.end(), std::bind(find_characters, targets, size, _1) ), 
        line.end() 
    );
    return line;
}
 
 
void shouldBeRemoved(auto& lines, const auto& punctuations) 
{
    const size_t size 
        = std::end(punctuations) - std::begin(punctuations);
    
    std::transform(
        std::begin(lines), 
        std::end(lines), 
        std::begin(lines),  
        std::bind(remove_characters, _1, punctuations, size)
    );
}
 
int main()
{
    std::string lines[] = {
        "The requested page title was invalid, empty, or: an incorrectly linked inter-language! or inter-wiki title. It may contain one or more, characters that cannot, be used in titles.",
        "The requested page title was invalid, empty, or: an incorrectly linked inter-language! or inter-wiki title. It may contain one or more, characters that cannot, be used in titles.",
        "The requested page title was invalid, empty, or: an incorrectly linked inter-language! or inter-wiki title. It may contain one or more, characters that cannot, be used in titles." 
    };
    
    shouldBeRemoved(lines, ".!:,");
    
    for(const auto& line: lines)
         std::cout << line << std::endl;
}
Добавлено через 59 секунд
Цитата Сообщение от dimaSlon Посмотреть сообщение
и Ваш код не компилюется)
см #2,
ссылка на онлайн компилятор

версия для более отсталого компилятора вижуал студии:
http://rextester.com/SPYOU10543

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
 
template<class s, class arr>
void shouldBeRemoved(s&& lines, const arr& punctuations) 
{
    const auto this_symbols = [&punctuations](const auto& ch) 
    { 
        const auto founded 
            = std::find(std::begin(punctuations), std::end(punctuations), ch);
        return founded != std::end(punctuations);
    };
    
    const auto cutter = [&this_symbols](auto& line) -> auto&
    {
        const auto it = std::remove_if(std::begin(line), std::end(line), this_symbols);
        line.erase(it, line.end());
        return line;
    };
    
    std::transform(std::begin(lines), std::end(lines), std::begin(lines), cutter);
}
 
int main()
{
    std::string lines[] = {
        "The requested page title was invalid, empty, or: an incorrectly linked inter-language! or inter-wiki title. It may contain one or more, characters that cannot, be used in titles.",
        "The requested page title was invalid, empty, or: an incorrectly linked inter-language! or inter-wiki title. It may contain one or more, characters that cannot, be used in titles.",
        "The requested page title was invalid, empty, or: an incorrectly linked inter-language! or inter-wiki title. It may contain one or more, characters that cannot, be used in titles." 
    };
    
    shouldBeRemoved(lines, ".!:,");
    
    for(const auto& line: lines)
         std::cout << line << std::endl;
}
1
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
24.06.2017, 16:05
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
void RemPunct(auto &v) {
    transform(begin(v),end(v),begin(v),[](auto &s ) {
        if(any_of(begin(s),end(s),::ispunct))
            s.erase(remove_if(begin(s),end(s),::ispunct),end(s));
        return s;
    });
}
int main() {
    string s[]= {"Hello, hi, man!","How are u?","I'm fine: so cool."};
    RemPunct(s);
    for(const auto& i:s) {
        cout<<i<<endl;
    }
    return 0;
}
1
1 / 1 / 0
Регистрация: 23.06.2017
Сообщений: 153
24.06.2017, 16:23  [ТС]
Peoples, а что нужно подключить чтобы auto работало. а то пишет:
Severity Code Description Project File Line Suppression State
Error (active) 'auto' is not allowed here StringPunctuation
C++
1
2
3
void RemPunct(auto &v) 
{
    transform(begin(v), end(v), begin(v), [](auto &s)
Добавлено через 44 секунды
http://rextester.com/SPYOU10543

Добавлено через 9 минут
Peoples,
C++
1
[](auto &s )
что эта запись значит?
0
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
24.06.2017, 16:38
Цитата Сообщение от dimaSlon Посмотреть сообщение
а что нужно подключить чтобы auto работало
Компилятор должен поддерживать C++11
0
1 / 1 / 0
Регистрация: 23.06.2017
Сообщений: 153
24.06.2017, 17:10  [ТС]
Peoples,
C++
1
 [](auto &s )
что эта запись значит?
у меня vs 2015
0
1 / 1 / 0
Регистрация: 23.06.2017
Сообщений: 153
24.06.2017, 17:14  [ТС]
скрин
Миниатюры
Функция  для удаления всех знаков препинания  
0
1 / 1 / 0
Регистрация: 23.06.2017
Сообщений: 153
25.06.2017, 11:37  [ТС]
Peoples, у меня auto не работает. а какой там тип можно написать. я написал string, появилось много ошибок

Добавлено через 17 часов 34 минуты
я додал функцию. но все таже ошибка. я не хочу просто взять чужой код, а хочу разобратся и свой переделать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include "stdafx.h"
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>
bool remove(auto& сh)
{
    if (std::any_of(сh.begin(), сh.end(), ispunct))
        сh.erase(std::remove_if(сh.begin(), сh.end(), ispunct), сh.end());
    return сh;
}
 
bool shouldBeRemoved(char words)
{
    std::vector<char> vector;
    for (int index = 0; index < vector.size(); ++index)
        vector.emplace_back(words);
    std::transform(vector.begin(), vector.end(), vector.begin(), remove);
}
 
int main()
{
    char words[] = { "The requested page title was invalid, empty, or: an incorrectly linked inter-language! or inter-wiki title. It may contain one or more, characters that cannot, be used in titles." };
    shouldBeRemoved(*words);
    for (const auto& i : words)
    {
        std::cout << i << "\n";
    }
    return 0;
}
Добавлено через 7 минут
какой тип должен быть в функции remove вместо auto, и правильно ли я делаю что передаю bool?

Добавлено через 2 минуты
и правильно я делаю:
C++
1
std::transform(vector.begin(), vector.end(), vector.begin(), remove);
0
 Аватар для zarko97
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
25.06.2017, 13:08
с бустом
C++
1
2
3
4
5
using namespace boost;
 
std::string str = "asdasd, asd asw - asdsad! asdasd, asdasd, asdsd; asdasd asd asw da, bax; yup?";
std::vector<std::string> words;
split(words, str, any_of(" .,;-!?"), token_compress_on);
без буста
C++
1
2
3
4
5
6
7
8
9
10
std::vector<std::string> split(std::string& str, std::string const delims)
{
    std::vector<std::string> tokens;
    std::string::size_type pos;
    while ((pos = str.find_first_of(delims)) != std::string::npos)
        str.erase(pos, 1);
    std::istringstream iss(str);
    std::move(std::istream_iterator<std::string>(iss), std::istream_iterator<std::string>(), std::back_inserter(tokens));
    return tokens;
}
ps лучше вместо вектора дек юзать

Добавлено через 4 минуты
dimaSlon, по тз дается стринга или массив стрингов?

Добавлено через 6 минут
ещё так
C++
1
2
3
4
5
std::string str = "asdasd, asd asw - asdsad! asdasd, asdasd, asdsd; asdasd asd asw da, bax; yup?";
std::ostringstream ostream;
for (auto ch : str)
   (std::ispunct(ch)) ? ostream << std::string() : ostream << ch;
str = ostream.str();
0
86 / 121 / 28
Регистрация: 17.10.2010
Сообщений: 1,269
25.06.2017, 15:21
У меня CodeBlocks 16.01, включена поддержка компилятора C++11, но все равно ругается на auto.
Миниатюры
Функция  для удаления всех знаков препинания  
0
 Аватар для zarko97
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
25.06.2017, 15:34
isaak, для auto в лямбде нужны 14
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.06.2017, 15:41
Цитата Сообщение от isaak Посмотреть сообщение
поддержка компилятора C++11, но все равно ругается на auto.
это предупреждение.
дословно: "auto в параметрах доступно только с поддержкой с++1y"

смысл варнинга:
технология совсем новая, и может быть лучше переписать по старинке,
с темплейтами?

в других случаях компилятор может выкинуть что нибудь такое:
C++
1
2
auto foo(auto&& v){  return v; }
int main(){}
Code
1
warning: ISO C++ forbids use of ‘auto’ in parameter declaration [-Wpedantic]
смысл которого:
данный компилятор поддерживает технологию,
однако, официально она ещё не узаконена стандартом.
(имеется ввиду именно с точки зрения вот этого конкретного компилятора)

если ничего не смущает то можно:

1.
(плохой вариант. за такое убивать увольнять нужно)
забить на подобные предупреждения.

2.
точечно подавить.
(годная практика)
в этом случае код может выглядеть так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// точечное подавление предупреждений компилятора
#if defined(__GNUC__) || defined(__MINGW32__) || defined(__MINGW__)
    #pragma GCC diagnostic push
 
    // подавлять будим ворнинг "занудо"
    #pragma GCC diagnostic ignored "-Wpedantic"
#endif
 
auto foo(auto&& v){ return v; }
 
// вот здесь все ворнинги вертаются взад
#if defined(__GNUC__) || defined(__MINGW32__) || defined(__MINGW__)
    #pragma GCC diagnostic pop
#endif
 
 
int main(){}
0
86 / 121 / 28
Регистрация: 17.10.2010
Сообщений: 1,269
25.06.2017, 15:52
Спасибо за цельные советы. Какие лучше использовать среды программирования и компиляторы, чтобы они на 100% поддерживали функцию auto. Я в СodeBlocks 16.01 выставлял поддержку C++11 и C++14. А компилятор все равно на auto ругается. Заранее огромное спасибо.
0
25.06.2017, 16:02

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
C++
1
2
3
4
5
6
    const auto cutter = [&this_symbols](auto& line) -> auto&
    {
        const auto it = std::remove_if(std::begin(line), std::end(line), this_symbols);
        line.erase(it, line.end());
        return line;
    };
а что за стрелка такая здесь? [&this_symbols](auto& line) -> auto&

0
Заблокирован
25.06.2017, 16:02
Цитата Сообщение от hoggy Посмотреть сообщение
http://rextester.com/CIEX29365
Code
1
2
3
4
5
6
7
prog.cc:6:22: error: 'auto' not allowed in function prototype
void shouldBeRemoved(auto& lines, const auto& punctuations) 
                     ^~~~
prog.cc:6:41: error: 'auto' not allowed in function prototype
void shouldBeRemoved(auto& lines, const auto& punctuations) 
                                        ^~~~
2 errors generated.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.06.2017, 16:14
Цитата Сообщение от daun-autist Посмотреть сообщение
prog.cc:6:22: error: 'auto' not allowed in function prototype
void shouldBeRemoved(auto& lines, const auto& punctuations)
^~~~
prog.cc:6:41: error: 'auto' not allowed in function prototype
void shouldBeRemoved(auto& lines, const auto& punctuations)
^~~~
2 errors generated.
см #14
см #16

Добавлено через 15 секунд
Цитата Сообщение от daun-autist Посмотреть сообщение
prog.cc:6:22: error: 'auto' not allowed in function prototype
void shouldBeRemoved(auto& lines, const auto& punctuations)
^~~~
prog.cc:6:41: error: 'auto' not allowed in function prototype
void shouldBeRemoved(auto& lines, const auto& punctuations)
^~~~
2 errors generated.
см #14
см #16

Добавлено через 1 минуту
Цитата Сообщение от dailydose Посмотреть сообщение
а что за стрелка такая здесь? [&this_symbols](auto& line) -> auto&
https://habrahabr.ru/post/66021/
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.06.2017, 16:14
Помогаю со студенческими работами здесь

Сумма всех согласных и знаков препинания
Дано предложение на английском языке. Найти множество согласных букв и знаков препинания, а так же пересечение этих множеств. Напечатать...

Подсчитайте количество всех знаков препинания в тексте
b) Подсчитайте количество всех знаков препинания в заданном тексте.

С клавиатуры вводят строку.Составить программу, которая выводит номера позиций всех знаков препинания
Составить программу, которая выводит номера позиций всех знаков препинания.

Построить множество встречающихся в последовательности знаков арифметических операций и знаков препинания
Дана непустая последовательность символов. Требуется построить и напечатать множество, элементами которого являются ...

Подайте идею для исправления знаков препинания
Всем привет. Задача: Создать программу, которая будет исправлять такой текст: Привет , меня зовут Стас ! Как у тебя дела ? На...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
Система статов в Unity
GameUnited 20.04.2025
Статы — фундаментальный элемент игрового дизайна, который определяет характеристики персонажей, предметов и других объектов в игровом мире. Будь то показатель силы в RPG, скорость передвижения в. . .
Статические свойства и методы в TypeScript
run.dev 20.04.2025
TypeScript прочно занял своё место в системе современной веб-разработки. Этот строго типизированный язык программирования не просто расширяет возможности JavaScript — он делает разработку более. . .
Batch Transform и Batch Gizmo Drawing API в Unity
GameUnited 20.04.2025
В мире разработки игр и приложений на Unity производительность всегда была критическим фактором успеха. Создатели игр постоянно балансируют между визуальной привлекательностью и плавностью работы. . .
Звук в Unity: Рандомизация с Audio Random Container
GameUnited 20.04.2025
В современных играх звуковое оформление часто становится элементом, который либо полностью погружает игрока в виртуальный мир, либо разрушает атмосферу за считанные минуты. Представьте: вы исследуете. . .
Максимальная производительность C#: Советы, тестирование и заключение
stackOverflow 20.04.2025
Погружение в мир микрооптимизаций C# открывает перед разработчиком целый арсенал мощных техник. Но как определить, где и когда их применять? Ответ начинается с точных измерений и профилирования. . . .
Максимальная производительность C#: Предсказание ветвлений
stackOverflow 20.04.2025
Третий ключевой аспект низкоуровневой оптимизации — предсказание ветвлений. Эта тема менее известна среди разработчиков, но её влияние на производительность может быть колоссальным. Чтобы понять. . .
Максимальная производительность C#: Векторизация (SIMD)
stackOverflow 20.04.2025
Помимо работы с кэшем, другим ключевым аспектом низкоуровневой оптимизации является векторизация вычислений. SIMD (Single Instruction, Multiple Data) позволяет обрабатывать несколько элементов данных. . .
Максимальная производительность C#: Процессорный кэш
stackOverflow 20.04.2025
Знакомство с внутренним устройством процессорного кэша — ключевой шаг в написании по-настоящему быстрого кода на C#. Этот слой архитектуры компьютера часто ускользает от внимания разработчиков, но. . .
Максимальная производительность C#: Введение в микрооптимизации
stackOverflow 20.04.2025
В мире разработки на C# многие привыкли полагаться на . NET Runtime, который "магическим образом" сам оптимизирует код. И часто это работает - современные JIT-компиляторы творят чудеса. Но когда речь. . .
MVC фреймворк в PHP
Jason-Webb 19.04.2025
Архитектурный паттерн Model-View-Controller (MVC) – это не просто модный термин из мира веб-разработки. Для PHP-программистов это фундаментальный подход к организации кода, который радикально меняет. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru