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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Генератор символьных паролей, Нужно каждый раз генерировался новый код 
V
    Опции темы
Phoenix13
Дата 7.3.2010, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    int x;
    char pass[]="abcdefghijklmnopqrstuvwxyz";
    
        for(int x=0; x<20; x++)
            cout<<"Password "<<x<<" :"<<pass<<endl;
    
    
    cin.get();
}

 smile 

Это сообщение отредактировал(а) Phoenix13 - 7.3.2010, 16:30
PM MAIL Skype   Вверх
Ozerich
Дата 7.3.2010, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 2.8.2009
Где: Минск, Беларусь

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



Код

#include <iostream>
#include <cstring>
#include <time.h>

using namespace std;

const int MAXLEN = 20;
const int ALPHABET_SIZE = 27;
const char alphabet[ALPHABET_SIZE]="abcdefghijklmnopqrstuvwxyz";

int main()
{
    int x;
    
    int len;
    srand ( time(NULL) );
    for(x = 0; x < 20; x++)
    {
        cout << "Password : ";
        len = rand() % MAXLEN;
        for(int i = 0; i < len; i++)
            cout << alphabet[rand() % ALPHABET_SIZE];
        cout << endl;
    }
    cin.get();
}


Это сообщение отредактировал(а) Ozerich - 7.3.2010, 16:42
--------------------
C++(STL) / DHTML(CSS) / Javascript / PHP  Developer
PM MAIL ICQ Skype   Вверх
Phoenix13
Дата 7.3.2010, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Большое спасибо за пример! Есть моменты которые я не знаю, поясните пожалуйста. 

1) Можем ли мы:
Код

const int ALPHABET_SIZE = 27;
const char alphabet[ALPHABET_SIZE]="abcdefghijklmnopqrstuvwxyz";

заменить на простое:
Код

const char alphabet[27]="abcdefghijklmnopqrstuvwxyz";

2)Как написано у меня в книге опратор "%" - это деление по модулю. Как работает этот  оператор здесь?
Код

           len = rand() % MAXLEN;
        for(int i = 0; i < len; i++)
            cout << alphabet[rand() % ALPHABET_SIZE];

3)Для чего нужна функция?
Код

srand ( time(NULL) );

PM MAIL Skype   Вверх
Ozerich
Дата 7.3.2010, 17:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 2.8.2009
Где: Минск, Беларусь

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



Цитата(Phoenix13 @ 7.3.2010,  16:12)
Большое спасибо за пример! Есть моменты которые я не знаю, поясните пожалуйста. 

1) Можем ли мы:
Код

const int ALPHABET_SIZE = 27;
const char alphabet[ALPHABET_SIZE]="abcdefghijklmnopqrstuvwxyz";

заменить на простое:
Код

const char alphabet[27]="abcdefghijklmnopqrstuvwxyz";

2)Как написано у меня в книге опратор "%" - это деление по модулю. Как работает этот  оператор здесь?
Код

           len = rand() % MAXLEN;
        for(int i = 0; i < len; i++)
            cout << alphabet[rand() % ALPHABET_SIZE];

3)Для чего нужна функция?
Код

srand ( time(NULL) );

Счас всё разъясню  smile 

1. Конечно можем. Но ALPHABET_SIZE я делал для удобства. Это константа, она используется не только в длине массива но и в строчке
cout << alphabet[rand() % ALPHABET_SIZE];. Чтобы 2 раза не менять значение, я сделал константу и теперь чтобы изменить значение в 2 местах, мне достаточно только изменить в const int ALPHABET_SIZE = 27;

2.Правильно. % это деление по модулю и он тут так и работает.
alphabet[4] этот код получает 4ый символ в alphabet
alphabet[rand() % ALPHABET_SIZE] а вот этот код случайный символ. rand() генерирует случайное число которое может быть очень большое и чтобы нам получить случайное число между 0 и 26 нам надо просто получить остаток от деления на 27.

3. Это обеспечивает случайную рандомизацию. Если этого не написать, то при каждом запуске программы будут одни и теже пароли.

Надеюсь, понятно объяснил smile 
--------------------
C++(STL) / DHTML(CSS) / Javascript / PHP  Developer
PM MAIL ICQ Skype   Вверх
Phoenix13
Дата 7.3.2010, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А как задать постоянный размер ,скажем, в восемь символов для каждого нового пароля и исключить пробелы? 

Это сообщение отредактировал(а) Phoenix13 - 7.3.2010, 17:46
PM MAIL Skype   Вверх
Ozerich
Дата 7.3.2010, 18:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 2.8.2009
Где: Минск, Беларусь

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



Код

#include <iostream>
#include <cstring>
#include <time.h>

using namespace std;

const int LEN = 8;
const int ALPHABET_SIZE = 27;
const char alphabet[ALPHABET_SIZE]="abcdefghijklmnopqrstuvwxyz";

int main()
{
    int x;
    
    int len;
    srand ( time(NULL) );
    for(x = 0; x < 20; x++)
    {
        cout << "Password : ";
        for(int i = 0; i < LEN; i++)
            cout << alphabet[rand() % (ALPHABET_SIZE - 1)];
        cout << endl;
    }
    cin.get();
}

--------------------
C++(STL) / DHTML(CSS) / Javascript / PHP  Developer
PM MAIL ICQ Skype   Вверх
Phoenix13
Дата 7.3.2010, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



1) А как работает "-1" здесь? Как я понял это для того чтобы не было пробелов и здесь может быть любое число?
Код

            cout << alphabet[rand() % (ALPHABET_SIZE - 1)];


