Agenda telefonica con array di record

di il
11 risposte

Agenda telefonica con array di record

Buonasera a tutti, vi spiego il problema in breve.
Il libro dal quale sto studiando mi fornisce l'esempio di un'agenda telefonica costruita tramite array di record.
Il problema è che nonostante abbia copiato il codice pari pari a come sta scritto sul libro, non compila e non so il perché.
Vi lascio il codice ricopiato faticosamente dal sottoscritto e le pagine del libro scannerizzate.
Vi ringrazio in anticipo.

Codice NON funzionante:

/*Agenda telefonica costruita con array di record*/

#include <iostream>
using namespace std;
typedef char stringa[NS];
typedef struct miaAnag{
	stringa nome;
	stringa cell;
	stringa phone;
} Anagrafe;
typedef Anagrafe Elenco[N];

void inzializza(int &r)
{r=0;
}

void inserisci (Elenco E, int& r, Anagrafe elem)
{ E[r++]=elem;
}

void stampaRecord(Anagrafe a)
{   cout<<"*********Informazioni di ****************";
    cout<<a.nome<<"*********************\n";
	cout<<"cellulare: "<<a.cell<<"\n";
	cout<<"telefino fisso: "<<a.phone<<"\n";
}

void stampaElenco(Elenco E, int r)
{   cout<<"*********stampa agendina ****************";
	for (int i=0; i<r;i++){
		stampaRecord(E[i]);
	}
}

void cerca(Elenco E, int r, string nome)
{   bool trovato=false;
	int i=0;
	while(!trovato && i < r)
	{ if(strcmp(E[i].nome, nome)==0)
	{ trovato=true;
	  stampaRecord(E[i]);
	}i++;}
	
	if(!trovato){
		cout<<"\n  "<<nome;
		cout<<"******** non presente";
	}
}

int main (){
	Elenco agendina;
	int riemp;
	bool esci=false;
	int scelta;
	Anagrafe a;
	stringa nome;
	inzializza(riemp);
	while (!esci) {
		system("clear");
		cout<<"********AGENDINA***************\n";
		cout<<"1. per inserire\n";
		cout<<"2. per stampare tutta l'agenda\n";
		cout<<"3. per stampare un telefono\n";
		cout<<"4. oer uscire\n";
		
		cin>>scelta;
		if (scelta==1) {
			cout<<"inserire nome\n";
			cin>>a.nome;
			cout<<"inserire cell\n";
			cin>>a.cell;
			cout<<"inserire fisso\n";
			cin>>a.phone;
			inserisci(agendina, riemp, a);
		} else if (scelta==2) {
			stampaElenco(agendina, riemp);
			system("sleep(10)");
		} else if (scelta==3) {
			cout<<"chi vuoi cercare??\n";
			cin>>nome;
			cerca(agendina, riemp, nome);
			cout<<"un tasto per proseguire\n";
			cin>>scelta;
		} else if (scelta==4) esci=true;
	}
	return 0;
}
Prima pagina:
Seconda pagina:
Terza pagina:

