[C] vettore di una rubrica telefonica

di il
3 risposte

[C] vettore di una rubrica telefonica

Ciao a tutti stò risolvendo da un bel po' di tempo questo esercizio, ed ultimamente mi sono un po' arenata.....

Dunque l'inserimento dei dati l'ho risolto, rimango invece confusa, sulla stampa, c'è qualcosa che mi blocca, mi spiego meglio:

L'inserimento dei dati l'ho gestita con due funzioni, una dentro l'altra.
Chiamo la funzione che inserisce il nome e il cognome di un elemento della rubrica e all'interno di essa, richiamo una funzione per l'inserimento dei numeri telefonici appartenenti all'individuo.
Tutto ciò funziona. Ed è un bene!

Rimane invece in dubbio la stampa...

La mia perplessità è sulla gestione della stessa, cioè mi viene in mente di fare qualcosa di simile per l'inserimento cioè usare due funzioni, una per la stampa dei numeri ed una per la stampa del nominativo, allo stato attuale sono a corto di idee, mi servirebbe una dritta.


Inoltre se faccio la stampa soltanto in questa maniera, per vedere se mi stampa almeno il nominativo di ogni elemento della rubrica, si blocca, o meglio se inserisco un solo elemento, la funzione stampa così definita funziona, mentre se aumento il numero di elementi alla rubrica, al momento di selezionare la scelta di stampa nn funziona....

Metto qua sotto la funzione di stampa di cui ho appena parlato e sotto ancora il codice intero.

Vi ringrazio anticipatamente.

void stampa_completa(struct scheda *a,int dim){

   int i,j=0;
   for(i=0;i<dim;i++){
    printf("stampo ora il nome %s   della scheda numero: %d \n\n",a[i].nome,i+1);
    printf("stampo ora il cognome %s   della scheda numero: %d \n\n",a[i].cognome,i+1);
 
 }
   }



/*si consideri il caso di un vettore di schede di una rubrica:
ciascuna scheda codifica un nome, un cognome, e una lista di numeri telefonici

Definire le strutture che codificano le info
Definire la funzione di inserimento dati
Definire la funzione stampa
Definire la funzione che riceve in ingresso un vettore di schede e un numero e stampa il
nome. o il cognome nella prima scheda incontrata sulla cui lista figura il numero dato

*/


#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#define MAX 30
#define TRUE 1
#define FALSE 0

typedef char bool; //creo il nuovo tipo: booleano

struct scheda{
char nome[MAX];
char cognome[MAX];

};

struct telefono{        //qua io ho creato una lista di numeri, in forma collegata con puntatori
int numero;            //
struct telefono *next;

};

int menu(void);
void inserimento(struct scheda *a,int dim);  //      funziona, il vettore lo passo come puntatore, dato che il nome del vettore o il puntatore al lato pratico puntano all'indirizzo di memoria ove memorizzato l'inizio del vettore
void ins_telefoni(void);                    //       funziona
bool search(struct telefono *ptr,int numero);
void print_name(struct scheda *ptr,int dim,int numero);
void stampa_completa(struct scheda *a,int dim,struct telefono *ptr_rubrica);


int main(){


struct scheda rubrica[MAX];

int scelta,dim,numero;
bool x;



while(scelta=menu()){

    switch(scelta){

case 1:
    system("CLS");
    printf("\n\nInserimento dati nella rubrica\n\n");
    printf("Da quante schede e' composta la rubrica?    ");
    scanf("%d",&dim);
    inserimento(rubrica,dim);   //passo il nome del vettore e dimensione


    break;

case 2:
    system("CLS");
//    stampa_completa(rubrica,dim,ptr_rubrica);

    break;

case 3:
    system("CLS");

    printf("Inserisci ora il numero di telefono da cercare nella rubrica:    ");
    scanf("%d",&numero);
//    print_name(ptr,dim,numero);

    break;

case 0:

    return 0;







    }

}




return 0;
}


int menu(void){

int val;

printf("\n\n\n******MENU'*****\n\n\n");
printf("1.Per inserire i dati in ogni scheda della rubrica \n");
printf("2.Per stampare la rubrica \n");
printf("3.Per la funzione stampa nome \n");
printf("0.Per uscire \n");
printf("\n");

printf("Inserisci ora la tua scelta:    ");
scanf("%d",&val);

while(val<0 && val>3){
    printf("SCELTA SBAGLIATA  \n");
    printf("Inserisci ora la tua scelta:    ");
    scanf("%d",&val);

}

return val;

}

void inserimento(struct scheda *a,int dim){ //la figata è che posso passare l'array alla funzione come se fosse un puntatore
int i;
fflush(stdin);
for(i=0;i<dim;i++){
        printf("\nInserimento dati della scheda n: %d della mia rubrica\n",i+1);

         printf("Inserisci ora il nome:     ");
         gets(a[i].nome);
          printf("Inserisci ora il cognome:     ");
          gets(a[i].cognome);
          ins_telefoni();
          fflush(stdin); //questo va messo altrimenti se dò 0 nn mi prende la riga seguente con richiesta del nome


}
fflush(stdin);

}

