Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di el92
    Registrato dal
    Dec 2014
    Messaggi
    177

    [java] libretto universitario

    ciao sono un pò in difficoltà con la classe LibrettoEsami che descrive un libretto universitario.
    Dopo tante difficoltà sono riuscita ad implementarla(forse):
    codice:
    import java.util.*;
    class LibrettoEsami{
        private  ArrayList <Esame> esami;
        final int numesami=40;
        private int cfu;
        private double media;
        public LibrettoEsami(){
            esami=new ArrayList <Esame>();    
            cfu=0;
            media=0.0;
    }
    public boolean addEsame(Esame e){
            if(esami.size()<numesami&&esami.contains(e)){
                System.out.println("esame già registrato");
                return false;
        }else
        esami.add(e);
        return true;
    }
    
    public int totCFU(){
        for(Esame e:esami)
            this.cfu+=e.getCFU();
            return cfu;    
    }
    //media=sommaPesataVoti / sommaCrediti;
    public double mediaVoti(){
        double sommavoti=0.0;
        double sommaCrediti=0.0;
        
            for(Esame e:esami){
                sommavoti+=(e.getVoto()*e.getCFU());
                sommaCrediti+=e.getCFU();
            }
                media=sommavoti/sommaCrediti;
                
                return media;
    }
    public String toString(){
        String s=" ";
        for(Esame e:esami){
            if(e.getVoto()!=0)
                s=e.getNome()+" "+e.getCFU()+" CFU "+e.getVoto();
        
        else
        s=e.getNome()+" "+e.getCFU()+" CFU : esame non sostenuto";
    }
    return s;
    }
    }
    Fin qui è compilato tutto correttamente...adesso arriva il dunque.L0esercizio mi chiede poi di scrivere un programma TestLibrettoEsami che legge da standard input una
    sequenza di linee della forma:

    esame#cfu#v (con input da un file.txt)

    Supponiamo che le linee sullo standard input siano

    programmazione#12#26
    basi di dati#12#25
    inglese#3
    architettura degli elaboratori I#6#24
    programmazione#12#28

    Il programma deve stampare:

    registro PROGRAMMAZIONE 12 CFU 26
    registro BASI DI DATI 12 CFU 25
    INGLESE 3 CFU : esame non sostenuto
    registro ARCHITETTURA DEGLI ELABORATORI I 6 CFU 24
    PROGRAMMAZIONE 12 CFU: esame gia` registrato

    CFU: 30 - Media: 25.2

    Anche qui dopo tante peripezie sono riuescita a scrivere a modo mio la seguente classe:
    codice:
    import java.util.*;
    class TestLibrettoEsami{
    public static void main(String[] args){
    Scanner sc = new Scanner(System.in).useDelimiter("[#\n]");
    LibrettoEsami l=new LibrettoEsami();
    while(sc.hasNext()){
    String materia=sc.next();
    
    System.out.println(l.toString());
    System.out.println(l.totCFU());
    System.out.println(l.mediaVoti());
    }
    }
    }
    Il problema è che in esecuzione il programma TestLibrettoEsami mi stampa 0Nan,cioè non mi riconosce nessuna istruzione da terminale.Perchè?Ho sbagliato qualcosa nella classe LibrettoEsami?
    Scusate per la lunghezza dell messaggio...ma in java sono proprio senza speranza

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    99
    Ci metteresti anche la classe Esame?

    We qui ci laureiamo in 2 però nè
    se mi chiedeste chi è per me un vero amico vi risponderei che è una persona che io considero alla pari di me.

  3. #3
    Utente di HTML.it L'avatar di el92
    Registrato dal
    Dec 2014
    Messaggi
    177
    ciao grazie 1000 per la risposta gentilissimo
    codice:
    class Esame{
        private String nome;
        private int cfu;
        private int voto;
        public Esame(String nome, int cfu, int voto){
            this.nome=nome;
            this.cfu=cfu;
            this.voto=voto;
        }
        public Esame(String nome, int cfu){
            this(nome,cfu,0);
        }
        public void setVoto(int voto){
            this.voto=voto;
    }
    public int getVoto(){
        return voto;
    }
        public int getCFU(){
            return cfu;
        }
        public String getNome(){
            return nome;
        }
        public boolean isSostenuto(){
            if(voto!=0 && voto<=30){
                return true;
            }else
            return false;
         }
         public String toString(){
             String s="il nome dell'esame è "+nome+" i cfu sono : "+cfu;
             if(isSostenuto()){
                  s=s+" il voto è : "+voto;
             }
             return s;
         }
    
    }
    Ultima modifica di el92; 26-02-2015 a 21:43

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    99
    Dunque,Il problema di fondo sai qual'è, non ci si improvvisa programmatori....( scusa non volevo fare il figo ma praticamente ho risposto qui solo per scrivere sta frase):

    TestLibrettoEsami: ancora non hai chiuso lo scanner...ti odio. Occhio che gli oggetti han dei metodi...usali nè! Adesso lo scanner si alimenta da file ".txt". Basta che metti un file di testo nel package dove hai la classe e ci incolli le righe che usi di esempio (io ho usato le tue e va....e ovviamente aggiusta a seconda del nome file il getResourceAsStream()).

    codice:
    public class TestLibrettoEsami{     private static InputStream in = null; 
        private static Scanner scan = null; 
        private static LibrettoEsami l = null;
        
        public static void main(String[] args) {
              
            scan = new Scanner(new TestLibrettoEsami().getClass().getResourceAsStream("esamiSostenuti.txt"));
            l=new LibrettoEsami();
            
            while(scan.hasNextLine()){ 
                     String[] d = scan.nextLine().split("#");
                     if(d.length == 3){
                             l.addEsame(new Esame(d[0],
                            isNumeric(d[1])?Integer.parseInt(d[1]):0,
                            isNumeric(d[2])?Integer.parseInt(d[2]):0)); 
                     }
                     else if(d.length == 2){
                             l.addEsame(new Esame(d[0],
                            isNumeric(d[1])?Integer.parseInt(d[1]):0)); 
                     } 
                     else{
                         System.out.println("Attenzione riga non valida!");
                     }
                 System.out.println("=================="); 
            }         
            scan.close();    
        }
          
        public static boolean isNumeric(String str)
        { 
            return str.matches("-?\\d+(\\.\\d+)?");  
        }
    }
    LibrettoEsami: Ok, messe un paio di sysout giusto per verifica...

    codice:
    public class LibrettoEsami{
    
        private  ArrayList <Esame> esami;
        final int numesami=40;
        private int cfu;
        private double media;
    
    
        public LibrettoEsami(){
            esami=new ArrayList <Esame>();    
            cfu=0;
            media=0.0;
        } 
    
    
        public boolean addEsame(Esame e){
             
            if(esami.size()<numesami&&esami.contains(e)){
                System.out.println("esame già registrato");
                return false;
            }else
                esami.add(e);
            System.out.println("Esame aggiunto: " + e.getNome() + "(cfu: " + e.getCFU() + " Voto:" +e.getVoto() + ")");
            return true;
        }
    
    
        public int totCFU(){
            for(Esame e:esami)
                this.cfu+=e.getCFU();
            return cfu;    
        }
        //media=sommaPesataVoti / sommaCrediti;
        public double mediaVoti(){
            double sommavoti=0.0;
            double sommaCrediti=0.0;
    
    
            for(Esame e:esami){
                sommavoti+=(e.getVoto()*e.getCFU());
                sommaCrediti+=e.getCFU();
            }
            media=sommavoti/sommaCrediti;
    
    
            return media;
        }
        public String toString(){
            String s=" ";
            for(Esame e:esami){
                if(e.getVoto()!=0)
                    s=e.getNome()+" "+e.getCFU()+" CFU "+e.getVoto();
    
    
                else
                    s=e.getNome()+" "+e.getCFU()+" CFU : esame non sostenuto";
            }
            return s;
        }
    }


    Esame: Qui c'è il trick!!!! ...vediamo se lo comprendi da sola.

    codice:
    public class Esame{    
        @Override 
        public boolean equals(Object obj) { 
            return (this.nome.equals(((Esame) obj).nome)
                    && this.cfu == ((Esame) obj).cfu 
                    //&& this.voto ==((Esame) obj).voto se anche il voto è determinante decommentare...
                    );
    
    
        }
        
        private String nome;
        private int cfu;
        private int voto;
        
        public Esame(String nome, int cfu, int voto){
            this.nome=nome;
            this.cfu=cfu;
            this.voto=voto;
        }
        
        public Esame(String nome, int cfu){
            this(nome,cfu,0);
        }
        
        public void setVoto(int voto){
            this.voto=voto;
        }
        
        public int getVoto(){
            return voto;
        }
        
        public int getCFU(){
            return cfu;
        }
        
        public String getNome(){
            return nome;
        }
        
        public boolean isSostenuto(){
            if(voto!=0 && voto<=30){
                return true;
            }else
                return false;
        }
        
        public String toString(){
            String s="il nome dell'esame è "+nome+" i cfu sono : "+cfu;
            if(isSostenuto()){
                s=s+" il voto è : "+voto;
            }
            return s;
        }
    
    
    }
    Ultima modifica di Gatsu78; 27-02-2015 a 00:02
    se mi chiedeste chi è per me un vero amico vi risponderei che è una persona che io considero alla pari di me.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    eh in realtà per i confronti con contains (visto che lo usa per la struttura dati) bisognerebbe anche implementare hashcode.
    Due oggetti si dicono uguali se hanno uguale hashcode e equals restituisce true. Se equals restituisce true, ma gli hashcode sono differenti, allora gli oggetti sono differenti.
    E' buona norma quindi fare l'override di entrambi i metodi, facendo attenzione di considerare per entrambi gli stessi campi.

    Altra nota: quando usi le risorse (di qualsiasi tipo) impara a suddividere tutto in 3 fasi
    1.apertura risorsa
    2.uso risorsa
    3.chiusura risorsa

    spesso questa fatta in un blocco final per essere sicuri che IN OGNI CASO venga eseguita.
    Un ultima osservazione: Esame ha diversi costruttori, uno prende 2 parametri, uno 3.
    Ha senso il avere 0 per i crediti formativi? Ha senso per il voto, significa che ancora non hai dato l'esame, per i crediti formativi no. Andrebbe quindi considerato un errore (quanto meno un IllegalArgument) avere inserito 0 come crediti formativi
    RTFM Read That F*** Manual!!!

  6. #6
    Utente di HTML.it L'avatar di el92
    Registrato dal
    Dec 2014
    Messaggi
    177
    ciao grazie 1000 per le risposte ...per il metodo equals della classe esame hai fatto l'Override della classe Object..fin qui ok...una sola domanda il metodo isNumeric ed matches della classe TestLibrettoEsami da dove caspirenzola li hai presi?
    Ultima modifica di el92; 27-02-2015 a 13:32

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    li ha scritti lui a suo uso e consumo (isNumeric).

    Matches è un metodo della classe String, vai a leggere la documentazione
    RTFM Read That F*** Manual!!!

  8. #8
    Utente di HTML.it L'avatar di el92
    Registrato dal
    Dec 2014
    Messaggi
    177
    Ciao grazie 1000

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    99
    Quote Originariamente inviata da valia Visualizza il messaggio
    li ha scritti lui a suo uso e consumo (isNumeric).

    Beh se mi lascia i diritti per "caspirenzola" potrei anche fare la follia di cederle "IsNumeric"
    se mi chiedeste chi è per me un vero amico vi risponderei che è una persona che io considero alla pari di me.

  10. #10
    Utente di HTML.it L'avatar di el92
    Registrato dal
    Dec 2014
    Messaggi
    177
    nooooo ho sbagliato a scrivere caspiterina .... vabbeh comunque grazie per le risposte

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.