Convertisseur de nombre en lettres, en Espagnol

Ce petit programme s'exécute en ligne de commande pour donner, pour un chiffre et un genre, sa correspondance en toutes lettres, en Espagnol.



#include <stdio.h>
#include <string.h>
#include <values.h>
#include <math.h>

#define FALSE 0
#define TRUE 1

static char Unite[2][10][30]={{"CERO", "UNA", "DOS", "TRES", "CUATRO", "CINCO",
                                "SEIS", "SIETE", "OCHO", "NUEVE"},
                            {"CERO", "UNO", "DOS", "TRES", "CUATRO", "CINCO",
                                "SEIS", "SIETE", "OCHO", "NUEVE"}};
static char Dizaine[10][30]={"", "DIEZ", "VEINTE", "TREINTA", "CUARANTA",
                            "CINCUENTA", "SESENTA", "SETENTA", "OCHENTA",
                            "NOVENTA"};
static char Centaine[2][10][30]={{"", "CIENTO", "DOSCIENTAS", "TRESCIENTAS", 
                                "CUATROCIENTAS", "QUINIENTAS", "SEISCIENTAS", "SETECIENTAS", 
                                "OCHOCIENTAS", "NOVECIENTAS"},
                            {"", "CIENTO", "DOSCIENTOS", "TRESCIENTOS", "CUATROCIENTOS",
                                "QUINIENTOS", "SEISCIENTOS", "SETECIENTOS", "OCHOCIENTOS", 
                                "NOVECIENTOS"}};
static char Derive_Dix[10][30]={"DIEZ", "ONCE", "DOCE", "TRECE", "CATORCE",
                                "QUINCE", "DIEZ Y SEIS", "DIEZ Y SEITE", "DIEZ Y OCHO", 
                                "DIEZ Y NUEVE"};
static char Vingtaine[2][10][30]={{"VEINTE", "VEINTIUNA", "VEINTIDOS", 
                                    "VEINTITRES", "VEINTICUATRO", "VEINTICINCO", "VEINTISEIS", 
                                    "VEINTISIETE", "VEINTIOCHO", "VEINTINUEVE"},
                                {"VEINTE", "VEINTIUN", "VEINTIDOS", 
                                    "VEINTITRES", "VEINTICUATRO", "VEINTICINCO", "VEINTISEIS", 
                                    "VEINTISIETE", "VEINTIOCHO", "VEINTINUEVE"}};


int CentToChar (char* Chiffre_A_Traduire, int Genre, char* Resultat,
                char* Quantite_Singulier, char* Quantite_Pluriel, 
                int Cent_Raccourci, int Un_Necessaire, int Un_Raccourci)
{
int Position;
char Chiffre1, Chiffre2, Chiffre3;

Position = strlen (Resultat);

Chiffre1=Chiffre_A_Traduire[0];
    // Cas particulier de 100 raccourci ?
    if ((strcmp(Chiffre_A_Traduire, "100") == 0) && Cent_Raccourci) {
        Position += sprintf (Resultat+Position, " CIEN");
    }
    else if (Chiffre1 != '0') {
        Position += sprintf (Resultat+Position, " %s",
        Centaine[Genre][Chiffre1-'0']);
    }
    // dizaine et unité
    Chiffre2=Chiffre_A_Traduire[1];
    Chiffre3=Chiffre_A_Traduire[2];
    switch (Chiffre2) {
    case '0' :
        if ((Chiffre1 =='0') && (Chiffre3 == '1')) {
            if (strlen(Quantite_Singulier) == 0) {
                Position += sprintf (Resultat+Position, " %s",
                Unite[Genre][Chiffre3-'0']);
            }
            else {
                if (Un_Necessaire) {
                    Position += sprintf (Resultat+Position, " UN %s", Quantite_Singulier);
                }
                else {
                    Position += sprintf (Resultat+Position, " %s", Quantite_Singulier);
                }
            }
        }
        else if (Chiffre3 != '0') {
            Position += sprintf (Resultat+Position, " %s %s", Unite[Genre][Chiffre3-'0'], Quantite_Pluriel);
        }
        else if (Chiffre1 != '0') {
            Position += sprintf (Resultat+Position, " %s", Quantite_Pluriel);
        }
        break;

    case '1' :
        Position += sprintf (Resultat+Position, " %s %s",
        Derive_Dix[Chiffre3-'0'], Quantite_Pluriel);
        break;
    case '2' :
        if ((Chiffre3 == '1') && (Un_Raccourci)) {
            Position += sprintf (Resultat+Position, " VEINTIUN %s", Quantite_Pluriel);
        }
        else {
            Position += sprintf (Resultat+Position, " %s %s",
            Vingtaine[Genre][Chiffre3-'0'], Quantite_Pluriel);
        }
        break;
    default :
        if (Chiffre3 != '0') {
            if (((Genre == 1) || (Un_Raccourci)) && (Chiffre3 == '1')) {
                Position += sprintf (Resultat+Position, " %s Y UN %s",
                                    Dizaine[Chiffre2-'0'], Quantite_Pluriel);
            }
            else {
                Position += sprintf (Resultat+Position, " %s Y %s %s",
                                    Dizaine[Chiffre2-'0'], Unite[Genre][Chiffre3-'0'], Quantite_Pluriel);
            }
         }
         else {
            Position += sprintf (Resultat+Position, " %s %s", Dizaine[Chiffre2-'0'], Quantite_Pluriel);
         }
    }

    return 0;
}

