IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Tableaux] Calcul d'une moyenne à partir d'un tableau


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Par défaut [Tableaux] Calcul d'une moyenne à partir d'un tableau
    Bonjour,
    j'ai créé une base de donnée contenant 2 tableau concernant des étudiant,
    le premier contient:
    identifiant, prénom, nom, date de naissance, promotion
    le deuxieme:
    identifiant, identifiant des matieres, notes examens, notes TP.

    J'envoi cette requete à la base de donnée:
    $Requete="SELECT nom,prenom,noteE,noteTP FROM etudiant NATURAL JOIN note WHERE promo='$PROMOTION' ORDER BY nom, prenom";
    puis a l'aide de mysql_fetch_array je demande le resultat sous forme de tableau.

    Je voudrais maintenant, pour un meme nom et prenom, calculer la moyenne d'un etudiant d'une promotion precise.

    J'arrive parfaitement a afficher les eleves d'une promotion mais je ne vois pas comment faire "l'algorithme" qui permet de parcourir les notes de chaque lignes et les additionner entre elle.

    J'ai essayé plusieurs algorithme mais la plupart du temps ils ne me calculait la moyenne que de la premiere ligne de chaque nom de la base de donnee.

    Voici le dernier algorithme que j'ai créé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    while($Donnee=mysql_fetch_array($Reponse))
    {
        if ($Donnee[0].$Donnee[1]==$temp)
        {
              if ($Donnee[2].$Donnee[3]==$temp2)
              {
    	 $somme1=$somme1+$Donnee[2];
    	 $somme2=$somme2+$Donnee[3];
    	 $n++;
                }
               else
               {	
    	 $temp2=$Donnee[2].$Donnee[3];
                }
    	$moyenne=(3*($somme1/$n)+($somme2/$n))/4;
    	 echo $nom, " ", $prenom, " ",$moyenne, "<br />";
         }
         else
         {
            $temp=$Donnee[0].$Donnee[1];
         }
    }
    Mais un message d'erreur me dit que je tente de diviser par zéro.

    Je suis un peu perdu et j'espère que vous ne le serez pas et que je me suis convenablement expliqué.

    Merci de votre aide !!

  2. #2
    Membre émérite Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Par défaut
    N'ayant pas tout compris, je te propose cette syntaxe :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    while($Donnee = mysql_fetch_array($Reponse))
    {
    	$nom = $Donnee[0];
    	$prenom = $Donnee[1];
     
    	if ($nom.$prenom == $temp)
    	{	
    		if ($Donnee[2].$Donnee[3] != $temp2)
    		{
    			$moyenne=(3*($somme1/$n)+($somme2/$n))/4;
    			$temp2 = $Donnee[2].$Donnee[3];
    			$n = 0;
    			$somme1 = 0;
    			$somme2 = 0;
    		}
     
    		$somme1 = $somme1+$Donnee[2];
    		$somme2 = $somme2+$Donnee[3];
    		$n++;
     
    		echo $nom, " ", $prenom, " ",$moyenne, "<br />";
    	}
    	else
    	{
    		$temp = $nom.$prenom;
    		$moyenne = 0;
    	}
    }

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Par défaut
    J'ai testé le code proposé mais cela ne marche pas, je te remerci de me l'avoir proposé.
    Il me renvoi les erreurs suivantes:
    Notice: Undefined variable: somme1 in c:\program files\easyphp1-8\www\selection_promo.php on line 65

    Notice: Undefined variable: n in c:\program files\easyphp1-8\www\selection_promo.php on line 65

    Warning: Division by zero in c:\program files\easyphp1-8\www\selection_promo.php on line 65

    Notice: Undefined variable: somme2 in c:\program files\easyphp1-8\www\selection_promo.php on line 65

    Notice: Undefined variable: n in c:\program files\easyphp1-8\www\selection_promo.php on line 65

    Warning: Division by zero in c:\program files\easyphp1-8\www\selection_promo.php on line 65
    nom1 prenom1 0
    nom1 prenom1 11.25
    nom2 prenom2 10
    nom2 prenom2 0
    nom3 prenom3 14.25
    nom3 prenom3 12
    Je pense que cela viens du fait que les variables ne sont pas définies avant la premiere entrée dans la boucle if.

    De plus je vais tenter de m'expliquer un peu mieux sur ce que je désire:

    J'envois ce code à la base de donnée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                    $Requete="SELECT nom,prenom,noteE,noteTP FROM etudiant NATURAL JOIN note WHERE promo='$PROMOTION' ORDER BY nom, prenom";
                    $Reponse=mysql_query($Requete);
     
                    $Donnee=mysql_fetch_array($Reponse);
    Celui ci me permet d'obtenir dans la variable $Donnee, le nom, prénom, la note d'examen ainsi que la note de TP des élèves. Tout cela classé par Nom et prénom. (Dans ma base de donnée pour le moment je possède 3 lignes pour chaque élève dans ce tableau, donc ceci:
    Nom1 // Prenom1 // noteE1 // NoteTP1
    Nom1 // Prenom1 // noteE2 // NoteTP2
    Nom1 // Prenom1 // noteE3 // NoteTP3

    Nom2 // Prenom2 // noteE1 // NoteTP1
    Nom2 // Prenom2 // noteE2 // NoteTP2
    Nom2 // Prenom2 // noteE3 // NoteTP3

    Nom3 // Prenom3 // noteE1 // NoteTP1
    Nom3 // Prenom3 // noteE2 // NoteTP2
    Nom3 // Prenom3 // noteE3 // NoteTP3)

    Je veux donc, par ce calcul: [(moyenneNoteE*3)+(moyenneNoteTP)]/(4*nbredematières)

    Calculer et afficher la moyennede chaque élève.
    Ce qui me pose problème est donc l'algorithme de lecture du tableau qui me permettrait de calculer en premier lieu la somme des noteE et note TP pour chaque élève.

    Pour vous aider ou pas je vous met le code que j'ai pour le moment:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
           $Requete="SELECT nom,prenom,noteE,noteTP FROM etudiant NATURAL JOIN note WHERE promo='$PROMOTION' ORDER BY nom, prenom";
           $Reponse=mysql_query($Requete);
     
           $Donnee=mysql_fetch_array($Reponse);
           $temp=$Donnee[0].$Donnee[1];
           $temp2=$Donnee[2].$Donnee[3];
     
    	while($Donnee = mysql_fetch_array($Reponse))
                {
                   $nom = $Donnee[0];
                   $prenom = $Donnee[1];
     
                      if ($nom.$prenom == $temp)
                      {	
                         if ($Donnee[2].$Donnee[3] != $temp2)
                         {
                               $moyenne=(3*($somme1)+($somme2))/(4*n);
                               $temp2 = $Donnee[2].$Donnee[3];
                               $n = 0;
                               $somme1 = 0;
                               $somme2 = 0;
                         }
     
                         $somme1 = $somme1+$Donnee[2];
                         $somme2 = $somme2+$Donnee[3];
                         $n++;
     
                         echo $nom, " ", $prenom, " ",$moyenne, "<br />";
                      }
                     else
                     {
                         $temp = $nom.$prenom;
                         $moyenne = 0;
                    }
                 }

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 59
    Par défaut
    Je connais pas natural join et tout ton code me parait ahurissant!
    Peut etre une solution avec mon regard de novice:

    On a donc l id de la personne qu'on étudie
    sa promotion en sa on en a pas besoin (on a son id)

    Sur la deuxième table tu fais un select de totue les notes avec cet id
    ensuite tu fais la moyenne sur ces notes et c'est bon.

    Ensuite si tu veux boucler ca sur tout les étudiants, tu rajoute autour une boucle sur tout les id existant.

    Dis moi si cette idée est adaptée et te plait?

  5. #5
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Bonjour

    Autant l'avouer tout de suite : je n'ai rien compris à ton algoritme de calcul En revanche, je crois avoir compris ce que tu veux faire.
    Donc, ce que je propose, c'est mon propre algoritme dont le point principal est : laissons mysql faire les sommes, ça nous fera gagner du temps

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // la requete retourne les sommes des notes et le nombre de matieres pour chaque etudiant
    $rq="SELECT nom, prenom, SUM(noteE) AS sommeE, SUM(noteTP) AS sommeTP, COUNT(id_matiere) AS nb_matiere
    	FROM etudiant NATURAL JOIN note
    	WHERE promo='$promotion'
    	GROUP BY id
    	ORDER BY nom,prenom";
     
    $result=mysql_query($rq) or die(mysql_error());
     
    // pour chaque resultat, c'est a dire chaque etudiant
    while($donnee=mysql_fetch_array($result)){
      // on recupere les nom et prenom
    	$nom=$donnee['nom'];
    	$prenom=$donne['prenom'];
      // on calcule la moyenne
    	$moyenne= (3*$donnee['sommeE'] + $donnee['sommeTP']) / (4*$donnee['nb_matiere']);
      // et on affiche le tout
    	echo $nom, " ", $prenom, " ",$moyenne, "<br />";
    }
    En espérant que je ne me sois pas plantée dans la syntaxe
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Par défaut
    Merci pour toutes vos réponses !
    Mais je connais déja la requête qui permet de laisser mysql faire le calcul et ca prend 4 ligne. Le problème c'est que mon prof veut que nous fassions tous les calculs avec php et non directement par le serveur de BDD...

    Mais bon il nous donnera bien la solution un jour

    Merci de votre aide a tous !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WebI Xi3] Calcul d'une moyenne à partir d'une information de type nombre
    Par debdev dans le forum Débuter
    Réponses: 0
    Dernier message: 13/08/2014, 10h02
  2. Calculer une moyenne à partir de plusieurs facteurs
    Par clairemoro87 dans le forum R
    Réponses: 3
    Dernier message: 27/04/2014, 14h42
  3. Réponses: 8
    Dernier message: 20/03/2012, 15h43
  4. requete sql : calcul d'une moyenne
    Par timide94 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 16/01/2007, 19h12
  5. Réponses: 14
    Dernier message: 09/01/2007, 16h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo