PDA

View Full Version : [Java] principiante con problemi su array


Nalim83
19-09-2008, 12:14
ciao a tutti premetto che ho seri ma seri problemi con java.

Sto studiando gli array e volevo costruire uno schema di classe java dove voglio riceve in input un array (dimensione array e valori) e un valore x; e grazie ad alcuni metodi devo dire se questo valore appartiene all'array utilizzando una ricerca binaria.

L'algoritmo modulare l'ho fatto ma il mio problema è su come creare la classe e ricevere i valori dell'array in input.
Questo è un abbozzo sbagliato della classe:




//classe
public class Esercizio
{

// campi
// a è il vettore
private char A;

//n è il valore in input da cercare
final int n =


//costruttore
public Esercizio (char A, int n )

{

CHAR A = new char [n];
this.volore = valore;
int n = 0;
}





public void caricavett (Char []A)
{};
public void ordinamento (Char []A)
{};
public char minlista (Char []A)
{};
public int ricercabinaria (Char []A, char key)
{};
public char valorecentrale (Char []A)
{};

}




grazie a tutti

banryu79
19-09-2008, 12:31
Umm, prima di cimentarsi con l'implementazione è meglio leggere/studiare qualcosa circa le strutture dati che vogliamo/dobbiamo usare nel linguaggio di programmazione scelto.

--> tutorial ufficiale della SUN sulla tecnologia Java: capitolo Array (http://java.sun.com/docs/books/tutorial/java/nutsandbolts/arrays.html)

Dopo aver letto questo, per quanto riguarda gli array in Java e come si usano non dovresti avere problemi
(così scoprirai, tra l'altro, che non ti serve passare la lunghezza dell'array, in quanto in Java l'implementazione di un array contiene già l'informazione sulla sua dimensione ;) )

Nalim83
19-09-2008, 12:41
ho gia letto quella sezione...


//classe
public class Esercizio
{

// campi
// a è il vettore
private char A;


//costruttore
public Esercizio (char A)

{

CHAR A = new char [];
this.volore = valore;

}





public void caricavett (Char []A)
{};
public void ordinamento (Char []A)
{};
public char minlista (Char []A)
{};
public int ricercabinaria (Char []A, char key)
{};
public char valorecentrale (Char []A)
{};

}

Cosa ne pensi?

banryu79
19-09-2008, 13:05
//classe
public class Esercizio
{

// campi
// a è il vettore
private char A;


//costruttore
public Esercizio (char A)

{

CHAR A = new char [];
this.volore = valore;

}





public void caricavett (Char []A)
{};
public void ordinamento (Char []A)
{};
public char minlista (Char []A)
{};
public int ricercabinaria (Char []A, char key)
{};
public char valorecentrale (Char []A)
{};

}


Umm, penso che se la tua classe Esercizio ha la responsabilità di ricevere un array per poi farci qualcosa (nello specifico una ricerca binaria per trovare un elemento specifico) forse dovrebbe avere come membro non un char, ma un array di char, e di conseguenza nel costruttore prendere in ingresso un array di char e non un singolo char, giusto?

esempio/bozza:

//classe
public class Esercizio
{
private char[] charArray;

public Esercizio(char[] data)
{
charArray = data;
}
}



P.S.: dal codice che hai postato non è chiaro come vuoi realizzare la soluzione del problema che hai spiegato nel primo post.
Io ho dato per scontato che il tuo codice sarà strutturato con una classe principale dove sarà presente l'entry-point della tua applicazione (...il metodo statico: public static void main(String args[])) che avrà la responsabilità di creare/ricevere l'array da un input esterno (file di testo o tastiera) e la responsabilità di istanziare un oggetto di una seconda classe a cui verrà passato l'array in questione e a cui sarà chiesto di cercare un elemento specifico.
Con questo scenario in testa ho immaginato che la tua classe Esercizio fosse la seconda classe, quella che esegue la ricerca binaria.
E' giusto?

Nalim83
19-09-2008, 14:56
grandissimo, hai capito tutto alla perfezione, volevo una classe tester con il main (che non devo crearla) e una classe dove ho rappresentato l'algoritmo (questa si). Dimmi tu se dobbiamo fare tutto con una classe.

Ora ti spiego tutto l'esercizio fin dall'inizio così sono più chiaro


L'esercizio si compone di due punti

1.Utilizzando un formalismo di rappresentazione degli algoritmi a scelta, fornire la specifica di un algoritmo, in forma modulare, per il seguente problema.
Dato in input un vettore non ordinato di caratteri alfabetici e un carattere alfabetico, stabilire se il carattere in input è presente nel vettore, utilizzando una ricerca binaria.

