Strutture con funzioni esterne in C++

di il
12 risposte

Strutture con funzioni esterne in C++

Buonasera a tutti,
Ho fatto un esercizio di una semplice biblioteca, giusto per comprendere al meglio le strct in c++, ora volevo cercare di usare le struct con le funzioni ma proprio non ci riesco. Riuscite coretesemente a darmi qualche aiuto come spunto di inizio, magari anche un semplice esempio grazie.
// Verifica Marzo Biblioteca 
//

#include "stdafx.h"
#include <iostream>
#include <string>
#define max 50
using namespace std;

struct biblioteca {
		int codice;
		string titolo;
		string autore;
		string editore;
		int anno;

	};

int main()
{     
	//##########################   DICHIARAZIONE VARIABILI   ###################################
	int scelta;  //variabile per scalta menu      
	int num_libri = 0;  //numero dei liberi presenti in biblioteca
	int num_codice, num_anno;// variabile per controllo interi
	int trova_codice;     //variabile per ricerca codice
	string trova_titolo;  //variabile per ricerca titolo
	//##########################################################################################
	

	biblioteca libri[max];  //Vettore di tipo struttura 
	do {                     //############################## MENU INIZIALE####################################
		system("CLS");
		cout << "\t\t\t\t\t\t########## BIBLIOTECA ########## \n";
		cout << "\t\t\t\t\t\t1 Inserire nuovo libro \n";
		cout << "\t\t\t\t\t\t2 Visualizzare libri \n";
		cout << "\t\t\t\t\t\t3 Ricerca libro dal codice \n";
		cout << "\t\t\t\t\t\t4 Ricerca libro dal titolo \n";
		cout << "\t\t\t\t\t\t0 Uscita \n";
		cout << "\t\t\t\t\t\t################################\n";
		cout << "\t\t\t\t\t\t------> ";
		cin >> scelta;      
		//                      ############################# FINE menu iniziale #################################

		if (!cin) //controllo che non venga fatta una scelta di formato non consentito (es. 'F')
		{
			scelta = -1; //seleziona la scelta -1 che corrisponde ad annullare
			cin.clear(); //pulisce la cache
			cout << "Scelta non consentita!" << endl;
		}
		cin.ignore(100, '\n'); //ignora i primi 100 caratteri che sono stati scritti 

		switch (scelta)
		{
			case 1:
			{
				system("CLS");
				cout << "In biblioteca puoi aggiungere ancora " << max-num_libri << " libri " << endl;
				do {									//############blocco per evitare che si inserisca###########  
					cout << "inserisci codice \n";		//un carattere diverso da un numero
					cin >> num_codice;
					if (!cin)
					{
						cout << " il codice deve essere un numero intero \n";
						num_codice= -1;
						cin.clear();
					}
					cin.ignore(100, '\n');
				} while (num_codice==-1); //#######################Fine blocco carattere#######################
				                                  //Insermineto dati nella struttura
				libri[num_libri].codice=num_codice; //dopo il controllo sul codice viene inserito nel campo struttura
				cout << "inserisci titolo \n";
				cin >> libri[num_libri].titolo;
				cout << "inserisci autore \n";
				cin >> libri[num_libri].autore;
				cout << "inserisci editore \n";
				cin >> libri[num_libri].editore;
				do 
				{
					cout << "inserisci anno \n";//questo deve essere per forza un numero 
					cin >> num_anno;
					if (!cin)
					{
						cout << " il codice deve essere un numero intero \n";
						num_anno = -1;
						cin.clear();
					}
					cin.ignore(100, '\n');
				} while (num_anno == -1);
			
				libri[num_libri].anno=num_anno;
				cout << endl;
				cout << endl;

				num_libri++;
				cout << "hai inserito "<<num_libri<<" libr";
				if (num_libri == 1)
					cout << "o";
				else
					cout << "i";
				cout << endl;
				cout << endl;
				break;
			}

			case 2:
			{
				if (num_libri != 0)
				{
					for (int i = 0; i < num_libri; i++)
					{
						cout << "ecco i tuoi libri \n";

						cout << libri[i].codice;
						cout << "   ";

						cout << libri[i].titolo;
						cout << "   ";
						cout << libri[i].autore;
						cout << "   ";
						cout << libri[i].editore;
						cout << "   ";
						cout << libri[i].anno;
						cout << endl;

					}
				
				  cout << endl;
				  cout << endl;
				}
				else
				{
					cout << "Non ci sono Libri ";
				}
			 break;
			}

			case 3:
			{
				cout << " inserisi il codice \n";
				cin >> trova_codice;
				for (int i = 0; i < num_libri; i++)
				{
					if (libri[i].codice == trova_codice)
					{
						cout << " ecco cosa ho trovato \n";
						cout << libri[i].titolo;
						cout << "    ";
						cout << libri[i].autore;
						cout << "    ";
						cout << libri[i].editore;
						cout << "    ";
						cout << libri[i].anno;
						cout << endl;
					}

				}


				cout << endl;
				cout << endl;
				break;
			}

			case 4:
			{
				cout << " inserisi il titolo \n";
				cin >> trova_titolo;
				for (int i = 0; i < num_libri; i++)
				{
					if (libri[i].titolo == trova_titolo)
					{
						cout << " ecco cosa ho trovato \n";
						cout << libri[i].codice;
						cout << "    ";
						cout << libri[i].autore;
						cout << "    ";
						cout << libri[i].editore;
						cout << "    ";
						cout << libri[i].anno;
						cout << endl;
					}

				}
				break;
			}
			default:
			{
				cout << "hai sbagliato ad inserire \n";
				cout << endl;
				cout << endl;
				break;
			}
		}//switch
	} while (scelta != 0);
return 0;
}

Ora mi piacerebbe spostare ogni "case" in una funzione esterna magari in un file esterno mi aiutate?
Basterebbe anche nello stesso codice con il prototipo di funzione in alto, ed la sua funzione in basso dopo il main grazie

12 Risposte

  • Re: Strutture con funzioni esterne in C++

    Non ho capito il tuo problema. In particolare dove hai difficoltà?

    E comunque concentrati su una parte di codice, facci vedere quello che fai e mostra eventuali errori. Così se ne può parlare.
  • Re: Strutture con funzioni esterne in C++

    Una curiosità, relativamente alle struct/classi sai cos'è un membro privato oppure un metodo?

    Alcune osservazioni:
    - perché includi "stdafx.h"?
    - al posto della direttiva #define utilizzerei variabili definite const;
    - da un punto di vista logico sarebbe più corretto chiamare la struct libro (dal momento che ogni istanza di quella struct rappresenta un libro e non certo una biblioteca) e il vettore biblioteca (essendo un insieme di libri);
    - ci sono vari motivi per cui sarebbe meglio non utilizzare system(), in ogni caso una volta che lo utilizzi tanto vale anche mettere un system("PAUSE) alla fine del ciclo do/while più esterno per permettere all'utente di leggere i vari messaggi;
    - metti tutti quei controlli sugli inserimenti (che peraltro potrebbero essere ottimizzati e implementati in una funzione per evitare ridondanze) e poi non c'è alcun controllo sul numero di libri inseriti nel vettore?!

    Per il resto mi accodo a quanto detto da oregon.
  • Re: Strutture con funzioni esterne in C++

    oregon ha scritto:


    Non ho capito il tuo problema. In particolare dove hai difficoltà?

    E comunque concentrati su una parte di codice, facci vedere quello che fai e mostra eventuali errori. Così se ne può parlare.
    allora prendendo solo una parte del codice, mi piacerebbe fare una cosa simile, ma proprio non ci riesco e non capisco come fare.
    
    
    // BibliotecaFunzioni.cpp
    //
    #include "stdafx.h"    //Libreria obbligatoria usata da Visual Studio
    #include <iostream>
    #include <string>
    #define max 50
    using namespace std;
    
    struct biblioteca {
    	int codice;
    	string titolo;
    	string autore;
    	string editore;
    	int anno;
    
    };
    int inserimento(biblioteca *libri[],int ultimo); //la variabile ultimo mi servirebbe per ricordarmi quale è l'ultimo libro inserito per i successivi 	
                                                                          //controlli
    void visualizzalibri(biblioteca *libri[],int ultimo); //visualizza libri del secondo case
    int main()
    {
    		
    		//##########################   DICHIARAZIONE VARIABILI   ###################################
    		int scelta;  //variabile per scalta menu      		
    		int trova_codice;     //variabile per ricerca codice
    		string trova_titolo;  //variabile per ricerca titolo
    		biblioteca libri[max];  //Vettore di tipo struttura 
    		int ultimo = 0;
    		//##########################################################################################
    
    
    		do {                     //############################## MENU INIZIALE####################################
    			system("CLS");
    			cout << "\t\t\t\t\t\t########## BIBLIOTECA ########## \n";
    			cout << "\t\t\t\t\t\t1 Inserire nuovo libro \n";
    			cout << "\t\t\t\t\t\t2 Visualizzare libri \n";
    			cout << "\t\t\t\t\t\t3 Ricerca libro dal codice \n";
    			cout << "\t\t\t\t\t\t4 Ricerca libro dal titolo \n";
    			cout << "\t\t\t\t\t\t0 Uscita \n";
    			cout << "\t\t\t\t\t\t################################\n";
    			cout << "\t\t\t\t\t\t------> ";
    			cin >> scelta;
    			//                      ############################# FINE menu iniziale #################################
    
    
    			if (!cin) //controllo che non venga fatta una scelta di formato non consentito (es. 'F')
    			{
    				scelta = -1; //seleziona la scelta -1 che corrisponde ad annullare
    				cin.clear(); //pulisce la cache
    				cout << "Scelta non consentita!" << endl;
    			}
    			cin.ignore(100, '\n'); //ignora i primi 100 caratteri che sono stati scritti 
    
    			switch (scelta)
    			{
    				case 1:
    				{
    				inserimento(libri,ultimo);
    
    				break;
    				}
    				case2:
    				visualizziLibri(libri,ultimo);
    				break;
    			}
    		} while (scelta != 0);
    return 0;
    }
    int inserimento(biblioteca *libri[],int fine)      //funzione 
    {
    	int num_libri = 0;  //numero dei liberi presenti in biblioteca
    	int num_codice, num_anno;// variabile per controllo interi
    	system("CLS");
    	cout << "In biblioteca puoi aggiungere ancora " << max - num_libri << " libri " << endl;
    	do {									//############blocco per evitare che si inserisca###########  
    		cout << "inserisci codice \n";		//un carattere diverso da un numero
    		cin >> num_codice;
    		if (!cin)
    		{
    			cout << " il codice deve essere un numero intero \n";
    			num_codice = -1;
    			cin.clear();
    		}
    		cin.ignore(100, '\n');
    	} while (num_codice == -1); //#######################Fine blocco carattere#######################
    								//Insermineto dati nella struttura
    	libri[num_libri].codice = num_codice; //dopo il controllo sul codice viene inserito nel campo struttura
    	cout << "inserisci titolo \n";
    	cin >> libri[num_libri].titolo;
    	cout << "inserisci autore \n";
    	cin >> libri[num_libri].autore;
    	cout << "inserisci editore \n";
    	cin >> libri[num_libri].editore;
    	do
    	{
    		cout << "inserisci anno \n";//questo deve essere per forza un numero 
    		cin >> num_anno;
    		if (!cin)
    		{
    			cout << " il codice deve essere un numero intero \n";
    			num_anno = -1;
    			cin.clear();
    		}
    		cin.ignore(100, '\n');
    	} while (num_anno == -1);
    
    	libri[num_libri].anno = num_anno;
    	cout << endl;
    	cout << endl;
    
    	num_libri++;
    	cout << "hai inserito " << num_libri << " libr";
    	if (num_libri == 1)
    		cout << "o";
    	else
    		cout << "i";
    	cout << endl;
    	cout << endl;
    	system("PAUSE");
    	
    
    	fine++;
    	return fine;
    }
    
    
    La libreria stdafx.h è obbligatoria per l'uso di visual studio senza di essa il SW non funziona per nulla.

    In pratica vorrei spostare tutti i codice di ogni case in FUNZIONI diverse.
    Ma ho questo errore che non riesco proprio a venirne fuori grazie.
  • Re: Strutture con funzioni esterne in C++

    La libreria stdafx.h è obbligatoria per l'uso di visual studio senza di essa il SW non funziona per nulla.
    Usando Code::blocks non ne ero a conoscenza.

    I motivi per cui il codice che hai postato non compila sono fondamentalmente due:
    - nel prototipo chiami la funzione visualizzalibri, mentre nel main la chiami visualizziLibri;
    - le funzioni inserimento e visualizzalibri si aspettano come primo argomento un puntatore doppio al tipo biblioteca, mentre nel main gli passi un puntatore singolo, infatti biblioteca *libri[] coincide con biblioteca **libri. Quindi come primo argomento delle funzioni devi scegliere tra biblioteca *libri e biblioteca libri[].

    Aggiustate queste due cose il codice compila, ma ci sono cmq molti errori. Un paio di osservazioni:
    - perché la funzione inserimento ritorna un intero?
    - nella funzione inserimento fai confusione tra le variabili fine e num_libri. Inoltre passando fine per valore perderai ogni sua modifica all'uscita della funzione;

    Ah di solito nei prototipi delle funzioni non si mettono i nomi degli argomenti, ma solo i tipi.
  • Re: Strutture con funzioni esterne in C++

    Nippolo ha scritto:


    La libreria stdafx.h è obbligatoria per l'uso di visual studio senza di essa il SW non funziona per nulla.
    Usando Code::blocks non ne ero a conoscenza.

    I motivi per cui il codice che hai postato non compila sono fondamentalmente due:
    - nel prototipo chiami la funzione visualizzalibri, mentre nel main la chiami visualizziLibri;
    - le funzioni inserimento e visualizzalibri si aspettano come primo argomento un puntatore doppio al tipo biblioteca, mentre nel main gli passi un puntatore singolo, infatti biblioteca *libri[] coincide con biblioteca **libri. Quindi come primo argomento delle funzioni devi scegliere tra biblioteca *libri e biblioteca libri[].

    Aggiustate queste due cose il codice compila, ma ci sono cmq molti errori. Un paio di osservazioni:
    - perché la funzione inserimento ritorna un intero?
    - nella funzione inserimento fai confusione tra le variabili fine e num_libri. Inoltre passando fine per valore perderai ogni sua modifica all'uscita della funzione;

    Ah di solito nei prototipi delle funzioni non si mettono i nomi degli argomenti, ma solo i tipi.
    Ti ringrazio moltissimo per il tuo aiuto, vediamo se riesco a spiegarmi:
    *intanto la funzione mii restituisce un intero perchè forse mi serve per continuare ad inserire in coda gli altri elementi, e se non conosco dove ho
    finito non saprei come fare.
    *il problema delle variabili tra num_libri e fine è scaturito solo dal fatto che ho cercato di adattare alla meglio il mio primocodice postato senza
    funzioni a quest'ultimo con le funzione.

    Avevo studiato un tempo che i parametri delle funzioni prevedevono sia il nome delle variabili che il tipo, tu sei sicuro che una funzione viene definita con i parametri solo con il tipo ? cioè come tu dici una funzione sarebbe :

    int Funzione(int, double){...} // questo sarebbe ciò che tu mi dici ?

    int Funzione(int a, double b) // questo sarebbe come ho sempre saputo, che a e b sarebbero successivamente una copia dei valori passati alla funzione, sbaglio ?

    Scusami diciamo che ora parte degli errori grazie al tuo aiuto sono spariti ed il codice compila, ma come faccio a far ritornare il vettore che ho inserito nel main ?
    Potresti gentilmenti farmi un esempio ?

    Grazie mille
  • Re: Strutture con funzioni esterne in C++

    *intanto la funzione mii restituisce un intero perchè forse mi serve per continuare ad inserire in coda gli altri elementi, e se non conosco dove ho finito non saprei come fare.
    Concordo sul fatto che bisogna tener conto del numero di libri inseriti, ma io imposterei la funzione come void e passerei l'argomento fine (che forse sarebbe più corretto chiamare num_libri) per riferimento.
    Avevo studiato un tempo che i parametri delle funzioni prevedevono sia il nome delle variabili che il tipo, tu sei sicuro che una funzione viene definita con i parametri solo con il tipo ? cioè come tu dici una funzione sarebbe :

    int Funzione(int, double){...} // questo sarebbe ciò che tu mi dici ?

    int Funzione(int a, double b) // questo sarebbe come ho sempre saputo, che a e b sarebbero successivamente una copia dei valori passati alla funzione, sbaglio ?
    Dichiarazione di una funzione (o prototipo):
    void fun(int, double);
    Definizione di una funzione:
    void fun(int a, double b)
    {
    ...
    }
  • Re: Strutture con funzioni esterne in C++

    Scusami diciamo che ora parte degli errori grazie al tuo aiuto sono spariti ed il codice compila, ma come faccio a far ritornare il vettore che ho inserito nel main ?
    Intendi come fare affinché le modifiche apportate al vettore libri dalla funzione inserimento siano conservate anche nel main?
    Se ho capito bene la domanda, la risposta è niente, perché quando passi un array ad una funzione stai in pratica passando il puntatore al primo elemento di quell'array. Quindi ogni modifica all'array nella funzione sarà ancora presente al ritorno nel main.
  • Re: Strutture con funzioni esterne in C++

    Intendi come fare affinché le modifiche apportate al vettore libri dalla funzione inserimento siano conservate anche nel main?
    Se ho capito bene la domanda, la risposta è niente, perché quando passi un array ad una funzione stai in pratica passando il puntatore al primo elemento di quell'array.
    Ha ragione ormai, facendo modiche su modifiche, avevo iniziato a confondermi con gli indici del vettore.
    nel prototipo di Funzione che nel mio caso ora avrei scritto : void inserimento(biblioteca *libri , int &); come mi hai suggerito, ma come faccio a fare lo stesso con biblioteca e libri ? ovvero come faccio nel prototipo poi ad indicare il puntatore al vettore?

    Mi hai chiarito e fatto capire più cose tu con le risposte che in tanti anni di scuola.... grazie mille!


    Giusto per concludere, inserisco la parte del codice modificata grazie al tuo aiuto ed ho inserito giustamente anche il controllo sul vettore pieno, facendo presente che la scelta dal menu per la ricerca in base al codice o titolo non è inserita.

    Mi farebbe piacere se tu mi dicessi cosa ne pensi ora, e quale altra miglioria potrei fare oltre alla parte di creare una funzione per il controllo inserimento sul campo numerico che come hai detto è giusto farla per non fare una ripetizione del codice.
    
    // BibliotecaFunzioni.cpp
    //
    #include "stdafx.h"    //Libreria obbligatoria usata da Visual Studio
    #include <iostream>
    #include <string>
    #define max 50
    using namespace std;
    
    struct biblioteca {
    	int codice;
    	string titolo;
    	string autore;
    	string editore;
    	int anno;
    
    };
    void inserimento(biblioteca *libri, int &);
    
    int main()
    {
    		
    		//##########################   DICHIARAZIONE VARIABILI   ###################################
    		int scelta;  //variabile per scalta menu      
    		int num_libri = 48;  //numero dei liberi presenti in biblioteca
    		
    		int trova_codice;     //variabile per ricerca codice
    		string trova_titolo;  //variabile per ricerca titolo
    		biblioteca libri[max];  //Vettore di tipo struttura 
    		//int ultimo = 0;
    							  //##########################################################################################
    
    
    		do {                     //############################## MENU INIZIALE####################################
    			system("CLS");
    			cout << "\t\t\t\t\t\t########## BIBLIOTECA ########## \n";
    			cout << "\t\t\t\t\t\t1 Inserire nuovo libro \n";
    			cout << "\t\t\t\t\t\t2 Visualizzare libri \n";
    			cout << "\t\t\t\t\t\t3 Ricerca libro dal codice \n";
    			cout << "\t\t\t\t\t\t4 Ricerca libro dal titolo \n";
    			cout << "\t\t\t\t\t\t0 Uscita \n";
    			cout << "\t\t\t\t\t\t################################\n";
    			cout << "\t\t\t\t\t\t------> ";
    			cin >> scelta;
    			//                      ############################# FINE menu iniziale #################################
    
    
    			if (!cin) //controllo che non venga fatta una scelta di formato non consentito (es. 'F')
    			{
    				scelta = -1; //seleziona la scelta -1 che corrisponde ad annullare
    				cin.clear(); //pulisce la cache
    				cout << "Scelta non consentita!" << endl;
    			}
    			cin.ignore(100, '\n'); //ignora i primi 100 caratteri che sono stati scritti 
    
    			switch (scelta)
    			{
    			case 1:
    			{
    				if(num_libri<50)
    				inserimento(libri,num_libri);
    				else
    				{
    					cout << "Spiacente la tua librerie è piena!" << endl;
    				}
    				break;
    			}
    			case 2:
    			{
    				if( num_libri != 0)
    				{
    					for (int i = 0; i < num_libri; i++)
    					{
    						cout << "ecco i tuoi libri \n";
    
    						cout << libri[i].codice;
    						cout << "   ";
    
    						cout << libri[i].titolo;
    						cout << "   ";
    						cout << libri[i].autore;
    						cout << "   ";
    						cout << libri[i].editore;
    						cout << "   ";
    						cout << libri[i].anno;
    						cout << endl;
    
    					}
    
    					cout << endl;
    					cout << endl;
    				}
    				else
    				{
    					cout << "Non ci sono Libri " << endl;
    				}
    				
    				break;
    			}
    			} system("PAUSE");
    		} while (scelta != 0);
    return 0;
    }
    void inserimento(biblioteca *libri,int &num_libri)
    {
    	
    	int num_codice, num_anno;// variabile per controllo interi
    	system("CLS");
    	cout << "In biblioteca puoi aggiungere ancora " << max - num_libri << " libri " << endl;
    	do {									//############blocco per evitare che si inserisca###########  
    		cout << "inserisci codice \n";		//un carattere diverso da un numero
    		cin >> num_codice;
    		if (!cin)
    		{
    			cout << " il codice deve essere un numero intero \n";
    			num_codice = -1;
    			cin.clear();
    		}
    		cin.ignore(100, '\n');
    	} while (num_codice == -1); //#######################Fine blocco carattere#######################
    								//Insermineto dati nella struttura
    	libri[num_libri].codice = num_codice; //dopo il controllo sul codice viene inserito nel campo struttura
    	cout << "inserisci titolo \n";
    	cin >> libri[num_libri].titolo;
    	cout << "inserisci autore \n";
    	cin >> libri[num_libri].autore;
    	cout << "inserisci editore \n";
    	cin >> libri[num_libri].editore;
    	do
    	{
    		cout << "inserisci anno \n";//questo deve essere per forza un numero 
    		cin >> num_anno;
    		if (!cin)
    		{
    			cout << " il codice deve essere un numero intero \n";
    			num_anno = -1;
    			cin.clear();
    		}
    		cin.ignore(100, '\n');
    	} while (num_anno == -1);
    
    	libri[num_libri].anno = num_anno;
    	cout << endl;
    	cout << endl;
    
    	num_libri++;
    	cout << "hai inserito " << num_libri << " libr";
    	if (num_libri == 1)
    		cout << "o";
    	else
    		cout << "i";
    	cout << endl;
    	cout << endl;
    	system("PAUSE");
    }
    
    
  • Re: Strutture con funzioni esterne in C++

    Mi fa piacere esserti stato d'aiuto!
    nel prototipo di Funzione che nel mio caso ora avrei scritto : void inserimento(biblioteca *libri , int &); come mi hai suggerito, ma come faccio a fare lo stesso con biblioteca e libri ? ovvero come faccio nel prototipo poi ad indicare il puntatore al vettore?
    Non ho capito bene la domanda, cmq il prototipo di inserimento assume la seguente forma:
    void inserimento(biblioteca*, int&);
    Mi farebbe piacere se tu mi dicessi cosa ne pensi ora, e quale altra miglioria potrei fare oltre alla parte di creare una funzione per il controllo inserimento sul campo numerico che come hai detto è giusto farla per non fare una ripetizione del codice.
    Mi dispiace, adesso non ho tempo, domani mi guardo il codice con calma e ti faccio sapere.
  • Re: Strutture con funzioni esterne in C++

    Nippolo ha scritto:


    Mi fa piacere esserti stato d'aiuto!
    Mi sei stato molto d'aiuto e ti ringrazio mille!

    Mi dispiace, adesso non ho tempo, domani mi guardo il codice con calma e ti faccio sapere.
    Buongiornooooooooooooooooooo!
    Ma figurati vai con molta tranquillità. grazie!
  • Re: Strutture con funzioni esterne in C++

    al posto della direttiva #define utilizzerei variabili definite const;
    da un punto di vista logico sarebbe più corretto chiamare la struct libro (dal momento che ogni istanza di quella struct rappresenta un libro e non certo una biblioteca) e il vettore biblioteca (essendo un insieme di libri);
    - hai inizializzato la variabile num_libri a 48 per testare il programma?
    - per le stringhe se vuoi inserire più parole divise dal carattere spazio devi usare la funzione getline e non l'operatore >>;
    - i controlli sugli inserimenti li toglierei proprio, perché per essere efficaci dovrebbero essere molto più complessi. Nel senso che volendo essere pignoli bisognerebbe anche controllare che il codice sia univoco o che l'anno sia un valore plausibile.

    Giusto per capire, farei una cosa del genere:
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    const int MAX = 50;
    
    struct libro
    {
        int codice;
        int anno;
        string titolo;
        string autore;
        string editore;
    };
    
    void inserimento(libro*, int&);
    void visualizza(libro*, const int&);
    
    int main()
    {
        libro biblioteca[MAX];
        int num_libri = 0;
        int scelta;
        do
        {
            cout << "########## BIBLIOTECA ##########\n";
            cout << "1 Inserire nuovo libro\n";
            cout << "2 Visualizzare biblioteca\n";
            cout << "3 Ricerca libro dal codice\n";
            cout << "4 Ricerca libro dal titolo\n";
            cout << "5 Uscita\n";
            cout << "################################\n";
            cout << "INSERIRE UN NUMERO ------> ";
            cin >> scelta;
            cout << endl;
            switch(scelta)
            {
                case 1:
                {
                    if(num_libri < MAX)
                    {
                        inserimento(biblioteca, num_libri);
                    }
                    else
                    {
                        cout << "BIBLIOTECA PIENA!" << endl;
                    }
                    break;
                }
                case 2:
                {
                    if(num_libri == 0)
                    {
                        cout << "BIBLIOTECA VUOTA!" << endl;
                    }
                    else
                    {
                        visualizza(biblioteca, num_libri);
                    }
                    break;
                }
                case 3:
                {
                    cout << "LAVORI IN CORSO..." << endl;
                    break;
                }
                case 4:
                {
                    cout << "LAVORI IN CORSO..." << endl;
                    break;
                }
                case 5:
                {
                    cout << "CIAO!" << endl;
                    break;
                }
                default:
                {
                    cout << "INSERIMENTO NON VALIDO!" << endl;
                    break;
                }
            }
            cout << endl;
            system("PAUSE");
            system("CLS");
        }
        while(scelta != 5);
    }
    
    void inserimento(libro *biblioteca, int &num_libri)
    {
        cout << "CODICE(NUMERO INTERO): ";
        cin >> biblioteca[num_libri].codice;
        cout << "ANNO(NUMERO INTERO): ";
        cin >> biblioteca[num_libri].anno;
        cin.ignore();
        cout << "TITOLO: ";
        getline(cin, biblioteca[num_libri].titolo);
        cout << "AUTORE: ";
        getline(cin, biblioteca[num_libri].autore);
        cout << "EDITORE: ";
        getline(cin, biblioteca[num_libri].editore);
        ++num_libri;
    }
    
    void visualizza(libro *biblioteca, const int &num_libri)
    {
        cout << "#) TITOLO / AUTORE / ANNO / EDITORE / CODICE" << endl << endl;
        for(unsigned int i = 0; i < num_libri; ++i)
        {
            cout << i + 1 << ") ";
            cout << biblioteca[i].titolo << " / ";
            cout << biblioteca[i].autore << " / ";
            cout << biblioteca[i].anno << " / ";
            cout << biblioteca[i].editore << " / ";
            cout << biblioteca[i].codice << endl;
        }
    }
  • Re: Strutture con funzioni esterne in C++

    da un punto di vista logico sarebbe più corretto chiamare la struct libro (dal momento che ogni istanza di quella struct rappresenta un libro e non certo una biblioteca) e il vettore biblioteca (essendo un insieme di libri);
    - hai inizializzato la variabile num_libri a 48 per testare il programma?
    Si era per le prove
    - per le stringhe se vuoi inserire più parole divise dal carattere spazio devi usare la funzione getline e non l'operatore >>;

    Hai ragione, ora inizierò ad affinare al meglio il codice, per ora mi premeva capire meglio il discorso delle funzioni
    - i controlli sugli inserimenti li toglierei proprio, perché per essere efficaci dovrebbero essere molto più complessi. Nel senso che volendo essere pignoli bisognerebbe anche controllare che il codice sia univoco o che l'anno sia un valore plausibile.
    Qualche piccolo controllo giusto per ricordarmi che vanno fatti in questi due campi.

    Grazie mille per il tuo preziosissimo aiuto e per la tua enorme disponibilità.
    In questi giorni proverò il tuo codice!
    Buona giornata!
    Giusto per capire, farei una cosa del genere:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    const int MAX = 50;
    
    struct libro
    {
        int codice;
        int anno;
        string titolo;
        string autore;
        string editore;
    };
    
    void inserimento(libro*, int&);
    void visualizza(libro*, const int&);
    
    int main()
    {
        libro biblioteca[MAX];
        int num_libri = 0;
        int scelta;
        do
        {
            cout << "########## BIBLIOTECA ##########\n";
            cout << "1 Inserire nuovo libro\n";
            cout << "2 Visualizzare biblioteca\n";
            cout << "3 Ricerca libro dal codice\n";
            cout << "4 Ricerca libro dal titolo\n";
            cout << "5 Uscita\n";
            cout << "################################\n";
            cout << "INSERIRE UN NUMERO ------> ";
            cin >> scelta;
            cout << endl;
            switch(scelta)
            {
                case 1:
                {
                    if(num_libri < MAX)
                    {
                        inserimento(biblioteca, num_libri);
                    }
                    else
                    {
                        cout << "BIBLIOTECA PIENA!" << endl;
                    }
                    break;
                }
                case 2:
                {
                    if(num_libri == 0)
                    {
                        cout << "BIBLIOTECA VUOTA!" << endl;
                    }
                    else
                    {
                        visualizza(biblioteca, num_libri);
                    }
                    break;
                }
                case 3:
                {
                    cout << "LAVORI IN CORSO..." << endl;
                    break;
                }
                case 4:
                {
                    cout << "LAVORI IN CORSO..." << endl;
                    break;
                }
                case 5:
                {
                    cout << "CIAO!" << endl;
                    break;
                }
                default:
                {
                    cout << "INSERIMENTO NON VALIDO!" << endl;
                    break;
                }
            }
            cout << endl;
            system("PAUSE");
            system("CLS");
        }
        while(scelta != 5);
    }
    
    void inserimento(libro *biblioteca, int &num_libri)
    {
        cout << "CODICE(NUMERO INTERO): ";
        cin >> biblioteca[num_libri].codice;
        cout << "ANNO(NUMERO INTERO): ";
        cin >> biblioteca[num_libri].anno;
        cin.ignore();
        cout << "TITOLO: ";
        getline(cin, biblioteca[num_libri].titolo);
        cout << "AUTORE: ";
        getline(cin, biblioteca[num_libri].autore);
        cout << "EDITORE: ";
        getline(cin, biblioteca[num_libri].editore);
        ++num_libri;
    }
    
    void visualizza(libro *biblioteca, const int &num_libri)
    {
        cout << "#) TITOLO / AUTORE / ANNO / EDITORE / CODICE" << endl << endl;
        for(unsigned int i = 0; i < num_libri; ++i)
        {
            cout << i + 1 << ") ";
            cout << biblioteca[i].titolo << " / ";
            cout << biblioteca[i].autore << " / ";
            cout << biblioteca[i].anno << " / ";
            cout << biblioteca[i].editore << " / ";
            cout << biblioteca[i].codice << endl;
        }
    }
Devi accedere o registrarti per scrivere nel forum
12 risposte