Здравствуйте, возникла проблема с программой кодирования и декодирования циклическим кодом. Дело в том, что кодирует она прекрасно, но декодирует не совсем хорошо. Она исправляет ошибку не в том месте, а именно на i+1 месте больше, чем надо. Вместо 16 бита исправляет 17. Помогите исправить, пожалуйста. Спасибо заранее!
Вот код:
#define mess 21
#define inputmess 11
#define checkcode 10
int main() {
setlocale(LC_ALL, "Russan");
char mes[mess]; //num_2
char input[inputmess]; //num_1
char check[checkcode] = { '1','0','0','0','0','0','1','0','0','1' }; //num_3
char menu;
char clmes[mess];
int s = 0;
int a = 0;
while (1 != 0) {
for (int i = 0; i < inputmess; i++)
{
input[i] = '\0';
}
for (int i = 0; i < mess; i++)
{
mes[i] = '0';
}
s = 0;
a = 0;
printf("\nCyclic code (21,11) \n\n Select operation: \n 1 - Coding \n 2 - Decoding \n\n Your choise: ");
menu = getc(stdin);
rewind(stdin);
if ((menu != '1') && (menu != '2')) {
while ((menu != '1') && (menu != '2')) {
printf("Error! Wrong choise!\n");
printf("Select operation: ");
menu = getc(stdin);
rewind(stdin);
}
}
if (menu == '1') {
printf("\n\n\n Enter your code for coding: ");
for (int i = 0; i < inputmess; i++) {
input[i] = getc(stdin);
if (input[i] == '\n') {
s = i - 1; input[i] = '\0';
break;
}
}
rewind(stdin);
if (s != 0) {
for (int i = 10; s > -1; s--) {
input[i] = input[s];
input[s] = '0';
i--;
}
for (int i = 0; i < inputmess; i++) {
if (input[i] == '\0') {
input[i] = '0';
}
}
}
for (int i = 0; i < inputmess; i++) {
mes[i] = input[i];
}
s = mess;
while (s >= checkcode) {
for (int i = 0; i < checkcode; i++) {
if (mes[mess - s + i] == check[i])
{
mes[mess - s + i] = '0';
}
else {
mes[mess - s + i] = '1';
}
}
bool a = true;
int dop_s = s;
for (int i = 0; i < checkcode; i++) {
if (mes[mess - dop_s + i] == '1') {
a = false;
}
if ((a == true) && (mes[mess - dop_s + i] == '0')) {
s--;
}
}
}
printf("\n\n Coding mess: ");
for (int i = 0; i < mess; i++) {
if (i < inputmess) {
mes[i] = input[i];
}
printf("%c", mes[i]);
}
}
if (menu == '2')
{
printf("\n\n Encrypted message: ");
for (int i = 0; i < mess; i++)
{
mes[i] = getc(stdin);
clmes[i] = mes[i];
}
rewind(stdin);
int s2 = 0; int bit_error = 0;
while (1 != 0)
{
for (int i = 0; i < mess; i++)
{
mes[i] = clmes[i];
}
char dop_per = clmes[0];
for (int i = 0; i < mess-1; i++)
{
clmes[i] = clmes[i + 1];
}
s2++;
clmes[mess - 1] = dop_per;
s = mess;
int s3 = 0;
for (int i = 0; i < mess; i++)
{
if (mes[i] == '0') { s3++; }
else { break; }
}
s -= s3;
while (s >= checkcode)
{
for (int i = 0; i < checkcode; i++)
{
if (mes[mess - s + i] == check[i])
{
mes[mess - s + i] = '0';
}
else
{
mes[mess - s + i] = '1';
}
}
bool tik = true; int dop_s = s;
for (int i = 0; i < checkcode; i++)
{
if (mes[mess - dop_s + i] == '1') { tik = false; }
if ((tik == true) & (mes[mess - dop_s + i] == '0'))
{
s--;
}
}
}
a = 0;
for (int i = 0; i < mess; i++)
{
if (mes[i] == '1')
{
a++;
bit_error = i;
}
}
if (a == 1)
{
break;
}
if (a == 0)
{
break;
}
}
if (a != 0)
{
if (clmes[bit_error] == '1')
{
clmes[bit_error] = '0';
}
else
{
clmes[bit_error] = '1';
}
}
while (s2 != 0)
{
char dop_per = clmes[mess-1];
for (int i = mess-1; i>0; i--)
{
clmes[i] = clmes[i-1];
}
clmes[0] = dop_per;
s2--;
}
if (a != 0)
{
printf("\n\n %d bit contains an error.", bit_error+1);
}
else
{
printf("\n\n No broken bits.");
}
printf("\n\n Corrected message: ");
for (int i = 0; i < mess; i++)
{
printf("%c", clmes[i]);
}
printf("\n\n Original message: ");
for (int i = 0; i < inputmess; i++)
{
printf("%c", clmes[i]);
}
}
getc(stdin);
system("cls");
}
}