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

Преобразование кода - C++

Восстановить пароль Регистрация
 
kenny58
0 / 0 / 0
Регистрация: 21.02.2011
Сообщений: 19
27.04.2012, 10:43     Преобразование кода #1
Добрый день. Не могли бы вы помочь мне разобраться с таким заданием, заранее Спасибо!

По некоторому каналу связи передается сообщение, имеющее вид последовательности нулей и единиц. Из-за помех возможен ошибочный прием некоторых сигналов: нуль может быть воспринят как единица и наоборот. Для повышения вероятности правильного приема сигналов было решено передавать каждый сигнал трижды. Теперь передатчик вместо 1 всегда передает 111, а вместо 0 всегда 000.

Вам предлагается написать программу, которая будет восстанавливать исходное сообщение. При передаче могли произойти ошибки, поэтому вместо каждой тройки цифр программа должна вывести ту цифру, которая встречается в этой тройке по крайней мере два раза.

Ввод
Одна строка, в которой могут быть только символы "0" и "1". Длина строки - число, кратное трём, большее двух и меньшее 760.
Вывод
Вы должны вывести в одну строку раскодированное сообщение.

Ввод
110111010001
Вывод
1100
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.04.2012, 10:43     Преобразование кода
Посмотрите здесь:

C++ Преобразование двоичного кода в текст
C++ Преобразование кода в bat
C++ Преобразование кода клавиши в int
C++ Преобразование +'0'
C++ Преобразование кода для Visual C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
27.04.2012, 12:05     Преобразование кода #2
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 <string>
#include <map>
#include <boost/token_iterator.hpp>
 
int main()
{
   std::string s = "110111010001";
   int offsets[] = {3};
   boost::offset_separator f(offsets, offsets + sizeof(offsets) / sizeof(*offsets));
   typedef boost::token_iterator_generator<boost::offset_separator>::type token_iter;
   for (token_iter iter = boost::make_token_iterator<std::string>(s.begin(), s.end(), f),
        end = boost::make_token_iterator<std::string>(s.end(), s.end(), f);
        iter != end;
        ++iter)
   {
      std::map<char, int> current;
      for (std::string::const_iterator str_iter = iter->begin(); str_iter != iter->end(); ++str_iter)
      {
         ++current[*str_iter];
      }
      std::map<char, int>::iterator f_iter = std::find_if(current.begin(), current.end(), 
      [](const std::map<char, int>::value_type& value)
      {
         return value.second == 2 || value.second == 3;
      });
      if (f_iter == current.end())
      {
         std::cerr << "Invalid sequence: " << *iter << std::endl;
         return 1;
      }
      std::cout << f_iter->first;
   }
   std::cout << std::endl;
}
http://liveworkspace.org/code/ebe090...bf1773f4f8158d
zuq
 Аватар для zuq
95 / 95 / 2
Регистрация: 10.04.2011
Сообщений: 256
27.04.2012, 12:24     Преобразование кода #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
#include <algorithm>
 
std::string func(std::string src) {
 
    std::string ans;
 
    for(size_t i(0); i < src.length()/3; ++i)
        std::count(src.begin() + i*3, src.begin() + i*3 + 3, '1') > 1 ? ans += '1' : ans += '0';
 
    return ans;
}
 
int main() {
 
    std::cout << func("110111010001");
 
    return 0;
}
kenny58
0 / 0 / 0
Регистрация: 21.02.2011
Сообщений: 19
27.04.2012, 12:33  [ТС]     Преобразование кода #4
Спасибо. Чучуть по наглею, а можно ли на более понятном языке

Использую только библиотеку <iostream>
amfisat
 Аватар для amfisat
67 / 67 / 1
Регистрация: 16.06.2009
Сообщений: 235
27.04.2012, 12:40     Преобразование кода #5
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
#include <iostream>
#include <cstring>
using namespace std;
 
const int MAX = 760;
 
int main()
{
    int k = 0;
    char output[255];
    char mes[MAX];
    cout <<"Enter the message: ";
    cin >> mes;
    if ((strlen(mes)%3 != 0)) 
    {cout << "Error!"; exit(1);}
    else {
        for (unsigned int i=0; i<strlen(mes); i+=3)
        {
            if (mes[i] == mes[i+1] || mes[i] == mes[i+2]) 
                output[k++] = mes[i];
            else if (mes[i+1] == mes[i+2])
                output[k++] = mes[i+1];
        }
    }
    for (unsigned i=0; i<k; i++)
        cout << output[i];
    cout << endl;
    return 0;
}
Yandex
Объявления
27.04.2012, 12:40     Преобразование кода
Ответ Создать тему
Опции темы

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