PDA

View Full Version : [JAVA] Realizzare una rubrica telefonica


skyblu_angel
12-11-2009, 14:09
Salve a tutti e ringrazio in anticipo quanti di voi collaboreranno con me a questo progettino di ripasso per Java.
Devo sostenere un esame universitario a febbraio ed ho intenzione di studiare da ora il java per farmi trovare pronto :D

Ho pensato che il modo più opportuno sarebbe realizzare una rubrica telefonica. Vorrei utilizzare un file che non sia di testo, ma se proprio nessuno è in grado di aiutarmi con il codice, ne utilizzerò uno di testo.

Ecco un mio piccolo schizzo :
Il file contenente i dati dovrà chiamarsi "rubrica" con l'estensione più adatta ad esso


Ho intenzione di utilizzare diverse classi, una per ogni operazione da fare sulla rubrica:

Inserimento nuovo "contatto"
Ricerca di un contatto tramite un parametro dato in ingresso: nome o numero di telefono ( preferirei fare una semplice ricerca sequenziale, dal primo all'ultimo contatto )
Visualizzazione dell'intero contenuto della rubrica
Ordinamento in ordine alfabetico dei contatti della rubrica (l'ordinamento verrà avviato automaticamente dopo le seguenti operazioni: inserimento nuovo contatto, modifica di un contatto, cancellazione di un contatto)
Modifica dei dati di un contatto
Cancellazione di un contatto

Ovviamente la classe di ricerca verrà utilizzata anche per modificare un contatto o cancellarlo, andando a chiedere una conferma prima di effettuare l'operazione


Per ogni contatto vorrei utilizzare un oggetto CONTATTO del seguente tipo:
NOME di tipo stringa di 20 caratteri
N_TEL (numero telefono) di tipo stringa di 15 caratteri
NOTE : eventuali note


Come si può ben comprendere, il tipo di accesso al file, la scrittura, e la ricerca, dipenderanno dal tipo di file che si utilizzerà, e quindi io preferirei utilizzare un file ad accesso diretto anzichè file di testo... Mi piacerebbe utilizzare un file di estensione sconosciuta, e quindi impossibile da leggere se non con la mia rubrica...

Comincio ad abbozzare un pò di codice...
Aspetto consigli ed iniziative....:help:
Grazie in anticipo a quanti di voi collaboreranno.... :sperem:

N.B. Al momento vorrei evitare di utilizzare le interfacce, quindi mi limiterò a far funzionare le classi tramite una semplice console.

Non so se importa, comunque, io utilizzo Eclipse come editor...

lupixslacky
12-11-2009, 14:54
class Persona{
private String nome;
private String cognome;
private String numero;
....
....
public Persona(String nome,String cognome){Costruisco un oggetto persona con nome e cognome
this.nome=nome
this.cognome=cognome;
}
//metodi accessori
//membri mutatori


Poi ti serve una struttura dati in grado di contenere gli oggetti,puoi
usare un ArrayList,un Set o una Map.


Alla fine una classe main,con uno switch dove
a nome cognome
inserisci nome e cognome
e via dicendo.
Ciao e spero di esssere stato utile.
In poche parole e' un po' complesso spiegare.
Posta il codice scritto da te cosi' is better :)

skyblu_angel
12-11-2009, 14:56
class Persona{
private String nome;
private String cognome;
private String numero;


io veramente vorrei fissare dei valori massimi a questi parametri...
Come faccio a definire nome di massimo (esempio) 20 caratteri? Sempre di tipo String ovviamente...

Per il menù, non ti preoccupare... è molto chiaro :D
Il tempo di definire l'oggetto persona e comincio a buttare giù un pò di codice... ora sto facendo tutto su carta..

skyblu_angel
12-11-2009, 15:06
Queste, se non erro, sono le classi che mi servono per creare un flusso tra programma e file, e con esso leggere o scrivere dati sul file


FileOutputStream
FileInputStream
ObjectInputStream
ObjectOutputStream



Ho pensato che il file può avere stensione .bin Cosa ne pensate?

lupixslacky
12-11-2009, 15:09
:read: :read: :read: :read: :read: :read: :read: :read:

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html

Qua trovi tutto,ma per i raffinamenti ci pensiamo alla fine.Ciao.
;)

skyblu_angel
12-11-2009, 17:04
Non riesco a trovare niente di utile e allora mi sono ridotto a fare così : Se il parametro in ingresso è di lunghezza minore o uguale ad N allora assegno, altrimenti prendo la subString da 0 ad N. Però mi chiedevo se fosse possibile fin dalla dichiarazione fissare un valore massimo o meno...

appoggio = tastiera.readLine();
Integer N=10; // vincolo di lunghezza massima
controllo_lunghezza=appoggio.length();
if (controllo_lunghezza<=N){
nome=appoggio;
}
else {nome=appoggio.substring(0, N);}

skyblu_angel
12-11-2009, 17:56
Sto cominciando a creare la classe Rubrica...

public class Rubrica {
public static int opzione; //opzione per il menù
private static String nome; //nome del contatto
private static String cognome; //cognome del contatto
private static String n_tel; //numero di telefono del contatto

//costruttore predefinito
public Rubrica(){
nome=null;
cognome=null;
n_tel=null;
}

//imposta il nome
public static void setNome(String N){
nome=N;
}

//imposta il cognome
public static void setCognome(String C){
cognome=C;
}

//imposta numero di telefono
public static void setNtel(String Ntel){
n_tel=Ntel;
}

//preleva nome
public String getNome(){
return nome;
}
//preleva cognome
public String getCognome(){
return cognome;
}
//preleva numero di telefono
public String getNtel(){
return n_tel;
}

}


A breve posterò la classe menù... ;)

skyblu_angel
12-11-2009, 18:07
Chi mi da una mano ad usare JFileChooser ???

Mi serve per scegliere il file di testo da caricare e/o da salvare....

ndakota
12-11-2009, 19:50
Mica era 'senza intefacce'? Passa il nome del file come argomento al main.

morskott
12-11-2009, 20:30
Sto cominciando a creare la classe Rubrica...




A breve posterò la classe menù... ;)

fai confusione con la keyword "static" per me, le variabili d'istanza non sono statiche, come i metodi che vanno a interrogare/mutare l'oggetto, poi la classe di nome Rubrica logicamente non l'hai modellata come rubrica, ma come persona e in più hai mischiato un oggetto di dominio (una persona (o contatto)) con un'operazione che andrai a fare (quell'"int opzione").

Quindi ricapitolando avrai una classe che modellerà il concetto di persona o contatto ("public class Persona"), una classe che modellerà una rubrica ("public class Rubrica") che sarà una collezione di persone/contatti, una classe per gestire salvataggi e reperimenti delle persone da file ("public class PersonaDAO" e "public class RubricaDAO"), una classe che rappresenta le operazioni che vorrai fare ("public class RubricaBusinessLogic") e una o più classi che rappresenta l'UI con l'utente ("public class RubricaUI"). Per diminuirne la "complessità" potresti fondere la classe di UI, di business logic e di DAO nella combinazione che vuoi (DAO+BusinessLogic e UI o DAO e BusinessLogic+UI o DAO+BusinessLogic+UI) ma perdi in modularità e futura espansione.

skyblu_angel
13-11-2009, 12:16
fai confusione con la keyword "static"
Per questo ho risolto ed ho eliminato la keyword...


la classe di nome Rubrica logicamente non l'hai modellata come rubrica, ma come persona e in più hai mischiato un oggetto di dominio (una persona (o contatto)) con un'operazione che andrai a fare (quell'"int opzione").
Il parametro "opzione" mi serve per i menù che andrò a fare, poichè al momento l'iterazione con l'utente sarà tramite caratteri ed ho deciso di utilizzare "opzione" come controllo di tutte le scelte dei menù.
Non ho capito bene il discorso che hai fatto poi con il discorso PERSONA e RUBRICA. Ho capito ciò che intendi :"Persona riguarda i dati di una singola persona e Rubrica tratta tutti i dati assieme". Però secondo il mio pensiero, non ho bisogno di una classe che tratti tutti i dati di tutta la rubrica poichè non vorrei caricare tutti i dati assieme in memoria... Tratterò i dati su un file di testo (purtroppo mi tocca!) e quindi caricherò in memoria una persona per volta e non tutti assieme...

Però, giusto per sapere, come dovrei creare la classe rubrica? Mi scrivi una bozza di codice? Mi riferisco alla classe che intendi tu, ossia quella che tratta una collezione di persone/contatti...

una classe per gestire salvataggi e reperimenti delle persone da file ("public class PersonaDAO" e "public class RubricaDAO"), una classe che rappresenta le operazioni che vorrai fare ("public class RubricaBusinessLogic") e una o più classi che rappresenta l'UI con l'utente ("public class RubricaUI"). Per diminuirne la "complessità" potresti fondere la classe di UI, di business logic e di DAO nella combinazione che vuoi (DAO+BusinessLogic e UI o DAO e BusinessLogic+UI o DAO+BusinessLogic+UI) ma perdi in modularità e futura espansione.
Qui mi sono perso totalmente! :rolleyes:

banryu79
13-11-2009, 13:01
Per diminuirne la "complessità" potresti fondere la classe di UI, di business logic e di DAO nella combinazione che vuoi (DAO+BusinessLogic e UI o DAO e BusinessLogic+UI o DAO+BusinessLogic+UI) ma perdi in modularità e futura espansione.
Penso non gliene importi nulla, per cui propenderei per la diminuzione della modularità: mi sembra di capire che ha ben altro su cui concentrarsi, al momento :fagiano:

@skyblu_angel: ma l'applicazione è dotata di interfaccia grafica, oppure è a consolle/terminale? Se è senza interfaccia grafica, allora niente JFileChooser.

skyblu_angel
13-11-2009, 13:07
Al momento il mio programmino è tutto ad interfaccia a caratteri, difatti non sto utilizzando il JFileChooser...

MEMon
13-11-2009, 13:30
Il parametro "opzione" mi serve per i menù che andrò a fare, poichè al momento l'iterazione con l'utente sarà tramite caratteri ed ho deciso di utilizzare "opzione" come controllo di tutte le scelte dei menù.
Non ho capito bene il discorso che hai fatto poi con il discorso PERSONA e RUBRICA. Ho capito ciò che intendi :"Persona riguarda i dati di una singola persona e Rubrica tratta tutti i dati assieme". Però secondo il mio pensiero, non ho bisogno di una classe che tratti tutti i dati di tutta la rubrica poichè non vorrei caricare tutti i dati assieme in memoria... Tratterò i dati su un file di testo (purtroppo mi tocca!) e quindi caricherò in memoria una persona per volta e non tutti assieme...

morskott ti ha dato un ottimo consiglio.
Dovresti modellare una classe che caratterizzi una rubrica e una che caratterizzi una persona.
Ti devi chiedere cos'è una rubrica in realtà? Non è altro che un qualcosa che contiene, in modo più o meno ordinato, un elenco di persone con rispettive informazioni.
E cos'è una persona? Beh è un'entità che sarà inserita in una rubrica, contiene un nome, un cognome, un numero di telefono, un numero di ufficio e così via...


Però, giusto per sapere, come dovrei creare la classe rubrica? Mi scrivi una bozza di codice? Mi riferisco alla classe che intendi tu, ossia quella che tratta una collezione di persone/contatti...


Esempio di classe Rubrica


import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;

public class Rubrica implements Serializable{

private ArrayList<Persona> elencoPersone=new ArrayList<Persona>();
private Persona proprietario;
private ObjectOutputStream fileOut=null;
private static ObjectInputStream fileIn=null;

public Rubrica(Persona proprietario){
this.proprietario=proprietario;
}

public void inserisciContatto(Persona p){
elencoPersone.add(p);
}

public void visualizzaContatto(int numTelefono){
//cerca il numero tra i contatti, se lo trovo stampa le informazioni
//del contatto
}

public void salvaSuFile(String filepath){
try{
fileOut=new ObjectOutputStream(new FileOutputStream(filepath));
fileOut.writeObject(this);
fileOut.close();
}catch (IOException ex){
//errore
}
}

static public Rubrica caricaDaFile(String filepath){
Rubrica r=null;
try{
fileIn=new ObjectInputStream(new FileInputStream(filepath));
r=(Rubrica)fileIn.readObject();
return r;
}catch (Exception ex){
//errore
}
return r;
}
}


Da usare tipo

//nuova rubrica
Persona proprietario=new Persona(nome,cognome,ecc,ecc)
Rubrica r=new Rubrica(proprietario);

//salvatggio rubrica su file
r.salvaSuFile("rubrica.dat");

//recupero da file
Rubrica r=Rubrica.caricaDaFile("rubrica.dat");

skyblu_angel
13-11-2009, 14:59
WooooooW... tu si che mi hai dato una grossa mano!

Soltanto un piccolo problemino! Non ho mai capito a cosa serve THIS :muro:

Sto cercando sul mio libro di java, ma non ci capisco niente!


ALLORA,... tenendo presente la tua classe RUBRICA... La mia classe Persona dovrebbe essere così:


public class Persona {

private String nome; //nome del contatto
private String cognome; //cognome del contatto
private String n_tel; //numero di telefono del contatto
private String note; //note varie

//costruttore
public Persona(){
nome=null;
cognome=null;
n_tel=null;
note=null;
}

//imposta il nome
public void setNome(String N){
nome=N;
}

//imposta il cognome
public void setCognome(String C){
cognome=C;
}

//imposta numero di telefono
public void setNtel(String Ntel){
n_tel=Ntel;
}
//imposta le note
public void setNote(String NT){
note=NT;
}
//preleva nome
public String getNome(){
return nome;
}
//preleva cognome
public String getCognome(){
return cognome;
}
//preleva numero di telefono
public String getNtel(){
return n_tel;
}
//preleva le note
public String getNote(){
return note;

}



Giusto? Se è giusta la classe persona, cosa devo mettere nel metodo main?
Dopo tutto questa sarà soltanto una classe che utilizzerà gli attributi, non capisco cosa mettere nel metodo main()

MEMon
13-11-2009, 15:40
Il this serve a riferirsi all'istanza della classe stessa.
Esempio pratico:

private String nome, cognome;
private int numTelefono;

public PersonaString nome, String cognome, int numTelefono){
this.nome=nome;
this.cognome=cognome;
this.numTelefono=numTelefono;
}


Come vedi, passo al costruttore persona dei parametri che hanno lo stesso nome di quelli che uso all'interno della classe Persona.
Se non avessi usato il this mi sarei trovato in una situazione del tipo nome=nome che è ovviamente di dubbio significato.

Vorrei farti notare che nella tua classe Persona puoi creare un costruttore al quale passi già tutti i dati volendo, così in un colpo solo crei una persona completa, come nell'esempio che ho fatto sopra, così potrai fare

Persona p=new Persona("Marco","Rossi","000000000");


In pseudo codice il tuo main dovrebbe fare una cosa del genere:

Rubrica r;
while(input!=exit){
input=getInput(); //rimani in ascolto della console e prendi l'input passato
command=parseInputCommand(input); //analizzi l'input in modo da isolare il comando principale
switch(command){
case new:
nome=parseInputName(input); // analizzi l'input per isolare il nome
cognome=parseInputSurname(input);
r=new Rubrica(new Persona(nome,cognome,telefono, ecc ecc));
break;
case add:
nome=parseInputName(input);
cognome=parseInputSurname(input);
// ecc ecc
if(rubricaEsiste) r.inserisciContatto(new Persona(nome,cognome,telefono, ecc ecc));
break;
case delete:
tel=parseInputTel(input);
r.delete(tel);
break;
case save:
filepath=parseInputFilepath(input);
r.salvaSuFile(filepath);
break;
case print:
r.stampaTutto();
break;

}
}

I comandi li dai via console e potrebbero essere del tipo:
new Pippo Disney 1100010101010 <- crea una nuova rubrica con proprietario pippo
add Mario Rossi 000000 <- inserisce il contatto nella rubrica
save rubrica.dat <- salva la rubrica su file
load rubrica.dat <- carica da file
ecc ecc

skyblu_angel
13-11-2009, 18:38
Al momento, ho abbozzato il mio main()...
Non ho scritto nulla di che, soltanto che quando vado ad eseguirlo mi compare una finestra dove mi si chiede:
"Selezionare il modo di esecuzione della classe"
e poi mi compaiono due metodi di scelta:
java applet o java application

Il fatto è che qualunque delle due io selezioni, mi compare un messaggio di errore con su scritto: Selection does not contain a main type!

Ecco il mio main()

public void main(String args[])throws IOException{
Persona contatto = new Persona();
Rubrica rubrica_telefonica= new Rubrica(contatto);
final String percorso_file="C:\\Documents and Settings\\Antonio\\Documenti\\Rubrica Telefonica.dat";
String controllo;

fileOut=new ObjectOutputStream(new FileOutputStream(percorso_file));
fileOut.close();

System.out.println("Fine programma...");
System.exit(0);
}

Dove sarà il problema?



EDIT: ho messo STATIC al metodo main e parte...
però ora mi da errore su queste due righe:
fileOut=new ObjectOutputStream(new FileOutputStream(percorso_file));
fileOut.close();
poichè mi dice che non si tratta di parametri STATIC...
Mettendo STATIC avanti alla dichiarazione di fileOut risolvo il problema...

skyblu_angel
16-11-2009, 11:04
Ho alcuni problemi sulla funzione EMPTY dell'ArrayList[].

In pratica mi da sempre l'Array vuoto, quando invece ci sono degli oggetti al suo interno...

Ecco dove utilizzo il metodo di classe isEmpty():

switch(opzione){
case 1: // visualizzazione contatti
boolean vuoto=rubrica_telefonica.isEmpty();

if (vuoto=true){
System.out.println("La rubrica è vuota!");
}
else{
System.out.println("Nome Cognome Telefono Note");
visualizzaRubrica(rubrica_telefonica);
}
break;


Ed ecco il metodo per visualizzare il contenuto dell'Array, che però entra in funzione soltanto se elimino il controllo "isEmpty" che ho posto precedentemente...

public static void visualizzaRubrica(ArrayList<Persona> a){
Persona appoggio=new Persona();

for(int i=0; i<a.size();++i){
appoggio=(a.get(i));
System.out.println(appoggio.getNome()+appoggio.getCognome()+appoggio.getNtel()+appoggio.getNote());
}
}



Quest'ultimo metodo funziona, ma non so perchè non funziona il metodo isEmpty().
Qualcuno può darmi una dritta?

MEMon
16-11-2009, 11:19
if(vuoto==true)

:muro:

skyblu_angel
16-11-2009, 11:35
if(vuoto==true)

:muro:

AHAHAHA
me ne sono accorto proprio ora che mi hai postato la risposta!
Che erroraccio!

Comunque ora ho un problema ancora più grave!
Ad ogni aggiunta di dati di un singolo contatto che faccio, vengono persi tutti i dati precedenti perchè vengono sovrascritti, però l'aggiunta viene fatta.
Esempio

Dati contatto1:(ANDREA, PIRLO, 12345, null)
Dati contatto2:(ALEXANDER, PATO, 12345, attaccante)

Se faccio la visualizzazione, mi visualizza 2 volte i dati del contatto2

Se dovessi aggiungere un contatto3, mi visualizzerà 3 volte i dati del contatto3.. e così via! :muro:

MEMon
16-11-2009, 11:54
Ok, ma non ci dici come li aggiungi.

ndakota
16-11-2009, 11:55
Facci vedere come li salvi..

skyblu_angel
16-11-2009, 11:58
case 2: //Aggiunta di un contatto

System.out.println("Attenzione, l'inserimento dovrà essere di massimo 15 caratteri!");
System.out.println("In caso contrario, la stringa verrà tagliata ad un massimo di 15 caratteri!\n");
System.out.println("Inserimento dato nuovo contatto");
System.out.print("Nome del contatto (max 15 caratteri) : ");
appoggio=tastiera.readLine();
contatto.setNome(tagliaStringa(appoggio));
System.out.print("Cognomenome del contatto (max 15 caratteri) : ");
appoggio=tastiera.readLine();
contatto.setCognome(tagliaStringa(appoggio));
System.out.print("Numero di telefono del contatto (max 15 caratteri): ");
appoggio=tastiera.readLine();
contatto.setNtel(tagliaStringa(appoggio));
System.out.print("Eventuali note del contatto (max 15 caratteri) : ");
appoggio=tastiera.readLine();
contatto.setNote(tagliaStringa(appoggio));
rubrica_telefonica.add(contatto);

Ho notato che il metodo .add(object) restituisce un boolean, e allora ho anche aggiunto questo controllo ulteriore:

aggiunto=rubrica_telefonica.add(contatto);
if (aggiunto==true){
System.out.println("Inserimento avvenuto in maniera corretta...");
}else{
System.out.println("Errore durante l'inserimento...aggiunto="+aggiunto);
}

Ma non viene stampato nulla a video!

MAH

MEMon
16-11-2009, 12:19
Credo che il problema non sia in quel codice.

skyblu_angel
16-11-2009, 12:21
Credo che il problema non sia in quel codice.

Se volete, e se posso(da regolamento)... Posto tutto il codice sorgente.... :rolleyes:

MEMon
16-11-2009, 12:22
Certo che si può, posta pure.

skyblu_angel
16-11-2009, 12:33
Ecco qua il codice...
import java.io.*;
import java.util.ArrayList;

public class Rubrica implements Serializable{

private ArrayList <Persona> elencoContatti=new ArrayList<Persona>();
private Persona contatto;
private static ObjectOutputStream fileOut=null;
private static ObjectInputStream fileIn=null;

//costruttore
public Rubrica(Persona contatto){
this.contatto=contatto;
}

public void inserisciContatto(Persona p){
elencoContatti.add(p);
}

public static Rubrica caricaDaFile(String percorso){
Rubrica r=null;
try{
fileIn=new ObjectInputStream(new FileInputStream(percorso));
r=(Rubrica)fileIn.readObject();
return r;
}catch (Exception ex){
System.out.println("ERRORE : "+ ex);
//errore
}
return r;
}

public String salvaSuFile(String percorso){
String risposta_positiva="Salvataggio non eseguito correttamente";
try{
fileOut=new ObjectOutputStream(new FileOutputStream(percorso));
fileOut.writeObject(this);
fileOut.close();
risposta_positiva="Salvataggio eseguito correttamente";
}catch (IOException ex){
//errore
}
return risposta_positiva;
}

public static void menu(){
System.out.println("\n\nMenu Rubrica");
System.out.println(" 1 : Visualizza l'intera rubrica");
System.out.println(" 2 : Aggiunta di un contatto");
System.out.println(" 3 : Ricerca di un contatto");
System.out.println(" 4 : Modifica o Cancella contatto");
System.out.println(" 0 : Uscire dal programma");

}

public static void visualizzaRubrica(ArrayList<Persona> a){
Persona appoggioPersona=new Persona();
String appoggioNome, appoggioCognome, appoggioNtel, appoggioNote;

for(int i=0; i<a.size();++i){
appoggioPersona=(a.get(i));
//estrazione dati contatto
appoggioNome=appoggioPersona.getNome();
appoggioCognome=appoggioPersona.getCognome();
appoggioNtel=appoggioPersona.getNtel();
appoggioNote=appoggioPersona.getNome();
//aggiunta spazi per la visualizzazione
appoggioNome=aggiungiSpazi(appoggioNome);
appoggioCognome=aggiungiSpazi(appoggioCognome);
appoggioNtel=aggiungiSpazi(appoggioNtel);
appoggioNote=aggiungiSpazi(appoggioNote);

//visualizza dati del contatto con la corretta spaziatura
System.out.println(appoggioNome+appoggioCognome+appoggioNtel+appoggioNote);
}
}

public static String aggiungiSpazi(String s){
String appoggio=s;
int n=appoggio.length();
if (n<15){
for(int i=0;i<=(15-n);++i){
appoggio=appoggio+" ";
}
}
return appoggio;

}

public static String tagliaStringa(String s){
String appoggio=s;

if (appoggio.length()>15){
s=appoggio.substring(0, 15);
}

return s;
}


public static void main(String args[])throws IOException{

ArrayList <Persona> rubrica_telefonica=new ArrayList <Persona>();
Persona contatto=new Persona();
final int dimNome=15;
final int dimCognome=15;
final int dimNtel=15;
final int dimNote=15;
final String percorso_file="C:\\Documents and Settings\\Antonio\\Documenti\\Rubrica Telefonica.dat";
BufferedReader tastiera = new BufferedReader(new InputStreamReader(System.in));
String controllo, appoggio;
int opzione=99;

//creazione del file in caso di assenza
fileOut=new ObjectOutputStream(new FileOutputStream(percorso_file));
fileOut.close();
do{

menu();
do{
try{
opzione=Integer.parseInt(tastiera.readLine());
}
catch(NumberFormatException nfe){
System.out.println("Errore :"+ nfe);
System.out.println("Errore : ripetere la scelta del menù");
}
}while((opzione<0) && (opzione>4));

switch(opzione){
case 1: // visualizzazione contatti
boolean vuoto=rubrica_telefonica.isEmpty();

if (vuoto==true){
System.out.println("La rubrica è vuota!");
}
else{
System.out.println("Nome Cognome Telefono Note");
visualizzaRubrica(rubrica_telefonica);
}
break;

case 2: //Aggiunta di un contatto
boolean aggiunto=false;
System.out.println("Attenzione, l'inserimento dovrà essere di massimo 15 caratteri!");
System.out.println("In caso contrario, la stringa verrà tagliata ad un massimo di 15 caratteri!\n");
System.out.println("Inserimento dato nuovo contatto");
System.out.print("Nome del contatto (max 15 caratteri) : ");
appoggio=tastiera.readLine();
contatto.setNome(tagliaStringa(appoggio));
System.out.print("Cognomenome del contatto (max 15 caratteri) : ");
appoggio=tastiera.readLine();
contatto.setCognome(tagliaStringa(appoggio));
System.out.print("Numero di telefono del contatto (max 15 caratteri): ");
appoggio=tastiera.readLine();
contatto.setNtel(tagliaStringa(appoggio));
System.out.print("Eventuali note del contatto (max 15 caratteri) : ");
appoggio=tastiera.readLine();
contatto.setNote(tagliaStringa(appoggio));
rubrica_telefonica.add(contatto);

break;

case 3:
break;

case 4:
break;

case 0:
System.out.println("Fine programma...");
System.exit(0);

}
}while(opzione!=0);




}


}

MEMon
16-11-2009, 12:47
Incolla del codice funzionante che si possa provare, e scrivilo indentato che così non si capisce nulla.
Se hai delle classi dividile.

skyblu_angel
16-11-2009, 12:52
Non riesco a scriverle in modo ordinato...

Qui allego la classe persona...

skyblu_angel
16-11-2009, 12:52
Qui allego la classe rubrica...

MEMon
16-11-2009, 13:12
Comunque l'errore dovrebbe essere che utilizzi sempre lo stesso contatto nel ciclo dove aggiungi.
Sposta all'interno del ciclo questo e se non ci sono altri errori dovrebbe andare.

Persona contatto=new Persona();

Ogni volta devi creare una nuova persona....se no a che serve quello fai?

In più il codice così non ha senso, non stai usando le classi, hai la classe rubrica ma non la usi, usi i metodi di classe come fossero funzioni, hai le idee un pò troppo confuse, non dico di java ma proprio di come pensare in OO.

Non stai programmando in C ma in java ricordalo.

skyblu_angel
16-11-2009, 13:15
Comunque l'errore dovrebbe essere che utilizzi sempre lo stesso contatto nel ciclo dove aggiungi.
Sposta all'interno del ciclo questo e se non ci sono altri errori dovrebbe andare.

Persona contatto=new Persona();

Ogni volta devi creare una nuova persona....se no a che serve quello fai?

In più il codice così non ha senso, non stai usando le classi, hai la classe rubrica ma non la usi, usi i metodi di classe come fossero funzioni, hai le idee un pò troppo confuse, non dico di java ma proprio di come pensare in OO.

Non stai programmando in C ma in java ricordalo.

Purtroppo è il primo vero programma che faccio in java...
E' il mio primo programma in un linguaggio O.O.
Proprio per questo mi serve aiuto.... :(

MEMon
16-11-2009, 13:18
Ma hai un libro o qualcosa che ti spieghi come pensare e quindi programmare ad oggetti?
Perchè ok iniziare subito con la pratica, ma la base ci deve essere se no va a finire che "impari" male.
Il difficile non è mica imprare la sintassi di java, quella l'hai sempre a disposizione con il javadoc, ma strutturare una classe in modo intelligente.

skyblu_angel
16-11-2009, 13:19
Si, utilizzo: JAVA, guida alla programmazione
della McGraw Hill

MEMon
16-11-2009, 13:20
Va bene allora, ora che hai abbozzato un pò di codice leggiti un pò di teoria per strutturare meglio il programma.

MEMon
16-11-2009, 13:28
E poi sinceramente non ho capito perchè non hai deciso di utilizzare interfaccie grafiche fin da subito :D
1) è molto più divertente realizzarlo
2) impari qualcosa di diverso dal classico input da tastiera del C
3) è più appagante vederlo andare
4) impari ad usare gli eventi che sono molto importanti

skyblu_angel
16-11-2009, 13:44
preferisco evitare l'interfaccia per ora.. faccio già grossa confusione con le classi... figuriamoci con le classi di interfaccia!

Lillinux
16-11-2009, 13:58
E poi sinceramente non ho capito perchè non hai deciso di utilizzare interfaccie grafiche fin da subito :D
1) è molto più divertente realizzarlo
2) impari qualcosa di diverso dal classico input da tastiera del C
3) è più appagante vederlo andare
4) impari ad usare gli eventi che sono molto importanti

