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!

- Rejestracja:ponad 12 lat
- Ostatnio:ponad 12 lat
- Postów:8

- Rejestracja:ponad 14 lat
- Ostatnio:ponad 11 lat

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

- Rejestracja:ponad 12 lat
- Ostatnio:ponad 12 lat
- Postów:8
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ąć...

- Rejestracja:ponad 13 lat
- Ostatnio:prawie 3 lata
- Postów:4882
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 ;)

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


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

- Rejestracja:ponad 13 lat
- Ostatnio:prawie 3 lata
- Postów:4882
weź poczytaj jakąś książkę czy podstawowy kurs...
zamiast = napisz +=

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

- Rejestracja:ponad 12 lat
- Ostatnio:ponad 12 lat
- Postów:8
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 ;)

- Rejestracja:prawie 16 lat
- Ostatnio:4 miesiące
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);
}
- Rejestracja:prawie 14 lat
- Ostatnio:ponad 2 lata
- Postów:353
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

- Rejestracja:ponad 21 lat
- Ostatnio:prawie 12 lat
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);
}

- Rejestracja:prawie 13 lat
- Ostatnio:ponad 10 lat
- Lokalizacja:Opole
- Postów:533
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++;});
- Rejestracja:ponad 12 lat
- Ostatnio:ponad 12 lat
- Postów:39
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'.


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

= "123467890"
- obecna forma jest niepoprawna.fasadinchar 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