Bonsoir à tous,j'espère que vous allez bien,Est ce que vous pouvez m'aider s'il vous plait sur la réalisation d'un programme en langage C qui répond à ce cahier de charge .
Bonjour le plus simple à mon sens est de faire en double conversion, tu convertis depuis la base d'entée vers base X puis de base X vers celle que tu veux en sortie :
par exemple si la base de reference est la base 10 :
switch ( inBase )
{
case 2:
{
while ( ( *inStr >= '0' ) &&
( *inStr <= '1' ) )
{
value <<= 1;
value += *inStr == '1';
inStr++;
}
break;
}
case 8:
{
while ( ( *inStr >= '0' ) &&
( *inStr <= '7' ) )
{
value <<= 3;
value += *inStr - '0';
inStr++;
}
break;
}
case 10:
{
value = atoi( inStr );
break;
}
case 16:
{
sscanf ( inStr, "%x", &value );
break;
}
}
à ce niveau du code tu a toujours to nombre dans la base 10
ensuite il ne te reste plus qu'a convertir de la base 10 vers la cible :
switch ( outBase )
{
case 2:
{
long long unsigned mask = 1;
while ( value > ( mask << 1 ) )
{
mask <<= 1;
}
while ( mask )
{
*outStr = ( value & mask )? '1' : '0';
outStr++;
value &= ~mask;
mask >>= 1;
}
*outStr = 0;
break;
}
case 8:
{
while ( value )
{
*outStr = ( value & 0x07 ) + '0';
outStr++;
value >>= 3;
}
*outStr = 0;
}
case 10:
{
sprintf ( outStr, "%d", value );
break;
}
case 16:
{
sprintf ( outStr, "%x", value );
break;
}
}
Je te conseil de bien comprendre le code avant de l'utiliser.
Voici le code complet :
#include <stdio.h>
#include <stdlib.h>
int convert ( char *inStr, int inBase, char * outStr, int outBase )
{
long long int value = 0;
if ( ( inBase != 2 ) &&
( inBase != 8 ) &&
( inBase != 10 ) &&
( inBase != 16 ) )
{
return ( __LINE__ );
}
if ( ( outBase != 2 ) &&
( outBase != 8 ) &&
( outBase != 10 ) &&
( outBase != 16 ) )
{
return ( __LINE__ );
}
switch ( inBase )
{
case 2:
{
while ( ( *inStr >= '0' ) &&
( *inStr <= '1' ) )
{
value <<= 1;
value += *inStr == '1';
inStr++;
}
break;
}
case 8:
{
while ( ( *inStr >= '0' ) &&
( *inStr <= '7' ) )
{
value <<= 3;
value += *inStr - '0';
inStr++;
}
break;
}
case 10:
{
value = atoi( inStr );
break;
}
case 16:
{
sscanf ( inStr, "%llx", &value );
break;
}
}
switch ( outBase )
{
case 2:
{
long long unsigned mask = 1;
while ( value > ( mask << 1 ) )
{
mask <<= 1;
}
while ( mask )
{
*outStr = ( value & mask )? '1' : '0';
outStr++;
value &= ~mask;
mask >>= 1;
}
*outStr = 0;
break;
}
case 8:
{
while ( value )
{
*outStr = ( value & 0x07 ) + '0';
outStr++;
value >>= 3;
}
*outStr = 0;
}
case 10:
{
sprintf ( outStr, "%lld", value );
break;
}
case 16:
{
sprintf ( outStr, "%llx", value );
break;
}
}
return ( 0 );
}
int main ( void )
{
char input[ 70 ] = { 0 };
char output[ 70 ] = { 0 };
int inputBase = 0;
int outputBase = 0;
printf ( "Entrer votre nombre :\n" );
scanf ( "%31s", input );
while ( getchar () != '\n' );
printf ( "Préciser la base numérique (2/8/10/16) :\n" );
scanf ( "%d", &inputBase );
while ( getchar () != '\n' );
printf ( "Choix de base de conversion (2/8/10/16) :\n" );
scanf ( "%d", &outputBase );
while ( getchar () != '\n' );
if ( convert ( input, inputBase, output, outputBase ) )
{
printf ( "error\n");
return ( 1 );
}
printf ( "Le nombre en base (%d) est : %s\n", outputBase, output );
return ( 0 );
}
</h></h>
- Edité par ox223252 9 mai 2019 à 8:41:58
la connaissance est une chose qui ne nous appauvrit pas quand on la partage.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
la connaissance est une chose qui ne nous appauvrit pas quand on la partage.
Mon GitHub