Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2006
    Messaggi
    8

    come si usa struct ? (C)

    ciao ragazzi, volevo sapere come in un programma si utilizza lo struct quando ad esempio devo inserire dei nomi e a questi deve corrispondere la via, il numero, il cap, ecc. Cioè supponiamo che il programma mi dice :
    inserire nome. Inserisco il nome e poi mi dice:vuoi sapere in formazioni(via, cap,ecc)del nome messo?.
    Credo che in questo programma dovrei utilizzare la struct in modo da riempire per ogni nome messo i relativi campi.
    Codice:

    struct { char via;
    int numero;
    int cap;
    } persona;


    Il mio problema è come faccio a caricare i dati di ogni persona? in modo che quando inserisco il nome mi da via, cap, ecc? Oppure dove li carico, e come li carico? Poi un'altra cosa come faccio a definire una stringa? cioè un nome (ciccio)deve essere dichiarato di tipo stringa o char?

    Spero di essere stato chiaro.

    Se mi potete scrivere una bozza di programma per capire come si fa
    mi fareste un grande piacere.

    Vi ringrazio!!

  2. #2
    inanzitutto nel campo "via" usa un vettore del tipo
    char via[20](ad esempio)
    quando fai la domanda
    "inserisci la via" dovresti leggerla tramite cin.getline, poi se vuoi mettere la condizione "vuoi sapere informazioni" devi usare test condizionali.........insomma mi sembra che devi trattare allo stesso tempo
    -vettori e stringhe
    -test condizionali
    -strutture
    -forse anche qualcosa di file per immagazinnare informazioni(e sottolineo forse),ma potrebbero bastare anche liste dinamiche,oppure neanche queste ma semplici strutture.....
    qualcuno mi corregga se ho detto qualche baggianata
    cmq mi sembra che hai le idee poco chiare riguardo l'intero programma.......

  3. #3

    Re: come si usa struct ? (C)

    Originariamente inviato da amlab75
    ciao ragazzi, volevo sapere come in un programma si utilizza lo struct quando ad esempio devo inserire dei nomi e a questi deve corrispondere la via, il numero, il cap, ecc. Cioè supponiamo che il programma mi dice :
    inserire nome. Inserisco il nome e poi mi dice:vuoi sapere in formazioni(via, cap,ecc)del nome messo?.
    Credo che in questo programma dovrei utilizzare la struct in modo da riempire per ogni nome messo i relativi campi.
    Codice:

    struct { char via;
    int numero;
    int cap;
    } persona;


    Il mio problema è come faccio a caricare i dati di ogni persona? in modo che quando inserisco il nome mi da via, cap, ecc? Oppure dove li carico, e come li carico? Poi un'altra cosa come faccio a definire una stringa? cioè un nome (ciccio)deve essere dichiarato di tipo stringa o char?

    Spero di essere stato chiaro.

    Se mi potete scrivere una bozza di programma per capire come si fa
    mi fareste un grande piacere.

    Vi ringrazio!!
    La parola "ciccio" non è un carattere, ma una stringa, quindi va definita come segue:
    codice:
     char stringa[7]
    Ho messo di lunghezza 7 perchè in riferimento alla parola ciccio, ci sono 6 caratteri, ma ci deve essere spazio per il terminatore.

    La struttura potresti organizzarla come segue:
    codice:
    typedef struct {
            char *via;  /*via è un puntatore perchè non conosci a priori la lunghezza della parola */
            int numero;
            int cap;
    } Info;
    
    typedef struct {
            char *nome; /*idem per il nome*/
            Info * pInfo;
            int nPersone;
    } Persona;

  4. #4
    Usando la struttura che ti ho dato è abbastanza semplice accedere ai campi ed inserire le informazioni.
    Proporti l'intero soluzione è un po' lungo.

    Detta a parole dovresti memorizzare prima tutte le informazioni relative alle persone che hai (per esempio salvandole in un file) e poi all'vvio del programma fare un cosa come questa:

    codice:
    Persona *p;
    printf ("Inserire il nome: ");
    scanf ("%s", nomeP);
    for (i=0;i<(*p).nPersone;i++)
         if (strcmp((*p).nome,nomeP)) {
            printf ("%s", (*p).pInfo[i].via);
            printf ("%d", (*p).pInfo[i].numero);
            printf ("%d", (*p).pInfo[i].cap);
        } /* if */

    typedef struct {
    char *via;
    int numero;
    int cap;
    } Info;

    typedef struct {
    char *nome;
    Info * pInfo;
    int nPersone;
    } Persona;

  5. #5
    Per i cognomi oppure per stringhe array o matrici di cui non sai quanto saranno lunghe a priori ti consiglio di usare l'allocazione dinamica tramite i puntatori. In questo modo ti permette di utilizzare proprio la memoria esattamente occorrente,senza sprecarla.

    Esempio:

    printf("\nNumero di liste: ");
    scanf("%d",& nListe);
    lista=(LISTA*)calloc(nListe,sizeof(LISTA));
    assert(lista != NULL);

    in questo caso l'origine era una struttura di tipo LISTA e di nome lista.
    inizialmente ti fai dare quante sono le liste, poi utilizzi la funzione di libreria calloc che ti chiede il numero in questo caso delle liste e come secondo parametro il sizeof del tipo della struttura da allocare in memoria.

    assert è una funzione che ti permette di gestire il caso in cui l'allocazione in memoria sia fallita(rarissimo al giorno d'oggi).

    Questo era un esempio, cmq puoi estendere questa soluzione anche al tuo caso

  6. #6
    L'allocazione dinamica è molto utile.
    In quel caso devi prima richiedere all'utente di inserire il numero di contatti da aggiungere e poi allochi la memoria della lunghezza richiesta.

    Ricordati di liberare le aree inutilizzate dai puntatori dopo l'allocazione.
    La funzione ottimale per questo lavoro è la free, che devi gestire in base a quante calloc hai utilizzato, ecc.

  7. #7
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565

    Re: Re: Re: come si usa struct ? (C)

    Originariamente inviato da ciromosketta
    scusate se mi intrometto ma vorrei capire: se uno cerca di inizializzare l'array nome con qualcosa, non può farlo perchè prima deve allocare la memoria necessaria, giusto?
    In via di massima si
    codice:
    int *a = 2; //errore
    int *b = malloc(sizeof(int));
    *b = 2; //Ok
    Ma questo non si verifica con i puntatori a char. Difatti è corretto fare
    codice:
    char *testo = "Buongiorno a tutti";
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  8. #8
    Originariamente inviato da ciromosketta
    sarebbe troppo chiederti di spiegarmi perchè? cioè, perchè va effettivamente a copiare la stringa nell'area indicata da /char se non ho disposto quanto spazio assegnargli?
    credo che ciò sia collegato ad una cosa che non ho mai capito, che sarebbe: perchè in fase di dichiarazione posso fare:
    codice:
    char s[20] = "ciao"
    e non posso fare invece
    codice:
    char s[20]; s = "ciao";
    ??
    s come l'hai dichiarato è un array di caratteri (stringa).
    Pertanto non puoi inizializzarlo con s = "ciao" perchè s messo così indica l'indirizzo da dove parte l'area di memoria.
    In pratica andresti a modificare un'intera area che è costante.

  9. #9
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Perchè in C, un testo racchiuso da virgolette (ad esempio "Ciao a tutti") viene calcolato come un const char * (oppure const char[x]) e quindi non ne è possibil effettuare la conversione.

    ti chiederai quindi perchè quindi è possibile fare
    codice:
    char *c = "ciao";
    ti darò un suggerimento:
    la dichiarazione sopra scritta, è equivalente a
    codice:
    char c[] = "ciao";
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  10. #10
    Originariamente inviato da ciromosketta
    ecco infatti, sin qui ci sono. quindi, perchè in fase di dichiarazione posso inizializzare un array di caratteri con una stringa, ossia fare char c[10] = "ciao", mentre non posso fare prima una dichiarazione del solo array e poi provare ad inizializzarlo con una stringa?

    p.s. non è una domanda sul perchè non si possa fare il secondo metodo, è più una domanda sul perchè il primo metodo è consentito
    Con il primo metodo, tu riservi un array di caratteri lungo 10 caselle (per capirci).
    Quando lo inizializzi non è detto che devi per forza riempire tutto l'array di caratteri.
    Quindi gli spazi rimanenti sono vuoti. Logicamente alla fine della parola viene messo il terminatore.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.