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

 C Discussion :

Rangement par ordre alphabétique chaines de caractères


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Décembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement de composants
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2015
    Messages : 25
    Points : 14
    Points
    14
    Par défaut Rangement par ordre alphabétique chaines de caractères
    Bonjour je vous explique mon soucis.

    Enfaite je dois demander à l'utilisateur :

    - Combien d'utilisateur il doit saisir ( FAIT )
    - Bloquer la saisie de façon à n'entrer que des noms en MAJUSCULE ( pas fait )
    - Ranger par ordre alphabétique les noms saisis ( FAIT mais avec un problème)

    dans mon code si j'utilise la fonction strcmp de la library string.h mon programme fonctionne mais mon prof souhaite que j'écrire la fonction strcmp . . . Et celle-ci une fois écrite ne range par correctement les noms saisis. De plus je ne comprends pas forcément ce que le return de la fonction strcmp fait... Mais je suis un peu perdu.

    Par EXEMPLE si je saisi les 7 noms suivants :

    -VANBUYTEN
    -VANDENBROEK
    -DUSCHMURZ
    -DUPONTEL
    -VANBOMMEL
    -DUPONT
    -VANBASCO

    le programme va me ressortir :

    DUSCHMURZ

    DUPONTEL
    DUPONT
    VANBUYTEN
    VANDENBROEK
    VANBASCO
    VANBOMMEL

    Merci d'avance pour votre aide, je suis débutant.

    Voici mon code

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    #include <stdio.h>
    #include <stdlib.h>
    //#include <string.h>
     
    int strcmp(char* s1[], char* s2[]);
    int programme(int nb_personne);
     
    int main()
    {
     
        //VARIABLE ENTIERE
     
        int nb_personne;
     
        //SAISIE DU NOMBRE DE PERSONNE
     
        printf("Veuillez entrer le nombre de personne que vous allez saisir.\n*CETTE SAISIE NE PEUT ETRE QUE DES CHIFFRES*\n\n");
        scanf("%d", &nb_personne);
     
        //APPEL PROGRAMME
     
        programme(nb_personne);
    }
    int programme(int nb_personne)
    {
        int i,j;
        char nom[nb_personne][22];
        char *tri[nb_personne];
        char *temporary;
     
        //saisie
     
        printf("Entrez %d noms\n\n",nb_personne);
            for(i = 0; i <= nb_personne; i++)
            {
                gets(nom[i]);
                tri[i] = nom[i];
     
            }
     
        //tri à bulles
     
     
            for(j = 0; j < nb_personne; j++)
            {
                for(i = 0; i < nb_personne;i++)
                    //if(strcmp(tri[i],tri[i+1]) > 0)
                    if(strcmp(tri[i], tri[i+1]) > 0)
                    {
                        temporary = tri[i];
                        tri[i] = tri[i+1];
                        tri[i+1] = temporary;
                    }
            }
     
        //affichage
     
            printf("Voici la liste des personnes saisie triee dans l'ordre alphabetique\n");
            for(i = 0; i <= nb_personne; i++)
            {
                printf("%s\n", tri[i]);
            }
    }
    int strcmp(char* s1[], char* s2[])
    {
        while (*s1 != '\0' && (*s1++ == *s2++));
        return (*((unsigned char *)--s1) < *((unsigned char *)--s2)) ? -1 : (*(unsigned char *)s1 != *(unsigned char *)s2);
    }

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Dans ta fonction strcmp, tu as oublié de vérifier la nullité de s2, il peut y avoir un dépassement mémoire. Et pense à changer le nom de ta fonction pour ne pas la confondre avec celle de la libc.
    Il faut voir cette fonction comme une balance de Roberval, celle avec deux plateaux. La chaine 1 est sur le plateau gauche, la chaine 2 sur le plateau droit. Le retour de la fonction indique quel est le plateau le plus bas, quelle est la chaine la plus petite dans l'ordre lexicographique. Si le retour est négatif, c'est le plateau gauche le plus bas donc la chaine 1 en premier. Si le retour est positif, c'est le plateau droit le plus bas donc la chaine 2 à mettre en premier. Sinon, si c'est 0, alors les deux chaines sont égales.

    Avant d'utiliser ta fonction pour faire un tri, pense à la tester !
    Vérifie comment elle son comporte dans plusieurs cas en comparant par exemple :
    1. a <=> aaaaaaaaaaaaaaaaaaaa
    2. aaaaaaaaaaaaaaaaaaaa <=> a
    3. '\0' <=> '\0'
    4. '\0' <=> aaaaaaaaaaaaa
    5. aaaaaaaaaaaaa <=> '\0'
    6. aaaaaaaaaaaaaaaaaaaaaaaaaa <=> aaaaaaaaaaaaaaaaaaaaaaaaaa
    7. a <=> a

    Et tout autre test qui te passera par la tête.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Décembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement de composants
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2015
    Messages : 25
    Points : 14
    Points
    14
    Par défaut
    Bon bah j'ai refais ma fonction de comparaison et ça fonctionne maintenant

    Merci de ton aide Maintenant je vais bloquer la saisie pour les majuscules

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int stringcompare(char *s1, char *s2)
    {
            int i = 0;
     
            while (s1[i] == s2[i] && s1[i] != '\0' && s2[i] != '\0')
                i++;
            if(s1[i] > s2[i])
                return 1;
            else
                return 0;
    }

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 642
    Points
    7 642
    Par défaut
    La fonction strcmp() est sensée retourner -1 quand la première chaîne est inférieure à la deuxième. Clairement ton code ne retourne jamais -1.

  5. #5
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par dalfab Voir le message
    La fonction strcmp() est sensée retourner -1 quand la première chaîne est inférieure à la deuxième. Clairement ton code ne retourne jamais -1.
    Cela vient de l'usage de sa fonction. Sa fonction est mal nommée et devrait s'appeler "est_strictement_plus_grand_que". Il l'utilise comme un booléen pour savoir si la chaine 2 est la plus grande.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 13/01/2011, 08h31
  2. Rangement par ordre alphabétique
    Par Tisther dans le forum Word
    Réponses: 3
    Dernier message: 11/09/2008, 19h35
  3. Réponses: 4
    Dernier message: 23/10/2007, 22h09
  4. Tri par ordre alphabétique
    Par orus8 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 17/04/2003, 19h27
  5. [] Tri d'un tableau par ordre alphabétique
    Par cafeine dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 17/09/2002, 08h43

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