Concordo pienamente.
Anche perchè in questi libri, ricordo, c'era sempre una specie di scheletro dell'interfaccia.
piano piano giocandoci riesci a fare anche cose + divertenti e soprattutto funzionali.

skyblu_angel
16-11-2009, 14:21
RISOLTO!

ecco il codice:

case 2: //Aggiunta di un contatto
Persona contatto=new Persona();
boolean aggiunto=false;
System.out.println("Attenzione, l'inserimento dovrà essere di massimo 15 caratteri!");
System.out.println("In caso contrario, la stringa verrà tagliata ad un massimo di 15 caratteri!\n");
System.out.println("Inserimento dato nuovo contatto");
System.out.print("Nome del contatto (max 15 caratteri) : ");
appoggio=tastiera.readLine();
contatto.setNome(tagliaStringa(appoggio));
System.out.print("Cognomenome del contatto (max 15 caratteri) : ");
appoggio=tastiera.readLine();
contatto.setCognome(tagliaStringa(appoggio));
System.out.print("Numero di telefono del contatto (max 15 caratteri): ");
appoggio=tastiera.readLine();
contatto.setNtel(tagliaStringa(appoggio));
System.out.print("Eventuali note del contatto (max 15 caratteri) : ");
appoggio=tastiera.readLine();
contatto.setNote(tagliaStringa(appoggio));
rubrica_telefonica.add(contatto);

