[C] Comment convertir un tableau en chiffre et reciproquement?

Comment convertir un tableau en chiffre et reciproquement? [C] - C - Programmation

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

Marsh Posté le 29-12-2003 à 11:34:41   

Reply

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

Reply

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 :o


---------------
Can't buy what I want because it's free -
Reply

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


Message édité par kuma le 29-12-2003 à 13:08:57

---------------
Si tu glandes bien, tu arrives bien.
Reply

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.


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 29-12-2003 à 13:23:07    

Voici un début de solution...
 

Code :
  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <sys/types.h>
  4. u_int table_elts2number(u_int *table, u_int nb_elts) {
  5.   u_int i;
  6.   u_int number = 0;
  7.   for(i=0; i<nb_elts; i++) number += table[nb_elts - i - 1] * (u_int) pow(10., (double) i);
  8.   return number;
  9. }
  10. void main() {
  11.   u_int tableau[6] = {12,5,6,8,9,7};
  12.   u_int nombre;
  13.   nombre = table_elts2number(tableau, sizeof(tableau)/sizeof(*tableau));
  14.   printf("%d\n", nombre);
  15.   return 0;
  16. }


---------------
Un matin je me lèverai et il fera beau.
Reply

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 :hello:


---------------
Si tu glandes bien, tu arrives bien.
Reply

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 :hello:


 
Une telle fonction n'existe pas en C ANSI, par contre en Common Lisp ça doit bien exister :whistle:
 
Ma fonction n'est pas parfaite, mais elle a le mérite de fonctionner. Tu dois sûrement pouvoir l'améliorer un peu.


---------------
Un matin je me lèverai et il fera beau.
Reply

Marsh Posté le 29-12-2003 à 13:35:25    

kuma a écrit :

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


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+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

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.

Reply

Marsh Posté le 29-12-2003 à 13:38:20   

Reply

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


 
Oui mais non ;)
A partir des chiffres, il veut obtenir un nombre et non une chaîne de caractères.


---------------
Un matin je me lèverai et il fera beau.
Reply

Marsh Posté le 29-12-2003 à 14:04:56    

gilou a écrit :


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+,


 
Exact, c'est plus logique comme ceci (par contre cela devient tableau[7]).


---------------
Un matin je me lèverai et il fera beau.
Reply

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)


Message édité par kuma le 29-12-2003 à 14:56:27

---------------
Si tu glandes bien, tu arrives bien.
Reply

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


 
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.


---------------
Un matin je me lèverai et il fera beau.
Reply

Marsh Posté le 29-12-2003 à 15:17:31    

printf a écrit :


 
Oui mais non ;)
A partir des chiffres, il veut obtenir un nombre et non une chaîne de caractères.


Zut, j'avais lu trop vite... :pt1cable:  
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).

Reply

Marsh Posté le 29-12-2003 à 17:39:26    

t'ain vous faites des trucs compliqués vous :D
 
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));
}
 
:ange:

Reply

Marsh Posté le 29-12-2003 à 17:50:05    


 
Le monsieur te demande un nombre :D


---------------
Un matin je me lèverai et il fera beau.
Reply

Marsh Posté le 29-12-2003 à 19:53:06    

Bah tu fais un to_int() sur la chaîne au final :o


Message édité par MagicBuzz le 29-12-2003 à 19:53:15
Reply

Marsh Posté le 29-12-2003 à 19:55:35    

MagicBuzz a écrit :

Bah tu fais un to_int() sur la chaîne au final :o


 
Le monsieur te demande du C :D


---------------
Un matin je me lèverai et il fera beau.
Reply

Marsh Posté le 29-12-2003 à 19:57:52    

moi je ponds du pseudo code, chuis pas une machine à pisser du code :p

Reply

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

Reply

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


atoi? mais taz il aime po  :o

Reply

Marsh Posté le 29-12-2003 à 20:08:49    

atoi ? à moi quoi ? :D