2. Dare la definizione di una classe java per la realizzazione dell'algoritmo dell'esercizio precedente



Il primo esercizio l'ho svolto: ossia per risolvere l'algoritmo ho creato un algoritmo modulare con queste voci:

INIZIO - chiedi dim vettore - caricavett - ordinamento per selezione - trova minimo lista - ricerca binaria - trova valore centrale - FINE


Ossia per poter fare l'orinamento, mi serve trovare il minimo lista.
per poter fare la ricerca binaria mi serve che l'array sia ordinato e che sappia ogni volta quale sia il valore centrale dell'array.
Per l'algoritmo non ho avuto grandi problemi ma ora tocca alla classe.


Non so come ringraziarti...


Ora devo farti qualche domanda:
1. char[] è un tipo ossia per dire che voglio un array di char devo mettere char[] e non char soltanto.

2. Ho solo un problema sul metodo ricercabinaria: deve prendere l'array in input e il carattere da comparare e deve dare come output vero o falso.
la variabile key data in input dove devo dichiararla?
(non so se sono stato chiaro)



//classe
public class Esercizio
{

//campo
private char[] charArray;

//costruttore
public Esercizio(char[] data)
{
charArray = data;
}



//metodi

public void caricavett (Char[] charArray)
{};
public void ordinamento (Char[] charArray)
{};
public char minlista (Char[] charArray)
{};
public bolean ricercabinaria (Char[] charArray, char valoredatrovare)
{};
public char valorecentrale (Char[] charArray)
{ };

}

banryu79
19-09-2008, 15:23
Ora devo farti qualche domanda:
1. char[] è un tipo ossia per dire che voglio un array di char devo mettere char[] e non char soltanto.

Ma non avevi detto di aver già letto questo link (http://java.sun.com/docs/books/tutorial/java/nutsandbolts/arrays.html) che ti avevo postato?
Non conto mica balle io:rolleyes: : lì c'è tutto quello che serve sapere sugli array in Java, anche la risposta alla tua domanda.


2. Ho solo un problema sul metodo ricercabinaria: deve prendere l'array in input e il carattere da comparare e deve dare come output vero o falso.
la variabile key data in input dove devo dichiararla?
(non so se sono stato chiaro)

Do per scontato che il metodo "ricercaBinaria" sia un metodo della classe Esercizio.
Stabilito questo, dato che la classe Esercizio riceve già l'array sul quale effettuare la ricerca tramite il suo costruttore, il metodo "ricercaBinaria" essendo un metodo definito nella classe Esercizio non ha bisogno di riceverlo nuovamente come parametro, usa quello già presente nella classe.
L'unico parametro in ingresso di cui ha bisogno è il carattere da cercare.
Assumo che "ricercaBinaria" debba restituire l'indice nell'array nel quale viene trovato l'elemento richiesto.

Continuando a espandere il codice postato prima mi trovo in questa situazione:

//classe
public class Esercizio
{
private char[] charArray;

public Esercizio(char[] data)
{
charArray = data;
}

public int ricercaBinaria(char c)
{
// implementazione ricerca binaria
// ...
// e return del risultato (l'indice nell'array che va da 0 a N)
// se non presente torno -1
}
}


Esempio di utilizzo della classe (assumiamo ti trovarci nel metodo main della classe che istanzierà e userà Esercizio):

public static void main(String args[])
{
// creo un array di caratteri su cui effettuare la ricerca
// e un carattere da cercare.
char[] charSequence = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};
char key = 'e';

// uso un oggetto di tipo Esercizio per:
// scoprire se il carattere da cercare è presente;
// quindi trovarne la posizione nell'array;
Esercizio es = new Esercizio(charSequence);

int keyIndex = es.ricercaBinaria(key);
if (keyIndex != -1)
{
System.out.println("il carattere cercato: " + key + " è presente");
System.out.println("in posizione: " + keyIndex + ".");
}
else
{
System.out.println("il carattere cercato: " + key + " non è presente.");
}
}

Nalim83
19-09-2008, 16:09
ho letto nel link che per creare un vettore


anArray = new int[10]; // allocates memory for 10 integers


come mai non non l'abbiamo fatto??

ossia non abbiamo usato la struttura NEW TIPO[dimensione]

banryu79
19-09-2008, 16:45
Guarda, ci sono due modi per allocare gli array (entrambi spiegati nel link).
1] Puoi, come hai giustamente detto, dichiarare un array specificando esplicitamente la dimensione dell'array, con la notazione:

