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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
Витька
0 / 0 / 0
Регистрация: 10.10.2010
Сообщений: 82
#1

Обработка текста, разделяемого на слова - C++

15.06.2011, 21:39. Просмотров 1593. Ответов 32
Метки нет (Все метки)

Задан текст, содержащий произвольное количество строк, в которых отдельные слова могут разделяться одним или несколькими пробелами и знаками пунктуации(переносы не используються). Сформировать новый текст, который являеться результатом одного из следующих преобразований исходного текста: заменить заданное слово на другое слово столько раз, сколько оно встречаеться в тексте. Входные и выходные данные через файл. На экран ничего не выводить. Реализация в виде многомодульной структуры в несколько .cpp.

Помогите с заданием, а то не очень хочеться изза него из универа вылетать.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.06.2011, 21:39     Обработка текста, разделяемого на слова
Посмотрите здесь:

C++ Обработка текста
C++ Вывести все слова текста, которые отличны от последнего слова, предварительно преобразовав их
Напечатать все слова из текста, отличные от слова hello. C++
Обработка текста C++
Обработка текста, разделяемого на слова C++
C++ С клавиатуры вводится многострочный текст. Распечатать слова из текста, преобразовав их следующим образом: · перенести последнюю букву в начало слова;
C++ Обработка текста
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
1695 / 874 / 44
Регистрация: 04.06.2008
Сообщений: 5,338
19.06.2011, 22:17     Обработка текста, разделяемого на слова #21
Да без проблем
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
#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;
 
// функция по замене слов, захват символов буквы и цифры - isalnum
void str_replace(std::string&  str, const char*  rep, const char*_new) {
        int first = 0;
        int kolichestvo= 0;
 
        //ПОдсчитываем количество заменяемых слов
        while(1) {
            int last = str.find(rep, first);
            if(last == std::string::npos)
                break;
            else {    
             kolichestvo++; 
             first = last + strlen(rep);
            }
        }
 
        //Формируем новую строку 
        string new_slovo; 
        for (int i= 0; i<kolichestvo- 1; i++)
         new_slovo+=_new;       
 
        
        
        //заменяем 
        first = 0;
        while(1) {
            int last = str.find(rep, first);
            if(last == std::string::npos)
                break;
            str.replace(last, strlen(rep), new_slovo);
            first = last + strlen(rep);
        }
}
 
 
 
 
int  main() {
 
   std::string  str = "";
 
   // открыть файл ввода
   FILE*  fp         = fopen("input.txt", "r");
   char b[512];
   while(! feof(fp) ) {
        fgets(b, 512, fp);
        str.append(b);
   }
   fclose(fp);
 
   // изменить слово на другое
   cout<< "Вводи слово, которое надо заменить и слово НА которое надо заменить"<< endl;
   string old_slovo, new_slovo;
   cin>> old_slovo>> new_slovo;
   str_replace(str, old_slovo.c_str(), new_slovo.c_str());
 
   // изменить слово на другое
//   str_replace(str, "sdfgsadg", "programmirovanie");
 
 
   // сохранить в файл 
   fp = fopen("print.txt", "w");
   fputs(str.c_str(), fp);
   fflush(fp);
   fclose(fp);
 
   // test
  //  puts(str.c_str());
}
Витька
0 / 0 / 0
Регистрация: 10.10.2010
Сообщений: 82
19.06.2011, 22:33  [ТС]     Обработка текста, разделяемого на слова #22
kravam,
а еще у нас препод проверяет всегда пустой файл и пустой ввод. Можешь доделать, что если пустой файл, то прога на экран выводит сообщение, что файл пустой. И если пустой ввод(то есть я просто интерякаю вместо ввода слова) то прога тоже на экран выводит типо "слово не введено". И еще проверка. Препод любит вводить дофига много символов. И есть какой то предел когда прога просто вылетает. Можешь сделать какой то определенный лимит слов? Если лимит будет превышен, то прога выводит на экран, что лимит символов превышен. Я знаю что уже достал тебя своими просьбами но помоги, пожалуйста!

