Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #59 da revista programar. Faz já o download aqui!

FireBlade

Progressão aritmética

Mensagens Recomendadas

FireBlade    1
FireBlade

Boas ppl,

Estou com um peq problema no meu código...

/* Desenvolva um programa, utilizando a classe Scanner, que obtenha 10 valores
de entrada e verifique se eles formam uma progressão aritmética. */

import java.util.*;

public class exercicio_14{
 public static void main(String[] args){

int dif=0,aux=0;
int[] numeros = new int[11];
Scanner teclado = new Scanner (System.in);

for (int i=1;i<=10;i++){ // Pede os 10 valores
System.out.println("Indique o "+i+" nº : ");
int num = teclado.nextInt();
numeros[i] = num; }

for (int i=1;i<=numeros.length;i++){ //Percorre as 10 posições do array
  dif = numeros[i+1]-numeros[i]; // dif recebe o valor da subtracção entre os elementos
  aux = dif;} // fica com o valor de dif

if ( dif == aux)
  {System.out.println("É uma P.A de razão: "+aux);}
  else System.out.println("Não há uma P.A em concreto");
}
}

... compila sem problemas mas não sai nenhum output.

Tem alguma coisa errada?

Cumpz

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

Tem alguma coisa errada?

sem dúvida.

diz lá : não te dá nenhum output porque na realidade é te apresentada uma excecção do tipo ArrayindexOutOfBounds, que como a tradução o diz:

Array                          -                                   do array
    Index                     -          de de acesso a um índice
         OutOfBounds          -                                            fora do limite
                    Exception - Excecção
---------------------------------------------------------------------------------------------
                              - Excecção de de acesso a um índice do array fora do limite


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Flinger    50
Flinger
obtenha 10 valores
int[] numeros = new int[11];

for (int i=1;i<=numeros.length;i++)

Aliado à info que o hippo te deu, olha bem para estas 3 linhas e pensa no que elas significam.

Editado por Flinger

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
FireBlade    1
FireBlade

Obrigado pelas resposta....

Já percebi que estou a tentar aceder a uma posição do array que não existe... estou c/ dificuldades é em alterar essa situação.

O problema está no ciclo ..

for (int i=0;i<numeros.length;i++){ //Percorre as 10 posições do array ...
  dif = numeros[i+1]-numeros[i]; // numeros[0+1] - numeros[0] = dif entre eles.. é assim até ao final do ciclo ... ou estou a pensar mal? =s
  aux = dif;} // fica com o valor de dif

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

faz este processo para perceberes :

- altera o programa para tratar somente 3 valores

- escreve num papel os valores de cada variável que vais usar no ciclo

- em cada instrução do ciclo, altera os valores que tens no papel se assim a instrução o ditar


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
FireBlade    1
FireBlade

acho que já entendi...

for (int i=0;i<=2;i++){ // Pede os 3 valores
System.out.println("Indique o "+(i+1)+" nº : ");
numeros[i] = teclado.nextInt(); }

for (int j=0;j < numeros.length;j++){ //Percorre as 3 posições do array
  dif -= numeros[j]; // o problema estava aqui porque estava a tentar aceder a uma posição que não existia
  aux = dif;} // fica com o valor de dif

if (dif == aux)
  {System.out.println("É uma P.A de razão: "+aux);}
  else System.out.println("Não há uma P.A em concreto");

agora o problema é que não está a dar o que quero lol

Editado por Rui Carlos

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

- altera o programa para tratar somente 3 valores

- escreve num papel os valores de cada variável que vais usar no ciclo

- em cada instrução do ciclo, altera os valores que tens no papel se assim a instrução o ditar


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
FireBlade    1
FireBlade

- altera o programa para tratar somente 3 valores

- escreve num papel os valores de cada variável que vais usar no ciclo

- em cada instrução do ciclo, altera os valores que tens no papel se assim a instrução o ditar

HappyHippyHippo, segui o teu conselho mas não estou a perceber o 3º ponto.

Editado por FireBlade

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

imagina este exemplo:

for (int i = 0, j = 0; i < 3; i++) {
 j = j*j + i;
}

agora pegas numa folha de papel e fazes:

