Nuovo con la programmazione in java

di il
13 risposte

Nuovo con la programmazione in java

Buonasera, devo sostenere l'esame di fondamenti di informatica con java.
""" Si scriva un metodo costruisciVettore che riceve in ingresso un vettore v1 e restituisce un vettore v2 contenente ogni elemento v1, con i?[0 .. v1.length-1], tale che v1 è maggiore di tutti gli elementi che lo seguono nel vettore.
Se non esiste alcun elemento in v1 che soddisfa le precedenti condizioni, allora v2 conterrà un unico elemento uguale a -1.
Ad esempio, se v1 = [5,1,12,3,7,2], il vettore restituito è v2 = [12,7] essendo 12 maggiore di 3,7,2 ed essendo 7 maggiore di 2. Se v1 = [3, 1, 2, 7], il vettore restituito è v2 = [-1]."""


Ho creato un metodo che mi restituisce il massimo dell'array,a partite da una posizione che inserisco io.
ora io vorrei che trovato il primo massimo,mi si restituisse l'indice della sua posizione,in modo da trovare il secondo massimo,a partire da li.
Non so se il mio ragionamento è corretto. aspetto i vostri pareri

13 Risposte

  • Re: Nuovo con la programmazione in java

    frank.daniele ha scritto:


    Ho creato un metodo che mi restituisce il massimo dell'array,a partite da una posizione che inserisco io.
    ora io vorrei che trovato il primo massimo,mi si restituisse l'indice della sua posizione,in modo da trovare il secondo massimo,a partire da li.
    Non so se il mio ragionamento è corretto. aspetto i vostri pareri
    No, direi che stai andando un po' "fuori dal seminato". E' molto più facile di quanto pensi: per ciascun elemento di v1 devi semplicemente andare a verificare se è il maggiore di tutti quelli seguenti. Bene, parti dal primo valore e lo confronti con i seguenti. Poi prendi il secondo e lo confronti con i seguenti. Si tratta banalmente di un doppio ciclo for "annidato".

    C'è solo una ulteriore questione: come dimensionare v2. Infatti non sai a priori quanti valori "max" troverai. Qui ci sono diverse strategie per arrivare ad avere un v2 della lunghezza "giusta". Dipende (anche) da cosa ti è stato chiesto/suggerito di fare.
  • Re: Nuovo con la programmazione in java

    Ho provato a risolverlo cosi, i valori escono, ma non sono sicuro che a livello di ragionamento sia tutto corretto.

    public class gennaio181 {

    public static void main(String[] args){
    int[]c={5,1,12,3,7,2};
    System.out.print(maxi(c)+1+" ");
    stampa(crea(c));
    }

    public static void stampa(int[]c){
    for(int i=0;i<c.length;i++)
    System.out.print(c+" ");
    }
    public static int[] crea(int[]v){
    int s=0;
    for(int i=0;i<v.length-1;i++)
    if(v>v[i+1])
    s++;
    int[]c=new int[s];
    int a=1;
    c[0]=max(v,0);
    for(int i=1;i<c.length;i++)
    if(maxi(v)<i){
    c[a]=max(v,0);
    a++;}
    else{
    c[a]=max(v,maxi(v)+1);
    a++;}
    return c;
    }



    public static int maxi(int[]v){
    int max=v[0];int pmax=0;
    for(int i=0;i<v.length;i++)
    if(v>max){
    max=v;
    pmax= i;}
    return pmax;
    }
    public static int max(int[]v,int pos){
    int c=v[0];
    for(int i=pos;i<v.length-1;i++)
    if(v> c)
    c=v;

    return c;
    }

    }
  • Re: Nuovo con la programmazione in java

    frank.daniele ha scritto:


    Ho provato a risolverlo cosi, i valori escono, ma non sono sicuro che a livello di ragionamento sia tutto corretto.
    No .... troppa roba, è fumosissimo!
    Ripeto che per trovare tutti i max dei seguenti bastano 2 for annidati. Se vuoi conteggiare prima quanti sono, si può ripetere quel for annidato (sì è una ripetizione ma "leggera" e accettabile) per calcolare quanti sono. Oppure dimensionare v2 grande quanto v1 e poi riempire e man mano contando anche e poi alla fine creare un ulteriore array finale della "giusta" dimensione. Oppure, altra strategia, riallocare l'array di 1 più grande ad ogni nuovo inserimento.

    P.S. per capire quanto ho detto, invece di pensare a creare l'array fai un passo prima solo per stampare direttamente i dati.

    EDIT: come altro piccolo suggerimento, se vuoi semplificare un po', puoi fare un metodo del tipo:

    public static boolean maggioreSeguenti(int[] array, int indice)

    che restituisce true se il valore array[indice] è maggiore di tutti quelli seguenti nell'array (da indice+1 compreso in poi). A quel punto altrove ti basta 1 for ed usare all'interno questo metodo.
  • Re: Nuovo con la programmazione in java

    Scusami ma sto andando proprio in palla. Potresti scrivermi la stringa di codice?
    Non capisco proprio come fare, sarà che ormai mi è andato in pappa il cervello...
    come uso un doppio for su un vettore?

    mi verrebbe da dire cosi, ma non funziona:

    public static boolean mag(int[]v,int z){
    boolean magg=false;
    for(int i=0;i<v.length;i++)
    for(int j=z+1;j<v.length;j++)
    if(v[z]>v[j])
    magg=true;

    return magg;
    }
  • Re: Nuovo con la programmazione in java

    frank.daniele ha scritto:


    come uso un doppio for su un vettore?

    mi verrebbe da dire cosi, ma non funziona:
    public static boolean mag(int[]v,int z){
    		boolean magg=false;
    		for(int i=0;i<v.length;i++)
    			for(int j=z+1;j<v.length;j++)
    			if(v[z]>v[j])
    				magg=true;
    			
    	return magg;
    	}
    Nel metodo che ti ho suggerito prima, ovvero:

    public static boolean maggioreSeguenti(int[] array, int indice)

    (che è presumo quanto stai cercando di fare sopra), qui basta 1 (UNO) ciclo for. Non serve un doppio ciclo for!

    Quindi:
    public static boolean maggioreSeguenti(int[] array, int indice) {
        for ( ......... ) {
            // ... qui confronti array[indice] con un altro elemento seguente (devi ragionare tu sul senso del confronto, vedi sotto)
            // ..
        }
    
        // ....
    }
    In questo metodo puoi sfruttare in modo "furbo" il return. Se trovi che uno dei valori seguenti è MAGGIORE(/uguale presumo anche) del valore di riferimento array[indice] .... cosa puoi fare subito?

    Poi questo maggioreSeguenti (o come lo chiami), lo invochi altrove dentro un altro for.
  • Re: Nuovo con la programmazione in java

    Public static boolean mag(int[]v,int z){

    for(int i=z;i<v.length-1;i++){
    if(v[z]<v[i+1])
    return false;}

    return true;
    }
  • Re: Nuovo con la programmazione in java

    frank.daniele ha scritto:


    Public static boolean mag(int[]v,int z){

    for(int i=z;i<v.length-1;i++){
    if(v[z]<v[i+1])
    return false;}

    return true;
    }
    Sì, ci siamo! (si può migliorare un pelino, ragiona sui +1 e -1 che hai messo). Ma il senso è quello!

    Ora USA questo mag dentro un altro for altrove (ad esempio per conteggiare i maggiori). E poi un altro for per copiare i maggiorni nel nuovo array.
  • Re: Nuovo con la programmazione in java

    Allora, mi crea un array di 2 posti, e fin qui dovrei essere nel giusto. Il problema sorge quando devo trascrivere " trovato e inserito il primo massimo, trova e inserisci il secondo".... questo problema di riempire qualcosa mi si presenta anche con qualche matrice....


    public static int[] crea(int[]v){
    int s=0;
    for(int i=0;i<v.length-1;i++)
    if(mag(v,i))
    s++;
    int[]c=new int[s];
    int a=0;int b=0;

    for(int i=0;i<c.length;i++)
    for(int j=0;j<v.length-1;j++)
    if(mag(v,j)){
    b=v[j];
    c[a]=b;
    a++;
    }
    else // non so nemmeno se esiste questa condizione che ho scritto
    j++;

    return c;
    }
  • Re: Nuovo con la programmazione in java

    frank.daniele ha scritto:


    		int s=0;
    			for(int i=0;i<v.length-1;i++)
    				if(mag(v,i))
    				s++;
    int[]c=new int[s];
    Questa parte è sensata e corretta.

    frank.daniele ha scritto:


    int a=0;int b=0;
    
    		for(int i=0;i<c.length;i++)
    					for(int j=0;j<v.length-1;j++)
    						if(mag(v,j)){
    						b=v[j];
    				c[a]=b;
    					a++;
    					}
    						else   // non so nemmeno se esiste questa condizione che ho scritto
    							j++;
    			
    return c;
    	}
    Questa parte è sbagliata e non ha praticamente quasi alcun senso.

    Non serve un doppio for! Basta 1 for esattamente come hai fatto sopra. Solo che qui INVECE di "contare" (s++) semplicemente SCRIVI il valore v[i] nell'array di risultato. E chiaramente serve tenere una ulteriore variabile di indice (da usare nel nuovo array) che incrementi SOLO quando scrivi il valore (NON ad ciclo, ovviamente).

    Hai dimenticato il caso "particolare" che se non trova niente deve restituire {-1}. Semplicemente dopo il conteggio, se 0 allora restituisce un array "letterale" che ha il -1.


    P.S. usa nomi di variabili sensate. E cerca anche di scrivere il codice ben indentato/spaziato.
    Capisco che per chi inizia non sia facile ...
  • Re: Nuovo con la programmazione in java

    Avevo provato già a scriverlo con un solo for, ma non mi usciva ,forse a causa di parentesi mal poste....
    La soluzione corretta potrebbe essere questa?
    for(int i=1;i<v.length-1;i++)
    						if(mag(v,i)){
    							c[a]=v[i];
    							a++;}

    Mi sta facendo impazzire questa materia, non avendo un professore capace e disponibile, sono costretto a fare l'autodidatta disperato...
  • Re: Nuovo con la programmazione in java

    frank.daniele ha scritto:


    La soluzione corretta potrebbe essere questa?
    for(int i=1;i<v.length-1;i++)
    						if(mag(v,i)){
    							c[a]=v[i];
    							a++;}
    Strutturalmente è corretto, è quello che serve. Ma perché parti da 1? Deve partire da 0!
    Poi (finezza ma non cambia nulla) puoi anche fare c[a++]=v[i];

    frank.daniele ha scritto:


    non avendo un professore capace e disponibile
    Capisco .....
  • Re: Nuovo con la programmazione in java

    Si hai ragione, è stata una svista partire da 1.
    Ti ringrazio per la tua pazienza, mi hai fatto arrivare alla soluzione di questo problema.
    vorrei chiederti un'altra cosa se possibile. Come faccio a capire dove inserire le graffe? Ho notato che in alcuni casi vanno messe dopo il for, in altri casi dopo l'if, ma secondo quale logica?
  • Re: Nuovo con la programmazione in java

    frank.daniele ha scritto:


    Come faccio a capire dove inserire le graffe? Ho notato che in alcuni casi vanno messe dopo il for, in altri casi dopo l'if, ma secondo quale logica?
    Allora: classi e metodi hanno sempre bisogno delle graffe.

    Per le istruzioni di "controllo del flusso" (come if/for/while/do-while), se devono contenere una singola istruzione, si possono omettere le graffe. Se devono contenere più istruzioni, le graffe sono obbligatorie.
    for ( ....... )
        System.out.println( ... );
        System.out.println( ... );
    Qui il fatto che i System.out.println li abbia scritti ben indentati NON vuol dire nulla, non conta questo per Java. Solo il primo System.out.println è il "corpo" del if. Il secondo System.out.println è fuori e sostanzialmente segue dopo il if.

    Se vuoi avere i due System.out.println come corpo del if, allora si deve fare:
    for ( ....... ) {
        System.out.println( ... );
        System.out.println( ... );
    }
    Il consiglio è di mettere SEMPRE le graffe, anche per UNA sola istruzione. Io perlomeno faccio così ormai da quasi sempre. Poi c'è chi ha altri gusti ....
Devi accedere o registrarti per scrivere nel forum
13 risposte