Ou est l'errreur

Ou est l'errreur - C - Programmation

Marsh Posté le 03-01-2007 à 19:13:45    

bonjour tout le monde et bonne année !
 
voila le programme que je réalise :
 
 
 

Code :
  1. /* TP8 Chaine de caracteres */
  2. #include <stdio.h>
  3. #include <string.h>
  4. #define MAX 50
  5. int control(char c[])
  6. {
  7.     int i,con=0,l;
  8.     l=strlen(c);
  9.     for(i=0;i<l;i++)
  10.     {
  11.                     if((c[i]>='A'&&'Z'<=c[i])||(c[i]>='a'&&'z'<=c[i])||c[i]=='-')
  12.                     {
  13.                     con=1;
  14.                     }
  15.     }
  16.     return con;   
  17. }
  18. void saisie(char n[],char p[])
  19. {
  20.     do
  21.     {
  22.                 printf("entrez votre nom : " );
  23.                 scanf("%s",n);
  24.    
  25.                
  26.     }while(control(p)==0);
  27.    
  28.     do
  29.     {
  30.                 printf("entrez votre prenom : " );
  31.                 scanf("%s",p);
  32.                            
  33.     }while(control(n)==0);
  34. }
  35. void minus(char c[])
  36. {
  37.      int i,max;
  38.      max=strlen(c);
  39.      for(i=0;i<max;i++)
  40.      {
  41.                        if((c[i]>='A')&&('Z'<=c[i]))
  42.                                                 c[i]=c[i]+32;
  43.      }           
  44.    
  45. }
  46. int main(void)
  47. {
  48.     //int cont;
  49.     //char c[MAX];
  50.     //scanf("%s",&c);
  51.     //cont=control(c);
  52.     //printf("\n%d\n",cont);
  53.     char n[MAX],p[MAX];
  54.     saisie(n,p);
  55.     minus(n);
  56.     minus(p);
  57.     printf("\n%s\n",n);
  58.     printf("\n%s\n",p);
  59.     system("PAUSE" );
  60.     return 0; 
  61. }


 
Ce programme est sencé mettre nom et prénom en minuscule , même si on les a donné avec des majuscules .
Mais ca ne marche pas ca me met n'importe quoi pour les minuscules et je n'arrive pas à retrouver l'erreur.
 
Merci d'avance pour  votre aide.

Message cité 1 fois
Message édité par samos38 le 03-01-2007 à 19:14:23

---------------
débute en C
Reply

Marsh Posté le 03-01-2007 à 19:13:45   

Reply

Marsh Posté le 03-01-2007 à 20:25:50    

Une petite erreur qui saute aux yeux :

if((c[i]>='A')&&('Z'<=c[i]))

est équivalent à  

if((c[i]>='A')&&(c[i]>='Z'))

alors que cela devrait être

if((c[i]>='A')&&(c[i]<='Z'))

Reply

Marsh Posté le 03-01-2007 à 20:31:28    

Alors voila faut pas chercher loin :  
 
L'idée est bonne mais pas approfondie :
 
Si au lieu de faire :

Code :
  1. c[i]=c[i]+32;


Tu fesais :

Code :
  1. c[i]=c[i]-32;


ca marcherai...
 
 
Autre solution : utilise les fonctions de String.h pour mettre en minuscule... elles existent !
 
 
Edit : olivthill tu as raison, il y avait un autre probleme ici aussi mais ca marche quand meme our les lettres

Message cité 2 fois
Message édité par Ange_blond le 03-01-2007 à 20:32:58
Reply

Marsh Posté le 03-01-2007 à 21:29:16    

Ange_blond a écrit :

Si au lieu de faire :

Code :
  1. c[i]=c[i]+32;


Tu fesais :

Code :
  1. c[i]=c[i]-32;


ca marcherait...


 
Si on omet les fonctions de <string.h>, c'est encore plus parlant d'écrire :

Code :
  1. c[i]=c[i] - 'A' + 'a'


 

samos38 a écrit :


Code :
  1. int control(char c[])
  2. {
  3.     int i,con=0,l;
  4.     l=strlen(c);
  5.     for(i=0;i<l;i++)
  6.     {
  7.                     if((c[i]>='A'&&c[i]<='Z')||(c[i]>='a'&&c[i]<='Z')||c[i]=='-')
  8.                     {
  9.                     con=1;
  10.                     }
  11.     }
  12.     return con;   
  13. }



 
Personnellement je quitte une fonction dès que sa raison d'être n'existe plus.

Code :
  1. int control(char c[])
  2. {
  3.     int i, l;
  4.     l=strlen(c);
  5.     for(i=0;i<l;i++)
  6.     {
  7.             // J'essaye aussi d'aérer un peu les syntaxes
  8.             if ((c[i] >= 'A' && c[i] <= 'Z') || (c[i] >= 'a' && c[i] <= 'Z') || c[i] == '-')
  9.                 return 1;
  10.     }
  11.     return 0;   
  12. }


 
Mais cette façon d'écrire est contraire aux principes de la prog structurée et certains (profs ???) peuvent ne pas l'apprécier...


Message édité par Sve@r le 03-01-2007 à 21:37:27

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 03-01-2007 à 22:02:56    

Ben plusieurs return dans une même fonction peut etre considéré comme une erreur de programmation voire algorithmique même... mais bon, chacun ses preferences...

Reply

Marsh Posté le 03-01-2007 à 22:59:47    

Ange_blond a écrit :

Ben plusieurs return dans une même fonction peut etre considéré comme une erreur de programmation voire algorithmique même...


C'est là qu'il faut se montrer très prudent et ne pas tomber dans le... fanatisme.
 
Pour moi, les règles c'est bien "en général". Ensuite, tout en connaissant les règles et le danger associé, on peut, parfois, s'en affranchir (comme dans mon exemple concernant "control()" )...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 04-01-2007 à 01:16:17    

merci à tous pour votre aide et vos conseils ;)

Reply

Marsh Posté le 04-01-2007 à 01:25:59    

Ange_blond a écrit :

Autre solution : utilise les fonctions de String.h pour mettre en minuscule... elles existent !


Montre les !
 
Par contre, je peux te montrer celles de <ctype.h>...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 04-01-2007 à 10:53:18    

Ange_blond a écrit :

Ben plusieurs return dans une même fonction peut etre considéré comme une erreur de programmation voire algorithmique même... mais bon, chacun ses preferences...


 
ben suffit de remplacer le for par un while(con == 0) {} et comme ça, on a plus qu'un seul return...
 
par ailleurs, moi, j'ai toujours appris qu'il fallait mettre des () autour de chaque condition (je fais référence à la ligne 14 du code initial).

Message cité 1 fois
Message édité par rufo le 04-01-2007 à 13:01:38
Reply

Marsh Posté le 04-01-2007 à 12:54:28    

rufo a écrit :

ben suffit de remplacer le for par un while(con == 0) {} et comme ça, on plus qu'un seul return...


Joli !!!  :bounce:  
 

rufo a écrit :

par ailleurs, moi, j'ai toujours appris qu'il fallait mettre des () autour de chaque condition (je fais référence à la ligne 14 du code initial).


C'est le problème de l'apprentissage. Tu subis obligatoirement les habitudes de ton mentor. Moi, le mien me disait "mettre des parenthèses ne fait que montrer que tu ne connais pas les priorités des opérateurs"
 
Ensuite, entre le "toujours" et le "jamais" on peut arriver à trouver un juste milieu qu'on finalise avec ses propres expèriences du C...

Message cité 2 fois
Message édité par Sve@r le 04-01-2007 à 12:58:16

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 04-01-2007 à 12:54:28   

Reply

Marsh Posté le 04-01-2007 à 13:01:06    

Sve@r a écrit :

Joli !!!  :bounce:  
 
 
C'est le problème de l'apprentissage. Tu subis obligatoirement les habitudes de ton mentor. Moi, le mien me disait "mettre des parenthèses ne fait que montrer que tu ne connais pas les priorités des opérateurs"
 
Ensuite, entre le "toujours" et le "jamais" on peut arriver à trouver un juste milieu qu'on finalise avec ses propres expèriences du C...


 
quand je parlais du while, on est bien d'accord que la condition n'était pas complète, hein. C'était pour l'idée. Il est bien évidement qu'il faut tenir compte de la longueur de la chaîne ;) Sinon, on va avoir un petit pb si "con" ne passe jamais à 1...

Reply

Marsh Posté le 04-01-2007 à 13:13:45    

rufo a écrit :

quand je parlais du while, on est bien d'accord que la condition n'était pas complète, hein. C'était pour l'idée. Il est bien évidement qu'il faut tenir compte de la longueur de la chaîne ;) Sinon, on va avoir un petit pb si "con" ne passe jamais à 1...


Aucun sous-entendu - J'ai réellement trouvé ton idée jolie. Tu as réussi à trouver un juste milieu entre la fonction originelle qui faisait du traitement inutile et la mienne qui ne respectait pas les standards conventionnels d'une fonction...
Pour le pb, c'est du détail...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 04-01-2007 à 14:17:45    

Sve@r a écrit :

C'est le problème de l'apprentissage. Tu subis obligatoirement les habitudes de ton mentor. Moi, le mien me disait "mettre des parenthèses ne fait que montrer que tu ne connais pas les priorités des opérateurs"


+1

Citation :

Ensuite, entre le "toujours" et le "jamais" on peut arriver à trouver un juste milieu qu'on finalise avec ses propres expèriences du C...

+1
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed