Language C / C++

Résolu
kamgamartinsbee Messages postés 3 Date d'inscription   Statut Membre Dernière intervention   -  
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
Bonjour,
j'aimerais bien que quelqu'un m'ecrive un proframme en C qui permet de convertir un nombre de la base decimale a une autre base(exemple: la base binaire ou la base 8).
Merci d'avance
je suis un etudiant en informatique et la programmation est mon paase temps.
J'attend vos suggestions.

11 réponses

lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

tu peux essaie quelque chose de ce genre
#include <stdio.h>
#include <string.h>

int main (void)
{
  int base, n, q, r, i;
  char resultat[20];
  q = 1;
  i = 0;

  printf ("Entrez un numéro entier : ");
  scanf ("%d", &n);
  printf ("Entrez la base de conversion : ");
  scanf ("%d", &base);
  printf ("%d en base %d = ", n, base);

  while (q != 0){
    q = n / base;
    r = n % base;
    n = q;
    if (r > 10)
      resultat[i++] = r + 55;
    else
      resultat[i++] = r + '0';
  }
  resultat[i] = '\0';
  for (i = strlen (resultat); i >= 0; --i)
    printf ("%c", resultat[i]);
  printf ("\n");
  return 0;
}
1
kardwane
 
Bonjour,

demande a ton prof plutôt il sera content de t'apprendre qq chose en plus des cours (en plus tu sera bien vue :p)

par contre si c'est pour un tp, va bosser feignasse :)
enfin pour un étudiant en info tu pourrais au moins connaitre Google :p (je dis peut être des bêtises mais ce genre d'algo se trouve facilement sur le net vu que tu n'est pas le premier ni le dernier a en avoir besoin)

kardwane
0
ilan27 Messages postés 394 Date d'inscription   Statut Membre Dernière intervention   36
 
Je peux te suggérer un algorithme (je ne connais pas encore le c) pour le passage de décimal à binaire, et tu convertiras en c puisque c'est ton passe-temps :)

dec=le nb décimal
//Tu divises par 2 successivement, et tu retiens les restes, (qui sont soit 1, soit 0), dans un tableau; le tout jusqu'a ce que le quotient vale zéro:
tant que (dec!=0){
retenue=dec-(arrondi_inférieur(dec/2))*2;
insérer la retenue dans le tableau;
dec=arrondi_inférieur(dec/2);
}
Tu ressorts les retenues dans l'ordre inverse; ex: 0,puis1, puis 1==> doit donner 1 1 0
0
Lolo38Lolo Messages postés 215 Date d'inscription   Statut Membre Dernière intervention   22
 
Salut,

Pour t'aider un peu dans ta recherche, j'ai pas eu le temps de faire le code... mais voilà

La conversion
http://www.positron-libre.com/cours/numeration/conversion-decimal-binaire-hexadecimal.htm

Pour le langage C, regarde l'instruction arithmétique modulo. Je sais plus si c'est [] ou % en C.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kardwane
 
juste pour revenir sur l'algo de ilan,je peut me tromper mais la condition de sortie du tant que n'as pas l'air bonne.
Je m'explique, le binaire c'est 1 ou 0 or ta condition de sortie ne prend en compte que le 0, la place je mettrai :
tq(dec!=1 ou dec!=0) {ton traitement...}
0
ilan27 Messages postés 394 Date d'inscription   Statut Membre Dernière intervention   36
 
Pour repondre a karwane, dis moi si je me trompe, mais mon "dec" est en fait le nombre, successivement divisé par 2. Donc ma condition est: tant qu'il ne vaut pas zero, c'est-à-dire tant qu'on peut encore diviser utilement, sans rajouter des 0 au tableau.
0
kardwane
 
je suis d'accord avec toi dans l'optique ou le résultat obtenu fini par 0, mais imaginons qu'aprés n tour de boucle il te reste 1, ta boucle deviendra inutile vu qu'un nombre binaire peut se finir par 1 ^^.
Tu l'as dit toi meme plus haut "//Tu divises par 2 successivement, et tu retiens les restes, (qui sont soit 1, soit 0)"

d'ailleurs quand tu dit "c'est-à-dire tant qu'on peut encore diviser utilement, sans rajouter des 0 au tableau." tu considère que la division 1/2 est utile dans se contexte et la je ne suis pas d'accord ^^.

enfin ceci n'engage que moi.

cordialement,

kardwane
0
ilan27 Messages postés 394 Date d'inscription   Statut Membre Dernière intervention   36
 
Bon, là on est un peu hors sujet, mais dans le cas où il reste 1, retenue vaut 1, et après, dec vaut 0, et la boucle est finie. Tu n'as qu'à essayer, ça marche. :)
Et 1/2 est utile, enfin je ne vois pas en quoi elle serait inutile puisqu'il reste 1, on ne le met pas de côté... :)
Bonne soirée.
ilan27
0
kamgamartinsbee Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
 
les gars vous etes magnifiques ca fonctionne tres tres bien.
0
desco
 
salut !!!!!!!
je voudrais avoir des explication sur cette partie du programme :
if (r > 10)
resultat[i++] = r + 55;
else
resultat[i++] = r + '0';
}
resultat[i] = '\0';
for (i = strlen (resultat); i >= 0; --i)
printf ("%c", resultat[i]);
printf ("\n");
return 0;
}
et si j'aimerais utiliser une pile pour empiler les resultat comment proceder .
svp merci d'avance
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

// si le reste de la division est plus grande que 10
if (r > 10)  // il me semble que ici c'est >=
// nous avons un tableau de caractères
// ils nous fous selon le systèm héxadécimal
// A, B, C, D, E et F
// A à le code ascii 65
// B - 66
// et ainsi de suite jusqu'à F - 70


// 10 + 55 - donne 65 qui est le code ascii de A
// 11 + 55 - donne 66 qui est le code ascii de B
// pour F - 15 + 55 = 70
  resultat[i++] = r + 55; 
else 
// sinon on écrit le caractèr de 0  à 9
// le code ascii de 0 est 48
// le code ascii de 9 est 57
// donc en aditionnant le reste avec le code ascii de caractère 0
// on obtiens le caractère correspondant pour le reste
// entier 0  => 0 + '0' = 0 + 48 = 48 => code ascii caractère 0
// entier 1  => 1 + '0' = 1 + 48 = 49 => code ascii caractère 1


// entier 9  => 9 + '0' = 9 + 48 = 57 => code ascii caractère 9
  resultat[i++] = r + '0'; 
} 
resultat[i] = '\0'; 

// la chaine obtenu est dans le sens inverse.
// pour l'écrire dans l'ordre on lit le tableah char
// en sens inverse
  for (i = strlen (resultat); i >= 0; --i) 
// et on affiche les caractères
    printf ("%c", resultat[i]); 
  printf ("\n"); 
  return 0; 
} 

Pour créer une pile en utilisant une liste chaînée regarde ici Les piles en langage C
0