Conversion sous contrainte

Conversion sous contrainte #

Conversion d’un entier #

On souhaite écrire un programme qui traite une chaîne de caractères contenant un nombre entier en ASCII (par exemple : "206") et construit un entier contenant cette valeur. Pour faire cela toutefois, on se limitera à des calculs bas niveau, et on s’interdira d’utiliser : scanf ou les fonctions définies dans string.h.

L’idée générale est de parcourir la chaîne (pointeur), et de construire le nombre en se limitant à des additions et des multiplications. Notez qu’il y a une relation entre le code ASCII d’un chiffre et la valeur du chiffre en question.

Vous pourrez partir de ce modèle :

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    char * str = "206";
    int val = 0;

    /* Votre code ici */

    printf("Res : %d\n", val);
}

Conversion d’un nombre à virgule #

On suppose maintenant que la chaîne contient un nombre à virgule correctement formé (il peut ou non y avoir un symbole ., mais il ne peut pas y en avoir deux par exemple). On veut récupérer un nombre entier, en centièmes. Par exemple, si la chaîne contient "20.35", on veut récupérer l’entier 2035. Si la chaîne contient "21.23456", on veut récupérer 2123 et si la chaîne contient "13.2", on veut récupérer 1320.

Vous pourrez partir de ce modèle :

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    char * str = "21.34";
    int val = 0;

    /* Votre code ici */

    printf("Res : %d\n", val);
}

Vous réaliserez des tests exhaustifs regroupant la majorité des cas :

  • un nombre entier en entrée
  • un nombre avec une seule décimale
  • un nombre avec deux décimales
  • un nombre avec strictement plus de deux décimales.

Réécriture sous forme de fonction #

Afin de pouvoir réutiliser votre code, réécrivez le sous forme d’une fonction, en le rendant compatible avec ce programme de test :

#include <stdio.h>
#include <stdlib.h>

int conversion(char *);

int main(void) {
    char * str = "21.34";
    int val = 0;
    printf("Res : %d\n", conversion(str));
}