Comment convertir un tableau en chiffre et reciproquement? [C] - C - Programmation
Marsh Posté le 29-12-2003 à 11:56:33
On veut bien aider à débugger les problèmes mais faudrait donner une piste personnelle, le résultat d'une réflexion, un brouillon de piste.
Faire les exercices des autres, c'est pas productif.
Un bout de code, un algorithme ? On pourra guider pour atteindre le but désiré.
Marsh Posté le 29-12-2003 à 12:04:54
Commence par réfléchir à ce que ca veut dire qu'un nombre soit en base 10
Marsh Posté le 29-12-2003 à 12:50:54
Le programme est déjà fini, je ne m'amuse pas à demander les solutions aux autres, je veux juste savoir si il existe une commande qui concatene le contenu d'un tableau, c'est juste pour renvoyer un chiffre au programme principal ou pour le recuperer dans ma fonction, de plus les bases n'interviennent pas dans le programme, c'est forcement une base 10
Marsh Posté le 29-12-2003 à 13:17:00
kuma a écrit : Le programme est déjà fini, je ne m'amuse pas à demander les solutions aux autres, je veux juste savoir si il existe une commande qui concatene le contenu d'un tableau, c'est juste pour renvoyer un chiffre au programme principal ou pour le recuperer dans ma fonction, de plus les bases n'interviennent pas dans le programme, c'est forcement une base 10 |
Tu viens d'écrire la solution à ton pb.
Marsh Posté le 29-12-2003 à 13:23:07
Voici un début de solution...
Code :
|
Marsh Posté le 29-12-2003 à 13:28:14
Indirectement tu viens de repondre a ma question, il faut creer un bout de programme pour le faire, il n'existe pas une commande déjà existante pour le faire, c'est tout ce que je voulais savoir, merci
Marsh Posté le 29-12-2003 à 13:32:05
kuma a écrit : Indirectement tu viens de repondre a ma question, il faut creer un bout de programme pour le faire, il n'existe pas une commande déjà existante pour le faire, c'est tout ce que je voulais savoir, merci |
Une telle fonction n'existe pas en C ANSI, par contre en Common Lisp ça doit bien exister
Ma fonction n'est pas parfaite, mais elle a le mérite de fonctionner. Tu dois sûrement pouvoir l'améliorer un peu.
Marsh Posté le 29-12-2003 à 13:35:25
kuma a écrit : Bonjour |
12 n'est pas un chiffre mais un nombre. Voulais tu dire:
valeurs du tableau : tableau[6]={1,2,5,6,8,9,7} ???
A+,
Marsh Posté le 29-12-2003 à 13:38:20
Désolé d'avoir mal compris que la question était "existe-t-il une fonction du C qui fait ça ?".
Si les digits ne dépassent pas '9', il y a une correspondance quasi-directe char/valeur.
i variant de zéro à n : Chaine[i] = '0' + Tableau[i];
Et le symétrique dans l'autre sens.
Marsh Posté le 29-12-2003 à 14:01:11
carbon_14 a écrit : Désolé d'avoir mal compris que la question était "existe-t-il une fonction du C qui fait ça ?". |
Oui mais non
A partir des chiffres, il veut obtenir un nombre et non une chaîne de caractères.
Marsh Posté le 29-12-2003 à 14:04:56
gilou a écrit : |
Exact, c'est plus logique comme ceci (par contre cela devient tableau[7]).
Marsh Posté le 29-12-2003 à 14:54:12
En realité je voulais bien parler de nombre pour le passage de tableau à chiffre et de décomposition en chiffre pour le passage de nombre a tableau, donc 12 était bien ce que je voulais dire, ça ressemble à un assemblage à la suite des données du taleau en fait, de manière à former un seul nombre au final qui ne sera pas dans un format tableau ni de chaine de caractere.
Par contre pour le deuxieme cas je decompose en digit "unitaire" (de 0 à 9), avec un digit par case du tableau.
De plus la taille du tableau est prédéfini et invariable (en tout cas pour l'instant)
Marsh Posté le 29-12-2003 à 15:03:28
kuma a écrit : En realité je voulais bien parler de nombre pour le passage de tableau à chiffre et de décomposition en chiffre pour le passage de nombre a tableau, donc 12 était bien ce que je voulais dire, ça ressemble à un assemblage à la suite des données du taleau en fait, de manière à former un seul nombre au final qui ne sera pas dans un format tableau ni de chaine de caractere. |
Est-ce qu'un nombre supérieur à 9 peut se trouver ailleurs qu'en première position du tableau ? Car dans ce cas, ma fonction serait incorrecte.
Marsh Posté le 29-12-2003 à 15:17:31
printf a écrit : |
Zut, j'avais lu trop vite...
Si les nombres ne sont pas trop "énormes", on peut aussi passer par atol() et sprintf(), les chaîne sont plus "faciles" à gérer que les nombres pour ce genre de conversion (à condition de ne pas dépasser un long en valeur numérique ET ne pas avoir plus qu'un digit à la fois ds le tableau).
Marsh Posté le 29-12-2003 à 17:39:26
t'ain vous faites des trucs compliqués vous
moi j'aime bien les solution de bourrin :
En pseudo code.
string strPouet;
for (i sur tous les index du tableau)
{
strPouet += to_string(tab[i]);
}
Et dans l'autre sens :
string strPouet;
strPouet = to_string(12345678);
byte tab[length(strPouet)];
for (i sur tous les caractères de strPouet)
{
tab[i] = to_byte(get_Char(strPouet, i));
}
Marsh Posté le 29-12-2003 à 17:50:05
Le monsieur te demande un nombre
Marsh Posté le 29-12-2003 à 19:53:06
Bah tu fais un to_int() sur la chaîne au final
Marsh Posté le 29-12-2003 à 19:55:35
MagicBuzz a écrit : Bah tu fais un to_int() sur la chaîne au final |
Le monsieur te demande du C
Marsh Posté le 29-12-2003 à 19:57:52
moi je ponds du pseudo code, chuis pas une machine à pisser du code
Marsh Posté le 29-12-2003 à 19:59:16
surtout que du C, j'en ai fait minutes en TP de system pour voir comment faire un prog multiprocess sous unix alors si tu veux, j'ai pas la moindre idée des fonctions.
mais j'ai du mal à croire qu'il n'y ait pas une fonction qui converti une chaîne en nombre dans les fonctions de base du C
Marsh Posté le 29-12-2003 à 20:08:21
MagicBuzz a écrit : surtout que du C, j'en ai fait minutes en TP de system pour voir comment faire un prog multiprocess sous unix alors si tu veux, j'ai pas la moindre idée des fonctions. |
atoi? mais taz il aime po
Marsh Posté le 29-12-2003 à 20:12:27
MagicBuzz a écrit : surtout que du C, j'en ai fait minutes en TP de system pour voir comment faire un prog multiprocess sous unix alors si tu veux, j'ai pas la moindre idée des fonctions. |
Il ne veut pas générer un nombre à partir d'une chaîne, mais à partir d'un tableau de chiffres.
Marsh Posté le 29-12-2003 à 20:18:50
tu serait pas un peu boulet toi ?
truc que j'ai écrit :
string strPouet;
for (i sur tous les index du tableau)
{
strPouet += to_string(tab[i]);
}
tu rajoute à la fin :
int nb;
nb = to_int(strPouet);
Et t'as bien un nombre créé à partir de ton tableau de nombres (et non pas de chiffres !)
Marsh Posté le 29-12-2003 à 20:22:12
MagicBuzz a écrit : tu serait pas un peu boulet toi ? |
Ton infâme pseudo-code n'est pas du C
Marsh Posté le 29-12-2003 à 20:23:13
ben c'est normal, c'est pour ça que c'est du pseudo code
Marsh Posté le 29-12-2003 à 20:25:10
MagicBuzz a écrit : ben c'est normal, c'est pour ça que c'est du pseudo code |
Merci j'avais bien compris.
Je voulais dire qu'en C il n'existe pas de fonction pour transformer un tableau de chiffres (int) en nombre (int).
Marsh Posté le 29-12-2003 à 20:32:12
frachement, relis mon algo, tu m'inquiètes... jamais de la vie je fais ça, et aucun langage à ma connaissance sait faire ça (surtout que je vois rien de plus inutile)
On va reprendre doucement.
Je met dans une chaîne de caractère à la queue leue leue chacun des nombres du tableau, puis je convertis cette chaîne en nombre.
A part l'ASM et autres assembleurs, je connais pas un seul langage qui n'a pas les fonctions nécessaire pour faire ça !
Même en COBOL ça se fait en 5 lignes ! (je me permet de l'affirmer, même si j'ai jamais vu une seule ligne de COBOL de ma vie)
Marsh Posté le 29-12-2003 à 20:33:55
Ca demande que deux fonctions :
1) convertion de int en string
2) conversion de string en int
Ca doit être les première bibliothèques qu'on écrit quand on fait de l'ASM.
Marsh Posté le 29-12-2003 à 20:37:23
MagicBuzz a écrit : |
a ta place je ne dirais pas ca
edit : en fait si c'est tres facile puisqu'un entier peut etre contenu dans la meme zone qu'une chaine de caractères. Le plus difficile c'est plutot de mettre le tableau dans la chaine de carateres, quant à essayer de le faire sans passer par une chaine de char c'est meme pas la peine d'oser y penser.
Marsh Posté le 29-12-2003 à 20:49:13
MagicBuzz a écrit : |
Marsh Posté le 29-12-2003 à 20:59:41
polo021 a écrit : |
bah en cobol on peut pas faire de concaténation de chaîne ni de parcours d'un tableau ? bon, c'est vrai que j'ai aucune idée de comment ça marche, mais ça m'étonne quand même un peu, comment on peut développer avec sinon ?
Marsh Posté le 29-12-2003 à 21:07:33
lisp et autres langages vraiment spécifiques je les prends pas en compte. c'est pas de langages de programmation en tant que tel, on peut pas du tout faire une appli classique avec, c'est pas tu tout fait pour.
sinon, j'ai jamais dis que ma méthode n'était pas barbare, c'est même le premier truc que j'ai dit "je préfère la méthode bien bourrin".
deplus, même si c'est porc, chuis pas certain qu'au niveau perfs il y ait une énorme différence (au pire, deux fois plus lent, et encore, c'est loin d'être un ratio de 10 ou de 100).
Niveau gestion d'erreur, on n'est pas plus limité qu'avec le système "propre", donc ça n'entre pas en ligne de compte, et même je pense que c'est mieu, puisqu'on fait le teste de convertivilité en int au dernier moment, alors que dans l'autre cas faut tester qu'on va pas dépasser la taille du type à chaque passage dans la bouche. donc mine de rien, c'est barbare, mais ça marche, et au final ça ne met pas plus en périle l'application général, et on n'a pas d'effet de bord possible. (je pense notamment à la fonction pow dans l'exemple propre, qui est une source supplémentaire de plantage)
Sinon, l'ASM à ma connaissance, c'est le nom donné courrament à l'assembleur pour x86. Mais y'a pas que ce type de processeur, et à chaque type de processeur son langage assembleur.
Ce que j'ai dit est invalidé si ASM est utilisé dans le sens d'abrévation du mot "assembleur", mais à priori, c'est pas son sens réel.
Marsh Posté le 29-12-2003 à 21:17:21
MagicBuzz a écrit : |
Marsh Posté le 29-12-2003 à 21:59:51
si je ne m'abuse (je ne connais pas bien) emacs n'est pas une appli, mais une plateforme non ? a moins que je confonde.
2x plus lent, si c'est pour récupérer un résultat depuis un tableau après un long traîtement sur le tableau, c'est pas vraiment là qu'il faut chercher à optimiser. tout dépends du rapport "coût de cette fonction" * "fréquence d'utilisation de cette fonction" / "coût global du process"
pow est une source d'erreur, car si x^y ne tien pas dans le type u_int, ça va planter. donc cette erreur est à prendre en compte en plus de l'addition générale. Donc deux tests d'erreur à vérifier par passage dans la boucle au lieu d'un seul pour tout le process (dans mon cas). Rien qu'à cause de ça, tu divises les perfs par deux dans la solution "propre", alors que dans ma solution le test de l'erreur est négligeable par rapport au reste du traîtement.
Hors je pense que tu n'es pas sans savoir que les tests évitant les erreurs sont rapidement des facteurs décisifs pour l'optimisation.
Par exemple :
// Test d'erreur à l'interrieur de la boucle
while (b > 0)
{
if (a != 0)
{
c = b / a;
}
else
{
printf("Erreur : Division par 0\n\n" );
}
b--;
}
c'est incomparablement plus lent que :
// Test d'erreur en dehors de la boucle
if (a != 0)
{
while (b > 0)
{
c = b / a;
}
b--;
}
else
{
printf("Erreur : Division par 0\n\n" );
}
PS: cet exemple est ridicule, mais c'est une structure qu'on rencontre très souvent dans du code mal pensé à la base. Hors ce type d'erreur est facile avec la solution "propre", tandis qu'il ne se pose pas avec ma solution. (à moins qu'on aît peur de planter en faisant une concaténation de chaîne, mais bon, on est pas en train d'envoyer ariane dans l'espace non plus...)
Sinon, OK pour ASM, je pensais que ce terme était spécifique au x86
Marsh Posté le 29-12-2003 à 22:03:52
MagicBuzz a écrit : surtout que du C, j'en ai fait minutes en TP de system pour voir comment faire un prog multiprocess sous unix alors si tu veux, j'ai pas la moindre idée des fonctions. |
sprintf
Marsh Posté le 29-12-2003 à 22:08:58
ToxicAvenger a écrit : |
Citation : mais j'ai du mal à croire qu'il n'y ait pas une fonction qui converti une chaîne en nombre dans les fonctions de base du C |
Bravo M. l'ingénieur..
Un sscanf serait déjà plus approprié..
Marsh Posté le 29-12-2003 à 22:15:33
*syl* a écrit : |
ça casse dur par ici
Marsh Posté le 29-12-2003 à 22:17:00
*syl* a écrit :
Bravo M. l'ingénieur.. |
oh pinaise je suis trop cassé la...
enfin heureusement que je gagne plus qu'un bac + 2.
Marsh Posté le 29-12-2003 à 11:34:41
Bonjour
Je voudrais convertir les données d'un tableau en un nombre et reciproquement, je m'explique, Je veux que tout les chiffre d'un tableau (ce sera obligatoirement des chiffres) soit regroupés pour former un nombre.
exemple :
valeurs du tableau : tableau[6]={12,5,6,8,9,7}
valeur aprés conversion : 1256897
et reciproquement, rentrer des chiffres, qui deviendront chacun une valeur du tableau
exemple :
Nombre : 1576348
convertion en tableau : tableau[taile du nombre]={1,5,7,6,3,4,8}
Je précise que dans ce cas on ne travaille que sur des chiffres.
P.S. Je ne travaille qu'en C donc si vous pouviez en tenir compte.
merci
---------------
Si tu glandes bien, tu arrives bien.