Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ЗеХель
4 / 4 / 0
Регистрация: 04.11.2014
Сообщений: 200
Завершенные тесты: 1
#1

Алгоритм обработки вектора строк - C++

09.01.2016, 22:42. Просмотров 324. Ответов 11
Метки нет (Все метки)

Доброго времени суток, помогите с алгоритмом сортировки. Что требуется: имеется вектор строк (word), передающийся в функцию. Из него нужно сформировать новый вектор checked_words, элементы которого подходят по следующему условию: цифры, содержащиеся в слове должны образовать не увеличивающуюся последовательность и каждый элемент должен делиться на 2( например 8642, 8s6f42, 2222 и т.д.). Пробую сам делать, но чувствуется, что выходит чепуха.
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
void sort_text(vector<string> word)
{
    vector <string> checked_words;
    string buffer;
    int k = 0, count = 0, temp, temp2;
    bool flag = true;
 
    for (int i(0); i < word.size(); i++)
    {
        buffer = word[i];
        while (buffer[k] != '\0')
        {
            if (isdigit(buffer[k]) == true && (int)buffer[k] % 2 == 0)
            {
                temp = buffer[k];
                temp2 = check_elem_word(k, buffer);
                if (temp2 <= temp)
                {
                    temp = temp2;
                    temp2 = check_elem_word(k, buffer);
                    flag = true;
                }
            }
            else
            {
                flag = false;
                k = 0;
                break;
 
            }
            k++;
        }
    }
    if (flag == true)
    {
        checked_words.push_back(buffer);
        k = 0;
    }
C++
1
2
3
4
5
6
7
8
9
10
11
12
int check_elem_word(int k, string buffer)
{
    int temp;
    for (k + 1; k < sizeof(buffer[k]); k++)
    {
        if (isdigit(buffer[k]) == true && buffer[k] % 2 == 0)
        {
            temp = buffer[k];
        }
    }
    return temp;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.01.2016, 22:42
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Алгоритм обработки вектора строк (C++):

Создать функцию для обработки символьных строк. За образец брать библиотечные функции обработки строк языка С, но не применять их в своей функции - C++
Доброго времени суток! Крайне необходима помощь экспертов в С++! Кто может - не оставьте меня в беде))) Вот задания: 3. Создать...

Реализовать функцию перемещения строк, принимающую в качестве параметров два вектора строк - C++
Подскажите насколько правильно решена задача. условие: Напишите функцию MoveStrings, которая принимает два вектора строк, source и...

Переденлать программу обработки вектора с использованием рабочего указателя - C++
Помогите пожалуйста данную программу обработки вектора переделать с использованием рабочего указателя. 1.Найти произведение элементов,...

Алгоритм обработки строки - C++
Здраствуйте, делаю скриптовой интерпритатор. Есть строка вида: dа Loadka. Нужно получить Слово Lodka - причем dа - всегда есть в строке. А...

разработать алгоритм обработки строки символов - C++
разработать алгоритм обработки строки символов которая может содержать буквы английского алфавита, цифры, знаки припинания, пробелы, знаки...

Разработать алгоритм обработки двумерного массива - C++
Разработать алгоритм обработки двумерного массива размера n*m. Числа m и n, а также элементы массива взять из файла. Необходимо каждый...

11
Горелый
70 / 44 / 11
Регистрация: 20.03.2014
Сообщений: 197
09.01.2016, 23:08 #2
Возьмите этот метод
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bool check_word(string& s)
{
   char temp = 'a';
   for(int i = 0; i < s.length(); ++i)
   {
       if(isdigit(s[i]) && (int)s[i] % 2 == 0)
       {
           if(temp != 'a')
           {
                if((int)temp < (int)s[i])
                {
                    return false;
                }
           }
           temp = s[i];
       }
   }
   return true;
}
и ваш измените как то так
C++
1
2
3
4
5
6
7
8
9
10
11
void sort_text(vector<string> word)
{
    vector <string> checked_words; 
    for (int i(0); i < word.size(); i++)
    {                
        if (check_word(word[i]))
        {
            checked_words.push_back(buffer);
        }
    }
}
0
ЗеХель
4 / 4 / 0
Регистрация: 04.11.2014
Сообщений: 200
Завершенные тесты: 1
10.01.2016, 00:08  [ТС] #3
Горелый, не работает - все-таки проблема в isdigit() видимо, так как он просто не заходит в цикл с этим условием.
0
Горелый
70 / 44 / 11
Регистрация: 20.03.2014
Сообщений: 197
10.01.2016, 00:17 #4
Что именно не работает? Где проблема теперь?
0
ЗеХель
4 / 4 / 0
Регистрация: 04.11.2014
Сообщений: 200
Завершенные тесты: 1
10.01.2016, 00:18  [ТС] #5
Горелый, Горелый,
Цитата Сообщение от ЗеХель Посмотреть сообщение
так как он просто не заходит в цикл с этим условием.
0
Горелый
70 / 44 / 11
Регистрация: 20.03.2014
Сообщений: 197
10.01.2016, 00:19 #6
Как вы это определили? В дебагере?
0
ЗеХель
4 / 4 / 0
Регистрация: 04.11.2014
Сообщений: 200
Завершенные тесты: 1
10.01.2016, 00:21  [ТС] #7
Горелый, Да. Вот полный код программы.
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
#include <cctype>
 
