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

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

Войти
Регистрация
Восстановить пароль
 
kestugar
7 / 7 / 0
Регистрация: 15.05.2010
Сообщений: 184
#1

Преобразовать полученный текст в набор строк, каждая из которых содержит целое количество слов и ее длинна не превышает 40 символов - C++

15.10.2013, 13:43. Просмотров 358. Ответов 2
Метки нет (Все метки)

Преобразовать полученный текст в набор строк, каждая из которых содержит целое
количество слов (слово должно целиком находиться в строке) и ее длинна не превышает
40 символов.

Подсказки:
• Для хранения всего входного текста можно использовать одну строку
• Можно создать строки содержащие символы принадлежащие какое либо категории,
например знаки препинания
• Для хранения результирующих строк можно использовать vector<string>

Алгоритм преобразования:
1)ищешь последний пробел в строке от 0-го до 40-го элемента,
2)копируешь подстроку с 0 эл-та. по пробел в i-й элемент вектора
3) удаляешь то что скопировал из строки.
и по новой, пока не кончится строка

1)pos_space = Str_File.find_last_of(" ", 0, 40); - выдает -1;
Помогите пожалуйста разобраться)

//Код функции "Чтение из файла."
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
string Read_File(char* INPUT_FILE_NAME) {
    ifstream inFile_stream;
    string InputString, buf;
 
    inFile_stream.open(INPUT_FILE_NAME);
 
    if (inFile_stream) {    
        while (!inFile_stream.eof())
        {
            //inFile_stream.getline(buf, sizeof(buf));
            getline(inFile_stream, buf);
            InputString += buf; + ' ';
            //InputString += buf; + '\n';
        };
    }
    else
        InputString = "Error open file";
 
    return InputString;
}


//Код функции "форматирование текста."
Кликните здесь для просмотра всего текста

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
string Format_Text(string Str_File) {
    //string Punc_Arr(",.!?:;");
    //int number_start_word = 0;
    int size_word = 0;              //длинна слова.
    int i = 0;
 
    while(i <= Str_File.length()) {
    #pragma region 
        //Если элемент строки табуляция или конец строки, то удаляем его.
        if (Str_File[i] == '\t' || Str_File[i] == '\n') {
            Str_File.erase(i, 1);
            i--;
 
            //Меняем слова больше 10 букв на vau!!!
            if (size_word > 10) 
                Change_Word_More10_Char(Str_File, i, size_word);
 
            size_word = -1;                 //-1, т.к. в конце цикла size_word++.
        }
 
        //Если подряд 2 и более пробела, то удаляем его.
        else if (Str_File[i] == ' ') {
            if (Str_File[i+1] == ' ') {
                Str_File.erase(i+1, 1);
                //i--;
            }
 
            //Меняем слова больше 10 букв на vau!!!
            if (size_word > 10) 
                Change_Word_More10_Char(Str_File, i, size_word);
 
            size_word = -1;                 //-1, т.к. в конце цикла size_word++.
        }
 
        #pragma region Если элемент строки знак препинания.
        //else if (Str_File[i] >= Punc_Arr[0] && Str_File[i] <= Punc_Arr[Punc_Arr.length()]) {
        else if (Str_File[i] == ',' || Str_File[i] == '.' || Str_File[i] == '!' || 
                 Str_File[i] == '?' || Str_File[i] == ':' || Str_File[i] == ';')    {
            //Удаляем перед знаком препинания.
            if (Str_File[i-1] == ' ') {
                Str_File.erase(i-1, 1);
                i--;
            }
            //Вставляем после знака препинания.
            if (Str_File[i+1] != ' ') {
                //cout << "Str_File  [" << i << "] = " << Str_File[i] << endl;
                Str_File.insert(i+1, " ");
                //cout << "Str_File 2[" << i << "] = " << Str_File[i] << endl;
                i++;
                //cout << "Str_File 3[" << i << "] = " << Str_File[i] << endl;
            }
 
            //Меняем слова больше 10 букв на vau!!!
            if (size_word > 10) 
                Change_Word_More10_Char(Str_File, i, size_word);
 
            size_word = -1;                 //-1, т.к. в конце цикла size_word++.
        }
        #pragma endregion
        size_word++;
        i++;
        #pragma endregion
    }
    
    return Str_File;
}
 
//Замена слов больше 10 букв.
void Change_Word_More10_Char(string &Str_File, int &number_of_char, int size_word) {
    //находим начало слова.
    number_of_char = number_of_char - size_word;                
    Str_File.erase(number_of_char, size_word);
    Str_File.insert(number_of_char, "Vau!!!");
    //Переносим указатель на конец слова Vau!!!
    number_of_char = number_of_char + length_vau;
}


Основной код программы:
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
#include <conio.h>
#include <stdlib.h> 
#include <stdio.h>
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
 
using namespace std;
 
 
const int VECTOR_SIZE = 20;
const int ARRAY_SIZE = 10;
const int length_vau = 6;
 
char INPUT_FILE_NAME[] = "../../lab_2_string.txt";
 
string Read_File(char* FILE_NAME);
string Format_Text(string Str_File);
void Change_Word_More10_Char(string &Str_File, int &number_of_char, int size_word);
vector <string> Text_To_Vector(string &Str_File);
void Print_Vector(vector <string> &vect);
 
 
void main(void) { 
           //Str_File - строка, хранящая весь текст из текстового файла.
    string Str_File = Read_File(INPUT_FILE_NAME);
    cout << "In fopen_s: "<< endl << Str_File << endl;
    string Format_Str_File = Format_Text(Str_File);
    cout << "Format_Text: "<< endl << Format_Str_File << endl;
    vector <string> vect(VECTOR_SIZE);
    vect = Text_To_Vector(Str_File);
    cout << endl;
    Print_Vector(vect);
    system("pause");
 }
 