Reply

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


 
Il ne veut pas générer un nombre à partir d'une chaîne, mais à partir d'un tableau de chiffres.


---------------
Un matin je me lèverai et il fera beau.
Reply

Marsh Posté le 29-12-2003 à 20:18:50    

tu serait pas un peu boulet toi ? :o
 
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 !)

Reply

Marsh Posté le 29-12-2003 à 20:22:12    

MagicBuzz a écrit :

tu serait pas un peu boulet toi ? :o
 
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 !)


 
Ton infâme pseudo-code n'est pas du C :kaola:


---------------
Un matin je me lèverai et il fera beau.
Reply

Marsh Posté le 29-12-2003 à 20:23:13    

ben c'est normal, c'est pour ça que c'est du pseudo code :sarcastic:


Message édité par MagicBuzz le 29-12-2003 à 20:23:28
Reply

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 :sarcastic:


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


---------------
Un matin je me lèverai et il fera beau.
Reply

Marsh Posté le 29-12-2003 à 20:32:12    

:heink:
 
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)


Message édité par MagicBuzz le 29-12-2003 à 20:32:39
Reply

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.

Reply

Marsh Posté le 29-12-2003 à 20:37:23    

MagicBuzz a écrit :


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)


a ta place je ne dirais pas ca  :whistle:
 
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.


Message édité par polo021 le 29-12-2003 à 20:44:35
Reply

Marsh Posté le 29-12-2003 à 20:49:13    

MagicBuzz a écrit :

:heink:
 
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)
 
En Common Lisp, il doit bien exister une fonction pour faire ça (peut-être avec (coerce) ?). En Scheme, il n'existe pas de telle fonction mais c'est très facilement réalisable (bon, c'est vrai que les dialectes Lisp permettent de faire une telle opération très facilement).
 
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.
 
On peut implémenter un tel "algorithme" en C à l'aide de la fonction atoi, mais c'est une méthode de barbare.
 
A part l'ASM et autres assembleurs, je connais pas un seul langage qui n'a pas les fonctions nécessaire pour faire ça !
 
C'est quoi la différence entre l'ASM et les autres assembleurs [:paysan]
 
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)
 
:jap:  


---------------
Un matin je me lèverai et il fera beau.
Reply

Marsh Posté le 29-12-2003 à 20:59:41    

polo021 a écrit :


a ta place je ne dirais pas ca  :whistle:
 
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.


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 ? :??:

Reply

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.

Reply

Marsh Posté le 29-12-2003 à 21:17:21    

MagicBuzz a écrit :


lisp et autres langages vraiment spécifiques je les prends pas en compte.
 
Merci pour eux :lol:
 
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.
 
Emacs :whistle:
 
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).
 
Quel souci d'optimisation :p
 
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)
 
Je ne vois pas pourquoi pow est une source de plantage. Cela dit, c'est vrai que pow est une instruction FP, donc à peu près aussi barbare qu'atoi (mea culpa :ange:).
 
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.
 
Non, non, asm est bien l'abbréviation d'assembleur. On dit "asm x86" comme on dit "asm SPARC", "asm MIPS" ou "ASM ARM".


---------------
Un matin je me lèverai et il fera beau.
Reply

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 :jap:


Message édité par MagicBuzz le 29-12-2003 à 22:00:21
Reply

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


 
sprintf

Reply

Marsh Posté le 29-12-2003 à 22:08:58    

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

Reply

Marsh Posté le 29-12-2003 à 22:15:33    

*syl* a écrit :


Bravo M. l'ingénieur..


 
ça casse dur par ici :lol:


---------------
Un matin je me lèverai et il fera beau.
Reply

Marsh Posté le 29-12-2003 à 22:17:00    

*syl* 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é..


 
oh pinaise je suis trop cassé la... [:zebra33]  
 
enfin heureusement que je gagne plus qu'un bac + 2. [:zaib3k]

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed