Calcul de la norme d'un vecteur généré de façon aléatoire en langage C

Calcul de la norme d'un vecteur généré de façon aléatoire en langage C - C - Programmation

Marsh Posté le 25-04-2012 à 14:57:10    

Bonjour à tous,  
J'écris un petit programme qui doit générer un vecteur de façon aléatoire et renvoyer sa norme. J'arrive pas à le compiler. Pouvez-vous SVP y jeter un coup d'oeil et m'aider à la faire fonctionner?
 

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4. void RempliVect(int *V);
  5. float norme(int V[]);
  6. int main ()
  7. {
  8. float norm;
  9.   int dim=4, vect1;
  10.   int vect[dim];
  11.   RempliVect(vect1);
  12.   norm=norme(vect1);
  13. }
  14. void RempliVect(int *V) //remplit le vecteur de façon aléatoire
  15. {
  16.   int j,dim;
  17.   srand(time(NULL));// initialisation de la fonction rand
  18.   for (j=0;j<dim;j++)
  19.     {
  20.        V[j] = rand();
  21.        printf("%d\t",V[j]);
  22.        printf("\n" );
  23.     }
  24. }
  25. float norme(int V[])
  26. {
  27.   int i,dim1;
  28.   float Norm;
  29.   float N=0;
  30.     for (i = 0 ; i < dim1 ; i++)
  31.     {
  32.       N = V[i] * V[i] + N;
  33.     }
  34.   Norm= sqrt(N);
  35.   printf("la norme au carré est: %f et la norme est :%f\n",N,Norm);
  36.   return Norm;
  37. }

Message cité 1 fois
Message édité par gilou le 25-04-2012 à 15:03:45
Reply

Marsh Posté le 25-04-2012 à 14:57:10   

Reply

Marsh Posté le 25-04-2012 à 15:12:42    

olgha a écrit :

Bonjour à tous,  
J'écris un petit programme qui doit générer un vecteur de façon aléatoire et renvoyer sa norme. J'arrive pas à le compiler. Pouvez-vous SVP y jeter un coup d'oeil et m'aider à la faire fonctionner?
 

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4. void RempliVect(int *V);
  5. float norme(int V[]);
  6. int main ()
  7. {
  8. float norm;
  9.   int dim=4, vect1;
  10.   int vect[dim];
  11.   RempliVect(vect1);
  12.   norm=norme(vect1);
  13. }
  14. void RempliVect(int *V) //remplit le vecteur de façon aléatoire
  15. {
  16.   int j,dim;
  17.   srand(time(NULL));// initialisation de la fonction rand
  18.   for (j=0;j<dim;j++) // dim pas initialisé -> aléatoire
  19.     {
  20.        V[j] = rand();
  21.        printf("%d\t",V[j]);
  22.        printf("\n" );
  23.     }
  24. }
  25. float norme(int V[])
  26. {
  27.   int i,dim1;
  28.   float Norm;
  29.   float N=0;
  30.     for (i = 0 ; i < dim1 ; i++) // dim1 pas initialisé -> valeur aléatoire
  31.     {
  32.       N = V[i] * V[i] + N;
  33.     }
  34.   Norm= sqrt(N);
  35.   printf("la norme au carré est: %f et la norme est :%f\n",N,Norm);
  36.   return Norm;
  37. }



 
Sinon quand on dit qu'on arrive pas à compiler, la moindre des choses pour aider les autres c'est de copier coller les erreurs que te sort le compilateur.
 
Enfin pour t'aider tu devrais passer la dimension du vecteur dans les paramètres de tes fonctions:  
void rempliVect(int *v, int dimension);
float norme(int *v, int dimension);


---------------
Seul Google le sait...
Reply

Marsh Posté le 25-04-2012 à 15:24:02    

Voici le code corrigé ainsi que les erreurs affichés:
 
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
void RempliVect(int *V, int dim);
float norme(int V[], int dim1);
int main ()
{
float norm;
  int dimension=4, vect1;
  int vect[dimension];
  RempliVect(vect1, int dimension);
  norm=norme(vect1, int dimension);
}
 
void RempliVect(int *V, int dim) //remplit le vecteur de façon aléatoire
{
  int j,dim;
  srand(time(NULL));// initialisation de la fonction rand
  for (j=0;j<dim;j++)
    {
       V[j] = rand();
       printf("%d\t",V[j]);
       printf("\n" );
    }
}
float norme(int V[], int dim1)
{
  int i;
  float Norm;
 
  float N=0;
 
    for (i = 0 ; i < dim1 ; i++)
    {
      N = V[i] * V[i] + N;
    }
  Norm= sqrt(N);
  printf("la norme au carré est: %f et la norme est :%f\n",N,Norm);
  return Norm;
}
 
Erreur affiché:
fonction.c: In function 'main':
fonction.c:24:3: warning: passing argument 1 of 'norme' makes pointer from integer without a cast
fonction.c:10:7: note: expected 'int *' but argument is of type 'int'

Reply

Marsh Posté le 25-04-2012 à 15:33:29    

Ben oui, vu que manifestement, c'est
int dimension=4;  
int vect1[dimension];  
ce que tu veux faire.
 
Bref quelque chose comme ceci (en modifiant vite fait ton code):

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <math.h>
  5. void RempliVect(int V[], int dim);
  6. float norme(int V[], int dim);
  7. int main() {
  8.     float norm;
  9.     int dim = 4;
  10.     int vect[dim];
  11.     // initialisation de la fonction rand
  12.     srand(time(NULL));
  13.     RempliVect(vect, dim);
  14.     norm = norme(vect, dim);
  15. }
  16. //remplit le vecteur de façon aléatoire
  17. void RempliVect(int V[], int dim) {
  18.     int j;
  19.     for (j = 0; j < dim; ++j) {
  20.         V[j] = rand();
  21.         printf("%d\t", V[j]);
  22.     }
  23.     printf("\n" );
  24. }
  25. float norme(int V[], int dim) {
  26.     int i;
  27.     float Norm, N = 0;
  28.     for (i = 0 ; i < dim; ++i) {
  29.         N += V[i] * V[i];
  30.     }
  31.     Norm = sqrt(N);
  32.     printf("la norme au carre est: %f et la norme est : %f\n", N, Norm);
  33.     return Norm;
  34. }


A+,


Message édité par gilou le 25-04-2012 à 15:34:42

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 25-04-2012 à 15:45:29    

le code fonctionne. Je vous remercie pour votre aide

Reply

Marsh Posté le 25-04-2012 à 18:26:36    

tiens, tant que j'y suis, la même chose en C++ moderne:

Code :
  1. #include <cstdlib>
  2. #include <ctime>
  3. #include <cmath>
  4. #include <iostream>
  5. #include <array>
  6. using namespace std;
  7. int main() {
  8.     const auto dimension = 4;
  9.     array<int, dimension> vecteur;
  10.     // initialisation
  11.     srand(time(NULL));
  12.     for (auto it = vecteur.begin(); it != vecteur.end(); ++it) *it = rand(); // rand()%201 - 100; serait aléatoire entre -100 et +100
  13.     // calcul du carré de la norme
  14.     int somme = 0;
  15.     for (auto it = vecteur.begin(); it != vecteur.end(); ++it) somme += *it * *it;
  16.     // impression des valeurs
  17.     std::cout << "vecteur: [";
  18.     for (auto& x : vecteur) std::cout << " " << x;
  19.     std::cout << " ]" << std::endl;
  20.     std::cout << "norme: " << sqrt(somme) << std::endl;
  21.     return 0;
  22. }


A+,

Message cité 1 fois
Message édité par gilou le 25-04-2012 à 18:37:00

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 29-04-2012 à 00:36:01    

breizhbugs a écrit :


 
Sinon quand on dit qu'on arrive pas à compiler, la moindre des choses pour aider les autres c'est de copier coller les erreurs que te sort le compilateur.
 
Enfin pour t'aider tu devrais passer la dimension du vecteur dans les paramètres de tes fonctions:  
void rempliVect(int *v, int dimension);
float norme(int *v, int dimension);


Bonjour tout le monde
moi j'ai un problème avec c++. Au fait le truc c'est que je viens juste de commencer la programmation et je ne maitrise pas les boucles if, for, while,..
j'ai vraiment besoin d'aide et je compte sur tout le monde.
merci d'avance

Reply

Marsh Posté le 29-04-2012 à 02:35:14    

if n'est pas une boucle, c'est une condition, par exemple :

Code :
  1. int main()
  2. {
  3. int a = 17;
  4. if (a==17)
  5.   cout<<"C'est 17!\n";
  6. else
  7.   cout<<"C'est pas 17!"\n";
  8. }
 

Lors de l'exécution de ce code, on créé une variable 'a', qui aura pour valeur initiale 17.
Ensuite, on teste si a est égale à 17, dans ce cas on affiche "C'est 17!" sur la console, sinon on affiche "C'est pas 17!";

 

La boucle "while" permet d'exécuter des instructions en boucle tant qu'une condition est vraie :

Code :
  1. int main()
  2. {
  3. int a=0;
  4. while (a!=5)
  5. {
  6.     cout<<"Pas 5 : "<<a<<'\n';
  7.     a = a+1;
  8. }
  9. }
 


Dans ce code, on créé une variable a qui est à 0, ensuite tant qu'elle n'est pas à 5, on affiche "Pas 5 : " suivit de la valeur de a, puis on l'incrémente de '1'.
en gros, ça va afficher ça sur ta console :

 

Pas 5 : 0
Pas 5 : 1
Pas 5 : 2
Pas 5 : 3
Pas 5 : 4

 

La boucle for est un peu plus complexe, le schéma est comme ça :

 

for ( initialisation ; vérification; truc à faire)

 

ça peut être vu comme ça en pseudo-code :

 

initialisation;
tant que (vérification est faux) faire
 truc à faire
fin tant que

 

En général, tu vas t'en servir avec des int incrémentés/décrémentés :

 
Code :
  1. int main()
  2. {
  3.   for (int i=0;i<8;i++)
  4.   {
  5.    cout<<i<<'\n';
  6.   }
  7. }
 

ce qui affichera à l'écran les valeurs de i :

 

0
1
2
3
4
5
6
7

 

C'est équivalant à ça :

 
Code :
  1. int main()
  2. {
  3. int i=0;
  4. while(i<8)
  5. {
  6.   cout<<i<<'\n';
  7.   i = i+1;
  8. }
  9. }
 

La boucle fort permet de parcourir des tableaux, le 'i' étant utilisé comme index, et plein d'autre trucs.


Message édité par Terminapor le 29-04-2012 à 02:36:01

---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 30-04-2012 à 10:30:43    

Salut  à tous. J'ai écris une fonction qui transforme une matrice en vecteur ci-dessous. J'ai 0 erreur, 0 warning et pourtant j'ai aucun résultat. Quand je compile j'ai:  
 
stagiaire@amaltee /mnt/manille/sdb2/stages/stagiaire $ gcc func1.c -o func1.out
stagiaire@amaltee /mnt/manille/sdb2/stages/stagiaire $ ./func1.out
 Matrice ==> Vecteur  
 
 m_in[0][0] = 0  
 m_in[0][1] = 1  
 m_in[1][0] = 10  
 m_in[1][1] = 11  
 m_in[2][0] = 20  
 m_in[2][1] = 21  
 m_in[3][0] = 30  
 m_in[3][1] = 31  
  On fait les verifications :  pour m_in  : 0x602010  
 pour *m_in : 0x602040  
 pour v_out : 0x602040  
 OK pour les adresses  
 
 v_out[0] = 0  
 v_out[1] = 1  
 v_out[2] = 10  
 v_out[3] = 11  
 v_out[4] = 20  
 v_out[5] = 21  
 v_out[6] = 30  
 v_out[7] = 31  
 OK aussi pour les valeurs  
 
Segmentation fault
 
 
"Le Code"
[/cpp]
#include <stdio.h>// pour les printf et puts
#include <stdlib.h>// pour les malloc et free
//#include <time.h>
//#include <math.h>
typedef double TYPE ;
typedef TYPE *VECTOR ;
typedef TYPE **MATRIX ;
// transformation d'une matrice en vecteur
double fmv(int dim1, int dim2);
int main()
{
int const dimens1 = 4 , dimens2= 2 ;// on définit les dimensions de la matrice.
int dimens= dimens1*dimens2;
 
MATRIX mat_in;// matrice de départ
VECTOR vect_out; //double *vect_out ;
int i, j;
//int i, j; // les indices des boucles.
 
*vect_out = fmv(dimens1, dimens2);// incompatible types when assigning to type 'double *' from type 'double'
return 0;
}
 
double fmv(int dim1, int dim2)
{
int i, j;
int dim = dim1*dim2;
VECTOR v_out;// vecteur à réccupérer
MATRIX m_in;// matrice de depart
puts ( " Matrice ==> Vecteur \n" ) ;
// on va créer une matrice et la remplir par des valeurs reconnaissables
m_in = (MATRIX) malloc( dim1 * sizeof(VECTOR) );
   if ( NULL == m_in )
   return EXIT_FAILURE ;
*m_in = (VECTOR) malloc(dim * sizeof(TYPE));
   if ( NULL == *m_in )
   return EXIT_FAILURE ;
   /*indique que les autres pointeurs de lignes csorrespondent au début des autres lignes de la matrice*/
   for ( i = 1 ; i < dim1 ; ++i )
   m_in[i] = m_in[i-1] + dim2 ;
 
   for ( i = 0 ; i < dim1 ; ++i)
   {
      for (j = 0 ; j < dim2 ; ++j)
 
      m_in[i][j] = (TYPE)(10*i+j);
   }
 
 
       for ( i = 0 ; i < dim1 ; ++i)
        {
            for ( j = 0 ; j < dim2 ; ++j )
            printf( " m_in[%d][%d] = %g \n" , i, j, (double)m_in[i][j] ) ;
        }
printf(" " ) ;
 
 
   v_out = *m_in ; // là le vecteur v_out est équivalent à la matrice m_in
   //debut des verifications
 
   printf( " On fait les verifications : " ) ;
   printf( " pour m_in  : %p \n", m_in  ) ;
   printf( " pour *m_in : %p \n", *m_in ) ;
   printf( " pour v_out : %p \n", v_out ) ;
   puts ( " OK pour les adresses \n" );
   for ( i = 0 ; i < dim ; ++i )
      printf( " v_out[%d] = %g \n" , i, (double)v_out[i] );
   puts ( " OK aussi pour les valeurs \n" ) ;
   // fin des verifications
 
free( *m_in ) ;
free( m_in ) ;
return 0;
}
 
[/cpp]
 
Je vous prie de bien vouloir m'aider à détecter mes erreurs,parce qu'il y a segmntation default qui revient à chaque fois. Cordialement,


Message édité par olgha le 30-04-2012 à 15:25:03
Reply

Marsh Posté le 30-04-2012 à 11:38:29    

gilou a écrit :

tiens, tant que j'y suis, la même chose en C++ moderne:

Code :
  1. #include <cstdlib>
  2. #include <ctime>
  3. #include <cmath>
  4. #include <iostream>
  5. #include <array>
  6. using namespace std;
  7. int main() {
  8.     const auto dimension = 4;
  9.     array<int, dimension> vecteur;
  10.     // initialisation
  11.     srand(time(NULL));
  12.     for (auto it = vecteur.begin(); it != vecteur.end(); ++it) *it = rand(); // rand()%201 - 100; serait aléatoire entre -100 et +100
  13.     // calcul du carré de la norme
  14.     int somme = 0;
  15.     for (auto it = vecteur.begin(); it != vecteur.end(); ++it) somme += *it * *it;
  16.     // impression des valeurs
  17.     std::cout << "vecteur: [";
  18.     for (auto& x : vecteur) std::cout << " " << x;
  19.     std::cout << " ]" << std::endl;
  20.     std::cout << "norme: " << sqrt(somme) << std::endl;
  21.     return 0;
  22. }


A+,


 

Code :
  1. generate(vecteur.begin(), vecteur.end(), rand);
  2. auto norme = sqrt(std::accumulate(vecteur.begin(), vecteur.end(), 0.0, [](double c, double x) { return c + x*x; }));


J'accumule dans un double, j'aime pas les overflows qui sont souvent generes ici si j'accumule dans un int. On peut aussi utiliser
 

Code :
  1. std::copy(vecteur.begin(), vecteur.end(), std::ostream_iterator<int>(std::cout, " " ));


 
mais le format de sortie est different.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 30-04-2012 à 11:38:29   

Reply

Marsh Posté le 30-04-2012 à 13:42:04    

Merci, :) je suis toujours preneur de code qui m'en apprends plus sur le C++ moderne (langage que je n'utilise pas de manière fréquente).
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 30-04-2012 à 13:47:55    

gilou a écrit :

Merci, :) je suis toujours preneur de code qui m'en apprends plus sur le C++ moderne (langage que je n'utilise pas de manière fréquente).
A+,


 
Si je ne me goure pas, les seules choses de neuves sont l'utilisation d'auto et d'une fonction lambda dans l'appel a accumulate..


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 30-04-2012 à 13:53:40    

Citation :

et d'une fonction lambda dans l'appel a accumulate

:jap:  
Comme je ne programme qu'a l'occasion en C++, j'ai peu l'habitude de ce type de code en C++.
A+,


Message édité par gilou le 30-04-2012 à 13:57:35

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed