Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2016, 18:26   #1
Матвей2016
Пользователь
 
Регистрация: 14.05.2016
Сообщений: 11
По умолчанию Просьба подсказать начинающему. C++. восстановить искаженное сообщение, переданное с утроением каждого бита

Добрый день, Друзья. Я впервые на данном форуме, да и язык си++ только начинаю постигать. Поэтому прошу Вас навести меня на путь истинный в следующей задаче:
По каналу связи передаётся сообщение, имеющее последовательность 0 и 1. Существуют помехи и для повышения надёжности каждый сигнал передаётся трижды. Теперь 1=111, а 0=000.
В сообщении могли возникнуть ошибки, а поэтому вместо тройки цифр программа должна вывести ту, которая встречается по крайней мере 2 раза.
Длина сообщения - число кратное трём, больше 2-х и меньше 760.

Вот пример вводных данных 100111011. Вот то, что должна вывести программа: 011.

Вот я начал писать программу:

Код:
#include <iostream>
#include <string>
using namespace std;
int main()
{
setlocale (0, "rus");
char code[759]; //инициализируем переменную, которая будет содержать вводимый код
cin»code;
int a=strlen(code);//нашёл кол-во символов.
int c=a%3;
if  (c=0 && c>2 && c<760){
int b=a/3;//находим количество закодированых символов.
А что дальше.
Была идея разбить число с помощью массива, но для сравнения чисел нам нужны переменные, а при "разбитии" мы просто ставим пробелы между символами.

Выскажите, пожалуйста своё мнение и подтолкните меня в верном направлении. Заранее спасибо.

Пожалуйста, оформляйте Ваш код согласно правилам.

Последний раз редактировалось Вадим Мошев; 14.05.2016 в 20:57.
Матвей2016 вне форума Ответить с цитированием
Старый 14.05.2016, 19:15   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

что нам нужно, так это ЦИКЛ. (перебор от первого до последнего символа)
и ДВА счетчика( переменные) для ПОДСЧЕТА встретившихся нулей и единиц.

0. обнулить счетчики и встать в начало.
1. перейти к следующему и если мы дошли до конца то закончить работу.
2. если текущий символ =0 то увеличить счетчик_нулей иначе увеличить счетчик_единиц
3. если мы НЕнасчитали ТРИ знака {счетчик_нулей + счетчик_единиц <3 } то продолжить счет (вернуться к п.1)
4. {значит мы уже просчитали три нужных нам знака, будем выводить}
если счетчик_нулей>счетчик_единиц то вывести ноль иначе вывести единицу
5. {а теперь нам пора начинать счет заново} обнулить счетчики и продолжить счет (опять вернуться к п.1)
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 14.05.2016, 19:22   #3
Матвей2016
Пользователь
 
Регистрация: 14.05.2016
Сообщений: 11
По умолчанию

Спасибо, буду пробовать(:
Матвей2016 вне форума Ответить с цитированием
Старый 14.05.2016, 19:56   #4
Матвей2016
Пользователь
 
Регистрация: 14.05.2016
Сообщений: 11
По умолчанию

С исходным кодом не задалось. Вот я выслушал ваши советы и что-то неладное написал. Видимо не осознают, что делать надо. Посмотрите, пожалуйста.
Код:
for (i=0; i<=a; i++){
i=0;
i++;
if (i=0){
y+=1;}
else{
x+=1;}
sum=y+x;
if(sum=3){
if (y>x){
cout<<"0";
}
if (x>y){
cout<<"1";
}
break;
}else{
break;
}
Пожалуйста, оформляйте Ваш код согласно правилам.

Последний раз редактировалось Вадим Мошев; 14.05.2016 в 20:58.
Матвей2016 вне форума Ответить с цитированием
Старый 14.05.2016, 20:59   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
for (i=0; i<=a; i++){
i=0; // переменной цикла внутри НЕ НАДО ничего присваивать, все что нужно уже указано в for () 
i++; //
if (i=0){ //не переменная цикла, 
if (code[i]=0){ // а значение i-го элемента массива 
y+=1;}
else{
x+=1;}
sum=y+x;
if(sum=3){
if (y>x){
cout<<"0";
}
if (x>y){
cout<<"1";
}
break; // ну зачем же нам совсем останавливать цикл
}else{
break;
}
P.S. а где же сброс (повторная установка в 0) cчетчиков после вывода символа?
P.P.S. Да и начальная (до цикла) установка в 0 не помешала бы.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 15.05.2016 в 09:42.
evg_m вне форума Ответить с цитированием
Старый 15.05.2016, 12:43   #6
Матвей2016
Пользователь
 
Регистрация: 14.05.2016
Сообщений: 11
По умолчанию

Код:
if (code[i]=0){ // а значение i-го элемента массива 
y=y+1;}
if (code[i]=1){
x=x+1;}
}
sum=y+x;
if(sum=3){
if (y>x){
cout<<"0";
}
if (x>y){
cout<<"1";
}
}
else{
}
}
При компиляции только первые три цифры считывает. Возможно это потому, что я счетчик не обнулил. А обнулить это i присвоить значение 0?
Матвей2016 вне форума Ответить с цитированием
Старый 15.05.2016, 14:14   #7
Матвей2016
Пользователь
 
Регистрация: 14.05.2016
Сообщений: 11
По умолчанию

Может вот так сделать?
Код:
while (sum=3; i<a){
if (x>y){
cout<<"0";}
if (x<y){
cout<<"1";}
}
while (sum=3; i=a){
if (x>y){
cout<<"0";}
if (x<y){
cout<<"1";}
}
system ("pause");
return 0;
Матвей2016 вне форума Ответить с цитированием
Старый 15.05.2016, 15:06   #8
kutani
Форумчанин
 
Регистрация: 23.01.2016
Сообщений: 608
По умолчанию

...зачем изобретать велосипед, когда есть коды Рида-Соломона. А за отсутствие контрольной суммы вообще по рукам надо бить.
kutani вне форума Ответить с цитированием
Старый 15.05.2016, 18:59   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
А обнулить это i присвоить значение 0?
только обнулять надо счетчикИ ЧИСЛА встреченных нулей и единиц
Цитата:
Код:
if code[i]='0'{
x+=1 //мы встретили ноль (и ПОСЧИТАЛИ его)
так вот после КАЖДЫХ трех знаков СЧЕТ надо начинать заново
Код:
x=0; // число встреченных нулей 
y=0; //и единиц тоже
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 15.05.2016, 20:15   #10
Матвей2016
Пользователь
 
Регистрация: 14.05.2016
Сообщений: 11
По умолчанию

Буду пробовать. Вы не против, если буду задавать вопросы, если возникнут?
Матвей2016 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
масм на 64 бита :=) Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 16 26.08.2012 23:19
В слове (16bit) заменить 4-бита Tronix Паскаль, Turbo Pascal, PascalABC.NET 2 26.07.2012 11:31
изменение бита в числе Kukurudza Общие вопросы C/C++ 5 25.10.2011 23:16
Проверка установленности 0-го бита Sianukvil Общие вопросы C/C++ 0 01.06.2010 17:09
C++ получение конкретного бита... SNUPY Помощь студентам 2 26.03.2009 18:50