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 :

probleme en language C


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2010
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut probleme en language C
    Bonjour,
    je suis debutant en programation C mais je connait bien le Pascal ,alors,j'ai fait un exercice mais en compilation j'ai reçu beaucoup de problème je vous donne le sujet et merci de m'aider pour le resoudre :
    1)-lire un enitier positive NB :entre 3 et 999999
    2)-affiche les positions des nombres impaires
    3)-un nombre est totalement impaire si tout ses chiffres impaires occupent des positions impaires ===> vérifier si Nb posséde cet propriété ??
    (Rq:les positions sont numérotés de la droite vers la gauche )

    moi j'ai essayer ceci :
    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
    38
    39
    40
    #include <stdio.h>
    #include <limits.h>
    void main ()
    {
    long int nb;
    int n,i ;
    char ch ;
    do {
    printf("donner un entier supérieure a 100");
    scanf("%ld",nb); }
    while((nb<100)||(nb>999999));
    strtol (nb,ch);
    n=0;
    nb=0;
    for (i=0;(i!=strlen);i++)
    {
    if((ch[i]%2)!=0 )
    { nb=nb+1;
    printf("%d",(strlen(ch)-i+1));
     
    if ((strlen(ch)-i+1)!=0)
    n=n+1;
    }
    }
    if ( n=nb )
    printf("NB posséde cette propriété");
    }
     
    }
     
     
     
     
     
     
     
     
     
     
    }
    j'ai remplacer long par strlen de l'algorithme en C mais je ne sais pas bien utilisé

    Aidez moi Svp!!!!

  2. #2
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while((nb<100)||(nb>999999));
    comme c'est statué ici , il y a une erreur je te laisse deviner...

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Recommandation importante : il faut absolument mettre en évidence les blocs {....} en respectant la position des '{' et '}' et l'indentation, sinon le code est illisible.

    Il y a beaucoup d'erreurs dans ton code. Ton code indenté avec quelques commentaires à lire :
    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
    #include <stdio.h>   
    #include <limits.h>    
    // limits.h n'est pas utile ici
    // manque #include <string.h>   pour strlen()
    // manque #include <stdlib.h>   pour strtol()
    void main () // main renvoie un int : int main(void){...}
    {
       long int nb;
       int n,i ;
       char ch ;
       do
       {
          printf("donner un entier supérieure a 100");
          scanf("%ld",nb);    // scanf demande l'ADRESSE de destination : &nb
       }while((nb<100)||(nb>999999));
       strtol (nb,ch);  // inutile et mauvais usage de strtol
       n=0;
       nb=0;
       for (i=0;(i!=strlen);i++) // strlen est une fonction : strlen(......)
       {
           if((ch[i]%2)!=0 ) //ch n'est pas un tableau
           {
              nb=nb+1;
              printf("%d",(strlen(ch)-i+1)); // ch n'est pas une chaine de caractères
              if ((strlen(ch)-i+1)!=0)       // idem
                 n=n+1;
           }
       }
       if ( n=nb )  // = fait une assignation, pas une comparaison (==)
             printf("NB posséde cette propriété");
       }
       // ajouter un return 0; par exemple
    }
    Pour ton problème proprement dit :
    On te demande de comparer le nombre avec des valeurs puis d'analyser les chiffres. Tu as deux possibilités :
    - Lire le nombre comme une chaine de caractères, convertir la chaine en entier pour la comparaison (strtol()) et analyser chaque caractère de la chaine.
    - Lire comme un nombre (ce que tu fais avec le scanf("%ld",...)) et la comparaison peut se faire puis reconstituer tous les chiffres (à partir de division par 10) pour leur analyse

    La première solution me semble plus simple à écrire.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    A mon avis il y a beaucoup d'erreurs dans ce code.
    splinky en a montré une énorme, diogène a détaillé et donné la voie à suivre, moi je donnerais un conseil supplémentaire, éteindre le machine, prendre un papier et un crayon et décrire en français ce qu'il faudra dire à la machine pour qu'elle résolve le problème.
    Ensuite, ré-allumer la machine et traduire en langage C (en respectant la présentation et la syntaxe) ce que vous venez d'écrire sur le papier.
    Je vous parie que ça marchera du premier coup.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 37
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par splinky Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>
    #include <limits.h>
    void main ()
    {
    long int nb;
    int n,i ;
    char ch ;
    do {
    printf("donner un entier supérieure a 100");
    scanf("%ld",nb); }
    ...
    juste pour dire qu'un
    scanf("%ld",&nb);
    devrait déjà mieux fonctionner.
    scanf attend plutôt une adresse en second parametre.

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Re : programme nombre premier
    Bonjour à tous. Alors ceci est mon premier post. J'ai corriger les fautes. J'ai pas fait la condition du nombre premier car je crois que c'est très simple.

    Une note

    sprintf permet de placer simplement un long int dans un string. Il existe d'autres méthodes, si vous voulez je peux vous en parler. Si il y a un autre problème dites le moi.

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    int main ()
    {
    	long int nb;
    	int n,i ;
    	char ch[6]="000000" ;
    	do
    	{
    	printf("donner un entier supérieure a 100 \n");
    	scanf("%ld",&nb);
    	}
    	while((nb<100)||(nb>999999));
     
     
    // -- Transformer long to str -- //
    sprintf(ch, "%ld", nb);
     
    // -- La longueur de la chaine -- //
    n=strlen(ch);
     
     
    for (i=0;i=n;i++)
     
        {
            //Il faut ajouter la condition du nombre pair
        }
     
     
     
    }

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Il ne faut JAMAIS écrire cela.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (i=0;i=n;i++)
     
        {
            //Il faut ajouter la condition du nombre pair
        }
    En effet, si pour une raison ou une autre, vous faites i++ dans le bloc for, la condition sera toujours vraie. Donc, il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (i=0; i <= n ; i++)
        {
            //Il faut ajouter la condition du nombre pair
        }

  8. #8
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Et de plus, le tableau
    est trop petit. Il devrait faire 7 char (1 de plus pour le zéro terminal)
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour et merci pour vos correction,
    1) Pour Monsieur Pierre Dolez, vous avez tout à fait raison c'était juste une faute d'inattention
    2) Pour Monsieur diogene, je crois que l'initialisation est juste car lorsque je fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char ch[6]="000000" ;
    En réalité je réserve 7 cases mémoires de char, mais le dernier case c'est celui de la fin et il est marquée par un caractère nul, de valeur 0 et représenté par le caractère '\0', donc normalement j'en ai pas accès.

    http://nicolasj.developpez.com/articles/libc/string/#LI


  10. #10
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    En réalité je réserve 7 cases mémoires de char, mais le dernier case c'est celui de la fin et il est marquée par un caractère nul, de valeur 0 et représenté par le caractère '\0', donc normalement j'en ai pas accès.
    Non, tu réserves 6 cases remplies par '0' et tu n'as pas de place pour le '\0' terminal.

    La norme n1256 dit :
    6.7.8 Initialization
    ...
    14
    An array of character type may be initialized by a character string literal, optionally enclosed in braces. Successive characters of the character string literal (including the terminating null character if there is room or if the array is of unknown size) initialize the elements of the array.
    Ce n'est pas la même chose qu'écrire
    où il y a 7 cases réservées, 6 cases remplies par '0' et la dernière contenant le '\0'
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  11. #11
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    J'ai écrit un grand paragraphe mais je l'ai perdu, je suis pas très fan des répétition donc pardonnez moi,

    pour monsieur diogene
    1) je connais pas cette norme n1256 (Je crois pas qu'il n'a pas existé d' ordinateur à l'an 1256 ). La dernière norme que je connais c'est anci c c99
    2) lorsque que tu fais
    tu réserve 7 et non pas 6 (Ch[0], Ch[1], ... Ch[6]) (et relis la bien la phrase en anglais que tu viens de poster)
    3) Dans le sujet le nombre est entre 3 et 999999 donc ch[6], c'est bien suffisant or toi t'as dis que le tableau est petit ou je sais pas quoi.
    4) Et écrire ch[] c'est bien différent de ch[6], il faut pas être génie pour le savoir la deuxième déclaration contient un 6 de plus .

    Merci pour votre réaction

  12. #12
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    n1256 est un des derniers brouillons de la norme C99 (la version finale est payante)
    lorsque que tu fais
    tu réserve 7 et non pas 6 (Ch[0], Ch[1], ... Ch[6])
    Il n'y a pas de ch[6] les indices vont de 0 à 5.

    Si tu ne me crois pas, affiche sizeof ch pour voir si il vaut 6 ou 7 !
    Dans le sujet le nombre est entre 3 et 999999 donc ch[6], c'est bien suffisant
    Non, ch doit contenir le 0 terminal des chaines (c'est une chaine puisque tu le remplis avec sprintf()). Il doit avoir 7 char minimum
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  13. #13
    Invité
    Invité(e)
    Par défaut
    Bonjour coucou,
    C'est amusant, vous semblez bien sûr de vous .
    Il est absolument évident que si vous écrivez
    char txt[6];
    vous réservez 6 positions, donc la place pour 6 caractères.
    Lorsque vous initialisez txt[6]="je ne sais quoi";
    vous écrivez à partir de txt[0] un nombre de caractères plus un o terminal.
    Donc, si vous initialisez avec 6 caractères, le 0 terminal (7è caractère) sera écrit, or vous n'avez pas réservé de place pour lui.

  14. #14
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Il faut bien m'excuser j'ai pas touché du C pendant deux ans, et j'ai participer dans ce forum dans un seul but c'est de me rappeler de façon interactif au lieu de relire des cours. Et se trompé c'est normal.

    il a bien raison pour ch[6]

    Mais maintenant j'ai un problème; Si je fait
    la case ch[5] qui normalement contient le '\0' va être écraser pour contenir la valeur 4.

    Est ce que cette case peut être utiliser normalement ou des beugs peuvent apparaitre si le programme évolue (stabilité du programme).
    Et merci pour vos réponse,merci beaucoup pour diogene et Pierre Dolez

  15. #15
    Invité
    Invité(e)
    Par défaut
    La réponse est simple, si vous voulez stocker une chaine de 6 caractères, il faut réserver un espace de 7 caractères au moins.
    Le 4 ne va pas écraser ou être écrasé, c'est le 0 terminal qui va s'écrire sur un octet non réservé, donc s'il y a quelque-chose, ce sera écrasé.
    Par ailleurs, si vous imprimez votre chaine, la machine va chercher un 0 terminal, comme celui-ci a toutes les chances d'avoir disparu, parce qu'il s'est sur une place réservée par autre-chose, le résultat sera désastreux.

Discussions similaires

  1. [MSDE] Probleme de language ?
    Par Arzos dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 05/02/2008, 19h37
  2. Probleme BDD language interclassement
    Par eric0279 dans le forum Outils
    Réponses: 1
    Dernier message: 28/05/2006, 21h37
  3. [postgresql] Probleme de language SQL
    Par sbucci dans le forum Requêtes
    Réponses: 3
    Dernier message: 31/05/2003, 13h19
  4. [postgresql] Probleme de language SQL
    Par sbucci dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 31/05/2003, 13h19

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