// dichiara una reference a un array di char
// nota bene: l'array non esiste ancora, questo codice crea solo un riferimento
// a un array di caratteri, non l'array
char[] charArray;


In questo caso si deve poi creare l'array vero e proprio e associarlo al riferimento:

// crea un array di char di lunghezza 10 e lo associa al riferimento
charArray = new char[10];


posso anche "sintetizzare" queste due istruzioni scrivendole in forma compatta:

char[] charArray = new char[10];


Ora la mia variabile "charArray" è un riferimento ad un array di caratteri di lunghezza 10. Bene, mettiamoci dentro dieci caratteri:

// opzione 1: inserisco i caratteri uno alla volta
charArray[0] = 'a';
charArray[1] = 'a';
charArray[2] = 'a';
charArray[3] = 'a';
charArray[4] = 'a';
charArray[5] = 'a';
charArray[6] = 'a';
charArray[7] = 'a';
charArray[8] = 'a';
charArray[9] = 'a';

// opzione 2: inserico i caratteri tramite un ciclo for
// notare l'uso del membro "lenght": è un intero contenente il numero di
// elementi (la lunghezza) dell'array
for (int i = 0; i < charArray.lenght; i++)
{
charArray[i] = 'a';
}



2] Come alternativa posso usare questa notazione per creare l'array: in questo caso il compilatore desume la lunghezza dell'array dal numero di elementi racchiusi tra le parentesi {}. Questa è anche la notazione che ho usato nel mio post sopra, e come vedi l'operatore new non viene esplicitato, però viene comunque allocato un array di 10 char. Inoltre gli elementi sono già inizializzati al valore corrispondente esplicitato:

// il compilatore deduce la lunghezza dell'array dal numero di
// elementi inizializzati
char[] charArray = {'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'};

Nalim83
21-09-2008, 08:53
continuo a ringraziarti e a chiederti info.


Come abbiamo svolto l'esercizio (se non ho capito male) abbiamo due classi, una dove ho il main e chiedo in input i valori del vettore e mi creo il vettore e la seconda classe nella quale passo il vettore gia costruito e gli applico i metodi. Ossia in un'unica classe devo caricare il vettore e applicare i metodi. Se si come diventerebbe?

Sarebbe possibile creare un'unica classe che faccia quello che fanno le due classi separate?
Tutto in un'unica classe


Ossia devo creare un'unica classe che carichi il vettore e che attraverso 4 metodi faccia:
1.trovi il minimo valore del vettore, 2.ordini il vettore, 3.trovi il valore centrale del vettore 4. faccia la ricerca binaria.


Questa è la classe esercizio, come diventerebbe se dovessi nella stessa classe dovessi caricare il vettore e applicare i metodi?


//creo la classe Esercizio

public class Esercizio

{

//definizione di campi
private char[] a ;

//costruttore
public esercizio (char [] vett)
{
a = vett;
}


// definizione di metodi

// il metodo deve restituire un intero che indichi la posizione del valore minore del vettore
public int minlista ()
{}

// il metodo deve restituire lo stesso vettore ma con i valori ordinati dal più piccolo al più grande
public void ordinamento ()
{}

// il metodo deve restituire un intero che contenga la posizione del valore centrale
public int valorecentrale ()
{}


// il metodo deve riceve come paramentro in input un valore n, e dare come risultato un intero che indichi la posizione del valore n nel vettore
public int ricercabinaria (char c)
{}

}





Grazie ancora

Oceans11
21-09-2008, 11:14
Sì sì....possibilissimo!!!:D

Basta andare contro il paradigma della programmazione ad oggetti e scoprirai che riuscirai a mettere anche tutto nel main!!!!!!!!!!!;)

banryu79
22-09-2008, 09:31
Certamente puoi "collassare" tutto in un unica classe, se questo è quello che devi fare:

public class Esercizio
{
private char[] charArray;

public Esercizio (char [] inputArray)
{
charArray = inputArray;
}

// torna l'indice dell'elemento di valore minore contenuto in charArray
public int minlista ()
{
// ...implementazione
}

// ordina charArray mediante un algoritmo di ordinamento
public void ordinamento ()
{
// ...implementazione algoritmo di ordinamento
}

// restituisce il valore dell'elemento centrale di charArray
public int valoreCentrale ()
{
// ...implementazione: deve gestire il fatto che charArray può avere
// ...un unmero totale di elementi pari o dispari
}

// restiuisce l'indice del'elemento cercato
// oppure -1 se tale elemento non è presente
public int ricercaBinaria (char c)
{
// ...implementazione della ricerca binaria
}

// entry-point dell'applicazione:
public static void main(String[] args)
{
char[] charSequence = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};
char key = 'e';

Esercizio es = new Esercizio(charSequence);
int keyIndex = es.ricercaBinaria(key);

if (keyIndex != -1)
{
System.out.println("il carattere cercato: " + key + " è presente");
System.out.println("in posizione: " + keyIndex + ".");
}
else
{
System.out.println("il carattere cercato: " + key + " non è presente.");
}
}
}

