Algorítmo; Leitura de N números

Bom dia, pessoal. Vejam bem; eu estou estudando desenovolvimento web e, apesar de gostar mais do lado visual da coisa, eu também gosto (sou perfeccionista nisso) de aprender outras coisas, e quero desenvolver o meu lado lógico também, que não é muito bom.
Eu peguei uma lista de atividade de construção de algorítmo e tentei resolvê-la em portugol, primeiramente. Eis a 1ª questão:


Faça um programa capaz de solicitar um número N (1<N<1000) do usuário e ler N
números inteiros. Após a leitura do último número deve-se informar:
• Na primeira linha a soma dos N números em decimal.
• Na segunda linha a soma em hexadecimal dos números pares informados.
• Na terceira linha a soma em octal dos números impares informados.
Assuma que todos os números fornecidos pelo usuário serão inteiros válidos e que as somas nunca serão superiores a um número inteiro de 32 bits.


Se eu entendi a questão, é possível que o usuário queira entrar com… Não sei, 15 números, como eu vou fazer para o programa identificar o último número digitado sem se alongar acima disso? Por exemplo: Pelo o que entendi, é possível que o usuário entre com 998 números válidos (1< N >1000). Simplesmente empaquei nisso.
Mas aí pedir para o chatGPT resolver esse algorítmo em portugol e em seguida codificar em JS e para minha surpresa aconteceu exatamente o que eu estava pensando: de acordo com o código do chatGPT, se eu digitar; 23,35,45… ele simplesmente fica pedindo números sem chegar a um limite (imagino que esteja esperando os 998 serem digitados). Mas se eu digitar; 2,3,4. Ele me retorna os valores.
**
Eis o código:

algoritmo SomaHexOct
var
    N, i, numero: inteiro
    somaDecimal, somaHexPares, somaOctImpares: inteiro

inicio
    // Solicitar o número N do usuário
    escreva("Digite um número N (1 < N < 1000): ")
    leia(N)

    // Inicializar as somas
    somaDecimal <- 0
    somaHexPares <- 0
    somaOctImpares <- 0

    // Ler N números inteiros
    para i de 1 ate N faca
        escreva("Digite o número ", i, ": ")
        leia(numero)

        // Somar ao total
        somaDecimal <- somaDecimal + numero

        // Verificar se é par (hexadecimal)
        se numero % 2 = 0 entao
            somaHexPares <- somaHexPares + numero

        // Verificar se é ímpar (octal)
        senao
            somaOctImpares <- somaOctImpares + numero
        fimse
    fimpara

    // Exibir resultados
    escreva("Soma dos N números em decimal: ", somaDecimal)
    escreva("Soma em hexadecimal dos números pares: ", hexadecimal(somaHexPares))
    escreva("Soma em octal dos números ímpares: ", octal(somaOctImpares))
fimalgoritmo

Em Javascript:

// Solicitar o número N do usuário
let N = parseInt(prompt("Digite um número N (1 < N < 1000):"));

// Inicializar as somas
let somaDecimal = 0;
let somaHexPares = 0;
let somaOctImpares = 0;

// Ler N números inteiros
for (let i = 1; i <= N; i++) {
    let numero = parseInt(prompt("Digite o número " + i + ":"));

    // Somar ao total
    somaDecimal += numero;

    // Verificar se é par (hexadecimal)
    if (numero % 2 === 0) {
        somaHexPares += numero;
    } else { // Verificar se é ímpar (octal)
        somaOctImpares += numero;
    }
}

// Exibir resultados
console.log("Soma dos N números em decimal: " + somaDecimal);
console.log("Soma em hexadecimal dos números pares: " + somaHexPares.toString(16));
console.log("Soma em octal dos números ímpares: " + somaOctImpares.toString(8));
1 curtida

Li texto e código. Qual é a pergunta?

1 curtida

Ele está correto? Porque se eu digitar 35,46,67. Ele não me retorna os valores dos somatórios. E no desafio está especificado; “que leia N números inteiros”, então, se eu entrar com apenas 3 números, por que ele não me retorna os valores? O mesmo acontece se eu entrar com apenas 15, ou 20 etc…

Ah, em javascript o código está sendo mostrado no console. Aperte F12 e vá na guia “console” para ver a saída de “console.log”, ou então mude “console.log” para “alert” e vai aparecer um alerta da página.

1 curtida

Ah, mano, estava lendo novamente o desafio… Acho que acabei de entender a questão agora (droga eu sou horrível nisso), vou só fazer um teste para ver se é isso que pensei mesmo.

Programação é bem chato nesse sentido de só fazer o que foi pedido! Assumiu alguma coisa? Então provavelmente está errrado.

1 curtida

Foi o que pensei mesmo, erro de interpretação meu. Por isso sou horrível em lógica :pensive: depois de reler umas 10 vezes entendi :expressionless:

O computador:

  1. Só faz o que for pedido.
  2. Faz o que foi pedido mesmo que não faça sentido.
  3. Opera dentro de certas limitações que o programador precisa saber. (não adianta pedir pra somar 72057594037927940 + 1 em JS que não vai retornar 72057594037927941)

Quem inicia em programação precisa pegar bem o primeiro passo.
Quem acha que começou a entender programação precisa pegar bem o segundo passo
E quem acha que sabe programar, precisa pegar bem o terceiro passo.

1 curtida

Olá cidadão @rodrigob0k2, bom dia.
Como está na sua especificação do software abaixo,eu analisei a estrutura do pedido,a arquitetura,e notei conflitos, testei tanto a sua versão de código em portugol, quanto a versão Javascript,mas tem problema de identação.

Então corrigi as duas versões:

No JavaScript:

function main() {
    const prompt = require('prompt-sync')();
    
    // Solicitar um número N do usuário
    let N;
    do {
        N = parseInt(prompt("Digite um número N (1 < N < 1000): "), 10);
    } while (isNaN(N) || N <= 1 || N >= 1000);
    
    // Inicializar arrays para números
    const numbers = [];
    let sum = 0;
    let evenSum = 0;
    let oddSum = 0;
    
    // Ler N números inteiros do usuário
    for (let i = 0; i < N; i++) {
        const num = parseInt(prompt(`Digite o número ${i + 1}: `), 10);
        numbers.push(num);
        sum += num;
        if (num % 2 === 0) {
            evenSum += num;
        } else {
            oddSum += num;
        }
    }
    
    // Exibir resultados
    console.log(`Soma decimal dos N números: ${sum}`);
    console.log(`Soma hexadecimal dos números pares: ${evenSum.toString(16).toUpperCase()}`);
    console.log(`Soma octal dos números ímpares: ${oddSum.toString(8)}`);
}

// Chamar a função principal
main();

No caso a correção no código utiliza a biblioteca prompt-sync para obter a entrada do usuário. Para executar esse código, precisei precisa instalar a biblioteca prompt-sync. Instalei usando o comando:

npm install prompt-sync

No Portugol:

algoritmo "SomaHexOct"
var
    N, i, numero: inteiro
    somaDecimal, somaHexPares, somaOctImpares: inteiro

inicio
    // Solicitar o número N do usuário
    escreva("Digite um número N (1 < N < 1000): ")
    leia(N)

    // Inicializar as somas
    somaDecimal <- 0
    somaHexPares <- 0
    somaOctImpares <- 0

    // Ler N números inteiros
    para i de 1 ate N faca
        escreva("Digite o número ", i, ": ")
        leia(numero)

        // Somar ao total
        somaDecimal <- somaDecimal + numero

        // Verificar se é par (hexadecimal)
        se numero % 2 = 0 entao
            somaHexPares <- somaHexPares + numero
        // Verificar se é ímpar (octal)
        senao
            somaOctImpares <- somaOctImpares + numero
        fimse
    fimpara

    // Exibir resultados
    escreva("Soma dos N números em decimal: ", somaDecimal, "\n")
    escreva("Soma em hexadecimal dos números pares: ", dec2hex(somaHexPares), "\n")
    escreva("Soma em octal dos números ímpares: ", dec2oct(somaOctImpares), "\n")
fimalgoritmo

Então as correções feitas,na indentação eu ajustei a indentação para melhor legibilidade e nas funções de conversão alterei hexadecimal para dec2hex e octal para dec2oct, que são as funções padrão em Portugol para conversão de decimal para hexadecimal e octal, respectivamente. Na quebra de linha adicionei \n nas mensagens de saída para garantir que cada resultado apareça em uma nova linha.

Mas note bem o Sr. que mediante a sua estrutura do seu prompt/arquitetura, tanto no Portugol quanto no Javascript,fiz testes no input de usuário como você mencionou, e ocorre do como você descreve,mas fazendo combinações diferentes como: 3,4,8 por exemplo,ou outras,o resultado pós duas sequências de (ENTERs),foi que o loop infinito é ativado,ok Sr.?! Também testando: 23,35,45 a condição do loop segue retumbante, pirando geral a tropa. Um detalhe importante de seu prompt que notei foi:

Isso pode ter gerado o tal conflito,onde digitando: 3,4,8 ou outras combinações, que não: 2,3,4 o loop pirações clube,kk,segue firme, por conta da estrutura de código=saída gerada pelo prompt de input no chatGPT.

Então resolvi mudar o seu prompt:

Faça um programa capaz de solicitar números digitado pelos usuários entre um a mil e em que este leia estes
números inteiros e após a leitura do último número deve-se informar:

• Na primeira linha a soma dos números em decimal.

• Na segunda linha a soma em hexadecimal dos números pares informados.

• Na terceira linha a soma em octal dos números impares informados.

Assuma que todos os números fornecidos pelo usuário serão inteiros válidos e que as somas nunca serão superiores a mil.

Obs: o software mostra apenas os números do input do usuário, sejam eles 2,3,4 ou,23,35,45 ou 1000,2000,3000
Note bem que o chat construiu o software mediante a minha mudança feita no prompt,mas não usei detalhes técnicos da linguagem Javascript, no prompt, para ele gerar o código. Note bem que o chat só funciona bem e correto nessas condições de engenharia mediante o conhecimento do usuário,eu não sei o seu nível de consciência no Javascript, isso conta muito para resolução adequada no chatGPT em termos de códigos como sintaxe correta para se ter boas construções de código. No final de minha resposta, farei uns questionamentos ao Sr.

Aqui a versão que testei no ambiente Node.js fora do ambiente do browser:

function main() {
    let numbers = [];
    let input;
    while (true) {
        input = prompt("Enter an integer between 1 and 1000 (or type 'done' to finish):");
        if (input.toLowerCase() === 'done') {
            break;
        }
        let number = parseInt(input, 10);
        if (!isNaN(number) && number >= 1 && number <= 1000) {
            numbers.push(number);
        } else {
            alert("Invalid input. Please enter a valid integer between 1 and 1000.");
        }
    }

    let decimalSum = numbers.reduce((acc, num) => acc + num, 0);
    let evenSum = numbers.filter(num => num % 2 === 0).reduce((acc, num) => acc + num, 0);
    let oddSum = numbers.filter(num => num % 2 !== 0).reduce((acc, num) => acc + num, 0);

    console.log(decimalSum);
    console.log(evenSum.toString(16).toUpperCase());
    console.log(oddSum.toString(8));
}

main();

Mas não funciona, porque o erro mostrado no código, ocorre porque a função prompt não está definida no ambiente Node.js. A função prompt é uma função global disponível em navegadores web para receber entrada do usuário via uma janela de diálogo, mas não está disponível no ambiente de execução do Node.js.

Mas porque por que isso acontece? O porquê é que a ambiência no Node.js é um ambiente de execução JavaScript que roda fora do navegador, geralmente no servidor com uso de API,no meu caso tenho tudo configurado tanto no meu celular, desktop e notebook. Então funções como prompt, alert e confirm, que são específicas para interações com o navegador, não estão disponíveis no Node.js. Então sugiro que você tenha o Node.js instalado na sua máquina, também o nodmon e a biblioteca `npm’. E como lhe disse,no celular quanto no meu desktop,e também no notebook, para desenvolvimento em Javascript,eu uso essa galerinha instalada.

Então para resolver e rodar código na ambiência Node.js fora do browser,e para receber entrada do usuário em um ambiente Node.js, você pode usar o módulo readline para ler a entrada do terminal. Aqui está um exemplo de como modificar o código para usar readline,a versão abaixo que funciona no ambiente Node.js:

const readline = require('readline'); 

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

rl.question("Enter an integer between 1 and 1000 (or type 'done' to finish): ", function(input) {
    console.log(`You entered: ${input}`);
    rl.close();
});

Neste exemplo acima @rodrigob0k2,rl.question exibe a mensagem e espera a entrada do usuário no terminal, funcionando de forma semelhante ao prompt no navegador. Caso você não domine conhecimento em Node.js com API via uso de IDE, com arquivo index.js salvo na mesma,você pode usar a plataforma Replit,ou o StackBlitz, pois assim você não precisa instalar nada, você apenas escolhe a tecnologia,no caso o Node.js Replit,o servidor já disponibilizo online. Não tenho como entrar nos detalhes aqui, não é o foco do seu tópico.

Então baseado no meu conhecimento técnico eu gerei uma versão de código em cima do seu modelo.

Minha versão do código em calculadora:

const prompt = require('prompt-sync')();

function main() {
    // Solicitar dois números do usuário
    const num1 = parseFloat(prompt("Digite o primeiro número: "));
    const num2 = parseFloat(prompt("Digite o segundo número: "));

    // Validar os números
    if (isNaN(num1) || isNaN(num2)) {
        console.log("Entrada inválida. Por favor, insira números válidos.");
        return;
    }

    // Realizar as operações
    const soma = num1 + num2;
    const subtracao = num1 - num2;
    const multiplicacao = num1 * num2;
    const divisao = num2 !== 0 ? (num1 / num2) : "Divisão por zero não é permitida";

    // Exibir resultados
    console.log(`Soma: ${soma}`);
    console.log(`Subtração: ${subtracao}`);
    console.log(`Multiplicação: ${multiplicacao}`);
    console.log(`Divisão: ${divisao}`);
}

// Chamar a função principal
main();

Note bem o Sr. que no código acima,modifiquei o seu prompt, escrevendo em inglês americano e com regras da gramática americana e não do Reino Unido, isso conta muito, pois o berço dessas tecnologia é no idioma inglês. Mas versão acima,fiz na versão português brasileiro para você entender, caso não domine bem o inglês. Então você digitando no input: 2000, dê ENTER, logo lhe é pedido que digite o segundo № 3000, pós ENTER, lhe será entregue as quatro opções de resultado em: adição, subtração, multiplicação e divisão. Também valida os números e v erifica se as entradas são números válidos. Se não forem, exibe uma mensagem de erro e encerra o programa.

Note bem o Sr. que a versão acima está programada para o ambiente Node.js, fique atento a isso antes de rodar o código,e antes disso,copie e cole os códigos em uma IDE para ativar a identação correta, para precaução de que algum espaçamento a mais,ou outro caracteres, tenha sido inserido enquanto eu editava essa resposta.

Então lhe faço alguns questionamentos: "de qual comunidade Javascript,ou curso, fórum,ou site na web,o Sr. Encontro esse prompt mencionado no seu tópico? Se não, foi o prompt de sua autoria? Se não,eu preciso saber a fonte como um possível link na web, sobre.

Os caracteres < & > no Javascript, são utilitários como operadores,e o N na matemática, é um fator de de operações, estes detalhes podem confundir o chatGPT,ou outras AIs,no referente a geração de código via tokens,no caso do GPT, mais lento, já no Groq, mais rápido, gerando 500 tokens por segundo.

Muito bom dia, always grateful, sucesso sempre ao Sr.:coffee:

Olá Sr. @rodrigob0k2, resolvi voltar :back: :arrow_backward: aqui em seu tópico, porquê considero que analisando eu bem a condição de lógica desse software,eu fiz umas descobertas que imagino, possa acender um tipo de :bulb:,na sua mente nesse assunto,e reconsidere algumas diretivas que dei,em perceber conflito suposto nesse software, em outras respostas minhas acima,pois bem,o conflito era eu atentando contra a lógica do seu modelo, lógica como percebo, é também a falta dela, mesmo esta, sendo eu ou você como pensadores, lógica é uma condição existencial sempre presente, mas ausente, quando se trata de cognição dos indivíduos, atuando na implementação de código. Descobri isso resolvendo um outro problema, outro tópico seu, pois havia eu me cansado,um dia passado, andando aqui no fórum,vi esse tal,e concluí entendimento sobre esse aqui, resolvendo o outro.

Fiz tudo no meu celular, demorei horas para editar, mas deu certo,e como já lhe falei,eu gosto mais de atuar em ambiente Node.js fora de console de browsers. Então aqui está o código em JavaScript para resolver o desafio proposto, projetado para ser executado em ambiente Node.js:

const readline = require('readline');

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

function promptUser(question) {
    return new Promise((resolve) => {
        rl.question(question, (answer) => {
            resolve(answer);
        });
    });
}

(async function main() {
    let N;

    // Solicita um número N (1<N<1000)
    while (true) {
        N = await promptUser("Por favor, insira um número N (1<N<1000): ");
        N = parseInt(N, 10);

        if (N > 1 && N < 1000) {
            break;
        } else {
            console.log("Número inválido. Tente novamente.");
        }
    }

    const numbers = [];
    let totalSum = 0;
    let evenSum = 0;
    let oddSum = 0;

    // Lê N números inteiros
    for (let i = 0; i < N; i++) {
        let number = await promptUser(`Digite o número ${i + 1}: `);
        number = parseInt(number, 10);
        numbers.push(number);
        totalSum += number;

        if (number % 2 === 0) {
            evenSum += number;
        } else {
            oddSum += number;
        }
    }

    rl.close();

    // Imprime as somas conforme solicitado
    console.log("Soma decimal de todos os números: " + totalSum);
    console.log("Soma hexadecimal dos números pares: " + evenSum.toString(16));
    console.log("Soma octal dos números ímpares: " + oddSum.toString(8));
})();

Abaixo eu coloco do como Usar o Código:

Instale o Node.js:

• Certifique-se de que o Node.js esteja instalado no seu sistema.

• Salve o Código em um arquivo,o bom é que não precisa concedimento de permissão:

• Salve o código acima em um arquivo com extensão .js, por exemplo, desafio.js.

Executando o Código:

• Abra um terminal (ou prompt de comando) e navegue até o diretório onde o arquivo desafio.js está salvo.

Execute o script com o comando:

node desafio.js

Interagindo com o input do programa:

• O programa solicitará que você insira um número N (entre 1 e 1000).

• Digite um número válido e pressione Enter.

• O programa pedirá para você inserir N números inteiros.

• Digite cada número seguido de Enter.

Exemplo de entrada e saída:

Entrada:

Por favor, insira um número N (1<N<1000): 5
Digite o número 1: 10
Digite o número 2: 21
Digite o número 3: 32
Digite o número 4: 43
Digite o número 5: 54

Saída:

Soma decimal de todos os números: 160
Soma hexadecimal dos números pares: 60
Soma octal dos números ímpares: 106

O programa calcula e imprime a soma total em decimal, a soma dos números pares em hexadecimal e a soma dos números ímpares em octal conforme solicitado, então até aqui tudo bem, agora vamos ao detalhes mais esclarecidos da lógica outrora ausente suposta, mas que sempre presente,o pensamento do bichano humano.

Quando eu no input digitava: 2,3,4 tudo bem, dava certo,mas quando digitava: 7,8,9,4,6 era de significado que quando o o Javascript ia pedindo para eu digitar do primeiro número até o terceiro em diante, para completar sete, havia ainda mais 4 pedido s pós os cliques de ENTER, depois da vírgula,no caso do 8, haveria logicamente, mais oito repetições,kkkkk, depois da vírgula do,8 haveria logicamente mais nove pedidos do software,e assim, até chegar no 6 totalizando um loop de 34 repetições até o software juntar os dados do input e fornecer o resultado em decimal, hexadecimal e octal.

Agora pensa tú cidadão, naquele teu intento mais acima de digitar no input: 35,46,67 que somando esse pedido,te renderia em 148 repetições de loop até a soma dos três resultados,ok Sr.?

Não haveria como você ser paciência até chegar no resultado, achando que iria ter de treinar muito,ou se denominando não apto,ou que os esboço/prompt do software estivesse errado possivelmente; até eu mesmo, inconsciente pirei junto. Mas resolvendo o outro problema,eu voltei nesse,e subtituí as vírgulas por espaço. Mas é o tipo da condição,eu não testei no browser, gosto mais da ambiência do Node.js.

Espero ter ajudado, pelo menos=mais,eu encontrei o mecanismo lógico em mim mesmo para sincronia entre software e computador de mão :calling:, um :penguin: Android. :snowflake: