Există 2 motive pentru care am realizat acest cod/mesaj :
- Nu am un magnetism special pentru Delphi/Pascal, dar am considerat că ideea merită abordată și pentru muritorii ce știu C++ de pildă

- Plângea subforumul după subiecte, brutelor!

Exemple wrote:GenereazaParola(6, "Aa##~~") => "6hC=3+"
GenereazaParola(6, "AAaa##") => "z2G1qK"
GenereazaParola(10, "AAAAAAAAAA") => "CNORFGPSVJ"
GenereazaParola(10, "#####") => "34=52t6Y78"
GenereazaParola(30) => "3DMU$yX5Km90sqt7Ah*O8l6?=JZnzR"
- #include <iostream>
- #include <algorithm>
- #include <ctime>
- #include <cstdlib>
- using namespace std;
- const char *multCarSpeciale = "*$-+?_&=!%{}/";
- /*!
- Alege, extrage si returneaza un caracter dintr-un anumit set de caractere.
- \param mulCaracts Setul de caractere din care se va extrage, in mod aleator, un caracter. In urma extragerii, caracterul se elimina din set. Daca setul ajunge sa nu mai aiba caractere, el se reconstituie.
- \param indexSet Indexul setului ales pentru extragere
- \return Un caracter aleator din setul dorit
- */
- char ExtrageCarAleator(string &mulCaracts, unsigned int indexSet)
- {
- char carAles = ' ';
- unsigned int indexCarAles = rand() % mulCaracts.length();
- //extragem caracterul generat
- carAles = mulCaracts[indexCarAles];
- // eliminam caracterul extras din set si, daca este cazul, reconstituim setul
- mulCaracts.erase(indexCarAles, 1);
- if(mulCaracts.empty())
- switch(indexSet)
- {
- case 0:
- mulCaracts = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- break;
- case 1:
- mulCaracts = "abcdefghijklmnopqrstuvwxyz";
- break;
- case 2:
- mulCaracts = "0123456789";
- break;
- case 3:
- mulCaracts = multCarSpeciale;
- break;
- }
- return carAles;
- }
- /*!
- Construieste si returneaza un sir format aleator din elemente din 4 clase (cifre, litere (mici, mari), caractere speciale).
- \param pLungime Lungimea sirului ce se doreste a fi returnat.
- \param pFormat Specifica o constrangere a sirului rezultat. Prin constrangere se intelege o dorinta SIGURA de a avea, in sirul generat, anumite elemente din clase specifice. (implicit nu exista)
- Constrangerile vin sub forma de caractere intr-un sir de caractere, fiecare avand urmatoarea interpretare :
- - 'A' : se doreste ca in sirul rezultat sa existe cel putin o litera englezeasca \b MARE
- - 'a' : se doreste ca in sirul rezultat sa existe cel putin o litera englezeasca \b mica
- - '#' : se doreste ca in sirul rezultat sa existe cel putin o \b cifra
- - '~' : se doreste ca in sirul rezultat sa existe cel putin un caracter \b special
- \return Sirul aleator generat tinand cont de eventualele constrangeri.
- */
- string GenereazaParola(unsigned int pLungime,
- const string &pFormat = "")
- {
- string pGenerata = "";
- string setCaractere[] = {"ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz",
- "0123456789", multCarSpeciale
- };
- unsigned int nrElemPrezente = 0;
- unsigned int indexClsGenerata = 0;
- if(pFormat.length() <= pLungime)
- {
- // pornim sirul generat de la elementele tiparului sugerat alese din domeniul lor de apartenenta
- for(nrElemPrezente = 0; nrElemPrezente < pFormat.length(); ++nrElemPrezente)
- {
- switch(pFormat[nrElemPrezente])
- {
- case 'A':
- // alegem si adaugam un caracter englezesc (litera MARE)
- pGenerata += ExtrageCarAleator(setCaractere[0], 0);
- break;
- case 'a':
- // alegem si adaugam un caracter englezesc (litera mica)
- pGenerata += ExtrageCarAleator(setCaractere[1], 1);
- break;
- case '#':
- // alegem si adaugam o cifra
- pGenerata += ExtrageCarAleator(setCaractere[2], 2);
- break;
- case '~':
- // alegem si adaugam un caracter special
- pGenerata += ExtrageCarAleator(setCaractere[3], 3);
- break;
- }
- }
- // completam restul de elemente cu valori uniform alese din cele 4 clase impuse
- while(nrElemPrezente++ < pLungime)
- {
- // alegem o valoare uniform distribuita pe intervalul [0, 4) si-i asociem un caracter
- indexClsGenerata = rand() % 4;
- pGenerata += ExtrageCarAleator(setCaractere[indexClsGenerata], indexClsGenerata);
- }
- // amestecam elementele
- random_shuffle(pGenerata.begin(), pGenerata.end());
- }
- return pGenerata;
- }
- int main()
- {
- // initializam generatorul de numere pseudoaleatoare
- srand(time(NULL));
- // doar cu titlu de prezentare, respectand restrictiile lui DB
- cout << GenereazaParola(6, "Aa##~~");
- return 0;
- }
P.S: touche, Delphi lovers!

L.E. (-- 14 Jul 2011, 12:22 --)
O versiune imbunătățită care permite alegerea lungimii șirului generat dintr-un interval de valori [min, max) cu min <= max este prezentată mai jos.
Dacă max nu se specifică, atunci se ia valoarea implicită 50.
Exemplu wrote:GenereazaParola(6, "Aa##~~", 12) : /* alege un sir de lungime [6,12) care respecta contrangerea respectiva */
p*!67gN+
v/-&e87O2Y{
H?o3{1
GenereazaParola(6, "Aa##~~") : /* alege un sir de lungime [6,50) care respecta contrangerea respectiva */
?6G_Do185Nbj9Rs7{0-=&%mq4a}+32M!w*t
7*$ZH!3/m
1rWE/+NFu=hy*A3{-79&tGRIfT!2q6_85b0C
8/$4Bxk
GenereazaParola(6, "Aa##~~", 6) : /* alege un sir de lungime 6 care respecta contrangerea respectiva */
=Cz91!
_6v}4D
f8W{3?
- #include <iostream>
- #include <algorithm>
- #include <ctime>
- #include <cstdlib>
- using namespace std;
- const char *multCarSpeciale = "*$-+?_&=!%{}/";
- /*!
- Alege, extrage si returneaza un caracter dintr-un anumit set de caractere.
- \param mulCaracts Setul de caractere din care se va extrage, in mod aleator, un caracter. In urma extragerii, caracterul se elimina din set. Daca setul ajunge sa nu mai aiba caractere, el se reconstituie.
- \param indexSet Indexul setului ales pentru extragere
- \return Un caracter aleator din setul dorit
- */
- char ExtrageCarAleator(string &mulCaracts, unsigned int indexSet)
- {
- char carAles = ' ';
- unsigned int indexCarAles = rand() % mulCaracts.length();
- //extragem caracterul generat
- carAles = mulCaracts[indexCarAles];
- // eliminam caracterul extras din set si, daca este cazul, reconstituim setul
- mulCaracts.erase(indexCarAles, 1);
- if(mulCaracts.empty())
- switch(indexSet)
- {
- case 0:
- mulCaracts = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- break;
- case 1:
- mulCaracts = "abcdefghijklmnopqrstuvwxyz";
- break;
- case 2:
- mulCaracts = "0123456789";
- break;
- case 3:
- mulCaracts = multCarSpeciale;
- break;
- }
- return carAles;
- }
- /*!
- Construieste si returneaza un sir format aleator din elemente din 4 clase (cifre, litere (mici, mari), caractere speciale).
- \param pLungimeMin Lungimea minima a sirului ce se doreste a fi returnat.
- \param pFormat Specifica o constrangere a sirului rezultat. Prin constrangere se intelege o dorinta SIGURA de a avea, in sirul generat, anumite elemente din clase specifice. (implicit nu exista)
- \param pLungimeMax Lungimea maxima a sirului ce se doreste a fi returnat. (implicit 50)
- Constrangerile vin sub forma de caractere intr-un sir de caractere, fiecare avand urmatoarea interpretare :
- - 'A' : se doreste ca in sirul rezultat sa existe cel putin o litera englezeasca \b MARE
- - 'a' : se doreste ca in sirul rezultat sa existe cel putin o litera englezeasca \b mica
- - '#' : se doreste ca in sirul rezultat sa existe cel putin o \b cifra
- - '~' : se doreste ca in sirul rezultat sa existe cel putin un caracter \b special
- \return Sirul aleator generat tinand cont de eventualele constrangeri.
- */
- string GenereazaParola(unsigned int pLungimeMin,
- const string &pFormat = "", unsigned int pLungimeMax = 50)
- {
- string pGenerata = "";
- string setCaractere[] = {"ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz",
- "0123456789", multCarSpeciale
- };
- unsigned int nrElemPrezente = 0;
- unsigned int indexClsGenerata = 0;
- unsigned int pLungime = 0;
- if(pLungimeMin <= pLungimeMax &&
- pFormat.length() <= pLungimeMin)
- {
- // pornim sirul generat de la elementele tiparului sugerat alese din domeniul lor de apartenenta
- for(nrElemPrezente = 0; nrElemPrezente < pFormat.length(); ++nrElemPrezente)
- {
- switch(pFormat[nrElemPrezente])
- {
- case 'A':
- // alegem si adaugam un caracter englezesc (litera MARE)
- pGenerata += ExtrageCarAleator(setCaractere[0], 0);
- break;
- case 'a':
- // alegem si adaugam un caracter englezesc (litera mica)
- pGenerata += ExtrageCarAleator(setCaractere[1], 1);
- break;
- case '#':
- // alegem si adaugam o cifra
- pGenerata += ExtrageCarAleator(setCaractere[2], 2);
- break;
- case '~':
- // alegem si adaugam un caracter special
- pGenerata += ExtrageCarAleator(setCaractere[3], 3);
- break;
- }
- }
- // alegem o lungime pentru sirul nostru
- if(pLungimeMax != pLungimeMin)
- pLungime = pLungimeMin + rand() % (pLungimeMax - pLungimeMin);
- else
- pLungime = pLungimeMin;
- // completam restul de elemente cu valori uniform alese din cele 4 clase impuse
- while(nrElemPrezente++ < pLungime)
- {
- // alegem o valoare uniform distribuita pe intervalul [0, 4) si-i asociem un caracter
- indexClsGenerata = rand() % 4;
- pGenerata += ExtrageCarAleator(setCaractere[indexClsGenerata], indexClsGenerata);
- }
- // amestecam elementele
- random_shuffle(pGenerata.begin(), pGenerata.end());
- }
- return pGenerata;
- }
- int main()
- {
- // initializam generatorul de numere pseudoaleatoare
- srand(time(NULL));
- // doar cu titlu de prezentare, respectand restrictiile lui DB, dar cu lungime variabila
- cout << GenereazaParola(6, "Aa##~~");
- return 0;
- }
Welcome to BitCell. Click here to register !
