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

разбить строку в массиве по 3 символа, считать все комбинации, и вывести самую частую из них - C++

Восстановить пароль Регистрация
 
СПП
25 / 25 / 2
Регистрация: 15.12.2012
Сообщений: 71
19.01.2013, 06:11     разбить строку в массиве по 3 символа, считать все комбинации, и вывести самую частую из них #1
В файле input.txt - дана строка с набором бесмысленных символов например: PERPERVIAVIDPERPER
Мне нужно в файл output.txt записать самую частую комбинацию из 3 букв

Вот мой код
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
#include <iostream>
#include <cstdlib>
#include <clocale>
#include <fstream>
 
#define iFILE "input.txt"
#define oFILE "output.txt"
#define MAX_SIZE 256
int main(){setlocale(LC_ALL,"Rus");
    char *str[MAX_SIZE];int str_size = 0;
    std::ifstream inp; inp.open(iFILE);
        // Проверяем здесь удалось ли открыть файл, выводим сообщение об ошибка.
        if(!inp.is_open()){
            std::cout << "Не удаётся открыть файл  . . ." << std::endl;
        system("pause");
        return 0;
        }
        // Убеждаемся что не достигнут конец файла, или мы не вышли за границы массива.
        while(!inp.eof() && str_size<MAX_SIZE){
            // Массив объявлен, но не ициализирован, для каждого элемента массива,
            // мы получаем адрес в памяти с помощью new
            str[str_size] = new char();
                inp.getline(str[str_size],256);
        str_size++;
        }inp.close();
 
        /* ... */
 
system("pause");
return 0;
}
У меня почти всё готово, кроме того что не могу реализовать то,
что бы программа разбила строку на 3 символа и просчитала самый частый вариант наборов

Я сначала думал так
C++
1
2
3
4
5
6
for(int i=0;i<str_size;i++){
    // сдесь я пытался разбить строку на 3 символа  
    for(int j=0;j<3;j++){
        // здесь я пытался просчитать самый частый вариант
    }
}
Но у меня не хватает знаний чтобы реализовать моё предположение,
подскажите мне какуюту функцию, или что-то чтобы можно было сделать задание

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

C++ Как считать строку и разбить ее на слова?
C++ Дан массив целых чисел. Определить все уникальные числа в массиве и сколько раз каждое из них встречается в массиве.
C++ Вывести все комбинации чисел от 1 до 7 с помощью рекурсии
C++ Вывести все возможные комбинации цепочек в матрице смежности
Нужно вывести все возможные возрастающие 6-ти значные комбинации C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
19.01.2013, 09:31     разбить строку в массиве по 3 символа, считать все комбинации, и вывести самую частую из них #2
Цитата Сообщение от СПП Посмотреть сообщение
str[str_size] = new char();
Это плохо, сколько памяти вы выделили под строку?

Как вариант, сделать map, в котором ключ - строка, представляющая триаду символов, а значение - количество таких триад.

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 <map>
#include <string>
 
int main()
{
    std::string str = "PERPERVIAVIDPERPER";
    
    std::map<std::string, int> triads;
    
    for(size_t i = 0; i < str.size() - 2; ++i)
    {
        ++triads[str.substr(i, 3)];
    }
    
    std::map<std::string, int>::iterator iter = triads.begin();
    while(iter != triads.end())
    {
        std::cout << iter -> first << " " << iter -> second << "\n"; 
        ++iter;
    }
 
    return 0;
}
СПП
25 / 25 / 2
Регистрация: 15.12.2012
Сообщений: 71
19.01.2013, 10:56  [ТС]     разбить строку в массиве по 3 символа, считать все комбинации, и вывести самую частую из них #3
Цитата Сообщение от Schizorb Посмотреть сообщение
Это плохо, сколько памяти вы выделили под строку?
Как вариант, сделать map, в котором ключ - строка, представляющая триаду символов, а значение - количество таких триад.
Ваш код работает, но вот мой неочень
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
#include <iostream>
#include <cstdlib>
#include <clocale>
#include <fstream>
#include <string>
#include <map>
 
