Jump to content
weltonaparecido

Converter código em C/C++ para Javascript

Recommended Posts

tenho um código em C++ e gostaria de fazer ele idêntico para Javascript mas não tenho conhecimento pra isso, alguem pode me ajudar?? Segue o código abaixo em C++:

 

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


char * unidades[]  = { "Zero", "Um", "Dois", "Tres", "Quatro", "Cinco", "Seis", "Sete", "Oito", "Nove" };
char * dez_vinte[] = { "", "Onze", "Doze", "Treze", "Quatorze", "Quinze", "Dezesseis", "Dezessete", "Dezoito", "Dezenove" };
char * dezenas[]   = { "", "Dez", "Vinte", "Trinta", "Quarenta", "Cinquenta", "Sessenta", "Setenta", "Oitenta", "Noventa" };
char * centenas[]  = { "", "Cento", "Duzentos", "Trezentos", "Quatrocentos", "Quinhentos", "Seiscentos", "Setecentos", "Oitocentos", "Novecentos" };


char * strcatb( char * dst, const char * src )
{
    size_t len = strlen(src);
    memmove( dst + len, dst, strlen(dst) + 1 );
    memcpy( dst, src, len );
    return dst;
}


char * traduzir_numero( char * nome, int n )
{
    int c = n / 100;
    int d = n / 10 - c * 10;
    int u = n - (n / 10) * 10;
    int dv = d * 10 + u;


    strcpy( nome, unidades[ u ] );

    if( n < 10 )
        return nome;

    if ( (dv > 10) && (dv < 20) )
    {
        strcpy( nome, dez_vinte[ dv - 10 ] );
    }
    else
    {
        if( u == 0 )
        {
            strcpy( nome, dezenas[ d ] );
        }
        else
        {
            strcatb( nome, " e " );
            strcatb( nome, dezenas[d] );
        }
    }

    if( n < 100 )
        return nome;

    if( (d == 0) && ( u == 0 ) )
    {
        if( c == 1 )
            strcpy( nome, "Cem" );
        else
            strcpy( nome, centenas[c] );
    }
    else
    {
        strcatb( nome, " e " );
        strcatb( nome, centenas[c] );
    }

    return nome;
}


int main( int argc, char * argv[] )
{
    int i = 0;
    char extenso[ 100 ] = {0};
    int num[] = { 0, 1, 10, 13, 100, 123, 321, 111, 333, 777, 910, -1 };

    while( num != -1 )
    {
        traduzir_numero( extenso, num );

        printf( "%d: %s\n", num, extenso );

        i++;
    }

    return 0;
    
    printf("\n\nFim...");
    
    getchar();
    
}

 

Share this post


Link to post
Share on other sites

ES6+, minha versão:

const numToNamesDict = {
  'pt-BR': new Map(Object.entries({
    'groups': [
      [
        'um', 'dois', 'tres', 'quatro', 'cinco', 'seis',
        'sete', 'oito', 'nove'
      ],

      [
        'dez', 'vinte', 'trinta', 'quarenta', 'cinquenta', 'sessenta',
        'setenta', 'oitenta', 'noventa'
      ],

      [
        'cento', 'duzentos', 'trezentos', 'quatrocentos', 'quinhentos', 
        'seiscentos', 'setecentos', 'oitocentos', 'novecentos'
      ],
    ],

    'large-groups': [
      ['', ''], 
      ['mil', 'mil'], 
      ['milhao', 'milhoes'], 
      ['bilhao', 'bilhoes'], 
      ['trilhao', 'trilhoes']
    ],

    'group-sep': ' e ',
    'large-group-inner-sep': ' ',
    'large-group-outer-sep': ', ',
    'large-group-outer-sep-distinct': ' e ',

    'fixed': new Map([
      [0, 'zero'],
      [100, 'cem']
    ]),

    'fixed-pieces': new Map([
      [11, 'onze'], 
      [12, 'doze'], 
      [13, 'treze'], 
      [14, 'quatorze'], 
      [15, 'quinze'], 
      [16, 'dezesseis'],
      [17, 'dezessete'], 
      [18, 'dezoito'], 
      [19, 'dezenove']
    ]),

    'positive': '',
    'negative': ' negativo'
  }))
};

const flatten = xss => [].concat.apply([], xss);

const _throw = x => {throw x};

const _validate = (x, y) =>
  !(Number.isInteger(x) && Number.isInteger(y) &&
    !(x === 1 && y === 1) && y > 0 && x >= 0) &&

  _throw(new Error(`Invalid nums supplied: ${x}, ${y}`));

const divMod = (x, y) => [Math.trunc(x/y), x%y];

function* _splitNum(x, y) {
  const [d, m] = divMod(x, y);

  if(d === 0) {
    yield x;
  } else {
    yield m;
    yield* _splitNum(d, y);
  }
}

function* splitNum(x, y) {
  _validate(x, y);

  yield* _splitNum(x, y);
}

const groupToName = dict => y => n => {
  _validate(n, y);

  const groups        = dict.get('groups');
  const fixed         = dict.get('fixed');
  const fixedPieces   = dict.get('fixed-pieces');

  if(fixed.has(n)) {
    return fixed.get(n);
  }

  const f = (i, y, n) => {
    const y1      = Math.trunc(y/10);
    const [d, m]  = divMod(n, y1);

    return (d === 0                 ? [] :
            d <= groups[i-1].length ? [groups[i-1][d-1]] :
            _throw(new RangeError(
              `The digit ${d} is not defined in the ${i}-th group`
            ))
    ).concat(
      fixedPieces.has(m) ?
        fixedPieces.get(m) : (m !== 0 ? f(i-1, y1, m) : [])
    );
  };

  return (n < y) ?

    f(groups.length, y, n).join(dict.get('group-sep')) :

    _throw(new RangeError(
      `Groups must have at most ${groups.length} digits, ` +
      `${n} supplied.`
    ));
};

const numToNameIntermediate = dict => y => n => {
  const largeGroups  = dict.get('large-groups');
  const groupToName_ = groupToName(dict)(y);

  const xs = Array.from(splitNum(n, y));

  return (xs.length <= largeGroups.length) ? 

    xs.reduce((r, x, i) =>
      r.concat([
        [x, groupToName_(x), largeGroups[i]]
      ])
    , []).reverse() : 

    _throw(new RangeError(
      `The ${xs.length} large-group is not defined.`
    ));
};

const _numToName = dict => y => n => {
  if(n === 0) {
    return ['', dict.get('fixed').get(0), '', ''];
  }

  const innerSep = dict.get('large-group-inner-sep');
  const outerSep = [
    dict.get('large-group-outer-sep'),
    dict.get('large-group-outer-sep-distinct')
  ];

  const y1 = Math.trunc(y/10);

  return numToNameIntermediate(dict)(y)(n).map(z => {
    const v = z[0];
    const m = v%y1;

    return v === 0 ? ['', ''] : [
      outerSep[(m === 0 || v < y1) ? 1 : 0],
      z[1], innerSep,
      z[2][(m > 1) ? 1 : 0]
    ];
  });
};

const numToName = dict => y => n =>
  flatten(_numToName(dict)(y)(Math.abs(n))).slice(1, -2).join('').concat(
    (n >= 0) ? dict.get('positive') : dict.get('negative')
  );

const numToNameFn = {
  'pt-BR': numToName(numToNamesDict['pt-BR'])(1000)
};

const capitalize = s => s.charAt(0).toUpperCase() + s.slice(1);

//B combinator
const B = f => g => x => f(g(x));

//showcase
const f     = B(capitalize)(numToNameFn['pt-BR']);
const print = console.log;

const nums  = [0, 1, 10, 13, 100, 123, 321, 111, 333, 777, 910, -1];

nums.forEach(B(print)(f));
/**
 * Ouputs:
  Zero
  Um
  Dez
  Treze
  Cem
  Cento e vinte e tres
  Trezentos e vinte e um
  Cento e onze
  Trezentos e trinta e tres
  Setecentos e setenta e sete
  Novecentos e dez
  Um negativo
**/

 

 

Share this post


Link to post
Share on other sites

e como faço para rodar este código no HTML?

 

Desculpe minha ignorância, mas estou começando a estudar agora e meu professor já pediu que desenvolvesse um código em HTML e Javascript onde o usuário digite um numero qualquer e o JS retorna o valor por extenso.

11 horas atrás, leosbotelho disse:

ES6+, minha versão:


const numToNamesDict = {
  'pt-BR': new Map(Object.entries({
    'groups': [
      [
        'um', 'dois', 'tres', 'quatro', 'cinco', 'seis',
        'sete', 'oito', 'nove'
      ],

      [
        'dez', 'vinte', 'trinta', 'quarenta', 'cinquenta', 'sessenta',
        'setenta', 'oitenta', 'noventa'
      ],

      [
        'cento', 'duzentos', 'trezentos', 'quatrocentos', 'quinhentos', 
        'seiscentos', 'setecentos', 'oitocentos', 'novecentos'
      ],
    ],

    'large-groups': [
      ['', ''], 
      ['mil', 'mil'], 
      ['milhao', 'milhoes'], 
      ['bilhao', 'bilhoes'], 
      ['trilhao', 'trilhoes']
    ],

    'group-sep': ' e ',
    'large-group-inner-sep': ' ',
    'large-group-outer-sep': ', ',
    'large-group-outer-sep-distinct': ' e ',

    'fixed': new Map([
      [0, 'zero'],
      [100, 'cem']
    ]),

    'fixed-pieces': new Map([
      [11, 'onze'], 
      [12, 'doze'], 
      [13, 'treze'], 
      [14, 'quatorze'], 
      [15, 'quinze'], 
      [16, 'dezesseis'],
      [17, 'dezessete'], 
      [18, 'dezoito'], 
      [19, 'dezenove']
    ]),

    'positive': '',
    'negative': ' negativo'
  }))
};

