Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
25 / 9 / 17
Регистрация: 22.12.2015
Сообщений: 2,097

Что сделать что бы консольная строка разбивалась на слова для перевода?

27.02.2016, 22:54. Показов 558. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Закоментировал разбиение консльной строки на слова.Остальной кусок программы переводит по одному слову английскому на руский язык из файла words.txt.Мне нужно что бы cчитывалась строка английских слов из клавиатуры,она разбивалась на слова и далее выводился их перевод в одной строке.Что и как сделать?words.txt
Например введеная строка
all will be well.
должен вывестись перевод
Ве будет хорошо.

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
// translate eng to rus.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
#include <map>
#include <string>
#include <fstream>
#include <locale>
#include <sstream>
#include <stdio.h>
#include <windows.h> 
 
using namespace std;
char seps[] = " :!?.,\t\n";
char *tok;
char buf1[100];
 
 
int _tmain(int argc, _TCHAR* argv[])
{
     setlocale(LC_CTYPE, "Russian");
   typedef multimap<string, string> strMap;
 
   strMap enru;
   strMap::iterator it;
   
   stringstream ss;
 
   string en;
   string ru;
   string eng[100]; 
 int ii=0;
   ifstream fin("C:/Users/user/Downloads/translateengtoruc_c/words.txt",ios::in | ios::binary);
 
   string buff;
   while (!fin.eof())
   {
      getline(fin, buff);
      ss << buff;
      ss >> en >> ru;
 
      enru.insert(make_pair(en,ru));
   }
 
   //-----------------------------------------------------------
 
   while (true)
   {
       cout <<"введите английское слово: ";
      getline(cin, buff);
     
 
 
//разбиение строки на слова ***************
    //  cin.getline(buf1, 100);
    //  tok = strtok( buf1, seps );
       //    while( tok != NULL )
             //       {
                //      eng[ii]=tok;
                //  printf( " %s\n", tok );
                  //      tok = strtok( NULL, seps );
                    //  ii=ii+1;
                                            //  }
//*****************************************
    
      ru.clear();
      ss.clear();
      ss << buff;
      for (ss >> en; !en.empty(); ss >> en)
      {
         it = enru.find(en);
 
         if (it != enru.end())
         {
            ru += it->second;
         }
         else
         {
            ru += "<UNKNOWN>";
         }
         ru += " ";
         en.clear();
      }
 
      cout << "перевод: " << ru << endl;
                       
      system("Pause"); 
   }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.02.2016, 22:54
Ответы с готовыми решениями:

Дана строка, слова в которой разделены пробелами. Оставьте в ней только те слова, которые начинаются на ту же букву, что и первое слово.
5.17 Дана строка, слова в которой разделены пробелами. Оставьте в ней только те слова, которые начинаются на ту же букву, что и первое...

Почему не компилирует слова по русски, а выводит иероглифы какието? что для этого сделать надо?
Почему не компилирует слова по русски, а выводит иероглифы какието? что для этого сделать надо?

Что сделать, для того что бы транзакция откатила изменение в таблицах при ошибке?
BEGIN TRANSACTION INSERT INTO City (name) values ('Запорожье') INSERT INTO OS (architecture,name,producer) values (1,'Leopard',1) ...

4
 Аватар для Mencey
155 / 102 / 12
Регистрация: 22.07.2010
Сообщений: 445
28.02.2016, 00:23
Предлагаю так. Сначала превращаем все разделители в пробелы, а затем полученную строку закидываем в stringstream и считываем уже по словам.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <sstream>
#include <algorithm>
#include <cstring>
using namespace std;
 
bool is_seperator (char ch) {
    return strchr(",!", ch) != NULL;
}
 
int main() {
    string line;
    getline(cin, line);
    replace_if(line.begin(), line.end(), is_seperator, ' ');
    stringstream words(line);
    string word;
    int i = 1;
    while (words >> word) {
        cout << i++ << ". " << word << endl;
    }
    return 0;
}
Код в действии

Добавлено через 36 минут
Советую код разбивать на куски и оформлять в виде функций. Так и читать и писать код становиться проще.
0
25 / 9 / 17
Регистрация: 22.12.2015
Сообщений: 2,097
28.02.2016, 01:57  [ТС]
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
// ConsoleApplication12.cpp: определяет точку входа для консольного приложения.
//Разбиение строки введеной с клавиатуры на слова и  их вывод по порядку.
//Переводит несколько слов.Выводитья несколько дублей перевода.Как это устранить?
 
#include "stdafx.h"
#include <iostream>
#include <sstream>
#include <algorithm>
#include <cstring>
#include <map>
#include <string>
#include <fstream>
#include <locale>
#include <sstream>
using namespace std;
 
bool is_seperator (char ch) {
    return strchr(",!?.:", ch) != NULL;
}
 
int main() {
    
   string line;
   typedef multimap<string, string> strMap;
   strMap enru;
   strMap::iterator it;
   stringstream ss;
   string en;
   string ru;
 
   ifstream fin("C:/Users/user/Downloads/translateengtoruc_c/words.txt",ios::in | ios::binary);
 
  
   while (!fin.eof())
   {
      getline(fin, line);
      ss << line;
      ss >> en >> ru;
 //eng to rus
      enru.insert(make_pair(en,ru));
//rus to eng 
//enru.insert(make_pair(ru,en));
   }
 
 
   while (true)
   {
cout <<"vedite stroku: "<< endl;
      getline(cin, line);
      ru.clear();
      ss.clear();
      ss << line;
 
 
    replace_if(line.begin(), line.end(), is_seperator, ' ');
    stringstream words(line);
    string word;
    int i = 1;
    while (words >> word) {
 
        for (ss >> en; !en.empty(); ss >> en)
      {
         it = enru.find(en);
         if (it != enru.end())
         {
            ru += it->second;
         }
         else
         {
            ru += "<UNKNOWN>";
         }
         ru += " ";
         en.clear();
      }
        cout << "perevod: " << ru << endl;
        //cout << i++ << ". " << word << endl;
    }
    system("Pause"); 
    return 0;
}
   }
Добавлено через 26 минут
еще не переводит если встречает разделитель типа запятой,точки,двоеточия,дефис,тире,воскл ицательный знак,знак вопрос.

Добавлено через 47 секунд
еще не переводит если встречает разделитель типа запятой,точки,двоеточия,дефис,тире,воскл ицательный знак,знак вопрос.
0
 Аватар для Mencey
155 / 102 / 12
Регистрация: 22.07.2010
Сообщений: 445
28.02.2016, 11:52
Просто добавьте в функцию is_seperator нужные вам разделители -- символы, которые вы хотите игнорировать.
0
25 / 9 / 17
Регистрация: 22.12.2015
Сообщений: 2,097
28.02.2016, 12:12  [ТС]
так они же в 18й строке добавлены.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.02.2016, 12:12
Помогаю со студенческими работами здесь

Что означает Variant (для перевода на другой ЯП)
Есть следующий код: Dim OriginArray(1 To 3) As Variant Dim Origin(1 To 2) As Double '. . . . Origin(1) = 0.03 Origin(2) = 0.03 ...

select как сделать что бы отображалась в верху нужная строка
Знаю индекс строки как сделать что бы при запуске страницы отображалась вверху select именно строка с этим индексом, а не первая идущая в...

Как сделать, что бы строка сообщения в MessageBox была полужирной
Здравствуйте! Как сделать, что бы строка была полужирной?

Как сделать что бы не каждая строка выводилась, а только одно значение?
Как сделать что бы не каждая строка выводилась, а только одно значение using System; using System.Collections.Generic; using...

Вводится строка и символ разделитель. На выходе то, что до символа разделителя и то, что после него
Условие:вводится строка, затем символ разделитель. На выходе должно получаться две строки s1 - то что до символа разделителя и s2 - то что...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru