Traduire un programme du langage JAVA Script en langage C

Fermé
mememe - Modifié par mememe le 29/05/2016 à 17:27
paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 - 1 juin 2016 à 19:01
Bonjour ,
je souhaite traduire un programme du langage JAVA en langage C , mais je ne connaît absolument rien en JAVA Script par contre en C oui du coup j'ai besoin de votre aide pour me le traduire , je sais que sa peut prendre un peut de temps mais j'en ait vraiment besoin merci mille fois a celle ou celui qui le fera , c'est un programme qui convertie un entier en toutes lettres , et juste un petite précisions est ce que c'est possible de déclarer le nombre a traduire tant que long long int svp , je poste le code ici et encore merci beaucoup :

package com.rgagnon.howto;

import java.text.*;

class FrenchNumberToWords {
  private static final String[] dizaineNames = {
    "",
    "",
    "vingt",
    "trente",
    "quarante",
    "cinquante",
    "soixante",
    "soixante",
    "quatre-vingt",
    "quatre-vingt"
  };

  private static final String[] uniteNames1 = {
    "",
    "un",
    "deux",
    "trois",
    "quatre",
    "cinq",
    "six",
    "sept",
    "huit",
    "neuf",
    "dix",
    "onze",
    "douze",
    "treize",
    "quatorze",
    "quinze",
    "seize",
    "dix-sept",
    "dix-huit",
    "dix-neuf"
  };

  private static final String[] uniteNames2 = {
    "",
    "",
    "deux",
    "trois",
    "quatre",
    "cinq",
    "six",
    "sept",
    "huit",
    "neuf",
    "dix"
  };

  private FrenchNumberToWords() {}

  private static String convertZeroToHundred(int number) {

    int laDizaine = number / 10;
    int lUnite = number % 10;
    String resultat = "";

    switch (laDizaine) {
    case 1 :
    case 7 :
    case 9 :
      lUnite = lUnite + 10;
      break;
    default:
    }

    // s�parateur "-" "et"  ""
    String laLiaison = "";
    if (laDizaine > 1) {
      laLiaison = "-";
    }
    // cas particuliers
    switch (lUnite) {
    case 0:
      laLiaison = "";
      break;
    case 1 :
      if (laDizaine == 8) {
        laLiaison = "-";
      }
      else {
        laLiaison = " et ";
      }
      break;
    case 11 :
      if (laDizaine==7) {
        laLiaison = " et ";
      }
      break;
    default:
    }

    // dizaines en lettres
    switch (laDizaine) {
    case 0:
      resultat = uniteNames1[lUnite];
      break;
    case 8 :
      if (lUnite == 0) {
        resultat = dizaineNames[laDizaine];
      }
      else {
        resultat = dizaineNames[laDizaine]
                                + laLiaison + uniteNames1[lUnite];
      }
      break;
    default :
      resultat = dizaineNames[laDizaine]
                              + laLiaison + uniteNames1[lUnite];
    }
    return resultat;
  }

  private static String convertLessThanOneThousand(int number) {

    int lesCentaines = number / 100;
    int leReste = number % 100;
    String sReste = convertZeroToHundred(leReste);

    String resultat;
    switch (lesCentaines) {
    case 0:
      resultat = sReste;
      break;
    case 1 :
      if (leReste > 0) {
        resultat = "cent " + sReste;
      }
      else {
        resultat = "cent";
      }
      break;
    default :
      if (leReste > 0) {
        resultat = uniteNames2[lesCentaines] + " cent " + sReste;
      }
      else {
        resultat = uniteNames2[lesCentaines] + " cents";
      }
    }
    return resultat;
  }

