25 / 25 / 8
Регистрация: 15.12.2012
Сообщений: 71
1

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

19.01.2013, 06:11. Показов 2061. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В файле 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++){
        // здесь я пытался просчитать самый частый вариант
    }
}
Но у меня не хватает знаний чтобы реализовать моё предположение,
подскажите мне какуюту функцию, или что-то чтобы можно было сделать задание

Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.01.2013, 06:11
Ответы с готовыми решениями:

Вывести на экран цифру, наиболее частую встречающеюся массиве
Ребята я учил 1 год Delphi 7, и сейчас учу, но мне нужно сделать самостоятельную роботу по C++...

Перебор всех комбинаций из 0 и 1 в массиве[5] и вывести все комбинации на ListBox
Нужно написать алгоритм который перебирает все комбинации из 0 и 1 в массиве. И каждую комбинацию...

Вывести самую длинную строку, если их несколько, то все
Задан текстовый файл f.Вывести самую длинную строку,если их несколько то все. Прошу помощи.Заранее...

Найти самую частую причину проигрыша команды
Олимпиадная задача Царь Пантелеймон пребывал в раздумьях — и всё из-за новомодного увлечения...

4
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
19.01.2013, 09:31 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;
}
1
25 / 25 / 8
Регистрация: 15.12.2012
Сообщений: 71
19.01.2013, 10:56  [ТС] 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,
и файл какой-то создался с неизвесным разрешением
0
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
19.01.2013, 11:42 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), и файл нормальный создается.
1
25 / 25 / 8
Регистрация: 15.12.2012
Сообщений: 71
19.01.2013, 11:45  [ТС] 5
Цитата Сообщение от Schizorb Посмотреть сообщение
out << i
Это мои наработки были,
изначально было так
C++
1
out << iter;
Хотя, ваш 2ой вариант, верный то что нужно
0
19.01.2013, 11:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.01.2013, 11:45
Помогаю со студенческими работами здесь

Считать набор текстовых строк и напечатать самую длинную из них
Программа читает набор текстовых строк и печатает самую длинную из них. Код: #include &lt;stdio.h&gt;...

Вывести на экран дисплея в строку сначала все отрицательные из них, а затем – все остальные
Дано 25 чисел. Вывести на экран дисплея в строку сначала все отрицательные из них, а затем – все...

Вывести все введенные строки. Отсортировать строки. Вывести самую длинную строку
Здравствуйте!!! Помогите пожалуйста, не могу разобраться с программой. Ввести с клавиатуры строки,...

Считать файл и самую короткую строку выдать на экран
Создать текстовый файл с пятью строками разной длины. Считать его и самую короткую строку выдать на...

Считать строку, и найти число вхождений символа в эту строку (с использованием strchr)
Почему не работает, компилятор ошибок не ловит, при запуске вылетает с ошибкой. Программа должна...

Вывести строку, в которой все вхождения первого символа заменены на символ *
Дана строка. Вернуть и вывести строку, в которой все вхождения первого символа (кроме самого...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru