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 :

Tri de chaîne de caractère


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 90
    Par défaut Tri de chaîne de caractère
    Ce topic prend la suite du topic suivant: http://www.developpez.net/forums/d12...lement-boucle/
    Je dois rendre un devoir qui me demande de transformer le programme ci-dessous, pour qu'il tri des char alphabétique à la place des float.

    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
    #include <stdio.h>
    #include <stdlib.h>
    main()
    {
        int i,j,k,n;
        float t[100],x;
     
        printf("Combien de nombre souhaitez vous saisir (<100)?\n");
        scanf("%d",&n);
     
        printf("Saisir les nombres :\n");
        for(i=0;i<n;i++)
        {
            printf("t[%d]=",i);
            scanf("%f",&t[i]);
        }
        /*Tri*/
        for(i=0;i<0;i++)
        {
            x=t[i];
            k=i;
            for(i=i+1;j<n;j++)
            if(x>t[j])
            {
                x=t[j];
                k=j;
            }
            if(k!=i)
            {
                t[k]=t[i];
                t[i]=x;
            }
        }
    /*Sortie des valeurs du tableau trié*/
    for(i=0;i<n;i++)
    printf("t[%d]=%f\n",i,t[i]);
    }
    voilà les modification effectuées, bien entendu le programme ne compile pas, sinon ce topic n'existerai, je fais appel à votre savoir pour m'aiguiller dans la réalisation de mon devoir. Merci
    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
    #include <stdio.h>
    #include <stdlib.h>
    main()
    {
        int i,j,k,n;
        char t[100],x;
     
        printf("Combien de chaînes souhaitez vous trier (<100)?\n");
        scanf("%d",&n);
     
        printf("Saisir les chaînes :\n");
        for(i=0;i<n;i++)
        {
            printf("t[%d]=",i);
            scanf("%s",t[i]);
        }
        /*Tri*/
        for(i=0;i<0;i++)
        {
            x=t[i];
            k=i;
            for(i=i+1;j<n;j++)
            if(x>t[j])
            {
                x=t[j];
                k=j;
            }
            if(k!=i)
            {
                t[k]=t[i];
                t[i]=x;
            }
        }
    /*Sortie des valeurs du tableau trié*/
    for(i=0;i<n;i++)
    printf("t[%d]=%s\n",i,t[i]);
    }

  2. #2
    Membre émérite
    Avatar de mitkl
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 364

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Citation Envoyé par sk8trasher Voir le message
    Je dois (...) transformer le programme ci-dessous, pour qu'il tri des char alphabétique à la place des float.
    Déjà le code "à adapter" n'est pas bon
    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
        /*Tri*/
        for(i=0;i<0;i++)  // rentre jamais dans la boucle, mettre i<n
        {
            x=t[i];
            k=i;
            for(i=i+1;j<n;j++)  // il faut initialiser j (plutôt que i) j=i+1
            if(x>t[j])
            {
                x=t[j];
                k=j;
            }
            if(k!=i)
            {
                t[k]=t[i];
                t[i]=x;
            }
        }
    Citation Envoyé par sk8trasher Voir le message
    voilà les modification effectuées, bien entendu le programme ne compile pas, sinon ce topic n'existerai
    Eh bien ce topic ne devrait pas exister, puisque ce code compile sans problème, par contre l'exécution c'est une autre histoire.

    Déjà il faut que tu sois au clair avec ce que tu veux faire, le titre du topic est "Tri de chaîne de caractères" puis tu nous dit que tu veux un code qui "tri des char", c'est pareil dans le code tu déclares un tableau de char (char t[100]) puis tu le remplis comme si c'était un tableau de chaine de caractères (scanf("%s",t[i]);) après avoir demandé à l'utilisateur de "Saisir les chaînes" et enfin, lors du tri, tu compares les éléments du tableaux comme des char (en tout cas pas comme des chaines qui nécessitent l'utilisations de fonctions de comparaison comme strcmp)

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 90
    Par défaut
    J'ai bien pris note des quelques modifications à apporter à ma source. Je l'ai adapté pour que le programme effectue un tri de char plutôt que de float. Et là je ne cerne pas pourquoi il ne veux pas compiler.
    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
    #include <stdio.h>
    #include <stdlib.h>
    main()
    {
        int i,j,k,n;
        char t[100],x;
     
        printf("Combien de chaînes souhaitez vous trier (<100)?\n");
        scanf("%d",&n);
     
        printf("Saisir les chaînes :\n");
        for(i=0;i<n;i++)
        {
            printf("t[%d]=",i);
            scanf("%s",t[i]);
        }
        /*Tri*/
        for(i=0;i<0;i++)
        {
            x=t[i];
            k=i;
            for(j=i+1;j<n;j++)
            if(x>t[j])
            {
                x=t[j];
                k=j;
            }
            if(k!=i)
            {
                t[k]=t[i];
                t[i]=x;
            }
        }
    /*Sortie des valeurs du tableau trié*/
    for(i=0;i<n;i++)
    printf("t[%d]=%s\n",i,t[i]);
    }
    voilà ce que répond le termional
    ||In function ‘main’
    |15|attention : format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat]|
    |36|attention : format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int’ [-Wformat]|
    ||=== Build finished: 2 errors, 0 warnings ===|
    Qu'est ce qui ne marche pas ? Je comprend pas pourquoi ? Après pensez vous que l'adaptation est bonne ?

  5. #5
    Membre émérite
    Avatar de mitkl
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 364
    Par défaut
    J'ai du mal à saisir certaines choses, c'est pas clair et je pense que c'est pas clair non plus dans ta tête. Apparemment, tu veux pouvoir trier des chaines de caractères. Au lieu de parler d'un tri de char, il faudrait mieux parler d'un tri de char* qui correspond déjà plus à une chaine de caractère non ?

    Après, on ne trie pas des chaine de caractères comme on trie des floats, il n'y a pas d'opérateur de comparaison sur les chaines de caractères en C qui permet de faire chaine1 > chaine2. Il va donc falloir faire plus de code et non simplement changer float en char* pour que ça fonctionne.

    Pour tes erreurs, elles sont explicites, t est un char[100]. Au moment du formatage du scanf, tu mets %s, il s'attend donc à écrire le résultat de l'entrée utilisateur dans un char* et non char comme tu le précises avec t[i].

    Afin de mieux t'y retrouver, tu devrais d'abord écrire au papier ton algo, ça te donnera une meilleure vision du résultat attendu.

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 90
    Par défaut
    En effet ce n'est pas très clair dans mon crâne. Merci des conseils, je vais bosser mon algorithme.

    Citation Envoyé par mitkl
    Au moment du formatage du scanf, tu mets %s, il s'attend donc à écrire le résultat de l'entrée utilisateur dans un char* et non char comme tu le précises avec t[i].
    Quelle est la différence entre char et char* ? (ça sent le pointeur) et comment faire correspondre la saisie de l'utilisateur.avec char*., lors du scanf ?
    Merci.

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Ce programme compile chez moi, avec 2 warnings : un pour le prototype de main, un pour le premier scanf (bizarre qu'il ne dise rien pour le 2e), mais ce sont des warnings, pas des erreurs !
    J'ai testé chez moi, gcc (version 4.6.1) ne me dit rien du tout après il est relativement permissif.

    Citation Envoyé par Bktero Voir le message
    Il faut totalement revoir la gestion de la mémoire et des types de données utilisés. Un papier, un crayon, met tes idées au clair !
    C'est la voie de la sagesse.

    Citation Envoyé par sk8trasher Voir le message
    Quelle est la différence entre char et char* ?
    Franchement ce genre de question mérite mieux qu'un post sur un forum, il faut vraiment lire un tutoriel ou un bouquin (pourquoi pas le bon vieu K&R) voir tes cours (je peux pas croire que le prof n'ais pas aborder les types)

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Quel compilateur utilises-tu et avec quels options ?

    Ce programme compile chez moi, avec 2 warnings : un pour le prototype de main, un pour le premier scanf (bizarre qu'il ne dise rien pour le 2e), mais ce sont des warnings, pas des erreurs !

    Un programme ne compile pas quand il génère une erreur de compilation. En revanche, il peut compiler avec des warnings (qui sont souvent des erreurs de programmation). Or, ton compilation met bien des "attention"s, mais finit par "||=== Build finished: 2 errors, 0 warnings ===|"

    Il faut totalement revoir la gestion de la mémoire et des types de données utilisés. Un papier, un crayon, met tes idées au clair !


    Enfin, je n'ai pas compris l'intérêt d'ouvrir une nouvelle discussion pour demander la même chose que dans la discussion précédente, et visiblement sans avoir pris en compte ce qu'on avait dit dans celle-ci.

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Citation Envoyé par sk8trasher Voir le message
    J'ai bien pris note des quelques modifications à apporter à ma source.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        char t[100],x;
    (...)
            scanf("%s",t[i]);
    (...)
            if(x>t[j])
    Qu'est-ce que ça aurait été si tu n'en avais pas pris note?

    Citation Envoyé par sk8trasher Voir le message
    je ne cerne pas pourquoi il ne veux pas compiler.
    Tu as un compilateur assez scrupuleux (la plupart laissent passer ce genre de choses) et assez explicite, même si il ne différencie pas char et int il te dit à peut près ce que j'avais écrit (déclares un tableau de char, puis tu le remplis comme si c'était un tableau de chaine de caractères) et que vient de repréciser mitkl.

    Citation Envoyé par sk8trasher Voir le message
    Je l'ai adapté pour que le programme effectue un tri de char plutôt que de float.
    dans ce cas il te suffit de changer la saisie des char entrés par l'utilisateur (encore qu'avec un scanf dans une boucle tu risques de t'amuser un peu mais essaye de faire un effort, Bktero t'as fourni un lien vers un bon tutoriel sur le sujet dans ton topic précédent)

Discussions similaires

  1. Tri de chaînes de caractères : Optimiser vitesse ?
    Par Gilbert Geyer dans le forum Langage
    Réponses: 47
    Dernier message: 29/10/2013, 09h39
  2. Tri de chaîne de caractére
    Par lekaf974 dans le forum Langage
    Réponses: 6
    Dernier message: 19/03/2013, 01h07
  3. Tri de chaînes de caractères
    Par zizou.r23 dans le forum Débuter
    Réponses: 4
    Dernier message: 11/02/2013, 11h56
  4. Tri sur une chaîne de caractères contenant des nombres
    Par arnaud_verlaine dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/05/2006, 11h52
  5. tri par corrélation entre chaînes de caractères
    Par petitmic dans le forum Langage SQL
    Réponses: 7
    Dernier message: 09/09/2005, 15h15

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