  public static String convert(long number) {
    // 0 � 999 999 999 999
    if (number == 0) { return "zéro"; }

    String snumber = Long.toString(number);

    // pad des "0"
    String mask = "000000000000";
    DecimalFormat df = new DecimalFormat(mask);
    snumber = df.format(number);

    // XXXnnnnnnnnn
    int lesMilliards = Integer.parseInt(snumber.substring(0,3));
    // nnnXXXnnnnnn
    int lesMillions  = Integer.parseInt(snumber.substring(3,6));
    // nnnnnnXXXnnn
    int lesCentMille = Integer.parseInt(snumber.substring(6,9));
    // nnnnnnnnnXXX
    int lesMille = Integer.parseInt(snumber.substring(9,12));

    String tradMilliards;
    switch (lesMilliards) {
    case 0:
      tradMilliards = "";
      break;
    case 1 :
      tradMilliards = convertLessThanOneThousand(lesMilliards)
         + " milliard ";
      break;
    default :
      tradMilliards = convertLessThanOneThousand(lesMilliards)
         + " milliards ";
    }
    String resultat =  tradMilliards;

    String tradMillions;
    switch (lesMillions) {
    case 0:
      tradMillions = "";
      break;
    case 1 :
      tradMillions = convertLessThanOneThousand(lesMillions)
         + " million ";
      break;
    default :
      tradMillions = convertLessThanOneThousand(lesMillions)
         + " millions ";
    }
    resultat =  resultat + tradMillions;

    String tradCentMille;
    switch (lesCentMille) {
    case 0:
      tradCentMille = "";
      break;
    case 1 :
      tradCentMille = "mille ";
      break;
    default :
      tradCentMille = convertLessThanOneThousand(lesCentMille)
         + " mille ";
    }
    resultat =  resultat + tradCentMille;

    String tradMille;
    tradMille = convertLessThanOneThousand(lesMille);
    resultat =  resultat + tradMille;

    return resultat;
  }

  public static void main(String[] args) {
    System.out.println("*** " + FrenchNumberToWords.convert(0));
    System.out.println("*** " + FrenchNumberToWords.convert(9));
    System.out.println("*** " + FrenchNumberToWords.convert(19));
    System.out.println("*** " + FrenchNumberToWords.convert(21));
    System.out.println("*** " + FrenchNumberToWords.convert(28));
    System.out.println("*** " + FrenchNumberToWords.convert(71));
    System.out.println("*** " + FrenchNumberToWords.convert(72));
    System.out.println("*** " + FrenchNumberToWords.convert(80));
    System.out.println("*** " + FrenchNumberToWords.convert(81));
    System.out.println("*** " + FrenchNumberToWords.convert(89));
    System.out.println("*** " + FrenchNumberToWords.convert(90));
    System.out.println("*** " + FrenchNumberToWords.convert(91));
    System.out.println("*** " + FrenchNumberToWords.convert(97));
    System.out.println("*** " + FrenchNumberToWords.convert(100));
    System.out.println("*** " + FrenchNumberToWords.convert(101));
    System.out.println("*** " + FrenchNumberToWords.convert(110));
    System.out.println("*** " + FrenchNumberToWords.convert(120));
    System.out.println("*** " + FrenchNumberToWords.convert(200));
    System.out.println("*** " + FrenchNumberToWords.convert(201));
    System.out.println("*** " + FrenchNumberToWords.convert(232));
    System.out.println("*** " + FrenchNumberToWords.convert(999));
    System.out.println("*** " + FrenchNumberToWords.convert(1000));
    System.out.println("*** " + FrenchNumberToWords.convert(1001));
    System.out.println("*** " + FrenchNumberToWords.convert(10000));
    System.out.println("*** " + FrenchNumberToWords.convert(10001));
    System.out.println("*** " + FrenchNumberToWords.convert(100000));
    System.out.println("*** " + FrenchNumberToWords.convert(2000000));
    System.out.println("*** " + FrenchNumberToWords.convert(3000000000L));
    System.out.println("*** " + FrenchNumberToWords.convert(2147483647));
    /*
     *** OUTPUT
     *** zéro
     *** neuf
     *** dix-neuf
     *** vingt et un
     *** vingt-huit
     *** soixante et onze
     *** soixante-douze
     *** quatre-vingt
     *** quatre-vingt-un
     *** quatre-vingt-neuf
     *** quatre-vingt-dix
     *** quatre-vingt-onze
     *** quatre-vingt-dix-sept
     *** cent
     *** cent un
     *** cent dix
     *** cent vingt
     *** deux cents
     *** deux cent un
     *** deux cent trente-deux
     *** neuf cent quatre-vingt-dix-neuf
     *** mille
     *** mille un
     *** dix mille
     *** dix mille un
     *** cent mille
     *** deux millions
     *** trois milliards
     *** deux milliards cent quarante-sept millions
     **          quatre cent quatre-vingt-trois mille six cent quarante-sept
     */
  }
}



A voir également:

3 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
29 mai 2016 à 17:33
Bonjour,

"je ne connaît absolument rien en JAVA Script"
Ça tombe bien vu que ce n'en est pas... là c'est du Java, rien à voir avec le Java Script, si ce n'est quelques éléments de langages (boucle for, if...) qui sont de toute façon empruntés au C/C++

Vu la simplicité du code que tu nous montres, je ne vois pas trop quel est le problème pour le traduire en C, surtout si tu connais ce langage !

Mais bon, déjà que tu as copier-coller ce code Java d'internet, si en plus c'est nous qui te faisons la traduction en C, quelle sera vraiment ta contribution dans cet exercice ?
0
Bonjour ,
mon objectif c'est pas d'apprendre le langage JAVA (pour l'instant) cause de manque de temps parce que j'ai besoin d'un programme qui fait le traitement dont j'ai besoin et c'est le seul programme que j'ai trouver sur le net (malheureusement il est en JAVA) donc j'ai besoin de traduire ce programme en C , bon c'est pas que j'ai rien compris dans le programme mais par exemple ce code comment on peut l'ecrire en C ?
private static final String[] dizaineNames = {
    "",
    "",
    "vingt",
    "trente",
    "quarante",
    "cinquante",
    "soixante",
    "soixante",
    "quatre-vingt",
    "quatre-vingt"
  };

Merci .
0
mememe > mememe
29 mai 2016 à 18:02
pour
private static final String[] dizaineNames = {
    "",
    "",
    "vingt",
    "trente",
    "quarante",
    "cinquante",
    "soixante",
    "soixante",
    "quatre-vingt",
    "quatre-vingt"
  };

j'ai trouver la solutions .
0
ou pour ?
  String snumber = Long.toString(number);

    // pad des "0"
    String mask = "000000000000";
    DecimalFormat df = new DecimalFormat(mask);
    snumber = df.format(number);

    // XXXnnnnnnnnn
    int lesMilliards = Integer.parseInt(snumber.substring(0,3));
    // nnnXXXnnnnnn
    int lesMillions  = Integer.parseInt(snumber.substring(3,6));
    // nnnnnnXXXnnn
    int lesCentMille = Integer.parseInt(snumber.substring(6,9));
    // nnnnnnnnnXXX
    int lesMille = Integer.parseInt(snumber.substring(9,12));

c'est dans ce genre de chose que j'ai des difficulté pour traduire puisque je ne connaît pas JAVA .
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
29 mai 2016 à 20:05
Bonjour,

La séquence au début du convert() est en effet spéciale, pour extraire les chiffres d'un nombre, elle utilise des substring().

Le portage de ces lignes donne :
char sSumber[12+1];
sprintf( sNumber , "%012lu" , number ); // <=> aux 4 premières lignes
char sc = sNumber[3];
sNumber[3] = '\0';
int lesMilliards = strtoul( &sNumber[0] , NULL , 10 );
sNumber[3] = sc;

sc = sNumber[6];
sNumber[6] = '\0';
int lesMillions = strtoul( &sNumber[3] , NULL , 10 );
sNumber[6] = sc;
...

On voit que code Java veut extraire du nombre les 3 chiffres formant les milliards, les 3 formant les millions, puis les 3 formant les milliers. Mais en 'pensant' C, on ferait cela autrement.
0
Bonjour et merci pour ta réponse ,
est ce que le code que t'a écrit c'est exactement le même que ce code ?
String snumber = Long.toString(number);

    // pad des "0"
    String mask = "000000000000";
    DecimalFormat df = new DecimalFormat(mask);
    snumber = df.format(number);

    // XXXnnnnnnnnn
    int lesMilliards = Integer.parseInt(snumber.substring(0,3));
    // nnnXXXnnnnnn
    int lesMillions  = Integer.parseInt(snumber.substring(3,6));
    // nnnnnnXXXnnn
    int lesCentMille = Integer.parseInt(snumber.substring(6,9));
    // nnnnnnnnnXXX
    int lesMille = Integer.parseInt(snumber.substring(9,12));

Si oui peut tu m'expliquer plus en détails le traitement ?
Merci .
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101 > mememe
29 mai 2016 à 21:58
Oui, c'est le même code lusqu'à la ligne int lesMillions = ...

Les 2 1ères lignes correspondent aux 4 1ères lignes Java.
Elles consistent à écrire le nombre en ajoutant jusqu'à 12 zéros au début.
exemple : le nombre 1234567 donne la chaîne "000001234567".

La ligne java 'int les Milliards ...' est codée en 4 lignes en C.
Cela consiste à extraire de la chaîne précédente les 3 premiers caractères et les transformer en nombre. Java utilise sa capacité à travailler sur les chaînes et à reconvertir le résultat en nombre. En C, cela est complexe, car le C n'a pas de fonction simple de manipulation des chaînes, c'est pourquoi porter un code d'un langage vers un autre est souvent retord.
Ici, Il suffit de tout remplacer par :
int lesMilliards  = nombre / 1000000000;
int lesMillions = (nombre / 1000000) % 1000;
int lesMille = (nombre / 1000) % 1000; // erreur de nommage Java appelle ça lesCentMille
int lesUnites = nombre % 1000; // erreur de nommage Java appelle ça lesMilles.
Et voilà tout est codé en 4 lignes si on oublie Java!
0
Merci pour ta réponse ,
j'ai très bien compris merci , et pour
 // pad des "0"
    String mask = "000000000000";
    DecimalFormat df = new DecimalFormat(mask);
    snumber = df.format(number);


sait-tu a quoi pourrait bien servir ce code et si il est primordiale comment il se traduira en C ?
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101 > mememe
29 mai 2016 à 22:17
Je te l'ai dit avant, il force des zéro devant le nombre, et ne sert plus à rien dans le code C.
0
Sinon voila j'ai finit de traduire mais il ne marche pas xD donc je ne sais pas si j'ai mal traduit ou j'ai oublier un truc merci de vérifier le code et me corriger SVP
#include <stdio.h>
#include <stdlib.h>

static char uniteNames1[][15] = { "",
    "un",
    "deux",
    "trois",
    "quatre",
    "cinq",
    "six",
    "sept",
    "huit",
    "neuf",
    "dix",
    "onze",
    "douze",
    "treize",
    "quatorze",
    "quinze",
    "seize",
    "dix-sept",
    "dix-huit",
    "dix-neuf"
    };

static char dizaineNames[][15] = {
    "",
    "",
    "vingt",
    "trente",
    "quarante",
    "cinquante",
    "soixante",
    "soixante",
    "quatre-vingt",
    "quatre-vingt" };
static char uniteNames2[][15] = {
"",
    "",
    "deux",
    "trois",
    "quatre",
    "cinq",
    "six",
    "sept",
    "huit",
    "neuf",
    "dix"
    };

 char convertZeroToHundred ( int number){
  int laDizaine = number / 10;
    int lUnite = number % 10;
    char resultat = "";

  switch (laDizaine) {
    case 1 :
    case 7 :
    case 9 :
      lUnite = lUnite + 10;
      break;

    }

    // s�parateur "-" "et"  ""
    char laLiaison = "";
    if (laDizaine > 1) {
      laLiaison = "-";
    }
    // cas particuliers
     switch (lUnite) {
    case 0:
      laLiaison = "";
      break;
    case 1 :
      if (laDizaine == 8) {
        laLiaison = "-";
      }
      else {
        laLiaison = " et ";
      }
      break;
    case 11 :
      if (laDizaine==7) {
        laLiaison = " et ";
      }
      break;

    }

    // dizaines en lettres
    switch (laDizaine) {
    case 0:
      resultat = uniteNames1[lUnite];
      break;
    case 8 :
      if (lUnite == 0) {
        resultat = dizaineNames[laDizaine];
      }
      else {
        resultat =* dizaineNames[laDizaine]  + laLiaison + uniteNames1[lUnite];
      }
      break;
    default :
      resultat = *dizaineNames[laDizaine] + laLiaison + uniteNames1[lUnite];
    }
    return resultat;

 }
 char convertLessThanOneThousand ( int number)
 {
     int lesCentaines = number / 100;
    int leReste = number % 100;
    char sReste = convertZeroToHundred(leReste);
char resultat;

       switch (lesCentaines) {
    case 0:
      resultat = sReste;
      break;
    case 1 :
      if (leReste > 0) {
        resultat = "cent " + sReste;
      }
      else {
        resultat = "cent";
      }
      break;
    default :
      if (leReste > 0) {
        resultat = *uniteNames2[lesCentaines] + " cent " + sReste;
      }
      else {
        resultat = *uniteNames2[lesCentaines] + " cents";
      }
    }
    return resultat;
  }


 char convert (long number)
 {
  if (number == 0) { return "zéro"; }

     char snumber = number;
char mask = "000000000000";
/*char df = new char(mask);
    snumber = df.format(number);*/

    int lesMilliards  = number / 1000000000;
int lesMillions = (number / 1000000) % 1000;
int lesCentMille = (number / 1000) % 1000; 
int lesMille = number % 1000;  char tradMilliards;
    switch (lesMilliards) {
    case 0:
      tradMilliards = "";
      break;
    case 1 :
      tradMilliards = convertLessThanOneThousand(lesMilliards)  + " milliard ";
      break;
    default :
      tradMilliards = convertLessThanOneThousand(lesMilliards)   + " milliards ";
    }
    char resultat =  tradMilliards;

    char tradMillions;
    switch (lesMillions) {
    case 0:
      tradMillions = "";
      break;
    case 1 :
      tradMillions = convertLessThanOneThousand(lesMillions) + " million ";
      break;
    default :
      tradMillions = convertLessThanOneThousand(lesMillions) + " millions ";
    }
    resultat =  resultat + tradMillions;

    char tradCentMille;
    switch (lesCentMille) {
    case 0:
      tradCentMille = "";
      break;
    case 1 :
      tradCentMille = "mille ";
      break;
    default :
      tradCentMille = convertLessThanOneThousand(lesCentMille) + " mille ";
    }
    resultat =  resultat + tradCentMille;

    char tradMille;
    tradMille = convertLessThanOneThousand(lesMille);
    resultat =  resultat + tradMille;

    return resultat;
 }

int main()
{
    long number;
    printf("Entrez Le Nombre : ");
    scanf("%ld",&number);
 char resultat = convert(number);
    printf("%s",resultat);

getch();
    return 0;
}
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
30 mai 2016 à 01:43
La concaténation des chaines de caractères ne se fait pas avec des '+' en C.

Un char c'est un simple caractère. Pour copier, concaténer et retourner d'une fonction une chaîne de caractère, il faut voir ton cours.

A quoi sert ?
char snumber = number;
char mask = "000000000000";

Le compilateur a du voir comme moi des dizaines d'erreurs. Il les signale par des warnings. Il faut les lire.

Par exemple dans le main()
    // non pas : char resultat = convert(number);
    //           printf("%s",resultat);

    char resultat[200];    // mais plutôt
    convert( number , resultat );
    printf( "%s" , resultat );
0
Bonjour ,
Le programme s'execute tres bien mais sa donne pas ce qu'il doit donner , quand je saisi un nombre il affiche des caractère incomprehensible .
Une eventuelle solution pour cela ?
Merci.
0
paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 25
1 juin 2016 à 19:01
Messages d'erreur du compilateur ?

Effectivemet, on ne concatène pas les chaînes de caractères par des +, on utilise la fonction strcat de string.h.

Traduire un programme écrit dans un langage orienté objet comme le Java vers un langage impératif comme le C est une entreprise très difficile. Le traduire en C++ aurait été beaucoup plus simple.

En gros: je suis sûr que réécrire entièrement le programme par toi-même (que pour le coup je trouve très amusant et très intéressant comme exercice, convertir des nombres décimaux en lettres!) sera plus simple que de le traduire.
0