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

Shell et commandes GNU Discussion :

Recherche d'un caractère à une position donnée (dans un jeu en shell)


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 24
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2019
    Messages : 14
    Par défaut Recherche d'un caractère à une position donnée (dans un jeu en shell)
    Citation Envoyé par Flodelarab Voir le message
    C'est ce qu'on réclame, à cor et à cri. Que veux-tu ?
    Là, tu ne fais que empiler du code. C'est tout ce qu'il ne faut pas faire.
    je veux que :
    *dans : ./pasDeTresorIci.sh ligne colone carteTresor :
    si [ligne][colone] (dans carteTresor) = X alors on exit 1 sinon on exit 0 #sans faire de tableau si possible car je n'ai pas encore vu comment les faire

    *dans ./chasseAuTresor.sh ligne colone
    tant que ./pasDeTresorIci.sh ligne colone (exit 0) alors on demande une nouvelle ligne et nouvelle colonne (en affichant) puis on read la reponse (les 2 reponses) puis on affecte les 2 valeurs qu'on a lu dans ligne et colone et la boucle est fini
    on affiche "tresor trouvé!!" (quand on est sorti de la boucle car on à trouvé un X donc ca a exit 1 et pu 0)

    je crois que j'ai réussi pasDeTresorIci.sh !!

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 663
    Par défaut
    pourquoi exit 1, alors que le caractère a été trouvé ? il n'y a pas d'erreur, alors il faut indiquer le succès, donc exit 0 !

    tu as un script principal :./chasseAuTresor.sh
    appelé ainsi : ./chasseAuTresor.sh ligne colonepourquoi indiquer ligne et colonne, alors que le programme est interactif : il demande jusqu'au succès de la "quête" les coordonnées où chercher ?
    Code pseudo-code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    tant que ./pasDeTresorIci.sh ligne colone (exit 0)
    alors
       on demande une nouvelle ligne et nouvelle colonne (en affichant)
       puis on read la reponse (les 2 reponses)
       puis on affecte les 2 valeurs qu'on a lu dans ligne et colone
    et la boucle est fini
    on affiche "tresor trouvé!!" (quand on est sorti de la boucle car on à trouvé un X donc ca a exit 1 et pu 0)
    je dirais non.
    Code pseudo-code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    tant que lire ligne colonne
       si vérifier $ligne $colonne dans $fichier # "vérifier" n'a pas à être un programme annexe, ça peut, ça _doit_ être une fonction du script principal.
       alors
          afficher succès
          quitter
       finsi
    finTantQue
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 24
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2019
    Messages : 14
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    pourquoi exit 1, alors que le caractère a été trouvé ? il n'y a pas d'erreur, alors il faut indiquer le succès, donc exit 0 ! [/Code]
    je voulais exit 1 quand on trouve le trésor car c'est lui qui est "l'exception" et je voulais que se soit lui qui nous fasse sortir du while pour qu'on renvoie le message de fin vous avez trouvé le trésor!!

  4. #4
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    je veux que :
    *dans : ./pasDeTresorIci.sh ligne colone carteTresor :
    si [ligne][colone] (dans carteTresor) = X alors on exit 1 sinon on exit 0 #sans faire de tableau si possible car je n'ai pas encore vu comment les faire
    Tu es repartie comme en 40. Tu tripatouilles du code. Ce n'est pas la bonne méthode. Tu t'épuises à régler des détails.

    2 points :
    • Dans Windows, les exécutables renvoient 1 (vrai) quand ça marche, et 0 (faux) quand ça ne marche pas.
      Dans Linux, un exécutable renvoie 0 quand tout a fonctionné (il n'y a rien à ajouter), et un code différent de 0 en cas d'erreur (ce code erreur permet de savoir ce qui s'est mal passé).
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      $ ls Prout
      ls: impossible d'accéder à 'Prout': Aucun fichier ou dossier de ce type
      $ echo $?
      2
      Le code retour est 2 car ls n'a pas trouvé le fichier "Prout".
      .
    • Il ne faut pas confondre le code retour et la sortie. Un exécutable écrit sur la sortie standard, sur la sortie d'erreur, et renvoie un code retour qui indique si le logiciel a fonctionné (cf plus haut).
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      $ ls Prout afac_tresor.txt
      ls: impossible d'accéder à 'Prout': Aucun fichier ou dossier de ce type
      afac_tresor.txt
      $ echo $?
      2
      Dans cet exemple, le message d'erreur est la sortie d'erreur de ls, le nom du fichier est la sortie standard, et 2 est le code retour. Ici, on a les 3.

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 24
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2019
    Messages : 14
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Tu es repartie comme en 40. Tu tripatouilles du code. Ce n'est pas la bonne méthode. Tu t'épuises à régler des détails.
    je ne peux pas faire à ma guise si cela m'arrange pour la suite ?
    ceci marche bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    carac=$(head -n"$1" "$3" | tail -n1 | tr -d "," | cut -c"$2")
    #head -n$ligne $3 | tail -n1 | tr -d "," | cut -c"$2"
    if [ "$carac" == 'X' ]; then echo "bravo : "$carac""
            exit 1
    else echo "dommage : "$carac""
            exit 0
    fi
    alors logiquement dans mon while ./pasDETresorIci.sh ligne colone fichier; do ... ca devrait marcher nan ?! puisque quand le code de sortie sera 1 ca devra écrire "tresor trouvé!" ?
    comment différencier les 2 cas (pas de trésor ici ou un trésor ici) sinon ?

  6. #6
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 24
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2019
    Messages : 14
    Par défaut
    j'ai réussi je crois !! Après je ne sais pas si c'est très bien en bash mais ca marche ne tout cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ligne=$1
    colone=$2
    fichier=$3
    while ./pasDeTresorIci.sh "$ligne" "$colone" "$fichier"; do
            echo "entrer un nvlle position (ligne colone) : "
            read nvligne nvcolone
                    ligne=$nvligne
                    colone=$nvcolone
    export ligne
    export colone
    done
    echo "vous avez trouver le  tresor !!"
    il manque de tester si les coordonnées entrées sont bien sur la carte

  7. #7
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Si ta grille a un nombre variable de caractères par champ, ton script ne marchera pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    head -n"$1" "$3" | tail -n1 | cut -d ',' -f "$2"
    "Colonne" prend 2 "n".

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par annap Voir le message
    ceci marche bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    carac=$(head -n"$1" "$3" | tail -n1 | tr -d "," | cut -c"$2")
    #head -n$ligne $3 | tail -n1 | tr -d "," | cut -c"$2"
    if [ "$carac" == 'X' ]; then echo "bravo : "$carac""
            exit 1
    else echo "dommage : "$carac""
            exit 0
    fi
    Bonjour, plutôt que de faire 2 scripts (le 2ème ayant très peu de chances d'être appelé en-dehors du contexte du 1er), je te propose de conserver le script principal et de remplacer le "sous-script" par une fonction:
    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
    ligne=$1
    colonne=$2
    fichier=$3
     
    function pasDeTresorIci() {
        carac=$(head -n"$1" "$3" | tail -n1 | tr -d ',' | cut -c"$2")
        #head -n$ligne $3 | tail -n1 | tr -d ',' | cut -c"$2"
        if test "$carac" = 'X'
        then echo "Bravo : $carac"
             return 1
        else echo "Dommage : $carac"
             return 0
        fi
    }
     
    while pasDeTresorIci "$ligne" "$colonne" "$fichier"
    do
        echo "Entrez une nouvelle position (ligne colonne) : "
        read nvligne nvcolonne
        ligne=$nvligne
        colonne=$nvcolonne
    done
     
    echo "Vous avez trouvé le trésor !!"
    Grosso modo, j'ai juste remplacé les "exit" par des "return" (et corrigé quelques petites erreurs typographiques...)

    Et, effectivement, il est "logique" que la fonction "pasDeTresorIci", dont le nom commence malencontreusement par "pas" (avec la sémantique volontairement inversée), retourne 0 lorsqu'il est vrai qu'il n'y a PAS de trésor aux coordonnées fournies.

    Mais il serait encore plus logique àmha d'utiliser la fonction inverse "tresorPresent", qui retournerait 0 dans le cas où le trésor est présent et serait utilisé dans un while ! tresorPresent "$ligne" "$colonne" "$fichier" (sous réserve que le shell accepte le '!'):
    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
    ligne=$1
    colonne=$2
    fichier=$3
     
    function tresorPresent() {
        carac=$(head -n"$1" "$3" | tail -n1 | tr -d ',' | cut -c"$2")
        #head -n$ligne $3 | tail -n1 | tr -d ',' | cut -c"$2"
        if test "$carac" = 'X'
        then echo "Bravo : $carac"
             return 0
        else echo "Dommage : $carac"
             return 1
        fi
    }
     
    while ! tresorPresent "$ligne" "$colonne" "$fichier"
    do
        echo "Entrez une nouvelle position (ligne colonne) : "
        read nvligne nvcolonne
        ligne=$nvligne
        colonne=$nvcolonne
    done
     
    echo "Vous avez trouvé le trésor !!"

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 663
    Par défaut
    while ! false = until true
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. Réponses: 9
    Dernier message: 02/12/2014, 22h25
  2. Réponses: 21
    Dernier message: 22/01/2012, 02h19
  3. Réponses: 0
    Dernier message: 23/12/2009, 10h14
  4. Ecriture à une position donné dans un fichier
    Par xarius dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 29/05/2006, 16h05
  5. Inserer du texte à une position donnée dans un Memo
    Par bassim dans le forum Composants VCL
    Réponses: 2
    Dernier message: 23/11/2005, 17h45

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