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 :

Comparaison de valeurs


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 16
    Par défaut Comparaison de valeurs
    Bonjours,
    J'ai un exercice a faire ou on doit verifier si le mot saisi est un palindrome (c'est a dire qu'il est lisible dans les deux sens de la meme façon ex: bob ou radar).
    De plus le mot saisi par l'utilisateur doit se conclure par un point.
    Le probleme survient quand je tente de comparer deux valeur de deux tableau. Je m'explique, pour me faciliter le travail, j'ai eclater le mot en un tableau , que j'ai retourné ensuite afin de verifier si il etait similaire une fois retourné. J'ai converti les lettre en valeur ascII par l'instruction ord(). Mais impossible de comparer.

    Voici mon script .

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    <?php
    	//exo3 fiche tableau
    	include 'saisir.php';
    	echo "entrez un mot (il devra se terminer par un point) :";
    	$mot = saisir();
    	$motf = substr ($mot, 0, -1);
    	//echo "le mot saisi est initial est : ".$mot."\n";
    	//echo "le mot après transformation est : ".$motf."\n";
    	$j =  strlen($motf);
    	//echo "la taille du mot est : ".$j."\n";
    	for($i=0; $i<$j; $i++)
    	{
    		$tab[$i] = $motf[$i];
    	}
    	//for($i=0; $i<$j ; $i++)
    	//{
    	//	echo $i." ".$tab[$i]." \n";
    	//}
    	$i=0;
    	for ($i=0; $i<$j; $i++)
    	{
    		$k = $j-$i-1;
    		//echo $k."\n";
    		$tabinverse[$i] = $tab[$k];
    		//echo $tabinverse[$i];
    	}
    	$i=0;
    	for ($i=0; $i<$j; $i++)
    	{
    		echo $tab[$i]." ".$tabinverse[$i]."\n";
    	}
    	$i=0;
    	for ($i=0; $i<$j; $i++)
    	{
    		$ordtab[$i] = ord($tab[$i]);
    		$ordtabinverse[$i] = ord($tabinverse[$i]);
    	}
    	$i=0;
    	for ($i=0; $i<$j; $i++)
    	{
    		echo $ordtab[$i]." ".$ordtabinverse[$i]."\n";
    	}
    	$i=0;
    	for ($i=0; $i<$j; $i++)
    	{
    		if ($ordtab[$i] = $ordtabinverse[$i])
    			$rep = 1;
    		else
    			$rep = 0;
     
    	}	
    	echo $rep;
    ?>
    Il m'affirme que tout mots saisis est un palindrome ce qui n'est pas le cas .

    Merci D'avance, je galère a mort depuis plusieurs heures.

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 368
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 368
    Billets dans le blog
    17
    Par défaut
    Boulala très/trop compliqué ton script

    A première vue le pb vient d'ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for ($i=0; $i<$j; $i++)
    {
        if ($ordtab[$i] = $ordtabinverse[$i])
            $rep = 1;
        else
            $rep = 0;
    }
    D'abord, le = du if est mauvais car tu affectes mais ne compares pas.

    Ensuite, finalement $rep dira si la dernière lettre testée correspond. Il faudrait sortir de ta boucle dès que $rep vaut 0 car on sait que la saisie n'est pas un palindrome.

    As-tu le droit d'utiliser toutes les fonctions PHP ?

    Ensuite, finalement $rep dira si la dernière lettre testée correspond. Il faudrait sortir de ta boucle dès que $rep vaut 0 car on sait que la saisie n'est pas un palindrome.
    Et attention à la valeur initiale de $rep.

  3. #3
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Tu as fait beaucoup trop compliqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    $mot = "Leon emir cornu d un roc rime Noel";
     
    $lettres = str_replace(" ", "", strtolower($mot));
     
    $longueur = mb_strlen($lettres);
     
    for($i = 0; $i < $longueur; $i++) {
    	if ($lettres[$i] != $lettres[$longueur - $i - 1]) {
    	    die("pas un palindrome");
            }
    }
    echo "palindrome";
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 16
    Par défaut
    Merci a vous pour cette aide donc a ce que je comprend de ta méthode seb., i faudrait plutot que je fasse un truc avec du while imbriqué afin de declarer que la boucle continue tant que $rep = 1.

    Ai-je bien compris ?

  5. #5
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 368
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 368
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par armelpiquet Voir le message
    i faudrait plutot que je fasse un truc avec du while imbriqué afin de declarer que la boucle continue tant que $rep = 1.

    Ai-je bien compris ?
    Un while simple suffirait, et attention à l'opérateur de comparaison.

  6. #6
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    En reprenant la méthode de Sabotage, tu peux optimiser un peu en mettant ceci à la place :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $count = (int)($longueur / 2);
    for($i = 0; $i<$count ; $i++)


    Pas la peine de tester 2 fois les mêmes lettres

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 16
    Par défaut
    donc selon toi seb je laisse tombé le for et je le remplace par un while ?

    pour donner un truc du genre

    $rep = 1;
    while ($rep = 1)
    {
    if ($ordtab[$i] === $ordtabinverse[$i])
    $rep = 1;
    else
    $rep = 0;
    }

    Merci de me répondre aussi vite .

  8. #8
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 368
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 368
    Billets dans le blog
    17
    Par défaut
    Oui, mais attention :
    - à la valeur initiale de $i
    - à l'opérateur de comparaison à ne pas cofondre avec le =
    - à ce que ton while finisse un jour ou l'autre
    - à la valeur de $i dans ta boucle

  9. #9
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 420
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Tu as fait beaucoup trop compliqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    $mot = "Leon emir cornu d un roc rime Noel";
     
    $lettres = str_replace(" ", "", strtolower($mot));
     
    $longueur = mb_strlen($lettres);
     
    for($i = 0; $i < $longueur; $i++) {
    	if ($lettres[$i] != $lettres[$longueur - $i - 1]) {
    	    die("pas un palindrome");
            }
    }
    echo "palindrome";
    if ($lettres[$i] != $lettres[$longueur - $i - 1]) ... ça risque de donner des résultats erronés avec des chaines de caractères encodées en multi octets, non ?

    EDIT :
    @Seb. même remarque à propos de l'emploi de la fonction strrev avec l'utf-8

  10. #10
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 368
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 368
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par ABCIWEB Voir le message
    @Seb. même remarque à propos de l'emploi de la fonction strrev avec l'utf-8
    UTF-8 ? Connaîs pas

  11. #11
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 420
    Par défaut
    Citation Envoyé par Séb. Voir le message
    UTF-8 ? Connaîs pas
    Oui bon je vois bien que tu plaisantes, mais pour les débutants qui suivraient ce topic il faut préciser au passage que l'utf-8 n'est pas seulement quasi indispensable pour faire des sites multilingues mais que c'est l'encodage requis pour pouvoir utiliser des fonctions php comme json_encode très pratique pour pouvoir envoyer des tableaux vers javascript et donc souvent employée pour des transactions ajax

  12. #12
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 368
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 368
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par ABCIWEB Voir le message
    il faut préciser au passage que l'utf-8 n'est pas seulement quasi indispensable pour faire des sites multilingues
    Tout dépend des langues, ex pour du français/anglais/espagnol/allemand le ISO-8859-1/15 est tout à fait suffisant.

    mais que c'est l'encodage requis pour pouvoir utiliser des fonctions php comme json_encode
    Oui, et pour certaines extensions telles SimpleXML, pour ça il y a les fonctions utf8_encode/decode.

    Bref, on peut se passer de l'UTF-8 qui n'est finalement pas souvent utile pour le commun des dév, et ce n'est pas PHP6 qui dira le contraire

  13. #13
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    ou alors dans ce cas ne pas tester des mots avec des caractères accentués
    Comme je les pointé, les palindromes ne prennent de toute facon pas en compte les accent ; il faudrait les retirer de la chaine.

    Un palindrome russe (truqué car j'ai retiré les accents)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    $mot = "А лис он умeн крыса сыр к нeму носила";
    $lettres = mb_ereg_replace(" ", "", mb_strtolower($mot,  'UTF-8'));
     
    $longueur = mb_strlen($lettres) / 2;
     
    for($i = 0; $i < $longueur; $i++) {
    	if (mb_substr($lettres, $i,1,'UTF-8') != mb_substr($lettres, -$i-1 ,1,'UTF-8')) {
    	    die("pas un palindrome");
            }
    }
    echo "palindrome";
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  14. #14
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 420
    Par défaut
    Citation Envoyé par armelpiquet Voir le message
    ...
    Je m'explique, pour me faciliter le travail, j'ai eclater le mot en un tableau ...
    C'est souvent une bonne idée de passer par un tableau. Cela dit il faut prendre en considération que l'utf-8 travaille en multi octets et ta boucle qui fait correspondre une lettre à un octet va donner des résultats erronés.

    En cherchant comment passer par un tableau on peut faire ça :
    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
    <?php
    $expression = "Leon emir cornu d un roc rime Noel";
                    //http://www.php.net/manual/fr/function.mb-split.php#99851
    		function mb_str_split( $string ) 
    			{
    				return preg_split('/(?<!^)(?!$)/u', $string );
    			} 
     
     
    		$lettres = str_replace(" ", "", mb_strtolower($expression,"utf-8"));
     
    		$tab_lettres = mb_str_split($lettres);
     
    		$tab_test = array_reverse($tab_lettres);
     
    		$reponse = $tab_lettres === $tab_test ? "L'expression est un palindrome" : "L'expression n'est pas un palindrome";
     
    echo $reponse;

  15. #15
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Tout à fait, cependant un palindrome français fonctionne rarement avec des accents de toute façon (léon/noël).

    La solution de Séb. est plus élégante dans tous les cas.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  16. #16
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 420
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Tout à fait, cependant un palindrome français fonctionne rarement avec des accents de toute façon (léon/noël).

    La solution de Séb. est plus élégante dans tous les cas.
    Elle est plus élégante dans le sens où c'est la solution la plus courte. Mais impossible de travailler en utf-8 et de tester des palindromes français puis allemands, polonais, russes, chinois etc.

    Donc élégante mais peu pérenne à moins de se restreindre à l'hexagone, et encore il faudrait ne pas travailler en utf-8 ou alors dans ce cas ne pas tester des mots avec des caractères accentués ...

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 07/12/2006, 21h52
  2. GTK+ comparaison entier valeur du pointeur
    Par Emyleet dans le forum GTK+ avec C & C++
    Réponses: 10
    Dernier message: 21/07/2006, 16h28
  3. comparaison de valeur sur un résultat de requete
    Par griese dans le forum Langage
    Réponses: 5
    Dernier message: 28/06/2006, 16h23
  4. comparaison de valeurs
    Par Flobynaldo dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/05/2006, 17h56
  5. Comparaison de valeurs stockees dans un meme champ
    Par Tartenpion dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/02/2006, 22h33

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