#define iFILE "input.txt"
#define oFILE "output.txt"
int main(){setlocale(LC_ALL,"Rus");
    std::string str;
    std::ifstream inp; inp.open(iFILE);
        // Проверяем здесь удалось ли открыть файл, выводим сообщение об ошибка.
        if(!inp.is_open()){
            std::cout << "Не удаётся открыть файл  . . ." << std::endl;
        system("pause");
        return 0;
        }
    inp >> str;
    std::map<std::string, int> triads;
    for(size_t i=0; i<str.size()-2;++i){
        ++triads[str.substr(i,3)];
    }
    std::map<std::string, int>::iterator iter = triads.begin();
    while(iter != triads.end()){
        std::cout << iter->first << " " << iter->second << std::endl;
        ++iter;
    }
    inp.close();
    std::ofstream out; out.open(oFILE);
    out << i
    out.close();
system("pause");
return 0;
}
То что вы мне сказали, это для меня новое,
и по заданию - как мне самый частый ответ в файл всунуть.
Да кстати у меня появляется ошибка штук 100-1000,
и файл какой-то создался с неизвесным разрешением
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
19.01.2013, 11:42     разбить строку в массиве по 3 символа, считать все комбинации, и вывести самую частую из них #4
Цитата Сообщение от СПП Посмотреть сообщение
как мне самый частый ответ в файл всунуть.
ну сперва его найти надо.

В STL честно говоря не силен, поэтому может кто подправит или сделает проще.
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
#include <iostream>
#include <cstdlib>
#include <clocale>
#include <fstream>
#include <string>
#include <map>
#include <algorithm>
 
#define iFILE "input.txt"
#define oFILE "output.txt"
 
 
typedef std::map<std::string, int> m_map;
 
// функция сравнения
bool compare(m_map::value_type & i, m_map::value_type & j) 
{ 
    return i.second < j.second;
}
 
int main(){
    setlocale(LC_ALL,"Rus");
    std::string str;
    std::ifstream inp; inp.open(iFILE);
    
    // Проверяем здесь удалось ли открыть файл, выводим сообщение об ошибка.
    if(!inp.is_open()){
        std::cout << "Не удаётся открыть файл  . . ." << std::endl;
    system("pause");
    return 0;
    }
    inp >> str;
    
    m_map triads;
    for(size_t i=0; i<str.size()-2;++i){
        ++triads[str.substr(i,3)];
    }
    inp.close();
    
    m_map::iterator iter = triads.begin();
    while(iter != triads.end()){
        std::cout << iter->first << " " << iter->second << std::endl;
        ++iter;
    }
    
    // поиск макс. элемента
    iter = std::max_element(triads.begin(), triads.end(), compare);
    
    std::ofstream out; out.open(oFILE);
    out << iter->first << " " << iter->second << std::endl;
    
    out.close();
    system("pause");
    return 0;
}
Добавлено через 39 секунд
Цитата Сообщение от СПП Посмотреть сообщение
Да кстати у меня появляется ошибка штук 100-1000,
и файл какой-то создался с неизвесным разрешением
Хм... не знаю, у меня ваш код ошибок не выдает (кроме этой строки - out << i), и файл нормальный создается.
СПП
25 / 25 / 2
Регистрация: 15.12.2012
Сообщений: 71
19.01.2013, 11:45  [ТС]     разбить строку в массиве по 3 символа, считать все комбинации, и вывести самую частую из них #5
Цитата Сообщение от Schizorb Посмотреть сообщение
out << i
Это мои наработки были,
изначально было так
C++
1
out << iter;
Хотя, ваш 2ой вариант, верный то что нужно
Yandex
Объявления
19.01.2013, 11:45     разбить строку в массиве по 3 символа, считать все комбинации, и вывести самую частую из них
Ответ Создать тему
Опции темы

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