Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269

    [C++]Semplice programmino per gestire i clienti

    Salve ragazzi, sto creando un programmino in C++, che mi permette di gestire degli utenti.
    Tutto questo sfruttando la programmazione orientata agli oggetti.
    Ho iniziato a buttare giù del codice, il quale non presenza alcun errore, però non fà ciò che realmente dovrebbe fare.
    Nel momento in cui eseguo, mi chiede di inserire 1, 2 o 0 in base a quello che devo fare.
    Se inserisco 1, mi fa inserire i dati relativi al cliente che devo inserire, se inserisco 2 mi permette di cercare un utente, se inserisco 0 esco dal programma.

    Quando qui cerco di inserire un utente e successivamente tento di cercarlo, non trova nulla.

    Quindi io dovrei avere tipo un'array di strutture che mi permette di gestire tutti gli utenti, questo sfruttando sempre la teconologia orientata agli oggetti.
    Qualcuno può aiutarmi a capire questa cosa?

    Qui c'è del codice:

    codice:
    // GestioneClienti.cpp : definisce il punto di ingresso dell'applicazione console.
    //
    
    #include "stdafx.h"
    #include <iostream>
    #include <string.h>
    #include "cliente.h"
    
    using namespace std;
    
    #define MAX 2
    
    int Cliente::Menu(int &clients)
    {
    	Cliente client;
    	int request;
    	char surname[20];
    
    	cout << "\t1 . Inserisci Cliente:\n";
    	cout << "\t2 . Cerca Cliente:\n";
    	cout << "\t0 . Esci:\n";
    	cin >> request;
    
    	switch(request)
    	{
    		case 1:
    			client.InsertClients(clients);
    			clients++;
    			break;
    		case 2:
    			cout << "Inserisci il cognome da ricercare:\n";
    			cin >> surname;
    
    			client.SearchClients(surname, clients);
    			break;
    		case 0:
    			cout << "Arrivederci";
    		default:
    			cout << "Scelta sbagliata!\n";
    	}
    
    	return request;
    }
    
    void Cliente::InsertClients(int clients) // Alla funzione InsertClients invio il numero dei clienti
    {
    	cout << "Questo è il cliente numero: " << clients << endl;
    	cout << "Inserisci il nome: "	 << endl;
    	cin >> Nome;
    	cout << "Inserisci il cognome: " << endl;
    	cin >> Cognome;
    	cout << "Inserisci l'età: "		 << endl;
    	cin >> Eta;
    }
    
    void Cliente::SearchClients(char *surname, int max)
    {
    	Cliente client;
    	for (int i = 0; i < max; i++)
    	{
    		if (!strcmp(surname, client.Cognome))
    		{
    			cout << "ID cliente: "	<< i				<< endl;
    			cout << "Nome: "		<< client.Nome		<< endl;
    			cout << "Cognome: "		<< client.Cognome	<< endl;
    			cout << "Età: "			<< client.Eta		<< endl;
    		}
    	}	
    }
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	Cliente client;
    	int clients = 0; // Numero dei clienti di partenza
    	int i = 0;
    
    	while(client.Menu(clients));
    	
    	return 0;
    }

    il file client.h

    codice:
    class Cliente
    {
    	public:
    
    	char Nome[20];
    	char Cognome[20];
    	int  Eta;
    
    	int Menu(int &clients);
    	void InsertClients (int clients);
    	void SearchClients (char *surname, int max);
    };
    Con i sogni possiamo conoscere il futuro...

  2. #2
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    è sbagliata la struttura del programma.. non puoi far fare il menu e la ricerca al cliente..

    il cliente deve essere un oggetto che incapsula le caratteristiche del cliente fisico..

    dovrai fare una classe invece che gestisca la collezione di questi con metodi di inserimento e ricerca

  3. #3
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Quindi, devo creare un'altra classe, per gestire tutti i clienti?

    Riguardo a quello che dicevi prima, riguardo al fatto del menu e la ricerca dell'utente, puoi farmi un esempio?

    Grazie mille!
    Con i sogni possiamo conoscere il futuro...

  4. #4
    Ciao Gaten...

    Un modo strutturare Client potrebbe essere il seguente:
    codice:
    class Client
    {
    	private:
    		string name;		//nome del cliente
    		string surname;		//cognome del cliente
    		unsigned int age;	//età
    	public:
    	private:
    	public:
    		Client (string _name, string _surname, unsigned int _age);	//costruttore
    		void setName (string _name);					//mi permette di settare il nome
    		void setSurname (string _surname);				//mi permette di settare il cognome
    		void setAge (unsigned int age);					//mi permette di settare l'età
    		string getName ();						//mi permette gi ottenere il nome
    		string getSurname ();						//mi permette di ottenere il cognome
    		unsigned int getAge ();						//mi permette di ottenere l'età
    		
    		Client &operator= (const Client &rhs);				//operatore di assegnamento
    		[...]
    };
    Da notare l'overloading dell'operatore di assegnamento, che dovrebbe essere seguito da quello dell'operatore di confronto, etc (in questo modo realizzi una classe più carina e impari qualcosina in più).
    Da notare anche l'utilizzo del modificatore "private" sugli attributi (non permetto che vengano modificati dall'esterno, per ovvi motivi): l'utente per ottenere il loro valore e per settarlo dovrà utilizzare i metodi get e set rispettivamente.

    Il codice potrà sembrare insensatamente lungo, ma alla fine vale la pena scrivere qualcosa in più, per ottenere un prodotto finale più chiaro e "usabile".

    Naturalmente non dimenticare l'overloading degli operatori di inserimento nello stream (<<) e di estrazione dallo stream (>>), per la classe ostream :
    codice:
    ostream& operator<< (ostream& os, const Client& client)		//overloading operatore di inserimento nello stream di ostream
    {
    	return os
    	<< "Nome: "		<< client.getName ()		<< endl
    	<< "Cognome: "		<< client.getSurname ()		<< endl
    	<< "Età: "		<< client.getAge ()		<< endl;
    }
    [...]
    Per il resto del programma puoi lavorare come hai sempre fatto (prima cammina e poi corri)
    Un esempio di programma potrebbe essere il seguente:
    codice:
    #include <iostream>
    #include <deque>
    using namespace std;
    
    bool dispatcher (deque<Clients> &clients);	//"gestisce" le richieste dell'utente chiamando le opportune procedure
    
    main ()
    {
    	deque<Client> clients;			//questi sono tutti i clienti
    	while (dispatcher(clients));		//main loop
    	return EXIT_SUCCESS;
    }
    
    bool dispatcher (deque<Clients> &clients)
    {
    	int request;
    	cout << "\t1 . Inserisci Cliente:\n";
    	cout << "\t2 . Cerca Cliente:\n";
    	cout << "\t0 . Esci:\n";
    	cin >> request;
    	
    	switch (request)
    		{
    			case 1:
    				...
    			break;
    			case 2:
    				...
    			break;
    			case 0:
    				return false;
    			default:
    				...
    		};
    		
    	return true;
    }
    Utilizzando quindi il classico approccio procedurale per gestire le classi da te create più altri oggetti della standard library di cpp (come deque).

    Troverai semplice lavorare con la classe Client.
    Ad esempio per stampare un cliente ti basterà fare
    codice:
    Client c("Paolo", "Rizz.", 20);
    cout << c;
    Oppure per stamparli tutti:
    codice:
    for (deque<Client>::iterator i = clients.begin(); i != clients.end(); i++)
    	cout << *i << endl;
    Molto più semplice e compatto.

    Prova a fare una tua implementazione.
    Considera che ho buttatò giù il codice senza provalo quindi potrei aver fatto errori grossolani e non.
    Experience is what you get when you don’t get what you want

  5. #5
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Puoi spiegarmi cortesemente, come funziona la classe dal costruttore, all'utilizzo delle 6 funzioni get/set. Grazie
    Con i sogni possiamo conoscere il futuro...

  6. #6
    Il costruttore si occupa di assegnare i valori agli attributi, cioè di istanziare la classe.
    I metodi set permettono di modificare i valori degli attributi.
    I metodi get permettono di "ottenere" i valori degli attributi.
    I metodi get e set sono dei metodi che prendono questo nome per convenzione.
    Ad esempio il metodo getAge ritornerà l'età del cliente (attributo age), mentre il metodo setAge si occuperà di assegnare, all'attribto age, il valore passato come parametro.
    In questo caso, ad esempio, si può ulteriormente migliorare il metodo: inserendo un controllo sull'età passata come parametro (un cliente non può avere, ad esempio, un'età di 1000 anni oppure non può averne una pari a 0) restituendo magari un feedback.
    Una volta istanziata la classe potrai quindi modificare i suoi attributi mediante i rispettivi metodi set, mentre potrai ottenere il loro valore con i rispettivi metodi get.

    L'overloading degli operatori può essere evitato, se sei ancora alle prime armi, magari inserendo metodi che eseguono i compiti degli operatori.
    Un esempio può essere il confronto fra due istanze di Client:
    aggiungendo un metodo equal
    codice:
    bool equal (Client c);
    potrai quindi confrontare due oggetti di tipo Client, per vedere "se sono uguali"
    codice:
    Client a(...);
    Client b(...);
    ....
    a.setName ("pippo");
    b.setAge (18);
    ...
    if (a.equal(b))
    ...
    Experience is what you get when you don’t get what you want

  7. #7
    Originariamente inviato da Xaratroom

    Oppure per stamparli tutti:
    codice:
    for (deque<Client>::iterator i = clients.begin(); i != clients.end(); i++)
    	cout << *i << endl;
    puoi anche fare cosi':
    Codice PHP:
    #include <iterator>
    ...

    (
    voidstd::copy(clients.begin(), clients.end(), std::ostream_iterator<Client>(std::cout"\n")); 
    ;-)

  8. #8
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    Cmq mi sembra che l'autore del post sia un po' troppo a digiuno di teoria (chiedendo spiegazioni sui metodi di una classe e del costruttore) e quindi direi che dovrebbe passare allo studio del suo libro (spero che ce l'abbia) perchè il forum non è adatto a questo tipo di spiegazioni.

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da Stoicenko
    ... perchè il forum non è adatto a questo tipo di spiegazioni.
    Concordo pienamente ... inoltre il titolo e' "semplice programmino" ma per lui non e' cosi' semplice ... e la cosa mi lascia perplesso ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Cmq, Paolo... ti ringrazio per la risposta data.

    Si, poichè sono alle prime armi, mi consigli di non incimentarmi ancora con gli operatori, tu ad esempio hai inserito una cosa del tipo:

    codice:
    ostream& operator<< (ostream& os, const Client& client)		//overloading operatore di inserimento nello stream di ostream
    {
    	return os
    	<< "Nome: "		<< client.getName ()		<< endl
    	<< "Cognome: "		<< client.getSurname ()		<< endl
    	<< "Età: "		<< client.getAge ()		<< endl;
    }
    [...]
    è in realtà ho avuto qualche difficoltà per capire...


    Grazie comunque!

    Ciao!
    Con i sogni possiamo conoscere il futuro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.