C++ : Ajout d'une verification dans une fonction ! J'y arrive paaaaaaa

C++ : Ajout d'une verification dans une fonction ! J'y arrive paaaaaaa - Programmation

Marsh Posté le 15-06-2001 à 14:55:08    

Voila, il s'agit d'un programme ki gere les emprunts dans un vidéo club (comme ca, ca le fait, mais le prog est a chier :D), enfin bon...
On peut ajouter des titres, mais il peuve avoir le meme numéro ! Je voudrais integrer une fonction dans la méthode ajout() qui verifie si le numéro est déja present, et si c le cas, lui dire de choisir un autre numéro...
VOila la source :
 
// bibliotheque
#include <iostream.h>
#include <string.h>
 
// structure str_film
struct str_film
{
 int id_film;   // numéro du film
 char title_film[25]; // titre du film
};
 
// classe emprunt
class emprunt
{
 str_film tab_film[100]; // tableau de structure des films enregistrés
 int nb_film;    // nombre de films enregistrés
 
public:
 
 emprunt();              // constructeur de la classe
 void affiche(void);            // methode affichage de la liste des films
 void ajout(int ajout_id_film, char ajout_title_film[25]);  // methode d'ajout d'un film
 void supprimer(int del_id_film);        // methode de supression d'un film
 void recherche(int num_film);         // methode de recherche n°1 (par n° film)
 void recherche2(char title[25]);        // methode de recherche n°2 (par titre)
 
};
 
//constructeur de la classe
emprunt::emprunt()
{
 nb_film = 0;
 
 // initialisation du tableau de structure
 for(int i=0 ; i<100 ; i++)
 {
  tab_film[i].id_film = 0;
 }
 
}
 
//affichage de tous les films de la liste
void emprunt::affiche(void)
{
 for(int i=0 ; i<nb_film ; i++)
 {
  cout<<"\nNumero du film: "<<tab_film[i].id_film<<" ";
  cout<<"Titre: "<<tab_film[i].title_film<<"\n";
 }
}
 
//ajout d'un film
void emprunt::ajout(int ajout_id_film, char ajout_title_film[25])
{
 int i=0;
 //comparaison du numero saisi et des numeros de la liste
 for(i=0 ; i<nb_film ; i++)
 {
  if(tab_film[i].id_film > ajout_id_film)
  {
   //on sort de la boucle lorsque le numero saisi est inférieur à au moins un des numeros de la liste
   break;
  }
 }
 //cas où le numero saisi est superieur à tout les numeros de la liste
 if(i == nb_film)
 {
  //insertion du numero et du titre à la dernière position de la liste
  tab_film[i].id_film = ajout_id_film;
  strcpy(tab_film[i].title_film,ajout_title_film);
 }
 else
 {
  //cas où le numero saisi est inferieur à au moins un des numeros de la liste
  for(int j=nb_film ; j>=i ; j--)
  {//décalage
   tab_film[j+1].id_film = tab_film[j].id_film;
   strcpy(tab_film[j+1].title_film,tab_film[j].title_film);
  }
  //ecrasement
  tab_film[i].id_film = ajout_id_film;
  strcpy(tab_film[i].title_film,ajout_title_film);
 }
 nb_film++;
}
 
//suppression d'un film
 void emprunt::supprimer(int del_id_film)
{
 int i=0;
 int k=0;
 
 for(i=0 ; i<=nb_film ; i++)
 {
  //si le numero saisi est dans la liste
  if(tab_film[i].id_film == del_id_film)  
  {
   //décalage
            for(k=(i+1) ; i<=nb_film ; i++)
             {
             tab_film[k-1].id_film = tab_film[k].id_film;
             strcpy(tab_film[k-1].title_film,tab_film[k].title_film);
             }
            //on supprime le dernier film de la liste (dernier film de la liste en double à cause du décalage)
            nb_film--;
   //on sort de la boucle
   break;
         }
 }
 
}
 
//recherche d'un film par le n°film dans la liste
void emprunt::recherche(int num_film)
{
 int test=0;
 
 for(int i=0 ; i<= nb_film ; i++)
 {
  //si le numero saisi est dans la liste
  if(num_film == tab_film[i].id_film)  
  {
   test=1;
   cout<<"\nVoici le titre du film cherche: "<<tab_film[i].title_film<<"\n";
   
  }
 }
 //si le numero saisi n'est pas dans la liste
 if (test==0)
 {
 cout<<"\nLe film n'est pas dans la liste\n";
 }
}
 
//recherche d'un film par le titre dans la liste
void emprunt::recherche2(char title[25])
{
 int test=0;
 for(int i=0 ; i< nb_film ; i++)
 {
  //si le titre saisi est dans la liste
  if(strcmp(tab_film[i].title_film,title) == 0)
  {
   test=1;
   cout<<"\nVoici le numero du film cherche: "<<tab_film[i].id_film<<"\n";
   
  }
 }
 //si le titre saisi n'est pas dans la liste
 if (test==0)
 {
 cout<<"\nLe film n'est pas dans la liste\n";
 }
}
 
 
int main()
{
    //instance de la classe emprunt
    emprunt a;
   
 int choix;
 int numero;
 char titre[25];
 
 do
 {
  //menu
  cout<<"\n1 - Ajout d'un film\n";
  cout<<"2 - Suppression d'un film\n";
  cout<<"3 - Recherche d'un film par numero \n";
  cout<<"4 - Recherche d'un film par titre\n";
  cout<<"5 - Affichage de la liste des films\n";
  cout<<"6 - Quitter\n";
  cout<<"Entrer le chiffre desire : ";
  cin>>choix;
 
  //ajout d'un film
  if (choix == 1)
  {
  cout<<"\nEntrer un numero:";
  cin>>numero;
  cout<<"\nEntrer le titre du film:";
  cin>>titre;
  a.ajout(numero,titre);
  }
   
  //suppression d'un film
  if (choix == 2)
  {
  cout<<"\nEntrer un numero:";
  cin>>numero;
  a.supprimer(numero);
  }
   
  //recherche d'un film par numero
  if (choix == 3)
  {
  cout<<"\nEntrer un numero:";
  cin>>numero;
  a.recherche(numero);
  }
   
  //recherche d'un film par titre
  if (choix == 4)
  {
  cout<<"\nEntrer un titre: ";
  cin>>titre;
  a.recherche2(titre);
  }
 
  //affichage de la liste des films
  if (choix == 5)
  {
  cout<<"\nVoici la liste des films:\n";
  a.affiche();
  }
 
 //quitter le programme  
 }while (choix != 6);
 
 return 0;
}

Reply

Marsh Posté le 15-06-2001 à 14:55:08   

Reply

Marsh Posté le 15-06-2001 à 15:45:08    

:bounce:  :sweat:

Reply

Marsh Posté le 15-06-2001 à 15:51:32    

arf... :)... on va pas tout te faire non plus...

Reply

Marsh Posté le 15-06-2001 à 16:00:36    

et a propos y a une classe de la STL qui te permet de faire le boulot sans forcer... c'est map.
 
#include <map>
map<int,string> films;
 
En gros map<A,B> associe un B a chaque A de maniere unique. A est appelee cle, et B valeur.
 
Dans le cas present, tu peux associer un string (nom du film) a chaque int (film id), de maniere unique. C'est bien ce que tu veux faire non ?
Pour acceder a la valeur b associee a la cle a, pour la map 'tamap', tu fais simplement tamap[a], comme si c'etait un tableau.
 
Du coup ajouter c'est :
 
if (films[film_id]=="" ) // Si aucun film associe
  films[film_id]= nom_du_film;
else
  cout << "Id deja utilisee" << endl;
 
La fonction supprimer c'est :
 
films[film_id]= "";  
 
La fonction recherche par id c'est encore plus simple :
 
return films[film_id];
 
La fonction recherche par nom :
 
for (map<int,string>::const_iterator p= films.begin(); p!= films.end(); p++)
  if (p->second == nom_du_film) return p->first; // retourne l'id
return -1; // film non trouve
 
 
La fonction affichage :
 
for (map<int,string>::const_iterator p= films.begin(); p!= films.end(); p++)
  if (p->second != "" ) // elimine les noms vides
    cout << "Film " << p->first << " : " << p->second << endl;

 

[edit]--Message édité par tgrx--[/edit]

Reply

Marsh Posté le 15-06-2001 à 17:42:15    

tgrx, tu le sais, mais ça vaut la peine de le souligner pour les autres: ta soluce est stable, et si y'a des noms de plus de n caractères, ça plante pas et ça les coupe pas. Il peut y avoir plein de films, et la recherche se fait en temps logarithmique.
 
tgrx->il vaut mieux faire  
if(films.find(film_id)!=films.end())
au lieu de
if (films[film_id]=="" )  
car dans le deuxième cas, tu crées une entrée avec l'utilisation de l'opérateur [] à film_id, alors qu'il n'y a pas de film.
 
La fontion supprimer c'est
fims.erase(film_id);
 
ou films.erase(pos_film)
si t'as récupéré un itérateur avec find.
 
mais bon, c'est du chipotage

Reply

Marsh Posté le 15-06-2001 à 17:45:42    

ouep, mais je voulais pas mettre trop d'iterateurs, parce que c'est un concept un peu chaud au depart je trouve.

Reply

Marsh Posté le 15-06-2001 à 18:03:18    

vrai,
d'ailleurs si tu regardes inifileparser, l'op [] crée une entrée vide à chaque appel.

Reply

Marsh Posté le 15-06-2001 à 18:15:15    

janoscoder> je sais pour le parseur, mais en fait c'est bien pratique, vu que si jamais tu n'as pas de fichier .ini de cree, et bien le parseur te recree tous les champs par defaut (meme s'ils sont vides)... :)
 
Seul probleme : si jamais tu veux mettre des commentaires dans le .ini, le fait de charger/sauvegarder te les fout en l'air.
Peut-etre dans la version 2 ?? :)

Reply

Marsh Posté le 15-06-2001 à 18:28:28    

tiens, jette un oeil à:
http://www.dinkum.com/htm_cpl/valarray.html
c'est cool.
Avec ça tu peut genre accéder aux pixels d'une ligne dans un bitmap, ou accéder à une sous région d'un bitmaps comme si c'était un bitmap, etc...
J'ai pas encore eu le temps de le décortiquer, mais j'ai implémenté des trucs comme ça pour mon prog.
a+
 
pour ce qui est DB ça permet de masquer des valeurs ou de sélectionner par champ.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed