// persona.cc #include <stdio.h> #include <string.h> #include <stdlib.h> #include "persona.h" /******************************************************/ /* Classe Persona */ /******************************************************/ /* Calcola la lunghezza di una stringa, fino a quando * non trova un carattere noin stampabile */ int Persona::nstrlen (const char *s) { int n; for (n = 0;*s >= ' ';s ++, n++); return n; } /* Copia la stringa sorgente 's' nella stringa destinazione * 'd', fermandosi quando trova un carattere non stampabile */ void Persona::nstrcpy (char *d, const char *s) { while (*s >= ' ') // Finche' ci sono caratteri stmpabili (>= ' ') *d++ = *s++; // Li copia dalla sorgente nella destinazione *d = 0; // Termina la stringa destinazione } Persona::Persona (Persona **l, char *n) : list ((list**) l) { nome = new char [nstrlen (n) + 1]; // Solita allocazione di stringa e copia if (nome) nstrcpy (nome,n); } Persona::~Persona () { if (nome) // Solita eleminazione di stringa, solo se esiste delete nome; } void Persona::cerca (char *n) { if (!strcasecmp (nome,n)) // Se il nome corrisponde (ingorando maiuscole/minuscole) stampa (); // Stampa il dato if (Next ()) // Quindi va a cercare se ce ne sono ancora ((Persona *) Next ()) -> cerca (n); } /******************************************************/ /* Classe Indirizzo */ /******************************************************/ void Indirizzo::stampa () { printf ("%s\n%s\n%05d %s\n",nome,indirizzo,cap,citta); } Indirizzo::Indirizzo (Persona **l, char *n, char *ind, int c, char *cit) : Persona (l, n) { indirizzo = new char [nstrlen (ind) +1]; // Solite allocazioni di stringhe e copie... if (indirizzo) nstrcpy (indirizzo, ind); cap = c; citta = new char [nstrlen (cit) +1]; if (citta) nstrcpy (citta,cit); } Indirizzo::~Indirizzo () { if (indirizzo) // Solita eliminazione di stringa solo se esiste delete (indirizzo); if (citta) delete (citta); } /******************************************************/ /* Classe Telefono */ /******************************************************/ void Telefono::stampa () { printf ("%s Tel %s\n",nome,numTel); } Telefono::Telefono (Persona **l, char *n, char *nt) : Persona (l, n) { numTel = new char [nstrlen (nt) +1]; // Solite allocazioni di stringhe e copie... if (numTel) nstrcpy (numTel,nt); } Telefono::~Telefono () { if (numTel) // Solita eliminazione di stringa solo se esiste delete (numTel); } /******************************************************/ /* Classe MenuCerca */ /******************************************************/ void MenuCerca::action (void *par) { char n [40]; printf ("Nome da cercare :"); fgets (n,39,stdin); // Legge il nome da cercare Persona::nstrcpy (n,n); // Elimina l'a capo alla fine (*((Persona **)par)) -> cerca (n); // cerca il nome nella lista } /******************************************************/ /* Classe MenuIndirizzo */ /******************************************************/ void MenuIndirizzo::action (void *par) { char n [40]; char ind [40]; char ct [10]; int cap; char cit [40]; printf ("Nome:"); fgets (n,39,stdin); // Legge il nome da inserire printf ("Indirizzo:"); fgets (ind,39,stdin); // Legge l'indirizzzo printf ("Cap:"); fgets (ct,9,stdin); // Legge il CAP cap = strtol (ct,0,0L); // trasforma il CAP in numero printf ("Citta:"); fgets (cit,39,stdin); // Legge la citta' new Indirizzo ((Persona **)par,n,ind,cap,cit); } /******************************************************/ /* Classe MenuTelefono */ /******************************************************/ void MenuTelefono::action (void *par) { char n [40]; char nt [40]; Persona *p; printf ("Nome:"); fgets (n,39,stdin); // Legge il nome da inserire printf ("N° Telefono:"); fgets (nt,39,stdin); // Legge il nome da inserire new Telefono ((Persona **)par,n,nt); }