Jump to content

Recommended Posts

Boa Noite, galera precisando de uma ajuda, travei no código.....
A questão é:

Faça um vetor com 50 posições e preencha com valores aleatórios de 0 a 100.
a) O programa deverá pedir um número entre 0 a 100 e o programa deverá informar qual a célula
que apresenta o valor mais próximo (ou igual) ao digitado.
b) Deve ser informado a posição no vetor e o valor desta posição (indicando se é aproximado ou
exato).
*** CONSEGUI FAZER A OPÇÃO A, PORÉM A OPÇÃO B NÃO TENHO A MINIMA IDEIA DE COMO FAZER!!!!
Segue meu código:
var
numeros: vetor[1..50] de inteiro
i, num: inteiro
inicio
para i de 1 ate 50 faca
numeros <- randi(100)
fimpara
//EXIBINDO VETOR
para i de 1 ate 50 faca
escreval("Vetor ", i, " numero: ", numeros)
fimpara
//PRIMEIRA PERGUNTA
escreval("Digite um numero de 0 a 100")
leia(num)
se(((num) < 0) ou ((num) > 100)) entao
escreval("Numero invalido! Digite novamente:")
leia(num)
senao
para i de 1 ate 49 faca
se numeros = num entao
fimse
fimpara
escreval("Na posicao: ",i, " / numero: ",numeros, " Exato!")
fimse
fimalgoritmo

Share this post


Link to post
Share on other sites

Se fez a A, a B está facil.. Quando achar, guarde a variável do laço 'i' e o valor numeros em outras variáveis fora do escopo do laço.

Share this post


Link to post
Share on other sites

A opção B basicamente fala para você printar para o usuário que o valor que ele digitou está próximo ou igual ao valor de A, ou seja, se eu digitei 50 e o valor mais próximo é 47, então você vai dizer que ele é aproximado e vai mostrar a posição do vetor que contem o valor 47, agora se o valor 50 existir no vetor, então você vai mostrar que é exato e a posição do número 50 no vetor.

Share this post


Link to post
Share on other sites

A lógica é a seguinte, ordene todos os números em ordem crescente, você vai ter algo parecido com uma fita. Quando o cara digitar um número você vai realizar os passos:

 

  1. Esse número é maior que o primeiro número da fita?
  2. Esse número é menor que o último número da fita?
  3. Na metade da fita (ou seja tamanho/2) o número que encontramos é maior ou menor que o do usuário
  4. Se for maior, então isso significa que o número que procuramos está na primeira metade da fila
  5. Se for menor, então está na segunda metade da fila

A partir daí usamos o que é chamado de pesquisa binária, você vai pegar a metade da fila selecionada, digamos que foi a segunda metade (por exemplo, uma fila de 1 a 100 e selecionamos 85, se a metade é 50 então o 80 estará depois do 50, logo na segunda parte).

 

  1. Pegamos essa segunda metade e dividimos em 2, e fazemos novamente os passos 3, 4 e 5 do processo anterior
  2. Fazemos isso repetidamente até que só sobre o mínimo divisor possível, se sua lista for par, sobrarão dois números, se não sobrarão 3
  3. Então destes 3 números você pode verificar: Numero(i) é >, < ou = ao que procuro?
  4. Independente do resultado você pode jogar todos os números em uma variável e iterar pelo resultado perguntando: variável - meunumero = 0? Se for então a variável é igual ao seu número (85 - 85 = 0) Quanto mais próximo de 0 for o seu número obtido, mais próximo do valor original você estará

 

Óbvio que existe uma abordagem mais simples que é basicamente passar por todos os números (ordenados em ordem crescente) e ir utilizando essa troca de variáveis do passo 3 e 4 acima.

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 joagostini
      Olá, sou iniciante, e estou fazendo, como exercício, o jogo da velha. 'Desenvolvi' uma rotina de escolha de nível do jogo (serão 3 níveis) que deve aguardar a escolha do usuário para o programa prosseguir. Mas acho que não entendi direito como o javascript funciona, pois o que fiz não funciona e não encontrei uma solução (talvez não saíba como pesquisar corretamente o assunto na web).

      O começo do HTML (que é pouco) onde está um select para escolha do nível é este:
      <body>     <div id="dvmenu">         <button onclick="iniciar()">Iniciar Jogo</button>         <p><br></p>         <div id="dvQuemComeca">             <label for="nivel">Escolha o nivel:</label>             <select id="nivel" onChange='atualiza()'>                 <option value=0 selected>Escolha um nível</option>                 <option value=1>Nível 1 - Brincadeira</option>                 <option value=2>Nivel 2 - Surpresa</option>                 <option value=3>Nível 3 - Desafio</option>             </select>         </div>         <div id="jogador" class="jogador"></div>         <div id="vencedor" class="jogador"></div>     </div>  
      O código JS é este:
      //INÍCIO VEM DE LOAD function iniciar() {     casela = document.querySelectorAll('div[id^="p"]');     for (let cas of casela) {         cas.innerHTML = '';     }     for (let i = 0; i < 9; i++){        tab = tab;     }     console.log(tab);     nivel = 0;      msg = '';     qtosLancesJog = 0;     sorteiaJogador();     //até aqui funcionou direito } //-------------------------------------------------------------------- //ESCOLHA DO NÍVEL DO JOGO function atualiza(){     let selecao = document.querySelector('#nivel');     let opcao = selecao.options[selecao.selectedIndex];     return opcao.value;    }   //--------------------------------------------------------------------   //SORTEIA QUEM VAI COMEÇAR JOGANDO //função para definir o jogador que inicia o tab function sorteiaJogador() {//funcionou direito     let quemComeca = parseInt(Math.floor(Math.random() * 2));     if (quemComeca == 0) {         msg = 'Computador';         //setTimeout(lanceCpu, 2000);//dá um intervalo antes do computador realizar o 1 lance         lanceCpu();     } else msg = 'Humano';//neste caso a rotina espera que o jogador clique no tabuleiro, qdo roda a função lancetab(pos)         lanceHumano();     document.querySelector('#jogador').innerHTML = `<br>O ${msg} começa!`; } //--------------------------------------------------------------------   //ESCOLHA RANDÔMICA, NIVEL = 1, Da POSIÇÃO DO LANCE DA CPU NO tabULEIRO function jogouCpu(){//funcionou direito //nível 1 modo randômico pos = Math.floor(Math.random() * 9); return pos; }   //função humana function lanceHumano(){     console.log('Estou na função humana');     do {         nivel = atualiza();         console.log(nivel);     } while (nivel === 0);     console.log(nivel + ' passei direto'); }  
      O problema está nesse do...while da function lanceHumano(). Segundo entendi, ele prosseguiria apenas quando nivel!== 0, caso contrário, ficaria 'preso' até o momento que o usuário escolhesse uma das opções. Pelo HTML percebesse que setei o select para value=0. Mas ele nem se dá ao trabalho de esperar um miléssimo de segundo, segue em frente com o valor que tiver, no caso 0. O while  não tem efeito. Essa minha perspectiva está errada? Se sim, o que fazer? (paradigma funcional, await?) Obrigado.
      P.S.. No código tem uns conole.logs que servem watch-dogs para ajudar a entender por onde vão as rotinas.
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
    • By ph1
      boolean opcao = false; // tem que inicializar com true dentro do laço 'do-while' String resp; Scanner sc = new Scanner(System.in); do { // essas duas variáveis aqui podem ser declaradas dentro do while double media = 0, soma = 0; int j = 0; notas_aluno[j] = 0; for (int i = 0; i < nome_aluno.length; i++) { System.out.println("Insira o nome do aluno: "); nome_aluno[i] = sc.nextLine(); // usa sc.nextLine() //soma = 0; for (j = 0; j < notas_aluno.length; j++) // porque 4 ? usa o notas_aluno.length { System.out.println("Entre com a " + (j + 1) + " ª nota do aluno: " + (i + 1)); notas_aluno[j] = sc.nextDouble(); //notas_aluno[j] = Double.parseDouble(sc.nextLine()); // usa Double.parseDouble(sc.nextLine()) soma = soma + notas_aluno[j]; } media = soma / 5; // pq 5 ? usa o notas_aluno.length String aproveitamento = ""; if (media >= 9 && media <= 10) { aproveitamento = "A"; } else if (media >= 7.5 && media < 9) { // não precisa testar se é < 9 aproveitamento = "B"; } else if (media >= 6 && media < 7.5) { // não precisa testar se é < 7.5 aproveitamento = "C"; } else if (media >= 4 && media < 6) { // não precisa testar se é < 6 aproveitamento = "D"; } else if (media >= 0 && media < 4) { // não precisa testar se é < 4 aproveitamento = "E"; } System.out.println("Média: " + media); System.out.println("Conceito: " + aproveitamento); switch (aproveitamento) { case "A": case "B": case "C": System.out.println("APROVADO"); break; case "D": case "E": System.out.println("REPROVADO"); break; } System.out.print("Deseja Continuar? <s/n>: "); resp = sc.nextLine(); // usa sc.nextLine() if (resp.equalsIgnoreCase("n")) opcao = true; } }while (!opcao); String resp; boolean opcao = false; Scanner sc = new Scanner(System.in); do { System.out.print("Deseja Continuar? <s/n>: "); resp = sc.nextLine(); //} while (!opcao.equalsIgnoreCase(resp)); //while ( opcao != 'n'); // só pára se for == 'n' if(resp.equalsIgnoreCase("n")) { opcao = true; System.out.println("Saiu!"); //break; } }while(!opcao); ...> Prazer a todos. Interessante, seu eu tirar o código entre o d{ e a pergunta para sair, o while funciona perfeitamente, porém se eu retorno como o código para ler as notas e calcular o while não funciona para quando tiver menos de 50 alunos. Não consigo encontrar o erro. Obrigado.
    • By Kellison Ruan
      Acho que não fui tão claro no título, portanto irei esmiuçar melhor aqui...
       
      É o seguinte, quero saber se há algum jeito de pegar as linhas de uma coluna q está em VARCHAR com informações do tipo "4 PONTOS DE ILUMINAÇÃO", dessa informação pretendo retirar somente o número que em questão é o "4" e colocá-lo em outra coluna INTEGER. Há essa possibilidade? Detalhe, as vezes as informações não está seguindo um padrão de vim somente como "4 PONTOS DE ILUMINAÇÃO" às vezes vêm dados com mais informações númericas que precisa distinguir, por exemplo, a mim só interessa pegar números que vem antecedendo as palavras "PONTOS", "PTOS", "PTS", têm algum jeito de distinguir isso?
    • By Motta
      O algoritmo que procura padrões ocultos na maior base de dados de sonhos do mundo
    • By TATIANE DEOTI
      PRECISO RESPONDER ATRAVÉS DO VISUALG MAS NÃO ESTOU CONSEGUINDO FORMULAR
       
      Uma loja por atacado vende caixas com 30 unidades de cada produto. Faça um algoritmo no Visualg que leia o valor pago por um cliente,  o valor do troco recebido e o nome do produto adquirido. Em seguida, calcule e mostre o valor que foi pago por cada unidade do produto, no seguinte formato: "o produto __ custa R$ __ por unidade".
×

Important Information

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