Forum Informatica Unict

LAUREA TRIENNALE (D.M. 270/04) => Programmazione 1, 9 CFU => Topic started by: Zallak on 18-11-2012, 23:25:43



Title: Controllare se in un array esistono coppie o triple di elementi.
Post by: Zallak on 18-11-2012, 23:25:43
Ho generalizzato il problema lasciato dal prof ed ho scritto questo codice per tentare di risolverlo.. che ne pensate può andare?  .penso

Code:
public class Array6
{
public static void main(String[] args)
{
int[] a = new int [100];
int i = 0, k = 0, h = 0, w = 1, x = 0;
double xd = 0;
boolean t = false, m = false;

System.out.println("L'array a contiene gli elementi: ");

while (i < a.length)
{
xd =  Math.random()*101;
x = (int) xd;
a[i] = x;
System.out.println(a[i++]);

}                                                 //Inizializza casualmente l'array con valori da 0 a 100.

i = 0;

while (i < a.length)
{
k = a[i];                              //Assegna ogni elemento  una variabile..
h = i++ + 1;               

while (h < a.length)           
{
if (k == a[h])             //E lo confronta con tutti gli altri elementi di indice superiore.
{
t = true;            //Verifica che l'elemento si ripeta almeno una volta.
w++;                //Conta il numero di volte che l'elemento si ripete partendo da 1.
h++;
}

else
{
h++;
}
}

if (t == true)                          //Stampa l'output e resetta le variabili.     
{
System.out.println("L'elemento "+k+" è presente nell'array "+(w)+" volte.");
m = true;                        //Controlla che ci sia almeno una coppia di elementi.
t = false;
w = 1;
}



}

if (m == false)
{
System.out.println("Nell'array a non esistono due elementi uguali.");
}



}

}


Title: Re:Controllare se in un array esistono coppie o triple di elementi.
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 19-11-2012, 01:00:54
Diciamo che quello che deve fare lo fa, ma lo fa in modo un po' ridondante, poco efficiente e un po' più difficilmente comprensibile.

Suggerimenti su come ottimizzare il codice:
  • Limita sempre lo scope (visibilità e vita delle variabili) al più piccolo blocco di codice che dovrà usare (lo stretto necessario).
  • Dai alle variabili nomi auto-esplicativi, quando opportuno ("i" per un indice va bene, ma x e xd non significano nulla!)
  • A meno che non sia richiesto esplicitamente dal docente per chiarire il codice, evita variabili superflue (ad es. il ciclo che inizializza l'array può essere ridotto a:

    i = 0;
    while (i < a.length) {
        a [i] = (int) (Math.random () * 101);
        System.out.println (a [i++]);
    }
  • Quando un ciclo ha un inizio ben preciso e una fine ben precisa, è più chiaro raggruppare le parti di inizializzazione, condizione di uscita, e incremento, in un unico posto per leggibilità, e in questo ci aiuta il ciclo for (da sostituire, nel tuo codice, al while)
  • Gli incrementi inline delle variabili con valutazione pre-post incremento, vanno usati con saggezza! Non sono indicati in materie come Programmazione 1 (a meno che non si stia cercando di fare qualcosa che va oltre la pura programmazione) e, se usati male, possono rendere difficile la comprensione del codice. Ad esempio, qui:
    k = a[i];                              //Assegna ogni elemento  una variabile..
    h = i++ + 1;

    considerato che (i++) + 1 == ++i, potevi fare la sostituzione, ma in ogni caso, anche qui andava meglio un bel ciclo for
  • All'interno del ciclo while più esterno dei due annidati, considerato che né ia[i] cambiano da quando fai k = a[i] a quando stampi il valore k, puoi elegantemente scegliere di stampare direttamente a[i] invece di k
  • Fattorizzazione del codice: quando esiste codice duplicato in posizioni strategiche, bisogna cercare di riciclarlo e scriverlo una sola volta, si risparmia codice (così si ha un programma più piccolo, più veloce e, nel caso si dovessero apportare modifiche, le modifiche andrebbero applicate una sola volta) e, nel caso di codici molto grandi, si diminuiscono i punti in cui ci potrebbero essere errori. Nel tuo caso
    if (k == a[h])             //E lo confronta con tutti gli altri elementi di indice superiore.
    {
        t = true;            //Verifica che l'elemento si ripeta almeno una volta.
        w++;                //Conta il numero di volte che l'elemento si ripete partendo da 1.
        h++;
    }

    else
    {
        h++;
    }

    si presenta un codice del tipo
    if (condizione) {
        //blocco 1
        //blocco 2
    }
    else {
        //blocco 2
    }

    Tale codice si semplifica in:
    if (condizione) {
        //blocco 1
    }

    //blocco 2
  • Blocchi di codice con una sola istruzione, per una questione di eleganza e leggibilità, è bene non racchiuderli tra parentesi graffe

Buonanotte .ciaociao.


Title: Re:Controllare se in un array esistono coppie o triple di elementi.
Post by: Zallak on 19-11-2012, 14:49:55
Anche in questo caso grazie mille per i consigli :) C' è solo una cosa che non va riguardo la parte dell'inizializzazione dell'array.  Avevo gia provato ad evitare la variabile x e a fare il casting direttamente su xd  ma in run time dava problemi non so perchè.. gli elementi restavano inzializzati a 0 :S (riguardo i nomi delle variabili secondo i miei processi mentali strani xd mi ricorda la variabile x però double xD).
Tra poco provo a riscriverlo seguendo i tuoi consigli  :[Emoticon] PC Asd:


Title: Re:Controllare se in un array esistono coppie o triple di elementi.
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 19-11-2012, 15:52:00
C'è solo una cosa che non va riguardo la parte dell'inizializzazione dell'array.  Avevo gia provato ad evitare la variabile x e a fare il casting direttamente su xd  ma in run time dava problemi non so perchè.. gli elementi restavano inzializzati a 0 :S (riguardo i nomi delle variabili secondo i miei processi mentali strani xd mi ricorda la variabile x però double xD).
Tra poco provo a riscriverlo seguendo i tuoi consigli  :[Emoticon] PC Asd:
Dovresti postare il codice vecchio, così ci do un occhiata: detto così non posso dire nulla se non che "forse" (ipotesi azzardata) avevi fatto il casting solo all'espressione Math.random (), invece che all'intera espressione [Math.random () * 101].
Ovvero:
quasi certamente avevi scritto qualcosa come
Code:
a [i] = (int) Math.random () * 101;
che ovviamente applica il casting a int alla sola espressione Math.random (), e siccome tale espressione è sempre un numero che inizia con zero virgola (0,...) essendo compreso tra 0 e 1 (0 incluso 1 escluso), allora, la conversione a intero semplicemente butta via quello che c'è dalla virgola decimale in poi, lasciando il solo zero, che moltiplicato per 101 dà ancora zero.

Ma è solo un'ipotesi .arrossisco...


Title: Re:Controllare se in un array esistono coppie o triple di elementi.
Post by: Zallak on 19-11-2012, 16:05:49
Si sono un'#@!!01Z#@!!@$^ xD


Title: Re:Controllare se in un array esistono coppie o triple di elementi.
Post by: DarioL19F on 19-11-2012, 16:07:58
ciao ragazzi.. io l'esercizio l'ho fatto così, dovrebbe essere di facile compresione.. ho solo un'unico problema che spiego dopo..

Code:
// Quando i numeri sono triplicati nell'array la stampa viene ripetuta.
import javax.swing.*;  

public class ArrayNumUg2
{
public static void main(String[] args)
{
String a;
int n=0, j=0, i=0;
       a=JOptionPane.showInputDialog("Inserisci la dimensione dell'array: ");
n=Integer.parseInt(a);
int[] v=new int[n];
while(i<v.length)
     {
     v[i]=(int)(Math.random()*10+1);
     System.out.println(v[i]);
     i++;
     
     }
i=0;
j=v.length-1;
do{
if(v[i]==v[j])
{
System.out.println("Il valore presente ALMENO due volte e': "+v[i]);
i++;
j=n-1;
}
else {
j--;
if(j==i) {
i++;
j=n-1;
  }
}
}while(i!=v.length-1);
}
}

il mio problema è che se nell'array mi esce tre volte lo stesso numero, per esempio 3 5 6 3 8 4 3, nel momento in cui trova per la prima volta 3,3 che sono il 1° e il 4° numero mi stampa correttamente che il valore è presente almeno due volte, ma dopo continuando il ciclo trovandomi il 4° e il 7° mi stampa nuovamente la stessa cosa di prima..e in output tutto questo è brutto da visualizzare.. ho pensato a qualche controllo da inserire ma non ci sono riuscito... inizialmente avevo fatto un esercizio che trovata la prima coppia usciva, ma se per esempio nell'array trovava almeno una coppia la seconda non veniva stampata.. ovviamente possono esserci due numeri in un array ripetuti almeno due volte.. quindi l'ho modificato in questo modo ma ho questo problema..
reverse come si potrebbe sistemare?   :boh


