• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Программа шифрования

  • Автор темы Автор темы noo123
  • Дата начала Дата начала

noo123

Новые
Регистрация
27 Фев 2017
Сообщения
12
Реакции
0
Баллы
0
Программа шифрования

Помогите пожалуйста, не могу найти ошибку. Пишу на 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[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[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[j])
Sif[KS] = i;
else Sif[KS+1] = j;
KS++;
}
cout << endl;
cout << "Координаты слова - " << Sif << endl;


_getch();
return 0;

}
 
что я сделал не так( помогите пожалуйста.
К величайшему моему сожалению на "Сях" не пишу, поэтому для отладки перегнал Ваш код в Паскаль. Вот что у меня получилось после отладки:
Код:
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.webp

Оно?

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

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

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

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

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


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

ZAWITA

Координаты слова - 0031F908
 
Изменил, символьный массив S содержит 48 элементов, сдвинул фигурную скобку на две строки, убрал "else" и в конце цикла KS увеличил на 2
Выложите новый код, пожалуйста.
 
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[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[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[j])
{Sif[KS] = i;
Sif[KS+2] = j;
KS++;
}
cout << endl;

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


_getch();
return 0;

}
 
Молодой человек, так дело НЕ ПОЙДЁТ!
Программирование - это не та деятельность, которой можно заниматься по принципу "шаляй-валяй", "так сойдёт", "что-то типо" и т.п. Каждая строка программы, да что там - каждый набиваемый символ должен быть тщательно обдуман и выверен.
Изменил, символьный массив S содержит 48 элементов
Не вижу! Во-первых, на кой ляд Вам при матрице 6х6 48 элементов? Почему нельзя по-человечески написать? Например, так:
char S[35] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ**********";
сдвинул фигурную скобку на две строки, убрал "else"
Прекрасно! С этим Вы справились.
и в конце цикла KS увеличил на 2, почему-то тоже самое
Естественно! Потому что в теле цикла - полная чушь! Надо так:
for (k = 0; k < 50; k++)
for (i = 0; i < 6; i++)
for (j = 0; j < 6; j++)
if (sym[k] == M[j])
{Sif[KS] = i;
Sif[KS+1] = j;
KS = KS + 2;
}
 
Спасибо большое, что помогли разобраться с телом цикла, очень рад что выводятся нормальные числа.
Ещё можете подсказать как вывести их? Не так как в вашем примере, немного по другому, в строку. Я ведь должен при выводе добавить ещё два цикла для i и j чтоб вывелся полноценный код?
 
Ура, работает=). Сделал вывод на основе того, что вы набрали на паскале. Пожалуйста, вы не могли бы объяснить, для чего мы i умножаем на два, а во втором случае ещё и добавляем единицу, никак не могу понять=(




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

_getch();
return 0;

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



То есть, я могу не умножать i на 2?

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

Просто, если я изменяю на :

cout << Sif << Sif[i+1] << endl;
то выводятся совсем другие числа, так что это вряд ли для красоты))) или я ошибаюсь?
 
Просто, если я изменяю на : cout << Sif << Sif[i+1] << endl; то выводятся совсем другие числа, так что это вряд ли для красоты))) или я ошибаюсь?
Да оставьте Вы это место, как было с самого начала:
cout << "Координаты слова - " << Sif << endl;
да и всё!
 
Если оставляю так, выводится чушь=)

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

;

_getch();
return 0;

}

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

АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ***


АБВГДЕ
ЁЖЗИЙК
ЛМНОПР
СТУФХЦ
ЧШЩЪЫЬ
ЭЮЯ***

ЗАЩИТА
Координаты слова - 0044F904
Координаты слова - 0044F904
Координаты слова - 0044F904
Координаты слова - 0044F904
Координаты слова - 0044F904
Координаты слова - 0044F904
 
Дайте листинг целиком.
Пока не вижу, в чем ошибка.
Единственное - цикл
for (i = 0; i < 6; i++)
перед строкой cout << ...
не нужен. Уберите.
 
