|
|
#1 |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 412
|
[Java] principiante con problemi su array
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 |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
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 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
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 412
|
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? |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
esempio/bozza: Codice:
//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?
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 19-09-2008 alle 13:20. |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 412
|
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) { }; } Ultima modifica di Nalim83 : 19-09-2008 alle 15:05. |
|
|
|
|
|
#6 | ||
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Non conto mica balle io Quote:
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: Codice:
//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
}
}
Codice:
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.");
}
}
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 19-09-2008 alle 17:36. Motivo: errore nel codice |
||
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 412
|
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] Ultima modifica di Nalim83 : 19-09-2008 alle 16:16. |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
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: Codice:
// 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; Codice:
// crea un array di char di lunghezza 10 e lo associa al riferimento charArray = new char[10]; Codice:
char[] charArray = new char[10]; Codice:
// 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: Codice:
// il compilatore deduce la lunghezza dell'array dal numero di
// elementi inizializzati
char[] charArray = {'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'};
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 19-09-2008 alle 16:52. |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 412
|
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 Ultima modifica di Nalim83 : 21-09-2008 alle 17:11. |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
Sì sì....possibilissimo!!!
Basta andare contro il paradigma della programmazione ad oggetti e scoprirai che riuscirai a mettere anche tutto nel main!!!!!!!!!!!
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Certamente puoi "collassare" tutto in un unica classe, se questo è quello che devi fare:
Codice:
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.");
}
}
}
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 412
|
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 GRAZIE |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
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. Quote:
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 412
|
perfetto
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 412
|
New 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.
/* 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??? Ultima modifica di Nalim83 : 22-09-2008 alle 16:16. |
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Ok.
Come spunto parto dalla bozza di codice che hai postato (ho tolto i commenti e identato il codice): Codice:
public class Binario
{
private int valore;
public Binario (int numero)
{
this.valore= numero;
}
public char compare (int dato)
{
if ()
else
}
}
Quote:
Riesci a correggerlo?
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 412
|
Quote:
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 } } Ultima modifica di Nalim83 : 22-09-2008 alle 21:10. |
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
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. Quote:
Codice:
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
}
}
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?
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 412
|
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? |
|
|
|
|
|
#20 | ||
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Ma il problema non è questo, leggi sotto. Quote:
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": Codice:
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");
}
}
}
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?
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
||
|
|
|
|
| Tutti gli articoli | Tutte le news | Tutti i download |
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:26.












