/*
Nome: Mario
Cognome: Montanari

Genarare una password che soddisfa i criteri:
   - Presenza di almeno una:
      - minuscola;
      - maiuscola;
      - cifra;
      - punteggiatura;
   - Lunghezza della password compresa fra 8 e 12 caratteri;
*/

#include <iostream>
#include <ctime>
#include <cstdlib>

#define SIZE 12

#define NSTAMPA_MIN 5
#define NSTAMPA_MAX 6

#define CARATTERI_MIN 2
#define CARATTERI_MAX 3

#define MINUSCOLA_MIN 97
#define MINUSCOLA_MAX 122

#define MAIUSCOLA_MIN 65
#define MAIUSCOLA_MAX 90

#define CIFRA_MIN 48
#define CIFRA_MAX 57

#define PUNTEGGIATURA_MIN 33
#define PUNTEGGIATURA_MAX 47

using namespace std;

void generaPassword(int size, char nMinuscola[], char nMaiuscola[], char nCifra[], char nPunteggiatura[], char nCaratteri);

int main(void) {
	srand(time(NULL));
	
	char nMinuscola[SIZE];
	char nMaiuscola[SIZE];
	char nCifra[SIZE];
	char nPunteggiatura[SIZE];
	char nCaratteri;
	
	generaPassword(SIZE, nMinuscola, nMaiuscola, nCifra, nPunteggiatura, nCaratteri);
	
	return 0;
}

void generaPassword(int size, char nMinuscola[], char nMaiuscola[], char nCifra[], char nPunteggiatura[], char nCaratteri) {
	int nStampa = rand() % (NSTAMPA_MAX - NSTAMPA_MIN + 1) + NSTAMPA_MIN;
	for (int j = 0; j < nStampa; j++) {
		nCaratteri = rand() % (CARATTERI_MAX - CARATTERI_MIN + 1) + CARATTERI_MIN;
		for (int i = 0; i < nCaratteri; i++) {
			nMinuscola[i] = rand() % (MINUSCOLA_MAX - MINUSCOLA_MIN + 1) + MINUSCOLA_MIN;
			cout << nMinuscola[i];
			nMaiuscola[i] = rand() % (MAIUSCOLA_MAX - MAIUSCOLA_MIN + 1) + MAIUSCOLA_MIN;
			cout << nMaiuscola[i];
			nCifra[i] = rand() % (CIFRA_MAX - CIFRA_MIN + 1) + CIFRA_MIN;
			cout << nCifra[i];
			nPunteggiatura[i] = rand() % (PUNTEGGIATURA_MAX - PUNTEGGIATURA_MIN + 1) + PUNTEGGIATURA_MIN;
			cout << nPunteggiatura[i];
		}
		cout << endl;
	}
}