Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3334 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2138999
olgha
Posté le 25-04-2012 à 14:57:10  profilanswer
 

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
mood
Publicité
Posté le 25-04-2012 à 14:57:10  profilanswer
 

n°2139010
breizhbugs
Posté le 25-04-2012 à 15:12:42  profilanswer
 

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...
n°2139014
olgha
Posté le 25-04-2012 à 15:24:02  profilanswer
 

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'

n°2139022
gilou
Modérateur
Modzilla
Posté le 25-04-2012 à 15:33:29  profilanswer
 

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é!  --
n°2139035
olgha
Posté le 25-04-2012 à 15:45:29  profilanswer
 

le code fonctionne. Je vous remercie pour votre aide

n°2139099
gilou
Modérateur
Modzilla
Posté le 25-04-2012 à 18:26:36  profilanswer
 

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é!  --
n°2139671
cool00
se frotter à la connaissance
Posté le 29-04-2012 à 00:36:01  profilanswer
 

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

n°2139675
Terminapor
I'll see you rise.
Posté le 29-04-2012 à 02:35:14  profilanswer
 

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
n°2139736
olgha
Posté le 30-04-2012 à 10:30:43  profilanswer
 

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
n°2139746
Un Program​meur
Posté le 30-04-2012 à 11:38:29  profilanswer
 

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)
mood
Publicité
Posté le 30-04-2012 à 11:38:29  profilanswer
 

n°2139762
gilou
Modérateur
Modzilla
Posté le 30-04-2012 à 13:42:04  profilanswer
 

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é!  --
n°2139763
Un Program​meur
Posté le 30-04-2012 à 13:47:55  profilanswer
 

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)
n°2139765
gilou
Modérateur
Modzilla
Posté le 30-04-2012 à 13:53:40  profilanswer
 

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é!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
Ouvrir un fichier en CLire port série C# et convertir en texte
Le C est-il mieux que le C# ?[C#] Remplacer le symbole € par valeur hexadecimale [Résolu]
pacman en C[C] débutant a=b différent de b=a ?
analyseur lexical en CCompilateur C++ en java
LANCER C++ A PARTIR DE JAVAimpossible de créer un vecteur de 32000 * 32000 short
Plus de sujets relatifs à : Calcul de la norme d'un vecteur généré de façon aléatoire en langage C


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR