Ragazzi ultimamente ho partecipato ad una "Gara di Programmazione" creata dal mio professore di programmazione Java. Questa gara(con frequenza settimanale...cioè ogni venerdì riparte per concludersi domenica!) prevede la risoluzione di un progetto che viene assegnato al "candidato". Il progetto non dovrà solo fornire un output corretto ma anche un tempo di risoluzione molto basso in quanto viene stilata una classifica generale dei progetti con i rispettivi tempi d'esecuzione. I 3 progetti con i tempi più bassi potrebbero avere un'agevolazione all'esame scritto(in pratica si possono concentrare solo sull'esame orale!). Il progetto di questa settimana lo potete trovare al seguente LINK insieme al file di input fornito dal professore mentre la mia risoluzione è la seguente:
codice:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.BufferedWriter;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Locale;
public class asterix {
private static int b,h; //Dimensioni di ogni strato della piramide
private static double peso;
public static int getBase()
{
return b;
}
public static int getAltezza()
{
return h;
}
public static double getPeso()
{
return peso;
}
public static void setBase(int bb)
{
b=bb;
}
public static void setAltezza(int hh)
{
h=hh;
}
public static void setPeso(double peso1)
{
peso=peso1;
}
public static String calcola(int h,int k,double ps)
{
int area=0,lung=0,alt=0;
double pstot=0;
//Importante: l'altezza della piramide la stabilisce il valore più piccolo tra h e k. Es. h=6 k=4 l'altezza della piramide sara' 4
if(k >= h)
{
lung = k;
alt = h;
area=(((h*(h+1)*((2*h)+1))/6))+((k-h)*((h*(h+1))/2));//Formula per calcolare il numero totale di mattoni
}
else
{
lung = h;
alt = k;
area=(((k*(k+1)*((2*k)+1))/6))+((h-k)*((k*(k+1))/2));//Formula per calcolare il numero totale di mattoni
}
for(int i = alt; i > 0; i--)
pstot += (lung--*alt)*(ps+(alt---1));
DecimalFormat df = new DecimalFormat("0.00", new DecimalFormatSymbols(Locale.ITALIAN)); //Mi serve per impostare il numero di cifre dopo la virgola a 2
return area + " " +df.format(pstot)+"Kg";
}
public _static void LeggiFile(String nome) throws IOException
{
FileReader input = null;
FileWriter output = null;
BufferedReader in = null;
BufferedWriter out= null;
try
{
input=new FileReader("input.txt");
in=new BufferedReader(input);
output=new FileWriter("output.txt");
out=new BufferedWriter(output);
String str="";
while((str=in.readLine())!=null)//Fino a quando non arrivo a fine file
{
out.write(doit(str));
out.newLine();
}
}
finally
{
in.close();
input.close();
out.close();
output.close();
System.out.println("*** _ DONE _ ***");
}
}
public static String doit(String s)
{
_ _ _String [] temp = s.replaceAll("kg", "").split(" ");
_ _ _ _ _ _ _//Dalla stringa sostituisco la parola "kg" con un carattere di spazio e poi elimino tutti gli spazi inserendo i 3 numeri in un array di 3 posizioni
_ _ _return dump(temp);
}
public static String dump(String []s)
{
_ _ _ _ _ _//Converto i valori di ogni posizione in numeri interi e in double perche' i primi due valori sono le dimensioni e il terzo e' il peso di ogni mattone che sta' sulla sommita' della piramide
setBase(Integer.parseInt(s[0]));
setAltezza(Integer.parseInt(s[1]));
setPeso(Double.parseDouble(s[2]));
return calcola(getBase(),getAltezza(),getPeso());
}
public static void main(String arg[])throws IOException
{
LeggiFile("input.txt");
}
}
La mia domanda è: "per quanto il mio output sia corretto il codice è risultato abbastanza lento(la media dei tempi d'esecuzione del mio file ha dato come risultato: 984.00millisecondi) .....in cosa potrei migliorare questo codice?Dove secondo voi perde tempo?Aspetto vostre notizie . Grazie a tutti.