Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Richiesta di aiuto per rendere il mio codice leggibile!!!!

    Ciao a tutti!!!
    Sono una nuova utente, mi sono affacciata al modo Java da pochissimo e ho un minimini background in C/C++.

    Dopo giornate di scervellamento ho finalmente ottenuto un codice che fa quello che voglio...il problema che ho ora peró é che devo renderlo a classi, ovvero ora ho tutto in main, ed ovviamente non é quello che voglio...

    Dunque il mio codice fa:
    legge una serie di punti da file, raggruppa questi in punti di tre in tre e calcola le medie sulle y. Ad una ad una compara le medie e restituisce le rispettive x quendo si ha un "salto" nelle medie.

    Di seguito il mio codice...
    Allego anche il txt, e aggiungo che nel caso di questo txt di esempio il programma mi devo restituire primo jump x=21, secondo jump x=104, T = 83.

    Lo fa.. ma non ho la piú pallida idea di come rendere il tutto object oriented....

    Qualcuno che mi possa aiutare???

    grassssie

    codice:
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.Reader;
    import java.util.StringTokenizer;
     
    public class ReadFile {
         
        public static void main(String[] args) throws IOException 
        {
        
    
        BufferedReader br = null;
     
        
        try{
            String line;
            /*interval for calculating average, 100ns*/
            int n=3; 
            /*energy threshold, change in average indicating a jump*/
            double m=3; 
            /*other constants*/
            int j=0, k=0; 
            double Sum=0, Ave1=0, Ave2=0; 
            double T1=0, T2=0, T=0;
            boolean first_time = true, first_time_ave = true, second_time_ave = true;
            
            br = new BufferedReader(new FileReader("prova2.txt"));
            
            
            while ((line = br.readLine()) != null) 
            {
               
               StringTokenizer stringTokenizer = new StringTokenizer(line, " ");
               
                        
              while (stringTokenizer.hasMoreElements()) 
               {
                  double x = Double.parseDouble(stringTokenizer.nextElement().toString());
                  double y = Double.parseDouble(stringTokenizer.nextElement().toString());
                  
                  
                  if (k == 0 && first_time_ave == true) T1=x; //fissare il primo elemento x per il primo salto
                  else if (k == 0 && first_time_ave == false && second_time_ave == true) T2=x;    //fissare ogni volta il primo elemento, secondo salto
                  
                  if(k<n)
                    {    
                          Sum += y;
                          k++;
                          System.out.println("y = " + y);    
                    }
                    
                    if(k==n)
                    {   
                        if(first_time == true)
                            {
                                Ave1=Sum/3;
                                System.out.println("sum y = " + Sum);
                                System.out.println("Ave.1 = " + Ave1);
                                first_time = false;
                                Sum=0;
                                   k=0;
                            }
                        
                            else 
                                {   
                                    Ave2=Sum/3;
                                    System.out.println("sum y = " + Sum);
                                    System.out.println("Ave.i = " + Ave2);
                                    
                                     
                                if (Math.abs(Ave1-Ave2) > m)
                                    {        
                                        if(first_time_ave == true)
                                            {
                                                System.out.println("First jump at x = " + T1);
                                                Sum=0;
                                                   k=0;
                                                   Ave1=Ave2;
                                                   Ave2=0;
                                                   first_time_ave = false;
                                            }
                                        else 
                                            {    
                                                System.out.println("Second jump at x = " + T2);
                                                
                                                Sum=0;
                                                   k=0;
                                                   Ave1=Ave2;
                                                   Ave2=0;
                                                   second_time_ave = false;
                                            }        
                                    }
                                else 
                                    {        
                                            Sum=0;
                                            k=0;
                                            Ave1=Ave2;
                                            Ave2=0;
                                    }
                                }
                    
                    }
                        StringBuilder sb = new StringBuilder();
                      
                   
               }
        
        }
            if (second_time_ave == true) System.out.println("Recoil at t = " + T1 + " But NO alpha decay");
            else {
                    T = Math.abs(T1-T2);
                    System.out.println("\nDifference in time is : T = " + T + "\n");
                }
            System.out.println("Done\n");
        }
        
        
        catch (NumberFormatException e) 
            {
                System.out.println(e.toString());
            }
        finally 
            {
                try 
                    {
                        if (br != null)
                        br.close();
                    } 
                catch (IOException ex) 
                    {
                        ex.printStackTrace();
                    }
         
        }
        }
    }
    File allegati File allegati
    Ultima modifica di LeleFT; 02-07-2015 a 11:47 Motivo: Aggiunti i tag CODE

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Java ha un forum dedicato.
    Sposto.

    PS: quando posti del codice nel forum, inseriscilo all'interno degli appositi tag [CODE] .. [/CODE], così da mantenere formattazione ed indentazione.

    Correggo io.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Ciao, dal codice che hai postato in realtà non vedo l'esigenza di creare delle classi: le operazioni che compi sono strettamente legate alla lettura del file, e a riconoscere a che punto sei della lettura, mentre ci sono relativamente poche operazioni sui dati che leggi.

    Diverso sarebbe se leggessi da file dati su persone, libri, cd o qualsiasi cosa per cui una classe con variabili e metodi propri sarebbe molto utile, o se dovessi gestire un'interfaccia potresti avere una classe per la lettura del file, una per l'interazione con l'utente etc.

    Penso che in un codice come questo potresti al massimo inserire dei metodi : ad esempio leggi i primi tre punti da file e passi i punti ad un metodo che calcola le medie , volendo poi passi le medie ad un altro metodo che le compara e così via, così sicuramente il codice è organizzato meglio dal punto di vista logico e anche visivo.

    Comunque per essere impegnata con java da così poco tempo come dici, usi nel codice alcune cose che molti imparano tempo dopo, una cosa che puoi evitare di fare è testare un valore boolean nella condizione if scrivendo if(variabile_boolean == true) visto che questo è esattamente uguale a scrivere if(variabile_boolean) quindi nel tuo caso la riga:
    codice:
    if(k ==0&& first_time_ave ==false&& second_time_ave ==true)
    


    puoi scriverla come

    codice:
    if(k ==0&& !first_time_ave && second_time_ave) //! è la negazione per un valore boolean 
    
    


    Però oltre a pensare se ti conviene aggiungere qualche metodo per dividere i compiti non vedo l'esigenza di dovere dividere il tutto in più classi
    Ultima modifica di Ansharja; 02-07-2015 a 15:04

  4. #4
    Ciao! E grazie della risposta... dunque per ora ho fatto quanto segue, un codice che ha un metodo che calcola le medie e dovrebbe restituirmi la differenza tra esse... peró mi dá errori tipo...

    non-static variable this cannot be referenced from a static context
    return this.first_time_ave; }

    peró se non metto i getter con this.nomevariabile mi crea problemi per variabili non statiche chiamate nella main statica...

    Cosa sto sbagliando?

    codice:
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.Reader;
    import java.util.StringTokenizer;
     
    public class ReadFileee
    {
        /*interval for calculating average, 100ns*/
    
        private boolean first_time_ave=true, second_time_ave=true;
        private double Sum=0, Ave1=0;
        boolean first_time = true;
        private int k=0;
        
        public static void main(String[] args) throws IOException 
        {
            int n=3; 
            int k=0;
            double sum=0;
            
            double T1=0, T2=0;
            
            boolean first_time = true;
            
            
            
        BufferedReader br = null;
     
        
        try{
            String line;
            br = new BufferedReader(new FileReader("prova2.txt"));
            
            
            while ((line = br.readLine()) != null) 
            {
               
               StringTokenizer stringTokenizer = new StringTokenizer(line, " ");
               
               while (stringTokenizer.hasMoreElements()) 
               {
                  double x = Double.parseDouble(stringTokenizer.nextElement().toString());
                  double y = Double.parseDouble(stringTokenizer.nextElement().toString());
                  
                  if (k == 0 && getFirst_time_ave()) T1=x; //fissare il primo elemento x per il primo salto
                  else if (k == 0 && !getFirst_time_ave() && getSecond_time_ave()) T2=x;    //fissare ogni volta il primo elemento, secondo salto
                  
                  if(k<n)
                    {    
                          sum += y;
                          
                          k++;
                          System.out.println("y = " + y);    
                    }
                    
                      //Qui posso chiamare il metodo che legge somma e fa la media?
                  
                  if(k==n) {
                      
                      setSum(sum);
                      
                      if(first_time==true) {
                          Average1(getSum());
                          first_time = false;  
                      }
                         
                      
                      //double DiffInAve = 
                                  
                  //System.out.println("Difference in Averages is D =" + DiffInAve );
                                              
                  //k=0;
                      else {
                          double DiffInAve = Average2(getSum());
                          System.out.println("Difference in Averages is D =" + DiffInAve );
                              }
                          
                      }
                  
                  
                  }
                  
                    
                  
               }
              
            
    
            
    
        }
        
        catch (NumberFormatException e) 
        {
            System.out.println(e.toString());
        }
    finally 
        {
            try 
                {
                    if (br != null)
                    br.close();
                } 
            catch (IOException ex) 
                {
                    ex.printStackTrace();
                }
     
        }
        }
        
        
        
        public static void Average1(double S)
        {
            double ave1=0;
            
            
                ave1=S/3;
                setAve1(ave1);
                System.out.println("sum y = " + S);
                System.out.println("Ave.1 = " + getAve1());
                //first_time = false;
                S=0;    
                
                //return Ave1;
            }
        
        
        public static double Average2(double S)
        {
        double D=0;
            double Ave2=0, A=0, K=0;
             
                    Ave2=S/3;
                    System.out.println("sum y = " + S);
                    System.out.println("Ave.i = " + Ave2);
                    A=getAve1();
                    A=Ave2;
                    //Ave1=Ave2;
                    
                
            D=(A-Ave2);
            Ave2=0;
            S=0;
               
            K=getK();
            K=0;
            
            return D;
                    
        }
        
        /*public double Averages()
    { return this.Averages; }*/
        
        public static boolean getFirst_time_ave()
        {     //this.first_time_ave = first_time_ave;
            return this.first_time_ave; }
        
        public static boolean getSecond_time_ave()
        { return this.second_time_ave; }
        
        public static boolean getFirst_time()
        { return this.first_time; }
        
        public static double getSum()
        { return this.Sum; }
        
        public static double getT1()
        { return this.T1; }
        
        public static double getT2()
        { return this.T2; }
        
        public static double getK()
        { return this.k; }
        
        public static double getAve1()
        { return this.Ave1; }
        
        public static void setSum(double sum)
        {}    
        
        public static void setAve1(double ave1)
        {}    
        
    }
    Ultima modifica di java_beginner; 05-07-2015 a 15:56

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Per capire tutti quegli errori in compilazione ti dev'essere chiara la distinzione tra variabili/metodi statici (o di classe)e variabili/metodi di istanza (o non statici),trovi molta documentazione online e cartacea, questo è un punto cruciale della programmazione a oggetti quindi dai un'occhiata.

    Ti faccio un po' di esempi per chiarire i tipi di errore che puoi fare se non sai bene quando usare variabili/metodi statici e quando no:

    codice:
    public class ProvaThis
    {
        int campo=3;
        public static void main(String[] args)
        {
            
        }
        public static int getCampo()
        {
            return this.campo;
        }
    }
    In questo esempio l'errore è nel metodo getCampo(): il metodo è definito come statico, quindi è un metodo di classe e deve essere richiamato sulla classe a cui appartiene.Invece la scrittura return this.campo sta dicendo di ritornare la variabile campo propria dell'istanza su cui viene richiamato il metodo.Questo produce il seguente errore in compilazione:

    ProvaThis.java:10: error: non-static variable this cannot be referenced from a static context
    return this.campo;
    ^

    Se tu definisci il metodo getCampo() come non statico quindi: public int getCampo(), il programma compila.

    Una volta che il metodo è definito come metodo d'istanza però ,deve essere richiamato su un'istanza della tua classe e non sulla classe stessa.Questo è l'errore che faccio nel seguente esempio:

    codice:
    public class ProvaThis
    {
        int campo=3;
        public static void main(String[] args)
        {
            int provaCampo=getCampo();
        }
        public int getCampo()
        {
            return this.campo;
        }
    }
    La scrittura int provaCampo=getCampo(); ,equivale a scrivere int provaCampo=ProvaThis.getCampo(); cioè il metodo getCampo lo stai implicitamente richiamando sulla classe ProvaThis e non su un'istanza della classe.Quindi avrai il seguente errore in compilazione:

    ProvaThis.java:6: error: non-static method getCampo() cannot be referenced from a static context
    int provaCampo=getCampo();
    ^

    Per correggere questo errore puoi quindi istanziare un oggetto della tua classe e richiamare il metodo su quell'istanza, ad esempio:

    codice:
    ProvaThis p=new ProvaThis();
    int provaCampo=p.getCampo();
    Sostituendo la riga 6 con queste due righe non avrai più problemi in compilazione.

    Ha senso quindi chiedersi se ha senso definire metodi/ variabili come statici oppure no.
    Questo dipende da molte cose, ma a mio parere istanziare un oggetto solo per richiamarci sopra un metodo (come faresti nel tuo caso istanziando un oggetto della classe ReadFileee solo per evitare l'errore in compilazione)non ha molto senso, quindi tanto vale dichiarare tutto come statico, anche se non è molto elegante e va un po' contro alla logica di programmazione ad oggetti.

    Se però decidi di usare i metodi statici non basta togliere il this. dai tuoi metodi, ad esempio se compili questo codice avrai ancora un errore in compilazione:

    codice:
    public class ProvaThis
    {
        int campo=3;
        public static void main(String[] args)
        {        
        }
        public static int getCampo()
        {
            return campo;
        }
    }
    ProvaThis.java:9: error: non-static variable campo cannot be referenced from a static context
    return campo;
    ^

    In questo caso l'errore è nella riga return campo; , anche in questo caso scrivere campo corrisponde a scrivere ProvaThis.campo, quindi stai usando campo come variabile di classe ma l'hai definita come variabile d'istanza.

    Quindi risolvi l'errore definendo static int campo=3.


    Per tornare al tuo codice se vuoi usare tutti i metodi statici , togli tutti i this. dai vari return e definisci le variabili come statiche,oppure definisci i metodi togliendo lo static e poi nel main (e in qualsiasi altro metodo) quando usi il metodo lo richiami su un'istanza della tua classe.
    Ultima modifica di Ansharja; 05-07-2015 a 20:08

  6. #6
    Ok ho preso l'idea... mi ci devo scervellare un po' sicuramente, ma il tuo messaggio mi ha sicuramente aiutato a chiarirmi le idee!
    Mi rimetto al lavoro e ti faró sapere... grazie mille!

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Prego

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.