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

Поиск популярного триплета. Конструктивная критика - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Вместо включения используйте закрытое наследование http://www.cyberforum.ru/cpp-beginners/thread1233787.html
Здравствуйте. Изучаю С++ по книге Прата С. "Язык программирования С++. Лекции и упражнения". Столкнулся с проблемой. Есть задание: Выполните еще раз упражнение 1, но вместо включения используйте закрытое наследование. Здесь также могут пригодиться несколько объявлений typedef. Подумайте, как можно применить следующие операторы: PairArray::operator=(PairArray(Arraylnt() , Arraylnt())); ...
C++ Обеспечить работу приложения с БД Firebird на других ПК Добрый день. Есть программа с бд на firebird, как скомпилировать программу так, что бы на компьютере где нет firebird она запускалась и работала? http://www.cyberforum.ru/cpp-beginners/thread1233780.html
C++ Изучение С++ с нуля
Всем привет. Вчера зарегистрировался на форуме. Хочу изучить C++, но нет никаких знаний в этом направлении. Какие книги можно почитать абсолютному начинающему, который вообще не в курсе что такое программирование??? Как изучить C++ основательно, чтоб без пробелов? может начать с математики. короче у вас большой опыт. помогите... особыми умственными способностями, мягко говоря, не обладаю....
C++ Конкатенация строк: Зачем строки создаются в динамической памяти?
Есть программа, которая делает конкатенацию строк. #include <iostream> using namespace std; char* Concatenate(char* string1, char* string2) { int lengthString1 = GetLength(string1); int lengthString2 = GetLength(string2); int lengthString3 = lengthString1 + lengthString2; int charString1 = 0;
C++ Помогите найти ошибку в решении биквадратного уравнения http://www.cyberforum.ru/cpp-beginners/thread1233710.html
Здравствуйте,написал код,проблема в том,если выполняется строка 31,то и всегда будет выполнятся строка под номером 39,как это исправить? писал по алгоритму,должно быть все правильно. Программа работает хорошо,только выводит на экран пару лишних иксов. Для примера можно взять 4(x^4)- 5(x^2)+1=0. Ответ равен 1, -1, 0.5, -0.5; у меня выбивает следующие: x1=1; x2=-1; x3=0.5; x4=-0.5; x1=-1; x2=1; -...
C++ Как обратиться к свойству класса Нубский вопрос, вот код: #include "stdafx.h" #include <iostream> using namespace std; class HelloClass подробнее

Показать сообщение отдельно
Aloir
 Аватар для Aloir
216 / 216 / 13
Регистрация: 17.12.2010
Сообщений: 688
25.07.2014, 13:46     Поиск популярного триплета. Конструктивная критика
Добрый день. Недавно помогал решать задачу про триплеты, и захотелось услышать критики по своему коду . все-таки только учусь, и она я считаю будет полезной.

в первую очередь, хотелось бы услышать: конструктивную критику по коду, советы по улучшению быстродействия алгоритма, может вообще другой алгоритм , ну а потом остальное.

принципи тут все простое.. но .. вот что-то захотелось)))

ремарка:
Кликните здесь для просмотра всего текста

среда разработки MSVC 2010, к тому что, новый стандарт немного не проканает.
опустим спор про namespace std, просто было лень писать каждый раз
Кодировка: Multi-Byte


задача:
Кликните здесь для просмотра всего текста
найти самый популярный триплет (сочетание трех соседних букв в слове) и количество его повторений в строке.


код:
Кликните здесь для просмотра всего текста
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
#include <tchar.h>
#include <string>
#include <Windows.h>
#include <iostream>
 
#include <vector>
#include <map>
#include <algorithm>
 
using namespace std;
 
const size_t g_triplet_lenght = 3; //длина триплета
 
//замена всех символов "не букв", на пробел
void replace_sym_to_space(string __inout &str)
{
    auto iRepl = str.begin();
    while(iRepl!= str.end())
    {
        if(IsCharAlpha(*iRepl) == 0)
            *iRepl = ' ';
        ++iRepl;
    }
}
 
//разбить строку по разделителю
void split(const string& __in text, vector<string>& __inout words, const char __in delim = ' ')
{ 
    words.clear();
    string lower_text(text);
 
    transform(lower_text.begin(), lower_text.end(), lower_text.begin(),tolower);
 
    TCHAR* pTempStr = strdup(lower_text.c_str()); 
    TCHAR* pWord = _tcstok(pTempStr,&delim); 
    
    while(pWord != NULL)
    {
        if(_tcsclen(pWord) >= g_triplet_lenght)
            words.push_back(pWord);
        pWord = _tcstok(NULL, &delim);     
        
    }
    free(pTempStr); 
}
 
//создает словарь триплетов с подсчетом количества повторений
void CreateTriplets(const string __in text, map<string,size_t> __out &triplets) 
 {
     triplets.clear();
     string tempStr(text);
     replace_sym_to_space(tempStr);
 
     //создаем список слов с длинной больше 2 символов
     vector<string> words;
     split(tempStr,words);
     auto iter = words.begin();
     while(iter!= words.end())
     {
         string temp(*iter);
         size_t len = temp.length();
        
         //разбиение слова на триплеты;
         //помещение и подсчет в словарь триплетов
         while(len >= g_triplet_lenght)
         {
             string trpl = temp.substr(0,3);
 
             auto iterF = triplets.find(trpl);
             if(iterF != triplets.end())
                (*iterF).second =++(*iterF).second;
             else
                 triplets.insert(make_pair(trpl,1));
             
             temp = temp.substr(1);
             len = temp.length();
         }
         ++iter;
     }
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0,"RUS");
 
    const string input_string = "Карл у Клары украл кораллы, а Клара у Карла украла кларнет";
    cout <<"Входная строка: "<<endl << input_string<<endl<<endl;
    map<string,size_t> dictionary;
    CreateTriplets(input_string,dictionary);
 
    //поиск максимально повторяющихся триплетов
    size_t max_value = max_element(dictionary.begin(),dictionary.end(),
            [](const pair<string,size_t> &left,const pair<string,size_t> &right){return left.second < right.second;}
        )->second;
    
    for(auto iOutPut = dictionary.begin(); iOutPut != dictionary.end();++iOutPut)
    {
        if((*iOutPut).second == max_value)
            cout << "Триплет: " << (*iOutPut).first<< "; Количество повторений: "<<(*iOutPut).second<<endl;
    }
    
    cout <<endl;
    system("pause");
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 03:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru