Oppure

Loading
23/02/16 17:44
redi
2. Gestione archivio telefonico
Si vuole simulare l’archivio telefonico di un cellulare. Ogni nominativo è
identificato dal Cognome, Nome, numero telefonico. Provvedere
all’implementazione dell’algoritmo per la simulazione dell’archivio telefonico
(massimo 30 nominativi).
Permettere, inoltre, all’utente di
• Inserire un nominativo
• Dato il Cognome e il Nome di un utente visualizzare il numero
telefonico corrispondente
• Dato un numero telefonico vedere il numero totale di chiamate da e
verso quel numero
L’archivio può anche essere inizializzato con informazioni casuali. Effettuare
almeno due test per ognuna delle opzioni dell’utente.

Io ho iniziato il programma in questo modo ma non so continuare..
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
struct rubrica {
char nome [30];
char cognome [30];
int numero;
};
int main()
{
int i,inseriti,trovato;
typedef struct rubrica ok;
ok utente;
printf("inserisci cognome:";);
gets(utente.cognome);
printf("Inserisci numero:";);
scanf("%d",&utente.numero);

printf("Dati utente:";);
printf("\n";);
printf("Nome: %s\n",utente.nome);
printf("Cognome: %s\n",utente.cognome);
printf("Numero di cell: %d\n",utente.numero);

/* ricerca */
printf("Inserisci il dati della persona da ricercare: \n";);
printf("Nome: ";);
gets(utente.nome);
printf("Cognome:";);
gets(utente.cognome);



quello che ho fatto è stato costruire una struttura di massimo 30 nominativi,e colui che inizializzava il programma era ingrando di inserire il nominativo (nome,cognome,numero di cellulare)..fatto ciò l'utente deve essere anche in grado di scrivere il nome e cognome e gli deve venir fuori il corrispettivo numero di telefono..e poi ci sarebbe anche il problema di quante chiamate ha fatto un telefono.
aaa
23/02/16 18:13
lumo
Devi usare un array di 30 elementi, il tipo dell'array è quello della struttura rubrica che hai scritto (non ha un nome proprio adatto).
Mostra all'utente un menu con la scelta dell'operazione.
Per fare quelle cose hai bisogno dei cicli for, studia bene gli esempi e basati su quelli.
A scanso di equivoci, nessuno ti darà una riga di codice qui, però se riesci ad essere preciso nelle difficoltà che hai ti aiutiamo.
aaa
23/02/16 18:25
TheDarkJuster
Postato originariamente da redi:
quello che ho fatto è stato costruire una struttura di massimo 30 nominativi

No, falso: ciò che hai fatto è creare un singolo nominativo che può avere al massimo 60 caratteri (30 caratteri per il nome e 30 per il cognome).

Inoltre chiamare un tipo ok è una scelta detestabile.... Ti immagini cosa succederebbe se tutti cominciassimo a chiamare i tipi con "no", "si", "ok", "forse", "dubbio" ecc....? La leggibilità dei programmi calerebbe di molto (e suppongo anche il tuo voto......)!

Usa nome più consoni a ciò che quel tipo rappresenta, per esempio, in questo caso "persona", "contatto", "pagina_rubrica" ecc....

P.S. Riguardo al codice.....
printf("inserisci cognome:"); 
gets(utente.cognome); 
printf("Inserisci numero:"); 
scanf("%d",&utente.numero); 

printf("Dati utente:"); 
printf("\n"); 
printf("Nome: %s\n",utente.nome); 
printf("Cognome: %s\n",utente.cognome); 
printf("Numero di cell: %d\n",utente.numero); 

/* ricerca */ 
printf("Inserisci il dati della persona da ricercare: \n"); 
printf("Nome: "); 
gets(utente.nome); 
printf("Cognome:"); 
gets(utente.cognome); 


Non so se ti sei accorto, ma questo codice risulta TOTALMENTE equivalente a:
/* ricerca */ 
printf("Inserisci il dati della persona da ricercare: \n"); 
printf("Nome: "); 
gets(utente.nome); 
printf("Cognome:"); 
gets(utente.cognome); 

Perchè ogni volta continui a sovrascrivere i valori della struct utente senza fare nulla.
Ultima modifica effettuata da TheDarkJuster 23/02/16 18:29
aaa
23/02/16 19:02
redi
Ma come faccio a inserire un nome e cognome e a dimostrare che effettivamente questo nome e cognome corrisponde proprio all'utente inserito e poi dimostrato ciò far uscire il numero di cellullare a esso corrispondente?
aaa
23/02/16 19:37
TheDarkJuster
Primo punto: crei un array di X contatti e lo riempi.

Per il momento X è una costante intera non-nulla e positiva. (Numeri naturali escluso lo zero)

Quindi diciamo:
#define X 5

typedef struct rubrica { 
char nome [30]; 
char cognome [30]; 

//il numero come intero NON va bene.
//int numero;
//un numero telefonico si gestisce come una stringa
char numero[20];

//ti ricordo che devi tenere in memoria le chiamate ricevute ed effettuate
unsigned ricevute;
unsigned effettuate;
} contatto;

int main() 
{  

unsigned contatti_riempiti = 0;
contatto contatti[X]; 

//qui stampi un menu, e a seconda della scelta dell'utente salti a inserisci_contatto(....) trova_contatto(....) o visualizza_info_numero(.....);

}

inserisci_contatto(contatto* contatti, unsigned& contatti_riempiti ) {
    //qui chiedi nome, cognome, numero, effettuate, ricevute e salvi il contatto.

    //ricordati che per accedere in lettura e/o scrittura a un singolo contatto devi riferirti ad esso con contatti[contatti_riempiti]

    //esempio:
    printf("Nome del contatto: ");
    gets(contatti[contatti_riempiti].nome);

    //abbiamo appena aggiunto un contatto!
    contatti_riempiti++; //incrementiamo il contatore (da notare che contatti_riempiti viene passato per reference, non per valore)
}

char* trova_contatto(contatto* contatti, char* nome, char* cognome) {
     //qui cicli da 0 fino a X, e continui a cercare un contatto che abbia nome e cognome dati (usando la funzione standard del C strcmp)

    //se all'interno del ciclo trovi il contatto allora ritorni il suo numero, altrimenti ritorni (char*)NULL;
    //in questo modo, all'interno del main puoi controllare se il contatto è stato trovato.
}


Visto che ti ho già aiutato nel pensarti gli algoritmi da utilizzare l'ultima consegna la lascio a te, visto che è praticamente uguale all'algoritmo di trova_contatto.

Ricordati di controllare prima di chiamare inserisci_contatto, perché nel tuo programma c'è memoria per massimo X contatti!
aaa
23/02/16 19:53
TheDarkJuster
Se ti scaccia ogni volta inserire a mano i contatti puoi sempre salvarli in un file molto, molto semplicemente con due chiamate a fprintf e ricostruire la rubrica con due chiamate a fscanf (se il file esiste).

La prima cosa da salvare è il numero di contatti, la seconda i contatti stessi.
Siccome questo è fuori dalla consegna consideralo un plus per renderti più agevole il test del programma.

Ricordati inoltre di ciclare all'infinito il menu nel main, e di inserire la possibilità di chiudere il programma.
Vedi tu in che modo (sappi che esiste la funzione exit(), ma che è poco elegante).
aaa
24/02/16 18:17
redi
#include <stdio.h>

#define MAXUTENTI 10
typedef struct
{
char prefisso[5];
int numero;
}phone;
typedef struct
{
char nome[20];
char cognome[20];
phone telefono;
}utente;
typedef enum
{false,true} Boolean;
main()
{
utente UTENTI[MAXUTENTI];
char nome[20],cognome[20],prefisso[5];
int inseriti,op,i,j,numero;
Boolean fine,trovato;
char scelta,c;
inseriti=0;
fine=false;
while
(inseriti<MAXUTENTI && !fine){
printf("Vuoi inserire un utente?";);
scelta=getchar();
c=getchar();
if (scelta==10 || scelta==20){
printf("Inserisci il nome:";);
gets(UTENTI[inseriti].nome);
printf("Inserisci il cognome:";);
gets(UTENTI[inseriti].cognome);


printf("Inserisci il prefisso:";);
scanf("%s",UTENTI[inseriti].telefono.prefisso);
inseriti++;
c=getchar();
}
else
fine=true;
}
fine=false;
do
{
printf("\n";);
printf("QUALE SCELTA VUOI EFFETTUARE NELLA RUBRICA?\n";);
printf("1: inserisci nominativo\n";);
printf("2: ricerca\n";);
printf("3: uscita\n";);
scanf("%d",&op);
c=getchar();
switch
(op){

case(2):
/* ricerca */
printf("Inserisci il dati della persona da ricercare: \n";);
printf("Nome:";);
gets(nome);
printf("Cognome:";);
gets(cognome);
i=0;
trovato=false;
while
(i<inseriti && !trovato){
if
(strcmp(UTENTI[i].nome,nome)==0 && strcmp(UTENTI[i].cognome,cognome)==0){
trovato=true;
printf("Il numero di telefono e‘: (%s) %d\n",UTENTI[i].telefono.numero);
}
i++;
}
if
(!trovato)
printf("L’utente ricercato non appartiene all’archivio!\n";);
break;
case(1):
/* inserimento */
if
(inseriti<MAXUTENTI){
printf("Inserisci i dati della persona da inserire: \n";);
printf("Nome:";);
gets(UTENTI[inseriti].nome);
printf("Cognome:";);
gets(UTENTI[inseriti].cognome);
printf("Numero di telefono:\n";);
scanf("%d",&UTENTI[inseriti].telefono.numero);
inseriti++;
}
else
printf("Non c’e‘ piu‘ spazio nell’archivio!\n";);
break;
case
(3):
/* uscita */
fine=true;
break;
default: printf("Errore!";);
}
}
while(!fine);
}
aaa
24/02/16 18:18
redi
#include <stdio.h>
#define MAXUTENTI 10
typedef struct
{
char prefisso[5];
int numero;
}phone;
typedef struct
{
char nome[20];
char cognome[20];
phone telefono;
}utente;
typedef enum
{false,true} Boolean;
main()
{
utente UTENTI[MAXUTENTI];
char nome[20],cognome[20],prefisso[5];
int inseriti,op,i,j,numero;
Boolean fine,trovato;
char scelta,c;
inseriti=0;
fine=false;
while
(inseriti<MAXUTENTI && !fine){
printf("Vuoi inserire un utente?");
scelta=getchar();
c=getchar();
if (scelta==10 || scelta==20){
printf("Inserisci il nome:");
gets(UTENTI[inseriti].nome);
printf("Inserisci il cognome:");
gets(UTENTI[inseriti].cognome);


printf("Inserisci il prefisso:");
scanf("%s",UTENTI[inseriti].telefono.prefisso);
inseriti++;
c=getchar();
}
else
 fine=true;
}
fine=false;
do
{
printf("\n");
printf("QUALE SCELTA VUOI EFFETTUARE NELLA RUBRICA?\n");
printf("1: inserisci nominativo\n");
printf("2: ricerca\n");
printf("3: uscita\n");
scanf("%d",&op);
c=getchar();
switch
(op){

case(2):
/* ricerca */
printf("Inserisci il dati della persona da ricercare: \n");
printf("Nome:");
gets(nome);
printf("Cognome:");
gets(cognome);
i=0;
trovato=false;
while
(i<inseriti && !trovato){
if
(strcmp(UTENTI[i].nome,nome)==0 && strcmp(UTENTI[i].cognome,cognome)==0){
trovato=true;
printf("Il numero di telefono e‘: (%s) %d\n",UTENTI[i].telefono.numero);
}
i++;
}
if
(!trovato)
printf("L’utente ricercato non appartiene all’archivio!\n");
break;
case(1):
/* inserimento */
if
(inseriti<MAXUTENTI){
printf("Inserisci i dati della persona da inserire: \n");
printf("Nome:");
gets(UTENTI[inseriti].nome);
printf("Cognome:");
gets(UTENTI[inseriti].cognome);
printf("Numero di telefono:\n");
scanf("%d",&UTENTI[inseriti].telefono.numero);
inseriti++;
}
else
 printf("Non c’e‘ piu‘ spazio nell’archivio!\n");
break;
case
(3):
/* uscita */
fine=true;
break;
default: printf("Errore!");
}
}
while(!fine);
}
 

cosa ne pensate?
aaa