break;

in pratica l'unico cambiamento è stato quello di creare l'oggetto contatto ogni volta che devo fare un nuovo inserimento: Persona contatto=new Persona();

Ora non mi compaiono più duplicati

MEMon
16-11-2009, 14:23
Ci avevo preso, ora metti a posto tutto il resto :fagiano:

skyblu_angel
17-11-2009, 18:05
STO ANDANDO NEL PANICO! :mc:

Non so come scrivere il costruttore predefinito! Mi serve una mano!
HELP!

skyblu_angel
18-11-2009, 15:23
Nessuno riesce a darmi un consiglio sul come scrivere il costruttore()

Sono bloccatissimo! :muro:

MEMon
18-11-2009, 16:30
di cosa?

skyblu_angel
19-11-2009, 10:35
di cosa?

Il costruttore della classe Rubrica.

Non riesco ancora ad entrare nella mentalità e quindi trovo difficoltà...
Secondo te, come dovrebbe essere il costruttore di Rubrica?

MEMon
19-11-2009, 12:34
Pensa ad una rubrica vera, cosa ha di definito quando la compri o comunque quando ne entri in possesso?

Io per fare giusto un esempio ti avevo messo un proprietario della rubrica, ma ci puoi mettere quello che vuoi.
Puoi mettere il num massimo di contatti che può supportare per esempio, puoi anche non mettere nulla e non definire un costruttore.

skyblu_angel
19-11-2009, 13:13
Pensa ad una rubrica vera, cosa ha di definito quando la compri o comunque quando ne entri in possesso?

Io per fare giusto un esempio ti avevo messo un proprietario della rubrica, ma ci puoi mettere quello che vuoi.
Puoi mettere il num massimo di contatti che può supportare per esempio, puoi anche non mettere nulla e non definire un costruttore.

La mia rubrica deve essere un ArrayList di tipo Persona, ossia un array dove ogni elemento è collegato ad un oggetto di tipo persona... Come lo definisco?

public Rubrica(){
---qua che ci metto?!---
}

MEMon
19-11-2009, 13:17
Se intendi che hai esteso arraylist, allora scegli un costruttore di arraylist e lo fai uguale, esempio se scegli come costruttore questo

ArrayList(int initialCapacity)
Constructs an empty list with the specified initial capacity.

dovrai fare


public Rubrica(//quello che vuoi){
super(capacity);
}


Ma ti ripeto che puoi anche non mettere nulla, in tal caso java considera super() come costruttore della classe padre.

banryu79
19-11-2009, 13:22
Prefer composition over extension :)
O questo non è il caso?
Io vedrei più facile dotare la classe Rubrica di una lista di "contatti", cioè le singole Persone contenute nella stessa.
Poi basta che skyblu_angel si trovi a suo agio con i concetti...
Che ne dite?


class Rubrica
{
private List<Persona> contatti;

public Rubrica() {
contatti = new ArrayList<Persona>();
}

// ecc...
}