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;
}