PDA

View Full Version : AIUTO!! programmazione java


iuska
14-06-2010, 15:36
Salve a tutti,sto studiando all'università per l'esame di telematica 2 che riguarda la programmazione in java e la creazione di applicazioni telematiche.Prima di avventurarmi nelle cose piu complicate sto cercando di imparare qualcosa del linguaggio e il prof tra i primi esercizi assegnati ci ha dato da svolgere questo:

Un'azienda intende gestire l'archivio dei dipendenti.Ogni soggetto è individuato con codice,cognome e nome,funzione esercitata(dirigente,quadro,impiegato,operaio),tipo di retribuzione percepita(mensile o oraria),importo retribuzione(mensile o oraria),numero di mesi o di ore lavorate nell'anno.Il programma di gestione deve permettere di realizzare le seguenti operazioni(attivate dall'operatore mediante un menu):
1.Inserimento di tutti i record
2.Modifica di un record
3.Cancellazione di un record
4.Ricerca di tutti i dati relativi a un dipendente,noto il codice
5.Visualizzazione di tutti i dipendenti che hanno le retribuzioni superiori a un determinato importo indicato dall'operatore
e altro...

La mie domande sono:
devo usare i fili binari o i file di testo?
in java ci sono i puntatori a file o no?
in particolare come si fa la ricerca e l'inserimento?penso ke se riesco a capire la ricerca potrò svolgere anche gli altri punti ke nn ho inserito..

purtoppo sto studiando tutto da sola e ho sbattuto la testa su manuali cartacei e in internet ma oltre a dire come si apre un file e cm si kiude e le varie classi per l'i/o non dicono altro e mi pare ke la gestione dei file sia diversa dal c++ per esempio..nn riesco a capire bene ke comandi si usino per esempio noto il codice per cercare le info del dipendente..

Vi ringrazio per la pazienza!!aspetto risposte al piu presto xke mi serve accelerare i tempi

ally
14-06-2010, 15:41
...hai provato a buttar giu' qualcosa?...il menu pnso sia richiesto a riga di comando mica in swing...e lo strato persistente non penso sia fatto con un db...quindi crea un oggettone Dipendente...e un cassettone in cui salvare piu' dipendenti...poi crea un menu che riesca ad interpretare l'input dell'utente e in base al numerillo inserito esegue l'operazione richiesta...

...ciao Andrea...

iuska
14-06-2010, 16:06
il mio problema non è assolutamente il menu!si si ho provato a buttar giu qualcosa..ho fatto altri programmi e sn riuscita a farli..il mio problema è sulla gestione dei file..mi sn bloccata in qst esercizio xke nn riesco fondamentalmente a fare la ricerca dei dati del dipendente nel file..ho pensato di usare un array di oggetti di tipo Dipendente ma se bisogna usare il file ho pensato ke nn serve usare l'array..giusto??devo inserire i dati direttam nel file,giusto??xo nn so cm si faccia effettivamente a inserire e cercare nel file dei dati..ho provato..xo nn sn riuscita molto..

nuovoUtente86
14-06-2010, 16:10
senza complicarti la vita mantieni una lista di dipendenti e la serializzi su un file binario. Per il tipo di esercizio va più che bene.

ally
14-06-2010, 16:15
il mio problema non è assolutamente il menu!si si ho provato a buttar giu qualcosa..ho fatto altri programmi e sn riuscita a farli..il mio problema è sulla gestione dei file..mi sn bloccata in qst esercizio xke nn riesco fondamentalmente a fare la ricerca dei dati del dipendente nel file..ho pensato di usare un array di oggetti di tipo Dipendente ma se bisogna usare il file ho pensato ke nn serve usare l'array..giusto??devo inserire i dati direttam nel file,giusto??xo nn so cm si faccia effettivamente a inserire e cercare nel file dei dati..ho provato..xo nn sn riuscita molto..

...puoi postare il tuo codice?...

...ciao Andrea...

PGI-Bis
14-06-2010, 16:45
La mie domande sono:
1. devo usare i fili binari o i file di testo?
2. in java ci sono i puntatori a file o no?
3. in particolare come si fa la ricerca e l'inserimento?penso ke se riesco a capire la ricerca potrò svolgere anche gli altri punti ke nn ho inserito..

1. dal "tono" dell'esercizio io direi che tu debba usare un formato binario, a mo' di database

2. Non ci sono. Ci sono i File che sono la rappresentazione astratta di un percorso del filesystem. Ad esempio se ho un file il cui percorso è :

c:\programmi\pippo.dat

il suo "alter ego" in java.io è:

File file = new File("c:\\programmi\\pippo.dat");

3. Ricerca e inserimento dipendono prima di tutto dal formato dei dati. Ad esempio potremmo dire che il formato sia questo:

RECORD

CODICE: INT32
COGNOME: CHAR64
NOME: CHAR64
FUNZIONE: BYTE (0 = DIRIGENTE, 1 = QUADRO, 2 = IMPIEGATO, 3 = OPERAIO)
TIPO RETRIBUZIONE: BYTE (0 = MENSILE, 1 = ORARIA)
IMPORTO RETRIBUZIONE: [INT32, INT32]
NUMERO DI MESI: BYTE
NUMERO DI ORE INT16

totale: 273 byte

Supponiamo che questo sia il formato del file "c:\pippo.dat". Come leggiamo/scriviamo:

File file = new File("c:\\pippo.dat");
RandomAccessFile raf = new RandomAccessFile(file, "rw");[code]

Sappiamo che ogni record occupa 273 byte. Raf è inizialmente in posizione 0. Se dico:

raf.seek(273)

mi sposto in posizione 273, cioè al secondo record. Se dico:

raf.seek(546), mi sposto sul byte in posizione 546, cioè dove inizia il terzo record.

Nota la struttura del file io so che se colloco raf all'inizio di un record (cioè in una posizione che sia un multiplo di 273) posso dire:

int codice = raf.readInt();

e leggermi il codice. Dopo la lettura "raf" si sposta in avanti di 4 byte e quindi è nella posizione in cui, all'interno del record, iniziano i 64 char che compongono il cognome. Posso quindi dire:

[code]char[] cognome = new char[64];
for(int i = 0; i < 64; i++) {
cognome[i] = raf.readChar();
}

Dopo il cognome, c'è il nome:

char[] nome = new char[64];
for(int i = 0; i < 64; i++) {
nome[i] = raf.readChar();
}

La funzione:

byte funzione = raf.readByte();

il tipo di retribuzione:

byte tipoRetribuzione = raf.readByte();

L'importo della retribuzione. Trattandosi di valuta non si usano i numeri in virgola mobile per via delle imprecisioni. Io ho stabilito che l'importo sia definito tramite una coppia di numeri interi dove il primo rappresenta la parte intera e il secondo la parte decimale.

int retribuzioneIntera = raf.readInt();
int retribuzioneDecimale = raf.readInt();

Per poi dire:

BigDecimal retribuzione = new BigDecimal(retribuzioneIntera + "." + retribuzioneDecimale);

Dopo la retribuzione c'è il numero di mesi per cui è goduta:

byte mensilita = raf.readByte();

seguita dal numero di ore

short ore = raf.readShort();

La scrittura avviene nello stesso modo, solo che al posto dei "read" usi i write, sempre con raf. Sappiamo che dato l'offset di un record (cioè l'indice del byte a partire dal quale inizia un record), il codice inizia da offset + 0, il cognome da offset + 4, il nome da offset + 132, la funzione da offset + 260, il tipo di retribuzione da offset + 261, l'importo della retribuzione da offset + 262, il numero di mensilità da offset + 270, il numero di ore da offset + 271.

Ergo se voglio cambiare il tipo di retribuzione dell'i-esimo record nel file dirò:

long offset = i * 273 + 261;
raf.seek(offset);
raf.writeByte((byte) 1);

Va detto che ci sono delle alternative un po' più aggraziate per gestire pacchetti di byte di queso genere (i canali) ma da quel che mi risulta nel contesto universitario è considerato esercizio di arti divinatorie ed è meglio non fare la figura degli strambi.

iuska
14-06-2010, 16:55
Premetto ke inizialmente usavo un file di testo con un codice diverso ovviamente e l'inserimento riusciva..il resto no..allora ho usato un file binario..solo ke ora nn funziona proprio..qst sono i metodi x l'inserimento e la ricerca..se potete magari inserire un codice corretto mi farebbe comodo..Grazie a tutti!!




public void inserimento()throws IOException{
Dipendente dip=new Dipendente();
FileOutputStream f=new FileOutputStream("fileA.dat");
ObjectOutputStream fOUT=new ObjectOutputStream(f);
BufferedReader tastiera=new BufferedReader(new InputStreamReader(System.in));
boolean finito=false;
while(!finito){
System.out.println("\nInserire il codice del dipendente:");
dip.setCodice(Integer.parseInt(tastiera.readLine()));
System.out.println("Inserire il nome del dipendente:");
dip.setNome(tastiera.readLine());
System.out.println("Inserire il cognome del dipendente:");
dip.setCognome(tastiera.readLine());
System.out.println("Inserire la funzione del dipendente (dirigente,quadro,impiegato oppure operaio):");
dip.setFunzione(tastiera.readLine());
System.out.println("Inserire il tipo di retribuzione del dipendente (mensile o oraria):");
dip.setTipoRetr(tastiera.readLine());
if(dip.getTipoRetr().equals("mensile")){
System.out.println("Inserire l'importo della retribuzione mensile del dipendente:");
dip.setImportoRetr(Float.parseFloat(tastiera.readLine()));
System.out.println("Inserire il numero di mesi di lavoro effettuati nell'anno del dipendente:");
dip.setNumMesi(Integer.parseInt(tastiera.readLine()));
}else{
System.out.println("Inserire l'importo della retribuzione oraria del dipendente:");
dip.setImportoRetr(Float.parseFloat(tastiera.readLine()));
System.out.println("Inserire il numero di ore di lavoro effettuate nell'anno del dipendente:");
dip.setNumOre(Integer.parseInt(tastiera.readLine()));
}
fOUT.writeObject(dip);

System.out.println("\n\nSi vuole inserire un altro dipendente? (digitare si o no):");
if(tastiera.readLine().equals("no")){
finito=true;
}

}
fOUT.flush();
fOUT.close();
}


public void ricerca(int cod)throws IOException{
FileInputStream f=new FileInputStream("fileA.dat");
ObjectInputStream fIN=new ObjectInputStream(f);
Dipendente dip=new Dipendente();
RandomAccessFile inpF = new RandomAccessFile ("fileA.dat", "r");
while(fIN.read()!=-1){
if(dip.getCodice()==cod){
try{
System.out.println("La posizione è:"+inpF.getFilePointer());
System.out.println(fIN.readObject());
}catch(Exception e){
System.out.println("Errore nella lettura");
}
}
}System.out.println("Il codice non esiste nell'archivio");

}