Conversão de base numérica em Portugol (VisuAlg)

Para converter um número decimal para outra base, divide-se o número pela base repetidas vezes: os restos, lidos de trás para frente, são os dígitos do resultado.

O exemplo usa div (divisão inteira), mod (resto) e as funções copia e numpcarac para montar o texto do resultado.

Dialeto: VisuAlg para div mod copia numpcarac

Código em Portugol

algoritmo "conversao_de_base"
var
   indice, xresto, decimal, base, xp: inteiro
   xc, letras: caractere
inicio
   letras <- "ABCDEF"
   escreva("Número decimal (até 65535): ")
   leia(decimal)
   escreva("Base (2 a 16): ")
   leia(base)
   xc <- ""
   para indice de 1 ate 4 faca
      xresto <- (decimal mod base)
      se xresto = 0 entao
         xc <- "0" + xc
      senao
         se xresto > 9 entao
            xp <- xresto - 9
            xc <- copia(letras, xp, 1) + xc
         senao
            xc <- numpcarac(xresto) + xc
         fimse
      fimse
      decimal <- (decimal div base)
   fimpara
   escreval("Resultado (4 dígitos): ", xc)
fimalgoritmo

Executar no editor online

Saída do programa

Digitando 255, 16 quando o programa pede:

Número decimal (até 65535): 255
Base (2 a 16): 16
Resultado (4 dígitos): 00FF

Tradução para outras linguagens

O editor traduz qualquer programa em Portugol para C, Java e JavaScript. Veja como fica este exemplo:

O mesmo programa em C
// Algoritmo "conversao_de_base" — traduzido do Portugol para C.
// Para compilar: gcc programa.c -o programa

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

#define TAM_TEXTO 256

/* Buffers para as funções que devolvem texto (evita ter que usar malloc/free). */
char *texto_temporario(void) {
    static char buffers[8][TAM_TEXTO];
    static int proximo = 0;
    proximo = (proximo + 1) % 8;
    return buffers[proximo];
}

/* Junta dois textos (o "+" entre textos do Portugol). */
char *concatena(const char *a, const char *b) {
    char *resultado = texto_temporario();
    snprintf(resultado, TAM_TEXTO, "%s%s", a, b);
    return resultado;
}

/* copia(texto, posicao, quantidade): a posição começa em 1. */
char *copia(const char *texto, int posicao, int quantidade) {
    char *resultado = texto_temporario();
    int tamanho = (int) strlen(texto);
    int inicio = posicao - 1;
    if (inicio < 0) inicio = 0;
    if (inicio > tamanho) inicio = tamanho;
    if (quantidade > tamanho - inicio) quantidade = tamanho - inicio;
    snprintf(resultado, TAM_TEXTO, "%.*s", quantidade, texto + inicio);
    return resultado;
}

char *inteiro_para_texto(int numero) {
    char *resultado = texto_temporario();
    snprintf(resultado, TAM_TEXTO, "%d", numero);
    return resultado;
}

int main(void) {
    int indice = 0;
    int xresto = 0;
    int decimal = 0;
    int base = 0;
    int xp = 0;
    char xc[TAM_TEXTO] = "";
    char letras[TAM_TEXTO] = "";

    strcpy(letras, "ABCDEF");
    printf("Número decimal (até 65535): ");
    scanf("%d", &decimal);
    printf("Base (2 a 16): ");
    scanf("%d", &base);
    strcpy(xc, "");
    for (indice = 1; indice <= 4; indice++) {
        xresto = decimal % base;
        if (xresto == 0) {
            strcpy(xc, concatena("0", xc));
        } else if (xresto > 9) {
            xp = xresto - 9;
            strcpy(xc, concatena(copia(letras, xp, 1), xc));
        } else {
            strcpy(xc, concatena(inteiro_para_texto(xresto), xc));
        }
        decimal = decimal / base;
    }
    printf("Resultado (4 dígitos): %s\n", xc);

    return 0;
}
O mesmo programa em Java
// Algoritmo "conversao_de_base" — traduzido do Portugol para Java.
// Salve como Main.java e execute: java Main.java

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        int indice = 0;
        int xresto = 0;
        int decimal = 0;
        int base = 0;
        int xp = 0;
        String xc = "";
        String letras = "";

        letras = "ABCDEF";
        System.out.print("Número decimal (até 65535): ");
        decimal = Integer.parseInt(entrada.nextLine().trim());
        System.out.print("Base (2 a 16): ");
        base = Integer.parseInt(entrada.nextLine().trim());
        xc = "";
        for (indice = 1; indice <= 4; indice++) {
            xresto = decimal % base;
            if (xresto == 0) {
                xc = "0" + xc;
            } else if (xresto > 9) {
                xp = xresto - 9;
                xc = copia(letras, xp, 1) + xc;
            } else {
                xc = String.valueOf(xresto) + xc;
            }
            decimal = decimal / base;
        }
        System.out.println("Resultado (4 dígitos): " + xc);
    }

    // copia(texto, posicao, quantidade): a posição começa em 1.
    static String copia(String texto, int posicao, int quantidade) {
        int inicio = Math.min(Math.max(posicao - 1, 0), texto.length());
        int fim = Math.min(inicio + quantidade, texto.length());
        return texto.substring(inicio, fim);
    }
}
O mesmo programa em JavaScript
// Algoritmo "conversao_de_base" — traduzido do Portugol para JavaScript.
// Para executar (Node.js): node programa.js

const readline = require('node:readline');

// Lê uma linha digitada no teclado.
const teclado = readline.createInterface({ input: process.stdin });
const linhas = teclado[Symbol.asyncIterator]();
async function leia() {
  const linha = await linhas.next();
  return linha.done ? '' : linha.value;
}

async function main() {
  let indice = 0;
  let xresto = 0;
  let decimal = 0;
  let base = 0;
  let xp = 0;
  let xc = "";
  let letras = "";

  letras = "ABCDEF";
  process.stdout.write("Número decimal (até 65535): ");
  decimal = parseInt(await leia(), 10);
  process.stdout.write("Base (2 a 16): ");
  base = parseInt(await leia(), 10);
  xc = "";
  for (indice = 1; indice <= 4; indice++) {
    xresto = decimal % base;
    if (xresto === 0) {
      xc = "0" + xc;
    } else if (xresto > 9) {
      xp = xresto - 9;
      xc = letras.slice(xp - 1, xp - 1 + 1) + xc;
    } else {
      xc = String(xresto) + xc;
    }
    decimal = Math.trunc(decimal / base);
  }
  console.log(`Resultado (4 dígitos): ${xc}`);

  teclado.close();
}

main();

Outros exemplos de Portugol