Multiplication de 2 vecteurs vers marices C++

Résolu
cadet1401 Messages postés 11 Date d'inscription dimanche 23 mars 2008 Statut Membre Dernière intervention 28 mars 2008 - 23 mars 2008 à 16:03
cadet1401 Messages postés 11 Date d'inscription dimanche 23 mars 2008 Statut Membre Dernière intervention 28 mars 2008 - 24 mars 2008 à 16:36
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

cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
23 mars 2008 à 17:51
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
3
cadet1401 Messages postés 11 Date d'inscription dimanche 23 mars 2008 Statut Membre Dernière intervention 28 mars 2008
23 mars 2008 à 18:07
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
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
23 mars 2008 à 18:17
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
0
cadet1401 Messages postés 11 Date d'inscription dimanche 23 mars 2008 Statut Membre Dernière intervention 28 mars 2008
23 mars 2008 à 18:28
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
23 mars 2008 à 18:35
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
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
24 mars 2008 à 11:10
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
0
cadet1401 Messages postés 11 Date d'inscription dimanche 23 mars 2008 Statut Membre Dernière intervention 28 mars 2008
24 mars 2008 à 16:36
ah bien merci, je ne m'en etait pas rendu compte non plus.
merci bien

KD
0
Rejoignez-nous