27.02.2017, 21:46 | #1 (permalink) |
Member
Регистрация: 27.02.2017
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Программа шифрования
Программа должна вывести координаты букв слова из матрицы в которой записан русский алфавит, но выводятся какие-то непонятные символы, что я сделал не так( помогите пожалуйста. #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; } |
27.02.2017, 21:46 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Содержимое этих обсуждений может помочь вам решить проблему Нужна информация про алгоритмы шифрования Алгоритмы шифрования Нужна программа для шифрования IP! |
28.02.2017, 12:11 | #2 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
К величайшему моему сожалению на "Сях" не пишу, поэтому для отладки перегнал Ваш код в Паскаль. Вот что у меня получилось после отладки:
Код:
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. Оно? Теперь по поводу ошибок. 1. Символьный массив S должен содержать 49 элементов (считая с 1), или 48, если счет начинать с 0. У Вас - маловато. Ну или можно 36 элементов (от 0 до 35), но тогда массив М должен быть M[5][5] с соответствующей поправкой границ циклов. 2. Несколько ошибок в тройном цикле сопоставления символов пробного слова с символами матрицы: а) первую фигурную скобку нужно сместить на 2 строки вниз, т.е. она должна стоять перед Sif[KS]; б) "else" тут ни к селу, ни к городу, его нужно просто убрать; в) в конце цикла величину KS следует увеличивать не на 1, а на 2. Ну вот как-то так... |
28.02.2017, 19:51 | #3 (permalink) |
Member
Регистрация: 27.02.2017
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Изменил, символьный массив S содержит 48 элементов, сдвинул фигурную скобку на две строки, убрал "else" и в конце цикла KS увеличил на 2, почему-то тоже самое Всякий раз он выводится новая строчка в котрой не изменяется только 00, а дальше бред, похожий на это:
******** Квадрат Полибия (3 метод)! ********* ABCDEFGHIJKLMNOPQRSTUVWXYZ*********** ABCDEF GHIJKL MNOPQR STUVWX YZ**** ****** ZAWITA Координаты слова - 0031F908 |
28.02.2017, 20:02 | #5 (permalink) |
Member
Регистрация: 27.02.2017
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
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; } |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
01.03.2017, 10:00 | #6 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Молодой человек, так дело НЕ ПОЙДЁТ!
Программирование - это не та деятельность, которой можно заниматься по принципу "шаляй-валяй", "так сойдёт", "что-то типо" и т.п. Каждая строка программы, да что там - каждый набиваемый символ должен быть тщательно обдуман и выверен. Не вижу! Во-первых, на кой ляд Вам при матрице 6х6 48 элементов? Почему нельзя по-человечески написать? Например, так: char S[35] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ**********"; Прекрасно! С этим Вы справились. Естественно! Потому что в теле цикла - полная чушь! Надо так: 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; } |
01.03.2017, 22:41 | #7 (permalink) |
Member
Регистрация: 27.02.2017
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Спасибо большое, что помогли разобраться с телом цикла, очень рад что выводятся нормальные числа.
Ещё можете подсказать как вывести их? Не так как в вашем примере, немного по другому, в строку. Я ведь должен при выводе добавить ещё два цикла для i и j чтоб вывелся полноценный код? |
01.03.2017, 23:05 | #8 (permalink) |
Member
Регистрация: 27.02.2017
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Ура, работает=). Сделал вывод на основе того, что вы набрали на паскале. Пожалуйста, вы не могли бы объяснить, для чего мы i умножаем на два, а во втором случае ещё и добавляем единицу, никак не могу понять=(
for (i = 0; i < 6; i++) cout << Sif[2*i] << Sif[2*i+1]; _getch(); return 0; } |
01.03.2017, 23:07 | #9 (permalink) | |
Member
Регистрация: 27.02.2017
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Цитата:
Sif[KS+1] = j; KS = KS + 2; |
|
02.03.2017, 10:52 | #10 (permalink) | ||
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
Цитата:
|
||
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
Опции темы | |
Опции просмотра | |
|
|