Multiplication de 2 vecteurs vers marices C++ [Résolu]

Signaler
Messages postés
11
Date d'inscription
dimanche 23 mars 2008
Statut
Membre
Dernière intervention
28 mars 2008
-
Messages postés
11
Date d'inscription
dimanche 23 mars 2008
Statut
Membre
Dernière intervention
28 mars 2008
-
voila j'essaye de réaliser un programme dans lequel je multiplie 2 vecteurs et dont le resultat doit etre affiché dans une matrice.

voici mon code source .. avec l'erreur bien entendue.
si vous voyez comment remédier a cette erreur , je vous serait tres reconnaissant.

#include
#include <stdlib.h>
void main ()
{
 int i,j,m ,n1=0, n2=0;


 /* on entre le nombre de hauteurs possible et on verifie si le nombre et bien compris entre 3 et 8*/


 cout << "Entrer le nombre de hauteur possible" << endl;
 cin >> n1;
 while  (n1<3 || n1>8)
  {  
  cout << "Entrer le nombre de hauteur possible" << endl;
  cin >> n1;
  }
 cout << "n1 = " << n1<<endl;
  




 /* on entre le nombre de diametre possible et on verifie si le nombre et bien compris entre 2 et 6*/
 cout << "Entrer le nombre de diametre possible" << endl;
 cin >>n2; 
 while (n2<2 || n2>6)
  {  
  cout << "Entrer le nombre de diametre possible" << endl;
  cin >> n2;
  }
 cout << "n2 = " << n2<<endl;




 /* on declare les vecteurs et la matrice */
 int  *H, *D, **V;
 




 /* allocation dynamique de la mémoire car on ne sait pas combien de place prend le vecteur */
 H= (int*) malloc (sizeof (int)*n1);
 D= (int*) malloc (sizeof (int)*n2);
 m=n1*n2; /* n1*n2 pour pas le mettre dans le malloc */


 V= (int **) malloc (sizeof (int*)*m);
 
 


 


 /* on va mettre les hauteurs dans un vecteur qui comporte n1 position */
 cout << "Entrer les valeurs des hauteurs " <<endl;
 for ( i=0; i<n1; i++)
 {
  cin>>H[i];
 }


 


 /* on va mettre les diametres dans un vecteur qui comporte n2 position */
 cout << "Entrer les valeurs des diametres " <<endl;
 for ( j=0; j<n2; j++)
 {
  cin>>D[j];
 }




 /* on va calculer les volumes et les placer dans une matrice */
 for ( i=0; i<n1; i++)
 {
  for ( j=0; j<n2; j++)
  {
      V[i][j]=(H[i])*(D[j]);
  }
 }




 /* on va afficher les elements de la matrice */
 for ( i=0; i<n1; i++)
 {
  for ( j=0; j<n2; j++)
  {
   cout << V[i][j];
  }
 }




  /* on libere l'espece des vecteurs et matrice */
 free (H);
 free (D);
 free (V);
}

Merci Beaucoup.

KD

7 réponses

Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Bonjour,

Il y a un mélange dans ce programme : V est sensé être un pointeur de matrice (pour être utilisé avec des V[i][j]) mais il est dimensionné comme un vecteur (donc utilisé avec des V[k]) ! Voici une rapide réécriture du programme (avec des simplifications) et avec les 2 méthodes d'utilisation de la matrice :

#include
#include
#include <stdlib.h>



void main ()
{
   int i,j,m,n1,n2;






   /* --- Nombre de hauteurs possibles */
   n1 = 0;
   while  (n1<3 || n1>8)
   { 
      cout << "Nombre de hauteurs possibles (3 à 8) : ";
      cin >> n1;
   }
   cout << "n1 = " << n1 << endl << endl;






   /* --- Nombre de diametres possibles */
   n2 = 0;
   while (n2<2 || n2>6)
   { 
      cout << "Nombre de diametres possibles (2 à 6) : ";
      cin >> n2;
   }
   cout << "n2 = " << n2 << endl << endl;






   /* --- Allouer la mémoire pour le vecteur des hauteurs */
   int *H;
   H = (int*)malloc(sizeof(int) * n1);






   /* --- Allouer la mémoire pour le vecteur des diamètres */
   int *D;
   D = (int*)malloc(sizeof(int) * n2);






   /* --- Allouer la mémoire pour la matrice des volumes */
   /* --- Version utilisable avec V1[i][j] */
   int **V1;
   V1 = (int**)malloc(sizeof(int*) * n1); // lignes
   for (i=0 ; i<n1 ; i++)
      V1[i] = (int*)malloc(sizeof(int) * n2); // colonnes / ligne






   /* --- Allouer la mémoire pour la matrice des volumes */
   /* --- Version utilisable avec V1[k] */
   int *V2;
   m = n1 * n2;
   V2 = (int*)malloc(sizeof(int) * m);






   /* --- Saisir les hauteurs */
   for (i=0 ; i<n1 ; i++)
   {
      cout << "Hauteur " << i + 1 << " : ";
      cin >> H[i];
   }
   cout << endl;






   /* --- Saisir les diamètres */
   for (j=0 ; j<n2 ; j++)
   {
      cout << "Diamètre " << j + 1 << " : ";
      cin >> D[j];
   }
   cout << endl;






   /* --- Calcul des volumes dans la matrice */
   for (i=0 ; i<n1 ; i++)
   {
      for (j=0 ; j<n2 ; j++)
      {
         V1[i][j]       = H[i] * D[j];
         V2[i * n1 + j] = H[i] * D[j];
      }
   }






   /* --- Afficher les éléments de la matrice */
   cout << "Volumes avec V[i][j] :" << endl;
   for (i=0 ; i<n1 ; i++)
   {
      for (j=0 ; j<n2 ; j++) cout << setw(3) << V1[i][j] << " ";
      cout << endl;
   }
   cout << endl;



   cout << "Volumes avec V[k] :" << endl;
   for (i=0 ; i<n1 ; i++)
   {
      for (j=0 ; j<n2 ; j++) cout << setw(3) << V2[i * n1 + j] << " ";
      cout << endl;
   }
   cout << endl;






   /* --- Libérer la mémoire allouée */
   free(H);
   free(D);
   free(V1);
   free(V2);
}


Ce qui donne (avec Visual C++ 6.0) :

Nombre de hauteurs possibles (3 à 8) : 4
n1 = 4



Nombre de diametres possibles (2 à 6) : 3
n2 = 3



Hauteur 1 : 10
Hauteur 2 : 11
Hauteur 3 : 12
Hauteur 4 : 13



Diamètre 1 : 4
Diamètre 2 : 5
Diamètre 3 : 6



Volumes avec V[i][j] :
 40  50  60
 44  55  66
 48  60  72
 52  65  78



Volumes avec V[k] :
 40  50  60
 44  55  66
 48  60  72
 52  65  78



Jean-François
Messages postés
11
Date d'inscription
dimanche 23 mars 2008
Statut
Membre
Dernière intervention
28 mars 2008

merci pour cette rapidité jean françois

je viens de regarer le code ...

j'ai juste une partie que je n'arrive pas bien à comprendre.
il s'agit de :

   cout << "Volumes avec V[i][j] :" << endl;
   for (i=0 ; i<n1 ; i++)
   {
      for (j=0 ; j<n2 ; j++) cout << setw(3) << V1[i][j] << " ";
      cout << endl;
   }
   cout << endl;

le setw(3) , il permet de réaliser quoi ?
désolé de  poser une question qui peut etre evidente à vos yeux mais je ne comprend pas trop .
sinon pour l'allocation de memoire , je pense avoir compris
je suis pas encore assez experimenté en c++.
d'avance , merci de  votre aide

KD
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Pas de quoi !

setw() est un manipulateur (avec l'include iomanip.h)  qui permet de fixer la largeur de la sortie sur cout.setw set width fixer largeur.
Ici les nombres seront formatés sur 3 chiffres (pour garder un alignement à la présentation de la matrice).
Voir ici quelques infos sur ces manipulateurs : http://www.ann.jussieu.fr/courscpp/Sections/Sect09-I0.html

Problème de Copier-Coller !!!
Dans le commentaire :


   /* --- Allouer la mémoire pour la matrice des volumes */
   /* --- Version utilisable avec V1[k] */



Il s'agit bien sûr, dans ce cas là, d'un vecteur V2 utilisé comme une pseudo matrice.

Jean-François
Messages postés
11
Date d'inscription
dimanche 23 mars 2008
Statut
Membre
Dernière intervention
28 mars 2008

Ah d'accord , je viens de bidouiller un peu le programme pour regarder à quoi servait cette fonction setw ...
je comprend mieux maintenant , en quelque sorte , il permet d'obtenir une "belle" matrice avec les nombres bien rangé ...
merci beaucoup pour cette aide qui m'a été d'une grande utilitée.

aps facile le c++ , je pense que j'en apprendrais tout les jours.

KD
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Oh que oui ! Il y a tellement de notions différentes ou nouvelles. Ca va faire 20 ans que je le pratique (depuis le premier compilateur C++ sur PC : le Zortech C++ version 1 créé par Bjarne Stroustrup lui-même, inventeur du C++) et j'en apprend encore !

Jean-François
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Je viens de m'apercevoir que j'ai oublié de désallouer les colonnes de V1 à la fin !

for (i=0 ; i<n1 ; ++i) free(V1[i]);
puis
free(V1);

Jean-François
Messages postés
11
Date d'inscription
dimanche 23 mars 2008
Statut
Membre
Dernière intervention
28 mars 2008

ah bien merci, je ne m'en etait pas rendu compte non plus.
merci bien

KD