Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2014, 21:58   #1
filimoncc
 
Регистрация: 17.02.2014
Сообщений: 9
По умолчанию Вывести только те слова сообщения, которые встречаются в нем ровно один раз С++

Дано осмысленное текстовое сообщение (т.е. алфавитно-цифровая информация,
разделенная пробелами и знаками препинани, в конце которого ставится точка):
Вывести только те слова сообщения, которые встречаются в нем ровно один раз.

Помогите с кодом на С++.
filimoncc вне форума Ответить с цитированием
Старый 17.02.2014, 22:31   #2
PathTheir
Пользователь
 
Аватар для PathTheir
 
Регистрация: 14.04.2013
Сообщений: 62
По умолчанию

Если время работы не важно, то можно пробегать по строке и заносить слова в массив, и при этом проверять, если оно уже там есть, то удаляем из массива, иначе добавляем. Можно попробовать сотворить что-нибудь с map<std::string, int> или попробовать хэш-таблицы
PathTheir вне форума Ответить с цитированием
Старый 17.02.2014, 22:55   #3
filimoncc
 
Регистрация: 17.02.2014
Сообщений: 9
По умолчанию

Цитата:
Сообщение от PathTheir Посмотреть сообщение
Если время работы не важно, то можно пробегать по строке и заносить слова в массив, и при этом проверять, если оно уже там есть, то удаляем из массива, иначе добавляем. Можно попробовать сотворить что-нибудь с map<std::string, int> или попробовать хэш-таблицы
а можно код? и мне нужно только string библиотеку использовать с iostream
filimoncc вне форума Ответить с цитированием
Старый 17.02.2014, 22:59   #4
PathTheir
Пользователь
 
Аватар для PathTheir
 
Регистрация: 14.04.2013
Сообщений: 62
По умолчанию

Код это во Фриланс. Там за деньги все сделают. Попробуй сделать сам. Если какие-то конкретные вопросы есть - задавай, поможем чем сможем
PathTheir вне форума Ответить с цитированием
Старый 18.02.2014, 21:27   #5
filimoncc
 
Регистрация: 17.02.2014
Сообщений: 9
По умолчанию

Код:
#include <iostream>
#include <string>
 
bool check_func(char ch)
{
    if(ch == ' ' || ch == ',' || ch == '.')
        return true;
    return false;
}
 
int main()
{
    std::string s, temp;
    std::string* str;
    int index = 0, counter = 0, size;
    std::cout << "Enter string: ";
    getline(std::cin, s);
    
    while(s[index])
    {
        if(!check_func(s[index]))
        {
            while(check_func(s[index]))
            {
                index++;
            }
            counter++;
        }
        index++;
    }
 
    size = counter + 1;
    str = new std::string[size];
    counter = 0;
    index = 0;
    
    while(s[index])
    {
        if(!check_func(s[index]))
        {
            temp += s[index];
            if(!s[index + 1])
            {
                str[counter] = temp;
            }
        }
        else
        {
            if(temp != "")
            {
                str[counter] = temp;
                temp.clear();
                counter++;
            }
        }
        index++;
    }
    
    counter = 0;
    
    for(int i = 0; i < size; i++)
    {
        temp = str[i];
        for(int j = 0; j < size; j++)
        {
            if(temp == str[j])
                counter++;
        }
        if(counter == 1)
            std::cout << str[i] << "\n";
        counter = 0;
    }
    
    std::cout << "\n";
    
    system("pause");
    return 0;    
}