#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[37] = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ***";
char sym[50] = "ЗАЩИТА";
for (i = 0; i < 6; i++)
for (j = 0; j < 6; j++)
{
M[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[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[j])
{Sif[KS] = i;
Sif[KS+1] = j;
KS = KS + 2;
}

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

_getch();
return 0;

}
 
#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[37] = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ***";
char sym[50] = "ЗАЩИТА";
for (i = 0; i < 6; i++)
for (j = 0; j < 6; j++)
{
M[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[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[j])
{Sif[KS] = i;
Sif[KS+1] = j;
KS = KS + 2;
}

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

_getch();
return 0;

}

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

АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ***


АБВГДЕ
ЁЖЗИЙК
ЛМНОПР
СТУФХЦ
ЧШЩЪЫЬ
ЭЮЯ***

ЗАЩИТА
Координаты слова - 003AF540
 
Прямо даже и не знаю... Я уже говорил, что СИ практически не владею, к сожалению.
На первый взгляд всё правильно. Ошибок не вижу.
В порядке бреда:
1. Подумал, вдруг транслятор не обнуляет переменные по умолчанию? Попробуйте перед тройным циклом поставить
KS = 0;
2. Вернитесь к латинице. Вроде с ней программа работала? Если так, значит какие-то задвиги с кодировками кириллицы.

Хотя нет, первый пункт отменяется: увидел в начале программы это обнуление KS.
 
Ну что я могу сказать?
Еще раз переписал Вашу программу на Паскаль - буквально построчно. Чтобы сохранить СИ-шную нумерацию от 0, вместо строк (в Паскале их элементы нумеруются с 1) использовал символьные массивы. Еще ограничил длины массивов S, Sym и Sif требуемыми числами, т.е. "без запаса". Таким образом, S идёт от 0 до 35, Sym от 0 до 5 и Sif от 0 до 11. Пожалуй, и вся разница.
Код:
Const
 S:Array[0..35] of Char=('А','Б','В','Г','Д','Е','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С',
                         'Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ы','Ь','Э','Ю','Я','*','*','*','*');
 Sym:Array[0..5] of Char=('З','А','Щ','И','Т','А');

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

Begin
 Writeln('******** Квадрат Полибия (3 метод)! *********');
 k:=0;
 KS:=0;
 for i:=0 to 5 do
  for j:=0 to 5 do
   begin
    M[i][j]:=S[K];
    k:=k+1;
   end;
 Writeln;
 for k:=0 to 35 do Write(S[k]);
 Writeln;
 for i:=0 to 5 do
  begin
   for j:=0 to 5 do Write(M[i][j]+' ');
   Writeln;
  end;
 Writeln;

 for k:=0 to 5 do Write(Sym[k]);
 Writeln;

 for k:=0 to 5 do
  for i:=0 to 5 do
   for j:=0 to 5 do
    if Sym[k]=M[i][j] then
     begin
      Sif[KS]:=i;
      Sif[KS+1]:=j;
      KS:=KS+2;
     end;

 Write('Координаты слова - ');
 for KS:=0 to 11 do write(Sif[KS]);
 Readln
End.

Результат работы программы:
polib_2_000.png.webp

Как видите, всё правильно.
Даже и не ведаю - и чего она у Вас фордыбачит? Возможно, какие-то тонкости языка СИ, которых я попросту не знаю. tehno015
 
Возможно, какие-то тонкости языка СИ, которых я попросту не знаю.
Ну так и есть! Изучите правила употребления оператора cout. Как я понял, при выводе массивов так, как это сделано у Вас:
cout << "Координаты слова - " << Sif << endl;
он при выводит не сами элементы, а их шестнадцатеричные адреса, что мы и наблюдаем. А вот чтобы вывести сами элементы массива, придется организовать цикл и выводить последовательно Sif[KS].
 
Назад
Сверху