for (int i = 0/*, j = 0; i < 3; i++) {*/          // i = 0, j = 0
 j = j*j + i;                                    // j = 0*0 + 0 = 0

for (/*int i = 0, j = 0; i < 3; */ i++) {         // i = 0 + 1 = 1
for (/*int i = 0, j = 0; */ i < 3; /* i++ */) {   // i < 3 ? yep ... do cycle
 j = j*j + i;                                    // j = 0*0 + 1 = 1

for (/*int i = 0, j = 0; i < 3; */ i++) {         // i = 1 + 1 = 2
for (/*int i = 0, j = 0; */ i < 3; /* i++ */) {   // i < 3 ? yep ... do cycle
 j = j*j + i;                                    // j = 1*1 + 2 = 3

for (/*int i = 0, j = 0; i < 3; */ i++) {         // i = 1 + 1 = 3
for (/*int i = 0, j = 0; */ i < 3; /* i++ */) {   // i < 3 ? hell no ... get out !!!

// i = 3, j = 3

agora faz o mesmo no teu ciclo


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
FireBlade    1
FireBlade

Peço desculpa pela ignorância mas não entendo como é que esse ciclo me ajuda...

O que pretendo é que pedindo ao utilizador n nºs me saia no output se entre eles existe uma P.A ou não, não percebo como é que esse códg me vai ajudar

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

é um exemplo do que tens de fazer com o teu código ...

não serve para resolver o problema to teu código, mas sim para demonstrar o que tens de fazer para perceberes o que está mal


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Pivot    6
Pivot

O hippo está a ajudar-te na lógica do programa...

Vê quantas repetições estás a fazer, e vê qual o valor final da variável i

O problema passa pela condição...

Não testei, mas penso que resolva:

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

O erro indica que o index que tentaste aceder, não existe... Logo a posição máxima tem de ser 10, visto que o array tem 11 posições.

Os arrays funcionam da seguinte maneira...

Array com 11 posições:

[0]

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

[9]

[10]

Aqui tens um array de 11 posições, no entanto, tu estás a tentar aceder esta posição:

[11]

Logo, tens de retirar ao "lenght" um valor, para que ele no máximo só te permita ir até à posição 10.

Abraço,

Rafael.

Editado por Pivot

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

Mas a parte do ArrayIndexOutOfBounds já ficou resolvida...o meu problema agora é na condição

epa ... como queira ...

eu já ajudei dentro do meus parâmetros (não apresentar a solução), agora faz o que entenderes


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Pivot    6
Pivot

Mas a parte do ArrayIndexOutOfBounds já ficou resolvida...o meu problema agora é na condição

Então qual é o problema agora?

A condição do for?

Acho que já apresentei a "solução"...

Abraço,

Rafael.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
FireBlade    1
FireBlade

public class exercicio_14{
 public static void main(String[] args){

int dif=0,aux=0;
int[] numeros = new int[10];
Scanner teclado = new Scanner (System.in);

for (int i=0;i<=9;i++){ // Pede os 10 valores
System.out.println("Indique o "+(i+1)+" nº : ");
numeros[i] = teclado.nextInt(); }

for (int j=0;j < numeros.length-1;j++){ //Percorre as 10 posições do array
  dif =numeros[j+1]-numeros[j];
  aux = dif;} // fica com o valor de dif

if (dif==aux && dif == aux1)
  {System.out.println("É uma P.A de razão: "+dif);}
  else System.out.println("Não há uma P.A em concreto "+dif+" "+aux);
}
 }

Agradecia que me dissessem que parte desse código apresenta o ArrayIndexOutOfBound.

Editado por Rui Carlos
GeSHi

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

Agradecia que me dissessem que parte desse código apresenta o ArrayIndexOutOfBound.

no mesmo sítio de sempre :

dif =numeros[j+1]-numeros[j];


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Flinger    50
Flinger

Não está a dar por várias razões muito simples:

aux = dif;} // fica com o valor de dif
if (dif==aux && dif == aux1)
 {System.out.println("É uma P.A de razão: "+dif);}
 else System.out.println("Não há uma P.A em concreto "+dif+" "+aux);

Achas que a primeira condição do if alguma vez vai ser falsa?

o que é o aux1???

for (int j=0;j < numeros.length-1;j++){ //Percorre as 10 posições do array
 dif =numeros[j+1]-numeros[j];
 aux = dif;} // fica com o valor de dif

O que é suposto este ciclo fazer??? da maneira como tens isso mais valia substituir o ciclo por:

aux = numeros[9]-numeros[8];

O resultado do teu ciclo vai ser sempre esse.

Editado por Flinger

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
FireBlade    1
FireBlade

Já alterei um pouco o código... já dá +/- o que pretendo

  for (int i=0;i<=9;i++){ // Pede os 10 valores
   System.out.println("Indique o "+(i+1)+" nº : ");
	numeros[i] = teclado.nextInt(); }

for (int j=0;j < numeros.length-1;j++){ //Percorre as 10 posições do array
  int cont = numeros[j+1]-numeros[j];
  int contdois = numeros[j+2] - numeros[j+1];
  int conttres = numeros[j+3] - numeros[j+2];
  if (((cont != contdois ) && (contdois !=conttres))){
	System.out.println("Não há uma P.A em concreto ");
	break;}
	else{
	  aux = numeros[j+1]-numeros[j];
	  System.out.println("É uma P.A de razão: "+aux);
	  break;}

por ex;

1,2,3,4,5,7,8,9,10,11

Output: "É uma P.A de razão: 1"

Editado por FireBlade

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    312
Rui Carlos

por ex;

1,2,3,4,5,7,8,9,10,11

Output: "É uma P.A de razão: 1"

O que é uma resposta errada (..., 4 , 5, 7, ...).

Em todo o caso, neste momento, penso que vais no caminho correcto.

Algumas sugestões: tira aquele else de dentro do ciclo (só quando o ciclo acabar é que podes concluir que tens uma progressão aritmética), não precisas do conttres (basta-te comparar dois pares seguidos), e tem cuidado com a condição de paragem do ciclo para não saíres novamente dos limites.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.