Generator 12-znakowego kodu! Pomocy (zielony)

Generator 12-znakowego kodu! Pomocy (zielony)
dymion01
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:8
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!


"Gdy cię mają wieszać, poproś o szklankę wody. Nigdy nie wiadomo, co się wydarzy, zanim przyniosą" - Andrzej Sapkowski "Wszyscy ludzie są mądrzy: jedni przedtem, inni potem" - Chinese Proverb
edytowany 1x, ostatnio: dymion01
allocer
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 11 lat
1

Idiots, idiots everywhere.
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

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


ST
  • Rejestracja:prawie 15 lat
  • Ostatnio:ponad 11 lat
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.


Pozdro & poćwicz!
dymion01
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:8
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?


"Gdy cię mają wieszać, poproś o szklankę wody. Nigdy nie wiadomo, co się wydarzy, zanim przyniosą" - Andrzej Sapkowski "Wszyscy ludzie są mądrzy: jedni przedtem, inni potem" - Chinese Proverb
dymion01
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:8
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ąć...


"Gdy cię mają wieszać, poproś o szklankę wody. Nigdy nie wiadomo, co się wydarzy, zanim przyniosą" - Andrzej Sapkowski "Wszyscy ludzie są mądrzy: jedni przedtem, inni potem" - Chinese Proverb
fasadin
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
2

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

Kopiuj
 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 ;)

edytowany 1x, ostatnio: fasadin
msm
char liczby[] ={"1234567890"} - albo char *liczby, albo = "123467890" - obecna forma jest niepoprawna.
fasadin
a czy tablica nie jest po prostu stałym wskaźnikiem? Czemu jest nieprawidłowe? Chyba nawet w symfonii standard jest tak zapisany jeden z przykładów
msm
Może nie tyle niepoprawnie, co nadmiarowo - wystarczy char liczby[] ="1234567890" (bez nawiasów), używasz formy inicjalizacji struktur - tak jakbyś napisał int a = { 3 }; - ogólnie nie przejmuj się, po prostu się czepiam :>
fasadin
rzeczywiście nie zauważyłem, że napisałem nadmiarowe dlatego tak się zdziwiłem ;) dzięki za spostrzegawczość.
dymion01
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:8
0
Kopiuj
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...


"Gdy cię mają wieszać, poproś o szklankę wody. Nigdy nie wiadomo, co się wydarzy, zanim przyniosą" - Andrzej Sapkowski "Wszyscy ludzie są mądrzy: jedni przedtem, inni potem" - Chinese Proverb
allocer
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 11 lat
0

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


Idiots, idiots everywhere.
dymion01
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:8
0
allocer napisał(a):

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

Kopiuj
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


"Gdy cię mają wieszać, poproś o szklankę wody. Nigdy nie wiadomo, co się wydarzy, zanim przyniosą" - Andrzej Sapkowski "Wszyscy ludzie są mądrzy: jedni przedtem, inni potem" - Chinese Proverb
fasadin
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
1

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

dymion01
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:8
0

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

Ważne, że działa ;)


"Gdy cię mają wieszać, poproś o szklankę wody. Nigdy nie wiadomo, co się wydarzy, zanim przyniosą" - Andrzej Sapkowski "Wszyscy ludzie są mądrzy: jedni przedtem, inni potem" - Chinese Proverb
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

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


dymion01
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:8
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?


"Gdy cię mają wieszać, poproś o szklankę wody. Nigdy nie wiadomo, co się wydarzy, zanim przyniosą" - Andrzej Sapkowski "Wszyscy ludzie są mądrzy: jedni przedtem, inni potem" - Chinese Proverb
edytowany 1x, ostatnio: dymion01
dymion01
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:8
0

Już rozkminiłem jak to zrobić ;)

Kopiuj
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 ;)


"Gdy cię mają wieszać, poproś o szklankę wody. Nigdy nie wiadomo, co się wydarzy, zanim przyniosą" - Andrzej Sapkowski "Wszyscy ludzie są mądrzy: jedni przedtem, inni potem" - Chinese Proverb
msm
Administrator
  • Rejestracja:prawie 16 lat
  • Ostatnio:5 miesięcy
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...

Kopiuj
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:

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

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

    printf("%s", buf);
}
Patryk27
Ale nie losuje liter :<
msm
Losuje, tylko że szesnastkowe więc jest jeszcze bardziej hackerski ;>
KR
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:353
0
Kopiuj
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

adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 12 lat
0

Tradycyjnie:

Kopiuj
#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);
}
edytowany 1x, ostatnio: adf88
Xitami
  • Rejestracja:ponad 20 lat
  • Ostatnio:około rok
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.

robcio
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:Opole
  • Postów:533
0

Najkrótsza metoda:

Kopiuj
	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++;}); 

Nie odpowiadam na PW z prośbą o pomoc programistyczną.
GD
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:39
0

Ja uzywam czegos takiego:

Kopiuj
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'.


And remember, Beethoven wrote his first symphony in C.
edytowany 2x, ostatnio: gd
msm
Trochę WTF-owe rozwiązanie z getpid()em - 1) nieprzenośne. 2) getpid() nie daje bardziej przypadkowego wyniku (pomijając sytuację gdy uruchamiasz n programów w jednym momencie) - za to użycie srand(getpid())jest mało bezpieczne (w przypadku zastosowań gdzie bezpieczeństwo ma znaczenie... nie żeby rand się do tego i tak nadawał), ponieważ jeśli ktoś pozna pid to może przewidzieć losowane liczby. Ale u Ciebie tego nie ma, skoro tak czy inaczej mnożysz to z time.
GD
W moim zastosowaniu nie ma takiej mozliwosci zeby ktos poznal pid :) BTW: Jakbys sie zabezpieczyl w sytuacji, w której jest ryzyko "podsluchu"?
msm
Do zastosowań kryptograficznych to się i tak srand() i rand() nie nadaje, przydałoby się czytać z jakiegoś dedykowanego urządzenia zewnętrznego (albo chociaż najniższy bit wejścia mikrofonu jest podobno całkiem niezłym źródłem losowości).
GD
Ciekawy pomysl :)
0

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

msm
Ja w C w minutę, już oddałem kod źródłowy...
Rekman
  • Rejestracja:prawie 13 lat
  • Ostatnio:prawie 10 lat
  • Postów:148
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];

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.