const flatten = xss => [].concat.apply([], xss);

const _throw = x => {throw x};

const _validate = (x, y) =>
  !(Number.isInteger(x) && Number.isInteger(y) &&
    !(x === 1 && y === 1) && y > 0 && x >= 0) &&

  _throw(new Error(`Invalid nums supplied: ${x}, ${y}`));

const divMod = (x, y) => [Math.trunc(x/y), x%y];

function* _splitNum(x, y) {
  const [d, m] = divMod(x, y);

  if(d === 0) {
    yield x;
  } else {
    yield m;
    yield* _splitNum(d, y);
  }
}

function* splitNum(x, y) {
  _validate(x, y);

  yield* _splitNum(x, y);
}

const groupToName = dict => y => n => {
  _validate(n, y);

  const groups        = dict.get('groups');
  const fixed         = dict.get('fixed');
  const fixedPieces   = dict.get('fixed-pieces');

  if(fixed.has(n)) {
    return fixed.get(n);
  }

  const f = (i, y, n) => {
    const y1      = Math.trunc(y/10);
    const [d, m]  = divMod(n, y1);

    return (d === 0                 ? [] :
            d <= groups[i-1].length ? [groups[i-1][d-1]] :
            _throw(new RangeError(
              `The digit ${d} is not defined in the ${i}-th group`
            ))
    ).concat(
      fixedPieces.has(m) ?
        fixedPieces.get(m) : (m !== 0 ? f(i-1, y1, m) : [])
    );
  };

  return (n < y) ?

    f(groups.length, y, n).join(dict.get('group-sep')) :

    _throw(new RangeError(
      `Groups must have at most ${groups.length} digits, ` +
      `${n} supplied.`
    ));
};

const numToNameIntermediate = dict => y => n => {
  const largeGroups  = dict.get('large-groups');
  const groupToName_ = groupToName(dict)(y);

  const xs = Array.from(splitNum(n, y));

  return (xs.length <= largeGroups.length) ? 

    xs.reduce((r, x, i) =>
      r.concat([
        [x, groupToName_(x), largeGroups[i]]
      ])
    , []).reverse() : 

    _throw(new RangeError(
      `The ${xs.length} large-group is not defined.`
    ));
};

const _numToName = dict => y => n => {
  if(n === 0) {
    return ['', dict.get('fixed').get(0), '', ''];
  }

  const innerSep = dict.get('large-group-inner-sep');
  const outerSep = [
    dict.get('large-group-outer-sep'),
    dict.get('large-group-outer-sep-distinct')
  ];

  const y1 = Math.trunc(y/10);

  return numToNameIntermediate(dict)(y)(n).map(z => {
    const v = z[0];
    const m = v%y1;

    return v === 0 ? ['', ''] : [
      outerSep[(m === 0 || v < y1) ? 1 : 0],
      z[1], innerSep,
      z[2][(m > 1) ? 1 : 0]
    ];
  });
};

const numToName = dict => y => n =>
  flatten(_numToName(dict)(y)(Math.abs(n))).slice(1, -2).join('').concat(
    (n >= 0) ? dict.get('positive') : dict.get('negative')
  );

const numToNameFn = {
  'pt-BR': numToName(numToNamesDict['pt-BR'])(1000)
};

const capitalize = s => s.charAt(0).toUpperCase() + s.slice(1);

//B combinator
const B = f => g => x => f(g(x));

//showcase
const f     = B(capitalize)(numToNameFn['pt-BR']);
const print = console.log;

const nums  = [0, 1, 10, 13, 100, 123, 321, 111, 333, 777, 910, -1];

nums.forEach(B(print)(f));
/**
 * Ouputs:
  Zero
  Um
  Dez
  Treze
  Cem
  Cento e vinte e tres
  Trezentos e vinte e um
  Cento e onze
  Trezentos e trinta e tres
  Setecentos e setenta e sete
  Novecentos e dez
  Um negativo
**/

 

 

e como faço para rodar este código no HTML?

 

Desculpe minha ignorância, mas estou começando a estudar agora e meu professor já pediu que desenvolvesse um código em HTML e Javascript onde o usuário digite um numero qualquer e o JS retorna o valor por extenso.

Share this post


Link to post
Share on other sites

Fix:

