Jump to content
FireBlade

Progressão aritmética

Recommended Posts

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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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.

Edited by Flinger

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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

Edited by Rui Carlos

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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.

Edited by FireBlade

Share this post


Link to post
Share on other sites
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

  • Vote 2

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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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.

Edited by Pivot

Share this post


Link to post
Share on other sites
FireBlade

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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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.

Edited by Rui Carlos
GeSHi

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
FireBlade

no mesmo sítio de sempre :

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

O código já foi executado e não dá esse erro.

Share this post


Link to post
Share on other sites
HappyHippyHippo

prontos ... estás a dizer então que o exercício está resolvido ...


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

Share this post


Link to post
Share on other sites
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.

Edited by Flinger

Share this post


Link to post
Share on other sites
Rui Carlos

Uma sugestão para o algoritmo: calcula a diferença entre os dois primeiros números, e depois verifica se as diferenças entre os restantes pares são todas iguais à diferença entre os dois primeiros.

Share this post


Link to post
Share on other sites
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"

Edited by FireBlade

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
Pivot

Já agora, mete o código java entre a tag:

[/code*][/b]

Tira os asteriscos das tags...

Abraço,

Rafael.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.