Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
62 / 62 / 39
Регистрация: 18.11.2016
Сообщений: 561
1

Поразрядные операторы + небольшая шифропрограммка

19.02.2017, 18:48. Просмотров 824. Ответов 7
Метки нет (Все метки)

Начинаю изучать поразрядные операторы (и, или, исключающее или, не).
В принципе все понятно, но при написании небольшой (детской) шифровальной программки столкнулся проблемой, а именно, как создать новое константное значение?
C++
1
2
3
4
int K = strlen (str);
const int *num = new const int (K);
char pass [*num];
// Не работает вообще.
Сам код программки:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <iostream>
#include <cstdlib>
#include <Windows.h>
 
 
    void bitone(int k){
        // Логическое "И". Если два аргумента равны единице, бит = 1, в остальных случаях 0.
        std::cout << std::endl << "bit &: ";
        for (int i(128); i > 0; i = i/2){
            if (i & k) 
                std::cout << "1";
            else
                std::cout << "0";
        }
    }
    
    void bittwo (int k){
        // Логическое "ИЛИ". Если один из аргументов равен единице, бит = 1, в остальных случаях 0.
        std::cout << std::endl << "bit |: ";
        for (int i(128); i > 0; i = i/2){
            if (i | k) 
                std::cout << "1";
            else
                std::cout << "0";
        }
 
    }
 
    void bittree (int k){
        // Логическое "ИНВЕРСИЯ", меняет значения аргументов на противоположные.
        std::cout << std::endl << "bit ~: ";
        for (int i(128); i > 0; i = i/2){
            if (i & k) 
                std::cout << "1";
            else
                std::cout << "0";
        }
 
    }
 
    void bitfour (int k){
        // Логическое "ИСКЛЮЧАЮЩЕЕ ИЛИ", если два аргумента равны друг-другу, бит = 0, в остальных случаях 1.
        int j = 77;
        k = k ^ j; // В данном случае сравниваем биты.
        std::cout << std::endl << "bit ^: ";
        for (int i(128); i > 0; i = i/2){
            if (i & k) 
                std::cout << "1";
            else
                std::cout << "0";
        }
 
    }
 
    int main (){
        
        int K = 77; 
 
        bitone(K); // Логическое "И".
        bittwo(K); // Логическое "ИЛИ".
        bittree(~K); // Логическое "ИНВЕРСИЯ".
        bitfour(K); // Логическое "ИСКЛЮЧАЮЩЕЕ ИЛИ".
 
        std::cout << std::endl << " ----------" << std::endl;
 
        char str [] = "Hello this beautiful world";
        char symbols [] = "0123456789";
        char password [26];
 
        std::cout << "stroke: " << str << std::endl;
 
        std::cout << "coder: ";
        for (int i(0); str[i]; i++){
            password[i] = symbols[rand()%10];
            str[i] = str[i] ^ password[i];
            std::cout << str[i];
        }   std::cout<<std::endl;
 
        std::cout << "random: ";
        for (int i(0); str[i]; i++){
            std::cout << password[i];
        }std::cout<< std::endl;
 
        std::cout << "uncoder: ";
 
        for (int i(0); str[i]; i++){
            str[i] = password[i] ^ str[i];
            std::cout << str[i];
        }
 
 
        std::cout << std::endl;
        system ("pause");
        return 0;
 
    }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.02.2017, 18:48
Ответы с готовыми решениями:

Поразрядные операторы,операторы сдвига
#include&lt;iostream&gt; using namespace std; int bitcount(unsigned x) { int b;...

Поразрядные операторы
Здравствуйте, объясните мне практическую ценность поразрядных операторов, не могу понять, зачем они...

Поразрядные операторы сдвига
Всем хорошо известно, что поразрядные операторы сдвига &gt;&gt; и &lt;&lt; сдвигают все биты переменной вправо...

С++.Операторы в С++: условные операторы, операторы break и continue
Выяснить, пересекаются ли параболы у=аx2+bx+с и у=dx2+ex + f. При положительном ответе найти точки...

7
130 / 156 / 87
Регистрация: 06.04.2016
Сообщений: 992
19.02.2017, 19:03 2
Цитата Сообщение от Photofenix Посмотреть сообщение
const int *num = new const int (K);
- что означает эта строка?
0
22 / 22 / 7
Регистрация: 01.02.2017
Сообщений: 54
Записей в блоге: 1
19.02.2017, 19:04 3
Лучший ответ Сообщение было отмечено Photofenix как решение

Решение

Смысл константы в том, что её значение известно компилятору во время компиляции. Значение 'K' у тебя во время компиляции неизвестно.
C++
1
2
const char cstr[] = "Стровокая константа";
const int *pc = new const int(sizeof cstr);
1
62 / 62 / 39
Регистрация: 18.11.2016
Сообщений: 561
19.02.2017, 19:49  [ТС] 4
Исправил код, но компилятор ругается на то, что значение должно быть константным.
C++
1
2
3
4
        char str [] = "Hello this beautiful world";
        const char symbols [] = "0123456789";
        const int *num = new const int (sizeof(symbols));
        char password [*num];
0
1118 / 931 / 429
Регистрация: 25.12.2016
Сообщений: 3,030
19.02.2017, 20:19 5
Лучший ответ Сообщение было отмечено Photofenix как решение

Решение

1) Не совсем понятен смысл переменной num. Если она должна быть равна числовому выражению строки symbols, то нужно сделать преобразование string -> int. В С++11 это можно сделать так:
C++
1
int num = std::stoi(symbols);
2) Размер массива должен быть не просто константой, а константой, известной во время компиляции. Если это не так, то создать статический массив не получится, но можно создать динамический массив: char *pass = new char[длина массива].
1
62 / 62 / 39
Регистрация: 18.11.2016
Сообщений: 561
19.02.2017, 20:29  [ТС] 6
Действительно, что-то не подумал про динамический массив.
У меня почему то не определяется std::stoi как индификатор.
Кстати код:
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
      char str [] = "Hello this beautiful world";
        char symbols [] = "0123456789";
        int num = strlen (str);
        char *password = new char [num];
 
        std::cout << "stroke: " << str << std::endl;
 
        std::cout << "coder: ";
        for (int i(0); str[i]; i++){
            password[i] = symbols[rand()%10];
            str[i] = str[i] ^ password[i];
            std::cout << str[i];
        }   std::cout<<std::endl;
 
        std::cout << "random: ";
        for (int i(0); str[i]; i++){
            std::cout << password[i];
        }std::cout<< std::endl;
 
        std::cout << "uncoder: ";
 
        for (int i(0); str[i]; i++){
            str[i] = password[i] ^ str[i];
            std::cout << str[i];
        }
 
        delete [] password;
 
        std::cout << std::endl;
        system ("pause");
        return 0;
 
    }
0
1118 / 931 / 429
Регистрация: 25.12.2016
Сообщений: 3,030
19.02.2017, 20:38 7
Цитата Сообщение от Photofenix Посмотреть сообщение
не определяется std::stoi
Нужно подключить заголовочный файл #include <string>.

Если же в качестве компилятора используется mingw, то там эта функция не реализована (зато реализована в mingw-w64).
1
62 / 62 / 39
Регистрация: 18.11.2016
Сообщений: 561
19.02.2017, 20:42  [ТС] 8
Пользуюсь VS2012 для студентов.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.02.2017, 20:42

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Условные операторы и операторы цикла, проверка корректности вводимых данных
Привет, ребята. Помогите, пожалуйста, написать код для данной задачи. Примечание: необходимо...

Определить и вывести количество дней между двумя датами (логические операторы и операторы ветвлений)
Задачка Пользователь вводит две даты (день, месяц, год в виде целых чисел). Необходимо определить...

Операторы присваивания, ввода- вывода. Операторы ветвления, выбора
Даны два ненулевых числа. Найти их сумму, разность, произведение, частное, остаток и целую часть от...

«Языки и технологии программирования» «Операторы цикла. Условные операторы»
Не получается сделать что бы программа выводила все значения в промежутке, она выводит только одно....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.