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 Perl Discussion :

Comment calculer le nombre d'occurences?


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 15
    Points : 5
    Points
    5
    Par défaut Comment calculer le nombre d'occurences?
    Bonjour à tous!

    Il s'agit d'un jeu ayant pour but de trouver le mot caché. L utilisateur entre un caractère et le programme doit lui dire oui ou non et lui dire combien de fois ce caractère a été trouvé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    sub ChercheCaractere {
    my $cpt=0;
     
    	for ($cpt=0;$cpt<scalar(@tab_mot_mystere);$cpt++){
    		if ($caract = $tab_mot_mystere[$cpt]){
    			$nb=$nb+1;
    		}	
    	}
    }

    Voici un extrait de fonction. $cpt est un compteur me permettant de parcourir mon tableau pour savoir si un caractère entré par l utilisateur fait partie du mot à trouver.
    La condition est que si le caractère lu est égal à l'un des caractère présent dans mon tableau alors $nb devient>0.

    Dans mon programme principal je dis ensuite que si $nb>0 alors print "oui" sinon non.

    Le programme fonctionne.

    Mon problème c'est si il y a 2 fois le même caractère dans le mot caché comment je peux réussir à compter cela afin que le programme affecte dans une nouvelle variable le nombre de fois que le caractère est présent?

    Je sais qu'il y a des fonctions plus pertinente à utiliser en PERL notamment pour compter, trier etc (j'ai entendu parler d'un foreach), mais je suis dans l'optique d'apprendre les bases de la programmation (les mécanismes et la logique) et non d'apprendre le PERL en profondeur.

    Mon but actuel n'est donc pas l'optimisation de mon programme mais son fonctionnement.

    Je vous remercie d'avance de vos aides!

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Bonjour, je ne comprends pas bien votre objectif : est-il d'apprendre les bases de perl ou bien les bases de l'algorithmique (indépendamment de tout langage) ?
    Car en lisant votre programme, et si vous souhaitez apprendre les bases de perl, vous vous mettez d'emblée des contraintes très fortes en n'acceptant justement pas les formes syntaxiques particulières de perl (par rapport aux autres langages structurés tels C) qui font à mes yeux justement partie des bases de perl.

    Si votre question est purement algorithmique, alors je ne la comprends pas car, si j'ai bien interprété votre programme (ce n'est pas simple, car on ne connais pas la teneur du tableau @tab_mot_mystere ni celle de $caract, la fonction ChercheCaractere n'étant pas montrée dans son utilisation), votre programme devrait déjà compter le nombre d'occurrence de $caract dans @tab_mot_mystere. Il conviendrait cependant de corriger le contenu du if :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($caract eq $tab_mot_mystere[$cpt]){
    (eq : opérateur d'égalité alpha-numérique)

    Je ne peux m'empêcher cependant de vous prodiguer quelques bases de programmation perl :
    En perl, il est rarement nécessaire d'avoir à se préoccuper de la gestion des indices de tableaux, car perl dispose d'opérateur sur les listes.
    Ainsi, on peut ré-écrire ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my $cpt=0;
     
    	for ($cpt=0;$cpt<scalar(@tab_mot_mystere);$cpt++){
    		if ($caract eq $tab_mot_mystere[$cpt]){
    			$nb=$nb+1;
    		}	
    	}
    ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	foreach my $caract_mystere (@tab_mot_mystere){
    		if ($caract eq $caract_mystere){
    			$nb=$nb+1;
    		}	
    	}
    Ensuite, en perl, il existe spécifiquement une fonction perl qui permet de rechercher (et de compter) des occurrences dans un tableau (grep).
    Ainsi, le code précédent peut également s'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $nb = grep $caract eq $_, @tab_mot_mystère
    Dernière remarque : il est assez rare en perl d'avoir besoin de "découper" un mot en tableau de caractère pour en faire son analyse, car l'usage des expressions régulière est très puissante et largement favorisée en perl.
    Ainsi, si l'on considère que $mon_mystere est le mot entier, il est facile de compter les occurrences de $caract à l'intérieur, sans le découper :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @occurrence_caract = $mot_mystere =~ /($caract)/g;
    $nb = scalar(@occurrence_caract);
    qu'il est aussi possible d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $nb = () = $mot_mystere =~ /($caract)/g;
    en utilisant la technique du pseudo opérateur goatse.

    Si vous avez lu jusqu'ici, c'est que vous n'êtes pas encore dégouté de perl. Je vous invite alors à systématiquement introduire en début de script les deux lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    use strict;
    use warning;
    Ces dernières vous permettrons de corriger quelques défauts de styles d'écriture qui vous éviterons quelques déboires.

    Cordialement.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  3. #3
    Futur Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Merci de votre réponse.

    Ma fonction fonctionne!

    (Pour explication, je suis en 1ere année d études supérieure informatique et les exercices que je dois rendre ont pour objectif de m'apprendre les bases de la prog.
    On utilise le perl qu'un semestre.

    C'est pourquoi je ne dois pas utiliser des choses que je n'ai pas vu et je pense qu'on ne les verra jamais en perl (du moins cette année).

    C'est pourquoi j'utilise des compteurs basique ^_^

    J'ai un nouveau et dernier pb sur cet exercice concernant la partie en gras dans le script qui suit:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    sub ChercheCaractere {
    my $cpt;
    
    	for ($cpt=0;$cpt<scalar(@tab_mot_mystere);$cpt++){
    		if ($caract eq $tab_mot_mystere[$cpt]){
    			$nb_trouve=$nb_trouve+1;
    			$tab_mot_courant[$cpt]=$tab_mot_mystere[$cpt];
    		}
    		else{
    		$tab_mot_courant[$cpt] eq '-'; 
    		}
    	}
    }

    Voila ma fonction.
    @tab_mot_mystere est un tableau contenant un mot saisi par un utilisateur caractère après caractère.
    @tab_mot_courant est un tableau que j'utilise pour m'afficher les caractères trouvés seulement.
    $cpt est un simple compteur qui me permet de parcourir mon tableau.
    $nb_trouve est le nombre de caractère trouvé total.

    Mon problème vient du fait que dans mon tableau @tab_mot_courant je dois afficher des '-' à la place des lettres qui ne seraient pas encore trouvés.

    Exemple: MOT=C A N N E.
    @tab_mot_courant afficherait C - N N E si le A n'était pas encore trouvé par l utilisateur.

    Et bien sur je n'arrive pas à afficher le '-'

    Ca m'affiche:

    C N N E. (Avec l'espace adéquat entre le C et le premier N pour le caractère manquant)

    J'ai conscience que le else de ma fonction n'est pas bon. Mais je n'ai pas idée de comment faire.

    Auriez vous une solution?

    Merci d'avance.

  4. #4
    Membre confirmé Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Points : 515
    Points
    515
    Par défaut
    Bonjour,

    L'opérateur "eq" est un opérateur de test sur les chaînes de caractères. Pour affecter un "-" dans ton tableau il faut utiliser le "=" dans ton else.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    else{
      $tab_mot_courant[$cpt] = '-'; 
    }

  5. #5
    Futur Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Yeah! Merci beaucoup! Suis-je bête!

    Par contre à cause de mon "else mal placé",

    Pour garder le même exemple "CANNE",

    -Si je rentre la première fois 'N',

    Il m'affiche - - N N - ===> Ok c'est bon!

    -Si je rentre la deuxième fois 'A',

    Il m'affiche - A - - - au lieu de - A N N - (ce que je comprend au vue de mon scipt.)

    J'ai pensé à un compteur $cpt2 pour @tab_mot_courant qui calculerait le nombre de '-' à mettre.

    Mais je vois pas comment mettre cela en œuvre sans remplacer le tableau initialement calculé, est ce que vous auriez une piste à me proposer?

    Merci encore d'avance.

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/12/2006, 12h45
  2. Réponses: 4
    Dernier message: 07/09/2006, 15h02
  3. Réponses: 2
    Dernier message: 06/08/2006, 00h08
  4. Réponses: 4
    Dernier message: 16/12/2005, 19h36
  5. Réponses: 28
    Dernier message: 22/09/2005, 11h57

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