Certo non è molto object oriented, ma forse sono altri aspetti quelli su cui state studiando in questo momento.

Nalim83
22-09-2008, 10:01
ossia al posto di creare due classi ne creo solo una e inserisco nella classe il main, alla fine non cambia nulla.
Ma cmq mi consiglio sempre di fare due classi vero?

Continuo a ringraziarti
e sicuramente ti darò fastidio altre volte :D :D :D



GRAZIE

banryu79
22-09-2008, 11:25
Ma cmq mi consigli sempre di fare due classi vero?

Io ti consiglio di sì. La logica dell'approccio sarebbe questa:
- Una classe rappresenta la struttura dati e gli algoritmi correlati (class Esercizio è formata da una struttura dati, al momento un array di char, e da un insieme di metodi che sanno come operare in modo coerente sulla struttura dati in questione. Tali metodi, come ad esempio quello di ricerca e quello di ordinamento, sono gli algoritmi);
- Un'altra classe funge da entry-point dell'applicazione e rappresenta un caso di utenza della classe Esercizio: crea un oggetto Esercizio inserendo un set di dati, poi chiede ad Esercizio di eseguire delle operazioni su quel set di dati.

Volendo astrarre ulteriormente: l'inserimento dei dati in Esercizio dovrebbe essere compito di un'altra classe, che li legge da una fonte (database, file di testo, tastiera o altro).

Inoltre nota che metodi di class Esercizio quali "ordinamento()" potrebbero essere implementati in più di una maniera: potresti voler ordinare usando un algoritmo tipo Insertion-Sort quando nell'array hai un numero di elementi piccoli, oltre una certa soglia potresti volere usare invece un Merge-Sort (è solo un esempio).

Molto semplicisticamente, più vuoi rendere capace e versatile il tuo "sistema" più diventa necessario e utile astrarre e modularizzare l'implementazione sotto forma di codice; Java è orientato agli oggetti, quindi bisognerebbe tenere da conto questa sua predisposizone e programmare in aderenza con questo paradigma.


Continuo a ringraziarti
e sicuramente ti darò fastidio altre volte

Prego.

Nalim83
22-09-2008, 11:38
perfetto:D

Nalim83
22-09-2008, 15:52
Data una classe Java, Binario, per la rappresentazione di un numero in formato binario (base2), fornire la realizzazzione di un suo metodo, compare, che ha come parametro formale un oggetto di tipo Binario e restituisce 0 (risp. 1) se il numero binario rappresentato dal parametro implicito è maggiore (risp. minore) del numero binario rappresentato dal parametro formale.


/* Classe */
public class Binario
{

/*campi*/
private int valore;


/*costruttore*/
public Binario (int numero)
{
this.valore= numero;
}

/*metodo compare*/
public char compare (int dato)
{
if ()

else



}



}





Mi daresti una mano a svolgere questo esercizio???

banryu79
22-09-2008, 17:05
Ok.

Come spunto parto dalla bozza di codice che hai postato (ho tolto i commenti e identato il codice):

public class Binario
{
private int valore;

public Binario (int numero)
{
this.valore= numero;
}

public char compare (int dato)
{
if ()
else
}
}


Il testo dell'esercizio era questo, evidenzio alcuni punti:

Data una classe Java, Binario, per la rappresentazione di un numero in formato binario (base2), fornire la realizzazzione di un suo metodo, compare, che ha come parametro formale un oggetto di tipo Binario e restituisce 0 (risp. 1) se il numero binario rappresentato dal parametro implicito è maggiore (risp. minore) del numero binario rappresentato dal parametro formale.


1) Leggendo il testo dell'esercizio, in particolare la parte evidenziata in grassetto, e confrontando quindi la richiesta del testo con la definizione del metodo "compare" nella bozza del codice si nota un errore.
Riesci a correggerlo?

Nalim83
22-09-2008, 20:56
Ok.

Come spunto parto dalla bozza di codice che hai postato (ho tolto i commenti e identato il codice):

public class Binario
{
private int valore;

public Binario (int numero)
{
this.valore= numero;
}

public char compare (int dato)
{
if ()
else
}
}


