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 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!!
    • By mbs.dev
      Bom estou fazendo um collapse porem ele esta show/hide todos os elementos,
      quando eu clico em sensores chief ele abre todos os sensores chief era para ser apenas aquelas sensores chief q pertence aquele gateway.
      como eu poderia fazer para mostra/esconder apenas naqueles certo.
      tela:

       
      assim esta montado minha função:

       
      butão:

       
      é coloquei aki:

    • By fsantos
      tenho o seguinte codigo e queria uma ajuda para fazer a iteração correta no arquivo json

       
      <!DOCTYPE html>
      <html>
      <head>
      <title>Mapa</title>
      <meta charset="utf-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <style>
            body{margin:0 auto; width:480px; font-family: arial;}
          input.text, textarea, select {
          border: 1px solid #C0C0BA;
          -webkit-box-shadow: inset 0px 0px 5px rgba(0, 0, 0, 0.17);
          -moz-box-shadow: inset 0px 0px 5px rgba(0, 0, 0, 0.17);
          box-shadow: inset 0px 0px 5px rgba(0, 0, 0, 0.17);
          }
      input, textarea, select {
          -webkit-border-radius: 12px;
          -moz-border-radius: 12px;
          border-radius: 12px;
          }
            @media only screen and (max-width: 600px) {
                body {
              width:90%;
                     }
              }
      </style>
      <script type="text/javascript" src="https://fcosantos.com.br/js/jquery-3.3.1.min.js"></script>
          <script type="text/javascript">
        $(document).ready(function () {
          $.getJSON('https://fcosantos.com.br/projetos/covidForm/portugal.json', function (data) {
            var items = [];
            var options = '<option value="">Escolha o distrito</option>';
            $.each(data, function (key, val) {
              options += '<option value="' + val.nome + '">' + val.nome + '</option>';
            });
            $("#estados").html(options);
            $("#estados").change(function () {
              var options_cidades = '';
              var str = "";
              $("#estados option:selected").each(function () {
                str += $(this).text();
              });
              $.each(data, function (key, val) {
                if(val.nome == str) {
                  options_cidades += '<option value="">Escolha o conselho</option>';
                  $.each(val.cidades, function (key_city, val_city) {
                    options_cidades += '<option value="' + val_city.nome + '">' + val_city.nome + '</option>';
                  });
                }
              });
              $("#cidades").html(options_cidades);

              //Busca das freguesias
              $("#cidades").change(function () {
              var options_freguesias = '';
              var str2 = "";
              $("#cidades option:selected").each(function () {
                str2 += $(this).text();
              });
              $.each(data, function (key2, val2) {
                if(val2.cidades.nome == str2) {
                  options_freguesias += '<option value="">Escolha a freguesia</option>';
                  $.each(val2.cidades.freguesias, function (key_freg, val_freg) {
                    options_freguesias += '<option value="' + val_freg.nome + '">' + val_freg.nome + '</option>';
                  });
                }
              });
              $("#freguesias").html(options_freguesias);
              }).change();

              }).change();
          });
        });
          </script>
          </head>
          <body>
              <form method="get" action="">

              <select name="uf" id="estados" style="width:47%; padding:5px; margin-bottom:8px; float:left;">
                  <option value=""></option>
              </select>
              <select name="cid" id="cidades" style="width:47%; padding:5px; margin-bottom:8px; float:right;">
              </select>
              <select name="freg" id="freguesias" style="width:100%; padding:5px; margin-bottom:8px;">
              </select>
              <input type="submit" value="Buscar" style="width:100%; padding:5px; margin-bottom:20px; ">
      </form>
      </body>
      </html>

      O que ocorre é que ao selecionar o primeiro select o segundo é preenchido altomaticamente, mais nao entendi porque o segundo não.
×

Important Information

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