Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Неудача с Шифром Цезаря(с ключом), Шифрование. 
:(
    Опции темы
insame
  Дата 13.12.2012, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 13.12.2012

Репутация: нет
Всего: нет



Всем здравствуйте.
Возникла одна проблемка.
Изначально по заданию был "Шифр цезаря".
Программу по шифрованию/дешифрованию написал.

В итоге преподаватель меня обрадовал, сказав что я сделал не тот вариант.
Мое новое задание теперь "Шифр цезаря с ключевым словом".

Вот теперь сижу ломаю голову. Не получается дописать программу.
Вот код:

Код

#include<iostream>
#include <math.h>
using namespace std;
void main()
{

    char alf [31] = {'*','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','_','+','.','?'};
    char alf2 [31]; 
    bool check = true;
    int pos,i = 0;
    int a = 0,b = 0;
    int j;
    char *message = new char[];
    char ch;




    cout<<"Alfavit shifra cezarya\n";
    for ( i = 0; i<31 ; i++)
        cout<<alf[i]<<" ";


    //Vvod

    cout<<"\n\nVvedite soobshenie:"<<endl;
    cin>>message;


    
        cout<<"Enter a 1<=a<=28: "<<endl;
        cin>>a;
        
    
 

    //for ( i = 0; i<31 ; i++)
    //    alf2[i]=alf[(a*(i)+b)%31];

    //shefrovanie 
    i = 0;
    while(message[i] != '\0')
    {    
        // ishem v alfavite
        for( int k = 0; k < 31; k++)
            if (message[i]==alf[k])
            {
                pos = k;
                break;
            }

            
        j = (pos + a) % 31;
        message[i] = alf[j];

        i++;
        
    }

    
    cout<<"\n\n";

    cout<<"soobshenie shifro: "<<message<<endl;

    cout<<"Enter a 1<=a<=28: "<<endl;
        cin>>a;

i =0;
    while(message[i] != '\0')
    {    
        for( int k = 0; k < 31; k++)
        {
            if (message[i]==alf[k])
            {
                pos = k;
                break;
            }

        }

        if((pos - a) < 0)
        {
            j = (31 + (pos - a)) % 31;
        }
        else
            j = (pos - a) % 31;
        
        message[i] = alf[j];

        i++;
        
    }

    cout<<"deshifracia message: "<<message<<endl;
    system("PAUSE");
}



Подскажите. Заранее спасибо.

Это сообщение отредактировал(а) insame - 13.12.2012, 10:19
PM MAIL   Вверх
borisbn
Дата 13.12.2012, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(insame @  13.12.2012,  09:53 Найти цитируемый пост)
 char *message = new char[];

это вообще компилируется ?
не должно. сделайте так
Код
std::string message;

по идее, дальше ничего не меняется

по сути: если я не ошибаюсь, Вам нужно ввести не a, а ключевое слово, а a выбирать из него на каждом цикле.

Лови.. допиливай
Код
#include<iostream>
#include<string>

using namespace std;

int idx_in_alf( char ch, const char * alf, int alf_len )
{
    for ( int i = 0; i < alf_len; i++ )
    {
        if ( alf[ i ] == ch )
        {
            return i;
        }
    }
    return -1;
}

int main()
{
    const int ALF_LEN = 31;
    char alf [ ALF_LEN ] = {'*','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','_','+','.','?'};
    int pos,i = 0;
    int a = 0;
    int j;
    std::string message;
    std::string keyWord;
    //Vvod
    cout<<"\n\nVvedite soobshenie:"<<endl;
    cin>>message;
    
    cout<<"Enter key word: "<<endl;
    cin>>keyWord;

    int keyWordLen = keyWord.length();
 
    //shefrovanie 
    i = 0;
    while(message[i] != '\0')
    {
        a = idx_in_alf( keyWord[ i % keyWordLen ], alf, ALF_LEN );
        if ( a >=0 )
        {
            pos = idx_in_alf( message[ i ], alf, ALF_LEN ); 
            if ( pos >= 0 )
            {
                j = (pos + a) % ALF_LEN;
                message[i] = alf[j];
            }
        }
        i++;
    }
    
    cout<<"\n\n";
    cout<<"soobshenie shifro: "<<message<<endl;

    i = 0;
    while(message[i] != '\0')
    {
        a = idx_in_alf( keyWord[ i % keyWordLen ], alf, ALF_LEN );
        if ( a >= 0 )
        {
            pos = idx_in_alf( message[ i ], alf, ALF_LEN ); 
            if ( pos >= 0 )
            {
                /*if((pos - a) < 0)
                {
                    j = (31 + (pos - a)) % 31;
                }
                else
                    j = (pos - a) % 31;*/
                
                j = (ALF_LEN + (pos - a)) % ALF_LEN;
                
                message[i] = alf[j];
            }
        }
        i++;
    }
    cout<<"deshifracia message: "<<message<<endl;
}


http://liveworkspace.org/code/1ja4dV

Это сообщение отредактировал(а) borisbn - 13.12.2012, 11:23


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
borisbn
Дата 13.12.2012, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



P.S. У Вас в алфавите не хватает как минимум пробела


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
insame
Дата 13.12.2012, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 13.12.2012

Репутация: нет
Всего: нет



borisbn, спасибо большое.
Но... Вы немного не поняли алгоритм шифра цезаря с ключевым словом.
Там а вводит надо все равно, но после ключевого слова.
Там получается что ключевое слово встает в алфавит с k-ого места (т.е. после первой букву шифруешегося сообщения/предложения), потом идет шифрование со смещение по новому алфавиту.

Цитата

Цитата(insame @  13.12.2012,  09:53 )
 char *message = new char[];

это вообще компилируется ?
не должно. сделайте так


Компилируется. Ошибок или предупреждений не выдает.
А в чем разница, поясните пожалуйста.

Цитата

P.S. У Вас в алфавите не хватает как минимум пробела 


Точно. Но в принципе не столь важно. Спасибо за напоминание.
PM MAIL   Вверх
borisbn
Дата 13.12.2012, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(insame @  13.12.2012,  12:24 Найти цитируемый пост)
 Вы немного не поняли алгоритм шифра цезаря с ключевым словом

может и не понял, но, как мне кажется, это (разобраться в алгоритме) - Ваша задача  smile Здесь же Вам помогут с Си++  smile 

Цитата(insame @  13.12.2012,  12:24 Найти цитируемый пост)
Компилируется. Ошибок или предупреждений не выдает.

сколько вешать в граммах (С)
в смысле - сколько памяти Вы требуете выделить у оператора new ?

Цитата(insame @  13.12.2012,  12:24 Найти цитируемый пост)
А в чем разница, поясните пожалуйста.

разница в том, что std::string - это класс, инкапсулирующий работу со строками (в Вашем случае - выделение и освобождение памяти под символы, ввод строки из std::cin и получение i-го элемента посредством оператора []), а char * - это просто указатель, а не строка.



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
insame
Дата 13.12.2012, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 13.12.2012

Репутация: нет
Всего: нет



Цитата

Цитата(insame @  13.12.2012,  12:24 )
А в чем разница, поясните пожалуйста.

разница в том, что std::string - это класс, инкапсулирующий работу со строками (в Вашем случае - выделение и освобождение памяти под символы, ввод строки из std::cin и получение i-го элемента посредством оператора []), а char * - это просто указатель, а не строка.

Спасибо за объяснение.

Цитата

Цитата(insame @  13.12.2012,  12:24 )
 Вы немного не поняли алгоритм шифра цезаря с ключевым словом

может и не понял, но, как мне кажется, это (разобраться в алгоритме) - Ваша задача   Здесь же Вам помогут с Си++   

Тут вы правы. В алгоритме я разобрался.

Получается нужно из одного массива (alf - начальный алфавит без ключа) сделать новый массив (alf2 - конечный алфавит с ключевым словом), по которому будет производиться сдвиг на k-ое число.
Я не понимаю как программно на С++ реализовать это.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0501 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.