Tenho um programa de lógica cujo enunciado diz o seguinte:
“O usuário deve informar a quantidade de alunos da turma via teclado, o nome da matéria e a quantidade total de aulas (numérico inteiro positivo) no início do programa. O usuário agora vai informar matrícula, nome, média final e quantidade de faltas (numérico inteiro positivo). O programa deve validar os dados e ao final mostrar o boletim de todos os alunos inseridos com a informação de aprovado ou reprovado. O aluno é considerado APROVADO se tiver a média igual ou superior a 6,0 e no mínimo 75% de presença.”
Consegui escrever o código todo, mas o único problema (e crucial) que resta é validar as matrículas, ou seja, fazer com que não haja matrículas repetidas, e elas estão todas num vetor, sendo necessário verificar todos os números que lá se encontram. Já pesquisei e encontrei umas respostas bem complicadas, no entanto, como fiz todo o programa usando lógica, não busco um método pronto, até porque são complicados de entender. Algo como usar somente o “for” seria bem útil.
Segue o código (sem a comparação de valores):
public static void main(String[] args) {
Scanner scanInt = new Scanner(System.in);
Scanner scanString = new Scanner(System.in);
Scanner scanDouble = new Scanner(System.in);
int cont = 0, quantAulas = 0, quantAlunos = 0, i, faltasMaximo = 0;
String nomeMateria;
System.out.println("Digite a quantidade de alunos:");
while (quantAlunos < 1) {
if (cont > 0) {
System.out.println("Valor inválido; reentre um maior que 0:");
}
quantAlunos = scanInt.nextInt();
cont++;
}
cont = 0;
int alunos[] = new int[quantAlunos];
int matricula[] = new int[quantAlunos];
int quantFaltas[] = new int[quantAlunos];
double mediaFinal[] = new double[quantAlunos];
String nome[] = new String[quantAlunos];
String resultado[] = new String[quantAlunos];
System.out.println("Nome da matéria:");
nomeMateria = scanString.nextLine();
System.out.println("Quantidade de aulas:");
while (quantAulas < 1) {
if (cont > 0) {
System.out.println("Valor inválido; reentre um maior que 0:");
}
quantAulas = scanInt.nextInt();
cont++;
}
faltasMaximo = quantAulas / 4;
for (i = 0; i < quantAlunos; i++) {
cont = 0;
System.out.println("Informe o número de matrícula do " + (i + 1) + "º aluno:");
while (matricula[i] < 1) {
if (cont > 0) {
System.out.println("Valor inválido; reentre um maior que 0:");
}
matricula[i] = scanInt.nextInt();
cont++;
}
cont = 0;
System.out.println("Agora digite o nome do " + (i + 1) + "º aluno:");
nome[i] = scanString.nextLine();
System.out.println("Média final:");
mediaFinal[i] = scanDouble.nextDouble();
while (mediaFinal[i] < 0 || mediaFinal[i] > 10) {
System.out.println("Valor inválido; reentre um entre 0 e 10:");
mediaFinal[i] = scanDouble.nextDouble();
}
System.out.println("Quantidade de faltas:");
quantFaltas[i] = scanInt.nextInt();
while (quantFaltas[i] < 0) {
System.out.println("Valor inválido; reentre um maior ou igual a 0:");
quantFaltas[i] = scanInt.nextInt();
}
if (quantFaltas[i] <= faltasMaximo) {
if (mediaFinal[i] >= 6) {
resultado[i] = "Aprovado";
} else {
resultado[i] = "Reprovado por nota";
}
} else {
resultado[i] = "Reprovado por faltas";
}
}
scanInt.close();
scanString.close();
scanDouble.close();
for (i = 0; i < alunos.length; i++) {
System.out.println("\nInformações do " + (i + 1) + "º aluno:\n Matrícula: " + matricula[i] + "\n Nome: "
+ nome[i] + "\n Média Final: " + mediaFinal[i] + "\n Faltas: " + quantFaltas[i] + "\n Situação: "
+ resultado[i] + " em " + nomeMateria);
}
Faça um for varrendo esse array, logo em seguida vc faz um if veridicando se o num[objdofor] é = ao texto digitado.
Creio que a logica seja essa
Pelo que entendi você quer inserir matriculas em um vetor, e essas matriculas não podem ser repetidas.
se for isso é só você verificar na hora que vai inserir a matricula se já existe, sendo assim:
int matricula = 2546;
for (int i = 0; i < vetor.length; i++) {
if (matricula == vetor[i]) {
JOptionPane.showMessageDialog(null, "Já Existe!");
break;
}
}
Pudera ser tão fácil! Só que se fosse dessa forma eu teria de atribuir cada valor digitado no vetor (lembre-se que é o usuário que digita cada número de matrícula e ele também delimita a quantidade de alunos, ou seja, o tamanho do vetor) a uma variável e compará-la com os demais valores. Não há como saber quantos serão, e a comparação, digamos, do 3º valor em um vetor de 10 posições tem de ser com o 1º e o 2º (0 e 1, respectivamente), em tempo de digitação, antes mesmo de ser digitado o valor seguinte. Meio paradoxal pensar assim, já que a comparação seria algo como "if (matricula[i] == matricula[i]. Ainda (há um bom tempo) estou a tentar resolver, adicionando uma variável num “for” que mude a cada laço.
Boa tarde,
Crie uma class “Aluno” com os atributos matrícula, nome, média final e quantidade de faltas
Trabalhe com Map
. do tipo Map<Integer, Aluno>, onde a Integer seria o numero da Matricula.
na hora da validação voce faz um containsKey
Orientação a Objetos é uma maravilha, eu faria desse jeito se pudesse. Entretanto é um exercício de lógica, tem-se que desenvolver um raciocínio dentro daquela classe “linguição”. E métodos prontos não ajudam a entender direito. Continuo a tentar com “for”.
Atualmente estou neste nível:
if (i > 0) {
for (j = 1; j < (i + 1); j++) {
while (matricula[i] == matricula[i - j]) {
System.out.println("O valor digitado para matrícula já existe. Tente novamente:");
matricula[i] = scanInt.nextInt();
}
}
}
Mas o while funciona respondendo que o valor já existe até chegar a outra casa. Por exemplo: matricula[0] = 1, matricula[1] = 2. Se para a matrícula [2] eu digitar 2 a mensagem de que já existe é mostrada, mas se eu digitar 1 o programa entende que matricula[2] jé é diferente de matricula[1], e se eu pular pra matricula[0] e digitar “2” de novo, passa direto, porque o valor é diferente de matricula[0], independente do valor de matricula[1].
Crie entao uma variavel chamada matriculaCadastrada[quantAlunos] e add cada matricula digitada la.
depois faça um for lendo e matriculaCadastrada e validando com o novo valor de matricula inserido.
Tipo isso aqui abaixo.
int matriculaCadastrada = new int[quantAlunos];
while (matricula[i] < 1) {
if (cont > 0) {
System.out.println("Valor inválido; reentre um maior que 0:");
}
int mat = scanInt.nextInt();
if(matriculaCadastrada.length == 0){
matricula[i] = mat;
matriculaCadastrada[i] = mat;
}else{
for(int i = 0; i < matriculaCadastrada.length; i++){
if(matriculaCadastrada[i] == mat){
System.out.println("Matricula ja cadastrada, Digite outro valor.");
mat = scanInt.nextInt();
i = 0;
}
}
matricula[i] = mat;
matriculaCadastrada[i] = mat;
}
cont++;
}
1 curtida
Caramba, deu certo! Infelizmente não segui tua lógica; não que eu não tenha entendido, seria talvez mais simples comparar 2 vetores (não sei), embora teu código tenha tido um problema (ali no if(matriculaCadastrada.length == 0), porque essa condição nunca será verdadeira: matriculaCadastrada.length == quantAlunos, e para esta variável já há um while garantindo que ela deve ser maior que 0, lá no começo do código). Mas a grande sacada que deu certo foi teu i = 0;, que reiniciou a variável. Apliquei isso na variável j e ficou assim:
`if (i > 0) {
for (j = 1; j < (i + 1); j++) {
while (matricula[i] == matricula[i - j]) {
System.out.println("O valor digitado para matrícula já existe. Tente novamente:");
matricula[i] = scanInt.nextInt();
j = 1;
}
}
}`
Sendo assim, a cada leitura do while, se a condição for verdadeira e passar direto, não pula para a próxima casa do vetor, repercorre-o desde o começo.
Muito obrigado, eu já estava até tentando criar mais umas estruturas de repetição para colocar a condição no começo a cada entrada.
Problema resolvido!