int NumToChar (char* Chiffre_A_Traduire, int Genre, char* Resultat)
{
char Chiffre_Complet[20];
int Position;
char Cent[4];
int i;

    for (i = 0; i < 12-strlen(Chiffre_A_Traduire); i++) {
        Chiffre_Complet[i] = '0';
    }
    Chiffre_Complet[12-strlen(Chiffre_A_Traduire)] = 0;
    strcat (Chiffre_Complet+12-strlen(Chiffre_A_Traduire), Chiffre_A_Traduire);
    Resultat [0]=0;
    Position = 0;

    // Centaine de milliard
    sprintf (Cent, "%.3s", Chiffre_Complet);
    CentToChar (Cent, Genre, Resultat+Position, "MIL", "MIL", TRUE, FALSE, TRUE);
    Position = strlen(Resultat);
    // Centaine de million
    sprintf (Cent, "%.3s", Chiffre_Complet+3);
    if (strcmp(Cent, "000") != 0) {
        CentToChar (Cent, Genre, Resultat+Position, "MILLON", "MILLONES", TRUE, TRUE, TRUE);
    }
    else {
        // Pour les milliards
        if (Position > 0) {
            strcat(Resultat, "MILLONES");
        }
    }
    Position = strlen(Resultat);
    // Centaine de millier
    sprintf (Cent, "%.3s", Chiffre_Complet+6);
    CentToChar (Cent, Genre, Resultat+Position, "MIL", "MIL", TRUE, FALSE, FALSE);
    Position = strlen(Resultat);
    // Centaine
    sprintf (Cent, "%.3s", Chiffre_Complet+9);
    CentToChar (Cent, Genre, Resultat+Position, "", "", TRUE, FALSE, FALSE);
    Position = strlen(Resultat);

    return 0;
}

void Usage (char* Nom)
{
    printf ("Usage : %s <F|M> <chiffre>\n", Nom);
}

int main (int argc, char** argv)
{
char Lettre[255];
int i;
int Genre;

    if (argc != 3) {
        Usage (argv[0]);
        return 1;
    }

    if (strcmp(argv[1],"F") == 0) {
        Genre=0;
    }
    else if (strcmp(argv[1],"M") == 0) {
        Genre=1;
    }
    else {
        Usage (argv[0]);
        return 3;
    }

    for (i=0; i< strlen(argv[1]); i++) {
        if ((argv[2][i] < '0') || (argv[2][i] > '9')) {
            printf ("Il faut un chiffre!\n");
            return 2;
        }
    }

    NumToChar (argv[2], Genre, Lettre);

    printf ("%s\n", Lettre);

    return 0;
}