Форум программистов, компьютерный форум CyberForum.ru

Шифровка табличной заменой - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Виртуальные функции http://www.cyberforum.ru/cpp-beginners/thread144550.html
Объясните пожалуйста зачем нужны чисто виртуальные функции?
C++ встроенные функции (inline) скажите что значит встроенные функции? не пойму. class a { int x,y; public: void get_x(int i,int j) //как я понимаю это встроенная функция, а тогда что такое inline функция? { x = i; y = j; http://www.cyberforum.ru/cpp-beginners/thread144549.html
Вычислить биссектрисы треугольника C++
Составить программу, которая вычисляет биссектрисы треугольника со сторонами а, b, с по формулам:
C++ очень нужно решить на с++
1)Найти периметр и площадь равнобедренной трапеции с основаниями a и b (a > b) и углом α при большем основании 2)Из трех данных чисел выбрать наименьшее и наибольшее и посчитать их разницу и среднее арифметическое. 3)Найти сумму четных чисел и произведение нечетных от 1 до n. 4)Найти сумму ряда с точностью e=10-4, общий член которого an=10n/n! 5)Найдите номер первого члена последовательности...
C++ Нахождение наибольшего общего делителя двух натуральных чисел http://www.cyberforum.ru/cpp-beginners/thread144527.html
1)Используя функцию NOD нахождения наибольшего общего делителя двух натуральных чисел, сократить данную обычную дробь M / N. / / Возвращать наибольший общий делитель двух чисел int NOD(int vl, int v2) { while (v2) { int temp=v2; v2=vl%v2; vl=temp;
C++ Процедуры и функции Дали задание составить программу с использованием процедур и функций на С++ (я понятия не имею как её сделать) http://godday.ucoz.ru/tty.jpg вот сама формула по которой надо сделать программу, кто шарит помогите! подробнее

Показать сообщение отдельно
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
22.07.2010, 13:59     Шифровка табличной заменой
Вот с помощью классов:
cipher.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef CIPHER_H
#define CIPHER_H
 
#include <string>
#include <map>
 
class cipher
{
public:
    cipher(char start = alphaStart, char end = alphaEnd);
    ~cipher() {}
    void encrypt(const std::string& str, std::string& result) const;
    void decrypt(const std::string& str, std::string& result) const;
private:
    std::map<char, char> encryptionMap;
    std::map<char, char> decryptionMap;
    const static char alphaStart = 'a';
    const static char alphaEnd = 'z';
};
 
#endif //CIPHER_H
cipher.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include "cipher.h"
#include <vector>
 
cipher::cipher(char start, char end)
{
    if(end<=start)
        throw(std::exception("Incorrect alphabetic range"));
    size_t lettersCount = end - start + 1;
    std::vector<char> alph(lettersCount);
    for(size_t i = 0; i < lettersCount; ++i)
        alph[i] = start + i;
    size_t it = 0;
    while(lettersCount)
    {
        int ch = rand() % lettersCount;
        encryptionMap[start + it] = alph[ch];
        decryptionMap[ alph[ch] ] = start + it;
        alph.erase(alph.begin() + ch);
        ++it;
        --lettersCount;
    }
    encryptionMap[' '] = ' ';
    decryptionMap[' '] = ' ';
}
 
void cipher::encrypt(const std::string& str, std::string& result) const
{
    result.resize(str.size());
    for(size_t i = 0; i < str.size(); ++i)
        result[i] = encryptionMap.at( str[i] );
}
 
void cipher::decrypt(const std::string& str, std::string& result) const
{
    result.resize(str.size());
    for(size_t i = 0; i < str.size(); ++i)
        result[i] = decryptionMap.at( str[i] );
}
main.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <string>
#include <ctime>
#include "cipher.h"
 
int main()
{
    try
    {
        srand(static_cast<unsigned int>(time(NULL)));
        std::string str("a string for encryption");
        //Создаем таблицу шифровки/дешифровки для алфавита 'a'-'z'
        cipher c1;
        std::string encryptedString;
        std::string decryptedString;
        c1.encrypt(str, encryptedString);
        c1.decrypt(encryptedString, decryptedString);
        std::cout << "Initial text:\n\t\"" << str << "\"" << std::endl;
        std::cout << "Encrypted text:\n\t\"" << encryptedString << "\"" << std::endl;
        std::cout << "Decrypted text:\n\t\"" << decryptedString << "\"" << std::endl;
        std::cout << "Initital text is equal to decrypted text? " << std::boolalpha << (str == decryptedString) << std::endl;
    }
    catch(std::exception& e)
    {
        std::cerr << e.what() << std::endl;
        system("pause");
        return EXIT_FAILURE;
    }
    system("pause");
    return EXIT_SUCCESS;
}
Каждый элемент класса cipher создает случайные таблицы шифровки/дешифровки. Конструктор принимает два символа, задающих начало и конец алфавитного диапазона, для которого создается шифр. Диапазон по умолчанию: 'a'-'z'. Пробел соответствует самому себе. Регистр символов имеет значение.

Метод encrypt (decrypt) принимает ссылку на строку, которую нужно зашифровать (расшифровать), и ссылку на строку, которая будет хранить результат.

Если исходная строка будет содержать символы, которых нет в таблице, то в процессе шифровки произойдет ошибка. Если алфавитный диапазон, задающий шифр, будет содержать символ пробела, то программа будет работать неправильно
 
Текущее время: 03:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru