Tableaux 2D dynamique

Fermé
emilie790 Messages postés 7 Date d'inscription vendredi 15 janvier 2016 Statut Membre Dernière intervention 29 mars 2018 - Modifié par emilie790 le 22/01/2016 à 13:07
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 - 7 févr. 2016 à 21:26
Bonjour,

Voici mon programme :
#include <iostream>
#include <conio.h>
#include <vector>

using namespace std;

void lire_Matrice(vector<vector<int> > &C, int nbL, int nbC)
{
    for(int i=0; i<nbL; i++)
	{
        	vector <int> vecTemp;
		for(int j=0; j<nbC; j++)
        {
            cout << "Case [" << i << "][" << j << "] = " << endl;
            int valeur;
            cin >> valeur;
			vecTemp.push_back(valeur);
        }
		C.push_back(vecTemp);
	}
}

void affichage(vector<vector<int> > C)
{
    for (int i = 0; i < C.size(); i++)
    {
        for (int j = 0; j < C[i].size(); j++)
        {
            cout << "Case [" << i << "][" << j << "] = " << C[i][j] << endl;
        }
    }
}

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

int main()
{
    vector<vector<int> > A;
    vector<vector<int> > B;
    int nbL1, nbC1;
    int nbL2, nbC2;
    int choix = 1;

    while(choix == 1)
    {
    cout << "quelle est le nbr de lignes de la matrtice 1" << endl;
    cin >> nbL1;
    cout << "quelle est le nbr de colonnes de la matrtice 1" << endl;
    cin >> nbC1;
    cout << endl;
    cout << "quelle est le nbr de lignes de la matrtice 2" << endl;
    cin >> nbL2;
    cout << "quelle est le nbr de colonnes de la matrtice 2" << endl;
    cin >> nbC2;
    cout << endl;
        //LECTURE DES DEUX MATRICES
    cout << "Remplissez la matrice 1" << endl;
    lire_Matrice(A, nbL1, nbC1);
       //AFFICHAGE DE LA MATRICE 1
    cout << "Voici la matrice 1 avant la permutation" << endl;
    affichage(A);
    cout << "Remplissez la matrice 2" << endl;
    lire_Matrice(B, nbL2, nbC2);
       //AFFICHAGE DE LA MATRICE 2
    cout << "Voici la matrice 2 avant la permutation" << endl;
    affichage(B);
    //RECHERCHE MIN
    cout << "Salut" << endl;
    int indLmin1 = 10, indCmin1 = 10;
    int indLmin2 = 10, indCmin2= 10;
    int i = 0;
    int j = 0;
    int min1 = A[0][0]; // min1 est le minimum de la matrice 1
    int min2 = B[0][0]; // min1 est le minimum de la matrice 2
    for(i=0; i<A.size(); i++)
    {
        for(j=1; j<A[i].size(); j++)
        {
            if(A[i][i]<A[i][j])
            {
                min1 = A[i][j];
                indLmin1 = i;
                indCmin1 = j;
            }
        }
    }
        cout << indLmin1 << endl;
    //
    int tailleB1 = B.size();
    i = 0;
    j = 0;
    for(i=0; i<tailleB1; i++)
    {
        for(j=1; j<B[i].size(); j++)
        {
            if(B[i][i]<B[i][j])
            {
                min2 = B[i][j];
                indLmin2 = i;
                indCmin2 = j;
            }
        }
    }
    //APPEL DE LA FONCTION "permute"
    cout << "Salut" << endl;
    permute(&A[indLmin1][indCmin1], &B[indLmin2][indCmin2]);
    cout << "Salut" << endl;
    cout << "Voici la matrice 1 apres la permutation" << endl;
    //AFFICHAGE DES DEUX MATRICES
    affichage(A);
    cout << "Voici la matrice 2 apres la permutation" << endl;
    affichage(B);

    cout << "Que voulez-vous faire a present ?" << endl << endl;
    cout << "Pour reinitialiser les matrices Tapez 1" << endl;
    cout << "Pour quitter le programme Tapez 2" << endl;
    cin >> choix;
    while((choix != 1) && (choix != 2))
    {
        cout << "ERREUR, veuillez ne saisie que \"1\" ou bien `\"2\"" << endl;
        cin >> choix;
    }
    }
    return 0;
}


J'ai beau hercher je ne vois pas où peut bien se trouver mon erreur.
A l'exécution j'initialise mes tableaux puis ils s'affichent mais à la permutation il y a un problème.
Le programme est sensé permuter les minimums des deux tableaux.
J'ai voulu faire une fonction qui recherche le minimum mais je débute à peine avec les "vector" donc...
Je sais qu'il y a des lignes que j'aurais dû coder autrement mais bon ce qui m'importe pour le moment c'est que le programme marche
Si quelqu'un a une idée...
Merci d'avance
PS : les "cout << "salut"; c'est pour repérer l'erreur

1 réponse

Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
Modifié par Dalfab le 7/02/2016 à 21:26
Bonjour,

ligne 22 :
void affichage(vector<vector<int> > const& C ) // ne pas passer des 'gros' objets en copie 

ligne 83 :
 for( j = 0 ; j < A[i].size() ; j++ ) //ne pas oublier la première colonne

ligne 85 :
 if ( A[i][j] < min1 ) // élément plus petit que le min

ligne 100:
 for ( j = 0 ; j < B[i].size() ; j++ )

ligne 102:
 if ( B[i][j] < min2 )


Pour permuter des éléments d'une collection, il faut toujours éviter les pointeurs. Cela peut marcher ici mais s'est une très mauvaise habitude car les collections sont sujettes à des réorganisations internes et les pointeurs peuvent être destructeurs.
On peut utiliser les objets prévus pour :
std::swap( A[indLmin1][indCmin1] , B[indLmin2][indCmin2] );

Il est vrai qu'il existe aussi un algorithm qui trouve le min, mais cela détourne peut-être l'objectif de l'exercice ;-)
0