Title: Re:Controllare se in un array esistono coppie o triple di elementi.
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 19-11-2012, 16:16:11
Ci sono un sacco di modi, ma visto che siete già stati limitati nel non poter usare il for, non so quale altre limitazioni avete.

La cosa migliore sarebbe di eliminare dall'array i numeri già visti essere presenti più volte (ma questo richiede fin troppi spostamenti quando si tratta di array), o comunque usare un altro array (magari di valori booleani) per ricordarsi quali posizioni nell'array principale non bisogna più controllare.


Title: Re:Controllare se in un array esistono coppie o triple di elementi.
Post by: DarioL19F on 19-11-2012, 16:22:02
Ci sono un sacco di modi, ma visto che siete già stati limitati nel non poter usare il for, non so quale altre limitazioni avete.

La cosa migliore sarebbe di eliminare dall'array i numeri già visti essere presenti più volte (ma questo richiede fin troppi spostamenti quando si tratta di array), o comunque usare un altro array (magari di valori booleani) per ricordarsi quali posizioni nell'array principale non bisogna più controllare.

in realtà avevo già pensato di inserire un'altro array dove memorizzavo il numero gia letto due volte e ogni volta che ricompariva facevo un controllo array1[ i ]==array2[ i ].. però non sapendo se fosse una buona soluzione ho preferito lasciarlo cosi  .arrossisco alla fine se il 3 viene ripetuto 4 volte nell'array in output viene
Il valore presente ALMENO due volte e': 3
Il valore presente ALMENO due volte e': 3
Il valore presente ALMENO due volte e': 3
che cmq funziona... che poi è brutto è un'altro discorso :boh vedrò di inserire un'array di controllo appena posso per vedere come viene fuori


Title: Re:Controllare se in un array esistono coppie o triple di elementi.
Post by: Ciadamidaro Davide on 19-11-2012, 18:55:15
qui si interrompe non appena trova il numero di elementi che stiamo cercando
Code:
package array5;

import javax.swing.*;

public class Array5
  {
    
    public static void main(String[] args)
      {
        
        int i=0,j=0,c=0;        
        int Dim=Integer.parseInt(JOptionPane.showInputDialog("inserisci le dimensioni dell'Array"));
        int[] v=new int[Dim];
        
        while(i<Dim)
          {
            v[i]=(int)(Math.random()*10);
            System.out.println("v["+i+"] = "+v[i]);
            i++;
          }
        i=0;
        do
          {
            c=0;
            do
              {
                if(v[i]==v[j])
                  {
                    c++;
                    System.out.println(v[i]+" "+v[j]);
                  }
                j++;
              }while(j<Dim);
            
            j=0;
            i++;
          }while((c<3) &&(i<Dim));
        
        if(c>=3)
            System.out.println("Un elemento è presente almeno 3 volte");
        else
            System.out.println("Un elemento non è presente almeno 3 volte");
      }
  }
basta cambiare il valore d'uscita di "c" nel "do while" e nell'ultimo "if" per cambiare il numero di elementi da cercare


Title: Re:Controllare se in un array esistono coppie o triple di elementi.
Post by: DarioL19F on 20-11-2012, 00:47:25
Ho generalizzato il problema lasciato dal prof ed ho scritto questo codice per tentare di risolverlo.. che ne pensate può andare?  .penso

Code:
public class Array6
{
public static void main(String[] args)
{
int[] a = new int [100];
int i = 0, k = 0, h = 0, w = 1, x = 0;
double xd = 0;
boolean t = false, m = false;

System.out.println("L'array a contiene gli elementi: ");

while (i < a.length)
{
xd =  Math.random()*101;
x = (int) xd;
a[i] = x;
System.out.println(a[i++]);

}                                                 //Inizializza casualmente l'array con valori da 0 a 100.

i = 0;

while (i < a.length)
{
k = a[i];                              //Assegna ogni elemento  una variabile..
h = i++ + 1;               

while (h < a.length)           
{
if (k == a[h])             //E lo confronta con tutti gli altri elementi di indice superiore.
{
t = true;            //Verifica che l'elemento si ripeta almeno una volta.
w++;                //Conta il numero di volte che l'elemento si ripete partendo da 1.
h++;
}

else
{
h++;
}
}

if (t == true)                          //Stampa l'output e resetta le variabili.     
{
System.out.println("L'elemento "+k+" è presente nell'array "+(w)+" volte.");
m = true;                        //Controlla che ci sia almeno una coppia di elementi.
t = false;
w = 1;
}



}

if (m == false)
{
System.out.println("Nell'array a non esistono due elementi uguali.");
}



}

}



purtroppo anche il tuo (come il mio) se il numero viene ripetuto piu volte viene stampato in output piu volte.. ed esteticamente è bruttino  .huh


Title: Re:Controllare se in un array esistono coppie o triple di elementi.
Post by: DarioL19F on 20-11-2012, 00:50:37
qui si interrompe non appena trova il numero di elementi che stiamo cercando
Code:
package array5;

import javax.swing.*;

public class Array5
  {
    
    public static void main(String[] args)
      {
        
        int i=0,j=0,c=0;        
        int Dim=Integer.parseInt(JOptionPane.showInputDialog("inserisci le dimensioni dell'Array"));
        int[] v=new int[Dim];
        
        while(i<Dim)
          {
            v[i]=(int)(Math.random()*10);
            System.out.println("v["+i+"] = "+v[i]);
            i++;
          }
        i=0;
        do
          {
            c=0;
            do
              {
                if(v[i]==v[j])
                  {
                    c++;
                    System.out.println(v[i]+" "+v[j]);
                  }
                j++;
              }while(j<Dim);
            
            j=0;
            i++;
          }while((c<3) &&(i<Dim));
        
        if(c>=3)
            System.out.println("Un elemento è presente almeno 3 volte");
        else
            System.out.println("Un elemento non è presente almeno 3 volte");
      }
  }
basta cambiare il valore d'uscita di "c" nel "do while" e nell'ultimo "if" per cambiare il numero di elementi da cercare

forse ho capito io male.. ma l'esercizio non è proprio questo.. a quanto ho capito il prof chiedeva di stampare i valori ripetuti se uscivano almeno 2 volte e quante volte si ripetevano e non genericamente dicendo che un'elemento è uscito almeno 2(3) volte.. x esempio: (output) il valore 2 si è ripetuto 3 volte, il valore 4 si è ripetuto 5 volte ecc... puo essere che mi sbaglio  .smile


Title: Re:Controllare se in un array esistono coppie o triple di elementi.
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 20-11-2012, 01:29:32
Suvvia. Fatevi dare il testo chiaro, altrimenti vi sforzerete per nulla! :pray (o forse no... .smile)


Title: Re:Controllare se in un array esistono coppie o triple di elementi.
Post by: Ciadamidaro Davide on 20-11-2012, 05:23:18
la stampa è messa solo come controllo del confronto tra numeri, si può benissimo non mettere e far visualizzare solamente la risposta.
e il testo dell'esercizio era di stampare se almeno un elemento era presente 2 o 3 volte, indipendentemente da che numero è


Title: Re:Controllare se in un array esistono coppie o triple di elementi.
Post by: DarioL19F on 20-11-2012, 10:13:33
la stampa è messa solo come controllo del confronto tra numeri, si può benissimo non mettere e far visualizzare solamente la risposta.
e il testo dell'esercizio era di stampare se almeno un elemento era presente 2 o 3 volte, indipendentemente da che numero è
lo so che la stampa iniziale è messa solo come controllo, si capisce, la cosa strana è che anche zallak ha capito come me che l'esercizio chiedeva la stampa di quali numeri fossero usciti nell'array almeno 2 volte, se è come dici tu allora è facilissimo


Title: Re:Controllare se in un array esistono coppie o triple di elementi.
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 20-11-2012, 18:19:11
la stampa è messa solo come controllo del confronto tra numeri, si può benissimo non mettere e far visualizzare solamente la risposta.
e il testo dell'esercizio era di stampare se almeno un elemento era presente 2 o 3 volte, indipendentemente da che numero è
Tra l'altro, se il testo richiede solo questo, bisogna capire se intende "esattamente 2 volte O esattamente 3 volte" oppure se intende "almeno 2 volte O almeno 3 volte" (nel secondo caso, dire "almeno 2 volte" implica "almeno 3 volte", quindi il tutto si ridurrebbe ad "almeno 2 volte").

