Estou começando a aprender vetor, matriz e função na faculdade. Lá, usa-se portugol na maioria das aulas e java(em menor quantidade). Estou com uma questão a ser resolvida, mas não estou entendendo.
Implemente uma função que receba um vetor de N valores inteiros já digitados e retorne verdadeiro se o mesmo não possuir nenhum quadrado perfeito ou falso, caso contrário.
Desde o começo do curso venho lendo um livro de lógica de programação(Forbeloni), tenho apostilas de lógica baixadas do apostilando.com e mesmo assim, não estou desenvolvendo a lógica.
Voltando ao problema, tenho que criar uma função que receba um vetor de valores que não se sabe quantos são. A questão pede uma função pra receber um vetor. Como pode? Daí, a dúvida abaixo:
Dúvida 1: É pra criar um algoritmo como função ou um algoritmo como vetor? Porque muda a maneira de se iniciar o algoritmo.
Exemplo com vetor:
Algoritmo logico;
Tipo qualquer_nome= vetor[1…n]{tipo de dado}
{área das variáveis}
Exemplo com função:
Algoritmo logico;
{área das variáveis globais}
Função qualquer_nome({área de variáveis}) : ({tipo de dado})
{área de variáveis locais}
É pra escolher qual dos dois exemplos? Ou ambos?
Dúvida 2:
Como eu faço um teste pra ver se um número é quadrado perfeito? Nem na época de escola aprendi isso. Só agora fui saber que é um n° que tirando a raiz quadrada, dá um inteiro.
3: Sei que aqui não é o local pra aprender lógica. Se puderem dizer o nome de algum site pra isso…
Vamos pegar sua calculadora. Como você mesmo disse, se você tirar a raiz quadrada, dá um inteiro.
Como é difícil testar se um valor é um inteiro devido a erros de arredondamento (vai que você tire a raiz quadrada de 15241578750190521 e o Java lhe volte 123456788.999989 em vez de 123456789), vamos fazer uma outra coisa:
Achar a raiz quadrada do número (digamos 10 -> 3,1622776601683793319988935444327…) - use Math.sqrt
Pegar o valor inteiro da raiz quadrada ( 3,1622776601683793319988935444327 -> 3) - use Math.floor
Elevar o número de novo ao quadrado ( 3 * 3 = 9 )
Se o número bater, então é um quadrado perfeito. Se não bater, não é (como é o caso do número 10).
Você aprende a escrever lendo. Leia este programa e tente entendê-lo. (Você tem de começar pela função "main" e ir subindo )
class SeuProblemaComVetores {
// Verifica se o valor X eh um quadrado perfeito
private static boolean ehQuadradoPerfeito (int X) {
int raiz = (int) Math.sqrt (X);
if (raiz * raiz == X)
return true;
else
return false;
}
// Checa se existe algum quadrado perfeito no vetor de N valores inteiros.
// Se houver, retorna false;
// se não houver, retorna true
public static boolean checaNaoExistemQuadradosPerfeitos (int[] valores, int N) {
for (int i = 0; i < N; ++i) {
if (ehQuadradoPerfeito (valores[i])) {
return false; // existe pelo menos um quadrado perfeito
}
}
// Aqui percorremos todo o vetor e não achamos um quadrado perfeito.
// Portanto podemos retornar true.
return true;
}
public static void main(String[] args) {
// deve imprimir "true"
System.out.println (checaNaoExistemQuadradosPerfeitos (new int[]{2, 3, 5, 7, 11, 13, 17, 19, 23, 29}, 10));
// deve imprimir "false"
System.out.println (checaNaoExistemQuadradosPerfeitos (new int[]{2, 3, 5, 7, 11, 13, 16}, 7));
}
}