Bonjour j aimerais savoir comment proceder pour faire un tri sur une chaine de caracteres...
Comparer leur premier caractere....
merci wil
Version imprimable
Bonjour j aimerais savoir comment proceder pour faire un tri sur une chaine de caracteres...
Comparer leur premier caractere....
merci wil
Salut, tu pourrais préciser exactement ce que tu veux faire, tu parles d'une comparaison sur une chaîne de caractère puis sur deux...
Pour comparer deux chaines : str*cmp
Pour faire un tri quelconque : qsort
Si tu veux d'avantage de reponses, donne plus de details
++
Pouic
Tu veux comparer deux chaînes de caractères pour savoir si elles sont égales, différentes...Il esxiste la fontion strcmp pour ça.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #include <string.h> int main() { int p; char *Etalon = "Etalon"; char *Deuxio = "Autre"; char *Egal = "Etalon"; if (strcmp(Etalon,Deuxio) != 0) printf("%s est différente de %s\n",Etalon,Deuxio); if (strcmp(Etalon,Egal) == 0) printf("%s est égale à %s\n",Etalon,Deuxio); scanf("%d",&p); }
Citation:
Envoyé par wil4linux
avec qsort() et strcmp() dans la fonction de comparaison. Bien lire la doc, c'est un peu piégeux...Citation:
Envoyé par wil4linux
Je reformule + precisement.
Je dispose d'un tableau de type contact, caractérisé par un nom, prenom, telephone, où le nom prenom et tel sont des char[40]
j aimerai faire diferente fonctions sur ce tableau dont un tri par ordre alphabétique sur le nom.
et par la suite, les afficher selon la premiere lettre:
A:
arnaud...
B:
berangere
bernard
....
C'est un tableau multidimensionnel?
(Je te conseille les listes chaînées).
Montres-nous comment tu codes ton tableau "contact" avec les "char[40]"
:koi:
Bonjour,
Les questions que vous posez m'intéressent beaucoup.
Cependant il faudrait nous en dire plus. Que voulez-vous savoir excatement.
Ce que je sais c'est que pour trier un tableau de chaînes, par ordre alphabétique sans distinguer les majuscules des miniscules il faut utiliser le fonction stricmp et non strcmp.
c est un tableau de liste chainée.
je met le code a l arrache ( c un *.h):
Code:
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145 typedef char chaine[40]; class contact{ private: chaine nom; chaine prenom; chaine tel; public: contact(){ // constructeur strcpy(nom,""); strcpy(prenom,""); strcpy(tel,""); } void afficher_contact(){ printf("\nNom: %s",nom); printf("\nPrenom: %s",prenom); printf("\nTelephone: %s",tel); } char * getnom(){ return nom; } char * getprenom(){ return prenom; } char * gettel(){ return tel; } void setnom(chaine n){ strcpy(nom,n); } void setprenom(chaine p){ strcpy(prenom,p); } void settel(chaine t){ strcpy(tel,t); } }; //-------------------Class Repertoire--------------------- class repertoire{ private: int nbc; contact tab[N]; public: repertoire(){ // constructeur nbc=0; } int new_contact(chaine n, chaine p, chaine t); int ajouter_contact(contact c); // ajouter les enr du fichier ds le tableau contact int supprimer_contact(chaine n); char * afficher_nom_contact(int i); char * afficher_prenom_contact(int i); char * afficher_tel_contact(int i); void afficher_repertoire(); void tri_nom(); void tri_prenom(); int nb_contact(); void rechercher_nom(chaine n); void rechercher_prenom(chaine p); void rechercher_tel(chaine t); }; //---le '::' c'est l indicateur de portée. int repertoire::new_contact(chaine n, chaine p, chaine t){ int add; if(nbc<N-1){ nbc++; tab[nbc].setnom(n); tab[nbc].setprenom(p); tab[nbc].settel(t); add=1; } else{ add=0; } return add; } int repertoire::ajouter_contact(contact c){ int b=0; if(nbc<N){ tab[nbc]=c; nbc++; b=1; } else{ b=0; } return b; } int repertoire::supprimer_contact(chaine n){ int i; return i; } char * repertoire::afficher_nom_contact(int i){ return tab[i].getnom(); } char * repertoire::afficher_prenom_contact(int i){ return tab[i].getprenom(); } char * repertoire::afficher_tel_contact(int i){ return tab[i].gettel(); } void repertoire::afficher_repertoire(){ int i; if(nbc==0){ printf("\nLe prepertoire est vide"); } else{ for(i=0;i<nbc;i++){ printf("\n\nNom: %s\nPrenom: %s\nNote: %f",tab[i].getnom(),tab[i].getprenom(),tab[i].gettel()); } } } void repertoire::tri_nom(){ } void repertoire::tri_prenom(){ } int repertoire::nb_contact(){ return nbc; } void repertoire::rechercher_nom(chaine n){ pas encore fait } void repertoire::rechercher_prenom(chaine p){ pas encore fait } void repertoire::rechercher_tel(chaine t){ pas encore fait }
:tagcode:Citation:
Envoyé par wil4linux
pas du C...Citation:
class contact{
<edit>
Oups, j'avais pas vu le déplacement sur le forum C++. Désolé
Je sors...
</edit>
ce sont les methode tri_nom(), tri_prenom(), que j aimerais faire.
c'est donc un tableau de liste chainé en fait je l'instancie dans mon programme principal. Je vais chercher des enregistrements dans un fichier, puis j'instancie le tableau avec la methode ajouter_contact(contact c)
Il y a quelques petites fautes de compilation. Ne vous inquitez pas, je n'ai pas encore tout résolu.
Hum ... Pour du C++, il y a diverses choses à reprendre -- certaines l'étaient aussi en C.
En C++ correct (pas de débordements, pas de risques d'exceptions non contrôlées, pas de pointeurs nuls, const-correct, ...) et rapidement pondu, cela donne:
Tu devrais trouver la même chose à peu près dans la FAQ.Code:
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 #include <string> // std::string #include <algorithm> // std::sort, std::copy #include <vector> // std::vector #include <iterator> // std::ostream_iterator #include <iosfwd> // std::ostream struct contact { contact (std::string & const nom /* etc, autres champs*/) : nom_(nom) // voir "liste d'initialisation" {} // pas besoin de destructeur. // les constructeur et operateur de recopie générés par défaut suffisent // Je garde la paire accesseur/mutateur, mais c'est discutable ici std::string & const getNom() const { return nom_; } void setNom(std::string & const nom) { nom_ = nom; } private: std::string nom_; //!< Le nom .... }; std::ostream& operator<<(std::ostream & os, contact const & c) { return os<< c.getNom(); } struct SuivantNom { bool operator()(contact const & lhs, contact const & rhs) const { return lhs.getNom() < rhs.getNom(); } }; struct repertoire { void ajoute_contact(std::string & const nom /* etc, autres champs*/) { contacts_ . push_back( contact(nom) ) ; } void trier_suivant_nom() { std::sort(contacts_.begin(), contacts_.end(), SuivantNom()); } friend std::ostream & operator<<( std::ostream & os, repertoire const & r) { std::copy(r.contacts_.begin(), r.contacts_.end(), std::ostream_iterator<contact>(os, "\n")); return os; } .... private: std::vector<contact> contacts_; }; ..... ailleurs comme dans un main qui inclut <iostream> (sans .h!!!) repertoire r; r.ajoute_contact("toto"); r.ajoute_contact("titi"); r.trier_suivant_nom(); std::cout << r;
Comme te le montre Luc Hermitte, en C++ on utilise les conteneurs (STL) afin de s'affranchir du travail plutôt "laborieux" des listes chaînées.
Malgré tout, l'utilisation des listes chaînées est un très bon exercice de programmation.
Si tu codes en C++, prends le temps de lire ce document:
http://www.developpez.biz/download/stl.pdf
Si tu tiens vraiment à le programmer "à la C", et que tu postes dans le forum C, alors ne donnes que du code en C. Sinon c'est la redirection obligatoire...
En C++, on va surtout te conseiller d'utiliser les outils et les concepts du C++. Ce n''est pas évident au début mais après c'est un vrai régal.
merci bcp, mais je suis bien habituer a la structure du c, il est vrai que je comprend pas grand chose au code ci dessus...lol
je sens ke je vais me tartiner de la doc.......
Bonjour
Avez vous la possibilité de me trouver un cours en ligne sur les tableaux de structures.
J'aimerai tous apprendre : les structures puis les différentes manipulations qu'on peut effectuer sur les tableaux de structures.
Merci pour vos réponses.
Poses cette question dans le forum C.
Nous t'avons déjà orienté vers les conteneurs.
Si tu tiens vraiment a utilisé des tableaux de structure va dans le forum C. Tu auras plus de réponse.
D'ailleurs on va surtout te conseiller des listes chaînées de structure.
Bonne chance.
Arf... Je me suis trompé de personne.
Ben suis mon conseil. Pourquoi tu n'as pas créé un nouveau message?