Problème affichage tableau de taille variable

Problème affichage tableau de taille variable - Perl - Programmation

Marsh Posté le 27-10-2012 à 19:57:11    

Bonjour,  
J'ai un problème avec mon programme en langage Perl.
Le but c'est de trouver la moyenne et ecart type de notes.
Enfin, je veux afficher les notes sur la console via un tableau.
C'est là qu'est le problème: quand je fais ma boucle pour afficher le tableau : la console n’affiche que la dernière note plusieurs fois.
Tout le programme marche à part le tableau , donc ligne 5 et ligne 66
Voyez vous où est le problème?
 
Cordialement

Code :
  1. use strict;     
  2. use warnings;
  3. my ($somme_note, $somme_note_carre, $noteMin, $noteMax, $note) = (0, 0, 20, 0);
  4. print "Programme de calcul de la moyenne et ecart type de notes .\n";   
  5. print "\nEntrez le nombre de cours : ";         
  6. my $nombre_cours = <STDIN>;       
  7. for (my $i=1; $i<=$nombre_cours; $i++) 
  8. {
  9. print "\nEntrez les notes : ";
  10. $note = <STDIN>;             
  11. while($note < 0 || $note > 20 )
  12.     {
  13.     print "\nErreur!\nEntrez la note : ";
  14.     $note = <STDIN>;                     
  15.     }                                   
  16.     $somme_note =  $somme_note +  $note;           
  17.     $somme_note_carre =  $somme_note_carre +  $note* $note;             
  18.     if ($note > $noteMax)           
  19.     {
  20.     $noteMax =  $note;
  21.     }
  22.     else
  23.     {
  24.     $noteMax =  $noteMax;
  25.     }
  26.     if ( $note < $noteMin)           
  27.     {
  28.     $noteMin =  $note;
  29.     }
  30.     else
  31.     {
  32.     $noteMin =  $noteMin;
  33.     }
  34. my @tab = $note;
  35.     my $moyenne =  $somme_note / $nombre_cours;         
  36.     my $variance = $somme_note_carre/ $nombre_cours - $moyenne * $moyenne;
  37.     my $ecart_type = sqrt ( $variance);       
  38.     print "\nLa moyenne est : $moyenne \nL'ecart type est : $ecart_type\nNote maximale: $noteMax\nNote minimale: $noteMin\n";
  39.     if ( $moyenne < 10)                         
  40.     {
  41. print "Vous etes ajourne.\n";
  42.     }   
  43.     else                                 
  44.     {
  45. print "Vous etes admis.\n";
  46. }
  47.     if ( $moyenne >= 15)
  48.     {
  49. print "Avec mention tres bien.\n";
  50. }
  51.     if ( $moyenne <= 15 && $moyenne >= 12 )
  52.     {
  53. print "Avec mention bien.\n";
  54. }
  55.    ## print"\nRecapitulatif:\nVoici vos notes dans l'ordre croissant, votre moyenne et votre mediane!\n";
  56.      for ( my$i=1; $i<=$nombre_cours; $i++)
  57.       {
  58.        print"@tab[$i] = $note\n";
  59.       }
  60.  
  61. <>;


Message édité par chupitoman le 27-10-2012 à 21:33:44
Reply

Marsh Posté le 27-10-2012 à 19:57:11   

Reply

Marsh Posté le 28-10-2012 à 00:17:56    

1 - Tu déclares ton tableau à chaque tour de la boucle
2 - Ce n'est pas comme ca qu'on concatène un élément dans un tableau

 

=> Soit tu déclares un tableau de taille fixe après avoir entré le nombre de cours, soit tu déclares un tableau dynamique et tu push() les éléments dedans.

 

3 - Les index d'un tableau en perl commencent à 0, et se terminent à nombre de cours - 1 du coup.

 

J'ai pas regardé tes algos de calcul de note.


Message édité par ccp6128 le 28-10-2012 à 00:18:12
Reply

Marsh Posté le 28-10-2012 à 12:18:32    

Citation :

Soit tu déclares un tableau de taille fixe après avoir entré le nombre de cours

:heink:  
En Perl, il faudra que tu me montres ta notion de tableau de taille fixe. Dans un langage comme le C, C++, etc, je dis pas, mais en Perl, heu...
A+,


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

Marsh Posté le 28-10-2012 à 13:09:16    

gilou a écrit :

Citation :

Soit tu déclares un tableau de taille fixe après avoir entré le nombre de cours

:heink:  
En Perl, il faudra que tu me montres ta notion de tableau de taille fixe. Dans un langage comme le C, C++, etc, je dis pas, mais en Perl, heu...
A+,


 
 
Exact, abus de langage puisque pour émuler le comportement d'un tableau de taille fixe je suis obligé d'encapsuler les ajouts et les suppression d'élements pour garder la taille du tableau fixée.
 
On reformule : tu déclares un tableau de la taille du nombre de notes prédéclaré, et tu le parcours comme s'il s'agissait d'un tableau de taille fixe.

Reply

Marsh Posté le 28-10-2012 à 13:47:19    

Merci tout les 2, ça marche j'ai bien le tableau.
 
Maintenant, je veux extraire la médiane de mes notes.
Pour cela ,je dois trier mon tableau dans l'ordre croissant, puis trouver la médiane (en fonction de nombre_note pair ou impair).
En fait à la base, j'ai un programme en C et je le traduit en perl.
Et ça ne marche pas, pouvez vous me dire mes erreurs? Déjà la fonction ceil en C existe t'elle en Perl? ( ceil permet d'arrondir à la valeur supérieure)
 
J'ai mis en comment ma partie sur médiane et tri de tableau.
 

Code :
  1. use strict;     
  2. use warnings;
  3. my ($somme_note, $somme_note_carre, $noteMin, $noteMax, $note,$mediane,$mediane_1) = (0, 0, 20, 0);
  4. my @tab;
  5. print "Programme de calcul de la moyenne et ecart type de notes .\n";   
  6. print "\nEntrez le nombre de cours : ";         
  7. my $nombre_cours = <STDIN>;       
  8. for (my $i=1; $i<=$nombre_cours; $i++) 
  9. {
  10. print "\nEntrez les notes : ";
  11. $note = <STDIN>;             
  12. while($note < 0 || $note > 20 )
  13.     {
  14.     print "\nErreur!\nEntrez la note : ";
  15.     $note = <STDIN>;                     
  16.     }                                   
  17.     $somme_note =  $somme_note +  $note;           
  18.     $somme_note_carre =  $somme_note_carre +  $note* $note;             
  19.     if ($note > $noteMax)           
  20.     {
  21.     $noteMax =  $note;
  22.     }
  23.     else
  24.     {
  25.     $noteMax =  $noteMax;
  26.     }
  27.     if ( $note < $noteMin)           
  28.     {
  29.     $noteMin =  $note;
  30.     }
  31.     else
  32.     {
  33.     $noteMin =  $noteMin;
  34.     }
  35. $tab[$i] = ($note);
  36.     my $moyenne =  $somme_note / $nombre_cours;         
  37.     my $variance = $somme_note_carre/ $nombre_cours - $moyenne * $moyenne;
  38.     my $ecart_type = sqrt ( $variance);       
  39.     print "\nLa moyenne est : $moyenne \nL'ecart type est : $ecart_type\nNote maximale: $noteMax\nNote minimale: $noteMin\n";
  40.     if ( $moyenne < 10)                         
  41.     {
  42. print "Vous etes ajourne.\n";
  43.     }   
  44.     else                                 
  45.     {
  46. print "Vous etes admis.\n";
  47. }
  48.     if ( $moyenne >= 15)
  49.     {
  50. print "Avec mention tres bien.\n";
  51. }
  52.     if ( $moyenne <= 15 && $moyenne >= 12 )
  53.     {
  54. print "Avec mention bien.\n";
  55. }
  56.     print"\nRecapitulatif:\nVoici vos notes dans l'ordre croissant, votre moyenne et votre mediane!\n";
  57. #######TRI TABLEAU ORDRE CROISSANT
  58. # for (my $t=1; $t < $nombre_cours; $t++)
  59.    # {
  60.       # for(my $k=0; $k < $nombre_cours - 1; $k++)
  61.       # {
  62.           # if($tab[$k] > $tab[$k+1])
  63.           # {
  64.            # my $valeurtemporaire = $tab[$k];
  65.             # $tab[$k] = $tab[$k+1];
  66.             # $tab[$k+1] = $valeurtemporaire;
  67.           # }
  68.       # }
  69.    # }
  70.  
  71. ######MEDIANE
  72. # if ($nombre_cours % 2 == 0)   #pair
  73. # {
  74.     # $mediane = ($tab[$nombre_cours / 2]+$tab[($nombre_cours / 2) - 1]) / 2;
  75.     # }
  76. # else if($nombre_cours % 2 == 1)   #impair
  77.     # {
  78. # $mediane = $nombre_cours/2;
  79.     # $mediane_1 = ceil($mediane);
  80.     # $mediane = $tab[$mediane_1];
  81.     # }
  82.     for ( my $j = 1; $j <= $nombre_cours; $j++)
  83.     {
  84.     print"Votre note numero $j est : $tab[$j] \n";
  85.     }
  86. print "Moyenne :$moyenne\nMediane :$mediane";
  87.  
  88. <>;


 

Reply

Marsh Posté le 28-10-2012 à 16:46:44    

Tu as la fonction sort() pour trier un tableau sans faire de boucle toute moche : http://docstore.mik.ua/orelly/perl [...] h04_15.htm
 
Pour l'arrondi, il y a plusieurs méthode, celle que j'utilise le plus souvent est :
 
$rounded = int ( $orig + 0.5 )

Reply

Marsh Posté le 28-10-2012 à 20:35:09    


ça ne marche pas, je rajoute ça :

Code :
  1. my @tab_trie = sort{ $a <=> $b ) @tab;


 
 
???? je comprend pas

Reply

Marsh Posté le 29-10-2012 à 14:27:45    

Tu ne comprends pas quoi?
A+,


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

Marsh Posté le 29-10-2012 à 16:13:55    

En fait j'ai mis une parenthèse au lieu d'une accolade, désolé.
 
Il me reste plus qu'à trouver la médiane :
 

Code :
  1. use strict;   
  2.     use warnings;
  3.     my ($somme_note, $somme_note_carre, $noteMin, $noteMax, $note,$mediane,$mediane_1) = (0, 0, 20, 0);
  4.     my @tab;
  5.     print "Programme de calcul de la moyenne et ecart type de notes .\n"; 
  6.     print "\nEntrez le nombre de cours : ";       
  7.     my $nombre_cours = <STDIN>;     
  8.     for (my $i=1; $i<=$nombre_cours; $i++)
  9.     {
  10.     print "\nEntrez les notes : ";
  11.     $note = <STDIN>;           
  12.     while($note < 0 || $note > 20 )
  13.         {
  14.         print "\nErreur!\nEntrez la note : ";
  15.         $note = <STDIN>;                   
  16.         }                                 
  17.         $somme_note =  $somme_note +  $note;         
  18.         $somme_note_carre =  $somme_note_carre +  $note* $note;           
  19.         if ($note > $noteMax)         
  20.         {
  21.         $noteMax =  $note;
  22.         }
  23.         if ( $note < $noteMin)         
  24.         {
  25.         $noteMin =  $note;
  26.         }
  27.        
  28.     $tab[$i] = ($note);
  29.     }
  30.         my $moyenne =  $somme_note / $nombre_cours;       
  31.         my $variance = $somme_note_carre/ $nombre_cours - $moyenne * $moyenne;
  32.         my $ecart_type = sqrt ( $variance);     
  33.         print "\nLa moyenne est : $moyenne \nL'ecart type est : $ecart_type\nNote maximale: $noteMax\nNote minimale: $noteMin\n";
  34.         if ( $moyenne < 10)                       
  35.         {
  36.     print "Vous etes ajourne.\n";
  37.         } 
  38.         else                               
  39.         {
  40.     print "Vous etes admis.\n";
  41.     }
  42.         if ( $moyenne >= 15)
  43.         {
  44.     print "Avec mention tres bien.\n";
  45.     }
  46.         if ( $moyenne <= 15 && $moyenne >= 12 )
  47.         {
  48.     print "Avec mention bien.\n";
  49.     }
  50.         print"\nRecapitulatif:\nVoici vos notes dans l'ordre croissant, votre moyenne et votre mediane!\n";
  51.  
  52.    #####TRI TABLEAU ORDRE CROISSANT
  53.      my @tab_trie = sort {$a <=> $b} @tab;
  54.     ##MEDIANE
  55.     if ($nombre_cours % 2 == 0)   #pair
  56.     {
  57.         $mediane = ($tab_trie[$nombre_cours / 2]+ $tab_trie[($nombre_cours / 2) - 1]) / 2;
  58.         }
  59.     else                         #impair
  60.         {
  61.     $mediane = $nombre_cours/2;
  62.         $mediane_1 = int($mediane);
  63.         $mediane = $tab_trie[$mediane_1];
  64.         }
  65.        
  66.  for ( my $j = 1; $j <= $nombre_cours; $j++)
  67.         {
  68.         print"Votre note numero $j est : $tab_trie[$j] \n";
  69.         }
  70.     print "Moyenne :$moyenne\nMediane :$mediane";
  71.      
  72. <>;


Reply

Marsh Posté le 29-10-2012 à 16:29:38    

C'est bon, j'ai compris mon erreur sur la médiane, j'ai oublié +0.5 dans le int etj'ai mis un - à la place d'un + dans la partie pair.
 
 

Code :
  1. use strict;   
  2.     use warnings;
  3.     my ($somme_note, $somme_note_carre, $noteMin, $noteMax, $note,$mediane,$mediane_1) = (0, 0, 20, 0);
  4.     my @tab;
  5.     print "Programme de calcul de la moyenne et ecart type de notes .\n"; 
  6.     print "\nEntrez le nombre de cours : ";       
  7.     my $nombre_cours = <STDIN>;     
  8.     for (my $i=1; $i<=$nombre_cours; $i++)
  9.     {
  10.     print "\nEntrez les notes : ";
  11.     $note = <STDIN>;           
  12.     while($note < 0 || $note > 20 )
  13.         {
  14.         print "\nErreur!\nEntrez la note : ";
  15.         $note = <STDIN>;                   
  16.         }                                 
  17.         $somme_note =  $somme_note +  $note;         
  18.         $somme_note_carre =  $somme_note_carre +  $note* $note;           
  19.         if ($note > $noteMax)         
  20.         {
  21.         $noteMax =  $note;
  22.         }
  23.         if ( $note < $noteMin)         
  24.         {
  25.         $noteMin =  $note;
  26.         }
  27.        
  28.     $tab[$i] = ($note);
  29.     }
  30.         my $moyenne =  $somme_note / $nombre_cours;       
  31.         my $variance = $somme_note_carre/ $nombre_cours - $moyenne * $moyenne;
  32.         my $ecart_type = sqrt ( $variance);     
  33.         print "\nLa moyenne est : $moyenne \nL'ecart type est : $ecart_type\nNote maximale: $noteMax\nNote minimale: $noteMin\n";
  34.         if ( $moyenne < 10)                       
  35.         {
  36.     print "Vous etes ajourne.\n";
  37.         } 
  38.         else                               
  39.         {
  40.     print "Vous etes admis.\n";
  41.     }
  42.         if ( $moyenne >= 15)
  43.         {
  44.     print "Avec mention tres bien.\n";
  45.     }
  46.         if ( $moyenne <= 15 && $moyenne >= 12 )
  47.         {
  48.     print "Avec mention bien.\n";
  49.     }
  50.        
  51.  
  52.    #####TRI TABLEAU ORDRE CROISSANT
  53.      my @tab_trie = sort {$a <=> $b} @tab;
  54.     ##MEDIANE
  55.     if ($nombre_cours % 2 == 0)   #pair
  56.     {
  57.         $mediane = ($tab_trie[$nombre_cours / 2]+ $tab_trie[($nombre_cours / 2) + 1]) / 2;
  58.         }
  59.     else                         #impair
  60.         {
  61.         $mediane = $nombre_cours/2;
  62.         $mediane_1 = int( $mediane+ 0.5 );
  63.         $mediane = $tab_trie[$mediane_1];
  64.         }
  65.     print"\nRecapitulatif:\nVoici vos notes dans l'ordre croissant, votre moyenne et votre mediane!\n";   
  66.  for ( my $j = 1; $j <= $nombre_cours; $j++)
  67.         {
  68.         print"Votre note numero $j est : $tab_trie[$j] \n";
  69.         }
  70.     print "Moyenne :$moyenne\nMediane :$mediane";
  71.      
  72. <>;


 
 
Merci en tout cas

Reply

Marsh Posté le 29-10-2012 à 16:29:38   

Reply

Marsh Posté le 29-10-2012 à 21:42:54    

Ma version:

Code :
  1. #!/usr/local/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5. use List::Util qw(sum max min);
  6. ###################################################################################
  7. print "------------------------------------------------------------\n";
  8. print "| Programme de calcul de la moyenne et ecart type de notes |\n";
  9. print "------------------------------------------------------------\n";
  10. my ($noteMax, $noteMin, $moyenne, $variance, $ecart_type, $mediane);
  11.  
  12. my $nbCours = getNombreDeCours();
  13. print "Trop d'erreurs! Fin du programme." and exit(1) unless defined $nbCours;
  14.  
  15. my @notes;
  16. foreach my $cour (1..$nbCours) {
  17.  my $note = getNote("$cour/$nbCours" );
  18.  print "Trop d'erreurs! Fin du programme." and exit(1) unless defined $note;
  19.  push @notes, $note;
  20. }
  21.  
  22. $noteMax = max(@notes);
  23. $noteMin = min(@notes);
  24. $moyenne = sum(@notes)/$nbCours;
  25. $variance = (($nbCours * sum(map {$_** 2} @notes)) - (sum(@notes) ** 2))/($nbCours ** 2);
  26. $ecart_type = sqrt($variance);
  27. my @sorted = sort {$a <=> $b} @notes;
  28. my $mid = int @sorted/2;
  29. $mediane = (@sorted % 2)?$sorted[$mid]:($sorted[$mid-1] + $sorted[$mid])/2;
  30.  
  31. print "------------------------------------------------------------\n";
  32. print "La moyenne est : $moyenne \n";
  33. print "L'ecart type est : $ecart_type\n";
  34. print "Note maximale: $noteMax\n";
  35. print "Note minimale: $noteMin\n";
  36. print "------------------------------------------------------------\n";
  37. if ($moyenne < 10) { print "Vous etes ajourne.\n"; }
  38. else { print "Vous etes admis";
  39.       if ( $moyenne >= 15) { print " avec mention tres bien"; }
  40.       elsif ( $moyenne < 15 && $moyenne >= 12 ) { print " avec mention bien"; }
  41.       print ".\n";
  42. }
  43. print "------------------------------------------------------------\n";
  44. print "Recapitulatif:\n";
  45. print "Voici vos notes dans l'ordre croissant, votre moyenne et votre mediane!\n";
  46. print ("Votre note numero ", $_+1, " est $sorted[$_]\n" ) foreach (0..$#sorted);
  47. print "Moyenne: $moyenne\n";
  48. print "Mediane: $mediane\n";
  49. print "------------------------------------------------------------\n";
  50.  
  51. ###################################################################################
  52. use IO::Prompt::Hooked;
  53. use constant MAX_ESSAIS => 5;
  54. use Scalar::Util::Numeric qw(isnum isint);
  55. ###################################################################################
  56. # Recupère un nombre entier supérieur ou égal à 1 a partir de l'input utilisateur #
  57. # En sortie, input est valide ou pas défini                                       #
  58. ###################################################################################
  59. sub getNombreDeCours {
  60.  my $input = prompt( message  => 'Entrez le nombre de cours :',
  61.               tries    => MAX_ESSAIS,
  62.               validate => sub {
  63.             my $raw = shift;
  64.             $raw =~ s/^\s+|\s+$//g;
  65.             return isint $raw && $raw >= 1;
  66.               },
  67.               error    => sub {
  68.             my($raw, $tries) = @_;
  69.             if (isnum $raw) { if (isint $raw) { return "Le nombre minimal de cours est 1. Il vous reste $tries essais.\n"; }
  70.                       else            { return "Ce n'est pas un nombre de cours valide. Il vous reste $tries essais.\n"; }}
  71.             else { return "Ce n'est pas un nombre de cours. Il vous reste $tries essais.\n"; }},
  72.             );
  73.  return $input;
  74. }
  75.  
  76. ###################################################################################
  77. # Recupère un nombre entre 0 et 20 a partir de l'input utilisateur                #
  78. # En sortie, input est valide ou pas défini                                       #
  79. ###################################################################################
  80. sub getNote {
  81.  my $pass = shift;
  82.  my $input = prompt( message  => "Entrez la note ($pass):",
  83.               tries    => MAX_ESSAIS,
  84.               validate => sub {
  85.             my $raw = shift;
  86.             $raw =~ s/^\s+|\s+$//g;
  87.             return isnum $raw && $raw >= 0 && $raw <= 20;
  88.               },
  89.               error    => sub {
  90.             my($raw, $tries) = @_;
  91.             if (isnum $raw) { if ($raw < 0)     { return "La note minimale est 0. Il vous reste $tries essais.\n"; }
  92.                       elsif ($raw > 20) { return "La note maximale est 20. Il vous reste $tries essais.\n"; }}
  93.             else { return "Ce n'est pas une note. Il vous reste $tries essais.\n"; }},
  94.             );
  95.  return $input;
  96. }
  97. ###################################################################################


 
Noter l'utilisation du module IO::Prompt::Hooked afin de faire de l'user input assez blindé.
 
A+,


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