Ordenação de número

7 respostas
N

Olá pessoal eu sou novo aqui no forúm e estou com uma dúvida de ordenação de número…
comecei a aprender java faze menos de 2 meses então eu nao sei praticamente nada…
então o programa que eu preciso fazer… é pegar uma turma de alunos e insirir o nome e a média dos alunos e depois disso o programa tem que imprimir os alunos que tiveram a maior e a menor média, sendo que 1 ou mais alunos podem ter tirado a nota máximo e/ou mínima…

eu consegui criar o programa e o código está aqui:

import java.util.Scanner;
public class Extra10_04 {

	/**
	 *  
	 */
	public static void main(String[] args) {
		Scanner s = new Scanner (System.in);// Scanner para números
		Scanner sNome = new Scanner (System.in);// Scanner para nomes
		System.out.print ("Digite o número de alunos: ");
		int n = s.nextInt();// número de alunos
		String []vNomes = new String [n];
		double []vMedias = new double [n];
		double []vMaioresMedias = new double [n];
		String []vNomesMaioresMedias = new String [n];
		double [] vMenoresMedias = new double [n];
		String []vNomesMenoresMedias = new String [n];
		int contMaioresMedias = 0;// contador de quantos alunos tiveram as maior media
		int contMenoresMedias = 0;//contador de quantos alunos tiveram a menor media
		for(int i=0; i<n;i++){
			System.out.print ("Digite o nome do aluno ["+(i+1)+"]: ");
			vNomes[i] = sNome.nextLine();
			System.out.print ("Digite a nota do aluno "+vNomes[i]+": ");
			vMedias[i] = s.nextDouble();			
		}//for
		//Ordenação
		for(int i = 0;i<n-1;i++){
			int min = i;
			//calcular o mínimo
			for(int j = i+1;j<n;j++){
				if(vMedias[j]<=vMedias[i]){
					min = j;
				}
			}
			//trocar vMedias[min] com vMedias[i]
			double aux = vMedias[min];
			String auxNome = vNomes [min];
			vMedias[min] = vMedias[i];
			vNomes[min] = vNomes [i];
			vMedias[i]= aux;
			vNomes[i] = auxNome;
			}
		//organização dos vetores vMaioresMedias, vMenoresMedias, vNomesMaioresMedias e vNomesMenoresMedias.
		for(int i=0;i<=n;i++){
			vMenoresMedias[i] = vMedias[i];
			vNomesMenoresMedias[i] = vNomes [i];
			vMaioresMedias[i] = vMedias[n];
			vNomesMaioresMedias[i] = vNomes[n];
			if(vMedias[i+1]<= vMedias[i]){
				vMenoresMedias[i+1] = vMedias[i+1];
				vNomesMenoresMedias [i+1] = vNomes[i+1];
				contMenoresMedias++;
			}
			if(vMedias[n-1]>= vMedias[n]){
				vMaioresMedias[i+1] = vMedias[n-1];
				vNomesMaioresMedias [i] = vNomes[n-1];
				contMaioresMedias++;
			}
		}
		for(int i = 0;i<=contMenoresMedias;i++){
			System.out.println(vNomesMenoresMedias[i]+" obteve a menor média de: "+vMenoresMedias[i]);
		}
		for(int i = 0; i<=contMaioresMedias;i++){
			System.out.println(vNomesMaioresMedias[i]+" obteve a maior média de: "+vMaioresMedias[i]);
		}
		
	}//main


}//class

só que na hora de rodar o programa o eclipse apresenta o seguinte erro
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 3
at Extra10_04.main(Extra10_04.java:47)

alguém poderia me ajudar?
grato :smiley:

7 Respostas

Roger75

Use alguma IDE(Eclipse, Netbeans) para debugar a execução do programa. Com certeza vai te ajudar.

A

Olá, boa noite.

Quanto ao erro ArrayIndexOutOfBoundsException se você olhar na documentação do Java SE verá que está tentando acessar por um índice errado, essa é a resposta do seu problema. Tente ir por partes, isolando os problemas…

A

NaCama:
Olá pessoal eu sou novo aqui no forúm e estou com uma dúvida de ordenação de número…
comecei a aprender java faze menos de 2 meses então eu nao sei praticamente nada…
então o programa que eu preciso fazer… é pegar uma turma de alunos e insirir o nome e a média dos alunos e depois disso o programa tem que imprimir os alunos que tiveram a maior e a menor média, sendo que 1 ou mais alunos podem ter tirado a nota máximo e/ou mínima…

eu consegui criar o programa e o código está aqui:

import java.util.Scanner;
public class Extra10_04 {

	/**
	 *  
	 */
	public static void main(String[] args) {
		Scanner s = new Scanner (System.in);// Scanner para números
		Scanner sNome = new Scanner (System.in);// Scanner para nomes
		System.out.print ("Digite o número de alunos: ");
		int n = s.nextInt();// número de alunos
		String []vNomes = new String [n];
		double []vMedias = new double [n];
		double []vMaioresMedias = new double [n];
		String []vNomesMaioresMedias = new String [n];
		double [] vMenoresMedias = new double [n];
		String []vNomesMenoresMedias = new String [n];
		int contMaioresMedias = 0;// contador de quantos alunos tiveram as maior media
		int contMenoresMedias = 0;//contador de quantos alunos tiveram a menor media
		for(int i=0; i<n;i++){
			System.out.print ("Digite o nome do aluno ["+(i+1)+"]: ");
			vNomes[i] = sNome.nextLine();
			System.out.print ("Digite a nota do aluno "+vNomes[i]+": ");
			vMedias[i] = s.nextDouble();			
		}//for
		//Ordenação
		for(int i = 0;i<n-1;i++){
			int min = i;
			//calcular o mínimo
			for(int j = i+1;j<n;j++){
				if(vMedias[j]<=vMedias[i]){
					min = j;
				}
			}
			//trocar vMedias[min] com vMedias[i]
			double aux = vMedias[min];
			String auxNome = vNomes [min];
			vMedias[min] = vMedias[i];
			vNomes[min] = vNomes [i];
			vMedias[i]= aux;
			vNomes[i] = auxNome;
			}
		//organização dos vetores vMaioresMedias, vMenoresMedias, vNomesMaioresMedias e vNomesMenoresMedias.
		for(int i=0;i<=n;i++){
			vMenoresMedias[i] = vMedias[i];
			vNomesMenoresMedias[i] = vNomes [i];
			vMaioresMedias[i] = vMedias[n];
			vNomesMaioresMedias[i] = vNomes[n];
			if(vMedias[i+1]<= vMedias[i]){
				vMenoresMedias[i+1] = vMedias[i+1];
				vNomesMenoresMedias [i+1] = vNomes[i+1];
				contMenoresMedias++;
			}
			if(vMedias[n-1]>= vMedias[n]){
				vMaioresMedias[i+1] = vMedias[n-1];
				vNomesMaioresMedias [i] = vNomes[n-1];
				contMaioresMedias++;
			}
		}
		for(int i = 0;i<=contMenoresMedias;i++){
			System.out.println(vNomesMenoresMedias[i]+" obteve a menor média de: "+vMenoresMedias[i]);
		}
		for(int i = 0; i<=contMaioresMedias;i++){
			System.out.println(vNomesMaioresMedias[i]+" obteve a maior média de: "+vMaioresMedias[i]);
		}
		
	}//main


}//class

só que na hora de rodar o programa o eclipse apresenta o seguinte erro
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 3
at Extra10_04.main(Extra10_04.java:47)

alguém poderia me ajudar?
grato :D

Dica:

1 - Use nomes de variáveis sujestíveis, nunca “s” etc.

N

Dica:

1 - Use nomes de variáveis sujestíveis, nunca “s” etc.

vc está falando da variável do Scanner?

eu coloco s pq é de Scanner…

então desculpa mas como funciona esse negocio do debug do eclipse… eu tentei fazer mais eu nao entendi nada :S
eu to a muito pouco tempo aprendendo java :S

A

Exato.

E quanto ao debug ele serve para você ir acompanhando passo-a-passo da execução do seu programa, ele te mostra a pilha de execução do funcionamento do seu software daí você consegue ver mais facilmente onde está dando ou pode dar problemas.

Veja um exemplo de Hello World usando o Debug do Eclipse:
http://www.developer.com/java/other/article.php/2221711/Debugging-a-Java-Program-with-Eclipse.htm

N

nossa eu acho que descobri…
eu esqueci que em vetores eles começam a armazenar as informações por 0…
então eu tenho que colocar n-1
Obrigado pela dica :wink:

A

NaCama:
nossa eu acho que descobri…
eu esqueci que em vetores eles começam a armazenar as informações por 0…
então eu tenho que colocar n-1
Obrigado pela dica ;)

Legal que entendeu… Fico contente…

Só não entendí o que você quis dizer por n-1. Anyway (d qlq. forma), veja:

Exemplo:

String nomesDeMulheresGostosasArray[] = new String[10]; // Gosto de terminar o nome com List para lista e Array para array

1 - Um array sempre começa do zero, logo:
vai do 0 ao 9 ele tem o tanto de posições passadas ao inicializá-lo, isto é, 10 posições

2 - Nunca é possível acessar a última posição, logo:
não é possível a acessar a posição de número 10

Hope that helps,
André AS.

Criado 23 de abril de 2011
Ultima resposta 24 de abr. de 2011
Respostas 7
Participantes 3