Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 27.02.2017, 21:46   #1 (permalink)
noo123
Member
 
Регистрация: 27.02.2017
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Программа шифрования

Помогите пожалуйста, не могу найти ошибку. Пишу на 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;

}
noo123 вне форума   Ответить с цитированием

Старый 27.02.2017, 21:46
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Содержимое этих обсуждений может помочь вам решить проблему

Нужна информация про алгоритмы шифрования
Алгоритмы шифрования
Нужна программа для шифрования IP!

Старый 28.02.2017, 12:11   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от noo123 Посмотреть сообщение
что я сделал не так( помогите пожалуйста.
К величайшему моему сожалению на "Сях" не пишу, поэтому для отладки перегнал Ваш код в Паскаль. Вот что у меня получилось после отладки:
Код:
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.
А вот результат работы программы:
aa_001.png

Оно?

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

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

Ну вот как-то так...
Vladimir_S вне форума   Ответить с цитированием
Старый 28.02.2017, 19:51   #3 (permalink)
noo123
Member
 
Регистрация: 27.02.2017
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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

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

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


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

ZAWITA

Координаты слова - 0031F908
noo123 вне форума   Ответить с цитированием
Старый 28.02.2017, 19:58   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от noo123 Посмотреть сообщение
Изменил, символьный массив S содержит 48 элементов, сдвинул фигурную скобку на две строки, убрал "else" и в конце цикла KS увеличил на 2
Выложите новый код, пожалуйста.
Vladimir_S вне форума   Ответить с цитированием
Старый 28.02.2017, 20:02   #5 (permalink)
noo123
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;

}
noo123 вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 01.03.2017, 10:00   #6 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Молодой человек, так дело НЕ ПОЙДЁТ!
Программирование - это не та деятельность, которой можно заниматься по принципу "шаляй-валяй", "так сойдёт", "что-то типо" и т.п. Каждая строка программы, да что там - каждый набиваемый символ должен быть тщательно обдуман и выверен.
Цитата:
Сообщение от noo123 Посмотреть сообщение
Изменил, символьный массив S содержит 48 элементов
Не вижу! Во-первых, на кой ляд Вам при матрице 6х6 48 элементов? Почему нельзя по-человечески написать? Например, так:
char S[35] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ**********";
Цитата:
Сообщение от noo123 Посмотреть сообщение
сдвинул фигурную скобку на две строки, убрал "else"
Прекрасно! С этим Вы справились.
Цитата:
Сообщение от noo123 Посмотреть сообщение
и в конце цикла 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;
}
Vladimir_S вне форума   Ответить с цитированием
Старый 01.03.2017, 22:41   #7 (permalink)
noo123
Member
 
Регистрация: 27.02.2017
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Спасибо большое, что помогли разобраться с телом цикла, очень рад что выводятся нормальные числа.
Ещё можете подсказать как вывести их? Не так как в вашем примере, немного по другому, в строку. Я ведь должен при выводе добавить ещё два цикла для i и j чтоб вывелся полноценный код?
noo123 вне форума   Ответить с цитированием
Старый 01.03.2017, 23:05   #8 (permalink)
noo123
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;

}
noo123 вне форума   Ответить с цитированием
Старый 01.03.2017, 23:07   #9 (permalink)
noo123
Member
 
Регистрация: 27.02.2017
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от noo123 Посмотреть сообщение
Ура, работает=). Сделал вывод на основе того, что вы набрали на паскале. Пожалуйста, вы не могли бы объяснить, для чего мы 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;
noo123 вне форума   Ответить с цитированием
Старый 02.03.2017, 10:52   #10 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от noo123 Посмотреть сообщение
Ещё можете подсказать как вывести их? Не так как в вашем примере, немного по другому, в строку.
Да как у Вас было сделано, так и оставить. Просто вывести массив Sif. Можно цифры пробелами разделить, чтобы красивее было.
Цитата:
Сообщение от noo123 Посмотреть сообщение
Пожалуйста, вы не могли бы объяснить, для чего мы i умножаем на два, а во втором случае ещё и добавляем единицу, никак не могу понять=(
Да просто чтобы они выводились попарно и в столбик: в каждой строке номер строки и столбца очередного символа. Вам это не обязательно, можно, как я написал выше, просто гнать их в одну строку. Это уж я так, "шоб красивше".
Цитата:
Сообщение от noo123 Посмотреть сообщение
И ещё не совсем понятно как работают строчки
Sif[KS+1] = j;
KS = KS + 2;
Это работает так. Допустим, мы нашли в матрице символ, соответствующий очередной букве слова. Пусть он находится в i-той строке и в j-том столбце матрицы. Мы должны занести значения i и j в массив Sif. Пусть i станет элементом массива Sif с номером KS. Тогда j должен стать элементом с номером KS+1. А для "приёма" в массив KS номеров строки и столбца следующей буквы слова мы должны сдвинуться на две позиции, т.е. новое значение i запишется в элемент массива Sif с номером KS+2. И т.д.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.