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

Предложения в С++ - C++

Восстановить пароль Регистрация
 
vano47
2 / 2 / 0
Регистрация: 12.05.2012
Сообщений: 20
12.05.2012, 16:53     Предложения в С++ #1
Стоит задача ввести предложение, а потом заменить какое нибудь слово на новое.

Пример:
я ввожу: Дети ехали ловить рыбу.
вожу новое слово: домой
и ввожу слово(словосочетания) которые надо заменить: ловить рыбу (вводить их я должен сразу через пробел). То есть должно выйти "Дети ехали домой"
Подскажите пожалуйста с помощью каких функция можно реализовать эту программу.
P.S. Для меня трудность заключается в том что я не знаю как найти этих два слова и поменять их.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.05.2012, 16:53     Предложения в С++
Посмотрите здесь:

C++ строки и предложения
Даны два предложения. Найти самое короткое из слов первого предложения, которого нет во втором предложении C++
C++ Даны два предложения. Найти самое короткое из слов первого предложения,которого нет во втором предложений?
Предложения C++
В текстовом файле построчно записаны предложения. Записать во второй текстовый файл первое слово последнего предложения C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
12.05.2012, 17:11     Предложения в С++ #2
http://www.cplusplus.com/reference/string/string/
http://www.cplusplus.com/reference/string/string/find/
http://www.cplusplus.com/reference/s...tring/replace/
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
12.05.2012, 18:28     Предложения в С++ #3
Цитата Сообщение от vano47 Посмотреть сообщение
Для меня трудность заключается в том что я не знаю как найти этих два слова и поменять их.
Покажи хотя бы свой код.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
12.05.2012, 18:58     Предложения в С++ #4
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
#include <iostream>
#include <string>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
 
string text="Покажи хотя бы свой код.";
string s1="Покажи хотя бы";
string s2="Показываю";
 
cout<<"Текст: \""<<text<<"\""<<endl;
cout<<"Замена \""<<s1<<"\" на \""<<s2<<"\""<<endl;
 
size_t pos= text.find(s1);
text.replace(pos,s1.length(),s2);
cout<<"Текст: \""<<text<<"\""<<endl;
 
system("pause");
return 0;
}
//---------------------------------------------------------------------------
vano47
2 / 2 / 0
Регистрация: 12.05.2012
Сообщений: 20
12.05.2012, 22:09  [ТС]     Предложения в С++ #5
Вот собственно мой код:

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream.h>


// Структура, которая описывает элемент списка.
struct element
{
char word[50]; // Слово.
element *next; // Указатель на следующий элемент списка.
};


// Класс, описывающий предложение.
class sentence
{char *p; sentence *next;
public:
// Консруктор. Принимает в качестве параметра строку с предложением,
// разбивает её по пробелам на слова и сохраняет каждое слово
// в список sent.
sentence();
sentence(sentence *top);
// Деструктор.
~sentence();
// Печатает предложение.
void print();
// Считает количество заданных букв в предложении.
int count(char c);
// Проверяет, присутствует ли в предложении заданное слово.
int have(char* word);
// Меняет словов word на newword.
void replace(element* word, char* newword, int N);
sentence *get_next(){return next;}
private:
// Список слов предложения.
element* sent;
};


sentence::sentence(sentence *top)
{int flag=0; char s[500];
do{cout<<"Vvedite predlozhenie: ";
gets(s);
int count = strlen(s);
if(count>250){cout<<"Predlozhenie doL}|{no bit ne bolshe 250 simvolov!";
flag=1;}
flag=0;}
while(flag==1);
p=new char [strlen(s)+1];
strcpy (p,s);
element* curr = NULL;
// Разбиваем текст по словам.
char* word = strtok(s, " ");
while(word != NULL)
{
// Заполняем список.
if(curr == NULL)
{
// Вносим первый элемент в список.
curr = (element*) malloc(sizeof(element));
strcpy(curr->word, word);
curr->next = 0;
this->sent = curr;
}
else
{
// Вносим следующие элементы в список.
element* e = (element*) malloc(sizeof(element));
strcpy(e->word, word);
e->next = NULL;
curr->next = e;
curr = e;
}
word = strtok(0, " ");
}
next=top;
}



