View Full Version : [Java] implementare una classe
postgres
02-10-2008, 18:50
Vorrei sapere come si implementa la classe Libretto che si trova qui
http://homes.dico.unimi.it/~capra/provaSet08/
Vi ho messo in allegato quello che ho fatto
In esecuzione mi da degli errori, ma sicuramente ci sono degli errori nei metodi di Libretto (esame invece deve essere giusta come è sicuramente giusta testlibretto fornita appunto come test per le altre 2).
Vi prego di correggermi le parti sbagliate!
Grazie Mille! Vi prego è urgente!
agente mm8
02-10-2008, 20:08
Sto dando un'occhiata la codice, comunque il link è sbagliato, porta alla classe Esame, e non all'interfaccia Libretto.:)
postgres
02-10-2008, 20:08
Se guardi sulla sinistra puoi scegliere tra libretto e esame
postgres
02-10-2008, 21:18
Sto dando un'occhiata la codice, comunque il link è sbagliato, porta alla classe Esame, e non all'interfaccia Libretto.:)
Novità?
e Grazie per quello che stai facendo!
Oceans11
03-10-2008, 07:56
Potresti postare l'errore che ti dà?
Inoltre credo che ti convenga anche postare la classe Libretto che hai fatto tu (mettila tra i tag "code" mi raccomando.)
Un'occhiata gliel'ho data e gli errori sono più di uno :stordita:
Piano piano si risolvono, ma tu devi far vedere che ci provi, non puoi dire semplicemente: "correggetemela"
postgres
03-10-2008, 09:14
Allora l'errore è:
quando il test mi chiede il numero di esami, inserisco il numero e dice:
Exception in thread main java.lang.NullPointerException
at Libretto.toString(Libretto.java:215)
at java.lang.String.valueOf(unknown Source)
at java.lang.Strinf.Builder.append(Unknown Source)
at TestLibretto.main(TestLibretto.java:26)
Poi ieri sera il codice l'ho modificato un po' però non so come si mettono i tag code!
Oceans11
03-10-2008, 09:42
quando scrivi il post in alto c'è il pulsante "#", premilo e inserirà nella posizione del cursore del testo i tag, poi non devi far altro che copiarci il codice tra i 2 tag.
Insomma posta il codice della classe Libretto, che poi si lavora su un metodo per volta, perchè gli errori sono assai.
postgres
03-10-2008, 09:45
[QUOTE=Oceans11;24398036]quando scrivi il post in alto c'è il pulsante "#", premilo e inserirà nella posizione del cursore del testo i tag, poi non devi far altro che copiarci il codice tra i 2 tag.
import java.util.*;
import java.io.*;
class Libretto{
// campi
private String nome;
private String cognome;
private String cdl;
private int matricola;
private int n_esami;
private Esame [] Libretto;
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
// costruttore
public Libretto ( String nome, String cognome, String cdl, int matricola, int n_esami) {
this.nome = nome;
this.cognome = cognome;
this.cdl = cdl;
this.matricola = matricola;
this.n_esami = n_esami;
Libretto = new Esame[n_esami];
}
//metodi
public boolean aggiunge (Esame nuovo) {
if(nuovo == null || nuovo.cdl() != this.cdl() || nuovo.cdl() == null || this.cdl() == null || this.quanti() == n_esami ){
return false;
}
if(quanti() == n_esami)
return false;
Libretto [this.quanti()] = nuovo; // inserisci nuovo esame
return true;
}
public Esame cancella () throws IOException {
int a = 0;
if(Libretto == null)
return null;
a = this.quanti()-1;
Libretto [this.quanti()-1] = null; // cancella esame nella precedente posizione
return Libretto[a]; //
}
public String cdl () {
return cdl;
}
public String cognome (){
return cognome;
}
public Date data (Esame e){
return e.data();
}
public int esamiPrimaDi(Date data){
int n = 0; //contatore
if (Libretto == null || data == null)
return 0;
for (int i = 0; i <this.quanti(); i++){
if(Libretto[i].data().before(data) ){ // controllo le date minori di data
n++;
}
}
return n; // ritorni il numero di esami sostenuti prima di quella data
}
public int matricola (){
return matricola;
}
public Double media (){
int t = 0;
double media = 0;
for (int i = 0; i < this.quanti(); i++){
if (Libretto[i] != null){ //fino a che non c'è un null...
t = t + Libretto[i].voto(); // ...sommo i voti
}else{
break;
}
media = (double) (t/i); //fa la media
}
return media;
}
public String nome (){
return nome;
}
public int quanti (){
int i = 0;
for (i = 0; i <n_esami; i++){ // esamino il libretto
if (Libretto[i] == null){ // Se arrivi a null fermati
break;
}
}
return i+1; // ritorna esami registrati
}
public Esame sostenuto (String corso){ //mezzo giusto
int a = 0;
if(corso == null || this.cdl() == null)
return null;
for(int i = 0;i<this.quanti();i++){
if (Libretto[i].corso() == corso) // controllo che i corsi siano identici
a = i;
}
return Libretto[a]; // ritorna il riferimento
}
public Esame ultimo(){
Date data = new Date();
int a = 0;
if (Libretto == null)
return null;
for (int i = 1; i <this.quanti(); i++){ //i =1 per confrontare con il precedente
if(Libretto[i].data().after(Libretto[i-1].data()) ){ //controllo la data più recente
if (data.after(Libretto[i].data())) // confronta la data maggiora tra le 2 con la data maggiore in precedenza
data = Libretto[i].data(); // inserimento in data della data più recente
a = i;
// esame con data più recente
}
}
return Libretto[a];
}
public String toString(){
String s = " ";
for (int i = 0; i <=n_esami; i++){
s = s + Libretto[i].toString();
}
return s;
}
}//fine classe
postgres
03-10-2008, 09:48
Sicuramente è sbagliato il metodo cancella, poi in esecuzione mi da errore in Tostring e non so perchè!
Oceans11
03-10-2008, 09:53
madò!!!
Senti forse ho mancato io che non ti ho avvertito, ma i tag code servono per preservare l'indentazione del codice, ma a quanto vedo non è molto indentato. Rimedia
EDIT: metti pure le graffe intorno al corpo dei cicli e dei rami if-else
postgres
03-10-2008, 10:01
vediamo se ora va megliO|!
import java.util.*;
import java.io.*;
class Libretto{
// campi
private String nome;
private String cognome;
private String cdl;
private int matricola;
private int n_esami;
private Esame [] Libretto;
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
// costruttore
public Libretto ( String nome, String cognome, String cdl, int matricola, int n_esami) {
this.nome = nome;
this.cognome = cognome;
this.cdl = cdl;
this.matricola = matricola;
this.n_esami = n_esami;
Libretto = new Esame[n_esami];
}
//metodi
public boolean aggiunge (Esame nuovo) {
if(nuovo == null || nuovo.cdl() != this.cdl() || nuovo.cdl() == null || this.cdl() == null || this.quanti() == n_esami ){
return false;
}
if(quanti() == n_esami)
return false;
Libretto [this.quanti()] = nuovo; // inserisci nuovo esame
return true;
}
public Esame cancella () throws IOException {
int a = 0;
if(Libretto == null)
return null;
a = this.quanti()-1;
Libretto [this.quanti()-1] = null; // cancella esame nella precedente posizione
return Libretto[a];
}
public String cdl () {
return cdl;
}
public String cognome (){
return cognome;
}
public Date data (Esame e){
return e.data();
}
public int esamiPrimaDi(Date data){
int n = 0; //contatore
if (Libretto == null || data == null)
return 0;
for (int i = 0; i <this.quanti(); i++){
if(Libretto[i].data().before(data) ){ // controllo le date minori di data
n++;
}
}
return n; // ritorni il numero di esami sostenuti prima di quella data
}
public int matricola (){
return matricola;
}
public Double media (){
int t = 0;
double media = 0;
for (int i = 0; i < this.quanti(); i++){
if (Libretto[i] != null){ //fino a che non c'è un null...
t = t + Libretto[i].voto(); // ...sommo i voti
}else{
break;
}
media = (double) (t/i); //fa la media
}
return media;
}
public String nome (){
return nome;
}
public int quanti (){
int i = 0;
for (i = 0; i <n_esami; i++){ // esamino il libretto
if (Libretto[i] == null){ // Se arrivi a null fermati
break;
}
}
return i+1; // ritorna esami registrati
}
public Esame sostenuto (String corso){ //mezzo giusto
int a = 0;
if(corso == null || this.cdl() == null)
return null;
for(int i = 0;i<this.quanti();i++){
if (Libretto[i].corso() == corso) // controllo che i corsi siano identici
a = i;
}
return Libretto[a]; // ritorna il riferimento
}
public Esame ultimo(){
Date data = new Date();
int a = 0;
if (Libretto == null)
return null;
for (int i = 1; i <this.quanti(); i++){ //i =1 per confrontare con il precedente
if(Libretto[i].data().after(Libretto[i-1].data()) ){ //controllo la data più recente
if (data.after(Libretto[i].data())) // confronta la data maggiora tra le 2 con la data maggiore in precedenza
data = Libretto[i].data(); // inserimento in data della data più recente
a = i;
// esame con data più recente
}
}
return Libretto[a];
}
public String toString(){
String s = " ";
for (int i = 0; i <=n_esami; i++){
s = s + Libretto[i].toString();
}
return s;
}
}//fine classe
postgres
03-10-2008, 10:22
Come si risolve l'errore?
Non è che sei sparito?
Non mi abbandonate!!!
postgres
03-10-2008, 10:49
ho messo anche le graffe per gli if
import java.util.*;
import java.io.*;
class Libretto{
// campi
private String nome;
private String cognome;
private String cdl;
private int matricola;
private int n_esami;
private Esame [] Libretto;
// costruttore
public Libretto ( String nome, String cognome, String cdl, int matricola, int n_esami) {
this.nome = nome;
this.cognome = cognome;
this.cdl = cdl;
this.matricola = matricola;
this.n_esami = n_esami;
Libretto = new Esame[n_esami];
}
//metodi
public boolean aggiunge (Esame nuovo) {
if(nuovo == null || nuovo.cdl() != this.cdl() || nuovo.cdl() == null || this.cdl() == null || this.quanti() == n_esami ){
return false;
}
if( (quanti() -1)== n_esami){
return false;
}
Libretto [this.quanti()] = nuovo; // inserisci nuovo esame
return true;
}
public Esame cancella () {
int a = 0;
if(Libretto == null){
return null;
}
a = this.quanti()-1;
Libretto [this.quanti()-1] = null; // cancella esame nella precedente posizione
return Libretto[a];
}
public String cdl () {
return cdl;
}
public String cognome (){
return cognome;
}
public Date data (Esame e){
return e.data();
}
public int esamiPrimaDi(Date data){
int n = 0; //contatore
if (Libretto == null || data == null){
return 0;
}
for (int i = 0; i <this.quanti() -1; i++){
if(Libretto[i].data().before(data) ){ // controllo le date minori di data
n++;
}
}
return n; // ritorni il numero di esami sostenuti prima di quella data
}
public int matricola (){
return matricola;
}
public Double media (){
int cont = 0;
int somma = 0;
double media = 0;
for (int i = 0; i < this.quanti() - 1; i++){
somma = somma + Libretto[i].voto(); // ...sommo i voti
media = (double) (somma/(i+1)); //fa la media
}
return media;
}
public String nome (){
return nome;
}
public int quanti (){
int i = 0;
for (i = 0; i <n_esami; i++){ // esamino il libretto
if (Libretto[i] == null){ // Se arrivi a null fermati
break;
}
}
return i+1; // ritorna esami registrati
}
public Esame sostenuto (String corso){ //mezzo giusto
int a = 0;
if(corso == null || this.cdl() == null)
return null;
for(int i = 0;i<this.quanti();i++){
if (Libretto[i].corso() == corso) // controllo che i corsi siano identici
a = i;
}
return Libretto[a]; // ritorna il riferimento
}
public Esame ultimo(){
Date data = new Date();
int a = 0;
if (Libretto == null)
return null;
for (int i = 1; i <this.quanti()-1; i++){ //i =1 per confrontare con il precedente
if(Libretto[i].data().after(Libretto[i-1].data()) ){ //controllo la data più recente
if (data.after(Libretto[i].data())) // confronta la data maggiora tra le 2 con la data maggiore in precedenza
data = Libretto[i].data(); // inserimento in data della data più recente
a = i;
// esame con data più recente
}
}
return Libretto[a];
}
public String toString(){
String s = " ";
if (Libretto == null)
return s;
for (int i = 0; i <=this.quanti()-1; i++){
s = s + Libretto[i].toString();
}
return s;
}
}//fine classe
postgres
03-10-2008, 11:19
Ragazzi era urgente!
Perchè non mi dite come si risolve questo problema????
Oceans11
03-10-2008, 14:19
Ragazzi era urgente!
Perchè non mi dite come si risolve questo problema????
Oh calma!
Non credo che sia "dovuto" un aiuto, ne tantomeno credo che qualcuno voglia farti i dispetti. Nel mio caso sono uscito di casa, ma ti devo dare spiegazioni?
Tra l'altro se hai tutta sta urgenza mi fai sospettare una cosa tipo questa (http://hwupgrade.it/forum/showthread.php?t=1631648).
NB: indentare il codice significa che ad ogni blocco (che significa tra ogni coppia di parentesi graffe) devi dare una tabulazione o 3/4 spazi.
Ma ora veniamo al codice:
Primo suggerimento: perchè in quanti() fai return valore +1?tra l'altro poi ogni volta che usi il metodo devi fare -1.
Secondo: in aggiungi fai prima questo controllo quanti() == n_esami, poi fai quanti() -1 == n_esami....?!?io direi di metterci d'accordo!
Terzo: invece di fare un metodo quanti() che di volta in volta scandisca l'array per contare gli elementi non nulli, ti consiglio una variabile privata che faccia da contatore: ad ogni inserimento andato a buon fine la incrementi, ad ogni eliminazione andata a buon fine decrementi, il metodo quanti() diventerà allora un semplice getter.
postgres
03-10-2008, 14:27
Ho corretto il metodo quanti.. e ora non mi da più quel problema!
però penso che il metodo cancella sia sicuramente sbagliato non so come ritornare il valore!
Per quanto riguarda sopra in realtà era una scommessa con un mio amico! hehe
Oceans11
03-10-2008, 15:15
Ok, ora però quanti non ti indica più la prima posizione vuota dell'array, ma semplicemente quanti esami ci sono. Quindi non puoi aggiungere nella posizione quanti-1. Come lo stesso il metodo cancella vuole l'ultimo esame registrato, che non necessariamente è l'ultimo dell'array, o quello in ultima posizione.
Capito?
Sta scommessa diciamo che la stai a perde.....oppure valeva fartelo fare da qualcun'altro?!?
DanieleC88
04-10-2008, 09:32
class Libretto{
//...
private Esame [] Libretto;
Io direi di evitare di dare lo stesso nome alla classe e ad un campo interno alla stessa. Poi, se la nullPointerException te la dà quando invochi toString(), probabilmente è perché cerchi di accedere a posizioni non inizializzate dell'array. Nota che non dovrebbe esserti necessario ridefinire un metodo "quanti()" e che puoi fare in modo che toString() converta in stringa solo il numero di posizioni già create.
ciao ;)
Athardis
05-10-2008, 01:56
ma il metodo cancella cosa dovrebbe fare?
gli ho dato un occhiata veloce e cosi' come sta scritto dovrebbe cancellare l'ultimo elemento dell'array e ritornare null, e' normale/voluto tutto cio'? fare un metodo void? usare una variabile contatore al posto delle invocazioni del metodo quanti() come e' gia stato detto?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.