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;

}