Zdravim
Mam strukturu v ktorej sa nachadza 10 krstnych mien. A ja chcem nahodne vybrat a vypisat jedno z nich, len neviem ako na to. :ehm:
Fórum › C / C++
Ako na strukturu
Nejsp?? m?te probl?m generovat n?hodn? ??slo. Sice neum?m generovat pseudon?hodn?, ale zn?m takov? jednodu??? ?e?en?:
#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
int cislo;
cout << "napiste cislo od 0 do 65 000n";
cin >> cislo;
srand(cislo);
cout << "Vase nahodne cislo z deseti je: " << (rand() % 10)+1 << endl;
system("PAUSE");
}
?No neviem co to je pseudonahode (kto vie nech sa prihlasi budem rad) ja nahodne cislo do desat generujem tak:
#include <conio.h>
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
srand((unsigned)time(NULL));
int i=rand()%10;
cout<<i;
getch();
return 0;
}
Len neviem ako podla nahodneho cislo nahodne vybrat clena sturktury. :((
ale dakujem za snahu
No, tak to, co pisete vy, je losovani pseudonahodneho cisla(protoze ty cisla jsou jenom 32bit, coz neni zrovna moc kombinaci), kdybyste chtel opravdu nahodne cislo tak na to musite pouzit nejakou knihovnu, nebo pod Windows treba CryptGenRandom. Jinak random()%10, losuje v intervalu <0, 9>, takze desitka se nevylosuje nikdy. Ale ted k vasemu problemu - to myslim ani vyresit nepujde(mozna by to slo nejak prasacky-pres aritmetiku ukazatelu),a le to vzm silne nedoporucuji.
Jedine, i kdyz nehezke, reseni by mozna bylo:
char* Generuj(struktura * p)
{
srand(time(NULL));
int num = rand()%10;
switch (num){
case 0:
return p->jmeno1;
case 1:
return p->jmeno2;
//...
}
}
Vyskusaj toto. Pole staci uz len vlozit do struktury.
#include <iostream>
using namespace std;
int main()
{
char * krstneMena[] = {"Jozo",
"Fero",
"Marek",
"Peto",
"Tomas",
"Samo",
"Tibor",
"Juraj",
"Stefan",
"Ronald"};
int cislo;
for(int j = 0; j < 10; j++)
{
cislo = rand()%10;
cout << krstneMena[cislo] << endl;
}
system("pause");
return 0;
}
Napr. takto:
#include <iostream>
using namespace std;
struct Programatori
{
char meno[20];
};
int main()
{
int cislo;
char * krstneMena[] = {"Jozo",
"Fero",
"Marek",
"Peto",
"Tomas",
"Samo",
"Tibor",
"Juraj",
"Stefan",
"Ronald"};
Programatori programatori[10];
cout << "Zaklad:\n\n";
for(int j = 0; j < 10; j++)
{
strcpy(programatori[j].meno, krstneMena[j]);
}
for(int j = 0; j < 10; j++)
{
cout << programatori[j].meno << endl;
}
cout << endl << "Nahodne:\n\n";
for(int j = 0; j < 10; j++)
{
cislo = rand()%10;
cout << programatori[cislo].meno << endl;
}
system("pause");
return 0;
}
N?kolik p??klad?:
#include <ctime>
#include <cstdlib>
#include <iostream>
void load_string(char * var, char * str) { //Neznam jinou funkci
int j;
for(j = 0; str[j] != 0; j++) {
var[j] = str[j];
}
var[j] = ' ';
};
//#define ONE 1 //Classic style
//#define TWO 1 //Co takhle dat si vlozenou strukturu?
//#define THREE 1 // Co takhle dynamicky alokovat?
// Posledni, dle me nejelegantnejsi reseni(Vsechny defy zakom. == posl. reseni)
#ifdef ONE //Classic style
struct meno {
char jmeno[20];
};
using namespace std;
int main()
{
meno zoznam[10];
load_string(zoznam[0].jmeno, "Franta");
load_string(zoznam[1].jmeno, "Jozo");
load_string(zoznam[2].jmeno, "Fero");
load_string(zoznam[3].jmeno, "Marek");
load_string(zoznam[4].jmeno, "Tomas");
load_string(zoznam[5].jmeno, "Samo");
load_string(zoznam[6].jmeno, "Tibor");
load_string(zoznam[7].jmeno, "Juraj");
load_string(zoznam[8].jmeno, "Stefan");
load_string(zoznam[9].jmeno, "Ronald");*/
srand((unsigned)time(NULL));
int cislo;
for(int j = 0; j < 10; j++)
{
cislo = rand()%10;
cout << zoznam[cislo].jmeno << endl;
}
system("pause");
return 0;
}
#elif TWO //Co takhle dat si vlozenou strukturu?
struct zoznam {
typedef struct meno {
char men[20];
} meno;
meno mena[10];
char * id(int j);
};
char * zoznam::id(int j) {
return (mena[j].men);
};
using namespace std;
int main()
{
zoznam zamestnamci;
load_string(zamestnamci.id(0), "Franta");
load_string(zamestnamci.id(1), "Jozo");
load_string(zamestnamci.id(2), "Fero");
load_string(zamestnamci.id(3), "Marek");
load_string(zamestnamci.id(4), "Tomas");
load_string(zamestnamci.id(5), "Samo");
load_string(zamestnamci.id(6), "Tibor");
load_string(zamestnamci.id(7), "Juraj");
load_string(zamestnamci.id(8), "Stefan");
load_string(zamestnamci.id(9), "Ronald");
srand((unsigned)time(NULL));
int cislo;
for(int j = 0; j < 10; j++)
{
cislo = rand()%10;
cout << zamestnamci.id(cislo) << endl;
}
system("pause");
return 0;
}
#elif THREE // Co takhle dynamicky alokovat?
/*
Toto reseni je sice podivne, pac toho jeste moc
neumim, ale zda se byt funkcni
*/
//meno je pracovni typ pro 'zoznam'
struct meno { //Sem ukladam jednotlivy retezce
int size; //Velikost retezce
char * men; //Pole znaku (retezec)
void init(); //Nastaveni hodnoty size na 0;
void load(char * str); //pridani noveho retezce
void unset(); //Smaznuti dynamycky alokovaneho retezce
};
void meno::init() {
size = 0;
}
void meno::load(char * str) {
int j;
if(size != 0) delete []men; //Aby mi neunikala pamet
for(j = 0; str[j] != 0; j++); //Neumim jinak zjistit velikost
men = new char[j];
size = j;
for(j = 0; j != size; j++) {
men[j] = str[j];
}
men[j] = ' ';
}
void meno::unset() {
delete []men;
}
//Typ zoznam jen ma fce jen pro pridani/navraceni retezce
struct zoznam { //Pole retezcu
int size; //Velikost pole
meno * mena; //Odkaz na zacatek pole
void init(); //Pocatecni nastaveni promennych
void add(char * str); //Pridani retezce do pole
char * get(int id); //Navraceni uciteho retezce pod jeho indexem
void unset(); //smazani vsech dynamycky alokovanych promennych
};
void zoznam::init() {
size = 0;
mena = new meno[1]; //Inicializace promenne
}
void zoznam::add(char * str) {
size++;
meno * m = new meno[size];
for(int j = 0; j != size; j++) {
m[j] = mena[j];
}
delete []mena;
mena = m;
mena[size-1].init();
mena[size-1].load(str);
}
char * zoznam::get(int id) {
return mena[id].men;
}
void zoznam::unset() {
for (int j = 0; j != size; j++) {
mena[j].unset();
}
delete []mena;
}
using namespace std;
int main()
{
zoznam z;
z.init();
z.add("Franta");
z.add("Jozo");
z.add("Fero");
z.add("Marek");
z.add("Tomas");
z.add("Samo");
z.add("Tibor");
z.add("Juraj");
z.add("Stefan");
z.add("Ronald");
srand((unsigned)time(NULL));
int cislo;
for(int j = 0; j < 10; j++)
{
cislo = rand()%10;
cout << z.get(cislo) << endl;
}
z.unset();
system("pause");
return 0;
}
#else // Nejelegantnejsi reseni
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<string> zamestnamci;
zamestnamci.push_back("Franta");
zamestnamci.push_back("Jozo");
zamestnamci.push_back("Fero");
zamestnamci.push_back("Marek");
zamestnamci.push_back("Tomas");
zamestnamci.push_back("Samo");
zamestnamci.push_back("Tibor");
zamestnamci.push_back("Juraj");
zamestnamci.push_back("Stefan");
zamestnamci.push_back("Ronald");
srand((unsigned)time(NULL));
int cislo;
for(int j = 0; j < 10; j++)
{
cislo = rand()%10;
cout << zamestnamci[cislo] << endl;
}
system("pause");
return 0;
}
#endif
Tak tady vid?te p?r n?pad? z m? amatersk? snahy.?:D?
Edit: zapomn?l jsem na form?tovani i-?ek
d1ce: Ted vam asi pokazim naladu, ale mam jednu vycitku. Vsiml jsem si, ze sice teprve pisete, ze se ucite(to mam na mysli u toho dyn. prikladu), ale rad bych vas upozornil na jeden dulezity fakt. Pokud pouzivate nekde ve strukture(tride) ukazatele, tak byste mel pretizit operator prirazeni a definovat si vlastni kopirovaci konstruktor. A to proto, ze kopy kostruktor a aoperator prirazeni, ktery vygeneruje kompilator, vytvori pouze tzv. melke kopie.
A? zvl?dnu to co mi vyt?k?te, tak to jist? vyu?iji, ale zat?m po??d z?pas?m se spr?vnou spr?vou pam?ti, a proto jsem se pokusil o dynamick? pole retezc?. Nicm?n? d?ky za kritiku, alespo? m?m v?c chuti se zase n?co nov?ho nau?it. ?:pc:?
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Strukturu new — založil pep
Pointer na strukturu — založil Fugii
Pointer na strukturu — založil Pavelv
Pointer na strukturu — založil Romča
Moderátoři diskuze