Manipulação de Arrays! [RESOLVIDO]

19 respostas
manolo

Boa tarde pessoal!

E o seguinte, estou quebrando a cabeça aqui com algums trabalhos que o professor "socou" para nos em virtude da gripe suina :x
Estou tendo serias dificuldades em 3 items do programa que se trata da manipulaçao de arrays, são estes:

1- Preciso calcular a media dos numeros impares dentro do array e mostrar a media entre eles. ( Eu ate tentei fazer mas esta dando errado essa zica, como mostra na opçao 4 do codigo ! )

2- Mostrar o menor e maior número armazenado no array e seus elementos.

3- Inverter a posição dos números armazenados no array. ( na minha opiniao e o mais dificil, nao faço ideia por onde começar! )

Pessoal, nao estou querendo a soluçao de mão beijada, ja dei uma boa pesquisada pela internet, mas nao estou compreendendo a semantica das questoes !
Peço humildemente a ajuda de voces pois ainda sou inicialnte em programaçao e estou querendo aprender como todos aqui :D

Segue abaixo o que eu ja fiz no codigo:

import java.util.Scanner;

public class ExeercicioEdson {

    public static void main(String args []) {
    	
    	Scanner input = new Scanner(System.in);
    	
    	int num [] = new int[31];
    	int menu;
		int somaimpar = 0;
		int qtdimpar = 0;
        double mediaimpar;
      
    	do{
    	
    	System.out.println(" ******** Exercicio Array ******** " );
    	System.out.println(" *** Escolha uma opçao abaixo *** ");
    	System.out.println(" *** 1º- Digite 30 valores para o array *** ");
    	System.out.println(" *** 2º- Mostrar os numeros do array *** ");
    	System.out.println(" *** 3º- Alterar valor armazanado no array *** ");
    	System.out.println(" *** 4º- Mostrar a media dos numeros impares no array *** ");
    	System.out.println(" *** 5º- Mostrar o menor e o maior numero nos elementos do array *** ");
    	System.out.println(" *** 6º- Inverter as posiçoes do array *** ");
    	System.out.println(" *** 7º- Sair. *** ");
    		
        menu = input.nextInt();input.nextLine();
    	
    	switch(menu){
    		
    		case 1:
    			System.out.println(" *** Informe os 30 numeros inteiros. *** ");
    				for (int i=1; i<num.length; i++){
    					num[i]= input.nextInt();
    				}
    			break;	
    				
    		case 2:	
    			System.out.println(" *** Os numeros armazenados no array sao : *** ");
    				for (int i=1; i<num.length; i++){
    					System.out.println(i+"-"+num[i]);
    				}
    			break;
    				
    		case 3:	
    			System.out.println(" *** Informe a posiçao que voce deseja informar o novo valor. *** ");
    			int pos = input.nextInt();
    			System.out.println(" *** Informe o valor desejado *** ");
    			int x = input.nextInt();
    			num[pos]= x;
    			
    		    break;
    		    
    		case 4:
    			System.out.println(" *** A media dos numeros impares são: *** ");
    		   	for(int i=1; i<num.length; i++){
    		   			if (num[i]%2 == 1){
    		   				somaimpar = somaimpar + num[i];
				            qtdimpar ++;	   		 
    		   			}		
			    mediaimpar = somaimpar/qtdimpar;
				System.out.println(" *** Media impares: *** " + mediaimpar);				
    		   	}
    		   	break;
    		   	
    		case 5:   	  
    			
        	}
    	  }while(menu != 7);						
    	}
    }

Muito obrigado pela atençao! :D

19 Respostas

ViniGodoy

No seu item 4:

System.out.println(" *** A media dos numeros impares são: *** "); for(int i=0; i<num.length; i++){ if (num[i]%2 == 1){ somaimpar = somaimpar + num[i]; qtdimpar ++; } } //O for você fecha aqui. mediaimpar = somaimpar/qtdimpar; System.out.println(" *** Media impares: *** " + mediaimpar);

Os demais, já tentou fazer alguma coisa? Pode postar aqui?>

A média só é calculada ao final de todas as somas, que são feitas pelo for.

criador

Segue algumas observações:

1º) Todos os seus for’s você está iniciando de 1. Porque isto se o seu array começa da posição 0 ?!?!?!