2) Как сделать чтобы при изменении длины алфавита результат был такой же?
PM MAIL Skype   Вверх
Ozerich
Дата 7.3.2010, 18:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 2.8.2009
Где: Минск, Беларусь

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



Цитата(Phoenix13 @ 7.3.2010,  17:37)
1) А как работает "-1" здесь? Как я понял это для того чтобы не было пробелов и здесь может быть любое число?
Код

            cout << alphabet[rand() % (ALPHABET_SIZE - 1)];


2) Как сделать чтобы при изменении длины алфавита результат был такой же?

1. Это я просто ошибся с подсчетами. Если -1 убрать то тогда может произойти обращение к alphabet[26],который равен \0. Это не пробел но в консоли он выглядит как пробел

2.ALPHABET_SIZE - длина алфавита
alphabet - сам алфавит

Меняя эти 2 константы ты получаешь то что хочешь  smile 

Это сообщение отредактировал(а) Ozerich - 7.3.2010, 18:50
--------------------
C++(STL) / DHTML(CSS) / Javascript / PHP  Developer
PM MAIL ICQ Skype   Вверх
Phoenix13
Дата 7.3.2010, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

cout << alphabet[rand() % (ALPHABET_SIZE -1)];

Правильно ли я понимаю  что если функция rand() в случае если даст ,например, число 5, а ALPHABET_SIZE -1=26, то cout<< покажет нам первой букву "E" из нашего алфавита. Так?
PM MAIL Skype   Вверх
Ozerich
Дата 7.3.2010, 19:25 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 2.8.2009
Где: Минск, Беларусь

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



Цитата(Phoenix13 @ 7.3.2010,  18:17)
Код

cout << alphabet[rand() % (ALPHABET_SIZE -1)];

Правильно ли я понимаю  что если функция rand() в случае если даст ,например, число 5, а ALPHABET_SIZE -1=26, то cout<< покажет нам первой букву "E" из нашего алфавита. Так?

Нет. Покажит маленькую букву "f" так как индексация в массиве начинается с нуля, тоесть alphabet[0] = 'a' и alphabet[5] = 'f'
--------------------
C++(STL) / DHTML(CSS) / Javascript / PHP  Developer
PM MAIL ICQ Skype   Вверх
Phoenix13
Дата 7.3.2010, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я понял)) Просто ошибся на одну букву. Из головы вылетело что с "0" начинается, хотя всегда помню вроде.
Я в одном шаге от полного понимания smile 
Как в данном случае работает цикл?
Код

        for(int i = 0; i < LEN; i++)

Условие i=0 означает что цикл начнется с нулевой ячейки и закончится по другому условию i < LEN означает до каких пор будет генерироваться пароль. Если LEN=4 то начиная с нуля и до 4 получается 4-ех символьный пароль. i++ увеличение на 1. 
Только не пойму как он связан с массивом. Если я убираю эту строку то код генерируется длинною в один символ.
PM MAIL Skype   Вверх
Ozerich
Дата 7.3.2010, 20:00 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 2.8.2009
Где: Минск, Беларусь

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



Цитата(Phoenix13 @ 7.3.2010,  18:55)
Только не пойму как он связан с массивом. Если я убираю эту строку то код генерируется длинною в один символ.

Если убрать строчку то будет выводить один символ так как операция одна. А цикл даёт повторение операций LEN раз. smile 
--------------------
C++(STL) / DHTML(CSS) / Javascript / PHP  Developer
PM MAIL ICQ Skype   Вверх
Condemned27
Дата 7.3.2010, 20:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Извиняюсь за вторжение)
Код

for(int i = 0; i < LEN; i++)
            cout << alphabet[rand() % (ALPHABET_SIZE - 1)];

Это цикл, который выводит тебе на экран рандомный эл-т из массива alphabet 8 раз, собственно так и получается пароль)
Если убрать этот цикл, то цикл
Код

for(x = 0; x < 20; x++)

при каждой интерации естественно будет давать тебе после password: по одной букве из массива alphabet.
Ну в общем приглядись повнимательней)
upd: хоо, запоздал с ответом)

Это сообщение отредактировал(а) Condemned27 - 7.3.2010, 20:11
PM MAIL   Вверх
bsa
Дата 8.3.2010, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(Phoenix13 @  7.3.2010,  19:55 Найти цитируемый пост)
Условие i=0 означает что цикл начнется с нулевой ячейки и закончится по другому условию i < LEN означает до каких пор будет генерироваться пароль.
i=0 - это не условие, это просто действие (оно, как и любая другая операция внутри оператора for(), не обязательно). Условие находится вторым - цикл выполняется пока это условие истинно, а третье поле - действие, которое нужно выполнять после тела цикла. Таким образом цикл for(OP1;OP2;OP3) OP4; можно записать в виде:
Код
1 ВЫПОЛНИТЬ OP1
2 ЕСЛИ OP2 ЛОЖНО ПЕРЕЙТИ НА СТРОКУ 7
3 ВЫПОЛНИТЬ OP4
5 ВЫПОЛНИТЬ OP3
6 ПЕРЕЙТИ НА СТРОКУ 2
7 КОММЕНТАРИЙ: КОНЕЦ ЦИКЛА



Это сообщение отредактировал(а) bsa - 8.3.2010, 23:39
PM   Вверх
sQu1rr
Дата 8.3.2010, 21:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

2 ЕСЛИ OP3 ЛОЖНО ПЕРЕЙТИ НА СТРОКУ 7


Очипятка? OP2
PM MAIL Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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