Il testo dell'esercizio era questo, evidenzio alcuni punti:


1) Leggendo il testo dell'esercizio, in particolare la parte evidenziata in grassetto, e confrontando quindi la richiesta del testo con la definizione del metodo "compare" nella bozza del codice si nota un errore.
Riesci a correggerlo?


Si sapevo di aver sbagliato ma non sapevo come fare.
In questo modo secondo te va bene?
Ho creato un nuovo oggetto denominato es e l'ho messo come parametro formale.



public class Binario
{
private int valore;

public Binario (int numero)
{
this.valore= numero;
}

//ho creato un oggetto con l'ausilio della classe Binario
Binario es = new Binario(2);

public char compare (Binario es)
{
if ()
else


}
}

banryu79
23-09-2008, 08:54
Prima di tutto una puntualizzazione: quando devi postare del codice sarebbe auspicabile che tu lo racchiudessi tra i tag "["CODE"]" "["/CODE"]" (le virgolette non vanno messe, le ho aggiunte io).
In questo modo viene mantenuta l'identazione del codice e risulta più agevole leggerlo.


Si sapevo di aver sbagliato ma non sapevo come fare.
In questo modo secondo te va bene?
Ho creato un nuovo oggetto denominato es e l'ho messo come parametro formale.


Continuo a integrare il codice con la tua aggiunta:

public class Binario
{
private int valore;

public Binario (int numero)
{
this.valore= numero;
}

//ho creato un oggetto con l'ausilio della classe Binario
Binario es = new Binario(2);

public char compare (Binario es)
{
// da implementare...
// if ()
// else
}
}


Dunque fermiamoci un attimo a ragionare.
Il testo richiedeva di realizzare un metodo chiamato "compare" nella classe Binario. Fin qui ci siamo. Ii testo dice anche che questo metodo deve accettare come parametro formale un oggetto di tipo Binario. E questo l'hai corretto nel tuo ultimo post, dato che prima avevi messo come parametro formale un tipo int.
La parte in grassetto nero, va bene dunque.

Il problema mi sembra l'aggiunta in grassetto blu.
Per essere precisi, dal punto di vista della sintassi non è un errore, ma credo proprio che lo sia dal punto di vista della semantica.
La domanda è: perchè adesso la classe Binario ha bisogno di avere come membro di classe un oggetto di tipo Binario?
Cioè, perchè hai pensato di dover aggiungere la riga in blu?

Nalim83
23-09-2008, 09:15
ho deciso di inserire la riga in blu perchè ho creato un oggetto di tipo Binario denominato es.
La traccia mi diceva :
Data una classe Java, Binario, per la rappresentazione di un numero in formato binario (base2), fornire la realizzazzione di un suo metodo, compare, che ha come parametro formale un oggetto di tipo Binario e restituisce 0 (risp. 1) se il numero binario rappresentato dal parametro implicito è maggiore (risp. minore) del numero binario rappresentato dal parametro formale.

L'oggetto di tipo Binario da utilizzare come parametro formale non bisogna crearlo con la stringa

Binario es = new Binario(2);


Ossia in questo modo io ho creato un oggetto della classe Binario o sbaglio?

banryu79
23-09-2008, 09:43
Ossia in questo modo io ho creato un oggetto della classe Binario o sbaglio?
Sì, con quella riga tu hai istanziato un oggetto di tipo Binario.
Ma il problema non è questo, leggi sotto.


L'oggetto di tipo Binario da utilizzare come parametro formale non bisogna crearlo con la stringa:

Binario es = new Binario(2);

Sì, ovviamente l'oggetto che verrà passato come parametro al metodo "compare" andrà creato da qualche parte nell'applicazione.
L'errore sta appunto nel fatto che tu lo crei dentro la classe Binario stessa.
Invece gli oggetti di tipo Binario verranno creati e usati da qualche altra parte dell'applicazione, e sarà in quel contesto che il metodo "compare" riceverà un oggetto Binario.

Facciamo un esempio. Supponiamo che la classe Binario sia completa e funzionante. Vediamo come potrebbero essere usati gli oggetti di tipo Binario.
La classe Main è l'entry-point dell'applicazione; al suo interno crea due oggetti di tipo Binario e confronta il primo con il secondo tramite il metodo "compare":

public class Main
{
public static void main(String[] args)
{
// crea due oggetti Binario, con i valori 1 e 2
Binario bin1 = new Binario(1);
Binario bin2 = new Binario(2);

System.out.println("Confronto tra bin1 e bin2");

// compare() torna 0 se bin2 è il maggiore, altrimenti torna 1
int risultato = bin1.compare(bin2);

if (risultato == 0)
{
System.out.println("bin1 è maggiore di bin2");
}
else
{
System.out.println("bin1 è minore di bin 2");
}
}
}