Avete il testooooo? :pray


Title: Re:Controllare se in un array esistono coppie o triple di elementi.
Post by: DarioL19F on 20-11-2012, 18:42:13
Avete il testooooo? :pray

no :nono si va a memoria anche xk il dubbio me lo ha fatto venire lui xk io ero sicuro si dovesse fare in quel modo anche xk altrimenti sarebbe troppo facile  :[Emoticon] PC Asd:

cmq.....
altrimenti vi sforzerete per nulla! :pray (o forse no... .smile)

 .quoto


Title: Re:Controllare se in un array esistono coppie o triple di elementi.
Post by: Ciadamidaro Davide on 21-11-2012, 18:46:29
adesso dice anche qual'è il numero che è presente più volte e interrompe la ricerca appena lo trova senza fare cicli in più
Code:
package array5;

import javax.swing.*;

public class Array5
  {
   
    public static void main(String[] args)
      {
       
        int i=0,j=0,c=0;       
        int Dim=Integer.parseInt(JOptionPane.showInputDialog("inserisci le dimensioni dell'Array"));
        int[] v=new int[Dim];
       
        while(i<Dim)
          {
            v[i]=(int)(Math.random()*10);
            System.out.println("v["+i+"] = "+v[i]);
            i++;
          }
        i=0;
        do
          {
            c=0;
            do
              {
                if(v[i]==v[j])
                  {
                    c++;
                    System.out.println(v[i]+" "+v[j]);
                  }
                j++;
              }while((j<Dim) && (c<3));
           
            j=0;
            i++;
          }while((c<3) &&(i<Dim));
       
        if(c>=3)
            System.out.println("Un elemento è presente almeno 3 volte ed è "+v[i-1]);
        else
            System.out.println("Un elemento non è presente almeno 3 volte");
      }
  }


Title: Re:Controllare se in un array esistono coppie o triple di elementi.
Post by: Zallak on 25-11-2012, 15:22:46
Gi esercizi lasciati erano due ed erano:
1) Dato un array di interi dire se in esso esiste un elemento che sipresenta almeno due volte e specificare qual'è.
2) Dato un array di interi dire se in esso esiste un elemento che sipresenta almeno tre volte e specificare qual'è.

Io ho generalizzato il problema (come specifico nel post iniziale xD) cercando di scrivere un codice che dato un array individui le coppie e le triple di elementi presenti in esso. Pardon per la confusione causata  :pray xD


Title: Re:Controllare se in un array esistono coppie o triple di elementi.
Post by: DarioL19F on 25-11-2012, 15:59:29
Gi esercizi lasciati erano due ed erano:
1) Dato un array di interi dire se in esso esiste un elemento che sipresenta almeno due volte e specificare qual'è.
2) Dato un array di interi dire se in esso esiste un elemento che sipresenta almeno tre volte e specificare qual'è.

Io ho generalizzato il problema (come specifico nel post iniziale xD) cercando di scrivere un codice che dato un array individui le coppie e le triple di elementi presenti in esso. Pardon per la confusione causata  :pray xD

perfetto! come ricordavo io allora  .wink

adesso dice anche qual'è il numero che è presente più volte e interrompe la ricerca appena lo trova senza fare cicli in più
Code:
package array5;

import javax.swing.*;

public class Array5
  {
   
    public static void main(String[] args)
      {
       
        int i=0,j=0,c=0;       
        int Dim=Integer.parseInt(JOptionPane.showInputDialog("inserisci le dimensioni dell'Array"));
        int[] v=new int[Dim];
       
        while(i<Dim)
          {
            v[i]=(int)(Math.random()*10);
            System.out.println("v["+i+"] = "+v[i]);
            i++;
          }
        i=0;
        do
          {
            c=0;
            do
              {
                if(v[i]==v[j])
                  {
                    c++;
                    System.out.println(v[i]+" "+v[j]);
                  }
                j++;
              }while((j<Dim) && (c<3));
           
            j=0;
            i++;
          }while((c<3) &&(i<Dim));
       
        if(c>=3)
            System.out.println("Un elemento è presente almeno 3 volte ed è "+v[i-1]);
        else
            System.out.println("Un elemento non è presente almeno 3 volte");
      }
  }

in questo caso come hai detto si blocca non appena ne trova uno.. quindi se ci sono due numeri ripetuti piu volte prende solo il 1°