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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Jusar
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 11
#1

пользователь вводит пароль,программа должна его вычислить перебором - C++

31.05.2012, 10:30. Просмотров 1410. Ответов 8
Метки нет (Все метки)

как объяснил мне учитель,программа должна после ввода пользователем пароля найти его,методом перебора.Например:ввел 123546,программа начинает перебор 123456-неверно,идёт дальше,123465-неверно,и так далле.Реализовать это нужно как с числами,так и с буквами.То есть по сути нужно просто задать массивы букв(латинских)и цифр.Как это всё сделать не совсем представляю.Нигде не могу найти-кто может помочь?(можно использовать простой С,С++)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.05.2012, 10:30     пользователь вводит пароль,программа должна его вычислить перебором
Посмотрите здесь:
C++ Пользователь вводит 10 чисел программа должна выдать 2 максимальных(берём от 1 до 10,если выпадает 2 10,то программа должна выдать 2 10,а не 10,9)
C++ Пользователь трижды вводит достоинство купюр и их количество. Программа должна посчитать общую сумму денег
Пользователь загадывает число от 1 до 100, а программа должна его угадать C++
C++ Пользователь вводит количество звёздочек и количество пробелов, через которые должна выводиться каждая звёздоч
пользователь вводит число, вывести на экран его побитово C++
C++ пользователь вводит число, вывести на экран его побитово
C++ Пользователь вводит с клавиатуры число, необходимо показать на экран сумму его цифр
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
31.05.2012, 12:11     пользователь вводит пароль,программа должна его вычислить перебором #2
Jusar, не пойму в чём сложность. Вот алгоритм твоей перестановки
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
 
char * replacing(char * str);
 
int main()
{
    char digits[] = "0123456789";
    unsigned int length   = strlen(digits);
    for(unsigned int i = 0; i < length; i++)
        cout<<strcpy(digits,replacing(digits))<<endl;
    system("pause");
    return 0;
}
 
char * replacing(char * str)
{
    char chr = str[0];
    strcpy((char *)&str[0],(char *)&str[1]);
    str[strlen(str)] = chr;
    return str;
}
Миниатюры
пользователь вводит пароль,программа должна его вычислить перебором  
Jusar
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 11
31.05.2012, 14:43  [ТС]     пользователь вводит пароль,программа должна его вычислить перебором #3
наверно вы меня не так поняли.я имею ввиду,что пользователь вводит в программе пароль(например qwerty23) ,а программа должна сначала вычислить длинну пароля,потом (в моём понимании) вязть из массивов(заранее вбитых программу пользователем,например char s_latin[] ={'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'}; ну и цифры)и перебрать все возможные варианты паролей такой же длинны,а когда вычислит нужный(то есть тот же qwerty23)сообщит об этом пользователю , вывести сообщение на экран и прекратить генерацию паролей.Уважаемые,если поняли о чём я,помогите пожалуйста.
voral
427 / 407 / 56
Регистрация: 16.03.2008
Сообщений: 2,015
31.05.2012, 16:10     пользователь вводит пароль,программа должна его вычислить перебором #4
Ну раз можно вычислять длину, я бы сделал так:
0 Опеределяем i - индекс текущего тестируемого символа. И приравниваем к 0
1. Согласно длине искомого пароля заполнил бы массив (результирующий) первым символом алфавита, а первый взял из середины алфавита. (Алфавит должен быть отсортирован).
2. Сравнил бы с введенным паролем.
3. Если равно - конец игры
4. Сохраняем результат сравнения (больше или меньше)
5. Меняем i - символ. По принципу:
6. Если было первое сравнение Если тестируемый пароль меньше введенного берем символ из середины алфавита справа от текущего иначе справа
7. Как только алгоритм начинает при смене элемента на соседний менять результат сравнения - оставляем меньший и увеличиваем i

