Dúvidas quanto a qualidade do algoritmo

Professor lançou uma questão sobre vetores em Java para a classe fazer. Apesar de ter feito , estou em dúvidas em relação a algumas linhas. Segue o código…

ackage listadexercicios;

import java.util.Scanner;

/* 
 No exame de habilitação para a CNH , para tirar a carteira nacional de habilitação , é necessário 
 fazer um exame téorico,onde o candidato responde a 5 questões objetivas de uma prova, cada uma delas 
 possuindo 4 alternartivas (A,B,C,D) como resposta.Imagine que você estivesse escrevendo um programa 
 para automatizar a prova ,e para isso , precisa pedir que o candidato informe qual é a resposta que ele deu 
 para cada uma das questões. As respostas corretas são dadas abaixo:
 
 01  B    06   A    11  B    16  C  
 02  D    07   B    12  C    17  C
 03  A    08   A    13  D    18  B
 04  A    09   C    14  A    19  D
 05  C    10   D    15  A    20  A
 
 O  seu programa deve armazenar as respostas corretas num vetor e as respostas do candidato em outro vetor.Quando
 o usuário terminar a prova , o programa deve corrigi-la, dizendo se o usuário foi aprovado ou não. 
 
 */

public class Questao36 {

	public static void main(String[] args) {

		Scanner input = new Scanner(System.in);

		char r[] = { 'B', 'D', 'A', 'A', 'C', 'A', 'B', 'A', 'C', 'D', 'B', 'C', 'D', 'A', 'A', 'C', 'C', 'B', 'D',
				'A' };

		char[] resposta = new char[20];

		int cont = 0;

		double pontos = 0;

		System.out.println(" GABARITO ");

		for (int c = 0; c <= r.length - 1; c = c + 5) {

			System.out.print("0" + (c + 1) + " " + r[c] + "   ");

		}
		System.out.println(" ");
		System.out.println(" ");

		for (int c = 1; c <= r.length - 1; c = c + 5) {

			System.out.print("0" + (c + 1) + " " + r[c] + "   ");

		}

		System.out.println(" ");
		System.out.println(" ");

		for (int c = 2; c <= r.length - 1; c = c + 5) {

			System.out.print("0" + (c + 1) + " " + r[c] + "   ");

		}

		System.out.println(" ");
		System.out.println(" ");

		for (int c = 3; c <= r.length - 1; c = c + 5) {

			System.out.print("0" + (c + 1) + " " + r[c] + "   ");

		}

		System.out.println(" ");
		System.out.println(" ");

		for (int c = 4; c <= r.length - 1; c = c + 5) {

			System.out.print("0" + (c + 1) + " " + r[c] + "   ");

		}

		System.out.println(" ");
		System.out.println(" ");

		for (int i = 0; i <= r.length - 1; i++) {

			System.out.print("Informe a resposta : ");

			resposta[i] = input.next().charAt(0); // 
													

			if ((i == cont)) {

				if ((r[i] == resposta[i])) {

					pontos = pontos + 0.5;

				} else {

					pontos = pontos + 0;

				}

				cont++;

			}

		}

		System.out.println(" ");

		System.out.println(" O ALUNO FEZ : " + pontos + " PONTOS . ");

	}

}

Acho que cabe melhora-lo principallmente na parte dos laços de repetição. Alguem poderia dar um feedback para mim?

Dicas que podem ajudar a melhorar

  • Use Métodos para tentar limpar mais o código dentro do main
  • Ao invés de usar:
System.out.println(" ");
System.out.println(" ");

Tente um simples:

System.out.println("\n");

Funciona do mesmo jeito.

  • No lugar de:
char r[] = { 'B', 'D', 'A', 'A', 'C', 'A', 'B', 'A', 'C', 'D', 'B', 'C', 'D', 'A', 'A', 'C', 'C', 'B', 'D',
				'A' };

Tente deixar visualmente entendível:

char r[] = { 'B', 'D', 'A', 'A', 'C',
             'A', 'B', 'A', 'C', 'D', 
             'B', 'C', 'D', 'A', 'A',
             'C', 'C', 'B', 'D', 'A' };
  • Te recomendo a ter o hábito de “fechar” o Scan depois de usá-lo, no seu caso basta um:
input.close();

Use esse método após de realizar a leitura de tudo que voce precisa escrever no Console.

1 curtida

Não se deve fechar um Scanner que lê o System.in.

2 curtidas

Complementando o @staroski - como regra geral, deve-se fechar tudo que foi aberto, mas toda regra tem exceção.

O código em questão está criando um Scanner que lê do System.in, e como este é um recurso especial gerenciado pela JVM (e uma vez fechado, não tem como reabri-lo), então neste caso específico, não é uma boa ideia fechá-lo.

Ver mais aqui e aqui.


Mas caso não seja o System.in, e sim um recurso qualquer que deva ser fechado (arquivo, URL, etc), em vez de chamar o close diretamente, vc pode usar o try-with-resources:

try (Scanner sc = new Scanner(recursoQueNaoEhSystemIn)) {
    // usar o Scanner, etc
} catch (Exception) {
    etc...
}

Assim, ele já é fechado automaticamente ao final do bloco try (mesmo que ocorra algum erro), sem precisar ficar chamando close.

2 curtidas

Obrigado pelas orientações senhores @YoungBlood @staroski @hugokotsubo !!