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 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  }    ?>
       
    • By spyryt
      Amigos preciso validar este meu formulario, de forma que ele so envie os dados se o numero do cartão seja valido.
       

                          <form id="updateCreditCard" action="index4.php" method="post">                        
                              <fieldset style="border: none">
                                  
                              
                                  
                          
      <div class="divBlock">
                                      
              <div class="divBlock">
                                      <label for="Numbercpf">CPF *</label>
                                      <input required="required" type="text" name="cpf" id="cpf" maxlength="14" > 
               
                                  </div>
                                <div class="divBlock">
                                  <label for="cartao">Numero do Cartão *</label>
                                  <input type="text" id="holderName" maxlength="19" 
         name="cartao">
                                </div>
                                  
                              
                                  </div>
                                  <div class="btn-container">
                                      <button  onKeyPress="" class="sendUpdating">Continuar</button>
                                  </div>
    • By Sapinn
      Salveee! Certo a dúvida que trarei aqui agora é bem complexa e eu sinceramente não sei se é realmente possível mas acho que não custa nada perguntar.
       
      Fiz um site de envio de textos, onde o aluno envia um texto e o professor corrigi até ai blz, queria saber como eu poderia fazer pra quando o professor marcar uma palavra aprece-se uma caixa de dialogo onde ele colocaria, por exemplo, a correção da palavra ou alguma explicação e essas informações seriam enviadas para o banco de dados quando o aluno acessa a correção desse texto e o ele passa-se  mouse por cima dessa palavra apareceria a correção em um balãozinho. Como exemplo desse comportamento que acabei de citar temos o google documents que faz algo desse jeito. Queria saber se isso pode ser possível sem exigir muito código ou muita coisa. Desde já agradeço.
    • By kaioneresm
      Olá, tenho um form que pede um codigo enviado por email para o usuário confirmar, essa mesma pagina já está gerada o código dentro de uma variável. 
      O que eu preciso é que no momento que o usuário digitar o codigo nesse input text que é composto de 6 digitos, o botão submit habilite (mas somente se o que foi digitado corresponder a variavel). 
       
      Segue abaixo o meu Form.
       
      <input type="text" class="textenv" maxlength="6" placeholder="Digite o código enviado:"></input> <button type="submit" class="btncria" >Confimar<font color="#fff"></font></button> Alguem sabe como utilizar js nesse caso? Muito obrigado!!
×

Important Information

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