Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.68
cflood
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 37
#1

Реализация алгоритма RLE - C++

25.06.2013, 19:31. Просмотров 2906. Ответов 20
Метки нет (Все метки)

Есть задачка, надо реализовать две функции "закодировать" и "раскодировать" массив данных типа:

C++
1
char mass[] = {'a','a','a','a','c','b','b','k','b','b','b','b'};
В итоге нужно получить букву и количество её повторений, реализовать так сказать сжатие, например:

C++
1
{'a4','c1','b2','k1','b4'}
С С++ я работаю всего третий день, по этому многое еще непонятно, однако задача можно сказать реализована на 50%, получилось посчитать количество повторений у каждой из букв:
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
#include <iostream>
#include <stdio.h>
#include <tchar.h>
 
using namespace std;
 
void encode (char mass[], int size)
{
        int counter = 0;
        int recurring_count = 0;
        for (int i = 0; i < size; i++)
        {
            if (mass[i] != mass[i+1])
            {
                recurring_count++;
                cout << mass[i] << recurring_count; // вывод буквы и количества её повторений
                recurring_count = 0;
            } else {
                recurring_count++;
            }
        }
}
 
 
int main ()
{
        char data[] = {'a','a','a','a','c','b','b','k','b','b','b','b'};
        int size = sizeof(data)/sizeof(data[0]);
 
        encode(data, size);
        
        int wait;
        cin >> wait;
}
Проблему вызывает именно запись полученных данных в удобноиспользуемую форму, потому что mass[i] - char, а recurring_count - int.

Например на том же Javascript задачу удалось реализовать полностью за пару минут, с с++ мучаюсь второй день:
Javascript
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
<script>
 
function encode(data) {
    var recurring_count = 0;
    var encoded_mass = [];
    for (var i = 0; i < data.length; i++) {
        if (data[i] != data[i+1]) {
            recurring_count++;
            encoded_mass.push(data[i]+'.'+recurring_count); // как раз то место где в C++ использую для вывода cout
            recurring_count = 0;
        } else {
            recurring_count++;
        }
    }
    return encoded_mass;
}
 
function decode(data) {
    var decode_mass = [];
    for (var i = 0; i < data.length; i++) {
        var temp = data[i].split('.');
        
        for (var j = 0; j < temp[1]; j++) {
            decode_mass.push(temp[0]);
        }
    }
    return decode_mass;
 
}
 
var mass = ['a','a','a','a','c','b','b','k','b','b','b','b'];
var encode_result = encode(mass);
var decode_result = decode(encode_result);
alert(encode_result);
alert(decode_result);
 
</script>
Получается в функции encode на выходе мы имеем массив вида:
Код
буква.количество_повторений
буква.количество_повторений
буква.количество_повторений
буква.количество_повторений
Потом в decode разбиваем его при помощи split по символу "." и получаем массив где первый элемент буква, а второй количество повторений, ну и делаем из всего этого нужный нам первоначальный массив вида

Код
{'a','a','a','a','c','b','b','k','b','b','b','b'}
Подскажите пожалуйста как можно реализовать аналогичную задачу на C++.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2013, 19:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Реализация алгоритма RLE (C++):

Написать программу на основе алгоритма RLE (сжатие/восстановление массива) - C++
Массив из 0 и 1 целых чисел. Массив надо сжать, а затем восстановить массива. Надо написать программу по алгоритму RLE. Спасибо заранее ...

Реализация алгоритма - C++
Смотрите, есть функция для рисования сегмента круга: pieslice(int x, int y, int start, int end, int radius) - int start и int ende угол...

Реализация алгоритма - C++
помогите пожалуйсто написать программу: 1. Реализовать алгоритм Insertion-Sort (сортировка вставками) и Merge-Sort (сортировка слиянием)...

Реализация алгоритма FOREL - C++
Не буду слишком наглым и не буду просить готовое решение, но вопросы будут на каждом шагу! для начала, не сильно раньше заморачивался,...

Реализация алгоритма Йена на С++ - C++
помогите пожалуста реализовать алгоритм Йена есть алгоритм Дейкстры нужно его доделать до Йена#include&lt;iostream&gt; #include&lt;string.h&gt; ...

Реализация LCS алгоритма на с++ - C++
Здравствуйте форумчане!! Помогите заблудшей душе.... Есть задачка , максимально быстрым способом найти наибольшую общую подстроку во...

20
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
26.06.2013, 17:39 #16
Цитата Сообщение от nxtech Посмотреть сообщение
читать топик надо сначала и внимательно
Согласен Но сразу, всего не заметишь. Например, вот сейчас вижу у Вас в коде
Цитата Сообщение от nxtech Посмотреть сообщение
if (mass[i] != mass[i+1])
выход за пределы массива. Для проверки можно сделать минимальное исправление:
C++
1
int size = sizeof(data)/sizeof(data[0]) - 1; // Чтобы "элемент" за последним элементом совпадал
И посмотреть на результаты.
0
nxtech
77 / 59 / 2
Регистрация: 26.06.2013
Сообщений: 198
26.06.2013, 17:45 #17
Цитата Сообщение от Tulosba Посмотреть сообщение
Согласен Но сразу, всего не заметишь. Например, вот сейчас вижу у Вас в коде
выход за пределы массива. Для проверки можно сделать минимальное исправление:
C++
1
int size = sizeof(data)/sizeof(data[0]) - 1; // Чтобы "элемент" за последним элементом совпадал
И посмотреть на результаты.
Спасибо вам, сударь, за внимательность по отношению к коду. Это первое конструктивное замечание. Но только сейчас заметили!!!
Но спешу огорчить - код не мой, моих в нем пять с половиной строчек. На что я сразу обратил внимание, то и исправил. Повторяю, читайте внимательно топик, если хотите постебаться.
0
Tulosba
26.06.2013, 21:21
  #18

Не по теме:

@nxtech, могу и Вам дать совет: смотрите внимательнее на код, который копипастите.

0
nxtech
27.06.2013, 08:18
  #19

Не по теме:

@Tulosba, спасибо, учту. И вам совет, внимательнее читайте сообщения.

0
Catstail
Модератор
22908 / 11274 / 1832
Регистрация: 12.02.2012
Сообщений: 18,484
27.06.2013, 09:57 #20
Цитата Сообщение от MrGluck Посмотреть сообщение
'a1' - char[]
- нет. Для C/C++ это запрещенная конструкция. Правильно "a1" - вот это действительно char[]
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
27.06.2013, 10:14 #21
@Catstail, ISO+IEC+14882-2011 §2.14.3/1 - Character literals
An ordinary character literal that contains more than one c-char is a multicharacter literal. A multicharacter literal has type int and implementation-defined value.
1
27.06.2013, 10:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2013, 10:14
Привет! Вот еще темы с ответами:

Реализация циклического алгоритма - C++
Помогите пожалуйста! Мне нужно написать несколько программ, но получается не всё. Может кого заинтересует одно из заданий. Заранее огромное...

Реализация алгоритма Прима - C++
Алгоритм Прима?кто может написать?

Реализация алгоритма Мандельброта - C++
Знаю, этим уже давно никого не удивить, но я еще раз решил почтить память Бенуа Мандельброта простой коонсльной программой с реализацией...

Реализация волнового алгоритма - C++
Делаю игру Пакман В Игре имеются следующие классы Map.h #ifndef MAP_H #define MAP_H #include &lt;SFML\Graphics.hpp&gt;


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.