Se compile mais ne fonctionne pas

Résolu/Fermé
pépereF Messages postés 36 Date d'inscription dimanche 11 décembre 2005 Statut Membre Dernière intervention 25 janvier 2008 - 4 avril 2007 à 16:23
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 7 avril 2007 à 14:51
bonjour,
que doit-je mettre à la place de mon point d'interogation pour que mon programme en c fonctionne?
passage de base 10 en base16

#include<stdio.h>
int main()
{
int n;
char tab[10];
int car[10];
int l;
printf("changement de base: base 10 <-> base 16\n");
printf("Introduire un nombre en base 10: ");
scanf("%d",&n);
l=0;
while(n<10)
{
car[l++]=n%16;
n/=16;
}
while(n>=10)
{
tab[l++]=n%16;
n/=16;
}
printf("\n");
while(l)printf("%c",'0'+ ?);

return 0;
}

6 réponses

mamiemando Messages postés 33130 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 28 mai 2024 7 755
4 avril 2007 à 22:36
Ben ça veut rien dire ce que tu as écrit:-)
a) Ta boucle while(1) ne s'arrêtera jamais :p
b) Ton printf est sensé afficher la valeur d'une variable. Exemple :
int monint = 69;
char monchar = 'x';
float monfloat = 6.9;
printf("%d",monint);
printf("%c",monchar)
printf("%lf",monfloat);

Si par exemple tu veux afficher le contenu de car[] :
int i;
for(i=0;i<10;++i) printf("%d ",car[i]);

Bonne chance
0
pépereF Messages postés 36 Date d'inscription dimanche 11 décembre 2005 Statut Membre Dernière intervention 25 janvier 2008 2
6 avril 2007 à 15:19
ok, mais si je veux que mon programme affiche les 2 suivant la saisie de l'utilisateur, ce que je veux c'est que mon programme me donne le resultat en base 16 d 'un nombre entré en base 10.
merci
0
mamiemando Messages postés 33130 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 28 mai 2024 7 755
6 avril 2007 à 21:14
A ce moment là c'est juste le format d'affichage qui change :
#include <stdio.h>

int main(){
    unsigned int i;
    for(i=0;i<16;++i) printf(" i (base 10) = %d\ti (base 16) = %x\n",i,i);
    return 0;
}

donne :
 i (base 10) = 0        i (base 16) = 0
...
 i (base 10) = 7        i (base 16) = 7
 i (base 10) = 8        i (base 16) = 8
 i (base 10) = 9        i (base 16) = 9
 i (base 10) = 10       i (base 16) = a
 i (base 10) = 11       i (base 16) = b
 i (base 10) = 12       i (base 16) = c
 i (base 10) = 13       i (base 16) = d
 i (base 10) = 14       i (base 16) = e
 i (base 10) = 15       i (base 16) = f

Bonne chance
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
6 avril 2007 à 22:01
Salut,

voici une possibilité
#include <stdio.h>

int main ()
{
  char s[20];
  int i, nb, quotient, reste, base = 16;

  i = 0; quotient = 1;

  printf ("Entrez un entier : ");
  scanf ("%d", &nb);

  while (quotient != 0){
      quotient = nb / base;
      reste = nb % base;
      nb = quotient;

      if (reste >= 0 && reste <= 9)
        s[i++] = reste + '0';
      else
        s[i++] = reste + 55;
  }
  s[i] = '\0';

  for (; i >= 0; --i) printf ("%c", s[i]);
  printf ("\n");

  return 0;
}
0
pépereF Messages postés 36 Date d'inscription dimanche 11 décembre 2005 Statut Membre Dernière intervention 25 janvier 2008 2
7 avril 2007 à 11:53
merci ça marche,
pourriez vous me commenter cette partie?
if (reste >= 0 && reste <= 9)
s[i++] = reste + '0';
else
s[i++] = reste + 55;
ainsi que celle-ci?
s[i] = '\0';

car je ne comprend pas pourquoi reste +55
et que signifie '\0'
et merci encore
0

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

Posez votre question
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
7 avril 2007 à 12:10
Salut,

s[i++] = reste + '0';

si le reste est 0,1,.....,9
alors comme je stocke dans un tableau de caractères je dois ajouter '0' qui corespond au code ascii de caractère 0, c'est à dire 48

0 + '0' = 0 + 48 = 48 donc j'ai le caractère 0
1 + '0' = 1 + 48 = 49 donc j'ai le carctère 1
.
.
9 + '0' = 9 + 48 = 57 donc j'ai le caractère 9

s[i++] = reste + 55;

de même pour les restes de 10 à 15
Pour répresentation hexa j'ai besoin de caractères A, B, C, D, E, F
Leur code ascii est
A - 65; B - 66; C - 67; D - 68; E - 69; F - 70
Donc pour obtenir leur code ascii je dois additionner 55

10 + 55 = 65
11 + 55 = 66
12 + 55 = 67
13 + 55 = 68
14 + 55 = 69
15 + 55 = 70

s[i] = '\0';
Une chaîne de caractères, qui en C est un tableau de caractères se fini avec le caractèr '\0'
c'est pour ça qu'après la dernière incrementation de i je suis arrivé à la fin
l'ajout de '\0' dans la position i signifie la fin de la chaîne.
char c;
c = 65;
printf("%c\n", c);
va afficher A et pas 65,en revanche
char c;
c = 65;
printf("%d\n", c);
va afficher 65

0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
7 avril 2007 à 14:51
En fait je crois que cet exemple est suffisant
lami20j@debian:~/trash$ cat ccm.c
#include<stdio.h>

int main ()
{
  int i;
  char s[] = "salut";

  for (i = 0; i <= 9; ++i)
    printf ("reste %2d -> caractère %c\n", i, i + '0');
  for (i = 10; i <= 15; ++i)
    printf ("reste %d -> caractère %c\n", i, i + 55);
        for(i=0;s[i] != '\0';++i)
    printf("caractère %d = %c\n",i,s[i]);
        printf("caractère %d = %d(code ASCII du caractère NUL)\n",i,s[i]);

  return 0;
}
lami20j@debian:~/trash$ ./ccm
reste  0 -> caractère 0
reste  1 -> caractère 1
reste  2 -> caractère 2
reste  3 -> caractère 3
reste  4 -> caractère 4
reste  5 -> caractère 5
reste  6 -> caractère 6
reste  7 -> caractère 7
reste  8 -> caractère 8
reste  9 -> caractère 9
reste 10 -> caractère A
reste 11 -> caractère B
reste 12 -> caractère C
reste 13 -> caractère D
reste 14 -> caractère E
reste 15 -> caractère F
caractère 0 = s
caractère 1 = a
caractère 2 = l
caractère 3 = u
caractère 4 = t
caractère 5 = 0(code ASCII du caractère NUL)
0