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

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

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.04.2014, 08:49   #1
alexlagunov
Пользователь
 
Регистрация: 26.04.2014
Сообщений: 23
По умолчанию помогите доработать программу

Всем добрый день! Программа реализует код Хемминга, но только для двоичной уже переведенной, согласно таблице ASCII, таблице двоичной последовательности. В обще суть в том, что нужно ввести в консоли первичную последовательность, например слово "hi"/ согласно таблице ascii h=01101000 i=01101001, и прога должна закодировать согласно алгоритму
Помогите, время поджимает... да, вижак 10
Код:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<iostream>

using namespace std;

char Data[10000];
char ch;


void read ()

{

ch=getchar();

}

void main (void)
{
int i=1;
int S=0;
int z=0;
int p=0;
char *str=new char[100];
char *strham=new char[100];
char s[2]="0";
setlocale (LC_ALL, "Russian");
cout<<"Введите двоичную последовательность длиной 16 бит:\n";
read();


while (ch!='\n')
{
while (fmod(log((float)i)/log(2.0),1.0)<0.0000001) 
{
++i;
}

Data[i]=ch;
++i;
read();
}

for (int q=1; q<i; ++q)
{
if (Data[q]=='1') S=S^q;
}
itoa(S,str,2); 

for (int q=1; q<i; ++q)
{
if (Data[q]!='1' && Data[q]!='0') ++z; 
}
int len=strlen(str);

for (int q=0; q<(z-len); ++q)
{
strcat(strham,s);
}
strcat(strham,str);

for (int q=1; q<i; ++q)
{
if (Data[q]!='1' && Data[q]!='0')
{
Data[q]=strham[strlen(strham)-1-p];
++p;
}
}



cout<<"Код Хемминга:\n";
for (int q=1; q<i; ++q)
{
cout<<Data[q];
}

fgetc(stdin);

delete []str;
delete []strham;
}

Последний раз редактировалось Stilet; 26.04.2014 в 09:23.
alexlagunov вне форума Ответить с цитированием
Старый 26.04.2014, 09:27   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
cout<<"Введите двоичную последовательность длиной 16 бит:\n";
char s[255]; scanf("%s",&s);
for(int i=0,k=0;s[i];i++){
 for(;s[i];s[i]=s[i]>>1) Data[k++]=s[i]&1+'0';
}
...
Это если не путаю. Смысл - пройтись по символам строки и разложить их в биты логическими операциями.

P.S. Лучше бы Data сделал bool-ом
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.04.2014, 09:37   #3
alexlagunov
Пользователь
 
Регистрация: 26.04.2014
Сообщений: 23
По умолчанию

да все в принципе работает..
Но как я уже говорил, мне необходимо вводить первичную последовательность
http://images.yandex.ru/yandsearch?p...nary-chart.gif
эта таблица же уже заложена, программа ее понимает, так при дешифровке находит ошибки в коде
alexlagunov вне форума Ответить с цитированием
Старый 26.04.2014, 10:00   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Но как я уже говорил, мне необходимо вводить первичную последовательность
Ну вводи )
scanf() в моем примере ведь для этого?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.04.2014, 10:03   #5
alexlagunov
Пользователь
 
Регистрация: 26.04.2014
Сообщений: 23
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну вводи )
scanf() в моем примере ведь для этого?
щас попробую)

ошибка: с объявлением "s"...

я вставил этот цикл между cout<<"Введите двоичную последовательность длиной 16 бит:\n";
и
while (ch!='\n')

Последний раз редактировалось Stilet; 26.04.2014 в 10:36.
alexlagunov вне форума Ответить с цитированием
Старый 26.04.2014, 10:37   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
ошибка: с объявлением "s"...
Ну назови ты ее по другому...
Цитата:
я вставил этот цикл между
Я тебе предложил полную замену этому:
Цитата:
while (ch!='\n')
{
while (fmod(log((float)i)/log(2.0),1.0)<0.0000001)
{
++i;
}

Data[i]=ch;
++i;
read();
}
Убирай while совсем.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.04.2014, 10:51   #7
alexlagunov
Пользователь
 
Регистрация: 26.04.2014
Сообщений: 23
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну назови ты ее по другому...

Я тебе предложил полную замену этому:

Убирай while совсем.
Так while убрал., туда вставил тот цикл.,
если её назвать например "e" тогда прога запускается, но при вводе вылазит ошибка: Run-Time Check Failure #2 - Stack around the variable 's' was corrupted.
help...
alexlagunov вне форума Ответить с цитированием
Старый 26.04.2014, 11:42   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Покажи код.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.04.2014, 12:03   #9
alexlagunov
Пользователь
 
Регистрация: 26.04.2014
Сообщений: 23
По умолчанию

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<iostream>

using namespace std;

char Data[10000];
char ch;


void read ()

{

ch=getchar();

}

void main (void)
{
int i=1;
int S=0;
int z=0;
int p=0;
char *str=new char[100];
char *strham=new char[100];
char s[2]="0";
setlocale (LC_ALL, "Russian");
cout<<"Введите двоичную последовательность длиной 16 бит:\n";
char e[255]; scanf("%s",&s);
for(int i=0,k=0;s[i];i++){
for(;s[i];s[i]=s[i]>>1) Data[k++]=s[i]&1+'0';
}

for (int q=1; q<i; ++q)
{
if (Data[q]=='1') S=S^q;
}
itoa(S,str,2);

for (int q=1; q<i; ++q)
{
if (Data[q]!='1' && Data[q]!='0') ++z;
}
int len=strlen(str);

for (int q=0; q<(z-len); ++q)
{
strcat(strham,s);
}
strcat(strham,str);

for (int q=1; q<i; ++q)
{
if (Data[q]!='1' && Data[q]!='0')
{
Data[q]=strham[strlen(strham)-1-p];
++p;
}
}



cout<<"Код Хемминга:\n";
for (int q=1; q<i; ++q)
{
cout<<Data[q];
}

fgetc(stdin);

delete []str;
delete []strham;
}
alexlagunov вне форума Ответить с цитированием
Старый 26.04.2014, 12:57   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну будь же внимательнее. Имя переменной ты поменял, но в цикле что я дал забыл это сделать. Там тоже "е" вместо "s" нужно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите доработать программу. Паскаль Руслан56 Помощь студентам 0 11.03.2014 20:00
Помогите доработать программу на ассемлере: Программа выводит шестнадцатеричные числа в двоичном виде. Nickolay0512 Помощь студентам 0 04.12.2013 11:54
Помогите доработать программу, заполнить массив случайными значениями . serg.malkow2014 Помощь студентам 2 27.11.2013 01:41
доработать программу ehanjaki Помощь студентам 1 12.07.2012 14:37