11 Risposte

  • Re: Agenda telefonica con array di record

    Non fai prima a dirci quale errore hai in compilazione?

    Così impari anche a risolvere i problemi. Un suggerimento ... quanto valgono NS e N ?
  • Re: Agenda telefonica con array di record

    oregon ha scritto:


    Non fai prima a dirci quale errore hai in compilazione?
    Si giusto, mi sono dimenticato di mettere la schermata con gli errori.
    Eccola:



    oregon ha scritto:


    Un suggerimento ... quanto valgono NS e N ?
    Eh, questo è uno dei problemi, non lo so!
    Ho scannerizzato le pagine del libro proprio per far vedere che non ho commesso errori di copia, ma ci sta scritto proprio così.
  • Re: Agenda telefonica con array di record

    Avranno dimenticato le due costanti ma le puoi aggiungere tu all'inizio ... su non è difficile.

    Cosa rappresentano NS e N?
    Quali valori puoi usare per le due costanti?

    P.S. quando devi riportare gli errori non copiare schermate ma semplicemente copia incolla il primo messaggio d'errore.
  • Re: Agenda telefonica con array di record

    oregon ha scritto:


    Avranno dimenticato le due costanti ma le puoi aggiungere tu all'inizio ... su non è difficile.

    Cosa rappresentano NS e N?
    Quali valori puoi usare per le due costanti?
    NS dovrebbe essere il numero di caratteri massimo che può avere la stringa, N non lo so.

    Ho assegnato sia ad NS che ad N 10 come costante, in poche parole ho modificato così l'inizio del programma:
    #include <iostream>
    using namespace std;
    const int NS=10;
    const int N=10;
    typedef char stringa[NS];
    Ma quando provo a compilare mi esce il seguente errore:
    41 29 [Error] 'strcmp' was not declared in this scope

    Quindi pensando sia la mancanza della libreria cstring ho aggiunto:
    #include <cstring>
    
    Ma dopo tale aggiunta mi da il seguente errore di compilazione:
    42 29 [Error] cannot convert 'std::string {aka std::basic_string<char>}' to 'const char*' for argument '2' to 'int strcmp(const char*, const char*)'

    E qui non so veramente quale sia il problema.

    oregon ha scritto:


    P.S. quando devi riportare gli errori non copiare schermate ma semplicemente copia incolla il primo messaggio d'errore.
    Grazie dell'avviso, non lo farò più in futuro.


    Codice NON funzionante (ma con aggiunta delle modifiche fatte sopra):
    
    /*Agenda telefonica costruita con array di record*/
    
    #include <iostream>
    #include <cstring>
    using namespace std;
    const int NS=10;
    const int N=10;
    typedef char stringa[NS];
    typedef struct miaAnag{
    	stringa nome;
    	stringa cell;
    	stringa phone;
    } Anagrafe;
    typedef Anagrafe Elenco[N];
    
    void inzializza(int &r)
    {r=0;
    }
    
    void inserisci (Elenco E, int& r, Anagrafe elem)
    { E[r++]=elem;
    }
    
    void stampaRecord(Anagrafe a)
    {   cout<<"*********Informazioni di ****************";
        cout<<a.nome<<"*********************\n";
    	cout<<"cellulare: "<<a.cell<<"\n";
    	cout<<"telefino fisso: "<<a.phone<<"\n";
    }
    
    void stampaElenco(Elenco E, int r)
    {   cout<<"*********stampa agendina ****************";
    	for (int i=0; i<r;i++){
    		stampaRecord(E[i]);
    	}
    }
    
    void cerca(Elenco E, int r, string nome)
    {   bool trovato=false;
    	int i=0;
    	while(!trovato && i < r)
    	{ if(strcmp(E[i].nome, nome)==0)
    	{ trovato=true;
    	  stampaRecord(E[i]);
    	}i++;}
    	
    	if(!trovato){
    		cout<<"\n  "<<nome;
    		cout<<"******** non presente";
    	}
    }
    
    int main (){
    	Elenco agendina;
    	int riemp;
    	bool esci=false;
    	int scelta;
    	Anagrafe a;
    	stringa nome;
    	inzializza(riemp);
    	while (!esci) {
    		system("clear");
    		cout<<"********AGENDINA***************\n";
    		cout<<"1. per inserire\n";
    		cout<<"2. per stampare tutta l'agenda\n";
    		cout<<"3. per stampare un telefono\n";
    		cout<<"4. oer uscire\n";
    		
    		cin>>scelta;
    		if (scelta==1) {
    			cout<<"inserire nome\n";
    			cin>>a.nome;
    			cout<<"inserire cell\n";
    			cin>>a.cell;
    			cout<<"inserire fisso\n";
    			cin>>a.phone;
    			inserisci(agendina, riemp, a);
    		} else if (scelta==2) {
    			stampaElenco(agendina, riemp);
    			system("sleep(10)");
    		} else if (scelta==3) {
    			cout<<"chi vuoi cercare??\n";
    			cin>>nome;
    			cerca(agendina, riemp, nome);
    			cout<<"un tasto per proseguire\n";
    			cin>>scelta;
    		} else if (scelta==4) esci=true;
    	}
    	return 0;
    }
    
  • Re: Agenda telefonica con array di record

    N è il numero di persone nella rubrica ...

    Hai sbagliato a copiare ... non è

    string nome

    ma

    stringa nome
  • Re: Agenda telefonica con array di record

    Vorrei inoltre ricordare che nel C++ la definizione di una struttura comporta la creazione di un nuovo tipo (astratto), quindi l'utilizzo del typedef risulta superfluo.
  • Re: Agenda telefonica con array di record

    oregon ha scritto:


    Hai sbagliato a copiare ... non è

    string nome

    ma

    stringa nome
    Si giusto, ho corretto ed ora funziona, grazie per l'aiuto.

    Solo un ultimo problema, quando avvio il programma, mi esce scritto:
    "clear" non è riconosciuto come comando interno o esterno, un programma eseguibile o un file batch
    Allego lo screeshot così si capisce meglio:


    Posto qui sotto il codice funzionante, magari potrebbe tornare utile a qualcuno:
    
    /*Agenda telefonica costruita con array di record*/
    
    #include <iostream>
    #include <cstring>
    using namespace std;
    const int NS=10;
    const int N=10;
    typedef char stringa[NS];
    typedef struct miaAnag{
    	stringa nome;
    	stringa cell;
    	stringa phone;
    } Anagrafe;
    typedef Anagrafe Elenco[N];
    
    void inzializza(int &r)
    {r=0;
    }
    
    void inserisci (Elenco E, int& r, Anagrafe elem)
    { E[r++]=elem;
    }
    
    void stampaRecord(Anagrafe a)
    {   cout<<"\n*********Informazioni di ****************";
        cout<<a.nome<<"*********************\n";
    	cout<<"cellulare: "<<a.cell<<"\n";
    	cout<<"telefino fisso: "<<a.phone<<"\n";
    }
    
    void stampaElenco(Elenco E, int r)
    {   cout<<"\n*********stampa agendina ****************";
    	for (int i=0; i<r;i++){
    		stampaRecord(E[i]);
    	}
    }
    
    void cerca(Elenco E, int r, stringa nome)
    {   bool trovato=false;
    	int i=0;
    	while(!trovato && i < r)
    	{ if(strcmp(E[i].nome, nome)==0)
    	{ trovato=true;
    	  stampaRecord(E[i]);
    	}i++;}
    	
    	if(!trovato){
    		cout<<"\n  "<<nome;
    		cout<<"******** non presente";
    	}
    }
    
    int main (){
    	Elenco agendina;
    	int riemp;
    	bool esci=false;
    	int scelta;
    	Anagrafe a;
    	stringa nome;
    	inzializza(riemp);
    	while (!esci) {
    		system("clear");
    		cout<<"********AGENDINA***************\n";
    		cout<<"1. per inserire\n";
    		cout<<"2. per stampare tutta l'agenda\n";
    		cout<<"3. per stampare un telefono\n";
    		cout<<"4. per uscire\n";
    		
    		cin>>scelta;
    		if (scelta==1) {
    			cout<<"inserire nome\n";
    			cin>>a.nome;
    			cout<<"inserire cell\n";
    			cin>>a.cell;
    			cout<<"inserire fisso\n";
    			cin>>a.phone;
    			inserisci(agendina, riemp, a);
    		} else if (scelta==2) {
    			stampaElenco(agendina, riemp);
    			system("sleep(10)");
    		} else if (scelta==3) {
    			cout<<"chi vuoi cercare??\n";
    			cin>>nome;
    			cerca(agendina, riemp, nome);
    			cout<<"un tasto per proseguire\n";
    			cin>>scelta;
    		} else if (scelta==4) esci=true;
    	}
    	return 0;
    }
    
  • Re: Agenda telefonica con array di record

    Prova con system("CLS").
  • Re: Agenda telefonica con array di record

    Clear è per Linux, cls per Windows

    Questo dovresti saperlo anche se non sai molto di C ...
  • Re: Agenda telefonica con array di record

    Nippolo ha scritto:


    Prova con system("CLS").
    Si ho modificato e funziona, grazie per l'aiuto.
  • Re: Agenda telefonica con array di record

    Nippolo ha scritto:


    Vorrei inoltre ricordare che nel C++ la definizione di una struttura comporta la creazione di un nuovo tipo (astratto), quindi l'utilizzo del typedef risulta superfluo.
    Ritengo poco utili queste precisazioni ... il C++ prevede la classe string per trattare le stringhe, quindi sarebbe inutile gestire gli array di char del C ...

    La questione è che, in molti esercizi si introducono elementi del C solo perché se n'è parlato nella teoria ...
Devi accedere o registrarti per scrivere nel forum
11 risposte