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).

#1 23-12-2009 14:16:36

stormin
Membre
Inscription : 03-12-2009
Messages : 124

C++

Bonsoir tout le monde
j ai besoin d'aide pour:
ecrire un progrmme en C++ qui calcul
1_______le produit de ces deux matrices A(N,N) et B(N,N) : C=A*B
2_______ C^k tel que k>0
3_______det C
4_______C^(-1) c à d l'inverse de C
et tout cela en utilisant le principe de fonction pour mettre le tout dans un seul programme
merci d'avance

Hors ligne

#2 26-12-2009 17:17:31

stormin
Membre
Inscription : 03-12-2009
Messages : 124

Re : C++

Bonsoir
Il n y a pas quelqu'un qui peut me donner seulement des idées pour commencer
merci

Hors ligne

#3 26-12-2009 18:59:02

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 947

Re : C++

Bonsoir,


Je ne suis pas chez moi : je rentre demain. Je te  ferai part de quelques idées au moins pour A*B ; pour le reste, j'ai oublié 90% de ce que je savais et je n'ai pas assez de temps ici pour rafraîchir mes souvenirs.
Les pistes seront données en "pseudo-code" : ce sera à toi de t'adapter : je ne connais pas ni le C, ni le C++. Petite question complémentaire : ton programme doit-il effectuer les 4 "opérations" consécutivement ou ou doit-il pouvoir exécuter n'importe laquelle de ces manipulations au choix ?

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#4 27-12-2009 01:00:13

stormin
Membre
Inscription : 03-12-2009
Messages : 124

Re : C++

Merci Yoshi
C est un programme qui doit effectuer les 4 opérations consecutivent apres la saisie des deux matrices A et B
merci

Hors ligne

#5 27-12-2009 17:53:22

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 947

Re : C++

Salut,

Pour le produit de deux matrices carrées (n,n), j'ai fait ça en Python pour vérifier : ça colle.
J'ai utilisé 3 boucles de 0 à n(Python s'arrête donc à l'indice n-1, C++, je ne sais pas...) contrôlées par i,j,k
i et j désignent respectivement la ligne et la colonne de la matrice Mat_A.
Pour chaque ligne i, je parcours 3 fois (indice k) chaque colonne de Mat_B
Le plus simple c'est que je te mette mon code Python (on doit pouvoir faire mieux que ça, mais il fallait que cela restât compréhensible et transposable...)

 
def produit(Mat_A,Mat_B,Mat_C,n):
    Spp,L=0,[]                                 # matrice-ligne et somme des prod partiels : "variables" locales
    for i in range(n):                         # ligne i de la matrice A
        for k in range(n):                      # Répéter 3 fois par ligne
            for j in range(n):                  # colonne j de la matrice A
                Spp+=Mat_A[i][j]*Mat_B[j][k]    # j'additionne tous les produits a_ij*b_jk
            L.append(Spp)                       # J'ajoute tableau_matrice ligne L le nombre Spp
            Spp=0                               # Je réinitialise Spp
        Mat_C.append(L)                         # Je complète la matrice C par les matrices-lignes successives
        L=[]                                    # Je réinitialise à vide la matrice-ligne
    return Mat_C

# Déclarations valables pour tout le programme ('"globales")
Mat_C =[]                                  # Initialisation à vide du tableau Mat_C et du tableau intermédiaire L
Mat_A=[[1,2,3],[4,5,6],[7,8,9]]
Mat_B=[[11,12,13],[14,15,16],[17,18,19]]
n=3

# Appel de la fonction avec passage des paramètres
produit(Mat_A,Mat_B,Mat_C,n)

Fonction + appel de fonction : on s'arrête là

Evidemment, j'ai testé le fonctionnement.
Affichage du contenu de Mat_C:   

>>>
  90   96  102
216  231  246
342  366  390
>>>

J'ai utilisé comme tu le vois des matrices (3,3) pour la mise au point...

