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 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.
    • By adrianno
      Olá, estou com a seguinte dúvida com uso do JWT , trabalho com PHP a um tempo e estou migrando alguns projetos para formato API REST,  mas também começando a trabalhar com JS,REACT, NODE etc e a dúvida basicamente se aplica independente da linguagem uma vez  que o formato JWT é padrão.
      Vamos lá,   imagine que ao fazer um login bem sucedido o usário receba um token JWT  padrão, e no payload  coloquei o ID: "ff0eb2864feb22354747f8c85d42ccb5" e EMAIL :  "email@teste.com" do usuário junto com outras info padrão de um JWT,   mas qual pe a forma mais correta de validar este token?  usando métodos de verificar a assinatura, ok,   desmontando e montando novamente o token passado para comparar, OK  mas como eu verifico a integridade do usuário, imagine que eu de alguma forma um usuário malicioso obtenha o token de outro usuário, se ele enviar este token em uma requisição, ele seria aceito, mesmo sem ter que fazer o login de usuário, uma vez  que a rota em questão vai verificar o token e o mesmo teoricamente vai funcionar e este teria acesso a API em nome de outro usuário. Quais são as formas corretas de se trabalhar com JWT?
    • By Jack Oliveira
      Ola boa tarde pessoal
      poderia me dar uma ajuda preciso fazer um modo de revista  para um site mostrar uns parceiros
      a ideia seria igual deste site aqui
       
      Revista JS
       
      dentro dela seria para lista em grid grupar de 4 em 4 em cada página desta revista nela não terá valores nem nada apenas as imagem mesmo e o titulo
       
      se tiver uma boa solução de como fazer ou se alguém com mais pratica em js e css puder ajudar fico grato
    • By sirrocha
      Olá pessoal, sou iniciante só que tenho um projeto com uma certa pressão de tempo pra fazer. Um dos problemas que estou tendo é relacionado ao clicar em um tipo "a href" e aplicar uma função. Pelo que vi, tenho que usar AJAX mas não tenho nenhuma noção de como iniciar, mesmo vendo muitos vídeos...

      Basicamente tenho uma página onde está carregando algumas sessões. Porém, ao clicar neste botão:
       
      1 <p><a class="link" name="final" id="fin" onclick="finalizar()" href="areaUsuario.php" style="text-decoration:none;">finalizar</a></p>

      Estava tentando chamar uma função do tipo finalizar(), que iria dar UNSET em duas sessões específicas que eu precisava desligar (por isso não posso usar o destroy para tirar todas).
       
      1 2 3 4 5 6 7 8 9 <script type="text/javascript">>     <?php     function finalizar() {         unset($_SESSION['prestacao']);         unset($_SESSION['nomeproj']);         header("location:areaUsuario.php");     }     ?> </script>

      O que eu fiz e falaram que estava errado era isso. Como posso usar o AJAX neste caso para desligar essas duas funções e enviar o usuário para a área inicial? Por favor, se possível, enviar uma base de como poderia fazer com o raciocínio. É algo urgente, mas também gostaria de aprender.
    • By Sapinn
      Pessoal preciso de um ajuda tenho um código eu preciso bloquear os campos que aparecem em um while do php o problema tá sendo que só o primeiro campo ta pegando o desabled todos os outros continuam normais.
      Segue o código que eu estou tentando:
      <!DOCTYPE html> <html lang="pt-br">   <head>     <title>Meu site</title>     <meta charset="utf-8">    <script type="text/javascript" language="javascript"> function Mudarestado(el) {     var display = document.getElementById(el).style.display;     var select = document.getElementById('select');     var value = select.options[select.selectedIndex].value;     console.log(value);          if(value === 'TurmasEspecificas') {         document.getElementById(el).style.display = 'block';         document.getElementById("campo_turma").disabled = true;     } else {         document.getElementById(el).style.display = 'none';     } } </script>                               <div class="form-group">                 <label class="label-form">Escolha uma Turma:</label>      <select class="campo-contato" name="codigo_turma" onchange="Mudarestado('minhaDiv')" id="select">   <option name="codigo_turma" value="TodasTurmas">Todas minhas turmas</option>   <option name="codigo_turma" value="TurmasEspecificas" >Escolher turmas especificas</option>     <?php         $result = mysqli_query($conn,"select * from turma where codigo_professor = '".$professor['id']."'");        while($pegaTurma = mysqli_fetch_assoc($result)) {         echo '<option value="'.$pegaTurma['id'].'" name="codigo_turma"> '.$pegaTurma['nome_turma'].' - '.$pegaTurma['escola_turma'].' </option>';        }     ?> </select> <div id="minhaDiv" style="display: none;"> <h5 style="font-style:italic;color:blue;">Escolha suas turmas que receberão este tema: </h5> <?php  $result = mysqli_query($conn,"select * from turma where codigo_professor = '".$professor['id']."'");  while($pegaTurma = mysqli_fetch_assoc($result)) { ?>       <input type="text" id="campos_turmas" name="turma_escolhida[]" value="<?php echo $pegaTurma['id'];?>" id="campo_turma">        <input type="checkbox" name="marcadas[]"  value="<?php echo $pegaTurma['id'];?>"> <?php echo $pegaTurma['nome_turma']?> - <?php echo $pegaTurma['escola_turma']?><br>      <?php  }    ?>
       
×

Important Information

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