Generator 12-znakowego kodu! Pomocy (zielony)

0

Witam, nie mogę poradzić sobie z napisaniem prostej aplikacji w C++, której zadaniem byłoby generowanie losowych kodów 12-znakowych. Chciałbym, aby miały taki format:
np.: O8PS-SD34-2GH0,
to znaczy 4 znaki, myślnik, kolejne, myślnik i jeszcze raz 4 znaki. Próbowałem coś pisać w Borlandzie, ale jak widać coś mi nie wychodzi, dlatego zwracam się z prośbą o pomoc ;D
Jak na razie jestem jeszcze zielony w tych sprawach więc fajnie by było jakby kod był jakiś prostszy jeżeli się da, chyba wiecie o co mi chodzi ;) Z góry dzięki za pomoc!

0

Pokaż co dotychczas zrobiłeś albo zapłać za komuś za wykonanie tego (dział Praca).

0

Stwórz sobie string ze wszystkimi znakami, które mogą zostać wygenerowane. Wylosuj liczbę z zakresu [0;length_string), weź znak z tego stringu o indeksie wylosowanej liczby, dodaj do stringu z kodem i co 4 znaki dodawaj myślnik.

0

W sumie to próbowałem tylko zdefiniować zmienne char: 24 znaki (litery) i 10 znaków (liczby), i teraz chciałbym, aby po kliknięciu Buttona w okienku Edit generował się ten kod w takim formacie jakim go przedstawiłem. Mam pytanie jak do tablicy wstawić zmienne char, aby można było fajnie losować wtedy funkcją rand()?, bo tyle na razie umiem xd Może trochę chaotycznie piszę, ale mam nadzieję, że można mnie zrozumieć ;) I jeszcze pytanie jak mogę "dokładać" zmienne w oknie Edit->Tekst, w sensie, że mam np. char a='S' i char b='O', to jak napisać, Edit1->Tekst=a+b;? czy jakoś inaczej?

0
stfu napisał(a):

Stwórz sobie string ze wszystkimi znakami, które mogą zostać wygenerowane. Wylosuj liczbę z zakresu [0;length_string), weź znak z tego stringu o indeksie wylosowanej liczby, dodaj do stringu z kodem i co 4 znaki dodawaj myślnik.

String w sensie tablice string?
string tab[np.20]={ABCDEFGHIJKLM123456};
Tak? Sorki jeszcze raz za lamerskie podejście, ale od czegoś trzeba zacząć...

2

nie wiem czy tylko ja miałem problemy ze zrozumieniem tego, ale chyba Ci chodzi po prostu o coś takiego

 char liczby[] ={"1234567890"}

i tak samo z literami

a do dodawaniu do danej zmiennej jakieś wartości to poczytaj o operatorach

edit. string jest klasa, nie potrzebujesz tablicy stringów.
A najlepiej zaczyna się od książki lub google a nie forum ;)

0
char znaki[]="ABCDEFGHIJKLMNOPRSTUWYXZ1234567890"  ;
srand(time(NULL));
Edit1->Text=znaki[rand()%33]; 

To mi działa tylko proszę jeszcze o informacje jak dodać znak do znaku, żeby były wyświetlone wszystkie 4 wylosowane obok siebie?
Bo jak na razie to losuje tylko jeden znak z ciągu...

0

A o pętlach to Ty słyszałeś? Losujesz 4 znaki, wstawiasz myślnik i znowu losujesz 4 znaki.

0
allocer napisał(a):

A o pętlach to Ty słyszałeś? Losujesz 4 znaki, wstawiasz myślnik i znowu losujesz 4 znaki.

for(int i=4;i>0;i--)
Edit1->Text=znaki[rand()%33]; 

Nie o to mi chodzi tylko o to, że nie wiem jak dokleić w Edit1->Text kolejny wylosowany znak... Niech mnie ktoś zrozumie! ;D

1

weź poczytaj jakąś książkę czy podstawowy kurs...
zamiast = napisz +=

0

for(int i=4;i>0;i--) - na takie coś bym nie wpadł.

Ważne, że działa ;)

0

@dymion01: weź jakąś książkę o C++ i spokojnie ją przeczytaj, ponieważ brakuje Ci podstawowych informacji o składni tego języka...

0
fasadin napisał(a):

weź poczytaj jakąś książkę czy podstawowy kurs...
zamiast = napisz +=

Już tak próbowałem, aż taki tępy nie jestem, ale to nie rozwiązuje problemu, Pole Edit1->Text zostaje nawet puste bez żadnego znaku...
Jakieś inne pomysły?

0

Już rozkminiłem jak to zrobić ;)

for(int i=4;i>0;i--)
{
Edit1->Text=Edit1->Text+znaki[rand()%33];
} 

Widocznie "+=" nie działa w tej sytuacji, wszystkim dziękuję za chwilę poświęconą na głupie pytanie zielonego jeszcze w c++. Pójdę za waszymi poradami i przeczytam jakąś dobrą książkę o tym języku. Wielkie Dzięki jeszcze raz ;)

2

Skoro problem rozwiązany, to chyba nikomu nie zaszkodze wrzucając gotowca? ;>

Proszę bardzo, generator losowych kodów (w C, wymaga stdint.h i stdio.h) - ale przeanalizuj to zanim o coś zapytasz...

typedef struct {
    uint16_t datA, datB, datC; 
} code;

void toString(code c, char str[15]){
    sprintf(str, "%.4X-%.4X-%.4X", c.datA, c.datB, c.datC);
}

code randomCode(){
    code result = { rand(), rand(), rand() };
    return result;
}

Przykład użycia w konsoli:

int main() {
    srand(time(0));

    char buf[15];
    code c = randomCode();
    toString(c, buf);

    printf("%s", buf);
}
0
string codeMaker(int parts, int chars, random_device &rnd)
{
	string signs =
		//"abcdefghijklmnopqrstuvwxyz"
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        "1234567890";
	string result;
	random::uniform_int_distribution<> index_dist(0, signs.size()-1);
	for(int i=0;i<parts;i++)
	{
		for(int j=0;j<chars;j++)
		{
			result += signs[index_dist(rnd)];
		}
		if(i!=parts-1)result += '-';
	}
	return result;
}

Z wykorzystaniem boost::random

0

Tradycyjnie:

#include <cstdlib>
#include <ctime>
#include <cstdio>
#include <algorithm>

const char code_char_set[] = "ABCDEFGHIJKLMNOPRSTUWYXZ1234567890";

typedef char Code[16];

char RandomCodeChar() { return code_char_set[std::rand() % sizeof(code_char_set)]; }
void GenerateRandomCode(Code *c) { std::generate(*c, *c + sizeof(*c), RandomCodeChar); }
void PrintCode(const Code &c) { std::printf("%.4s-%.4s-%.4s-%.4s", c, c + 4, c + 8, c + 12); }

int main() {
	std::srand(time(NULL));

	Code code;
	GenerateRandomCode(&code);
	PrintCode(code);
}
0

czemu mnie się zdaje, że tu nie miejsce na random?
no możn trzymać kciuki, że się nie zawali, ale to chyba głupie.

0

Najkrótsza metoda:

	srand(time(NULL));
	std::string c = "1234567890ABCDEFGHIJKLMNOPRSTUWYXZ";
	std::random_shuffle(c.begin(),c.end());
	c.resize(12);
	std::for_each(c.begin(),c.end(),[](char s)->void 
	{static int l = 1; std::cout << s; if(!(l%4)) std::cout << '-'; l++;}); 
0

Ja uzywam czegos takiego:

void get_random_str(char *dest, int len)
{
const   char	*chars="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
	int	max=0;
	int	i=0;

	max = strlen(chars);

	srand(time(NULL)*getpid());

	for ( i=0; i<len; i++ )
		dest[i] = chars[rand() % max];

	dest[i] = EOS;
}

getpid() zwraca nr procesu, co daje bardziej przypadkowy wynik.

Oczywiscie EOS to '\0'.

0

Taką aplikację napisałem w Delphi w 5 minut, chętnie oddam kod źródłowy :)

0

Text jest właściwością dlatego nie można uzyć operatora +=. W taki sposób:

for(int i=4;i>0;i--)
Edit1->Text = Edit1->Text + znaki[rand()*33];

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