View Full Version : [C++]Struct complesso
MaxGuevara
16-01-2006, 01:39
Devo fare una specie di database che contenga degli indirizzi email,delle date di nascita,dei numeri di telefono eccetera,ed avere la possibilita' di aggiungere degli utenti.
Mi spiego meglio,ho fatto uno struct del genere:
struct archivio{
char nome;
char indirizzo;
char email;
}utente;
In questo modo pero' posso gestire i dati di una sola persona,nel caso "utente".
C'e' un modo in cui io possa gestire un numero illimitato di utenti?O almeno,non dico illimitato,ma almeno maggiore.
Potresti utilizzare un <vector> o una <list> di tali oggetti, o manualmente creare un puntatore alla struct e gestire a modi linked list il tutto.
Ma visto che lo fa la STL... perke perdere tempo? ;)
MaxGuevara
16-01-2006, 14:50
Grazie.
Potresti farmi degli esempi?
Sarebbe corretto se mettessi un array?
per esempio:
struct archivio
{
char nome;
char email;
char indirizzo;
}utente[40];
in modo che quando vado ad aggiungere degli utenti basta che faccia un ciclo
for?
maxithron
16-01-2006, 15:03
usare la `struct` è condizione necessaria?
Grazie.
Potresti farmi degli esempi?
Sarebbe corretto se mettessi un array?
per esempio:
struct archivio
{
char nome;
char email;
char indirizzo;
}utente[40];
in modo che quando vado ad aggiungere degli utenti basta che faccia un ciclo
for?
Ciao, tieni presente solo alcune cose: nei tuoi due post vedo che hai messo nella struttura dei campi di 1 solo carattere. Occhio che così non basta! Inoltre dichiarare una variabile direttamente con la struct ... beh, secondo me è bruttissimo. ;)
Un esempio più valido:
struct archivio
{
char nome[30];
char email[40];
char indirizzo[60];
};
Poi se sai di aver bisogno di 40 utenti puoi fare certamente:
struct archivio utenti[40];
usare la `struct` è condizione necessaria?
Se vuoi "aggregare" insieme più dati di tipo diverso in un unico "contenitore", sì.
maxithron
16-01-2006, 15:14
Se vuoi "aggregare" insieme più dati di tipo diverso in un unico "contenitore", sì.
Mi riferivo alle classi ;)
Ciò che volevo sapere era se utilizzare la struct fosse un compito didattico assegnatogli.
Mi riferivo alle classi ;) oops... come non detto
Ciò che volevo sapere era se utilizzare la struct fosse un compito didattico assegnatogli.Io direi che in ogni casi gli conviene usare una struct, altrimenti si incasina soltanto. ;)
Fenomeno85
16-01-2006, 18:32
se non sai quanti saranno gli utenti allora l'ideale è usare una lista e, dato che stai usando il c++ allora farei una bella classe :D
~§~ Sempre E Solo Lei ~§~
MaxGuevara
17-01-2006, 00:35
E' "indicato" l'uso dello struct,ma provate a farmi un esempio con le liste e le classi.
Comunque era solo a titolo esplicativo l'aver messo le variabili di un solo carattere.
visto che lavori in C++...
la struct ha accesso public di default, quindi se la lasci cosi chiunque, anche dall'esterno, puo accedere e modificare i dati.
invece di char[] per nome e cognome potresti usare <string>, cosi come, invece di usare un vettore di 40 elementi, potresti usare <vector> in modo da poter gestire un numero qualsiasi di utenti (e se poi sono piu di 40?)
Visto che tutte ste cose le fa la STL... oltre che piu sicuro, direi che è anche piu veloce da fare
Fenomeno85
17-01-2006, 17:06
visto che lavori in C++...
la struct ha accesso public di default, quindi se la lasci cosi chiunque, anche dall'esterno, puo accedere e modificare i dati.
invece di char[] per nome e cognome potresti usare <string>, cosi come, invece di usare un vettore di 40 elementi, potresti usare <vector> in modo da poter gestire un numero qualsiasi di utenti (e se poi sono piu di 40?)
Visto che tutte ste cose le fa la STL... oltre che piu sicuro, direi che è anche piu veloce da fare
ma usando le classi e usando un puntatore a una lista in modo protect mi spieghi come fai accedere alla lista? :mbe:
~§~ Sempre E Solo Lei ~§~
Fenomeno85
17-01-2006, 17:07
E' "indicato" l'uso dello struct,ma provate a farmi un esempio con le liste e le classi.
Comunque era solo a titolo esplicativo l'aver messo le variabili di un solo carattere.
guarda lasciami 30 minuti (spero che mi bastano) perchè mi devo fare un ese in matlab di segnali poi ti butto giù due righe e ti faccio vedere come si usa una lista sotto classe ;)
~§~ Sempre E Solo Lei ~§~
Fenomeno85
17-01-2006, 18:04
#include "stdafx.h"
using namespace std;
struct data{
int num;
};
struct nodo {
data value;
nodo *pNext;
};
class list{
public:
list ();
~list ();
void insert_value (int val);
void see_list ();
private:
nodo *Testa;
};
/* costruttore */
list::list (){
Testa = NULL;
}
/* distruttorre */
list::~list (){
nodo *x;
while (Testa != NULL){
x = Testa;
Testa = Testa->pNext;
delete (x);
}
}
/* metodo per inserire il valore nella lista */
void list::insert_value(int val){
nodo *x;
x = new (nodo);
x->pNext = Testa;
x->value.num = val;
Testa = x;
}
/* mostra lista */
void list::see_list (void){
nodo *x;
x = Testa;
while (x!=NULL){
cout << "Valore:\t" << x->value.num<<endl;
x = x->pNext ;
}
}
/* main */
int main(void)
{
int n, val;
list lista_int;
cout << "Inserisci il numero di elementi da caricare:\t";
cin >> n;
for (int i=0;i<n;i++){
cout << "Inserisci il "<<i+1<<"numero:\t";
cin >>val;
lista_int.insert_value (val);
}
cout << "Lista:"<<endl<<endl;
lista_int.see_list ();
system ("PAUSE");
return 0;
}
~§~ Sempre E Solo Lei ~§~
zerocool_pe
17-01-2006, 20:31
Allora.....si la struct è necessaria, altrimenti come faresti a inserire + informazioni di uno stesso studente???Magari usa anche delle struct annidate.
Quello che devi fare è creare una lista collegata di studenti. Ti spiego meglio...una lista contiene degli elementi...uno di questi puo essere un intero, una stringa, o una struct, e l'altro è un puntatore all'elemento successivo (la struct è come se fai un typedef che pero contiene molte informazioni).
TI FACCIO UN ESEMPIO
Per creare una lista di interi la struct deve essere:
struct elemento;
{
int valore;
elemento*succ;
};
poi se vuoi fare una lista di struct devi andare a toccare solo INT VALORE...ovviamente devi dare da input o inizializzare una variabile al numero di persone che ti servono.
Non ti consiglio di utilizzare char e quindi un array di carattere, poiche altrimenti hai difficoltà nell'immissione dei dati...usa le string (#include <string>).....
Per leggere le stringhe pero non utilizzare il solito CIN xke altrimenti il programma non riesce a leggere gli spazi...
TI POSTO UNA FUNZIONE PER LEGGERE LE STRINGHE
void LetturaStringa(string & parola)
{
char ch;
st="";
cin.get(ch);
if (ch!='\n') st=ch;
while (cin.get(ch) && ch!=''\n'')
st += ch;
}
ovviamente per leggere una stinga usi la funzione passando il dato per valore;
ex: LetturaStringa (parola)
Parola diventa ST, la funzione legge (cioe scrivi) la stringa e con la & (passaggio per riferimento) la ricede al main.....per altri chiarimenti scrivimi
pantajazz@hotmail.com
CIAO E BUON C++
Fenomeno85
17-01-2006, 20:35
Allora.....si la struct è necessaria, altrimenti come faresti a inserire + informazioni di uno stesso studente???Magari usa anche delle struct annidate.
Quello che devi fare è creare una lista collegata di studenti. Ti spiego meglio...una lista contiene degli elementi...uno di questi puo essere un intero, una stringa, o una struct, e l'altro è un puntatore all'elemento successivo (la struct è come se fai un typedef che pero contiene molte informazioni).
TI FACCIO UN ESEMPIO
Per creare una lista di interi la struct deve essere:
struct elemento;
{
int valore;
elemento*succ;
};
poi se vuoi fare una lista di struct devi andare a toccare solo INT VALORE...ovviamente devi dare da input o inizializzare una variabile al numero di persone che ti servono.
Non ti consiglio di utilizzare char e quindi un array di carattere, poiche altrimenti hai difficoltà nell'immissione dei dati...usa le string (#include <string>).....
Per leggere le stringhe pero non utilizzare il solito CIN xke altrimenti il programma non riesce a leggere gli spazi...
TI POSTO UNA FUNZIONE PER LEGGERE LE STRINGHE
void LetturaStringa(string & parola)
{
char ch;
st="";
cin.get(ch);
if (ch!='\n') st=ch;
while (cin.get(ch) && ch!=''\n'')
st += ch;
}
ovviamente per leggere una stinga usi la funzione passando il dato per valore;
ex: LetturaStringa (parola)
Parola diventa ST, la funzione legge (cioe scrivi) la stringa e con la & (passaggio per riferimento) la ricede al main.....per altri chiarimenti scrivimi
pantajazz@hotmail.com
CIAO E BUON C++
scusa allora invece di fare tutto sto mecello basta che usa per le stringhe il tipo string ;)
~§~ Sempre E Solo Lei ~§~
zerocool_pe
17-01-2006, 20:53
no.....se tu fai:
string parola;
cin >> parola;
e inserisci una parola con lo spazio, per esempio un cognome: "Di Felice".....il programma si interrompe...serve obbligatoriamente una funzione come quella che ho fatto io
no.....se tu fai:
string parola;
cin >> parola;
e inserisci una parola con lo spazio, per esempio un cognome: "Di Felice".....il programma si interrompe...serve obbligatoriamente una funzione come quella che ho fatto io
Ehm... _Se_non_ricordo_male_ alcune implementazioni di C++ permettono anche per questo caso di usare il manipolatore "noskipws" (la mia versione di g++ no).
Un'altra possibilita' e' usare la getline:
#include <iostream>
#include <string>
int main()
{
std::cout << "E scrivi qualcosa... " << std::endl;
std::string the_input;
getline(std::cin, the_input);
std::cout << std::endl << "Hai scritto: " << the_input << std::endl;
return 0;
}
Ehm... _Se_non_ricordo_male_ alcune implementazioni di C++ permettono anche per questo caso di usare il manipolatore "noskipws" (la mia versione di g++ no).
Lasciate perdere questa frase... Ho fatto mooolta confusione...
La getline invece (IMHO) e' il modo corretto.
zerocool_pe
22-01-2006, 20:29
Si, anke cosi va bene...a me pero rimane molto piu facile usare una funzione che me la salvo ogni volta e la copio e incollo dove vogliio
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.