110,112c110
<   const c = Math.ceil(Math.log10(n)/Math.log10(y));
< 
<   return (c < groups.length) ?
---
>   return (n < y) ?
118,119c116,117
<       `${c+1} digits group supplied.`
<     ));
---
>       `${n} supplied.`
>     ));

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Quencyjones79
      Olá boa tarde, sou iniciante na linguagem PHP, embora tenha umas noções básicas do código e estou com algumas dificuldades dúvidas no código que está a cor de laranja, se alguém que perceba de código PHP se me puder ajudar, agradecia imenso a ajuda.
       
       
      <?php 
      include "..\ligacao.php";
      ?>
               
      <?php
      $idFunc=$_POST['idFunc'];
      $NomeAlterado=$_POST['NomeAlterado'];
      $idLoja=$_POST['idLoja'];
      $permissao=$_POST['permissao'];
      if($idLoja=="Selecione..."){
          $idLoja=$_POST['idLojaAtual'];
      }
      if($permissao==NULL){
          $qfunc="UPDATE funcionario SET nome_func='".$NomeAlterado."',id_loja='".$idLoja."' WHERE id_func='".$idFunc."'";
          $connfunc=mysqli_query($ligax,$qfunc); 
       }else{    
          $qfunc="UPDATE funcionario SET nome_func='".$NomeAlterado."',id_loja='".$idLoja."', ativo_func='".$permissao."' WHERE id_func='".$idFunc."'";
          $connfunc=mysqli_query($ligax,$qfunc);
       }
      if($connfunc==1){
           print"<script> alert('Funcionário alterado com sucesso!');
                       location.href='../inserirfuncionario.php';</script>";
          exit;
      }else{
      print"<script> alert('Não foi possível alterar o Funcionário!');
          location.href='../inserirfuncionario.php';</script>";
      exit;
      }    
      ?>
       
      Atentamente,
       
      José Moreira
       
    • By fideles
      Fala pessoal, como anda as coisas?
       
      Meu conhecimento em JS e quase neutro, conheço algo, mais talvez não o suficiente para o que eu precise, por isso venho pedir ajuda a vocês,
       
      Tenho um pequeno programinha, simples mesmo que tem 4 areas (Administração, Compras, Financeiro, Almoxarifado).
       
      Quem fica na ADM solicita algo,  compras visualiza e da um "ok" e o financeiro tbm tem que dar um "ok" e no final, o almoxarifado dá um "Processo Concluido" (está parte está ok, funcionando, sem erro)
       
      Meu problema seria que quem está no almoxarifado consegue clicar no botão "Processo Concluido" mesmo o pessoal de compras e financeiro não dando um "ok" na solicitação ou ele tbm consegue dar "Processo Concluido" se um ou outro dar um "ok". Precisaria que ele so conseguisse dar "Processo Concluido" se os dois darem o "ok", se so um dar "ok" ele não pode dar "Processo Concluido".
       
      Alguém consegue pelo menos me dar um norte para que eu possa dar continuidade? Já tentei em PHP e nada.
       
    • By Sapinn
      Tenho um form que pergunto o nome, sobrenome, email, idade e telefone de contato. Como faço para verificar se o email digitado já foi cadastrado e retorna na mesma pagina uma mensagem caso ele ja existe ou prosseguir para a area do usuario caso ele não exista sem da refresh na página.
    • By mamotinho
      Olá, gostaria de sabe como posso fazer uma contagem regressiva apartir de um registro em meu banco de dados eu tentei montar um código da seguinte forma:

       
      <? $DateGET = date('m/d/Y H:i A', strtotime($result->DateDiscount)); ?> <script> var valueDate = <?=$DateGET?>; var end = new Date(valueDate); var _second = 1000; var _minute = _second * 60; var _hour = _minute * 60; var _day = _hour * 24; var timer; function showRemaining() { var now = new Date(); var distance = end - now; if (distance < 0) { clearInterval(timer); document.getElementById("countdown").innerHTML = "EXPIRED!"; return; } var days = Math.floor(distance / _day); var hours = Math.floor((distance % _day) / _hour); var minutes = Math.floor((distance % _hour) / _minute); var seconds = Math.floor((distance % _minute) / _second); document.getElementById("countdown").innerHTML = "<span class='n_date day' id='days'>" + days + "</span><span class='date'>일</span>"; document.getElementById("countdown").innerHTML += "<span class='n_time hour' id='hrs'>" + hours + "</span>"; document.getElementById("countdown").innerHTML += "<span class='n_time minute' id='minus'>" + minutes + "</span>"; document.getElementById("countdown").innerHTML += "<span class='n_time second' id='secs'>" + seconds + "</span>"; } timer = setInterval(showRemaining, 1000); </script> Mais infelizmente não passou a data registrada no banco de dados, alguém teria ideia de como posso ta fazendo.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.