sentence::~sentence()
{
//Удаляем все узлы списка.
element* e = this->sent;
while(e != NULL)
{
element* tmp = e;
e = e->next;
free(tmp);
free(p);
}
}

void sentence:rint()
{
cout<<p<<"\n";
}

int sentence::count(char c)
{
int counter = 0; // Счётчик количества символов.
element* e = this->sent;
// Перебираем все слова.
while(e != NULL)
{
char* word = e->word;
// Перебираем буквы в каждом слове.
while(*word != '\0')
{
if(*word == c) counter++;
word++;
}
e = e->next;
}
return counter;
}

int sentence::have(char* word)
{
// Перебираем все слова.
element* e = this->sent;
while(e != NULL)
{
// Если нашли искомое слово, возвращаем 1.
if(strcmp(e->word, word) == 0) return 1;
e = e->next;
}
// Если ничего не нашли, возвращаем 0.
return 0;
}
void sentence::replace(element* word, char* newword, int N)
{
// Перебираем все слова.
element* e = this->sent;
while(e != NULL)
{
// Если нашли искомое слово, меняем его.
for(int i=0; i<N; i++)
if(strcmp(e->word, (word+i)->word)== 0) strcpy(e->word, newword);
e = e->next;}
e = this->sent;
while(e != NULL)
{
printf("%s ", e->word);
e = e->next;
}
printf("\n");

}

int main()
{char c, word1[40], newword[30], oldword[30];
int u, k, t, N;


sentence *top=NULL;
do {top=new sentence(top);
cout<<"Xotite vvesti eshe odno predlo}|{enie Y/N?\n";
cin>>c;
}
while(c=='Y'||c=='y');

cout<<"Vvedite simvol: ";
cin>>c;
sentence *temp=top;
while(temp){
u+=temp->count(c);
temp=temp->get_next();}
cout<<"\nDanni Simvol vvoditca "<<u<<" raza";

cout<<"\nVvediti slovo: ";
gets(word1);
temp=top;
while(temp){
k=temp->have(word1);
if(k==1)temp->print();
temp=temp->get_next();}

cout<<"\nVvediti novoe slovo: ";
gets(newword);
element *slovo;
cout<<"\nVvediti kol-vo zamen9emix slov: ";// вот тут то и хотелось вводить не количество слов а сразу словосчетание.
cin>>N;
slovo=new element[N];
for(int i=0; i<N; i++){
cout<<"\nVvediti slovo kotoroe nu}|{no zamenit: ";
gets(oldword);
strcpy((slovo+i)->word, oldword);
for(int j=0; j<30; j++)
oldword[j]=0;
}

temp=top;
while(temp){temp->replace(slovo, newword, N);
temp=temp->get_next();}

getch();
return 0;
}

Добавлено через 2 минуты
как видите я использую массивы типа чар, интересно можно как нибудь выполнить мое задание без использования класса string?
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
12.05.2012, 22:28     Предложения в С++ #6
В прямом смысле вырезать старую и вставить новую подстроку не получится.
Так как изменить размер массива char[] (как и любого дргого массива) нельзя.
Можно создать массив динамически при замене сформировать новый массив скопировав туда необходимое, удалить старый масив delete и подменить указатели так что бы указатель на старый массив указывал на новый.

Если задача не учебного характера "написал что бы отвязались", то стоит нафиг выкинуть char[] тип и использовать std::string

Код выкладывая на форум надо заключать в теги CPP иначе твой код никто не будет читать
vano47
2 / 2 / 0
Регистрация: 12.05.2012
Сообщений: 20
12.05.2012, 23:44  [ТС]     Предложения в С++ #7
Цитата Сообщение от Avazart Посмотреть сообщение
В прямом смысле вырезать старую и вставить новую подстроку не получится.
Так как изменить размер массива char[] (как и любого дргого массива) нельзя.
Можно создать массив динамически при замене сформировать новый массив скопировав туда необходимое, удалить старый масив delete и подменить указатели так что бы указатель на старый массив указывал на новый.

Если задача не учебного характера "написал что бы отвязались", то стоит нафиг выкинуть char[] тип и использовать std::string

Код выкладывая на форум надо заключать в теги CPP иначе твой код никто не будет читать
проблема в том что я не понимаю как мне это необходимое извлечь? можно сравнивать строки по символьно, ну это как то не рационально что ли, может функция есть какай то?


В принципе можно со стрингами сделать, но компилирую на борленде 3.1 а там нет инклуда string.
И посоветуйте пожалуйста компилятор какой нибудь по проще, а то у меня висуал студио стоит и вот в этом коде ошибки мне выдает какий то не понятные.


Пересылаю код по правилам)
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
188
189
190
191
192
193
194
195
196
197
198
199
200
201
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream.h>
 
 
// Структура, которая описывает элемент списка.
struct element
{
 char word[50]; // Слово.
 element *next; // Указатель на следующий элемент списка.
};
 
 
// Класс, описывающий предложение.
class sentence
{char *p; sentence *next;
public:
 // Консруктор. Принимает в качестве параметра строку с предложением,
 // разбивает её по пробелам на слова и сохраняет каждое слово
 // в список sent.
 sentence();
 sentence(sentence *top);
 // Деструктор.
 ~sentence();
 // Печатает предложение.
 void print();
 // Считает количество заданных букв в предложении.
 int count(char c);
 // Проверяет, присутствует ли в предложении заданное слово.
 int have(char* word);
 // Меняет словов word на newword.
 void replace(element* word, char* newword, int N);
 sentence *get_next(){return next;}
private:
 // Список слов предложения.
 element* sent;
};
 
 
sentence::sentence(sentence *top)
{int flag=0; char s[500];
 do{cout<<"Vvedite predlozhenie: ";
   gets(s);
 int count = strlen(s);
 if(count>250){cout<<"Predlozhenie doL}|{no bit ne bolshe 250 simvolov!";
   flag=1;}
  flag=0;}
while(flag==1);
p=new char [strlen(s)+1];
strcpy (p,s);
 element* curr = NULL;
 // Разбиваем текст по словам.
 char* word = strtok(s, " ");
 while(word != NULL)
 {
  // Заполняем список.
  if(curr == NULL)
  {
   // Вносим первый элемент в список.
   curr = (element*) malloc(sizeof(element));
   strcpy(curr->word, word);
   curr->next = 0;
   this->sent = curr;
  }
  else
  {
    // Вносим следующие элементы в список.
    element* e = (element*) malloc(sizeof(element));
    strcpy(e->word, word);
    e->next = NULL;
    curr->next = e;
    curr = e;
  }
  word = strtok(0, " ");
 }
next=top;
}
 
 
 
sentence::~sentence()
{
 //Удаляем все узлы списка.
 element* e = this->sent;
 while(e != NULL)
 {
  element* tmp = e;
  e = e->next;
  free(tmp);
  free(p);
 }
}
 
void sentence::print()
{
 cout<<p<<"\n";
}
 
int sentence::count(char c)
{
 int counter = 0; // Счётчик количества символов.
 element* e = this->sent;
 // Перебираем все слова.
 while(e != NULL)
 {
  char* word = e->word;
  // Перебираем буквы в каждом слове.
  while(*word != '\0')
  {
   if(*word == c) counter++;
   word++;
  }
  e = e->next;
 }
 return counter;
}
 
int sentence::have(char* word)
{
 // Перебираем все слова.
 element* e = this->sent;
 while(e != NULL)
 {
  // Если нашли искомое слово, возвращаем 1.
  if(strcmp(e->word, word) == 0) return 1;
  e = e->next;
 }
 // Если ничего не нашли, возвращаем 0.
 return 0;
}
void sentence::replace(element* word, char* newword, int N)
{
 // Перебираем все слова.
 element* e = this->sent;
 while(e != NULL)
 {
  // Если нашли искомое слово, меняем его.
  for(int i=0; i<N; i++)
  if(strcmp(e->word, (word+i)->word)== 0) strcpy(e->word, newword);
  e = e->next;}
e = this->sent;
 while(e != NULL)
 {
  printf("%s ", e->word);
  e = e->next;
 }
 printf("\n");
 
}
 
int main()
{char c, word1[40], newword[30], oldword[30]; 
 int u, k, t, N;
 
 
sentence *top=NULL;
 do {top=new sentence(top);
 cout<<"Xotite vvesti eshe odno predlo}|{enie Y/N?\n";
 cin>>c;
}
 while(c=='Y'||c=='y');
 
cout<<"Vvedite simvol: ";
cin>>c;
sentence *temp=top;
while(temp){
u+=temp->count(c);
temp=temp->get_next();}
cout<<"\nDanni Simvol vvoditca  "<<u<<"  raza";
 
cout<<"\nVvediti slovo: ";
gets(word1);
temp=top;
while(temp){
k=temp->have(word1);
if(k==1)temp->print();
temp=temp->get_next();}
 
cout<<"\nVvediti novoe slovo: ";
gets(newword);
 element *slovo;
cout<<"\nVvediti kol-vo zamen9emix slov: ";
cin>>N;
slovo=new element[N];
for(int i=0; i<N; i++){
cout<<"\nVvediti slovo kotoroe nu}|{no zamenit: ";
gets(oldword);
strcpy((slovo+i)->word, oldword);
for(int j=0; j<30; j++)
oldword[j]=0;
}
 
temp=top;
while(temp){temp->replace(slovo, newword, N);
temp=temp->get_next();}
 
getch();
 return 0;
}
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
12.05.2012, 23:53     Предложения в С++ #8
Поставте Builder6 (или старше) но если у вас уже стоит Visual то думаю нет смысла там "работают стринги"
может функция есть какай то?
Ф-ции со строками
http://www.cplusplus.com/reference/clibrary/cstring/
в этом коде ошибки мне выдает какий то не понятные
Какие?

Добавлено через 4 минуты
Если используешь std::string надо подключать так
C++
1
2
#include <string>
using namespace std;
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
13.05.2012, 02:11     Предложения в С++ #9
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 <iostream>
#include <string>
#include <Windows.h>
 
using namespace std;
 
int main()
{
    SetConsoleCP (1251);
    SetConsoleOutputCP (1251);
    string input = "Дети ехали ловить рыбу";
    //cout<<"Введите строку для обработки:";
    //getline(cin, input);
    cout<<"Входная строка: "<<input<<endl;
    cout<<"Введите строку заменитель:";
    string repl;
    getline(cin, repl);
    string name;
    size_t offset = 0;
    cout<<"Введите словосочетание которое надо заменить:";
    while (true)
    {
        getline(cin, name);
        offset = input.find(name);
        if (string::npos == offset)
        {
            cout<<"словосочетание не найдено, попробуйте снова:\n";
            continue;
        }
        else
            break;
    }
    input.replace(offset, name.size(), repl);
    cout<<"Произведена замена:\n";
    cout<<input<<endl<<endl;
    system("pause");
    return 0;
}
vano47
2 / 2 / 0
Регистрация: 12.05.2012
Сообщений: 20
13.05.2012, 19:05  [ТС]     Предложения в С++ #10
вот переделал код, может кому понадобиться. Только вот столкнулся с еще одной проблемой в строке 176 почему то у меня не запрашивает слово. Что бы это значило?

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
188
189
190
191
192
193
194
195
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <string>
#include <stdlib.h>
#include <iostream>
using namespace std;
 
// Структура, которая описывает элемент списка.
struct element
{
 char word[50]; // Слово.
 element *next; // Указатель на следующий элемент списка.
};
 
 
// Класс, описывающий предложение.
class sentence
{char *p; sentence *next; element* staroe; std::string z;
public:
 // Консруктор. Принимает в качестве параметра строку с предложением,
 // разбивает её по пробелам на слова и сохраняет каждое слово
 // в список sent.
 sentence();
 sentence(sentence *top);
 // Деструктор.
 ~sentence();
 // Печатает предложение.
 void print();
 // Считает количество заданных букв в предложении.
 int count(char c);
 // Проверяет, присутствует ли в предложении заданное слово.
 int have(char* word);
 // Меняет словов word на newword.
 void replace(string oldword, string newword);
 sentence *get_next(){return next;}
private:
 // Список слов предложения.
 element* sent;
};
 
 
sentence::sentence(sentence *top)
{int flag=0; char s[500];
 do{cout<<"Vvedite predlozhenie: ";
   gets(s);
 int count = strlen(s);
 if(count>250){cout<<"Predlozhenie doL}|{no bit ne bolshe 250 simvolov!";
   flag=1;}
  flag=0;}
while(flag==1);
p=new char [strlen(s)+1];
strcpy (p,s);
z = (const char*) p;
 
 element* curr = NULL;
 // Разбиваем текст по словам.
 char* word = strtok(s, " ");
 while(word != NULL)
 {
  // Заполняем список.
  if(curr == NULL)
  {
   // Вносим первый элемент в список.
   curr = (element*) malloc(sizeof(element));
   strcpy(curr->word, word);
   curr->next = 0;
   this->sent = curr;
  }
  else
  {
    // Вносим следующие элементы в список.
    element* e = (element*) malloc(sizeof(element));
    strcpy(e->word, word);
    e->next = NULL;
    curr->next = e;
    curr = e;
  }
  word = strtok(0, " ");
 }
next=top;
}
 
 
 