________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(это кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 18.02.2014 в 21:36.
filimoncc вне форума Ответить с цитированием
Старый 18.02.2014, 21:27   #6
filimoncc
 
Регистрация: 17.02.2014
Сообщений: 9
По умолчанию

можно прокомментировать код?
filimoncc вне форума Ответить с цитированием
Старый 18.02.2014, 21:37   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от filimoncc Посмотреть сообщение
можно прокомментировать код?
Конечно, можно, комментируйте!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.02.2014, 22:59   #8
filimoncc
 
Регистрация: 17.02.2014
Сообщений: 9
Злость

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Конечно, можно, комментируйте!
комментируйте!
filimoncc вне форума Ответить с цитированием
Старый 23.02.2014, 14:29   #9
filimoncc
 
Регистрация: 17.02.2014
Сообщений: 9
По умолчанию

Код:
#include <iostream>
#include <string>
using namespace std;

bool check_func(char sim)
{
if(sim == ' ' || sim == ',' || sim == '.' || sim == '!' || sim == '?' || sim == ';' || sim == ':')
{ return true;} else
return false;
}

int main()
{
string s, temp;
int index = 0, counter = 0, size;
cout << "Enter string: ";
getline(cin, s); //сохраняем в s напечатанную строку

while(s[index]) //пока не дойдём до нулевого символа s
    {
        if(check_func(s[index])) //если функция возвращает true,
        {                         //видимо мы наткнулись на пробел, запятую или точку
            while(check_func(s[index])) //пока имеем подобный символ
            {
                index++; //проверяем следующий элемент строки
            }
            counter++; //увеличиваем счётчик
        }
        index++; //если функция возвращает false, проверяем следующий элемент строки
    }
//в счётчике хранится количество интервалов между словами в строке.
//т. е. запятые с пробелами, точки (всё что не касается слов) и по нему задается размер массива
size = counter+1 ; //задаем размер массива
string* str;
str = new string[size]; //создаём массив, в который будем сохранять слова
counter = 0;
index = 0;

//повторяем те же действия
while(s[index])
    {
        if(!check_func(s[index]))//если не символ, то цикл открывает свою работу
        {
            temp += s[index]; //только теперь каждую букву слова сохраняем в temp
            if(!s[index + 1]) //если встречается вдруг символ на следующей позиции, немедленно запускается цикл
            {
                str[counter] = temp; //куча буковок, называемых словом, сохраняется в массив
              temp.clear(); //очищаем temp
                counter++; //увеличивается индекс массива.
            }              //это условие нужно,если будет много символов подряд.
        }
        else//это к первому if
        {
            if(temp != "") //если первое условие не выполнилось, а в temp осталось слово
            {
                str[counter] = temp; //сохраняем кучу буковок что нашлось в массив
                temp.clear(); //очищаем temp
                counter++; //увеличиваем индекс для массива
            }
        }
        index++;//увеличиваем индекс для перебора буковок
    }

    //поиск повторяющихся слов
counter = 0;
    //Поиск не повторяющихся слов
    for(int i = 0; i < size; i++)
    {
        temp = str[i]; //Первый элемент массива присваиваем temp
        for(int j = 0; j < size; j++)
        {
            if(temp == str[j]) //Проверяем с каждым элементом массива
                counter++; //Увеличиваем счетчик при повторении
        }
        if(counter == 1) //Если счётчик равен 1, т.е. слово наткнулось лишь само на себя
            cout << str[i] << "\n"; //выводим слово
        counter = 0; //обнуляем счётчик
    }

    cout << "\n";
return 0;
}

Почему то не работает проверка на повторы. Подскажите где проблема, почему не работает?
filimoncc вне форума Ответить с цитированием
Старый 23.02.2014, 16:06   #10
rlib
Форумчанин
 
Аватар для rlib
 
Регистрация: 22.05.2012
Сообщений: 352
По умолчанию

Код:
#include <algorithm>
#include <iostream>
#include <string>
#include <map>
int main() {
    const char *p = "This is great string that is best string";
    std::map<std::string, int> dict;
    std::string s(p);    
    const std::string SEP = " ";
    s += " ";
    std::size_t found = s.find_first_of(SEP);
    while (found!=std::string::npos)
    {
        std::string key = s.substr(0,found);
        
        s = s.substr(found+1);
        if ( dict.find(key) == dict.end() ) { dict[key] = 1; } 
        else { dict[key] += 1; }
        found=s.find_first_of(SEP);        
    }
    for (auto it=dict.begin(); it!=dict.end(); it++) {
        if ( it->second == 1) {
            std::cout << "Unique word:" << it->first << std::endl;
        }
    }
    
    return 0;
}
rlib вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти слова, которые встречаются в тексте только 1 раз akademochka Помощь студентам 1 05.10.2012 12:40
Вывод на экран символов, которые встречаются только один раз. Tsunami C++ Builder 1 10.04.2011 19:00
[C++ Builder 6] Вывод на экран символов, которые встречаются только один раз. Tsunami Помощь студентам 0 07.04.2011 09:21
Из заданной символьной строки, выбрать те символы, которые встречаются в ней только один раз... Banny Паскаль, Turbo Pascal, PascalABC.NET 3 19.12.2008 06:15