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


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

Спасибо вам ОГРОМНОЕ. Вы мне очень сильно помогли. Без вас бы я не справился.
Хочу спросить ещё. Можно ли как-нибудь написать вам в личку при возникновении подобных проблем, просто большинство того что говорят в университете непонятно, вот и приходится "самому разбираться".
noo123 вне форума   Ответить с цитированием

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

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

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

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

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



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

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

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

cout << Sif[i] << Sif[i+1] << endl;
то выводятся совсем другие числа, так что это вряд ли для красоты))) или я ошибаюсь?
noo123 вне форума   Ответить с цитированием
Старый 02.03.2017, 13:59   #13 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от noo123 Посмотреть сообщение
Просто, если я изменяю на : cout << Sif[i] << Sif[i+1] << endl; то выводятся совсем другие числа, так что это вряд ли для красоты))) или я ошибаюсь?
Да оставьте Вы это место, как было с самого начала:
cout << "Координаты слова - " << Sif << endl;
да и всё!
Vladimir_S вне форума   Ответить с цитированием
Старый 02.03.2017, 17:58   #14 (permalink)
noo123
Member
 
Регистрация: 27.02.2017
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Если оставляю так, выводится чушь=)

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;
}
for (i = 0; i < 6; i++)
cout << "Координаты слова - " << Sif << endl;

;

_getch();
return 0;

}

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

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


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

ЗАЩИТА
Координаты слова - 0044F904
Координаты слова - 0044F904
Координаты слова - 0044F904
Координаты слова - 0044F904
Координаты слова - 0044F904
Координаты слова - 0044F904
noo123 вне форума   Ответить с цитированием
Старый 02.03.2017, 19:33   #15 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Дайте листинг целиком.
Пока не вижу, в чем ошибка.
Единственное - цикл
for (i = 0; i < 6; i++)
перед строкой cout << ...
не нужен. Уберите.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 03.03.2017, 09:33   #16 (permalink)
noo123
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[37] = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ***";
char sym[50] = "ЗАЩИТА";
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+1] = j;
KS = KS + 2;
}

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

_getch();
return 0;

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

Цитата:
Сообщение от noo123 Посмотреть сообщение
#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[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+1] = j;
KS = KS + 2;
}

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

_getch();
return 0;

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

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


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

ЗАЩИТА
Координаты слова - 003AF540
noo123 вне форума   Ответить с цитированием
Старый 03.03.2017, 09:54   #18 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

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

Хотя нет, первый пункт отменяется: увидел в начале программы это обнуление KS.
Vladimir_S вне форума   Ответить с цитированием
Старый 03.03.2017, 14:56   #19 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Ну что я могу сказать?
Еще раз переписал Вашу программу на Паскаль - буквально построчно. Чтобы сохранить СИ-шную нумерацию от 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

Как видите, всё правильно.
Даже и не ведаю - и чего она у Вас фордыбачит? Возможно, какие-то тонкости языка СИ, которых я попросту не знаю.
Vladimir_S вне форума   Ответить с цитированием
Старый 03.03.2017, 15:59   #20 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

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

Яндекс

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


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

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




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

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