programme c moyenne variance
Répondre à la discussion
Affichage des résultats 1 à 14 sur 14

programme c moyenne variance



  1. #1
    invite81027df7

    programme c moyenne variance


    ------

    Bonsoir,

    Je souhaite calculer la moyenne et la variance d'un tableau, ci-dessous le code que j'ai réalisé mais lors de l'execution une moyenne et une variance de 0 sont toujours renvoyées et je n'arrive absolument pas à voir ce qui est incorrect.

    Merci d'avance pour vos réponses.


    Code:
    /* calcul de moyenne et variance d'un tableau que l'on rentre de facon interactive*/
    
    #include<stdio.h>
    #include<math.h>	
    #include<stdlib.h>
    
    main()
    {
    
    /*Declarations de variables*/
    	int i;
    	int N=5;
    	int k;
    	double s;
    	double s2;
        double *tab;
    	double moyenne;
    	double variance;
    	double *tab1;
        tab1=malloc(N*sizeof(double));
    	tab=malloc(N*sizeof(double));
    
    /* Instructions*/
    
    	printf("entrez la longueur du tableau\n");
        scanf_s("%d",&N);
    
    
    	for(i=0;i<N;i++)
    	{
        tab[i]=0;
    	printf("entrez le %d ieme element du tableau\n",i+1);
        scanf_s("%lf",&tab[i]);
        }
    
     
     s=0.0;
     for(k=0;k<N;k++)
     {
       s=s+tab[k];
     }
       moyenne=s/N;
     
    
    printf("moyenne : %lf\n",&moyenne);
    
    	for(i=0;i<N;i++)
    	{
    		tab1[i]=tab[i]*tab[i];
    	}
    
    	
      s2=0.0;
      for(k=0;k<N;k++)
      {
      s2=s2+tab1[k];
      }
       variance = s2/N-moyenne*moyenne;
    
     printf("variance : %lf\n",&variance);
    	}

    -----
    Dernière modification par JPL ; 17/09/2011 à 00h45. Motif: Ajout de la balise Code pour la lisibilité

  2. #2
    invite4492c379

    Re : programme c moyenne variance

    Citation Envoyé par quantum-optic Voir le message
    Bonsoir,

    Je souhaite calculer la moyenne et la variance d'un tableau, ci-dessous le code que j'ai réalisé mais lors de l'execution une moyenne et une variance de 0 sont toujours renvoyées et je n'arrive absolument pas à voir ce qui est incorrect.

    Merci d'avance pour vos réponses.


    Code:
    /* calcul de moyenne et variance d'un tableau que l'on rentre de facon interactive*/
    
    #include<stdio.h>
    #include<math.h>    
    #include<stdlib.h>
    
    main()
    {
    
    /*Declarations de variables*/
        int i;
        int N=5;
        int k;
        double s;
        double s2;
        double *tab;
        double moyenne;
        double variance;
        double *tab1;
        tab1=malloc(N*sizeof(double));
        tab=malloc(N*sizeof(double));
    
    /* Instructions*/
    
        printf("entrez la longueur du tableau\n");
        scanf_s("%d",&N);
    
    
        for(i=0;i<N;i++)
        {
        tab[i]=0;
        printf("entrez le %d ieme element du tableau\n",i+1);
        scanf_s("%lf",&tab[i]);
        }
    
     
     s=0.0;
     for(k=0;k<N;k++)
     {
       s=s+tab[k];
     }
       moyenne=s/N;
     
    
    printf("moyenne : %lf\n",&moyenne);
    
        for(i=0;i<N;i++)
        {
            tab1[i]=tab[i]*tab[i];
        }
    
        
      s2=0.0;
      for(k=0;k<N;k++)
      {
      s2=s2+tab1[k];
      }
       variance = s2/N-moyenne*moyenne;
    
     printf("variance : %lf\n",&variance);
        }
    Hello,

    Quel compilateur utilises-tu ? Sur quelle architecture ?
    N'as-tu pas de warnings à la compilation ?

    Sinon remarques générales:

    Tu initialises la longueur de ton tableau (N) à 5 puis tu alloues 2 tableaux en mémoire de cette taille, ensuite tu demandes la taille des tableaux, que se passe-t-il si un user entre 12 par exemple ?
    À quoi sert le & devant les variables ? Quand l'utiliser ?

    Disposes-tu d'un debugger ?

  3. #3
    invite81027df7

    Re : programme c moyenne variance

    J'utilise Visual C++2010 Express, je n'ai pas de warnings lors de la compilation, pour le & je sais pas c'est une ancienne habitude (je viens de me remettre la programmation aprés un long moment sans pratique) et pour le N initialisé à 5, ça n'a aucune importance non (?) puisque aprés je le modifis à ma convenance.

  4. #4
    invite4492c379

    Re : programme c moyenne variance

    Citation Envoyé par quantum-optic Voir le message
    J'utilise Visual C++2010 Express, je n'ai pas de warnings lors de la compilation, pour le & je sais pas c'est une ancienne habitude (je viens de me remettre la programmation aprés un long moment sans pratique) et pour le N initialisé à 5, ça n'a aucune importance non (?) puisque aprés je le modifis à ma convenance.
    Bon alors le & avant une variable signifie que tu vas manipuler un pointeur par exemple :

    int i=12;
    printf("%d",i); // va afficher la valeur de la variable i, càd 12
    printf("%d",&i) ; // va afficher la valeur da la position mémoire de la variable i et pas du tout son contenu

    Il faudrait relire un chapitre sur les variables, les pointeurs et leur arithmétique.

    En ce qui concerne le malloc, si c'est très important ... Tu alloues deux tableaux de 5 cases :

    Code:
    (...)
        int N=5;
    (...)
        tab1=malloc(N*sizeof(double)); // tab1 est un tableau de 5 double
        tab=malloc(N*sizeof(double)); // idem pour tab
    (...)
    /* Instructions*/
    
        printf("entrez la longueur du tableau\n"); // si tu modifies N ici, tu ne modifieras pas la longueur de tab ou tab1 qui resteront des tableaux de 5 double
        scanf_s("%d",&N); // Si tu rentres un nombre > 5 ici tu t'exposes à des problèmes par la suite
        for(i=0;i<N;i++)
        {
        tab[i]=0; // Dès que i==5 ton programme pourra (et aura certainement) avoir des comportements bizarres
        printf("entrez le %d ieme element du tableau\n",i+1);
        scanf_s("%lf",&tab[i]);
        }
    (...)
    Il est fréquent pour les IDEs d'exécuter les prog en mode Debug, il arrive même que ton programme ne bugue pas ainsi, mais l'exécutable que tu génères plante constament ... les allocations mémoires sont délicates en C et il faut de la rigueur ...

    Si tu te remets à la programmation et que tu n'as pas programmé depuis longtemps je te conseille de :

    1. Relire un bouquin (ou wiki ou ...) sur C, rapidement et picorer au besoin par la suite
    2. Ne pas hésiter à abuser du F1 (accès à l'aide intégrée)
    3. Bien vérifier les warnings, sur mon PC avec gcc j'ai les deux warnings suivants avec ton code :
    Code:
    ctest2.c: In function ‘main’:
    ctest2.c:45:1: warning: format ‘%lf’ expects type ‘double’, but argument 2 has type ‘double *’
    ctest2.c:60:2: warning: format ‘%lf’ expects type ‘double’, but argument 2 has type ‘double *’
    Les lignes concernées sont :

    Code:
    45: printf("moyenne : %lf\n",&moyenne);
    60: printf("variance : %lf\n",&variance);


    4. Envisager éventuellement à passer au C# ou à Java ... tu n'auras plus vraiment de problèmes concernant l'allocation de mémoire ; il ne faut pas avoir peur du terme objet ... et leur syntaxe dérive du C ; si tu développes sous windows je te conseille C#.

  5. A voir en vidéo sur Futura
  6. #5
    invite81027df7

    Re : programme c moyenne variance

    Ok, merci pour tous ces commentaires, oui effectivement & donne l'adresse. Comment s'affranchir du probléme posé par l'affectation d'une valeur à la variable N, si je souhaite garder l'intercation avec l'user "entrer la dimension du tableau" ?

  7. #6
    invite4492c379

    Re : programme c moyenne variance

    Citation Envoyé par quantum-optic Voir le message
    Ok, merci pour tous ces commentaires, oui effectivement & donne l'adresse. Comment s'affranchir du probléme posé par l'affectation d'une valeur à la variable N, si je souhaite garder l'intercation avec l'user "entrer la dimension du tableau" ?

    Ben tout simplement en allouant la mémoire après avoir demandé à l'utilisateur la taille souhaitée :

    Code:
    int N=0;
    
    while (N<1)
    {
        printf("Nombre d'éléments :");
        scanf("%d", &N);
        // En fait pour être un peu plus complet, il faudrait saisir une chaine que l'on essaierait par la suite de parser pour y trouver un entier ...
    }
    double* tab = (double *) malloc( N * sizeof(double) );

  8. #7
    invite1c6b0acc

    Re : programme c moyenne variance

    Bonjour,
    On est en C, pas C++, donc la déclaration de tab doit rester ou elle était (en début de fonction) et l'allocation après le choix de N
    Citation Envoyé par photon57 Voir le message
    Ben tout simplement en allouant la mémoire après avoir demandé à l'utilisateur la taille souhaitée :

    Code:
    int N=0;
    double* tab = 0;
    
    while (N<1)
    {
        printf("Nombre d'éléments :");
        scanf("%d", &N);
        // En fait pour être un peu plus complet, il faudrait saisir une chaine que l'on essaierait par la suite de parser pour y trouver un entier ...
    }
    tab = (double *) malloc( N * sizeof(double) );
    Edit: c'est pas très malin : j'ai modifié le code à l'intérieur de la citation de quantum-optic faite par photon57

  9. #8
    polo974

    Re : programme c moyenne variance

    Comme d'hab, les frères ennemis scanf et printf ont encore frappés avec l'aide du copié/collé...


    Le scanf doit pouvoir accéder à la variable pour la modifier, c'est pour cela qu'on lui donne l'adresse.
    Le printf a juste besoin de la valeur pour l'imprimer,
    d'où la guerre du & déclenchée par le copié/collé...
    Jusqu'ici tout va bien...

  10. #9
    invite81027df7

    Re : programme c moyenne variance

    Bon ben finallement en plaçant seulement le & dans le scanf et pas dans le printf, ce qui est en fin de compte logique d'aprés leurs actions ... et en initialisant le N à 0, ça marche trés bien. Merci pour vos conseils.

  11. #10
    invite4492c379

    Re : programme c moyenne variance

    Bon courage

  12. #11
    invite81027df7

    Re : programme c moyenne variance

    Bonsoir,

    Aprés avoir programmé pas mal de fonctions, j'essaye avec un exemple de faire appel à une fonction toute simple :

    Code:
    #include<stdio.h>    
    #include<stdlib.h>
    void dbl_arr_show(double tab[],int dim);
    
    main()
    {
        double tab2[5]={-2,3.6, 0, 12, -5.63};
    
        dbl_arr_show(tab2,5);
    
    }
    
    
    void dbl_arr_show(double tab[],int dim)
    {
        int i;
    
        for (i=0;i<dim;i++)
        {
            printf("%lf\t",tab[i]);
        }
        return;
    }
    Mais l'erreur suivante m'est renvoyée :

    Erreur 1 error C2084: la fonction 'void dbl_arr_show(double *,int)' a déjà un corps

    1 ) D'où vient ce probléme ?

    2) Ensuite comment structurer le programme suivant (voir ci dessous) pour qu'il marche sachant que je fais appel au sein de main() à une fonction qui elle même fait appel à une autre fonction. D'aprés ce que je me souviens il faudrait faire une déclaration du type #include<***.h> en en-tête de la fonction principale, *** contenant les deux fonctions aux qu'elles je fais appel dans main(), quelqu'un peut-il me le confirmer ?

    Code:
    #include"arrays.h"
    #include<stdio.h>
    #include<math.h>    
    #include<stdlib.h>
    void arr_mult(double tab[],int dim,double val);
    void dbl_arr_show(double tab[],int dim);
    
    main()
    {
        double tab2[5]={-2,3.6, 0, 12, -5.63};
    
        arr_mult(tab2,5,2);
    }
    
    arr_mult(double tab[],int dim,double val)
    {
        int i;
        double *tab1;
        tab1=(double*) malloc(dim*sizeof(double) );
    
        for (i=0;i<dim;i++)
        {
            tab1[i]=val*tab[i];
        }
        dbl_arr_show(tab1,dim);
    }
    
    dbl_arr_show(double tab[],int dim)
    {
        int i;
    
        for (i=0;i<dim;i++)
        {
            printf("%lf\t",tab[i]);
        }
    }
    Une autre question :
    J'ai pas mal d'expérience avec Matlab et j'ai tendance à vouloir reproduire certaines choses en c que j'ai oublié avec ce précédent language, comme l'obtention d'arguments en sortie d'une fonction. La forme generale pour le debut d'une fonction est : type nomfonction(type arg1,...) , mais si ma fonction prend en argument un tableau , que celui ci subit une transformation qui me redonne un tableau en sortie, est ce que la fonction me ressort automatique le nouveau tableau ? Dois-je mettre : return tab1; à la fin de celle ci, où tab1 est le nouveau tableau ? Quand dois je mettre simplement void en type pour la fonction et un return(0) en fin de fonction, qu'elle en sera la sortie ?
    Merci d'avance pour vos réponses.

    N.B : Qu'elles sont les balises pour obtenir un code lisible dans mes messages sur le forum ?
    Dernière modification par Jack ; 18/09/2011 à 14h50.

  13. #12
    invite4492c379

    Re : programme c moyenne variance

    Citation Envoyé par quantum-optic Voir le message
    Bonsoir,


    (...)


    Une autre question :
    J'ai pas mal d'expérience avec Matlab et j'ai tendance à vouloir reproduire certaines choses en c que j'ai oublié avec ce précédent language, comme l'obtention d'arguments en sortie d'une fonction. La forme generale pour le debut d'une fonction est : type nomfonction(type arg1,...) , mais si ma fonction prend en argument un tableau , que celui ci subit une transformation qui me redonne un tableau en sortie, est ce que la fonction me ressort automatique le nouveau tableau ? Dois-je mettre : return tab1; à la fin de celle ci, où tab1 est le nouveau tableau ? Quand dois je mettre simplement void en type pour la fonction et un return(0) en fin de fonction, qu'elle en sera la sortie ?
    Merci d'avance pour vos réponses.

    N.B : Qu'elles sont les balises pour obtenir un code lisible dans mes messages sur le forum ?
    Bon, quelles ont été tes lectures ? as-tu essayé le wikilivre sur C ?
    Regardes-y la différence entre déclarer une fonction et définir une fonction

    p
    our rappel rapide, tout est fonction en c. Une fonction avec un type de retour void est assimilé à une procédure. Une fonction qui a un type de retour précis doit pour tous les chemins d'exécution se terminer par un return adéquat (bon type de retour).
    LEs paramètres de fonctions ne peuvent être modifiés, heureusement tu passe un pointeur, le pointeur ne sera pas modifiable mais (sans indications contraires) le contenu pointé pourra l'être. Je te conseillerais de te replonger dans les pointeurs et leur arithmétique.

    Tu peux trouver pleins de tuto et des exos corrigés pour apprendre le C, en googlant rapidement je suis tombé sur http://www.exercicegratuit.com/langage-c/ , mais je ne sais pas trop ce que ça vaut. Si ça te dit j'essayerais de trouver quelquechose de vraiment intéressant.

    Pour insérer du code ici, il suffit d'utiliser les balises BB [ code ].

  14. #13
    invite81027df7

    Re : programme c moyenne variance

    J'avais dejà lu "Le langage C" de Brian W et Dennis.M de chez Masson.

    Bon je vais aller relire un peu tout ça. Ne t'embête pas à chercher des exos, à part si tu connais un super cours en pdf vraiment bien trés complet là je serais preneur

  15. #14
    Jack
    Modérateur

    Re : programme c moyenne variance

    N.B : Qu'elles sont les balises pour obtenir un code lisible dans mes messages sur le forum ?
    En appelant le mode avancé de l'éditeur tu trouveras l'icône qui va bien.

    Sinon, à la main, en mettant les balises code et /code (encadrée par des crochets).
    Je vais les ajouter dans ton message précédent.

    A+

Discussions similaires

  1. Moyenne ? Médiane ? ou Moyenne géométrique ?
    Par invite12cad8f0 dans le forum Mathématiques du supérieur
    Réponses: 3
    Dernier message: 10/12/2010, 19h28
  2. Réponses: 4
    Dernier message: 07/11/2010, 15h20
  3. Moyenne et variance
    Par invite13b154dd dans le forum Mathématiques du supérieur
    Réponses: 0
    Dernier message: 17/05/2010, 19h11
  4. Réponses: 7
    Dernier message: 25/12/2009, 16h58
  5. Moyenne, variance, écart type
    Par invitecd03f8f9 dans le forum Mathématiques du collège et du lycée
    Réponses: 3
    Dernier message: 29/05/2007, 11h47