Witam,
Mam za zadanie napisać w c++ generator losowych haseł, taki że:
- użytkownik ma podać długość hasła
- hasło ma zawierać min. 1 wielką literę, 1 znak specjalny, 1 cyfrę
- dwie spółgłoski/dwie samogłoski nie mogą ze sobą sąsiadować
Oto dotychczasowy napisany kod:
/*
Name: Generator losowego hasla
Copyright: ---
Author: Jan Dlugosz
Date: 14/03/16 17:06
Description:
*/
#include<boost/algorithm/string/predicate.hpp>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <sstream>
char uv[] = "AEIOUY";
char uc[] = "BCDFGHJKLMNPQRSTVWXZ";
char nmbr[] = "1234567890";
char sgn[] = "`~!@#$%^&*()";
char lv[] = "aeiouy";
char lc[] = "bcdfghjklmnpqrstvwxz";
int n, i;
bool okz=false, okl=false, okd=false, ok=false;
std::stringstream sszkielet;
int rndtype() { //losowy "typ" - wg kolejnosci deklarowania tablic - 1 odpowiada wielkiej samoglosce; 2 wielkiej spolglosce itd
return(std::rand() % 6 +1);
}
char rndlv() { //m. samogloska
return(lv[std::rand() % std::strlen(lv)]);
}
char rnduv() { //w. samogloska
return(uv[std::rand() % std::strlen(uv)]);
}
char rndlc() { //m. spolgloska
return(lc[std::rand() % std::strlen(lc)]);
}
char rnduc() { //w. spolgloska
return(uc[std::rand() % std::strlen(uc)]);
}
char rndnmbr() { //nr
return(nmbr[std::rand() % std::strlen(nmbr)]);
}
char rndsgn() { //znak specjalny
return(sgn[std::rand() % std::strlen(sgn)]);
}
int main () {
srand(time(NULL));
std::cout << "Witaj w generatorze hasel" << std::endl;
std::cout << "Ile znakow ma byc w hasle?" << std::endl;
std::cin >> n;
std::string szkielet;
do {
sszkielet.str(std::string());
okl = false, okz = false, okd = false, ok=false;
for (i=0; i<n; i++){
sszkielet << rndtype();
std::cin.ignore();
}
sszkielet >> szkielet;
if (szkielet.find('3') != std::string::npos){
okl=true;
}
if (szkielet.find('4') != std::string::npos){
okz=true;
}
if (szkielet.find('2') != std::string::npos){
okd=true;
}
if (szkielet.find('1') != std::string::npos){
okd=true;
}
if (okl==true && okz==true && okd==true){
ok=true;
break;
}
std::cout << szkielet <<std::endl<<okl<<okz<<okd<<ok;
} while (1);
std::cout << szkielet <<std::endl<<okl<<okz<<okd<<ok;
}
Moim pomysłem było aby gdy wygenerowany "szkielet"(string złożony z cyfr od 1-6, odpowiadającym kolejno 1:wlk. samogłosce; 2: wlk. spółgłosce; 3: cyfrze; 4:znakowi specjalnemu; 5:m. samogłosce; 6: wielkiej samogłosce) nie spełnia warunków zadania (okz, okd, okl w kodzie) generowany byl nowy "szkielet".
Jednak przy probie kolejnej iteracji, gdy wygenerowany został już jakiś nieprawidłowy "szkielet", liczby generowane nie zmieniaja sie.
Proszę o podpowiedz jak wybrnąć z tej sytuacji.
Pozdrawiam