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

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

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

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

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

как объяснил мне учитель,программа должна после ввода пользователем пароля найти его,методом перебора.Например:ввел 123546,программа начинает перебор 123456-неверно,идёт дальше,123465-неверно,и так далле.Реализовать это нужно как с числами,так и с буквами.То есть по сути нужно просто задать массивы букв(латинских)и цифр.Как это всё сделать не совсем представляю.Нигде не могу найти-кто может помочь?(можно использовать простой С,С++)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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++
#include <iostream> using namespace std; int main () { int number, largest_1, largest_2, counter = 1; cout«"Vvedite 1oe...

Пользователь трижды вводит достоинство купюр и их количество. Программа должна посчитать общую сумму денег - C++
Пользователь трижды вводит достоинство купюр и их количество. Программа должна посчитать общую сумму денег.

Пользователь загадывает число от 1 до 100, а программа должна его угадать - C++
Подскажите алгоритм выполнения такой задачи: Пользователь загадывает число от 1 до 100, а программа должна его угадать, задавая вопросы...

Пользователь вводит количество звёздочек и количество пробелов, через которые должна выводиться каждая звёздоч - C++
Вроде все понятно, не пойму почему не реализуется должным образом. предполагаю не верно указан while, спасибо за помощь заранее=) char...

пользователь вводит число, вывести на экран его побитово - C++
Здраствуйте мне препод задал такое задание пользователь вводит число, вывести на экран его побитово помогите плз)

пользователь вводит число, вывести на экран его побитово - C++
Всем привет :) Подскажите плз как сделать вот это задание пользователь вводит число, вывести на экран его побитово Заранее...

8
-=ЮрА=-
Заблокирован
Автор 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;
}
0
Миниатюры
пользователь вводит пароль,программа должна его вычислить перебором  
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)сообщит об этом пользователю , вывести сообщение на экран и прекратить генерацию паролей.Уважаемые,если поняли о чём я,помогите пожалуйста.
0
voral
455 / 436 / 68
Регистрация: 16.03.2008
Сообщений: 2,130
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 - бинго!
0
Jusar
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 11
31.05.2012, 18:24  [ТС] #5
дак а основная проблема то в том что я не знаю как это реализовать в програмном коде
0
igorrr37
1647 / 1275 / 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;
}
0
Jusar
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 11
31.05.2012, 20:59  [ТС] #7
большое спасибо.единственное не могли бы вы закоментировать программу(например строчки 3 и 5 мне не совсем понятны),как можно модифицировать её для ввода большего количества символов(и будет ли ругаться программа на введение,например, 3 символов) и откуда беруться данные для перебора?
P.S. вносить это в Visual studio?
0
diagon
Higher
1929 / 1195 / 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 вместо рекурсии, но мне лень.
0
Jusar
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 11
31.05.2012, 21:16  [ТС] #9
так.я и это не совсем понимаю не могли бы вы закоментировать?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.05.2012, 21:16
Привет! Вот еще темы с ответами:

Пользователь вводит с клавиатуры число, необходимо показать на экран сумму его цифр - C++
3. Пользователь вводит с клавиатуры число, необходимо показать на экран сумму его цифр.

Пользователь вводит число,программа вычисляет 3-ию степень введенного числа - C++
Пользователь вводит число,программа вычисляет 3-ию степень введенного числа.

Пользователь вводит вещественные числа x,y,z. Вычислить max(x+y+z, xyz) - C++
Составить ДВЕ программы на языке C++ для решения одного из вариантов заданий с применением ОПЕРАТОРА if и с применением условий операции. ...

Пользователь вводит с клавиатуры 5 чисел. Программа выводит на экран их среднее арифметическое - C++
Надо использовать циклы. Написпал прогу,в чём может быть ошибка? #include &lt;iostream&gt; using namespace std; int main() { ...


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

Или воспользуйтесь поиском по форуму:
9
Yandex
Объявления
31.05.2012, 21:16
Ответ Создать тему
Опции темы

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