Receber um número variável de argumentos numéricos inteir

Bom Dia pessoALL!



Estou com uma dúvida em um exercício e gostaria da ajuda de vocês.



Escreva uma aplicação que receba um número variável de argumentos numéricos inteiros especificados pelo usuário, (a) a quantidade de valores recebidos, (b) a somatória de todos os valores, © o produto de todos os valores e (d) a média aritmética de todos os valores.



Imagino que deva ser feito como uma matriz, mas eu não sei como…



Desde já agradeço,

Cátia

Você poderia usar um Array de int ou numa Collection de Integers.

…E como eu declaro uma Array?..

int[] intArray = new int[10]; // Por exemplo

Mas no caso ele não determina o número de argumentos que será recebido…



Se eu colocar o new int[10] ele recebera até 10 argumentos?..

Você pode usar um Collection, que não possui limitação de tamanho fixo, Por exemplo:

Code:


Collection colInts = new ArrayList(); // Ou LinkedList, ou Vector, ou HashSet, o que for mais conveniente.

// Voce pega seus números de algum lugar.

// Para cada número …

colInts.add(new Integer(meuInt));




Para usar a Collection:

Code:


Iterator itInt = colInts.iterator();

while(itInt.hasNext()) {

int i = ((Integer)itInt.next()).intValue();

// Usar i conforme as necessidades

}




Agora supondo que uma vez lido os dados você não irá colocar mais dados nela, é possível tranformar a Collection em um Array de Integers. Desta forma:

Code:


// Depois de ler os dados.

Integer[] arrayInteger = colInts.toArray()




Para usar o Array:

Code:


for(int i = 0; i < arrayInteger.length; i ++) {

int x = arrayInteger[i].intValue();

// faz uso de x

}




A vantegem desta forma é que aumenta a perfomance. Mas creio que usando Collection ou Array, os dois modos valem a pena.



Boa Sorte,

Se os argumentos forem passados no console vc pode fazer assim:



public static void main(String[] args) {



int[] array = new int[args.length()];



}



Assim, vc define o array de inteiros de acordo com a quantidade de argumentos passados para a main no console.



Se for de outra maneira qualquer tente usar um Vector assim:



java.util.Vector vetor = java.util.Vector();



E depois que vc receber o int:



vetor.add(new Integer(seuInt));



Pronto. O vector vai crescer de acordo com a sua necessidade.



valeuz…

Acho que no meu caso, que estou iniciando o comando Array parece mais simples…



Pelo que eu entendi então eu devo declarar assim…



int[] array = new int[args.length()];



for(int i = 0; i < arrayInteger.length; i ++) { // não entendi o &lt …



int x= arrayInteger[i].intValue();





ou será eu estou viajando…



É que o code do forum corrompeu o codigo. Na verdade o que o rucafonso propôs foi:



for(int i = 0; i < arrayInteger.length; i ++) {

int x = arrayInteger[i].intValue();

// faz uso de x

}



Ou seja, percorrer o array a posição zero(0) até o seu tamanho(length).



valeuz…

  1. Não é "&lt" é "<"! Entretanto, neste forum, quando se escreve entre as tags CODE, ele confunde "<" com a tag HTML "&lt". O equivalente ocorre quando se usa ">". Será que algum mantenedor deste fórum não poderia dar um jeito nisso?. Isso sempre acontece! :-Y

    2) Seu código contém alguns erros:

    2.1) args é um array de Strings (Os argumentos que passou para o programa), não de ints.

    2.2) primeiro você usa o array de int array[] e depois faz uso do array de Integers arrayInteger. Se refere a mesma coisa?

    3) Reescreveria seu código assim:



    // Supondo que os argumentos são passados como argumentos do programa

    static void main(String args[]) {

    // Convertendo o array de Strings e um array de ints

    int[] intArgs = new int[args.length]; // length é um atributo do array, não um método.

    for(int i = 0; i < args.length; i ++) {

    intArgs[i] = Integer.parseInt(args[i]); // Se algum argumento não for um inteiro, é disparada uma NumberFormatException.

    }

    // faz uso de intArgs[]

    }



    Espero que isso sirva para você.

