Cześć, pisałem ostatnio własny projekt - mianowicie generator nicków w C++. Wszystko się kompiluje, tylko czasami nicki są za krótkie. Próbowałem robić kilka zabezpieczeń, ale to nic nie zmieniło. Mój algorytm opiera się na losowaniu długości nicku, później spółgłosek i samogłosek, a następnie zamianę ich na litery.
#include <iostream>
#include <ctime>
#include <cstdlib>
#include "nick.h"
using namespace std;
int main()
{
srand(time(NULL));
int minLength, maxLength, amountOfNicknames;
nick nick;
nick.loadConsonants();
do
{
cout << "Minimal nickname`s length: ";
cin >> minLength;
if(minLength<=0) cout << "Minimal length have to be greater than zero" << endl;
}
while(minLength<=0);
do
{
cout << "Maximal nickname`s length: ";
cin >> maxLength;
if(maxLength<minLength) cout << "Maximal length have to be greater" << endl;
}
while(maxLength<minLength);
cout << "Amount of nicknames: ";
cin >> amountOfNicknames;
for(int i=0; i<amountOfNicknames; i++)
{
nick.randomAmount(minLength,maxLength);
cout << nick.randomize() << endl;
}
return 0;
}
#include <string>
class nick
{
public:
int vowelsNumber, consonantsNumber, randomLength; //samogloska, spólgloska
std::string consonants[18], vowels[6], nickname;
int randomAmount(int min, int max);
void loadConsonants();
std::string randomize();
};
#include "nick.h"
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <cctype>
using namespace std;
int nick::randomAmount(int min, int max)
{
randomLength =( rand() % (max-min) ) + min;
vowelsNumber =( rand() % (randomLength*3/4 - randomLength*1/4) ) + randomLength*1/4 +1;
consonantsNumber = randomLength - vowelsNumber;
return vowelsNumber, consonantsNumber, randomLength;
}
void nick::loadConsonants()
{
fstream consonantsList, vowelsList;
string line;
int lineNumber=0;
consonantsList.open("consonants.txt", ios::in);
if(consonantsList.good()==false) cout << "Couldn`t load consonants.txt" << endl;
while (getline(consonantsList, line) && !consonantsList.eof())
{
consonants[lineNumber]=line;
lineNumber++;
}
consonantsList.close();
lineNumber=0;
vowelsList.open("vowels.txt", ios::in);
if(vowelsList.good()==false) cout << "Couldn`t load vowels.txt" << endl;
while (getline(vowelsList, line) && !vowelsList.eof())
{
vowels[lineNumber]=line;
lineNumber++;
}
vowelsList.close();
}
string nick::randomize()
{
int vowelCounter=0, consonantCounter=0;
nickname="";
for(int i=0; i < randomLength; i++)
{
if(rand()%2==0 && consonantsNumber>0 && (consonantCounter<2 || vowelsNumber==0))
{
nickname+=consonants[rand()%18];
consonantsNumber--;
consonantCounter++;
vowelCounter=0;
}
else if(vowelsNumber>0 && (vowelCounter<2 || consonantsNumber==0))
{
nickname+=vowels[rand()%6];
vowelsNumber--;
vowelCounter++;
consonantCounter=0;
}
nickname[0]=toupper(nickname[0]);
}
return nickname;
}