using std::cout;
using std::cin;
using std::endl;
using std::string;
using std::ifstream;
using std::vector;
using std::ofstream;
using std::ios;
 
#define SIZE 80
 
void read_file(string);
void sort_text(vector<string>);
void fill_output_file(vector<string>);
void check_file_name(string, ofstream &);
void output_text(string);
void fill_start_file(string name);
bool check_word(string);
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
    cout << "Добро пожаловать %username% ! \n";
    cout << "Введите имя начального файла для записи:\n";
    string name;
 
    fill_start_file(name);
 
    system("pause");
}
 
//Создание и заполнение начального файла.
void fill_start_file(string name)
{
    getline(cin, name);
    ofstream fout;
    fout.open(name, ios::_Noreplace);
 
    check_file_name(name, fout);
 
    cout << "Для окончания введите END\n";
    cout << "Введите строки для записи не более 80 символов:\n";
    string buffer;
    cin.get();
    getline(cin, buffer);
    while (buffer.find(' ') == 0)
    {
        buffer.erase(0, 1);
    }
    while (buffer != "END")
    {
        if (buffer.length() > SIZE - 1)
        {
            cout << "Размер строки превышает норму, обрезана до 80 символов.\n";
            cout << "Введите строку для записи не более 80 символов:\n";
            fout.write(buffer.c_str(), SIZE - 1);
        }
        else
        {
            fout << buffer << endl;
        }
        getline(cin, buffer);
        while (buffer.find(' ') == 0)
        {
            buffer.erase(0, 1);
        }
    }
    fout.close();
    read_file(name);
}
 
//проверка имени на уникальность.
void check_file_name(string name, ofstream  &fout)
{
    while (!fout.is_open())
    {
        cout << "Файл с таким именем уже существует, хотите ввести другое имя? (Y/N) \n";
        string answer;
        cin >> answer;
        if (answer == "Y" || answer == "y")
        {
            cout << "Введите имя файла для записи:\n";
            cin.get();
            getline(cin, name);
            fout.open(name, ios::_Noreplace);
        }
        else fout.open(name, ios::out);
    }
}
 
//запись слов из начального файла в вектор для сортировки.
void read_file(string name)
{
    ifstream fin;
    vector <string> word;
    string buffer2;
    fin.open(name);
    if (!fin.is_open())
    {
        cout << "Файл не существует.\n";
    }
    while (fin >> buffer2)
    {
        word.push_back(buffer2);
    }
    fin.close();
    sort_text(word);
}
 
//сортировка текста.
void sort_text(vector<string> word)
{
    vector <string> checked_words;
    string buffer;
    bool flag = true;
 
    for (int i(0); i < word.size(); i++)
    {
        if (check_word(word[i]))
        {
            checked_words.push_back(buffer);
        }
    }
    fill_output_file(checked_words);
}
 
//заполнение конечного файла после сортировки.
void fill_output_file(vector<string> checked_words)
{
    ofstream fout2;
    string name;
    cout << "Введите имя конечного файла для записи:\n";
    getline(cin, name);
    fout2.open(name, ios::_Noreplace);
 
    check_file_name(name, fout2);
 
    for (int i(0); i < checked_words.size(); i++)
    {
        fout2 << checked_words[i] << endl;
    }
    fout2.close();
    output_text(name);
}
 
//вывод конечного файла в консоли.
void output_text(string name)
{
    string temp;
 
    ifstream fin2;
    fin2.open(name);
 
    cout << "Содержание файла после обработки:\n";
    while (fin2 >> temp)
    {
        cout << temp << endl;
    }
    fin2.close();
}
 
bool check_word(string word)
    {
        char temp = 'A';
        for (int i = 0; i < word.length(); ++i)
        {
            if (isdigit(word[i]) == true && (int)word[i] % 2 == 0)
            {
                if (temp != 'A')
                {
                    if ((int)temp < (int)word[i])
                    {
                        return false;
                    }
                }
                temp = word[i];
            }
        }
        return true;
    }
0
Горелый
70 / 44 / 11
Регистрация: 20.03.2014
Сообщений: 197
10.01.2016, 00:29 #8
Если бы вы сделали как я написал без импровизации то увидели бы что вот здесь ошибка
C++
1
2
3
4
if (check_word(word[i]))
{
    checked_words.push_back(buffer);
}
Компиляция бы у вас не прошла. А так как вы оставили определение string buffer; то всё как бы и ОК но не ок, добавляются пустые строки
Измените на
C++
1
2
3
4
if (check_word(word[i]))
{
    checked_words.push_back(word[i]);
}
0
ЗеХель
4 / 4 / 0
Регистрация: 04.11.2014
Сообщений: 200
Завершенные тесты: 1
10.01.2016, 00:51  [ТС] #9
Горелый, после исправления данной ошибки он стал заносить все слова, но я нашел причину, не хватало строки в функции.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
bool check_word(string word)
    {
        char temp = 'a';
        for (int i = 0; i < word.length(); ++i)
        {
            if (isdigit(word[i]) && (int)word[i] % 2 == 0)
            {
                if (temp != 'a')
                {
                    if ((int)temp < (int)word[i])
                    {
                        return false;
                    }
                }
                temp = word[i];
            }
            else return false; // Вот этой строки.
        }
        return true;
    }
Добавлено через 7 минут
Цитата Сообщение от ЗеХель Посмотреть сообщение
но я нашел причину, не хватало строки в функции.
Но я нашел не правильный выход Не попадают строки такого смешенного типа ( 8u6d )
0
Горелый
70 / 44 / 11
Регистрация: 20.03.2014
Сообщений: 197
10.01.2016, 01:04 #10
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот моя проверочная программа, как мне кажется всё как надо работает
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <vector>
 
using namespace std;
 
bool check_word(string& s)
{
   char temp = 'a';
   for(int i = 0; i < s.length(); ++i)
   {
       if(isdigit(s[i]) && (int)s[i] % 2 == 0)
       {
           if(temp != 'a')
           {
                if((int)temp < (int)s[i])
                {
                    return false;
                }
           }
           temp = s[i];
       }
   }
   return true;
}
 
void sort_text(vector<string>& word)
{
    vector <string> checked_words; 
    for (int i(0); i < word.size(); i++)
    {                
        if (check_word(word[i]))
        {
            checked_words.push_back(word[i]);
        }
    }
    
    for (int i(0); i < checked_words.size(); i++)
         cout << checked_words[i] << endl;
}
 
int main()
{
   vector<string> ar({"8642", "8s6f42", "ggg4422", "4566fd", "8u6d"});
   
   sort_text(ar);
   
   return 0;
}
1
ЗеХель
4 / 4 / 0
Регистрация: 04.11.2014
Сообщений: 200
Завершенные тесты: 1
10.01.2016, 01:15  [ТС] #11
Горелый, шедевр, благодарю!)
1
hoggy
6862 / 3069 / 525
Регистрация: 15.11.2014
Сообщений: 6,976
Завершенные тесты: 1
10.01.2016, 02:04 #12
http://rextester.com/QGYP65551

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <iostream>
#include <string>
#include <regex>
 
int main()
{
    // --- тестовая строчка
    std::string s (
         "12rr34 4 65 54rr32 56fg5 sdfd_  sfdsf"
         "  453dd 123_ %% ##$% df%r^  dfgfd_##gfd"
         "  455@@@5ff sf_fds  _fd  12_3"
    );
 
    // первая регулярка отбраковывает всякий хлам,
    // оставляя только цифры, буквы, и педаль
    const std::regex first("^(\\w+)$");
 
    // вторая регулярка отбраковывает те, что завершаются не цифрами
    const std::regex second("^(\\w+\\d+|\\d+)$");
 
    // третья регулярка нужна,
    // что бы из оставшихся 'буква12344буква3432'
    // повыкавыривать только циферки, игнорируя ,буквы
    const std::regex three("\\d+");
 
    std::vector<std::string> result;
    std::stringstream ss(s);
    std::string word, copy;
    while(ss)
    {
        ss >> word;
 
        // игнорирум если:
        const bool ignore
            // есть педаль
                    =   word.find('_')!=std::string::npos
            // или всякий не алфавитный хлам
                    || !std::regex_match(word, first)
            // или не завершается циферкой
                    || !std::regex_match(word, second)
            // или эта циферка не делится на 2
                    || std::stoi(word.substr(word.length()-1))%2!=0;
 
        if(ignore) continue;
 
        copy = word;
 
        // --- выкавыриваем числовую последовательность
        std::smatch m;
        std::string number;
        while (std::regex_search (copy, m, three))
            for (const auto& x: m)
                number += x,
                copy = m.suffix().str();
 
        // --- проверяем, что цыферки убывают
        char n='9';
        bool success = true;
        for (const auto& x: number)
            if( x < n )
                n = x;
            else
                { success = false; break; }
 
        if(success)
            result.emplace_back(word);
    }
 
    std::cout <<"result: ";
    for(const auto& x: result)
        std::cout <<"'"<<x<<"', ";
    std::cout <<"\n";
}
1
10.01.2016, 02:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2016, 02:04
Привет! Вот еще темы с ответами:

Алгоритм сортировки для вектора - C++
Ребята у меня есть структура типа: struct Set { int row; //строка в матрице int value; //значение, которое повторяется int...

Алгоритм обработки фотографий камеры 360 градусов - C++
Ребят есть ли какой код поясняющий принцип обработки этой камерой фотографий и предствлении их в формате 360 градусов или может кто...

Алгоритм для обработки данных частотного анализа - C++
Честно говоря я сомневаюсь, что писать нужно сюда, но к экспертам меня не пускают)) Сам я далеко не эксперт! Очень надеюсь на ваше...

Функция обработки строк - C++
Нобходимро написать программку функция main() которой содержит вызов функции strlwr char *strlwr( char *s); и вызов пользовательской...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru