Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Программа шифрования (http://www.tehnari.ru/f41/t252377/)

noo123 27.02.2017 21:46

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

Программа должна вывести координаты букв слова из матрицы в которой записан русский алфавит, но выводятся какие-то непонятные символы, что я сделал не так( помогите пожалуйста.

#include <iostream>
#include <cmath>
#include <conio.h>
#include <string>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
cout << "******** Квадрат Полибия (3 метод)! *********" << endl;
char M[6][6], K = 0;
int i, j, k=0, KS = 0;
int Sif[100];
char S[38] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ***********";
char sym[50] = "ZAWITA";
for (i = 0; i < 6; i++)
for (j = 0; j < 6; j++)
{
M[i][j] = S[K];
K++;
}
cout << endl;
cout << S << endl;
cout << endl;
for (i = 0; i < 6; i++)
{
cout << endl;
for (j = 0; j < 6; j++)
cout << M[i][j];
}
cout << endl;
cout << endl;
cout << sym << endl;

for (k = 0; k < 50; k++)
for (i = 0; i < 6; i++)
{for (j = 0; j < 6; j++)
if (sym[k] == M[i][j])
Sif[KS] = i;
else Sif[KS+1] = j;
KS++;
}
cout << endl;
cout << "Координаты слова - " << Sif << endl;


_getch();
return 0;

}

Vladimir_S 28.02.2017 12:11

Вложений: 1
Цитата:

Сообщение от noo123 (Сообщение 2465148)
что я сделал не так( помогите пожалуйста.

К величайшему моему сожалению на "Сях" не пишу, поэтому для отладки перегнал Ваш код в Паскаль. Вот что у меня получилось после отладки:
Код:

Const
 S:String[49] = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ***********************';
 Sym:String[50] = 'ZAWITA';

Var
 M:Array[0..6,0..6] of Char;
 i,j,k,KS: Integer;
 Sif:Array[0..100] of Integer;

Begin
 k:=0;
 for i:=0 to 6 do
  for j:=0 to 6 do
  begin
    M[i][j]:=S[k+1];
    Inc(k);
  end;
 for i:=0 to 6 do
  begin
  for j:=0 to 6 do write(M[i][j]+' ');
  writeln;
  end;

 Writeln;
 KS:=0;
 for k:=0 to 49 do
  for i:=0 to 6 do
  for j:=0 to 6 do
    if Sym[k+1]=M[i][j] then
    begin
      Sif[KS]:=i;
      Sif[KS+1]:=j;
      Inc(KS,2);
    end;

 Dec(KS,2);

 Writeln(Sym+' letter coordinates - ');
 for i:=0 to (KS div 2) do
  writeln(Sif[2*i],'; ',Sif[2*i+1]);

 Readln
End.

А вот результат работы программы:
Вложение 336280

Оно?

Теперь по поводу ошибок.

1. Символьный массив S должен содержать 49 элементов (считая с 1), или 48, если счет начинать с 0. У Вас - маловато. Ну или можно 36 элементов (от 0 до 35), но тогда массив М должен быть M[5][5] с соответствующей поправкой границ циклов.
2. Несколько ошибок в тройном цикле сопоставления символов пробного слова с символами матрицы:
а) первую фигурную скобку нужно сместить на 2 строки вниз, т.е. она должна стоять перед Sif[KS];
б) "else" тут ни к селу, ни к городу, его нужно просто убрать;
в) в конце цикла величину KS следует увеличивать не на 1, а на 2.

Ну вот как-то так...

noo123 28.02.2017 19:51

Изменил, символьный массив S содержит 48 элементов, сдвинул фигурную скобку на две строки, убрал "else" и в конце цикла KS увеличил на 2, почему-то тоже самое :( Всякий раз он выводится новая строчка в котрой не изменяется только 00, а дальше бред, похожий на это:

******** Квадрат Полибия (3 метод)! *********

ABCDEFGHIJKLMNOPQRSTUVWXYZ***********


ABCDEF
GHIJKL
MNOPQR
STUVWX
YZ****
******

ZAWITA

Координаты слова - 0031F908

Vladimir_S 28.02.2017 19:58

Цитата:

Сообщение от noo123 (Сообщение 2465402)
Изменил, символьный массив S содержит 48 элементов, сдвинул фигурную скобку на две строки, убрал "else" и в конце цикла KS увеличил на 2

Выложите новый код, пожалуйста.

noo123 28.02.2017 20:02

int main()
{
setlocale(LC_ALL, "Russian");
cout << "******** Квадрат Полибия (3 метод)! *********" << endl;
char M[6][6], K = 0;
int i, j, k=0, KS = 0;
int Sif[100];
char S[48] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ***********";
char sym[50] = "ZAWITA";
for (i = 0; i < 6; i++)
for (j = 0; j < 6; j++)
{
M[i][j] = S[K];
K++;
}
cout << endl;
cout << S << endl;
cout << endl;
for (i = 0; i < 6; i++)
{
cout << endl;
for (j = 0; j < 6; j++)
cout << M[i][j];
}
cout << endl;
cout << endl;
cout << sym << endl;

for (k = 0; k < 50; k++)
for (i = 0; i < 6; i++)
for (j = 0; j < 6; j++)
if (sym[k] == M[i][j])
{Sif[KS] = i;
Sif[KS+2] = j;
KS++;
}
cout << endl;

cout << "Координаты слова - " << Sif << endl;


_getch();
return 0;

}

Vladimir_S 01.03.2017 10:00

Молодой человек, так дело НЕ ПОЙДЁТ!
Программирование - это не та деятельность, которой можно заниматься по принципу "шаляй-валяй", "так сойдёт", "что-то типо" и т.п. Каждая строка программы, да что там - каждый набиваемый символ должен быть тщательно обдуман и выверен.
Цитата:

Сообщение от noo123 (Сообщение 2465402)
Изменил, символьный массив S содержит 48 элементов

Не вижу! Во-первых, на кой ляд Вам при матрице 6х6 48 элементов? Почему нельзя по-человечески написать? Например, так:
char S[35] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ**********";
Цитата:

Сообщение от noo123 (Сообщение 2465402)
сдвинул фигурную скобку на две строки, убрал "else"

Прекрасно! С этим Вы справились.
Цитата:

Сообщение от noo123 (Сообщение 2465402)
и в конце цикла KS увеличил на 2, почему-то тоже самое

Естественно! Потому что в теле цикла - полная чушь! Надо так:
for (k = 0; k < 50; k++)
for (i = 0; i < 6; i++)
for (j = 0; j < 6; j++)
if (sym[k] == M[i][j])
{Sif[KS] = i;
Sif[KS+1] = j;
KS = KS + 2;
}

noo123 01.03.2017 22:41

Спасибо большое, что помогли разобраться с телом цикла, очень рад что выводятся нормальные числа.
Ещё можете подсказать как вывести их? Не так как в вашем примере, немного по другому, в строку. Я ведь должен при выводе добавить ещё два цикла для i и j чтоб вывелся полноценный код?

noo123 01.03.2017 23:05

Ура, работает=). Сделал вывод на основе того, что вы набрали на паскале. Пожалуйста, вы не могли бы объяснить, для чего мы i умножаем на два, а во втором случае ещё и добавляем единицу, никак не могу понять=(




for (i = 0; i < 6; i++)
cout << Sif[2*i] << Sif[2*i+1];

_getch();
return 0;

}

noo123 01.03.2017 23:07

Цитата:

Сообщение от noo123 (Сообщение 2465706)
Ура, работает=). Сделал вывод на основе того, что вы набрали на паскале. Пожалуйста, вы не могли бы объяснить, для чего мы i умножаем на два, а во втором случае ещё и добавляем единицу, никак не могу понять=(




for (i = 0; i < 6; i++)
cout << Sif[2*i] << Sif[2*i+1];

_getch();
return 0;

}

И ещё не совсем понятно как работают строчки

Sif[KS+1] = j;
KS = KS + 2;

Vladimir_S 02.03.2017 10:52

Цитата:

Сообщение от noo123 (Сообщение 2465697)
Ещё можете подсказать как вывести их? Не так как в вашем примере, немного по другому, в строку.

Да как у Вас было сделано, так и оставить. Просто вывести массив Sif. Можно цифры пробелами разделить, чтобы красивее было.
Цитата:

Сообщение от noo123 (Сообщение 2465706)
Пожалуйста, вы не могли бы объяснить, для чего мы i умножаем на два, а во втором случае ещё и добавляем единицу, никак не могу понять=(

Да просто чтобы они выводились попарно и в столбик: в каждой строке номер строки и столбца очередного символа. Вам это не обязательно, можно, как я написал выше, просто гнать их в одну строку. Это уж я так, "шоб красивше".
Цитата:

Сообщение от noo123 (Сообщение 2465708)
И ещё не совсем понятно как работают строчки
Sif[KS+1] = j;
KS = KS + 2;

Это работает так. Допустим, мы нашли в матрице символ, соответствующий очередной букве слова. Пусть он находится в i-той строке и в j-том столбце матрицы. Мы должны занести значения i и j в массив Sif. Пусть i станет элементом массива Sif с номером KS. Тогда j должен стать элементом с номером KS+1. А для "приёма" в массив KS номеров строки и столбца следующей буквы слова мы должны сдвинуться на две позиции, т.е. новое значение i запишется в элемент массива Sif с номером KS+2. И т.д.


Часовой пояс GMT +4, время: 10:52.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.