Raddoppio dimensioni array

Andreawave

Nuovo Utente
27 Gen 2014
11
0
1
Ciao a tutti.
Sono alle prese con il seguente esercizio:
"Scrivere un programma java che legga da tastiera una sequenza di numeri interi e la memorizzi in un array. Il valore "0" indica la fine della sequenza.
Se l'array viene riempito, crearne uno nuovo di dimensione doppia rispetto al precedente; nella prima metà copiare gli elementi dell'array di partenza, nella seconda metà continuare ad inserire altri elementi da tastiera. Lo zero indica sempre la fine della sequenza".
Il codice che ho inserito è il seguente:

Codice:
public class DoppioArray {

   public static void main(String[] args) {
      
      InputWindow in = new InputWindow();
      OutputWindow out = new OutputWindow();
      final int MAX = 10;
      int[] tabella = new int[MAX];
      int i = 0;
      int x = in.readInt("Inserisci elemento");
      
      while(x != 0){
         if(i<tabella.length){
            tabella[0]=x;
            for(i=1; i<tabella.length; i++){
               x=in.readInt("Inserisci elemento");
               tabella[i]=x;
               
            }
            for(i=0; i<tabella.length; i++)
               out.write(tabella[i] + " ");
                out.writeln();
               
         }
         else{
            int[] doppio = new int[MAX*2];
            for(i=0; i<tabella.length; i++)
               doppio[i]=tabella[i];
            for(i=tabella.length; i<doppio.length; i++){
               x = in.readInt("Inserisci elemento");
               doppio[i]=x;
            }
            for(i=0; i<doppio.length; i++){
               out.write(doppio[i] + " ");
            }
         }
            
            
            
         
            

      }
         
   }

}
Il problema che riscontro è che anche se inserisco il valore 0, il programma non esce dalla sequenza e mi continua a chiedere di inserire altri valori.
Cosa c'è che sbaglio?
Grazie
 
La classe InputWindow è OutputWindow dove le hai prese, non esistono nella jdk di java, sono classi create da te o prese da qualche altra libreria esterna?

In ogni caso sei sicuro che il metodo readInt() restituisca un valore intero, da quello che so il dato restituito da tastiera è di tipo stringa, almeno che te non lo converti in qualche modo, in ogni caso, ho converti il valore in intero oppure modifichi la condizione del while cosi:

Codice:
x != '0'
 
Le classi InputWindow e OutputWindow sono state appositamente create. L'istruzione il metodo readInt() serve a leggere interi e non richiede conversioni esplicite.
Ho provato a modificare l'istruzione all'interno del while come tu mi hai scritto, ma il programma non mi esce ugualmente. Mi raddoppia la dimensione dell'array ogni volta che viene riempito, mi stampa tutti i numeri inseriti fino al riempimento dell'array e poi mi chiede di nuovo di inserire altri valori.
Però se inserisco lo zero, l'inserimento non s'interrompe.
 
Bhe.. ovvio che non ti esce, non ci avevo pensato neanche io la prima volta, non ti esce perché il ciclo for deve finire, fin quando non finisce non può validare la condizione del while, infatti se inserisci lo 0 come decimo numero ti esce, ho provato io stesso è mi funziona, la condizione di uscita dovresti metterlo anche all'interno del for, cosi:

Codice:
if (x == 0) {
   break;
}

Non so se mi sono spiegato, e scusa ma non ci avevo pensato prima.
 
Ultima modifica:
E senza dover usare necessariamente l'istruzione break? A lezione ci hanno spiegato le istruzioni break e continue(così come lo switch case) però ci hanno detto che non vogliono che si usino, soprattutto in sede d'esame.
 
In alternativa al break, puoi dichiarare il primo for in questo modo:

Codice:
for(i=1; i<tabella.length & x != 0; i++)

Nella condizione il for ha un'operazione logica, cioè, e true, e quindi si ripete, fino a quando entrambi ( & = and logico ) le operazioni sono vere.

Oppure metti una if che controlli se il valore della variabile x sia diverso da 0, prima di eseguire le operazioni del for.

Oltre a questi due metodi non mi ne viene nessun altro.

Lascia che ti dia un consiglio per programmare meglio, non so se lo sai già, ma per programmare, è soprattutto per evitare questi errori, cosa che infatti io nella prima risposta non ho fatto :), ma poi facendola mi sono accordo del problema, è che: dovresti eseguire il tuo programma mentalmente, operazione per operazione, cioè, io quando avevo degli errore mi prendevo un foglio, scrivevo mano mano le operazione che faceva il programma, in poche parole analizzavo il programma operazione per operazione ( tenendo conto dei cicli che ripetevano l'operazione e altro ), facendo cosi ho risolto parte dei problemi che ho riscontrato nella programmazione java, purtroppo java non è vb.net che ha incorporato questo metodo di analizi ( operazioe per operazione ), resta solo che farselo al mente, almeno che te non conosca un editor java che faccia ciò.
 
Ultima modifica:
Ok! Adesso funziona bene! Soltanto che la condizione:
Codice:
&& x!=0
va messa non solo nel primo ciclo for, ma anche nel secondo ciclo for dopo l'else.
Diventa quindi:
Codice:
else{
				int[] doppio = new int[MAX*2];
				for(i=0; i<tabella.length; i++)
					doppio[i]=tabella[i];
				for(i=tabella.length; i<doppio.length && x!=0; i++){
					x = in.readInt("Inserisci elemento");
					doppio[i]=x;
				}
				for(i=0; i<doppio.length; i++){
					out.write(doppio[i] + " ");
				}
			}
Grazie mille! E grazie mille per il consiglio!
 

Discussioni simili