//Преобразовать полученный текст в набор строк, каждая из которых содержит целое количество слов 
//(слово должно целиком находиться в строке) и ее длинна не превышает 40 символов.
vector <string> Text_To_Vector(string &Str_File) {
    int i = 0;
    int number_vector = 0;
    int pos_space = 0;
    vector <string> vect(VECTOR_SIZE);
    cout << " ===vector <string> Text_To_Vector(string Str_File)=== " << vect[i] << endl;
    //cout << " Str_File [40]= " << Str_File[40] << endl;
 
    while(Str_File[i] != '\0') {
        pos_space = Str_File.find_last_of(" ", 0, 40);
        vect[number_vector] = Str_File.substr(i, pos_space);
        Str_File.erase(i, pos_space);
        i = 0;
        number_vector++;
    }
    return vect;
}
 
 
//Вывод вектора на экран.
void Print_Vector(vector <string> &vect) {
    for (int i = 0; i < vect.size(); i++)
        cout<<"vect["<<i<<"] = "<<vect[i]<<endl;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.10.2013, 13:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Преобразовать полученный текст в набор строк, каждая из которых содержит целое количество слов и ее длинна не превышает 40 символов (C++):

Вычыслить количество слов в строке, длинна которых равна 3 символам и вывести их на экран, если же таких слов нет, то выдать об этом сообщение. - C++
Вычыслить количество слов в строке, длинна которых равна 3 символам и вывести их на экран, если же таких слов нет, то выдать об этом...

Дано целое число. Вывести набор символов содержит цифры этого числа в обратном порядке - C++
дано целое число. вывести набор символов содержит цифры этого числа в обратном порядке

Строки символов. Определить количество слов, длинна которых >3 - Pascal ABC
В строке символов определить количество слов, длинна которых &gt;3

Подсчитать в строковой матрице количество слов, длина которых превышает 5 символов - Free Pascal
Вводится массив К×М из слов. Подсчитать количество слов,размером больше 5 символов.

В заданном тексте подсчитать количество слов, длина которых не превышает пяти символов - QBasic
Здравствуйте. Помогите с кодом: в заданном тексте подсчитать кол-во слов, длина которых не превышает пяти символов. Напечатать эти слова

Выбрать строки из файла, каждая из которых содержит более 17 символов - C#
Текстовый файл (его имя задать как параметр командной строки) содержит строки текста. Выбрать строки, каждая из которых содержит более 17...

2
kestugar
7 / 7 / 0
Регистрация: 15.05.2010
Сообщений: 184
15.10.2013, 14:35  [ТС] #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Преобразовать полученный текст в набор строк, каждая из которых содержит целое количество слов 
//(слово должно целиком находиться в строке) и ее длинна не превышает 40 символов.
vector <string> Text_To_Vector(string &Str_File) {
    int i = 0;
    int number_vector = 0;
    int pos_space = 0;
    vector <string> vect(VECTOR_SIZE);
 
    while(Str_File[i] != '\0') {
        pos_space = Str_File.find_last_of(" ", 39);
        vect[number_vector] = Str_File.substr(i, pos_space);
        Str_File.erase(i, pos_space);
        number_vector++;
    }
    return vect;
}
изменил код, теперь находит нормально пробелы, но вылетает с ошибкой:
0
Миниатюры
Преобразовать полученный текст в набор строк, каждая из которых содержит целое   количество слов и ее длинна не превышает  40 символов  
kestugar
7 / 7 / 0
Регистрация: 15.05.2010
Сообщений: 184
15.10.2013, 15:23  [ТС] #3
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
//Преобразовать полученный текст в набор строк, каждая из которых содержит целое количество слов 
//(слово должно целиком находиться в строке) и ее длинна не превышает 40 символов.
vector <string> Text_To_Vector(string &Str_File) {
    int i = 0;
    int number_vector = 0;
    int pos_space = 0;
    vector <string> vect(VECTOR_SIZE);
 
    while(Str_File[i] != '\0') {
        if (Str_File.length() < 40) {
            vect[number_vector] = Str_File;
            break;
        }
        
 
        pos_space = Str_File.find_last_of(" ", 39);
        cout << "pos space = " << pos_space << endl;
        vect[number_vector] = Str_File.substr(i, pos_space);
        cout << "vect[" << number_vector << "] = " << vect[number_vector] << endl;
        Str_File.erase(i, pos_space);
        cout << "Str_File  [" << i << "] ='" <<Str_File[i] <<"'"<< endl;
        //i = 0;
        number_vector++;
    }
    return vect;
}
с ошибкой разобралсяXD
сделал if внутри цикла, чтобы выходил. Проблема в том, что в строке остается один пробел и он не выходит из него... Как тут сделать можно лучше?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2013, 15:23
Привет! Вот еще темы с ответами:

В 4 заданных строках найти количество слов, длинна которых равна введенному числу - Turbo Pascal
Помогите, пожалуйста, исправить программку. нужно в 4 заданных строках найти количество слов, длинна которых равна введенному числу. ...

Процедура, создающая массив строк, каждая из которых содержит описание одного из полей класса - C#
2. Исходный текст представляет описание класса на C#. Напишите процедуру, создающую массив строк, каждая из которых содержит описание...

Напишите процедуру, создающую массив строк, каждая из которых содержит описание одного из методов класса - C#
Всем привет. Помогите пожалуйста. Исходный текст представляет описание класса на C#. Напишите процедуру, создающую массив строк,...

Дан текст, найти количество слов и количество слов, у которых первый и последний символ совпадают - C++
Помогите пожалуйста, выполнить задание. Дан текст из N символов. Группы символов, расположенные между пробелами и не содержащие...


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

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

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