using namespace std; #include #include #include void inizializza_agenda(char agenda[2][100][10], int & dim, char * arg); void salva_agenda(char agenda[2][100][10], int dim, char * arg); void cerca_nome(char agenda[2][100][10], int dim); void cerca_numero(char agenda[2][100][10], int dim); void inserisci(char agenda[2][100][10], int & dim); void elimina(char agenda[2][100][10], int & dim); void stampa(char agenda[2][100][10], int dim); int ric_bin(char nome[10], char agenda[100][10], int inizio, int fine); int ins_bin(char nome[10], char agenda[100][10], int inizio, int fine); int main (int argc, char * argv[]) { char agenda[2][100][10]; int dim=0, ris=0; if (argc!=2) { cout << "Usage: ./a.out \n"; exit(0); } inizializza_agenda(agenda, dim, argv[1]); do { cout << "Scegli opzione: \n1. Cerca per nome \n2. Cerca per numero \n3. Inserisci \n4. Elimina \n5. Stampa \n0. Esci\n"; cin >> ris; switch (ris) { case 1: cerca_nome(agenda, dim); break; case 2: cerca_numero(agenda, dim); break; case 3: inserisci(agenda, dim); break; case 4: elimina(agenda, dim); break; case 5: stampa(agenda, dim); break; case 0: break; default: cout << "Inserimento errato. Ripeti! \n"; } } while (!cin.fail() && ris!=0); salva_agenda(agenda, dim, argv[1]); } void inizializza_agenda(char agenda[2][100][10], int & dim, char * arg) { fstream my_in; my_in.open(arg,ios::in); char tmp[10]; my_in >> tmp; for (int i=0; i<100 && !my_in.eof(); i++) { strcpy(agenda[0][i],tmp); my_in >> agenda[1][i]; dim++; my_in >> tmp; } my_in.close(); } void salva_agenda(char agenda[2][100][10], int dim, char * arg) { fstream my_out; my_out.open(arg,ios::out); for (int i=0; i> tmp; i = ric_bin(tmp, agenda[0], 0, dim); if (i==-1) cout << "Nome non presente in agenda!\n"; else cout << "Numero: " << agenda[1][i] << endl; } int ric_bin(char nome[10], char agenda[100][10], 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 if (strcmp(nome,agenda[m])<0) // Si ripete la ricerca nella parte inferiore. return ric_bin(nome, agenda, inizio, m); else if (strcmp(nome,agenda[m])>0) // Si ripete la ricerca nella parte superiore. return ric_bin(nome, agenda, m+1, fine); else // m rappresenta l'indice dell'elemento cercato. return (m); } void cerca_numero(char agenda[2][100][10], int dim) { char tmp[10]; int i=0; cout << "Numero da cercare: "; cin >> tmp; for (; i> nome; cout << "Numero: "; cin >> numero; int i = ins_bin(nome, agenda[0], 0, dim); if (i == -1) cout << "Nome gia' presente in agenda!\n"; else { for (int j=dim; j>i; j--) { strcpy(agenda[0][j],agenda[0][j-1]); strcpy(agenda[1][j],agenda[1][j-1]); } strcpy(agenda[0][i],nome); strcpy(agenda[1][i],numero); dim++; } } int ins_bin(char nome[10], char agenda[100][10], int inizio, int fine) { int m = (inizio + fine) / 2; if (inizio == fine) return (m); else if (strcmp(nome,agenda[m])<0) return ins_bin(nome, agenda, inizio, m); else if (strcmp(nome,agenda[m])>0) return ins_bin(nome, agenda, m+1, fine); else return (-1); } void elimina(char agenda[2][100][10], int & dim) { if (dim == 0) { cout << "Agenda vuota!\n"; return; } char tmp[10]; cout << "Nome da eliminare: "; cin >> tmp; int i = ric_bin(tmp, agenda[0], 0, dim); if (i == -1) cout << "Nome non presente in agenda!\n"; else { for (; i