using namespace std; #include #include #include const int incrArray = 4; const int maxLungStringhe = 30; struct persona { char * cognome; char * nome; char * indirizzo; char * numTelefono; }; void stampaPersona(persona * agenda) { cout << agenda->cognome << endl << agenda->nome << endl << agenda->indirizzo << endl << agenda->numTelefono << endl << endl; } persona ** riallocaAgenda(persona ** agenda, int numPersone); void inizializza_agenda(persona ** & agenda, int & numPersone, char * nomeFile); void salva_agenda(persona * agenda [], int numPersone, char * nomeFile); void cerca_cognome_nome(persona * agenda[], int numPersone); void inserisci(persona ** & agenda, int & numPersone); void elimina(persona ** & agenda, int & numPersone); void stampa(persona * agenda [], int numPersone); int ric_bin(char id[2*maxLungStringhe], persona * agenda[], int inizio, int fine); int ins_bin(char id[2*maxLungStringhe], persona * agenda[], int inizio, int fine); int main (int argc, char * argv[]) { persona** agenda; int numPersone=0, ris=0; if (argc!=2) { cout << "Usage: ./a.out \n"; exit(0); } inizializza_agenda(agenda, numPersone, argv[1]); do { cout << "Scegli opzione: \n1. Cerca per cognome e nome \n2. Inserisci \n3. Elimina \n4. Stampa \n0. Esci\n"; cin >> ris; switch (ris) { case 1: cerca_cognome_nome(agenda, numPersone); break; case 2: inserisci(agenda, numPersone); break; case 3: elimina(agenda, numPersone); break; case 4: stampa(agenda, numPersone); break; case 0: break; default: cout << "Inserimento errato. Ripeti! \n"; } } while (!cin.fail() && ris!=0); salva_agenda(agenda, numPersone, argv[1]); } persona ** riallocaAgenda(persona ** agenda, int numPersone) { persona ** newAgenda = new persona * [numPersone+incrArray]; for (int i=0; icognome = new char [strlen(tmp)+1]; strcpy(agenda[i]->cognome,tmp); my_in.getline(tmp,maxLungStringhe); agenda[i]->nome = new char [strlen(tmp)+1]; strcpy(agenda[i]->nome,tmp); my_in.getline(tmp,maxLungStringhe); agenda[i]->indirizzo = new char [strlen(tmp)+1]; strcpy(agenda[i]->indirizzo,tmp); my_in.getline(tmp,maxLungStringhe); agenda[i]->numTelefono = new char [strlen(tmp)+1]; strcpy(agenda[i]->numTelefono,tmp); my_in.getline(tmp,maxLungStringhe); numPersone++; if (numPersone%incrArray == 0) agenda=riallocaAgenda(agenda, numPersone); my_in.getline(tmp,maxLungStringhe); } my_in.close(); } void salva_agenda(persona * agenda [], int numPersone, char * nomeFile) { fstream my_out; my_out.open(nomeFile,ios::out); for (int i=0; icognome << endl << agenda[i]->nome << endl << agenda[i]->indirizzo << endl << agenda[i]->numTelefono << endl << endl; } for (int i=0; icognome; delete [] agenda[i]->nome; delete [] agenda[i]->indirizzo; delete [] agenda[i]->numTelefono; delete agenda[i]; } delete [] agenda; my_out.close(); } void cerca_cognome_nome(persona * agenda[], int numPersone) { char nome[maxLungStringhe], cognome[maxLungStringhe]; char cognome_nome[2*maxLungStringhe]; int i=-1; cout << "Persona da cercare: "; cout << "\ncognome: "; cin >> cognome; cout << "nome: "; cin >> nome; strcpy(cognome_nome,cognome); strcat(cognome_nome,nome); i = ric_bin(cognome_nome, agenda, 0, numPersone); if (i==-1) cout << "Nome non presente in agenda!\n"; else stampaPersona(agenda[i]); } int ric_bin(char id[2*maxLungStringhe], persona * agenda[], int inizio, int fine) { int m = (inizio + fine) / 2; if (inizio == fine) // Non restano elementi da controllare: l'elemento cercato non c'è. return (-1); else { char cognome_nome[2*maxLungStringhe]; strcpy(cognome_nome, agenda[m]->cognome); strcat(cognome_nome, agenda[m]->nome); if (strcmp(id,cognome_nome)<0) // Si ripete la ricerca nella parte inferiore. return ric_bin(id, agenda, inizio, m); else if (strcmp(id,cognome_nome)>0) // Si ripete la ricerca nella parte superiore. return ric_bin(id, agenda, m+1, fine); else // m rappresenta l'indice dell'elemento cercato. return (m); } } void inserisci(persona ** & agenda, int & numPersone) { if (numPersone%incrArray == 0) agenda=riallocaAgenda(agenda, numPersone); char tmp[maxLungStringhe]; persona* p = new persona; cin.get(); cout << "cognome: "; cin.getline(tmp,maxLungStringhe); p->cognome = new char [strlen(tmp)+1]; strcpy(p->cognome,tmp); cout << "nome: "; cin.getline(tmp,maxLungStringhe); p->nome = new char [strlen(tmp)+1]; strcpy(p->nome,tmp); cout << "indirizzo: "; cin.getline(tmp,maxLungStringhe); p->indirizzo = new char [strlen(tmp)+1]; strcpy(p->indirizzo,tmp); cout << "numero: "; cin.getline(tmp,maxLungStringhe); p->numTelefono = new char [strlen(tmp)+1]; strcpy(p->numTelefono,tmp); char cognome_nome[2*maxLungStringhe]; strcpy(cognome_nome,p->cognome); strcat(cognome_nome,p->nome); int i = ins_bin(cognome_nome, agenda, 0, numPersone); if (i == -1) { cout << "Nome gia' presente in agenda!\n"; delete [] p->cognome; delete [] p->nome; delete [] p->indirizzo; delete [] p->numTelefono; delete p; } else { for (int j=numPersone; j>i; j--) { agenda[j]=agenda[j-1]; } agenda[i] = p; numPersone++; } } int ins_bin(char id[2*maxLungStringhe], persona * agenda[], int inizio, int fine) { int m = (inizio + fine) / 2; if (inizio == fine) return (m); else { char cognome_nome[2*maxLungStringhe]; strcpy(cognome_nome, agenda[m]->cognome); strcat(cognome_nome, agenda[m]->nome); if (strcmp(id,cognome_nome)<0) // Si ripete la ricerca nella parte inferiore. return ins_bin(id, agenda, inizio, m); else if (strcmp(id,cognome_nome)>0) // Si ripete la ricerca nella parte superiore. return ins_bin(id, agenda, m+1, fine); else return (-1); } } void elimina(persona ** & agenda, int & numPersone) { if (numPersone == 0) { cout << "Agenda vuota!\n"; return; } char nome[maxLungStringhe], cognome[maxLungStringhe]; char cognome_nome[2*maxLungStringhe]; cout << "Persona da eliminare: "; cout << "\ncognome: "; cin >> cognome; cout << "nome: "; cin >> nome; strcpy(cognome_nome,cognome); strcat(cognome_nome,nome); int i = ric_bin(cognome_nome, agenda, 0, numPersone); if (i == -1) cout << "Nome non presente in agenda!\n"; else { delete [] agenda[i]->cognome; delete [] agenda[i]->nome; delete [] agenda[i]->indirizzo; delete [] agenda[i]->numTelefono; delete agenda[i]; for (; icognome << endl << agenda[i]->nome << endl << agenda[i]->indirizzo << endl << agenda[i]->numTelefono << endl << endl; } } // Modificare il programma in modo da poter fare ricerche anche // per numero di telefono. L'idea e' di avere un'altro array di // puntatori alle stesse struct persona a cui si arriva attraverso // l'array agenda. Scorrendo questo nuovo array si accede alle struct // persona in modo che queste siano date ordinate per numero di telefono.