Добавлено через 1 минуту
а теперь выводиться в выходной файл два слова, хотя в тексте слов три.

Добавлено через 7 минут
Да. Если ввести 4 слова, то на выходе в каждом по три слова.То бишь одно теряется.
kravam
быдлокодер
1695 / 874 / 44
Регистрация: 04.06.2008
Сообщений: 5,338
19.06.2011, 22:35     Обработка текста, разделяемого на слова #23
Цитата Сообщение от Витька Посмотреть сообщение
обавлено через 1 минуту
а теперь выводиться в выходной файл два слова, хотя в тексте слов три.
а ты так сделай:
C++
1
2
3
        string new_slovo; 
        for (int i= 0; i<kolichestvo; i++)
         new_slovo+=_new;
И всё будет круто
Витька
0 / 0 / 0
Регистрация: 10.10.2010
Сообщений: 82
19.06.2011, 22:50  [ТС]     Обработка текста, разделяемого на слова #24
ураааа теперь все робит. А по поводу проверок?
kravam
быдлокодер
1695 / 874 / 44
Регистрация: 04.06.2008
Сообщений: 5,338
30.06.2011, 22:00     Обработка текста, разделяемого на слова #25
Чё должно получиться из этого?

C++
1
2
3
123 sdfgsadg 23523 safsdffs, asdljgnsad
sdfgsadg djg7fdg glg9?ldfkng,
fdgdfbfg sdfgsadg kjdfsbg.
Витька
0 / 0 / 0
Регистрация: 10.10.2010
Сообщений: 82
30.06.2011, 22:21  [ТС]     Обработка текста, разделяемого на слова #26
123 gogogo 23523 safsdffs, asdljgnsad
gogogo djg7fdg glg9?ldfkng,
fdgdfbfg gogogo kjdfsbg.
если вместо sdfgsadg вставить go.

Добавлено через 1 минуту
входной:
qwe qwe qwe
замена слов:
qw на 123
выходной:
исходного слова не существует.
(qw это же часть слова а не все слова а рпога должна реагировать на слова. то есть на то што разделяется) пробелом тире или знаками препинания.
kravam
быдлокодер
1695 / 874 / 44
Регистрация: 04.06.2008
Сообщений: 5,338
30.06.2011, 23:18     Обработка текста, разделяемого на слова #27
Тестируй
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
#include <stdio.h>
#include <string>
#include <iostream>
//#include <string.h>
using namespace std;
 
// функция по замене слов, захват символов буквы и цифры - isalnum
bool str_replace(std::string&  str, const char*  rep, const char*_new) {
        int first = 0;
        int kolichestvo= 0;
 
        int i= 0;
 
        //ПОдсчитываем количество заменяемых слов
        while(1) {
            int last = str.find(rep, first);
            if(last == std::string::npos)
                break;
            else {    
             if (!isalnum    (  str [last+ strlen(rep)])) {
              if (last) {
               if (!isalnum(str[last- 1])) {
                kolichestvo++; 
                first = last + strlen(rep);
               }
              }
              else {
                 kolichestvo++; 
               i++;
               first = last + strlen(rep);
              }
             }
             else {
              first+= strlen(rep);
             }
            }
        }
        if (!i) return false;
 
        //Формируем новую строку 
        string new_slovo; 
        for (int i= 0; i<kolichestvo; i++)
         new_slovo+=_new;       
 
        
        
        //заменяем 
        first = 0;
        while(1) {
            int last = str.find(rep, first);
            if(last == std::string::npos)
                break;
            str.replace(last, strlen(rep), new_slovo);
            first = last + strlen(rep);
        }
 
        return true;
}
 
 
 
 
int  main() {
 
   std::string  str = "";
 
   // открыть файл ввода
   FILE*  fp         = fopen("input.txt", "r");
   char b[512];
   while(! feof(fp) ) {
        fgets(b, 512, fp);
        str.append(b);
   }
   fclose(fp);
 
   // изменить слово на другое
//   cout<< "Вводи слово, которое надо заменить и слово НА которое надо заменить"<< endl;
//   string old_slovo, new_slovo;
//   cin>> old_slovo>> new_slovo;
//   str_replace(str, old_slovo.c_str(), new_slovo.c_str());
 
//    изменить слово на другое
//   str_replace(str, "sdfgsadg", "programmirovanie");
//    изменить слово на другое
   if (!str_replace(str, "qw", "123")) {
    cout<< "fig tebe a ne slovo"<< endl;
    getchar ();
   }
 
   // сохранить в файл 
   fp = fopen("print.txt", "w");
   fputs(str.c_str(), fp);
   fflush(fp);
   fclose(fp);
 
   // test
  //  puts(str.c_str());
}
Витька
0 / 0 / 0
Регистрация: 10.10.2010
Сообщений: 82
30.06.2011, 23:30  [ТС]     Обработка текста, разделяемого на слова #28
"fig tebe a ne slovo"
а как вывести это в файл?
и еще. это слово появляется каждый раз хоть верное решение, хоть не верное...

