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.
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)
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...
sinon, sans passer par les caractères ASCII il y a les fonction strtod(), strtol() etc...
Je préconise fgets() + ces fonctions.
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...
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.
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; }
Exact
hé non => c'est déjà de l'ascii
Mais comme rien ne vaut l'exemple, essaye d'écrire
Puis d'afficher carac1 et carac2 au format
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 char carac1='7' char carac2=55
- %c
- %d
- %x
Et d'analyser ce que tu vois
Puis tape la ligne suivante
Si tu comprends ce qui se passe, ton exo est terminé...
Code : Sélectionner tout - Visualiser dans une fenêtre à part printf("%d, %d\n", carac1, carac1 - '0');
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
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
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 ???
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager