Fonction en language C - C - Programmation
Marsh Posté le 16-11-2011 à 21:27:55
Le principe du test est correct, a condition de mettre les bonnes parenthèses (car || et && ont la même priorité il me semble).
Ce qui est faux, c'est que tu mélanges tes données avec quelque chose qui n'a rien a voir (un flag qui dit si on a trouvé autre chose dans la chaine), et ça, ça ne peut qu'introduire des problèmes.
Autre détail, on n'avance guère dans ta chaine
A+,
Marsh Posté le 17-11-2011 à 00:26:13
Merci pour ton aide !
Vu que la base est bonne j'ai travailler toute la soirée dessus...sans succès
Voilà ce que j'ai actuellement :
int verif(char *chaine)
{
int i=0;
*chaine[i]=VRAI;
while(*chaine[i]==VRAI)
{
while(*chaine[i]!='\0')
{
if((*chaine[i]>=97&&*chaine[i]<=122)||(*chaine[i]>=65&&*chaine[i]<=90)
{
*chaine[i]=VRAI;
i++;
}
else
*chaine[i]=FAUX;
}
}
}
et dans le main :
for(i=0;i<n;i++)
{
printf("Introduisez le nom du client %d:\n",i+1);
gets(source_nom[i]);
verif(&source_nom[i]);
//si FAUX demander de réencoder le nom
}
Quand je compile j'ai "invalid type argument of `unary *" pour *chaine[i]=VRAI;
J'ai du mal avec les fonction et les pointeurs
Marsh Posté le 17-11-2011 à 04:22:13
Code :
|
Ça a pourtant bien progressé par rapport a la version précédente, mais c'est bourré d'erreurs.
Une première version
Code :
|
Comment ça s'améliore?
déja, on peut remplacer
(verifok && (chaine[i]!= 0))
par
(verifok && chaine[i])
car dans un test, tester (chaine[i]!= 0) ou tester (chaine[i]) c'est équivalent.
On peut aussi tester sur les valeurs explicites des caractères, afin de rendre le code plus compréhensible.
On peut donc écrire une seconde version
Code :
|
Enfin, plutôt que d'utiliser un indice de tableau, on peut faire cela avec une notation de pointeur:
Code :
|
Et en fait, vu qu'on utilise nulle part chaine ailleurs que pour initialiser p, on peut encore simplifier
Code :
|
Il manque plus qu'une chose, vérifier que l'argument passé était valable et qu'on avait le droit de l'utiliser, bref, vérifier que chaine n'était pas le pointeur NULL
Et penser au cas limite ou la chaine ne contient pas de caractère (ici une chaine vide renvoie 1)
Code :
|
La ça commence a être une version utilisable.
Ensuite, si on réfléchit un peu plus, on peut virer le flag et aboutir à ceci:
Code :
|
A+,
Marsh Posté le 17-11-2011 à 10:17:35
gilou a écrit : car || et && ont la même priorité il me semble |
&& est prioritaire sur || et leur priorite est basse, plus basse que les operateurs de comparaison. Leur comportement est donc assez intuitif (si on se souvient que && est comparable a la multiplication et || a l'addition pour retrouver leur priorite relative).
Ce qui est piegeux, c'est & et | (et ^) qui ont aussi une priorite plus basse que les operateurs de comparaison, ce qui est peu intuitif. D'autant plus que je ne connais pas de raisons expliquant la priorite relative de ^ par rapport a & et | (il se trouve au milieu, mais j'ai du verifier).
Marsh Posté le 17-11-2011 à 10:57:47
Un Programmeur a écrit : && est prioritaire sur || |
Merci, c'est le genre de truc que j'ai jamais fait l'effort de retenir, le degré de priorité relative entre || et &&.
Chaque fois que j'ai un test mélangeant les deux, je parenthèse.
Ça ne manger pas de pain, et c'est bien plus lisible pour qui relit le code derrière.
A+,
Marsh Posté le 17-11-2011 à 11:13:57
gilou a écrit : Merci, c'est le genre de truc que j'ai jamais fait l'effort de retenir, le degré de priorité relative entre || et &&. |
Je fais comme toi. Je l'ai retenu parce que je suis passe derriere trop de monde qui ne le faisait pas.
Marsh Posté le 18-11-2011 à 01:13:24
Wow ! Merci Gilou pour cette explication détaillée !
Je vais étudier tout en détail dès demain puis je vais laisser macérer 1 jours ou deux dabs ma ptite tête et ensuite j'essayerai de le réécrire dans mon code. Comme ça je verrai si j'ai bien assimilé tout ça!
Encore merci
Marsh Posté le 10-12-2011 à 12:06:20
Vla la fonction que je vais utiliser (il faut qu'elle corresponde à mon niveau (1ere année) )
Code :
|
J'ai pas réussi à intégrer le fait de ne pas avoir de chaine vide dans le if de la boucle while (ligne 9) j'ai donc ajouté un if avant la boucle qui vérifie que la chaine ne soit pas vide. Est-ce une bonne manière de fonctioner ? (toujours en prenant en compte qu'il s'agit d'un projet de 1ere année)
Marsh Posté le 10-12-2011 à 12:42:09
Le "if" ligne 5 ne sert à rien. Si la chaîne est vide il ne rentrera pas dans la boucle.
Pas la peine de tester (verifok==1), (verifok) suffit : Vrai si différent de 0.
Idem pour (chaine[i]!='\0')
La boucle sert à savoir si le i eme caractère est OK.
Pas besoin de if, on met directement le résultat dans verifok.
On compare les caractères de la chaîne avec un caractère litéral plutôt qu'avec un entier.
Comme çà ton prog fonctionne aussi bien en EBCDIC qu'en ASCII
Donc :
Code :
|
Marsh Posté le 26-12-2011 à 15:42:45
re Bonjour.
J'ai un autre problème avec une de mes fonction.
Cette fois-ci je n'arrive pas à trier un tableau.
Voici mes fonctions :
Code :
|
dans le main j'ai un tableau tri_nom que j'envoi dans la fonction tri :
Code :
|
n étant le nombre de nom que l'utilisateur a choisis d'encoder
quand je compile j'ai ce message :
Citation : Compiler: Default compiler |
La ligne 110 correspond ici à la ligne 38 et 232 à la ligne 2
Merci d'avance pour le temps que vous prendrez à m'aider
PS : Je ne demande pas d'écrire le code pour moi (c'est mon projet de fin de cours) mais de m'expliquer quelle est mon erreur.
Marsh Posté le 26-12-2011 à 17:25:58
t'es obligé de réinventer la roue ? tu peux pas utiliser strncmp ?
Marsh Posté le 26-12-2011 à 17:28:21
La fonction tri(...) ne semble pas être dans le même fichier que celui qui contient le main(...)
Si c'est bien le cas, il faudrait déclarer le prototype de la fonction tri(...) dans le fichier du main(...) par une ligne :
extern void tri(char *chaine, int n); |
Marsh Posté le 27-12-2011 à 01:56:39
@Tamahome : oui je suis obligé de réinventer la roue, je ne peux pas utiliser la bibliothèque string.h pour ce projet .
@olivthill : non, tout est bien dans le même fichier, on a pas encore appris à travailler dans des fichiers différents pour le moment (1ere année)
Marsh Posté le 29-12-2011 à 18:31:14
Hello, j'ai un ptit peu avancé mais ce n'est pas encore ça...
j'ai donc 3 fonctions :
- une fonction strcopy qui copie une chaine dans une autre
- une fonction strcomp qui compare les chaines de caractères (renvoi -1 si il faut permuter)
- et la fonction tri en elle même
Alors, très certainement que je m'embrouille dans les pointeurs car je ne maitrise pas encore parfaitement (ou pas du tout... )
J'ai aussi un soucis quand je je copie la chaine lorsqu'il faut inverser, le résultat est....déconcertant
Poutant ma fonction strcopy fonctionne parfaitement l'ayant tester à part.
Idem pour la fonction strcomp qui fonctionne parfaitement tester à part.
Code :
|
Marsh Posté le 16-01-2012 à 00:40:35
Bonjour,
Il faut prendre en compte le type du tableau dans le prototype de tri.
Les donnees en mémoire sont organisées comme ceci:
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA(31 chars)BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB(etc.) |
càd chaque sous-indice à la queue leu leu (N blocs de 31).
tab n'est pas un tableau de char* mais un multi-dim, nuance !
tri() ne peut pas le savoir si on ne lui indique pas, lorsqu'on écrit tab[i], quel est le pas de chasse.
chaine1\0....................... |
Donc le proto ce serait plutôt :
Code :
|
ou bien
Code :
|
et l'appel:
Code :
|
D'autre part le bubblesort m'a l'air suspect, normalement sa complexité est O(n2) et pas O(n).
Il me semble qu'il manque une sous boucle je crois.
Désolé mes souvenirs de C sont hyper lointains ^^
Edit: Ah, ok, la boucle se situe au niveau du main().
Marsh Posté le 16-01-2012 à 10:31:30
Merci pour ces explications
Ca commence tout doucement à rentrer dans ma ptite tête
Marsh Posté le 16-11-2011 à 20:09:00
Bonjour
Je cherche à écrire une fonction qui lis une chaine de caractère et vérifie qu'elle ne contient que les 26 lettres de l'alphabet non accentuée.
Après plusieurs essais infructueux, je me tourne vers vous.
J'avais pensé à faire une truc du genre :
#define VRAI 1
#define FAUX 0
int verif(char *chaine)
{
*chaine=VRAI
while(*chaine==VRAI)
{
while(*chaine!='\0')
{
if((*chaine>=97&&*chaine<=122||*chaine>=65&&*chaine<=90)
*chaine=VRAI
else
*chaine=FAUX
}
}
}