Добавлено через 1 минуту
if (!str_replace(str, "qw", "123"))
а в этой строчке. там ведь может быть не только qw и 123.
kravam
быдлокодер
1695 / 874 / 44
Регистрация: 04.06.2008
Сообщений: 5,338
30.06.2011, 23:38     Обработка текста, разделяемого на слова #29
на чём прокалываешься?
Витька
0 / 0 / 0
Регистрация: 10.10.2010
Сообщений: 82
30.06.2011, 23:49  [ТС]     Обработка текста, разделяемого на слова #30
всмысле?
kravam
быдлокодер
1695 / 874 / 44
Регистрация: 04.06.2008
Сообщений: 5,338
30.06.2011, 23:53     Обработка текста, разделяемого на слова #31
Я же сказал: тестируй. Дай исходные данные на которых ты прокалываешься.
Витька
0 / 0 / 0
Регистрация: 10.10.2010
Сообщений: 82
01.07.2011, 00:02  [ТС]     Обработка текста, разделяемого на слова #32
ааааа. ну я тестил так.
1) входной - пустой
ввод - любые символы.
на экране появляеться "фиг тебе а не слово"
выходной - пустой.
хотя тут ничего не должно быть. надпись фиг тебе а не слово должна появляться тогда, когда мы пытаемся заменить часть слова.
2) входной - 123 123 123
ввод - 123 d
на экране появляеться "фиг тебе а не слово"
выходной - ddd ddd ddd
все верно, только вот на экране эта надпись не должна появляться.
3)входной - 123 123 123
ввод - 12 d
на экране появляеться "фиг тебе а не слово"
выходной - 123 123 123
вот здесь в выходном файле должно быть "фиг тебе а не слово". а на экране эта надпись появлятся не должна.

Добавлено через 57 секунд
кароче в 1 случае все норм. только на экране надпись появляться не должна.

Добавлено через 36 секунд
надпись походу для всех случаев появляеться. а должна ток для последнего. и ее надо в файл кидать, а на экран не выводить
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2011, 00:08     Обработка текста, разделяемого на слова
Еще ссылки по теме:

C++ Дана строка символов, состоящая из произвольного текста, слова раз-делены пробелами. Вывести на экран порядковый номер слова, накрывающего k позицию
Задан текст, напечатать слова этого текста отличные от последнего слова C++
C++ Обработка текста
Дана строка текста, в которой слова разделены пробелами и запятыми, вывести повторяющиеся слова C++
C++ Напечатать слова, которые отличны от последнего слова текста, предварительно удалив из слова последнюю букву

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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
1695 / 874 / 44
Регистрация: 04.06.2008
Сообщений: 5,338
01.07.2011, 00:08     Обработка текста, разделяемого на слова #33
Взялся было правиь случай номер 2, как самый проблематичный, но никакой надписи в упор не вижу. Скинь тогда уж сразу файл с данными, может я ввожу чё не так. Но это потом, а щас спать.
Yandex
Объявления
01.07.2011, 00:08     Обработка текста, разделяемого на слова
Ответ Создать тему
Опции темы

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