Aide pour débuter en C++
Bonjour,
j'ai besoin de votre aide, avancant petit a petit et étant debutante, j'ai besoin de savoir comment faire la procedure ajouter, supprimer etc..vous comprendrez comme suit
Voici une classe Personne avec comme héritage : table client et fournisseur, mais je n'ai mis que client.
#include <iostream>
#include <string>
class PERSONNE
{
protected:
char *adresse;
char *cp;
char *ville;
int annee_entree;
int annee_sortie;
public:
void afficher();
void add();
void del();
};
class CLIENT :public PERSONNE
{
private:
char *nom;
char *prenom;
public:
CLIENT();
CLIENT(char *_nom, char *_prenom ,char *_add,char *_cp,char *_ville,int _entree, int _sortie)
{
nom= _nom;
prenom= _prenom;
adresse=_add;
cp=_cp;
ville=_ville;
annee_entree=_entree;
annee_sortie=_sortie;
}
void afficher();
void add();
void del();
};
Je souhaite réaliser les méthodes add et del (afficher et supprimer) mais je ne comprends pas comment fais on cela, pouvez vous m'aider?
#include "classes.h"
/*using namespace std;*/
CLIENT::CLIENT():PERSONNE()
{
}
void CLIENT::afficher()
{
//nom|prenom|adresse|cp|ville|année entre| année sortis
printf("%s\t| %s\t| %s\t| %s | %s\t| %u | %u", nom, prenom,adresse,cp,ville,annee_entree,annee_sortie);
}
void CLIENT::add()
{
/*printf("Nom ? ");
//scanf("%s",);
printf("Prénom ? ");
scanf("%s",);
getchar();
printf("Adresse ? ");
scanf("%s",);
getchar();
printf("Code postal ? ");
scanf("%s",);
printf("Ville ? ");
scanf("%s",);
printf("Année d'entrée dans l'entreprise ? ");
scanf("%u",);
printf("Année de sortie de l'entreprise ? ");
scanf("%u",);*/
}
void CLIENT::del()
{
}
j'ai besoin de votre aide, avancant petit a petit et étant debutante, j'ai besoin de savoir comment faire la procedure ajouter, supprimer etc..vous comprendrez comme suit
Voici une classe Personne avec comme héritage : table client et fournisseur, mais je n'ai mis que client.
#include <iostream>
#include <string>
class PERSONNE
{
protected:
char *adresse;
char *cp;
char *ville;
int annee_entree;
int annee_sortie;
public:
void afficher();
void add();
void del();
};
class CLIENT :public PERSONNE
{
private:
char *nom;
char *prenom;
public:
CLIENT();
CLIENT(char *_nom, char *_prenom ,char *_add,char *_cp,char *_ville,int _entree, int _sortie)
{
nom= _nom;
prenom= _prenom;
adresse=_add;
cp=_cp;
ville=_ville;
annee_entree=_entree;
annee_sortie=_sortie;
}
void afficher();
void add();
void del();
};
Je souhaite réaliser les méthodes add et del (afficher et supprimer) mais je ne comprends pas comment fais on cela, pouvez vous m'aider?
#include "classes.h"
/*using namespace std;*/
CLIENT::CLIENT():PERSONNE()
{
}
void CLIENT::afficher()
{
//nom|prenom|adresse|cp|ville|année entre| année sortis
printf("%s\t| %s\t| %s\t| %s | %s\t| %u | %u", nom, prenom,adresse,cp,ville,annee_entree,annee_sortie);
}
void CLIENT::add()
{
/*printf("Nom ? ");
//scanf("%s",);
printf("Prénom ? ");
scanf("%s",);
getchar();
printf("Adresse ? ");
scanf("%s",);
getchar();
printf("Code postal ? ");
scanf("%s",);
printf("Ville ? ");
scanf("%s",);
printf("Année d'entrée dans l'entreprise ? ");
scanf("%u",);
printf("Année de sortie de l'entreprise ? ");
scanf("%u",);*/
}
void CLIENT::del()
{
}
A voir également:
- Aide pour débuter en C++
- Logiciel de programmation pour débutant - Guide
- Apprendre le coran pour débutant (+ pdf) - Télécharger - Histoire & Religion
- Espace en début de paragraphe - Guide
- Comment faire un point en debut de phrase sur word - Guide
- Logiciel de creation de site web pour debutant - Guide
17 réponses
A) Voici ce que je te propose.
1) Au lancement du programme tu charges le fichier dans une structure qui le décrit complètement
2) Tu corriges cette structures par rapport aux ajouts/modifications/suppressions
3) Quand tu quittes/sauves, tu (re)écris le fichier.
B) Ensuite je te conseille d'utiliser les avantages du C++
1) utilise des std::string au lieu des char* (plus de problème d'allocation/désallocation ou de longueur maximale)
2) utilise "std::cout << " pour écrire et "std::cin >> " pour lire une saisie.
3) pour initialiser les attributs de classe dans un constructeur, passe par les constructeur plutôt que par l'opérateur =
C) La classe personne n'a aucune raison d'avoir de méthode add/del. Un constructeur et un destructeur, et des accesseurs suffisent. Un moyen simple de stocker / chercher / modifier une personne c'est de définir une relation d'ordre (par exemple en définissant l'opérateur <) sur les personnes et de les insérer dans un std::set<personne_t>. J'ai par ailleurs un peu de mal à voir pourquoi une personne n'a pas de prénom et de nom alors qu'un client si. Ce serait plus logique que la classe client ait des attribut spécifique à un client (genre son numéro de client). Personnellement j'aurais fait une classe adresse.
D) Évite les noms de classe en capitale. En général les noms entièrement en capitales sont réservé aux variables des #define. Tu peux noter plop_t une variable désignant une sorte de plop.
Voici un aperçu de ce que je ferais :
ce qui donne :
Bonne chance
1) Au lancement du programme tu charges le fichier dans une structure qui le décrit complètement
2) Tu corriges cette structures par rapport aux ajouts/modifications/suppressions
3) Quand tu quittes/sauves, tu (re)écris le fichier.
B) Ensuite je te conseille d'utiliser les avantages du C++
1) utilise des std::string au lieu des char* (plus de problème d'allocation/désallocation ou de longueur maximale)
2) utilise "std::cout << " pour écrire et "std::cin >> " pour lire une saisie.
int x; std::cout << "saisir un entier" << std::endl; std::cin >> x;
3) pour initialiser les attributs de classe dans un constructeur, passe par les constructeur plutôt que par l'opérateur =
struct plop_t{ int x,y,z; plop_t(int x0,int y0,int z0):x(x0),y(y0),z(z0){} };
C) La classe personne n'a aucune raison d'avoir de méthode add/del. Un constructeur et un destructeur, et des accesseurs suffisent. Un moyen simple de stocker / chercher / modifier une personne c'est de définir une relation d'ordre (par exemple en définissant l'opérateur <) sur les personnes et de les insérer dans un std::set<personne_t>. J'ai par ailleurs un peu de mal à voir pourquoi une personne n'a pas de prénom et de nom alors qu'un client si. Ce serait plus logique que la classe client ait des attribut spécifique à un client (genre son numéro de client). Personnellement j'aurais fait une classe adresse.
D) Évite les noms de classe en capitale. En général les noms entièrement en capitales sont réservé aux variables des #define. Tu peux noter plop_t une variable désignant une sorte de plop.
Voici un aperçu de ce que je ferais :
// Les méthodes étant très courtes, je les mets inline ce qui me // permet de les implémenter directement dans les headers. // Rien ne t'empêche de mettre juste les prototypes et de // les implémenter dans le .cpp qui correspond. // Si tu sépares les fichiers, décommentes les #includes // Début sep.hpp ---- // Le séparateur inline const char *get_sep(){ return " | "; } // Fin sep.hpp // Début adresse.hpp ---- #include <string> #include <ostream> //#include "sep.hpp" typedef std::string lieu_t; typedef unsigned cp_t; typedef std::string ville_t; struct adresse_t{ // Attributs lieu_t lieu; cp_t cp; ville_t ville; // Constructeur adresse_t( const lieu_t & _add = "", const cp_t & _cp = 0, const ville_t & _ville = "" ): lieu(_add), cp(_cp), ville(_ville) {} // Destructeur sous-entendu (il ne fait rien) }; // Opérateur de comparaison inline bool operator<(const adresse_t & x,const adresse_t & y){ if(x.lieu < y.lieu) return true; if(x.lieu > y.lieu) return false; if(x.cp < y.cp) return true; if(x.cp > y.cp) return false; if(x.ville < y.ville) return true; if(x.ville > y.ville) return false; return false; } // Opérateur d'affichage inline std::ostream & operator << (std::ostream & out,const adresse_t & a){ const char *sep = get_sep(); out << a.lieu << sep << a.cp << sep << a.ville; return out; } // Fin adresse.hpp ---- // Début personne.hpp ---- #include <string> #include <ostream> //#include "adresse.hpp" //#include "sep.hpp" typedef std::string nom_t; typedef std::string prenom_t; class personne_t{ protected: nom_t nom; prenom_t prenom; adresse_t adresse; public: // Constructeur personne_t( const nom_t & _nom = "", const prenom_t & _prenom = "", const adresse_t & _adresse = adresse_t() ): nom(_nom), prenom(_prenom), adresse(_adresse) {} // Accesseurs inline const nom_t & get_nom() const{ return nom; } inline const prenom_t & get_prenom() const{ return prenom; } inline const adresse_t & get_adresse() const{ return adresse; } }; // L'opérateur d'affichage inline std::ostream & operator << (std::ostream & out,const personne_t & p){ const std::string sep = get_sep(); out << p.get_nom() << sep << p.get_prenom() << sep << p.get_adresse(); return out; } // Une personne est identifiée par son nom, prénom, adresse inline bool operator<(const personne_t & x,const personne_t & y){ if (x.get_nom() < y.get_nom()) return true; if (x.get_nom() > y.get_nom()) return false; if (x.get_prenom() < y.get_prenom()) return true; if (x.get_prenom() > y.get_prenom()) return false; if (x.get_adresse() < y.get_adresse()) return true; if (y.get_adresse() < x.get_adresse()) return false; return false; } // Fin personne.hpp ---- // Début client.hpp ---- #include <string> #include <ostream> //#include "personne.hpp" //#include "sep.hpp" typedef unsigned annee_t; class client_t : public personne_t{ protected: annee_t annee_entree; annee_t annee_sortie; public: client_t(){} client_t( const nom_t & _nom, const prenom_t & _prenom, const lieu_t & _adresse, const cp_t & _cp, const ville_t & _ville, const annee_t & _entree, const annee_t & _sortie ): personne_t(_nom,_prenom,adresse_t(_adresse,_cp,_ville)), annee_entree(_entree), annee_sortie(_sortie) {} inline const unsigned & get_annee_entree() const{ return annee_entree; } inline const unsigned & get_annee_sortie() const{ return annee_sortie; } }; // L'opérateur d'affichage inline std::ostream & operator << (std::ostream & out,const client_t & p){ const adresse_t & a = p.get_adresse(); const std::string sep = " | "; out << p.get_nom() << sep << p.get_prenom() << sep << a << sep << p.get_annee_entree() << sep << p.get_annee_sortie(); return out; } // Fin client.hpp ---- // Début base_client.hpp ---- //#include "client.hpp" #include <map> #include <set> class base_client_t{ public: typedef std::map<client_t,client_t *> clients_t; typedef std::map<nom_t,std::set<client_t *> > map_nom_clients_t; typedef std::map<prenom_t,std::set<client_t *> > map_prenom_clients_t; // ... protected: // Cette map stocke les clients clients_t clients; // Ces maps permettent de chercher un client juste sur son nom/prénom... map_nom_clients_t map_nom_clients; map_prenom_clients_t map_prenom_clients; public: base_client_t(){} // Détruit les clients stockés en base ~base_client_t(){ clients_t::const_iterator cit(clients.begin()), cend(clients.end()); for(;cit!=cend;++cit) delete cit->second; } // Récupère la base de clients inline const clients_t & get_clients() const{ return clients; } // Récupère la map clients avec un nom donné inline const std::set<client_t *> & chercher_nom(const nom_t & nom) const{ map_nom_clients_t::const_iterator fit(map_nom_clients.find(nom)); if (fit == map_nom_clients.end()) throw; // pas de client avec ce nom return fit->second; } // Insère un client en base inline bool add_client(const client_t & c){ std::size_t nb_client = clients.size(); client_t * pc = new client_t(c); clients[c] = pc; if (clients.size() > nb_client){ // nouveau client map_nom_clients[c.get_nom()].insert(pc); map_prenom_clients[c.get_prenom()].insert(pc); return true; } return false; } // Attention les fonctions de suppressions / modifications doivent supprimer // toutes les maps ! inline bool del_client(const clients_t::iterator & fit){ if(fit == clients.end()) return false; // iterator invalide const client_t & c = *(fit->second); map_nom_clients.erase(c.get_nom()); map_prenom_clients.erase(c.get_prenom()); clients.erase(fit); return true; } inline bool del_client(const client_t & c){ clients_t::iterator fit(clients.find(c)); if(fit == clients.end()) return false; // pas trouvé return del_client(fit); } }; // Opérateur d'affichage inline std::ostream & operator << (std::ostream & out,const base_client_t & base_client){ typedef base_client_t::clients_t clients_t; const clients_t & clients = base_client.get_clients(); clients_t::const_iterator cit (clients.begin()), cend(clients.end()); for(;cit!=cend;++cit) out << *(cit->second) << std::endl; return out; } // Fin base_client.hpp ---- // Début main.cpp #include <set> #include <iostream> //#include "base_client.hpp" #include <fstream> int main(){ base_client_t base_client; // Initialisation de la base const client_t c1( "nom","prenom","rue", 75000,"ville",1900,2000 ); const client_t c2( "dupond","jean","69 rue de la gaité", 75014,"paris",1969,2008 ); const client_t c3( "dupond","pierre","1 rue de quai", 69699,"groville",1969,2008 ); base_client.add_client(c1); base_client.add_client(c2); base_client.add_client(c3); base_client.add_client(c3); // doublon -> pas inséré // Ecrire la base const char *filename = "plop.txt"; std::ofstream ofs(filename); if (!ofs){ std::cerr << "impossible d'ouvrir " << filename << std::endl; return 1; } ofs << base_client; ofs.close(); // Ecrire la base std::cout << base_client; // Faire une requête std::cout << "chercher les dupond..." << std::endl; try{ const std::set<client_t *> & clients_dupond = base_client.chercher_nom("dupond"); std::set<client_t *>::const_iterator sit (clients_dupond.begin()), send(clients_dupond.end()); for(;sit!=send;++sit) std::cout << **sit << std::endl; }catch(...){ std::cout << "client non trouvé" << std::endl; } std::cout << "suppression du client c1 : " << c1 << std::endl; base_client.del_client(c1); std::cout << base_client; return 0; }
ce qui donne :
dupond | jean | 69 rue de la gaité | 75014 | paris | 1969 | 2008 dupond | pierre | 1 rue de quai | 69699 | groville | 1969 | 2008 nom | prenom | rue | 75000 | ville | 1900 | 2000 chercher les dupond... dupond | jean | 69 rue de la gaité | 75014 | paris | 1969 | 2008 dupond | pierre | 1 rue de quai | 69699 | groville | 1969 | 2008 suppression du client c1 : nom | prenom | rue | 75000 | ville | 1900 | 2000 dupond | jean | 69 rue de la gaité | 75014 | paris | 1969 | 2008 dupond | pierre | 1 rue de quai | 69699 | groville | 1969 | 2008
Bonne chance
je ne comprends pas ce que tu veux faire, pour moi add() n'a pas de sens avec une telle classe.
Tu ne voudrai pas plutôt parler de set() ?
par contre, del, je ne voi pas du tout l'utilité.
Ce que je ferai :
Tu ne voudrai pas plutôt parler de set() ?
par contre, del, je ne voi pas du tout l'utilité.
Ce que je ferai :
void CLIENT::set() { printf("Nom ? "); scanf("%s",nom); printf("Prénom ? "); scanf("%s",prenom); //getchar(); printf("Adresse ? "); scanf("%s",adresse); getchar(); printf("Code postal ? "); scanf("%s",cp); printf("Ville ? "); scanf("%s",ville); printf("Année d'entrée dans l'entreprise ? "); scanf("%u",annee_enree); printf("Année de sortie de l'entreprise ? "); scanf("%u",annee_sorti); }
Non je cherche par la procedure add : ajouter un client qui irait s'inscrire dans un fichier texte
et par del : supprimer un client qui irait se supprimer du fichier texte
et par del : supprimer un client qui irait se supprimer du fichier texte
ok. Donc, ce n'est pas la bonne méthode que tu emploies. Il faut faire le set (demande des information à l'utilisateur) en dehors du add. Pour le del, il faut ouvrir le fichier, tout stocker en mémoire, repérer la portion de texte à surpprimer, puis remplacer le fichier original.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
n'a tu pas un site qui me montre l'exemple, je ne connais pas du tout....
non, je n'ai pas ça sous la main. dsl.
à mon avis, tu devrais revoir la conception de ton programme. Je trouve bizarre que la méthode d'une classe sache aller se supprimer dans une liste d'objet. Il serait à mon avis plus logique de surcharger les opérateurs << et >>, et de mettre les méthodes del et add dans ce qui gère la liste de client. exemple :
à mon avis, tu devrais revoir la conception de ton programme. Je trouve bizarre que la méthode d'une classe sache aller se supprimer dans une liste d'objet. Il serait à mon avis plus logique de surcharger les opérateurs << et >>, et de mettre les méthodes del et add dans ce qui gère la liste de client. exemple :
class listPersonne { std::vector<Personne*> ls; public: void add() { Client*C=new Client; c->set();// là tu demande le nom etc. ls.push_back(c);// tu ajoute un client // code de sauvegarde sur le fichier } void del() { // chargement du fichier // suppresion de la fiche soiuhaité et sauvegarde } }
Merci mamiemando mais est ce vraiment du c++ ce que vous m'aviez ecrit ? si je me rapelle bien, l'appel de structure c que du C
Bien sûr que c'est du C++ les structures font parties intégrantes du C++.
De manière générale tout ce qui est du C est du C++ mais on ne code pas pareil certaines instructions. Par exemple préfère par exemple utiliser un << à un printf ou un >> à un scanf quand c'est possible.
Ici on est d'autant plus en C++ :
- qu'on utilise des containers de la STL (std::set, std::map...)
- qu'on définit des opérateurs (<<)
- qu'on utilise des flux (std::ostream) et des références (&).
De plus contrairement aux structures du C tu noteras qu'on peut définir un constructeur.
Si tu es convaincue, peut-on considérer que ton problème est résolu ?
De manière générale tout ce qui est du C est du C++ mais on ne code pas pareil certaines instructions. Par exemple préfère par exemple utiliser un << à un printf ou un >> à un scanf quand c'est possible.
Ici on est d'autant plus en C++ :
- qu'on utilise des containers de la STL (std::set, std::map...)
- qu'on définit des opérateurs (<<)
- qu'on utilise des flux (std::ostream) et des références (&).
De plus contrairement aux structures du C tu noteras qu'on peut définir un constructeur.
Si tu es convaincue, peut-on considérer que ton problème est résolu ?
Le probleme c'est que c'est une application queje dois presenter a un examen et ils m'ont demander de faire cela avec des classes ! peux tu m'aider a le faire avec des classes comme j'ai fais a la base, bien entendu je changerais print ff par<< etc...
#include <iostream>
#include <string>
class PERSONNE
{
protected:
std::string adresse;
std::string cp;
std::string ville;
int annee_entree;
int annee_sortie;
public:
void afficher();
void add();
void del();
};
class CLIENT :public PERSONNE
{
private:
std::string nom;
std::string prenom;
public:
CLIENT();
CLIENT(const std::string& _nom, const std::string& prenom ,const std::string & add,const std::string& _cp,const std::string& _ville,int _entree, int _sortie)
{
nom= _nom;
prenom= _prenom;
adresse=_add;
cp=_cp;
ville=_ville;
annee_entree=_entree;
annee_sortie=_sortie;
}
void afficher();
void add();
void del();
};
#include "classes.h"
CLIENT::CLIENT():PERSONNE()
{}
void CLIENT::afficher()
{
//nom|prenom|adresse|cp|ville|année entre| année sortis
using namespace std;
cout << prenom << adresse << cp << ville << annee_entree << annee_sortie << endl;
}
void CLIENT::add()
{ }
void CLIENT::del()
{}
#include <iostream>
#include <string>
class PERSONNE
{
protected:
std::string adresse;
std::string cp;
std::string ville;
int annee_entree;
int annee_sortie;
public:
void afficher();
void add();
void del();
};
class CLIENT :public PERSONNE
{
private:
std::string nom;
std::string prenom;
public:
CLIENT();
CLIENT(const std::string& _nom, const std::string& prenom ,const std::string & add,const std::string& _cp,const std::string& _ville,int _entree, int _sortie)
{
nom= _nom;
prenom= _prenom;
adresse=_add;
cp=_cp;
ville=_ville;
annee_entree=_entree;
annee_sortie=_sortie;
}
void afficher();
void add();
void del();
};
#include "classes.h"
CLIENT::CLIENT():PERSONNE()
{}
void CLIENT::afficher()
{
//nom|prenom|adresse|cp|ville|année entre| année sortis
using namespace std;
cout << prenom << adresse << cp << ville << annee_entree << annee_sortie << endl;
}
void CLIENT::add()
{ }
void CLIENT::del()
{}
Je pense que tu peux le faire seul.
En fait la SEULE différence entre class et struct, c'est que par défaut les membres de la premières sont privés alors que ceux de la deuxième sont public.
Si tu veux modifier class en struc, il suffit de remplacer :
struct{
par :
class{
public:
Bon, ensuite tu peux être plus malin et choisir comme il se doit les membres privés des membres public.
En fait la SEULE différence entre class et struct, c'est que par défaut les membres de la premières sont privés alors que ceux de la deuxième sont public.
Si tu veux modifier class en struc, il suffit de remplacer :
struct{
par :
class{
public:
Bon, ensuite tu peux être plus malin et choisir comme il se doit les membres privés des membres public.
Je ne comrpend pas comment écrire dans un fichier texte
je souhaite faire la fonction add qui permettra d'aller inscrire les données du client dans un fichier texte
je souhaite faire la fonction add qui permettra d'aller inscrire les données du client dans un fichier texte
const char *filename = "plop.txt";
std::ofstream ofs(filename);
if (!ofs){
std::cerr << "impossible d'ouvrir " << filename << std::endl;
return 1;
}
ofs << base_client;
->comme dirai mamiemando !
std::ofstream ofs(filename);
if (!ofs){
std::cerr << "impossible d'ouvrir " << filename << std::endl;
return 1;
}
ofs << base_client;
->comme dirai mamiemando !
ca marche pas...que faut il mettre dans le main?
void CLIENT::add()
{
const char *filename = "listeclients.txt";
std::ofstream ofs(filename);
if (!ofs){
std::cerr << "impossible d'ouvrir " << filename << std::endl;
}
void CLIENT::add()
{
const char *filename = "listeclients.txt";
std::ofstream ofs(filename);
if (!ofs){
std::cerr << "impossible d'ouvrir " << filename << std::endl;
}
Mamiemando s'est donnée la peine d'écrire une solution assez complete, le plus simple serait de prendre ce qu'elle a fait comme base.
Sachant qu'il est stupide d'ecrire directement dans un fichier depuis client, relit posément tout ce qui a été dit et fait dans ce sujet.
Sachant qu'il est stupide d'ecrire directement dans un fichier depuis client, relit posément tout ce qui a été dit et fait dans ce sujet.