Convertisseur de nombres en lettres, en espagnol

Ce petit programme s'exécute en ligne de commande et permet d'obtenir, pour un nombre donné et un genre (masculin ou féminin), 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;
}