Ecco, come vedi è la classe Main che crea e usa gli oggetti di tipo Binario.
La classe Binario ha solo la responsabilità di definire le proprietà e i comportamenti che un qualsiasi oggetto Binario (si dice "istanza" della classe Binario) deve possedere.

Nel nostro caso, per come abbiamo definito la classe, Binario contiene un valore di tipo int, una sua istanza viene costruita passando un valore int al costruttore e può essere confrontata con un'altra istanza di tipo Binario mediante il metodo "compare".

Fino a qui è tutto chiaro?

Nalim83
23-09-2008, 09:56
fino qui chiarissimo, ossia nel main devo creare l'oggetto.
Nella mia classe però devo dire che attraverso il metodo compare dovrò ricevere da un'altra classe che conterrà il main l'oggetto.


ok ci sono
praticamente al metodo posso passare come parametro non solo un valore ma propio un oggetto.

ok

banryu79
23-09-2008, 10:30
ok

Bene allora procediamo.
Dopo aver chiarito le cose nei nostri ultimi post, ci ritroviamo in questa situazione:

public class Binario
{
private int valore;

public Binario (int numero)
{
this.valore= numero;
}

public char compare (Binario bin)
{
//...
}
}


Dobbiamo definire il metodo compare().
Il testo dell'esercizio chiede di tornane 0 se il parametro formale è minore del parametro implicito, altrimenti 1.

Nel codice iniziale da te proposto, si vede che il metodo ritorna un char.
Credi sia corretto? Se no, prova a correggere anche questo punto.

Nalim83
23-09-2008, 10:37
Va bene così




public class Binario
{
private int valore;

public Binario (int numero)
{
this.valore= numero;
}

public int compare (Binario bin)
{
//...
}
}

banryu79
23-09-2008, 10:57
Benissimo.

Leggendo il testo dell'esercizio:

Data una classe Java, Binario, per la rappresentazione di un numero in formato binario (base2), fornire la realizzazzione di un suo metodo, compare, che ha come parametro formale un oggetto di tipo Binario e restituisce 0 (risp. 1) se il numero binario rappresentato dal parametro implicito è maggiore (risp. minore) del numero binario rappresentato dal parametro formale.

Non viene specificato come rappresentare un numero binario, percui può anche andare bene mantenere internamente il valore binario come il corrispondente valore intero (e infatti in Binario tu hai usato un tipo int).

Nota però che, per come è attualmente definita la classe, in particolare il suo costruttore, potrebbero esserci dei problemi se qualcuno che usa la classe passasse al costruttore un intero negativo.

Potremmo ovviare al problema assumendo che i valori di tipo int all'interno di Binario siano sempre positivi. Se va bene possiamo far rispettare questo vincolo con una piccola modifica al costruttore della classe, in modo che dato un intero in ingresso, lui memorizzi sempre il valore assoluto:

public class Binario
{
// rappresentazione del numero binario come intero
private int valore;

// accetta un valore intero, di cui prende il valore assoluto
public Binario (int numero)
{
int valoreAssoluto = Math.abs(numero);
this.valore= valoreAssoluto;
}

public char compare (Binario bin)
{
//...
}
}


Per ottenere il valore assoluto di un numero ho usato il metodo .abs() definito nella classe Math.
La classe Math è a sua volta definita nel package "java.lang", che è un package contenete classi di estrema utilità, che vengono usate praticamente sempre nella stesura di una applicazione Java.
Sono così comuni che si è scelto di fare importare il package "java.lang" automaticamente dal compilatore, rendendo superflua la dichiarazione di import nel codice sorgente da parte del programmatore.

Se vuoi dare un'occhiata ai javadoc della classe Math qui c'è un link (http://java.sun.com/javase/6/docs/api/index.html?java/lang/Math.html)

Resta da definire il corpo del metodo .compare().
Prova a completarlo, devi solo tenere presenti alcune cose:
1) al metodo arriva dall'esterno un oggetto di tipo Binario, che viene passato come parametro formale e referenziato dalla reference di nome "bin";
2) devi verificare se il valore di "bin" (l'oggetto di tipo Binario passato dall'esterno) è maggiore del valore dell'oggetto su cui viene invocato il metodo, e di conseguenza restituire un risultato che varrà 1 oppure 0 (se il valore di "bin" è minore o uguale).

Per il punto 2) devi avere modo di farti dare da "bin" il suo valore ;) (suggerimento: sarà neccessrio definire un metodo aggiuntivo nella classe per fare questo).

Nalim83
23-09-2008, 11:02
sinceramente ho inserito int perchè non sapevo come rappresentare un numero binario.

Si il metodo abs() della classe math l'ho capito. Sinceramente non avevo pensato ad un eventuale valore negativo.
Ma se non inserisco int in che altro modo potrei dichiarare il tipo?

banryu79
23-09-2008, 11:06
Nalim83, int va bene come tipo. Ho solo fatto delle considerazioni aggiuntive.
A proposito ho editato il post e aggiunto qualcosa.

Nalim83
23-09-2008, 11:47
Data una classe Java, Binario, per la rappresentazione di un numero in formato binario (base2), fornire la realizzazzione di un suo metodo, compare, che ha come parametro formale un oggetto di tipo Binario e restituisce 0 (risp. 1) se il numero binario rappresentato dal parametro implicito è maggiore (risp. minore) del numero binario rappresentato dal parametro formale.




//importo la classe Math
import java.lang.Math;

public class Binario
{
// campi, rappresentazione del numero binario come intero
private int valore;

// costruttore, accetta un valore intero, di cui prende il valore assoluto
public Binario (int numero)
{
int valoreAssoluto = Math.abs(numero);
this.valore= valoreAssoluto;
}

//metodi
public int compare (Binario bin)
{
if (valore > bin)
return 0
else
return 1
}

public tipo nome()
{//mi dai un aiuto ulteriore?
}

}

banryu79
23-09-2008, 12:06
Eccoti l'aiuto ulteriore:

// metodi
public int compare (Binario bin)
{
if (valore > bin)
return 0;
else
return 1;
}


In Rosso:
mi raccomando attento alla sintassi: le istruzioni in Java vanno terminate con il carattere ';'

In Grassetto:
ovviamente non puoi confrontare in quel modo "valore" che è di tipo int con "bin" che è di tipo Binario.
Devi riuscire ad accedere al valore contenuto in "bin".
Per questo ti suggerivo di implementare un metodo adatto.

Comunque queste sono proprio conoscenze di base del linguaggio, non ti posterò la soluzione perchè qui si tratta semplicemente di studiare le basi.

Nalim83
23-09-2008, 12:26
//importo la classe Math
import java.lang.Math;

public class Binario
{
// campi, rappresentazione del numero binario come intero
private int valore;

// costruttore, accetta un valore intero, di cui prende il valore assoluto
public Binario (int numero)
{
int valoreAssoluto = Math.abs(numero);
this.valore= valoreAssoluto;
}

//metodi

//conversione
public int conversione(Binario bin)
{
int binario = Integer.parseInt(bin,2);
numero = binario;
return numero;
}

//comparare
public int compare (Binario bin)
{
if (valore > bin)
return 0;
else
return 1;
}


}

banryu79
23-09-2008, 12:35
Immagino tu non abbia mai sentito parlare dei famigerati metodi "getter" e "setter", vero?

Guarda questo e dimmi se ti ispira qualche idea:

public class Binario
{
private int valore;
// ...

public int getValore()
{
return this.valore;
}

// ...
}

Nalim83
23-09-2008, 13:19
ma con il metodo get cosa faccio?

hai una documentazione dove posso studiarlo?

banryu79
23-09-2008, 13:24
Il metodo .getValore() lo definiamo noi nella classe Binario: ha lo scopo di permettere a chi usa oggetti Binario di chiederne il valore, dato che internamente alla classe è memorizzato come una variabile "private", quindi inaccessibile all'esterno.

Un posto che ci torna comodo usarlo è proprio nel metodo compare() per farci restituire il valore contenuto nel parametro "bin" e poterlo così confrontare con il valore del nostro "oggetto corrente".

Riesci ora a correggere il corpo del metodo .compare() ?

Nalim83
26-09-2008, 15:35
ma è possibile usare valore > Binario.getValore()
oppure ho scritto una vera cavolata?

ossia mettere a confronto il valore restituito dal metodo getValore applicato alla classe Binario

banryu79
26-09-2008, 16:37
ma è possibile usare valore > Binario.getValore()
oppure ho scritto una vera cavolata?

Ci sei quasi.
In realtà hai fatto confusione tra il concetto di classe e il concetto di istanza di una classe.

Una classe è la definizione di un insieme di proprietà (i membri della classe) e di comportamenti (i metodi della classe) che tutti gli oggetti o istanze di quella classe possiedono.

questa è la classe Binario:

public class Binario
{
private int valore;
// altri membri ...

public int getValore()
{
return this.valore;
}
// altri metodi...
}


questa è un'stanza della classe Binario:

// da qualche parte nel codice...
Binario bin1 = new Binario(1);


e queste sono due diverse istanze della stessa classe Binario:

Binario bin2 = new Binario(10);
Binario bin3 = new Binario(25);


Come vedi, bin1, bin2 e bin3 sono tre diverse istanze della classe Binario.
Significa che tutti e tre appartengono allo stesso tipo(Binario, appunto) e quindi tutti e tre possiedono gli stessi membri e gli stessi metodi.

In particolare, nel nostro caso, tutte e tre sono dei riferimenti a tre oggetti differenti, a tre istanze diverse della classe Binario, percui al loro interno il membro dichiarato come "private int valore" ha appunto valore diverso (rispettivamente 1, 10 e 25).

Ora quando vuoi mettere a confronto due oggetti, diciamo bin1 e bin2 come fai?
Dato che appartengono alla stessa classe basta definire un metodo nella classe Binario che, preso in input un riferimento di tipo "Binario" ne confronti il valore del membro "valore" con il valore del membro dell'oggetto corrente (vedi parola chiave this: su questo non mi soffermo, è un concetto di base e trovi ampie spiegazioni in internet o su un manuale di Java).

Quindi possiamo definire il metodo "compare" in Binario così:

public class Binario
{
private int valore;

public int getValore()
{
return this.valore;
}

public int compare (Binario bin)
{
if (this.valore > bin.getValore())
return 0;
else
return 1;
}
}


Nota che la parola chiave this può essere omessa, e si può riscrivere il tutto così:

public class Binario
{
private int valore;

public int getValore()
{
return valore;
}

public int compare (Binario bin)
{
if (valore > bin.getValore())
return 0;
else
return 1;
}
}


La parola chiave this diventa obbligatoria solo per risolvere ambiguità, ad esempio:

public class Binario
{
private int valore;

// ...

public void setValore(int valore)
{
valore = valore;
}

}


Come fa il compilatore a capire se ci stiamo riferendo al membro "valore" o al parametro passato in ingresso nel metodo di nome "valore"?

Per distinguere il membro dichiarato nella definizione della classe dal parametro basta utilizzare la parola chiave this che in pratica è un riferimento all'istanza corrente della classe:

public class Binario
{
private int valore;

// ...

public void setValore(int valore)
{
this.valore = valore;
}

}


Spero adesso sia piuò chiaro.
Se hai dubbi, a questo livello ti consiglio caldamente di studiare su un libro, perchè qui stiamo parlando delle basi del linguaggio, che non si imparano certo in un Forum.

vincenzo83
26-09-2008, 18:10
Ciao, mi cito:

"quando sento\leggo la parola "java", consiglio sempre questo manuale in Italiano liberamente scaricabile: http://www.claudiodesio.com/
veramente ottimo ... letto dall'inizio, ti porta in modo graduale e veloce ad affrontare argomenti più avanzati ... ma forse già lo conoscevi (ogni occasione è buona per consigliarlo)"

:D Sto facendo la fine di cdimauro con il suo manuale di python ... :D

banryu79
29-09-2008, 08:31
Ciao, mi cito:

"quando sento\leggo la parola "java", consiglio sempre questo manuale in Italiano liberamente scaricabile: http://www.claudiodesio.com/
veramente ottimo ... letto dall'inizio, ti porta in modo graduale e veloce ad affrontare argomenti più avanzati ... ma forse già lo conoscevi (ogni occasione è buona per consigliarlo)"

:D Sto facendo la fine di cdimauro con il suo manuale di python ... :D

Quoto Vincenzo83, anche io ho trovato utile quel manuale :)

Nalim83
03-10-2008, 15:18
banryu79 grazie a te ho superato lo scritto di programmazione,
erano due esercizi

1. creare l'algoritmo

2. creare una classe che raffigurava l'algoritmo.

Sono riuscito a prendere 24 calcolando che il voto più alto è stato 26 non mi posso lamentare.

A novembre devo sostenere la prova orale. Speriamo bene.

Continuo a ringraziarti per la pazienza che hai avuto.
Seguirò il tuo consiglio nello studiarmi il testo consigliato da Vincenzo83.

Grazie ancora

banryu79
03-10-2008, 15:33
Prego, lieto di esserti stato utile.
Considera che ciò che all'inizio sembra confuso e difficile diventa più chiaro e semplice dopo un paziente esame di ogni sua singola parte.
La pazienza è la virtù del programmatore che impara.

Ciao.