void ins_telefoni(void){             //questa la stò gestendo come lista collegata con puntatori
    struct telefono *tmp,*x;
    int i,j;
    printf("Quanti numeri vuoi inserire?    ");
    scanf("%d",&i);
    if(i==0){
        printf("Non ci sono numeri di telefono salvati!\n");

    }

        else{
            x=(struct telefono *)malloc(sizeof(struct telefono));
            printf("Inserisci il primo numero di telefono:   ");
            scanf("%d",&x->numero);
            tmp=x;
            fflush(stdin);
            for(j=2;j<=i;j++){
                tmp->next=(struct telefono *)malloc(sizeof(struct telefono));
                tmp=tmp->next;
                printf("Inserisci il num di telefono n: %d    ",j);
                scanf("%d",&tmp->numero);


            }
            fflush(stdin);

           tmp->next=NULL;

        }




}//grazie.

   void stampa_completa(struct scheda *a,int dim,struct telefono *ptr_rubrica){

   int i,j=0;
   for(i=0;i<dim;i++){
    printf("stampo ora il nome %s   della scheda numero: %d \n\n",a[i].nome,i+1);
    printf("stampo ora il cognome %s   della scheda numero: %d \n\n",a[i].cognome,i+1);
    for(;ptr_rubrica!=NULL;){
        printf("Questo    %d    e' il %d numero",ptr_rubrica->numero,j+1);
        j++;
        ptr_rubrica=ptr_rubrica->next;

    }
   // stampa_numeri();

   }



   }


/*void print_name(struct scheda *ptr,int dim,int numero){

int count;
bool found;
count=0;
found=FALSE;
while(found==FALSE && count<dim){

    if(search(ptr[count].ptr_telefono,numero)==TRUE){

        printf("\n il numero %d   corrisponde a %s    %s    ",numero,ptr[count].nome,ptr[count].nome);
        found=TRUE;


    }
    else
        count ++;

}

if(found==FALSE)
    printf("Non ho trovato nessuna attinenza con il numero  %d   ",numero);

}


*/

bool search(struct telefono *ptr,int numero){

bool found;
found=FALSE;

while(ptr!=NULL && found==FALSE){
    if(ptr->numero==numero)
        found=TRUE;
    else
        ptr=ptr->next;

}

return found;
}


3 Risposte

  • Re: [C] vettore di una rubrica telefonica

    Idea
    
    struct telefono{        //qua io ho creato una lista di numeri, in forma collegata con puntatori
    int numero;            //
    struct telefono *next;
    
    };
    
    
    struct scheda{
    char nome[MAX];
    char cognome[MAX];
    struct telefono *headListaTelefoni;
    };
    
    
  • Re: [C] vettore di una rubrica telefonica

    Ciao
    immaggino che la tua struttura sia del tipo :
    numero,nome,puntatore
    quello che ti consiglio ed è più semplice è di fare una unica funzione.
    potresti fare in questo modo:
    se uno vuole l'elenco completo ti scorri semplicemente il file in maniera sequenziale senza usare vettori.
    se uno invece mette il numero da cercare ti leggi il file e fai un semplice controllo tra il numero che hai inserito e quello che hai letto dal file se corrispondono stampi il nominativo ti fissi una variabile a 1 cosi che sai se il numero e stato trovato.
    altrimenti passi al prossimo record.
    quando il file è finito ti testi la variabile settata e se sarà 1 allora termina il programma.
    se invece la variabile settata sarà zero stamperai il messaggio numero inesistente)
    ti riassumo la logica.
    accetti i dati dal menu
    accetti eventualmente il numero
    t=0
    apri il file in lettura
    leggi il file e metti il record in una variabile definita come la tua struttura
    se devi stampare tutti allora stampi il record letto
    altrimenti fai il confronto tra il numero inserito e quello letto
    se sono uguali stampi e setti t=1
    vai a leggere nuovamente il file
    alla fine del file
    t=0 ? se si visualizzi il messaggio
    termina il programma
  • Re: [C] vettore di una rubrica telefonica

    Perfetto mi sono messa subito all'opera, grazie per la tempistica così breve!!!

    
    void stampa_completa(struct scheda *a,int dim){
    
       int i,j=0;
       for(i=0;i<dim;i++){
        printf("stampo ora il nome %s   della scheda numero: %d \n\n",a[i].nome,i+1);
        printf("stampo ora il cognome %s   della scheda numero: %d \n\n",a[i].cognome,i+1);
        while(a[i].ptr_telefono!=NULL){
            printf("Stampo i numeri di telefono del nominativo\n");
            printf("Il numero e':  %d",a[i].ptr_telefono->numero);
            a[i].ptr_telefono=a[i].ptr_telefono->next;
    
        }
    
    
       }
    
    
    
       }
    
    
    Allo stato attuale mi genera un crash, mi stampa penso l'indirizzo del primo numero, ora debbo lasciare perchè fra poco entro al lavoro, voglio provare a risolvere la situazione da me, poi se non dovessi riuscire richiederò aiuto, GRAZIE.
Devi accedere o registrarti per scrivere nel forum
3 risposte