Il n'y a pas de tableaux en Python mais des listes, et pour simuler le Mat_A(i,j) d'un tableau, je suis passé par des listes de sous-listes, chaque sous-liste représentant une ligne de ma matrice finale, une matrice uniligne en quelque sorte...
Sauf si j'ai au préalable (en Python !) rempli ma liste Mat_C ainsi : [[0,0,0],[0,0,0],[0,0,0]], je ne peux pas écrire directement dans une liste vide en faisant Mat_C[i][j] = Spp.
Je pense qu'en C++ ce doit être faisable puisque ça l'était dans les BASICs que j'utilisais dans le temps...

C^p avec p>, mais p entier naturel ? Je vais chercher comment on fait "à la main" sans se farcir C*C*C...*C.
Bon c'est faisable, à condition de créer une boucle contrôlée, par ex, par i et de partir de :
* Mat_A=Mat_C, Mat_B = Mat_C pour avoir C^2
* puis pour p >2 passer comme paramètres à la fonction produit Mat_A remplacé par le nouveau Mat_C et Mat_B inchangé.
* Cette boucle appellerait p-1 fois  la fonction produit...
C'est une méthode un peu bourrin, alors je vaiix chercher s'il exite d'autres méthodes plus "subtiles" !

det(C) : Si j'ai su faire ça à la main, alors c'était du temps de mon passage à la Fac, et depuis... pfuittt... évaporé ! Même pas sûr que j'aie jamais su faire ! Enfin, je vais voir ça de plus près : j'ai trouvé (merci WikiPedia) plusieurs méthodes aussi longues l'une que l'autre... Je dois donc creuser davantage.

Inversion de Matrice : ça j'ai su faire !... il y a un certain temps déjà : je dirais même plus : un temps plus certain... Faut aussi que je revoie ça...

Ce soir, je peux plus, après 450 km de route et la tension nerveuse inhérente je suis HS. D'autant que ma fonction produit dont j'étais certain qu'elle allait tourner en deux temps trois mouvements m'a fait tourner en bourrique dans la phase débogage.

Si t'as des infos pour m'aiguiller, je prends, on gagnera du temps...

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#6 28-12-2009 11:29:40

stormin
Membre
Inscription : 03-12-2009
Messages : 124

Re : C++

bonjour
il me reste le determinant
et l'inverse;comment les introduire dans mon programme
remarque:j ai besoin un programme en C++


#include <iostream>
#include <cmath>
using namespace std;

void lecture(int X[][10],int a)
{
int i,j;
for(i=0;i<a;i++)
for(j=0;j<a;j++)
cin>>X[i][j];
}

void produit(int X[][10],int Y[][10],int Z[][10],int n)
{ int i,j,k;

for(i=0;i<n;i++)
for(k=0;k<n;k++)
{ Z[i][k]=0;
for(j=0;j<n;j++)
Z[i][k]= Z[i][k]+X[i][j]*Y[j][k] ;
}
}

void afficher(int X[][10],int a)
{int i,j;
for(i=0;i<a;i++)
{
for(j=0;j<a;j++)
cout<<X[i][j]<<" ";
cout<<endl;
}
}

int main()
{ int n,i,j,k,L;

// int *A,*B,*C;
int A[10][10],B[10][10],C[10][10],Ck[10][10],CB[10][10];
cout<<"donner la taille des matrices"<<endl;
cin>>n;
//A=new int[n][nca];
//B=new int[nlb][ncb];
//C=new int [n][ncb];
cout<<"lecture des elements de la matrice A ligne par ligne"<<endl;
lecture( A,n);
cout<<"lecture des elements de la matrice B ligne par ligne"<<endl;
lecture( B,n);
produit(A,B,C,n);
cout<<"affichage des elements de la matrice A ligne par ligne"<<endl;
afficher( A,n);
cout<<"affichage des elements de la matrice B ligne par ligne"<<endl;
afficher( B,n);
cout<<"affichage des elements de la matrice C ligne par ligne"<<endl;
afficher( C,n);
cout<<"donner la valeur de k pour caculer C^k"<<endl;
cin>>k;

for(i=0;i<n;i++)
for(j=0;j<n;j++)
Ck[i][j]=C[i][j];

for(L=1;L<k;L++)
{produit(C,Ck,CB,n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
Ck[i][j]=CB[i][j];
}

afficher(Ck,n);

system("pause");
return 0;
}

Hors ligne

#7 28-12-2009 11:40:00

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 947

Re : C++

Salut,

Je sais bien que tu as besoin d'un programme en C++, mais moi, je ne connais ni C, ni C++..
Je t'ai fourni un programme, documenté, en Python, parce que la source d'un programme  Python, contrairement à C ou C++ (du moins pour ce que je peux en voir) est directement lisible et compréhensible un non-initié à Python...
La preuve : qu'est-ce que tu as écrit là en C++ ? La retranscription C++ de mon programme Python ? Si oui, est-ce qu'il marche ?
Je vais regarder donc cette histoire de déterminant...

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#8 28-12-2009 12:34:18

stormin
Membre
Inscription : 03-12-2009
Messages : 124

Re : C++

non c est pas la retranscripton de ton programme pytthon,
voila j ai arrivé a faire l inverse de la matrice,
il reste le determinant
merci

Hors ligne

#9 29-04-2011 20:43:54

ngatilio
Membre
Inscription : 18-09-2010
Messages : 14

Re : C++

Malheureusement j ne connais pas bien le C , on va le faire en pascal
Program matrix ;
         Label 1 ;
          Type  tab: array [1..Max,1..Max] of integer ;
                    keypressed : array ['A'..'Z'] of word ;
           uses  crt , Graph ;
           var   Gm , Gd , i , j , k,val : integer ;
                   C , D , E : tab ;
                    Quit : keypressed ;
           procedure  create_Interface ;
           begin
                    clrscr;
                    Gd := detect ;
                    InitGraph (Gm,Gd,'C:\tp\bgi ');
                    if GraphResult <> grOk then
                       begin
                                writeln ('erreur de l''initialisation en mode graphique');
                                halt (1);
                       end;
                       SetFillStyle (1,red);
                       Bar3D (20,30,100,40,20,false);
                       Bar3D(30,50,40,70,10,true);
                       readln;
                       CloseGraph;
          end;
          Procedure Display_Menu;
          begin
                  clrscr;
                  writeln ('choisir l''une des operations suivantes');
                  writeln ('1. produit de matrices');
                  writeln ('2. calcul du Determinant');
                  writeln ('3.Inverse');
                  readln (val);
                  readln;
          end;
          Procedure Submit_Menu;
           function prod_scalaire (A , B : tab ): tab ;
           begin
                           prod_scalaire:= 0;
                       for i:=1 to Max do
                               for j:=1 to Max do     
                                   for k:=1 to Max do   
                                        prod_scalaire:= A[i,k]*B[k,j] ;
           end;
          if (val=1) then
                  begin
                                    writeln ('entrer deux matrices');
                                    readln (C[i,j] , D[i,j]);
                                    E[i,j]:= prod_scalaire (C[i,j] , D[i,j]);
                                    writeln ('la matrice cherche est', E[i,j]);
                                    readln;
                 <b>end</b>;
              {pour calculer C^k utiliser la boucle repeat ----until }
              {pour les determinants , l''inverse utiliser la boucle for}
         procedure exit ;
             begin
                     if  Quit  then
                        begin
                                clrscr;
                                exit;
                                readln;
                        end
                        else goto 1 ;
                        readln;
            end.

Dernière modification par ngatilio (15-05-2011 17:58:15)

Hors ligne

Réponse rapide

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 seize plus soixante neuf
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.

Pied de page des forums