rucafonso e jack_-_ganzha



Espero que dessa vez a dúvida acabe… Eu já tentei compilar e está tudo ok!

sendo que eu ainda tenho alguma perguntas… O restante eu acho que sei como fazer.







public class Exerc14 {

public static void main(String[] args) {



int[] intArgs = new int[args.length];

//o atributo args.length funcionaria como um vetor, é isso?..

//ele já me traria o total de argumentos inseridos?



for(int i = 0; i < args.length; i ++) {

intArgs[i] = Integer.parseInt(args[i]);

// no lugar do intArgs eu poderia utilizar outro nome? intX …

}

System.out.println("quantidade de valores recebidos:"+(i));

// Eu devo mandar imprimir (i) ou (intArgs)



}

}

}





Desde já, Valeu!

Cátia

Catia, o meu exemplo para que vc usasse args.length assume que vc está executando a sua classe, por exemplo, assim:



java Exerc14 1 20 3 4 5



outro exemplo:



java Exerc14 21 354 3 15 654 22 17 5



Ou seja, vc está passando os argumentos por linha de comando. Daí, a main está recebendo args[], que é um array de String. Então, vc declara o seu array de int do mesmo tamanho do numero de argumento passados na linha de comando.



Agora as outras perguntas:

1. "no lugar do intArgs eu poderia utilizar outro nome?"

Sim, vc poderia declarar com outro nome. Poderia ser, por exemplo, arrayDaCatia.



2. "System.out.println("quantidade de valores recebidos:"+(i));

// Eu devo mandar imprimir (i) ou (intArgs)?".

Eu mandaria imprimir o tamanho do array. Assim:

System.out.println("quantidade de valores recebidos:"+(intArgs.length));



Mas, não tem problema imprimir o i. Dá na mesma.:-]



valeuz…

Vamos por partes

Quote:


public static void main(String[] args) {



int[] intArgs = new int[args.length];

//o atributo args.length funcionaria como um vetor, é isso?..

//ele já me traria o total de argumentos inseridos?




O vetor (de Strings) é args. args.length é o tamanho deste vetor. E, sim ele te traz o número de argumentos.

Uma coisa length diz respeito ao número de posições - ou "casinhas - reservadas ao array na memória, independente de todas as "casinhas" serem utilizadas ou não. Por exemplo, suponha que você faça int[] inrArray = new int[10] e você preenche as posições de 0 a 4. Quando pedir intArray.length, o programa retornará 10, pois é quanto você reservou para o array. Os valores 5 a 9, que não foram preenchidos conterão lixo, valores aletórios (ou conteria 0´s? Agora não tenho certeza).

Quote:


for(int i = 0; i < args.length; i ++) {

intArgs[i] = Integer.parseInt(args[i]);

// no lugar do intArgs eu poderia utilizar outro nome? intX …

}




Claro que pode! Lembro-me de uma colega minha que nomeava seus programas pelos simpáticos nomes de "pudim", "sorvete" e coisas do gênero :slight_smile: . Portanto Se quiser pode chamar seu array de "jacas", "maçãs", etc ;-). As únicas restrições ao nomear as variáveis é que elas devem começar por letras, underscore ("_") ou cifrão ("$"). Portanto não vale chamar "2array", por exemplo. É claro que quanto mais seu nome"tiver a ver" com o que estiver fazendo, melhor para a compreensão do código para as pessoas.

Quote:


System.out.println("quantidade de valores recebidos:"+(i));

// Eu devo mandar imprimir (i) ou (intArgs)




Você deve imprimir intArgs.length. Além disso, como "i" foi definido dentro do for(), ele será "visível" dentro do for(). Se utilizá-lo fora vai dar erro de compilação.



Espero que isso sirva,

Valeu!!! :-]