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 lexicographique des chaînes de caractères


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Student
    Inscrit en
    Novembre 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Student

    Informations forums :
    Inscription : Novembre 2018
    Messages : 35
    Points : 28
    Points
    28
    Par défaut Tri lexicographique des chaînes de caractères
    Bonsoir les amis ..
    je veux trier 10 mots lexicographiquement mais ça ne marche pas même si j'ai pas d'erreur ..
    voila 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
     
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
     
    main()
    {
    	int i ,j, imax ; 
    	char str[10][20] , aide[20] ; //aide est une variable pour permuter
    	for(i=0;i<10;i++)
    	{
    		printf("Saisir le mot numero %d : ",i+1);
    		scanf("%s",str[i]);
    	}
    	/* on utilise le tri par max */
    	for(i=0;i<9;i++)
    	{
    		imax=i ; //initialiser le imax par i a chaque itteration
    		for(j=i+1;j<10;j++)
    		{
    			if(strcmp(str[imax],str[j])<0) // ordonner alphabetiquement
    			{
    				imax=j ;
    			}
    		}
    		/* echange */
    		strcpy(aide[20],str[i]);  //la fonction strcpy pour copier 
    		strcpy(str[i],str[imax]);
    		strcpy(str[imax],aide[20]);
    	}
    	for(i=0;i<10;i++) // affichage ! 
    	{
    		printf("%s",str[i]);
    		printf("\n");
    	}
    	return 0 ;
    }
    vos remarques ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    C'est un tri par sélection que tu as loupé Tri par sélection (<- lien wiki en français)

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Student
    Inscrit en
    Novembre 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Student

    Informations forums :
    Inscription : Novembre 2018
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    oui je sais .. je l'ai utilise exprès .. ou est le problème ici ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Déjà tes indices de boucles : ton algo fait (N - 1) parcours de ta liste, soit N*(N - 1), au lieu de N! - C'est le principe de l'algo : trouver le maximum/ minimum, le "ranger" et de recommencer sur le reste non trié du tableau.
    Relis le pseudo algo de la page wiki


    N étant le nombre d'éléments de ta liste.

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par MouadCR7 Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    		/* echange */
    		strcpy(aide[20],str[i]);  //la fonction strcpy pour copier 
    		strcpy(str[i],str[imax]);
    		strcpy(str[imax],aide[20]);
    vos remarques ?
    Ici tu as un gros souci. Si "aide" est un tableau de 20 char, alors
    1. ses indices ne vont que de 0 à 19 => aide[20] => pouf pouf badaboum
    2. aide[20] est de type char alors que strcpy() attend un char * => pouf pouf badaboum2 => tu n'as pas bien lu mon chapitre sur les pointeurs et accessoirement tu n'as pas lu non plus les warnings du compilateur (on se demande bien pourquoi lui il se fait ch... à te dire des trucs si tu ne les lis pas !!!)

    Dommage, tu y étais presque d'autant plus que passer str[i] à strcpy() ça c'est bon (sous-entendu que "i" ait la bonne valeur bien évidemment) et que ton algo fonctionne parfaitement (juste qu'il trie par ordre décroissant mais si on le pipe dans la commande Linux "tac" alors on l'a au final dans l'ordre croissant ).

    Citation Envoyé par MouadCR7 Voir le message
    //aide est une variable pour permuter
    Généralement on nomme plutôt ce genre de truc "tmp". Mais là tu aurais pu faire par exemple preuve d'originalité et de maitrise en définissant "str" comme un char str[10 + 1][20] et en utilisant alors str[10] pour tes permutations (les autres str[i] (i allant de 0 à 9) étant eux utilisés pour la saisie)

    Citation Envoyé par MouadCR7 Voir le message
    même si j'ai pas d'erreur
    Le compilateur ne te préviendra jamais des erreurs de logique. Ni même d'erreurs de dépassement de tableau (ex aide[20]='r' ou aide[2000]='p'). Tout ce qu'il fait: il vérifie la syntaxe et si les fonctions appelées existent bien. Le reste, c'est ton affaire. Eventuellement il pourra, si tu le lui demandes, te prévenir sur certains détails jugés dangereux mais rien de plus.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Student
    Inscrit en
    Novembre 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Student

    Informations forums :
    Inscription : Novembre 2018
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    ouaais ... je n'ai pas encore fini le chap des pointeurs xD ..
    en tous cas voila j'ai trouve le probleme grace a vous haha
    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
     
    	for(i=0;i<9;i++)
    	{
    		imax=i ; //initialiser le imax par i a chaque itteration
    		for(j=i+1;j<10;j++)
    		{
    			if(strcmp(str[imax],str[j])>0) // ordonner alphabetiquement
    			{
    				imax=j ;
    			}
    		}
    		/* echange */
    		strcpy(aide,str[i]);  //la fonction strcpy pour copier 
    		strcpy(str[i],str[imax]);
    		strcpy(str[imax],aide);
    	}
    je devrais écrire aide a la place de aide[20] .
    Merci bien (y)

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Student
    Inscrit en
    Novembre 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Student

    Informations forums :
    Inscription : Novembre 2018
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par foetus Voir le message
    Déjà tes indices de boucles : ton algo fait (N - 1) parcours de ta liste, soit N*(N - 1), au lieu de N! - C'est le principe de l'algo : trouver le maximum/ minimum, le "ranger" et de recommencer sur le reste non trié du tableau.
    Relis le pseudo algo de la page wiki


    N étant le nombre d'éléments de ta liste.
    le problème n’était pas dans le sous-algos du tri ..
    il était dans syntaxe de la permutation ... les fonctions de stdlib prennent des adresses c.a.d le nom des tableaux ..
    merci en tous cas

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par MouadCR7 Voir le message
    les fonctions de stdlib prennent des adresses c.a.d le nom des tableaux ..
    On va reformuler ça: les fonctions de la stdlib traitant les chaines doivent recevoir des adresses comme paramètre. Si la chaine est stockée dans un tableau alors le nom du tableau est considéré comme une adresse et ça fonctionne. Mais ce n'est pas la seule façon de leur faire traiter des chaines. strlen("toto") fonctionne bien que ce qu'on lui passe ce ne soit pas un tableau (c'est l'adresse d'une zone statique du code qui contient "toto").

    Mais sinon c'est bien. Tu vas vite y arriver
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Student
    Inscrit en
    Novembre 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Student

    Informations forums :
    Inscription : Novembre 2018
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    effectivement !
    Merci pour ton soutien

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

Discussions similaires

  1. 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
  2. [VBS]Gestion des chaînes de caractères
    Par Edoxituz dans le forum VBScript
    Réponses: 11
    Dernier message: 29/01/2006, 17h07
  3. Gestion des chaînes de caractères
    Par Furius dans le forum VBScript
    Réponses: 5
    Dernier message: 06/01/2006, 15h01
  4. Problème sur des chaînes de caractères
    Par Anonymous dans le forum Access
    Réponses: 9
    Dernier message: 16/09/2005, 08h21
  5. Passage des chaînes de caractères à une application CGI
    Par Thom@s dans le forum Composants VCL
    Réponses: 10
    Dernier message: 03/12/2004, 00h13

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