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 caractères


Sujet :

C

  1. #1
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut tri de caractères
    Bonjour,

    Ce programme effectue le tri de caractères saisis par l'utilisateur
    La saisie des caractères renvoie une erreur de Microsoft . Je ne comprends pas pourquoi ?

    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
    #include<stdio.h>
    #include<string.h>
     
    int main()
    {
    	int I,J,K,N,CMP;
    	char T[100],X;
     
    	/*saisie du nombre de caractères à trier*/
    	printf("combien y a-t-il de caracteres a trier ? :");
    	scanf("%d",&N);
     
    	/*saisie des caractères*/
    	printf("entrez les caracteres\n");
    	for(I=0;I<N;I++)
    	{
    		printf("T[%d]=",I);
    		scanf("%d",&T[I]);
    	}
     
    	/*boucle de tri*/
    	for(I=0;I<N-1;I++)
    	{
    		X=T[I];
    		K=I;
     
    		for(J=I+1;J<N;J++)
    		{
    			CMP=strcmp(X,T[J]);
    			if(CMP>0)//si X est plus grand que T[J] alors CMP>0
    			{
    				X=T[J];
    				K=J;
    			}
    		}
    		if(K!=i)
    		{
    			T[K]=T[I];
    			T[I]=X;
    		}
    	}
     
    	/*affichage du résultat*/
    	printf("\nle tri donne : \n");
     
    	for(I=0;I<N;I++)printf("T[%d]=%c\n",I,T[I]);
     
    	return 0;
    }
    Je pense que c'est cette partie qui est incriminée mais je ne vois pas pourquoi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /*saisie du nombre de caractères à trier*/
    	printf("combien y a-t-il de caracteres a trier ? :");
    	scanf("%d",&N);
     
    	/*saisie des caractères*/
    	printf("entrez les caracteres\n");
    	for(I=0;I<N;I++)
    	{
    		printf("T[%d]=\n",I);
    		scanf("%c",&T[I]);
    	}

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Vao,

    Déjà, ça ne doit pas compiler : tu utilises I et i, qui pour le C ne sont pas la même chose.

    Ensuite, pourquoi faire une entrée caractère par caractère plutôt que simplement lire une chaîne ?

    Et habituel : main() n'est pas une forme valide de cette fonction.

  3. #3
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    Dans mon programme j'ai bien mis I dans les T[] mais il semble que quand je colle dans le forum ça change automatiquement le I en i ?

    Ensuite dans la compilation ça me met T[o]=T[1]= et ça me met le rapport d'erreur quand je tape entrée ?

  4. #4
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    strcmp ça sert à comparer des chaines de caractères (tableau de char à zero terminal) pas des charactères individuels (char)

  5. #5
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    En fait le problème a l'air de venir de la saisie des données
    Voilà ce que la compilation me donne :

    Ce n'est pas normal que ça m'affiche T[o]=T[1]?
    Fichiers attachés Fichiers attachés

  6. #6
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    En fait je dois réécrire le programme suivant en l'adaptant pour des chaînes de caractères (le programme pour les nombres fonctionne convenablement)

    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<string.h>
     
    main()
    {
    	int i,j,k,n;
    	float t[100],x;
     
    	printf("combien y a-t-il de nombres a trier ? : ");
    	scanf("%d",&n);
     
    	printf("entrer les nombres :\n");
    	for(i=0;i<n;i++)
    	{
    		printf("t[%d]=",i);
    		scanf("%f",&t[i]);
    	}
     
    	for(i=0;i<n;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;
    			}
    	}
     
    	for(i=0;i<n;i++)printf("t[%d]=%f\n",i,t[i]);
    }

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    Janvier 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 81
    Par défaut
    Le problème vient tout simplement du fait que tu ne vide pas le flux en entrée entre chaque scanf ...

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    #include <stdlib.h>
    #include <stdio.h>
     
    /*
     * Alloue la mémoire nécessaire à notre tableau
     */
    void init(char **t,int n)
    {
    	*t = (char *) malloc(n*sizeof(char));
    }
     
    /*
     * Libère l'espace mémoire réservé au tableau
     */
    void liberer(char **t)
    {
    	free(*t);
    	*t = NULL;
    }
     
    /*
     * Récupère nos n valeurs dans le tableau
     */
    void recuperer(int n,char **t)
    {
    	int i=0;
    	char c;
     
    	for(;i<n;i++)
    	{
    		printf("t[%d]=",i);
    		scanf("%c",&(*t)[i]);
    		while(getchar() != '\n'); /* Vide le flux en entrée */
    	}
    }
     
    /*
     * Tri les valeurs selon l'algorithme désiré
     */
    void tri(char **t,int n)
    {
    	int i,j,k;
    	char x;
     
    	for(i=0;i<n;i++)
    	{
    		x=(*t)[(k=i)];
     
    		for(j=i+1;j<n;j++)
    			if(x>(*t)[j])
    				x=(*t)[(k=j)];
     
    		if(k!=i)
    		{
    			(*t)[k]=(*t)[i];
    			(*t)[i]=x;
    		}
    	}
    }
     
    /*
     * Affiche les valeurs
     */
    void affiche(char *t,int n)
    {
    	int i=0;
     
    	for(;i<n;i++)
    		printf("t[%d]=%c\n",i,t[i]);
    }
     
    int main(void)
    {
    	char c; /* Une variable qui servira à vider le buffer d'entrée */
    	char *t; /* Le tableau qui va contenir les char */
    	int n; /* Le nombre d'éléments attendus */
     
    	printf("Combien y a-t-il de nombres a trier?\n> ");
    	scanf("%d",&n); /* On reçoit le nombre de valeurs à trier */
    	while(getchar() != '\n'); /* Le flux entrant a toujours au moins un \n, on doit le récupérer pour vider le flux afin d'assurer le fonctionnement correct du prochain scanf */
    	init(&t,n);
    	printf("Entrez les nombres:\n");
    	recuperer(n,&t);
    	tri(&t,n);
    	printf("Après tri:\n");
    	affiche(t,n);
    	liberer(&t);
    	return 0;
    }

  8. #8
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    Je te remercie pour ton programme mais je pense pas que cela soit la solution à mon problème

    Dans mon exercice je dois réécrire quasiment le même programme avec des caractères que celui présenté avec les nombres .
    En plus comment ça se fait que le programme avec les nombres fonctionne (sans vider le buffer ) et que celui avec les caractères ne fonctionne pas ? Est ce un problème d'identification des variables ?

  9. #9
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    Janvier 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 81
    Par défaut
    En regardant l'aide de scanf tu pourras voir que :
    • %d attend un entier et vide ensuite le flux qui ne lui sert à rien
    • %c n'attend malheureusement pas un seul caractère mais une séquence de caractères, la fonction récupère au final un seul caractère mais les autres caractères restent stockés dans le flux pour une utilisation ultérieure (si besoin) ...


    Mon programme n'est pas différent du tien, j'ai juste séparé les différentes méthodes pour que ça soit plus lisible. Mais rien ne t'empêche de remettre le contenu des différentes méthodes dans la main() ...

  10. #10
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    Je te remercie ça fonctionne super bien

  11. #11
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Pour les fonctions liberer, recuperer et tri, tu n' es pas obliger de passer un pointeur de pointeur sur le tableau t car ces fonction ne modifie pas le pointeur.
    le code s'en trouve un peu plus simple à lire.

  12. #12
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    Janvier 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 81
    Par défaut
    Mes profs d'informatiques me disent de toujours d'utiliser un pointeur de pointeur lorsque l'on fait de l'écriture dans la fonction car le tableau risque d'être déplacé en mémoire...
    Peut être que ça n'arrive pas souvent (voir jamais) du fait du grand espace mémoire disponible sur les machines maintenant... mais en cas d'application sur de plus "petites" machines peut être que ça joue

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

Discussions similaires

  1. Ordre tri sur caractère tchèque
    Par shadeoner dans le forum Oracle
    Réponses: 1
    Dernier message: 29/11/2007, 19h53
  2. Tri chaine caractère et insertion
    Par Maillon dans le forum Linux
    Réponses: 1
    Dernier message: 16/11/2007, 12h41
  3. [hibernate] tri sur caractères spéciaux
    Par Fr@ncky dans le forum Hibernate
    Réponses: 4
    Dernier message: 11/09/2007, 16h50
  4. [SQL2K]URGENT: récupérer jeu de caractères et ordre de tri ?
    Par webtheque dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/04/2005, 11h43
  5. [ORDER BY]tri sur le dernier caractère d'un champ
    Par Tan dans le forum Langage SQL
    Réponses: 3
    Dernier message: 03/05/2004, 14h39

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