sentence::~sentence()
{
 //Удаляем все узлы списка.
 element* e = this->sent;
 while(e != NULL)
 {
  element* tmp = e;
  e = e->next;
  free(tmp);
  free(p);
 }
}
 
void sentence::print()
{
 cout<<p<<"\n";
}
 
int sentence::count(char c)
{
 int counter = 0; // Счётчик количества символов.
 element* e = this->sent;
 // Перебираем все слова.
 while(e != NULL)
 {
  char* word = e->word;
  // Перебираем буквы в каждом слове.
  while(*word != '\0')
  {
   if(*word == c) counter++;
   word++;
  }
  e = e->next;
 }
 return counter;
}
 
 
 
int sentence::have(char* word)
{
 // Перебираем все слова.
 element* e = this->sent;
 while(e != NULL)
 {
  // Если нашли искомое слово, возвращаем 1.
  if(strcmp(e->word, word) == 0) return 1;
  e = e->next;
 }
 // Если ничего не нашли, возвращаем 0.
 return 0;
}
 
 
void sentence::replace(string oldword, string newword)
{
size_t pos= z.find(oldword);
z.replace(pos,oldword.length(),newword);
cout<<z<<endl;
 
}
 
 
 
 
 
int main()
{
 char c, s[40], newword[30], oldword[100]; 
 int u=0, k, t, N;
 std::string n, o;
 
sentence *top=NULL;
 do {top=new sentence(top);
 cout<<"Xotite vvesti eshe odno predlo}|{enie Y/N?\n";
 c=getch();
}
 while(c=='Y'||c=='y');
sentence *temp=top;
 
cout<<"Vvedite simvol: ";
cin>>c;
 
while(temp){
u+=temp->count(c);
temp=temp->get_next();}
cout<<"\nDanni Simvol vvoditca  "<<u<<"  raza";
 
temp=top;
cout<<"\nVvediti slovo: ";
gets(s);
while(temp){
k=temp->have(s);
if(k==1)temp->print();
temp=temp->get_next();}
 
cout<<"\nVvediti novoe slovo: ";
gets(newword);
n = (const char*) newword; 
cout<<"\nVvediti slovo kotoroe nu}|{no zamenit: ";
gets(oldword);
o = (const char*) oldword;
temp=top;
while(temp){
temp->replace(o, n);
temp=temp->get_next();}
 
getch();
 return 0;
}
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
13.05.2012, 19:33     Предложения в С++ #11
Пробуй
C++
1
2
3
cout<<"\nVvediti slovo: ";
cin.sync();//!!!!!
gets(s);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2012, 21:51     Предложения в С++
Еще ссылки по теме:

C++ Предложения в строках
Дано два предложения (Распечатать слова из первого предложения, который начинаются на первую букву последнего слова второго предложения) C++
C++ Разбить текст на предложения, а предложения - на слова

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

Или воспользуйтесь поиском по форуму:
vano47
2 / 2 / 0
Регистрация: 12.05.2012
Сообщений: 20
13.05.2012, 21:51  [ТС]     Предложения в С++ #12
Цитата Сообщение от Avazart Посмотреть сообщение
Пробуй
C++
1
2
3
cout<<"\nVvediti slovo: ";
cin.sync();//!!!!!
gets(s);

спасибо! работает)
Yandex
Объявления
13.05.2012, 21:51     Предложения в С++
Ответ Создать тему
Опции темы

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