Gestionnaire de Permutation

Fermé
MonCplusplus Messages postés 21 Date d'inscription lundi 23 avril 2018 Statut Membre Dernière intervention 9 mars 2019 - 13 oct. 2018 à 17:09
MonCplusplus Messages postés 21 Date d'inscription lundi 23 avril 2018 Statut Membre Dernière intervention 9 mars 2019 - 17 oct. 2018 à 19:56
Bonjour je suis sur un mini programme traite un gestionnaire de permutation . Cependant J'ai également un doute sur l'une de mes méthodes ( void reinitiliser()), cette méthode consiste a re-initialisé mon tableau au valeur introduite au début de programme pour lequel j'essaie d'effectuer des permutation . Ex: valeur introduite au début de programme : 86145 . je choisis par exemple une permutation symétrique donc mon tableau deviendra 54168 le soucis c'est que si je souhaite continuer mon programme et désire faire une permutation cyclique de 1 par la gauche mon programme le fera sur mon tableau modifier c'est à dire sur les valeurs(54168) et non pas sur les valeurs introduites dés le départ ,(86145). donc pour pallier a sa j'ai cree un second tableau (temporaire) qui consiste a conserver les valeurs introduites au départs . Avez-vous des suggestions à faire afin d'y remédier a ce problème ou même améliorer mon programme dans son ensemble ? .
Merci d'avance !.

Voici mon code :


#include <iostream>
using namespace std;

void checkSaisie(int &dim);
void remplir(int *tab2,int *tab,int dim);
void afficher(const int *tab,int dim);
void permute(int &a , int &b);
void permuteGauche(int *tab, int dim);
void permuteDroite(int *tab, int dim);
void permuSym(int *tab, int dim);
void Menu(int *tab2,int *tab, int dim);
void reinitialiser(int *tab2,int *tab,int dim);

int main(){
int tab[20],tab2[20],dim,nb;
Menu(tab2,tab,dim);
return 0;
}

void permuSym(int *tab, int dim){
int i,cpt = 0;
for(i = (dim-1); i > cpt; i--){
permute(tab[i],tab[cpt]);
cpt++;
}
}

void permuteGauche(int *tab, int dim){
int i,cpt = 0;
for(i = (dim-1); i > cpt; i--){
permute(tab[i],tab[cpt]);
}
}

void permuteDroite(int *tab, int dim){
int i,cpt = dim-1;
for(i = 0; i < cpt; i++){
permute(tab[i],tab[cpt]);
}
}

void permute(int &a , int &b){
int temp;
temp = a;
a = b;
b = temp;
}

void checkSaisie(int &dim){
while(dim < 1 || dim >20){
cout << "Entre 1 et 20 svp: " << endl;
cin >> dim;
}
}

void remplir(int *tab2,int *tab,int dim){
int i;
for(i = 0; i < dim; i++){
cin >> tab[i];
tab2[i] = tab[i];
}
}

void reinitialiser(int *tab2,int *tab,int dim){
int i;
for(i = 0; i < dim; i++){
tab[i] = tab2[i]; // re-initialise mon tableau au valeurs introduite au départ
}
}

void afficher(const int *tab,int dim){
int i;
for(i = 0; i < dim; i++){
cout << tab[i] << " "; 
}
}

void Menu(int *tab2,int *tab, int dim){
char car = '1';
cout << "Entrer le nombre d element de votre tableau (20 max) : " << endl;
cin >> dim;
checkSaisie(dim);
remplir(tab2,tab,dim);
cout << "Tableau avant permutation : ";
afficher(tab,dim);
while(car >= '1' && car <= '3'){
cout << "\nGestion des Permutations " << endl;
cout << "************************ " << endl;
cout << "(1) Permutation Symetrique " << endl;
cout << "(2) Permutation de 1 vers la gauche " << endl;
cout << "(3) Permutation de 1 vers la droite " << endl;
cout << "(Q) Quitter " << endl;
cout << "Entrer votre choix : " << endl;
cin >> car;
switch(car){

case '1' : cout << "Tableau apres permutation : ";
           permuSym(tab,dim);
           afficher(tab,dim);
           break;
case '2' : cout << "Tableau apres permutation : ";
           permuteGauche(tab,dim);
           afficher(tab,dim);
           break;

case '3' : cout << "Tableau apres permutation : ";
           permuteDroite(tab,dim);
           afficher(tab,dim);
           break;

case 'Q' : cout << "Merci Aurevoir ";
           break;

}
reinitialiser(tab2,tab,dim);
}
}

A voir également:

1 réponse

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
17 oct. 2018 à 10:17
Salut MonCplusplus,

Si tu utilises les tableaux du C (ton code est du C à l'exception des cout et cin et du compilateur C++ que tu utilises probablement), le tableau d'origine est modifié car en C le passage d'un tableau à une fonction se fait toujours par son pointeur.

Donc ta solution de conserver une copie du tableau d'origine et de recopier les données dans le tableau de traitement est légitime.

Le seul moyen d'éviter cela (que je connaisse en C) est d'encapsuler le tableau dans une struct et de passer la struct par valeur à la fonction. C'est assez peu orthodoxe, et je ne suis pas sûr qu'il faille encourager cette pratique, mais cela devrait marcher. Le C opérera alors une copie du contenu de la struct, sur laquelle tu pourras travailler dans le cadre de ta fonction sans affecter la struct d'origine.

Si tu fais cela, outre les complications que cela ajoute, cela signifie aussi que l'affichage doit se faire à l'intérieur de chaque fonction, car le résultat des traitements de permutations est perdu dès que tu quittes la fonction.

Dal
0
MonCplusplus Messages postés 21 Date d'inscription lundi 23 avril 2018 Statut Membre Dernière intervention 9 mars 2019
17 oct. 2018 à 19:56
Salut Dal ,

Merci beaucoup pour ta remarque très pertinente . Certes l'utilisation des pointeurs implique que mon code soit plus en C soit qu'en c++ . Ce que je voudrais savoir C'est dans l'ensemble de mon programme est-ce qu'il y'a des choses que je pourrais amélioré ou éviter de faire ? a savoir concernant l'utilisation de mes paramètre , mes méthodes ... ?

Merci à toi .
0