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 :

question langage C


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 67
    Points : 30
    Points
    30
    Par défaut question langage C
    bonjour,
    en C, il est possible de saisir une chaine de caractere(chaque lettre est stockée), mais est-il possible de saisir une chaine de chiffres puis faire la multiplication de chaque chiffre ?
    si oui, quel code faites-vous ?
    merci.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 735
    Points : 31 060
    Points
    31 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par space_56 Voir le message
    bonjour,
    en C, il est possible de saisir une chaine de caractere(chaque lettre est stockée), mais est-il possible de saisir une chaine de chiffres puis faire la multiplication de chaque chiffre ?
    si oui, quel code faites-vous ?
    merci.
    Tu veux dire que tu saisis "12345" et que tu fais "1 * 2 * 3 * 4 * 5" ?
    Ben faut 1) faire saisir la chaîne, 2) analyser la chaîne pour en extraire les chiffres (boucle) et 3) faire la multiplication

    Ne pas oublier de faire "- '0'" pour convertir le caractère ('1' = 49 ascii) en chiffre ('1' - '0' = 49 - 48 = 1)

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 67
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Tu veux dire que tu saisis "12345" et que tu fais "1 * 2 * 3 * 4 * 5" ?
    chiffre ('1' - '0' = 49 - 48 = 1)
    oui, c'est ça.

    pour saisir, on utilise scanf et un tableau ?
    puis est-ce qu'on peut multiplier chaque element du tableau ?

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 735
    Points : 31 060
    Points
    31 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par space_56 Voir le message
    oui, c'est ça.

    pour saisir, on utilise scanf et un tableau ?
    puis est-ce qu'on peut additionner chaque element du tableau ?
    Pour saisir tu peux utiliser scanf() ou fgets(). La chaîne étant déjà un tableau, pas la peine d'utiliser un autre tableau (te suffit de balayer chaque caractère de la chaîne saisie). Quand à additionner (je croyais que t'avais parlé de multiplier ???) chaque élément (chaque caractère) cela ne pose aucun problème puisqu'un caractère n'est qu'un nombre (un code ascii).
    Seul danger => le caractère '8' (par exemple) ne vaut pas 8 mais 56. Pour passer de '8' à 8, faut lui enlever '0' (48) parce que les chiffres de 0 à 9 se suivent dans l'ordre ascii => 56 - 48 = 8
    Tu peux en plus filtrer par les fonctions is...() telle que "isnum()" pour ne traiter que les caractères représentants des chiffres...

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 901
    Points
    901
    Par défaut
    sinon, sans passer par les caractères ASCII il y a les fonction strtod(), strtol() etc...
    Je préconise fgets() + ces fonctions.

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 735
    Points : 31 060
    Points
    31 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par salseropom Voir le message
    sinon, sans passer par les caractères ASCII il y a les fonction strtod(), strtol() etc...
    Comme le nom l'indique, strtod() et consoeurs sont faites pour traiter des chaînes c.a.d. des tableaux terminés par '\0' (sous-entendu un tableau = un nombre) alors que là, il faut traiter des caractères uns par uns (sous-entendu un caractère = un chiffre) => ces fonctions sont inutiles dans ce cas précis !!!

    Sinon effectivement pour la saisie fgets() est mieux que scanf() car il peut contrôler la saisie...

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 67
    Points : 30
    Points
    30
    Par défaut
    si j'utilise scanf, il faut que je crée un tableau pour pouvoir stocker la chaine, c'est bien cela ?
    Mais pour multiplier chaque élément, il faut convertir en ascii, et comment on l'écrit dans le code ?
    merci.

  8. #8
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Pour te donner une idée de départ sans gestion d'erreur :
    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
    #include <stdio.h>
     
    int main (void)
    {
       unsigned char tab[5];
       int ret,i = 0,prod= 1;
       do
       {
          puts("entrer la chaine");
          ret = scanf("%1hhu%1hhu%1hhu%1hhu%1hhu",tab,tab+1,tab+2,tab+3,tab+4);
          scanf("%*[^\n]"),getchar();
       }while(ret != 5);
     
       for(; i < 5; i++)
       {
          prod *= tab[i];
       }
     
       printf("prod = %d\n",prod);
       return 0;
    }

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 735
    Points : 31 060
    Points
    31 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par space_56 Voir le message
    si j'utilise scanf, il faut que je crée un tableau pour pouvoir stocker la chaine, c'est bien cela ?
    Exact

    Citation Envoyé par space_56 Voir le message
    Mais pour multiplier chaque élément, il faut convertir en ascii
    hé non => c'est déjà de l'ascii

    Mais comme rien ne vaut l'exemple, essaye d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char carac1='7'
    char carac2=55
    Puis d'afficher carac1 et carac2 au format
    • %c
    • %d
    • %x

    Et d'analyser ce que tu vois

    Puis tape la ligne suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%d, %d\n", carac1, carac1 - '0');
    Si tu comprends ce qui se passe, ton exo est terminé...

  10. #10
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 168
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par space_56 Voir le message
    si j'utilise scanf, il faut que je crée un tableau pour pouvoir stocker la chaine, c'est bien cela ?
    Mais pour multiplier chaque élément, il faut convertir en ascii, et comment on l'écrit dans le code ?
    merci.
    Bonjour,

    vois ce cours ,il est très détaillé concernant la saisie de données en C.

    http://emmanuel-delahaye.developpez....tes.htm#saisie

    Cordialement,

    Turbo_chess

  11. #11
    Membre actif
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Points : 274
    Points
    274
    Par défaut
    c'est ce que font les calculatrices a grand chiffres, d'ailleur je me suis demande si ton message n'etait pas lier a un projet de ce genre quand je l'ai lu.

    apres tout une chaine c'est juste un tableau de valeur.tu peux parser une chaine pour en faire ce que tu veux.

  12. #12
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 168
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par Elboras Voir le message
    c'est ce que font les calculatrices a grand chiffres, d'ailleur je me suis demande si ton message n'etait pas lier a un projet de ce genre quand je l'ai lu.

    apres tout une chaine c'est juste un tableau de valeur.tu peux parser une chaine pour en faire ce que tu veux.
    Bonjour,

    Effectivement.

    Ben il doit seulement suivre les étapes suivantes :

    -Lecture de la chaîne à l'aide de fgets
    -Filtrage des caractères par sscanf
    -Transformation de la donnée en long avec strtol
    -Après il y a +eurs solutions, soit faire un sprintf pour transformer la valeur numérique en chaîne.
    -Enfin parcourir la chaîne et pour chaque élement faire un atoi et calculer la multiplication.

    sinon les automates feront l'affaire s'il veut faire un truc générique.

    Cordialement,

    Turbo_chess

  13. #13
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 735
    Points : 31 060
    Points
    31 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par turbo_chess Voir le message
    -Filtrage des caractères par sscanf
    -Transformation de la donnée en long avec strtol
    Non non et NON !!!
    D'après son post d'hier à 19h53, on entre la chaîne "12345" et son programme calcule "1 * 2 * 3 * 4 * 5" (soit 120)
    Tu pourras pas extraire le chiffre "3" (par exemple) avec sscanf. Et si tu récupères par hasard par un moyen quelconque le caractère '3' dans un char, tu pourras pas lui appliquer strtol() pour en extraire la valeur "3" car un char n'est pas un string. Et en plus je soupçonne ce programme d'être un exo de débutant et les débutants qui font ce genre d'exo n'ont pas encore vus sscanf() et strtol()

    Pour résoudre le problème posé, à savoir traiter "2134" pour calculer "2 * 1 * 3 * 4", il faut
    - saisir la chaîne par scanf() ou fgets() (je préfère fgets() mais un débutant ne la connait pas forcément)
    - traiter chaque caractère de la chaîne via une boucle
    - à chaque caractère représentant un chiffre (on peut utiliser isdigit() pour vérifier que c'est bien le cas mais c'est facultatif pour l'exo), faut lui oter le caractère '0' pour récupérer la valeur numérique représentant ce chiffre et multiplier cette valeur à un total initialisé à 1
    A la fin de la boucle, on affiche le total

    Où vous voyez des trucs aussi compliqués que sscanf() ou strtol() ici ???

Discussions similaires

  1. questions langage C
    Par space_56 dans le forum Autres éditeurs
    Réponses: 11
    Dernier message: 20/12/2007, 01h12
  2. question langage C
    Par claire_cartier dans le forum C
    Réponses: 7
    Dernier message: 05/11/2007, 12h56
  3. questions langage C
    Par akrlot dans le forum Débuter
    Réponses: 31
    Dernier message: 25/08/2007, 18h24
  4. [QUESTION] Langages à éviter ?
    Par Shadowritter dans le forum Langages de programmation
    Réponses: 28
    Dernier message: 12/01/2005, 11h34
  5. [langage] pb de question reponse
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 29/11/2002, 12h59

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