Т.е. имеем пароль tes
имеем алфавит abcdefklstz
faa - заполнили. меньше чем пароль
saa - меньше чем пароль
taa - меньше чем пароль
zaa - больше чем пароль, но индекс семнился на 1. Фиксируем первый элемент на предыдущем значении и работаем со вторым
tfa - больше чем пароль
tca - меньше чем пароль
tda - меньше чем пароль
tea - меньше чем пароль
tfa - больше чем пароль, но индекс сменили на 1 . Фиксируем второй элемент на предыдущем значении и работаем со третим
tef - меньше чем пароль
tes - бинго!
Jusar
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 11
31.05.2012, 18:24  [ТС]     пользователь вводит пароль,программа должна его вычислить перебором #5
дак а основная проблема то в том что я не знаю как это реализовать в програмном коде
igorrr37
1643 / 1271 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
31.05.2012, 20:50     пользователь вводит пароль,программа должна его вычислить перебором #6
вот для пароля длиной 5 символов
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
#include <iostream>
#include <cstring>
#define ENCLOSED_CYCLES 5
 
void CalcI(int& i)
{
    if((i >= 48 && i < 57) || (i >= 65 && i < 90) || (i >= 97 && i <= 122)) ++i;
    else if(57 == i) i = 65;
    else i = 97;
}
 
int main()
{
    char pass[] = "01Aaz", res[ENCLOSED_CYCLES + 1]{'\0'};
    if(std::strlen(pass) == ENCLOSED_CYCLES)
    {
        for(int i0 = 48; i0 < 123; CalcI(i0))
        {
            res[0] = i0;
            for(int i1 = 48; i1 < 123; CalcI(i1))
            {
                res[1] = i1;
                for(int i2 = 48; i2 < 123; CalcI(i2))
                {
                    res[2] = i2;
                    for(int i3 = 48; i3 < 123; CalcI(i3))
                    {
                        res[3] = i3;
                        for(int i4 = 48; i4 < 123; CalcI(i4))
                        {
                            res[4] = i4;
                            if(!std::strcmp(pass, res))
                            {
                                std::cout << "res: " << res << std::endl;
                                return 0;
                            }
                        }
                    }
                }
            }
        }
        std::cout << "Password not found\n";
    }
    else std::cerr << "Incorrect length\n";
    return 0;
}
Jusar
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 11
31.05.2012, 20:59  [ТС]     пользователь вводит пароль,программа должна его вычислить перебором #7
большое спасибо.единственное не могли бы вы закоментировать программу(например строчки 3 и 5 мне не совсем понятны),как можно модифицировать её для ввода большего количества символов(и будет ли ругаться программа на введение,например, 3 символов) и откуда беруться данные для перебора?
P.S. вносить это в Visual studio?
diagon
Higher
1928 / 1194 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
31.05.2012, 21:05     пользователь вводит пароль,программа должна его вычислить перебором #8
Примерно так.
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
#include <iostream>
#include <stack>
#include <string>
 
void brute(const std::string& str, size_t level = 0, std::string cur = "")
{
    static const std::string alpha = "0123456789qwertyuiopasdfghjklzxcvbnm";
    
    if (level == str.length() )
    {
        if (str == cur)
            std::cout << cur << std::endl;
        
        return;
    }
    
    for (size_t i = 0; i < alpha.length(); ++i)
        brute(str, level + 1, cur + alpha[i]);
}
 
int main()
{
    std::string pass;
    std::cin >> pass;
    brute(pass);
}
Только учтите, что уже при 5 символах программа будет задумываться(36^5 вариантов все-таки).

Можно сделать эффективнее, если использовать std::stack вместо рекурсии, но мне лень.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.05.2012, 21:16     пользователь вводит пароль,программа должна его вычислить перебором
Еще ссылки по теме:
C++ Пользователь вводит число,программа вычисляет 3-ию степень введенного числа
Пользователь вводит вещественные числа x,y,z. Вычислить max(x+y+z, xyz) C++
Пользователь вводит с клавиатуры 5 чисел. Программа выводит на экран их среднее арифметическое C++
Создать динамический массив, размер которого пользователь вводит с клавиатуры.Заполнить его случайными числами C++
Пользователь вводит строку. Программа находит количество слов, правее самого короткого C++

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

Или воспользуйтесь поиском по форуму:
Jusar
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 11
31.05.2012, 21:16  [ТС]     пользователь вводит пароль,программа должна его вычислить перебором #9
так.я и это не совсем понимаю не могли бы вы закоментировать?
Yandex
Объявления
31.05.2012, 21:16     пользователь вводит пароль,программа должна его вычислить перебором
Ответ Создать тему
Опции темы

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