Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
9 / 9 / 6
Регистрация: 15.05.2010
Сообщений: 184
1

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

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

Author24 — интернет-сервис помощи студентам
Преобразовать полученный текст в набор строк, каждая из которых содержит целое
количество слов (слово должно целиком находиться в строке) и ее длинна не превышает
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.10.2013, 13:43
Ответы с готовыми решениями:

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

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

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

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

2
9 / 9 / 6
Регистрация: 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;
}
изменил код, теперь находит нормально пробелы, но вылетает с ошибкой:
Миниатюры
Преобразовать полученный текст в набор строк, каждая из которых содержит целое   количество слов и ее длинна не превышает  40 символов  
0
9 / 9 / 6
Регистрация: 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
15.10.2013, 15:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2013, 15:23
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru