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

  FORUM HardWare.fr
  Programmation
  Perl

  Problème affichage tableau de taille variable

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème affichage tableau de taille variable

n°2161671
chupitoman
Posté le 27-10-2012 à 19:57:11  profilanswer
 

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
mood
Publicité
Posté le 27-10-2012 à 19:57:11  profilanswer
 

n°2161685
ccp6128
Syntax error
Posté le 28-10-2012 à 00:17:56  profilanswer
 

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
n°2161706
gilou
Modérateur
Modzilla
Posté le 28-10-2012 à 12:18:32  profilanswer
 

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é!  --
n°2161710
ccp6128
Syntax error
Posté le 28-10-2012 à 13:09:16  profilanswer
 

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.

n°2161719
chupitoman
Posté le 28-10-2012 à 13:47:19  profilanswer
 

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


 

n°2161738
ccp6128
Syntax error
Posté le 28-10-2012 à 16:46:44  profilanswer
 

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 )

n°2161752
chupitoman
Posté le 28-10-2012 à 20:35:09  profilanswer
 


ça ne marche pas, je rajoute ça :

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


 
 
???? je comprend pas

n°2161877
gilou
Modérateur
Modzilla
Posté le 29-10-2012 à 14:27:45  profilanswer
 

Tu ne comprends pas quoi?
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2161885
chupitoman
Posté le 29-10-2012 à 16:13:55  profilanswer
 

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


n°2161887
chupitoman
Posté le 29-10-2012 à 16:29:38  profilanswer
 

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

mood
Publicité
Posté le 29-10-2012 à 16:29:38  profilanswer
 

n°2161912
gilou
Modérateur
Modzilla
Posté le 29-10-2012 à 21:42:54  profilanswer
 

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

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

  Problème affichage tableau de taille variable

 

Sujets relatifs
Problème Connection MySQL sur mon VPStri tableau associatif JavaScript
probleme lecture swf flash cs6[Ada] Problème avec Pm_Read de la bibliothèque portmidi
Problème carrouselProbleme compilation MacOSX
Problème avec formulaire php - HELP!Problème d'affiche de flux Twittter
Résolution d'un algo[tableau en java][JAVA] Compter nombre de fois caractère dans un tableau
Plus de sujets relatifs à : Problème affichage tableau de taille variable


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