C++ : Ajout d'une verification dans une fonction ! J'y arrive paaaaaaa - Programmation
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]
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
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.
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.
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 ??
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.
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 ), 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;
}