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

    scrivere su file

    ho la necessita di scrivere i risultati di un test che sto facendo su gli algoritmi di ordinamento merge e quicksort, ora dopo che ho fatto il test dovrei scrivere la grandezza del'array e il tempo su file.quale classe usare e come?
    il tempo mi viene da un oggetto contatore frlla classe da me fatta cronometro sotto forma di tempo.gettempofinale() che è un long e la grandezza dell'array è un int.Ora sia in bufferedwriters che in altre classi che conosco non ho trovato nulla che facesse al mio caso.Non posso passargli un oggetto e scrivere righe successice nel file in momenti diversi
    Altra soluzione potrebbe essere di memorizzare in array provvisori.
    da questo debbo costruire un grafico che mi dimostri l'andamento delle rilevazioni ma come lo faccio e con che?
    vi ringrazio
    stefano

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    230
    Scusami ma se ho capito su ogni linea ci deve essere qualcosa del tipo:
    30 200
    che significa 30 elementi 20 millisecondi o qualcosa del genere.
    se è così non dovrebbe essere molto difficile scrivere sul file in qualsiasi istante che vuoi.


    codice:
    File f=new File("data.txt");
    //in questa maniera apri il file in modalità append senza sovrascrivere i dati in esso già presenti
    FileOutputStream fos=new FileOutputStream(f,true);
    PrintStream ps=new PrintStream(fos);
    ps.println("inserisci la dimensione vettore" + "il tempo" );
    Sinceramente non capisco molto quando dici:" Non posso passargli un oggetto e scrivere righe successice nel file in momenti diversi"
    Vorresti passare un oggetto al bufferWriter ?
    Perchè?

  3. #3
    obbiettivo: valutare se esiste una soglia minima per cui utilizzare il merge o il quicksort è indifferente
    Ho creato una classe cronometro con un oggetto tempo che legato al metodo gettempopassato() mi calcola il tempo per l'ordinamento nel main.Una classe per il merge e una per il quicksort.
    scelgo una grandezza di array ,lo popolo e poi eseguo per 5 volte la misurazione.
    salvo il tempo in un array temporaneo,quando ho svolto le 5 misurazioni calcolo la media e lo scarto quadratico medio e dovrei scrivere su file sia la grandezza array che il tempo medio calcolato.
    Pensavo di creare un file per il merge e uno per qwicksort.
    é chiaro che min proverò con 10 grandezze dell'array per vedere il comportamento.
    Come lo passo in scrittura al file tempo.gettempopassato() che è di tipo long,questo lo ottengo tramite l'oggetto tempo della classe cronometro.
    Ti do la struttura che ho pensato della classe eseguitest contenente il main

    class eseguitest

    metodo x inserire da tastiera la grandezza

    metodo x popolarlo

    metodo la media

    metodo x lo scarto

    main

    while(n<11)
    {
    inserisco la grandezza
    lo popolo
    while(i<5)
    {
    eseguo il test su merge
    scrivo su un array d'appoggio le 5 misurazioni
    }
    calcolo la media
    calcolo lo scarto
    qui dovrei scrivere su file media e grandezza o su un altro array

    la prima domanda è dove inserisco il test per quicksort?come faccio a scrivere poi i risultati?
    o ripeto il blocco anche per il quicksort o...???
    vale sempre il suggerimento che mi hai dato per scrivere su file.
    Poi debbo rileggere per poter elaborare un grafico cartesiano per vedere l'andamento secondo i punti rilevati(tempo e grandezza) e qui non so cosa fare e come
    Spero di essere stato un po + chiaro
    ti ringrazio
    stefano

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    230
    Per la parte sul grafico non posso aiutarti perchè non conosco i comandi in java ma sicuramente troverai qualcuno che ti aiuterà.

    Da quanto ho capito hai come problema principale modellare la struttura della classe eseguitest.
    Se fossi in te farei qualcosa del genere:
    codice:
    class TestOrdinamento {
    
    private int NMAX=10;//numero di elementi massimi nell array da ordinare
    privante int NMIS=10; //numero di volte da eseguire le misure  
    private int[] array = new int[NMAX]; //array di interi da ordinare
    private long[] timeArrayQs = new long[NMIS];//array dei tempi per il qs 
    private long[] timeArrayM = new long[NMIS];//array dei tempi per il merge 
    private long averageTimeQs;
    private long averageTimeM;
    public setArray( int[] array) ; //array da popolare in maniera random
    public long getAverageTime (long[] timeArray) timeArray è l'array in cui hai conservato le misuarazioni  dei tempi e su cui fai la media
    public long getVarTime(long[] timeArray) // calcola la varianza dei tempi ossia lo scarto quadratico medio
    public long merge(int[] array); //questo metodo esegue merge e restituisce il tempo necessario per ordinare (long)
    public long quickSort(int[] array);
    public strorageResult(String fileName,int dim, long averageTime) //salvi sul file la dimensione dell'array e il tempo medio.
    Per scrivere questo metodo serviti del codice che ti ho postato la volata scorsa.
    
    poi nel "main"
    
    int n=0;
    while (n<NMIS){ // esegui NMIS misuarazioni su array della stessa dimensioni ma con elementi diversi
    setArray(array);
    timeArrayM[n] = merge(array);
    timeArrayQs[n] = quickSort(array);
    n++; 
    }  
     
    averageTimeQs = getAveraTime(timeArrayQs);
    averageTimeM = getAveraTime(timeArrayM);
    //analogamente per gli scarti.
    infine metti tutto su due file
    storageResult(quickSort.txt,NMAX,averageTimeQs);
    storageResult(merge.txt,NMAX,averageTimeM);
    Questo è quanto mi è venuto in mente in prima battuta è probabile che il codice si può ottimizzare.
    Ciao

  5. #5
    il numero di prove per grandezza è cinque e prendero 10 grandezze a partire da 6000 non so con quale intervallo.
    ora mi studio bene il tuo listato ho solo 60 ore di lezione su java e non sono molto esperto e pensare che il prof dice che è facile la tesina
    grazie
    stefano
    ps se vuoi ti allego il mio eseguitest cosi lo vedi

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    230
    Originariamente inviato da stefanoceccoli
    il numero di prove per grandezza è cinque e prendero 10 grandezze a partire da 6000 non so con quale intervallo.

    Non ho capito molto bene...significa che fai 5 misure per un array di 6000 elementi, fai 5 misure per un array di 6666 elementi e così via fino ad arrivare a 10 grandezze?



    ora mi studio bene il tuo listato ho solo 60 ore di lezione su java e non sono molto esperto e pensare che il prof dice che è facile la tesina

    Beato te io ho avuto apena 2h di lezione su Java
    E' il primo corso di programmazione che segui?
    Se la tua tesina è il programma che stai scrivendo non sarà molto difficile, qualche tuo sforzo , qualcuno ti dà una aiutino e il gioco è fatto.

    grazie

    prego

    stefano
    ps se vuoi ti allego il mio eseguitest cosi lo vedi
    Puoi postarlo forse gli do un'occhiata ma ti preannuncio che in questo periodo sono alquanto incasinato...
    Ciao

  7. #7
    /**
    * @(#)eseguiTest.java
    *
    *
    * @author
    * @version 1.00 2007/5/28
    */



    //import java.io.BufferedWriter;
    //import java.io.FileWriter;
    //import java.io.IOException;
    import java.util.Random;
    import javax.swing.JOptionPane;
    public class eseguiTest
    {

    public static int grandezzaArray()
    {
    int s=0;
    boolean verifica=true;

    do
    {
    try
    {

    //acquisisci sia la lunghezza dell'array convertendolo in int
    s=Integer.parseInt(JOptionPane.showInputDialog("In serisci un numero positivo: "));
    if(s<=0)
    JOptionPane.showMessageDialog(null,"Non ha senso scrivere numeri negativi o uguali a zero ");
    else
    verifica=false;
    }
    catch (NumberFormatException e)
    {
    JOptionPane.showMessageDialog(null,"DEVI INSERIRE DEI NUMERI INTERI!");
    }
    }
    while(verifica);
    return s;
    }

    public static int[] creoArray(int x)
    {
    int[]a = new int[x];

    Random genera=new Random();
    for(int i=0;i<a.length;i++)
    {
    a[i]=genera.nextInt(100000);

    }
    return a;
    }

    public static int media(int[] v,int x)
    {
    int smma=0;
    for (int i = 0; i < v.length; i++)
    {
    smma=+v[i];
    }
    return (smma/x);
    }
    public static void main(String[] args){

    // variabili per la conversione delle variabili string p e o contenenti JOptionPane
    int[]appoggiotempo=new int[5];
    int[] mt =new int [10];
    int[] qt =new int [10];
    int[] gr =new int[10];


    // variabili per la conversione delle variabili string p e o contenenti JOptionPane
    int n=0;
    int h=0;
    int[] ordina;


    // creo oggetto per misurare tempo
    cronometro tempo=new cronometro();

    while(h<10)
    {
    int t = grandezzaArray();
    while(n<5)
    {
    //creo array con popolazione casuale
    ordina=creoArray(t);
    //for(int i=0;i<ordina.length;i++)
    // System.out.println(ordina[i]);
    //creo oggetto di ordinamento fusione e misuro prestazioni da ripetere 5 volte,aggiungo contatore per verificare cinque volte

    ordinamentoFusione eseguiOrdinamento=new ordinamentoFusione(ordina);
    tempo.parteCronometro();
    eseguiOrdinamento.sort(); //eseguo l'algoritmo per fusione
    //eseguiOrdinamento.getstampa();
    tempo.fermaCronometro();
    System.out.println("Il tempo è: " + tempo.gettempopassato() + " microsecondi per un Array di " + t + " elementi.");

    // metto dentro l'array appoggiatempo i 5 valori della prova ed
    // incremento l'array legandolo ad n, con cast di gettempopassato da long a int

    appoggiotempo[n]=(int)tempo.gettempopassato();
    n++;
    }

    mt[h]=media(appoggiotempo,n);
    h++;

    }
    /**



    //scrivo il risultato su file
    //int v=(int)tempo.gettempopassato();
    String nomeFile=JOptionPane.showInputDialog("Inserisci nome file da aprire con estensione");

    try
    {
    BufferedWriter scrivi=new BufferedWriter(new FileWriter(nomeFile));//apro file
    }
    catch (IOException e)
    {
    System.out.println("Errore in apertura file");
    nomeFile=null;
    }
    try
    {

    scrivi.write();
    }
    catch (IOException e)
    {
    System.out.println("errore in scrittura file " + e);
    System.exit(0);
    }
    */

    System.exit(0);
    }

    }

    debbo scegliere un array di grandezza es. 6000 poi popolarlo e testarlo per 5 volte faccio media e scarto questo per il merge e per il qs.scrivo su file il risultato,poi aumento la grandezza e stessa trafila.conta che il file è in corso d'opera è commentato x facilitare la comprensione.
    uso sempre ps.printlin("dimensione array" + "tempo"+ "scarto")
    come separatori cosa uso se mi servono?
    ciao

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    230
    Quello che ti posso consigliare è:

    1 Nel metodo media è inutile inserire il parametro x perchè già hai il numero di elementi che compongono il vettore è sono proprio v.lengh elementi

    2 i vettori che crei come int[] mt =new int [10] è preferibile che usi una costante come ho fatto io perchè se in futuro devi fare dei cambiamenti e dei controlli sul codice ti sarà molto + semplice cambiare il valore di una constatnte anzichè leggerti riga per riga il codice e trovare i valori stesso discorso vale per while(n<5) e se dovessi cambiare il numero di misurazioni ? che fai vai alla ricerca dei 5 che hai disseminato nel codice ?

    3Se conservi la tua classe come farai per lanciare l'altro algoritmo di ordinamento?
    riscrivi un'altra volta le istruzioni while(n<5)....
    Evidentemente non ti conviene o fai in modo che gli algoritmo di ordinamento magari con qualche metodo ti restituiscono anche il tempo impiegato ad esempio:
    ordinamentoFusione eseguiOrdinamento=new ordinamentoFusione(ordina);
    eseguiOrdinamento.tempo();
    oppure devi scrivere un altro metodo all'interno di eseguiTest ad esempio
    ordina( int[] array, boolean tipo, )
    cronometro tempo=new cronometro();
    if(tipo){
    ordinamentoFusione eseguiOrdinamento=new ordinamentoFusione(ordina);
    tempo.parteCronometro();
    eseguiOrdinamento.sort(); //eseguo l'algoritmo per fusione
    tempo.fermaCronometro();
    return tempo.gettempopassato();
    }
    else{
    esegui l'altro algorito
    }
    anche se io preferire la prima strada.

    4 Perchè fai il casting ad int del tempo?
    5 La parte di istruzioni in cui salvi il valore ti conviene fare un metodo a parte.
    6 penso che ps.printlin("dimensione array" + "tempo"+ "scarto") sia per long che interi a limite prova a vedere la documentazione della classe printstream

    7 come separatori puoi usare lo spazio quindi:
    ps.println("dimensione array"+" "+"tempo"+" "+ "scarto");

    Ciao
    PS nel mio codice ho commesso un errore non si può fare
    merge(array)
    quicksort(array)
    perchè dopo che il merge ha fatto l'ordinamento su array, quick sort avrà un array già ordinato c'è bisogno di un 'altra variabile.

  9. #9

    ringraziamenti

    i tuoi suggerimenti sono stati preziosi sono riuscito a trovare la maniera di duplicare il blocco che elabora il merge per il quicksort all'interno del secondo while azzerando il cronometro e ripetendo le righe di codice solo pero con oggetto di classe quicsort che ho creato a parte (come per il merge).
    raffino il codice poi te lo mando chiaramente quando puoi vederlo che non sei impegnato
    grazie dell'aiuto
    stefano

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.