Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

Répondre

Veuillez composer votre message et l'envoyer
Nom (obligatoire)

E-mail (obligatoire)

Message (obligatoire)

Programme anti-spam : Afin de lutter contre le spam, nous vous demandons de bien vouloir répondre à la question suivante. Après inscription sur le site, vous n'aurez plus à répondre à ces questions.

Quel est le résultat de l'opération suivante (donner le résultat en chiffres)?
quatre-vingt dix-huit moins vingt huit
Système anti-bot

Faites glisser le curseur de gauche à droite pour activer le bouton de confirmation.

Attention : Vous devez activer Javascript dans votre navigateur pour utiliser le système anti-bot.

Retour

Résumé de la discussion (messages les plus récents en premier)

ngatilio
05-05-2012 13:45:13

C'est bien beau les codes mais faut gérer:
-->   la saisie (vous pouvez utiliser les MoveTo (j+x.pos(),i+y.pos()));
-->   gérer les erreurs . vous pouvez créer un classe  ErreurMatrice
//ou le constructeur  sera :

ErreurMatrice::ErreurMatrice(Int i)
{
   Switch(i)
    {
  Case 0 :  const char* message0 ="Ecrire le message d'erreur ici ";
              printf("%s",message);
             Break;
  Case 1: instructions 2;
             Break;
  etc...
    }

Int main()
{
if( booleen)
   {intructions;}
Else  Throw ErreurMatrice(0);

etc...
}

//pour gerer les erreurs( de taille , de mauvaise saisie , d'un caractere non reconnu etc...)
juste pour ameliorer vos codes
@++

mseeker
09-12-2011 21:49:36

Bonsoir,

Une proposition pour éviter l'imbrication de boucles :


int x = 1,y=1,r=1;
int z=0;
while (x <= l1){
        if(y<=c1){
                z+=M1[x][y]*M2[y][r];
                y++;
        }
        else {
                y=1;
                cout << z << " ";
                z=0;
                if(r==c2){
                        cout << endl;
                        r=1;
                        x++;
                }
                else
                        r++;
        }
}
 

(pas à l'abri d'une erreur)

C'est pas tellement plus élégant mais le principe est utile lorsqu'on travaille sur un certain nombre de dimensions.

Remarques :
En vérifiant que le produit matriciel est bien défini tu pourrais éviter de demander à la fois le nombre de colonnes de M1 et le nombre de lignes de M2, tout en t'assurant que le produit a un sens.

Pour la multiplication de grandes matrices il existe l'aglorithme de Strassen qui est bien plus efficace.

Je ne me suis pas mis à jour niveau C++, mais le type vector de la STL existait déjà avant C++11.

Golgup
10-11-2011 20:46:25

Hello!

Pour changer voici un petit programme qui calcul le produit de deux matrices:

L'interface peut etre ameliorée mais je ne connais pas encore assez c++ pour l'instant.  Enfet on pouvait rendre beucoup plus simple le programme en utilisant les nouveaux tableaux <array> ou meme <vector> de c++11 (2011), mais d'une part beaucoup de gens n'y sont pas habitués et en plus, je retrouvais plein d'erreurs. Du coup je me retrouve avec trois "for" imbriqués. Pas facile de faire sans utiliser de definition!


#include <iostream>
using namespace std;

int main()
{
    int c1;
    int l2;
    int l1;
    int c2;
    do {
        cout << "Quel nombre de lignes de matrice 1 ?: " ;
        cin >> l1;
        cout << "Quel nombre de colones de matrice 1 ?: " ;
        cin >> c1;
        cout << "Quel nombre de lignes de matrice 2 ?: " ;
        cin >> l2;
        cout << "Quel nombre de colones de matrice 2 ?: ";
        cin >> c2;
    } while ( l2 != c1 );
   
   
double M1[l1][c1];
double M2[l2][c2];

cout << "" << endl;
cout << " MATRICE 1 " << endl;
cout << "" << endl;

for (int i(1) ; i <= l1 ; ++i){
    for (int j(1) ; j <= c1 ; ++j){
        cout << "M1[" << i << "," << j << "]=";
        cin >> M1[i][j];
       
    }
}
cout << "--------------------" << endl;

cout << "" << endl;
cout << " MATRICE 2 " << endl;
cout << "" << endl;


for (int k(1) ; k <= l2 ; ++k){
    for (int l(1) ; l <= c2 ; ++l){
        cout << "M2[" << k << "," << l << "]=";
        cin >> M2[k][l];
       
    }
}
cout << "" << endl;
cout << "RESULTAT : " << endl;
cout << "--------------------" << endl;

for ( int x(1) ; x<=l1 ; ++x){
    for (int r(1) ; r<=c2 ; ++r){
        int z(0);
        for (int y(1) ; y<=c1 ; ++y){
            z=z+M1[x][y]*M2[y][r];
            }
            cout << z << " ";
            if (r==c2){
                cout << "" << endl;
            }
               
        }
    }
return 0;
}
 


ps: Python est quand meme beaucoup plus agréable et facile!

Pied de page des forums