2º) No case 3, se eu digitar uma posição inválida, por exemplo 40, ele estoura exceção.
Tens que tratar se a posição digitada é maior que zero e se ela existe no array (pos < num.length).

A princípio é isto.

Tente arrumar estes dois ítens e nos informe. Assim prosseguiremos com as demais dúvidas.

Espero ter ajudado.

Abraço!

igor_jua

Muito bem manolo, vamos lá…

Primeiramente para vc fazzer a média dos números ímpares vc precisa primeiro descobri-los dentro do seu array.
Para isso vc pode contar com o axilio de um outro array.

int arrayImpar []= new int[array.lenght];
for(int i=0;i<array.lenght;i++){
if(array[i]%2!=0){ // ou seja, se o resto da divisão do valor da posicao i do seu array for diferente de 0 é pq ele é um número ímpar!
arayImpar[i]=array[i];

}
}

Com isso vc tem um array auxiliar que contem todos os seus numeros ímpares…
agora é só fazer um outro loop que some todos os valores dentro de uma variavel e divida esta pelo tamanho do array auxiliar.

Para mostrar o maior e menos número vc pode contar com o apoio de duas variaveis.
veja:

int maior=array[0];//digo que todas duas recebem o valor da primeira posição!
int menor=array[0];
//feito isto faço a verificação com os restantes dos valores do array.
for(int i=0;i<array.lenght;i++){

if(array[i]>maior)maior=array[i];
if(array[i]<menor)menor=array[i];
}

E a terceira é a mais simples, por incrivel que pareca.
Vc só irá precisar de um array auxiliar tbm.

int arrayAux []= new int[array.lenght];
int contador=0;
for(int i=array.lenght;i>=0;i--){
arrayAux[contador]=array[i];
contador++;
}

//agora é so copiar os do array aux para o original
for(int i=0;i<array.lenght;i++){
array[i]=arrauAux[i];
}

:wink:

manolo

[b]Obrigado vinigodoy, entao testei aqui a sugestao que vc disse mas o resultado da media sempre da 4.0!

Cara to ficando maluco ja, as outras opçoes eu nao comecei fazer ainda pois nao to com raciocinio logico formado!

abrass [/b]

manolo

[b]Po, muito obrigado pela ajuda pessoal ! Vou tentar colocar em pratica aqui e ja retorno para vcs

abrass[/b]

criador

igor_jua, faltou o array.length - 1 no último exemplo que você colocou, pois senão irá estourar ArrayIndexOutOfBounds: 4

ViniGodoy, faltou iniciar a variável somaimpar = 0 dentro do case e verificar se somaimpar é maior que zero, porque ele não poderá dividir 0/0.

Abraço!

ViniGodoy

Aquele código extrai do case dele. Mas, de qualquer forma, ele inicializa a variável fora do case (e concordo que dentro é bem melhor). :slight_smile:

Quanto a sua segunda observação é só alterar a linha do calculo da média para:

mediaimpar = qtdimpar == 0 ? 0 : somaimpar/qtdimpar;
manolo

[b]Putzzzz, pessoal to com muita dificuldade aqui com os arrays!
E pra varia acabei de leva uma fumada do chefe! Eu não estou conseguindo sai da opçao 4

O codigo fico assim, como propos o nosso amigo acima:
[/b]

case 4: System.out.println(" *** A media dos numeros impares e: *** "); int arrayimpar []= new int[array.lenght]; for(int i=0;i<array.lenght;i++){ if(array[i]%2!=0){ arayimpar[i]=array[i]; } }

[b]
Mas esta dando os seguintes erros:

cannot find symbol variable array
cannot find symbol variable arayimpar[/b]

e nao estou entendendo a logica proposta! desculpa pela encheçao de saco.

abrass

criador

manolo, faça desta forma:

int somaimpar = 0;
int qtdimpar = 0;
                for(int i=0; i<num.length; i++){   
                        if (num[i]%2 != 0){
                            somaimpar += num[i];   
                            qtdimpar ++;               
                        }          
                }
                if (somaimpar > 0) {
                	mediaimpar = somaimpar/qtdimpar;   
                        System.out.println(" *** Media impares: *** " + mediaimpar);
                } else {
                	System.out.println("Não existe números ímpares na lista");
                }

ViniGodoy, é isso ai.
Mas para efeito de mensagem, seria melhor fazer um if verificando se é maior que zero.
Caso não seja, mostrar uma mensagem "Não existem números ímpares na lista" ou algo similar.
Apenas para perfumaria.

Abraço!

criador

Editei o post acima, criando a variável qtdimpar também dentro do case, pois este era global.

Abraço!

manolo

[b]Criador, muito obrigado pela ajuda! nunca conseguiria sozinho. Agora eu entendi a logica proposta, da ate raiva quando nos analisamos o codigo no final e vemos que e mais simples do que pensamos :oops:

Vou tentar resolver os dois restantes!

abrass[/b]

criador

ahuahuahuah
Pois é manolo.
Isto é o que mais acontece.
Muitas das vezes o problema está em um pequeno detalhe, onde você nunca imaginaria estar.
Por isso que sempre que estou programando, procuro prestar bastante atenção no que estou fazendo, pois qualquer furo deixado, pode te dar uma baita dor de cabeça lá na frente.

E não esqueça de pôr a tag [RESOLVIDO] no título do seu primeiro post (caso esteja realmente resolvido o seu problema) :slight_smile:

Abraço!

ViniGodoy

Eu só trocaria esse if:

if (somaimpar > 0) { mediaimpar = somaimpar/qtdimpar; System.out.println(" *** Media impares: *** " + mediaimpar); } else { System.out.println("Não existe números ímpares na lista"); }

Para testar qtdImpar ao invés de somaImpar. O problema da divisão, como o vc mesmo falou, está no denominador, e não no numerador. Afinal, na lista podem ter números impares como -5, 5, -3, 3
E você receberia a mensagem de "Não existe números impares na lista", já que a soma deles será zero.

manolo

[b]Pessoal, rodou tudo certinho! muito obrigado pela ajuda de todos :thumbup:

Agoira vou começar a fazer um sisteminha orientado a objeto com array :x
Espero que de tudo certo.

Obrigado e forte abraço a todos.[/b]

manolo

Bom, pessoal achei que o programa ia estar tudo ok, mais ainda estou com dificuldades que não consigo resolver sozinho!

O meu problema agora e entre achar o menor e o maior numero dentro de um array. Sera que esta correto a logica abaixo?:

case 5:
            	 int maior= num[0];  
                 int menor= num[0];   
   
                 for(int i=0;i<num.length;i++){   
  
                       if(num[i]>maior){
                       	maior=num[i];
                       }
                       if(num[i]<menor){                        
                        menor=num[i];
                     }
                     System.out.println(" *** O maior numero do array é:"+maior+" na posiçao"+i+"***"); 
                     System.out.println(" *** O menor numero do array é:"+menor+" na posiçao"+i+"***");   
                break;     	  
        	
   	
        	 }

Esse lance de array não entra em minha cabeça, será que alguem tem dicas para eu melhor assimilar a materia?

Obrigado

criador

Manolo, a lógica está correta.
Só faltou você mostrá-los (System.out.println) fora do for e criar a variável de contagem também fora do for.

Aí vai:

int maior= num[0];    
        	    int menor= num[0];
        	    int l=0;
        	    
        	    for(l=0;l<num.length;l++){
	        	    if(num[l]>maior){  
	        		    maior=num[l];  
	        	    }  
	        	    if(num[l]<menor){                          
	        		    menor=num[l];  
	        	    }
        	    }
        	    System.out.println(" *** O maior numero do array é:"+maior+" na posiçao "+l+"***");   
        	    System.out.println(" *** O menor numero do array é:"+menor+" na posiçao "+l+"***");

Abraço!>

manolo

[b]Vlww Criador, me ajudou muito cara!

Abrasss :thumbup:[/b]

ViniGodoy

O bom é que dá para ver que a lógica básica você manja. Só cuidado com os detalhes.

Como diz o ditado:
“Deus está em todo lugar, mas o diabo está nos detalhes”

manolo

[b]ahuahuahuahuaauahuaahuauhuhuahauahua

Vlw vini, obrigado pela ajuda tbm!

abrass

OBS: boa frase cara !
auhauahuahahahahahahaahu[/b]

Criado 22 de outubro de 2009
Ultima resposta 23 de out. de 2009
Respostas 19
Participantes 4