Generator haseł

0

Cześć,

Jestem zielona w programowaniu,
mam napisać pseudolosowy generator haseł (co najmniej: 1 wielka litera, 1 cyfra, 1 znak specjalny; spółgłoski i samogłoski nie mogą sąsiadować ze sobą).
Napisałam program, ale hasło nie zawsze spełnia powyższy warunek (tzn. czasem nie ma cyfry lub znaku).
Nie potrafię znaleźć błędu/błędów. Wydaje mi się, że jest on w pętli.

Proszę o pomoc :)

Kod:

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
#include <cctype>


using namespace std;

int losuj( int a, int b)
{
	return a+rand()%(b-a);                                              // funkcja losujaca
}


string sam = "aeiouy";                                                //deklaracja znaków do hasla
string spol = "bcdfghjklmnpqrstvwxz";
string spec = "!@#$%^&*()_+";
string li = "1234567890";

int main()
{
    int i;
    int n;
    int x;
    int m;
    int h;
    int p;
    int lp;
    int licznik;
    char znak;
    srand(time(0));
    bool f=true;


        cout << "Program generujacy n-literowe haslo.\n" << endl;

        cout << "Ile liter ma miec twoje haslo? (co najmniej 3).\n" << endl;
        cin >> n;                                                                   //dlugosc hasla

        char  haslo[n];

        if (n<3)
        {
            cout << "Haslo jest zbyt krotkie" << endl;
        }

        else
            {
                for (i=0; i<n; i++)
                {
                    haslo[i] = (f)?spol[losuj(0, spol.length())]:sam[losuj(0, sam.length())];      //zapelniam haslo naprzemiennie samogloskami i spolgloskami ( takie samego typu 2 nie moga byc obok siebie
                    f=!f;



                cout << haslo[i] << endl;
                }


                lp = rand () % (n-2)+1;

                for(i=0; i<lp; i++)
                {

                    m = rand()%(n-1)+1;                                 //losuje cyfry
                    haslo[m] = li[losuj(0, li.length())];


                    p = rand()%(n-1)+1;

                     /*cout << "lp= " << lp << endl;  // probowalam znalezc, w ktorym etapie jest blad
                     cout << "i= " << i << endl;
                      cout << "m= " << m << endl;
                       cout << "p= " << p << endl;*/


                    if (m==p)
                    {
                         do
                        {
                           p = rand()%(n-1)+1;                              //losujowanie dla znakow specjalnych
                           cout << "kolejne p= " << p << endl;
                        }
                        while(m=!p);
                        haslo[p] = spec[losuj(0, spec.length())];

                    }
                    else
                    {

                        haslo[p] = spec[losuj(0, spec.length())];


                    }


                }
                    licznik=0;
                    for(i=0; i<n; i++)
                    {

                        if (isalpha(haslo[i]))
                        {
                            if (licznik==0)                                            //zwiekszam niektore litery (co najmniej jedna ma byc wielka)
                            haslo[i]=toupper(haslo[i]);
                            licznik=1;
                        }

                    }

                    cout << n << "-znakowe haslo to: ";

                    for(i=0; i<n; i++)
                    {
                        cout << haslo[i];
                    }

            }




}
1
  1. Zapoznaj się z pojęciem formatowania kodu: http://4programmers.net/Forum/998482
  2. Zapoznaj się z inkrementacją, bo jej nie rozumiesz: http://4programmers.net/Forum/1101404
  3. Nie używaj innego niż angielskie nazewnictwa: http://4programmers.net/Forum/1208091
  4. Już było parę dni temu, wystarczy poszukać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1