Problema nel main

di il
9 risposte

Problema nel main

Ciao a tutti, ho creato una classe, in base alla quale voglio stampare e contemporaneamente ordinare l'array. Devo prima creare i metodi stampa,ordina e annulla(pone uguale a 0 le posizioni pari di un array), e poi nel main li richiamo, non devo utilizzare sort.
Grazie a quanti mi aiuteranno.

public class ArrayV {
private int[] nom;
private int dim;
public static void stampa(int nom[]){
	String a="";
	for(int i=0;i<nom.length;i++)
		a+=nom[i];
	System.out.print(a);
}
public static int [] ordina(int[] nom, int dim){
	int [] tmpA=new int[dim];
	int k=0;
	for(int i=0;i<dim;i++)
		if(i<i+1) 
			tmpA[i]=nom[k];
	k++;
	return tmpA;
}
public static void annulla(int nom[]){
	for(int i=0;i<nom.length;i++)
		if(i%2==0) nom[i]=0;
                else i++;
	System.out.println(nom);	
}
public static void main(String [] args)throws Exception{
	int[] v={8,5,3,7};
	ArrayV.stampa(v);
	// qui voglio chiamare il metodo annulla
       // qui voglio chiamare il metodo ordina
}
}

perchè la stampa me la restituisce, mentre per il metodo annulla o ordina mi restituisce: [I@8dc8569
???

9 Risposte

  • Re: Problema nel main

    Ciao!!
    Il problema della stampa è dovuto al fatto che il metodo println chiamato su un oggetto stampa, "per default", la posizione in memoria dell'oggetto stesso.
    quello che dovresti usare tu per stampare il contenuto dell'array è
    ArrayV.stampa(nom)
    (anche se per come è implementato, questo metodo stampa tutti i numeri appiccicati. Ti consiglio di cambiare la riga
    a+=nom[i]
    con
    a+=nom[i]+" "
    ).

    Inoltre nel metodo annulla c'è un errore! quella riga "else i++" devi toglierla, perché altrimenti "salti" gli elementi di indice 2,4,6,...

    Nel metodo per ordinare l'array, invece, è sbagliato l'algoritmo!
  • Re: Problema nel main

    Ti ringrazio, ora riprovo come mi hai sconsigliato.
    questo metodo ordina secondo te invece è corretto?
    
    public static int []ordina(int[] nom, int dim){
    	int [] tmpA=new int[nom.length];
    	for(int i=0;i<nom.length;i++)
    		if(i<i+1) tmpA[i]=nom[i];
    	return tmpA;
    	System.out.print(tmpA);
  • Re: Problema nel main

    No neanche questo è corretto.

    i motivi sono diversi:
    innanzitutto l'istruzione "System.out.println(tmpA)" non verrà mai eseguita, poiché si trova dopo l'istruzione di return.

    in secondo luogo, l'istruzione "if(i<i+1)" è sbagliata concettualmente: infatti, "i" è l'indice con il quale scorri l'array, e non un elemento dell'array. Quindi "i" sarà sempre minore di "i+1", con il risultato che semplicemente creerai un array identico a quello che hai passato alla funzione.
  • Re: Problema nel main

    Scritto correttamente è questo:
    public static int []ordina(int[] nom, int dim){
    	int tmp;
    	for(int i=0;i<dim-1;i++){
    		for(int j=i+1;j<dim;j++)
    			if(nom[i]>nom[j]){
    			tmp=nom[j];
    		    nom[j]=nom[i];
    		    nom[i]=tmp;
    	}
    	}
    	return nom;
    }
    ma ora quale sarà il main per far si che mi applichi questo metod?? faccio un esempio di main.
    public static void main(String [] args){
    	int[] v={8,5,3,7};
         // voglio stampare e ordinare questo array.
    }
    }

    quello che mi avevi scritto su non funziona:
    ArrayV.stampa(nom);
    grazie.
  • Re: Problema nel main

    Il metodo ordina ora dovrebbe essere giusto!però avevi detto che doveva ordinare un array ma anche stamparne i valori. Per cui come ultima istruzione prima del return metterei quella ArrayV.stampa(nom).
    Nel main,invece, quello che devi fare per stampare ed ordinare è semplicemente un
    
    int [] v = {8,5,3,7};
    ArrayV.stampa(v); //stampa il contenuto di v senza ordinarlo
    ArrayV.ordina(v,v.lenght);//ordina e stampa il contenuto di v
  • Re: Problema nel main

    Cosi facendo, le lo ordina e basta, e mi stampa il primo a video col tuo primo comando, non me lo stampa ordinato.
    Anche richiamando:
    System.out.print(ArrayV.ordina(v,v.length));
    mi accede alla posizione di memoria dell array, infatti mi restituisce:
    [I@8dc8569
    con il tuo secondo comando, non stampa l'array ma lo ordina solamente.

    L'esercizio completo è:
    public class ArrayV {
    private int[] nom;
    private int dim;
    public static void stampa(int nom[]){
    	String a="";
    	for(int i=0;i<nom.length;i++)
    		a+=nom[i];
    	System.out.print(a);
    }
    public static int []ordina(int[] nom, int dim){
    	int tmp;
    	for(int i=0;i<dim-1;i++){
    		for(int j=i+1;j<dim;j++)
    			if(nom[i]>nom[j]){
    			tmp=nom[j];
    		    nom[j]=nom[i];
    		    nom[i]=tmp;
    	}
    	}
    	return nom;
    }
    public static void annulla(int nom[]){
    	for(int i=0;i<nom.length;i++)
    		if(i%2==0) nom[i]=0;
         System.out.println(nom);	
    }
    public static void main(String [] args)throws Exception{
    	int[] v={8,5,3,7};
    	//int tmp[]=new int[4];
    	//ArrayV.stampa(v.ordina);
    	//annulla(v);
    	//System.out.print(ordina(v));
    	//ArrayV.stampa(v); //stampa il contenuto di v senza ordinarlo
    	System.out.print(ArrayV.ordina(v,v.length));//ordina e stampa il contenuto di v
    }
    }
  • Re: Problema nel main

    Si è corretto che la system.out.println di ArrayV.ordina stampi un indirizzo di memoria, poiché quel metodo restituisce un array.

    quello che intendevo è questo:
    
    public static int []ordina(int[] nom, int dim){
       int tmp;
       for(int i=0;i<dim-1;i++){
          for(int j=i+1;j<dim;j++)
             if(nom[i]>nom[j]){
             tmp=nom[j];
              nom[j]=nom[i];
              nom[i]=tmp;
       }
       }
       ArrayV.stampa(nom);
       return nom;
    }
    
    
    public static void main(String [] args){
       int[] v={8,5,3,7};
       ArrayV.stampa(v); //stampa il contenuto di v senza ordinarlo
       ArrayV.ordina(v,v.length);//ordina e stampa il contenuto di v
    }
    
  • Re: Problema nel main

    Grazie della, ora va bene. Colgo l'occasione per porti una domanda.
    L'utilizzo di Math.round() va fatto in questo modo:
    Math.random(8)    //creo numeri da 0 a 8
    oppure in questo modo:
    (Math.random())*8 
    ?? sono la stessa cosa?

    per creare numeri da 3 a 8:
    Math.random(5)+3
    oppure:
    (Math.random())*5+3
    grazie
  • Re: Problema nel main

    Mmm che io sappia il metodo Math.random(int n) non esiste.

    Se vuoi creare un numero da 0 a 8 devi usare Math.random()*9, poiché il metodo random() restituisce un numero double 0 <= n < 1.
Devi accedere o registrarti per scrivere nel forum
9 risposte