Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2720 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Ou est l'errreur

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Ou est l'errreur

n°1498411
samos38
A soif d'apprendre :P
Posté le 03-01-2007 à 19:13:45  profilanswer
 

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
mood
Publicité
Posté le 03-01-2007 à 19:13:45  profilanswer
 

n°1498436
olivthill
Posté le 03-01-2007 à 20:25:50  profilanswer
 

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'))

n°1498439
Ange_blond
Posté le 03-01-2007 à 20:31:28  profilanswer
 

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
n°1498464
Sve@r
Posté le 03-01-2007 à 21:29:16  profilanswer
 

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.
n°1498481
Ange_blond
Posté le 03-01-2007 à 22:02:56  profilanswer
 

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...

n°1498500
Sve@r
Posté le 03-01-2007 à 22:59:47  profilanswer
 

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.
n°1498549
samos38
A soif d'apprendre :P
Posté le 04-01-2007 à 01:16:17  profilanswer
 

merci à tous pour votre aide et vos conseils ;)

n°1498552
Emmanuel D​elahaye
C is a sharp tool
Posté le 04-01-2007 à 01:25:59  profilanswer
 

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/
n°1498616
rufo
Pas me confondre avec Lycos!
Posté le 04-01-2007 à 10:53:18  profilanswer
 

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
n°1498687
Sve@r
Posté le 04-01-2007 à 12:54:28  profilanswer
 

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.
mood
Publicité
Posté le 04-01-2007 à 12:54:28  profilanswer
 

n°1498696
rufo
Pas me confondre avec Lycos!
Posté le 04-01-2007 à 13:01:06  profilanswer
 

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...

n°1498707
Sve@r
Posté le 04-01-2007 à 13:13:45  profilanswer
 

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.
n°1498845
Emmanuel D​elahaye
C is a sharp tool
Posté le 04-01-2007 à 14:17:45  profilanswer
 

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/

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Ou est l'errreur

 

Sujets relatifs
Plus de sujets relatifs à : Ou est l'errreur


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)