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

    Java-Esercizio sequenze

    Ho questo esercizio, banale lo sò...ma non riesco a venirne a capo
    Questo è il testo:
    Scrivere un programma Java che legga da un file di input alcune sequenze di valori interi e determini, per ogni sequenza, se tutti i numeri siano diversi l'uno dall'altro e, in caso negativo, ritorni i numeri che vengono ripetuti in ordine di apparizione. Si supponga che le sequenze in input non contengano più di 100 elementi e che i valori contenuti nelle sequenze siano compresi tra 0 e 100.

    Input
    La prima riga del file di input contiene il numero di sequenze memorizzate nel file. Le sequenze sono memorizzate dalla seconda linea in poi, una sequenza per riga. Il primo valore di ogni riga rappresenta il numero di elementi presenti nella sequenza. Gli elementi di ogni riga sono separati da uno spazio.

    Output
    Il file di output contiene tante righe quante sono le sequenze in input. Ogni riga contiene il simbolo “-” se nella sequenza corrispondente non sono presenti dei valori ripetuti. Se uno o più valori sono ripetuti all'interno della sequenza, la riga corrispondente contiene la sequenza dei valori ripetuti in ordine di apparizione.


    Questo il mio codice:
    codice:
    import java.util.Scanner;
    import java.io.*;
    
    public class ValoriDistinti
    {
    	public static void main (String[]args) throws IOException
    	{
    		/**inizialiazzo qui i due valori, per poi essere viasibili anche nel blocco try e finally
    		ed li metto a null per capire se nel blocco finally deve essere richiamato il metodo .close()
    		*/
    		
    		Scanner s=null;
    		FileWriter out=null;//FileWriter dobbiamo scrivere sul file il nostro output
    		
    		//si possono creare delle eccezioni, quindi è buona regola gestirle
    		try
    		{
    			/** non c'è bisogno di creare FileReader, basta creare un'istanza della classe File e passarla come parametro al 
    			costruttore della classe Scanner*/
    			s= new Scanner(new File("input.txt"));
    			out=new FileWriter("output.txt");
    			
    			/** Nel testo si dice che il file è costituito da una sequenza di righe, dove il primo valore 
    			di ogni riga è il numero di elementi presenti nella sequenza.
    			Quindi leggo il numero di righe...*/
    			final int numRighe=s.nextInt();//restituisce un valore numerico intero...il numero di righe appunto.
    			
    			//Per ogni riga...
    			for(int i=0; i<numRighe; i++)
    			{
    				/** il formato del file prevede che il primo numero di ogni riga rappresenti il numero di 
    				elementi di cui essa è composta. Quindi dobbiamo leggere il numero di elementi per riga
    				*/
    				final int numElementi=s.nextInt();
    				
    				int diversi=0;
    				//devo controllare adesso se vi sono due numeri uguali
    				//int numB=0;
    		
    				
    				//scorro la sequenza di numeri per il confronto
    				for(int j=0;j<numElementi; j++)
    				{
                                           //leggo i numeri
    					final int numA=s.nextInt();
                                            final int numB=s.nextInt();
    					//e lo confronto
    					if(numA!=numB)
    						diversi++;
    				}
    				
    				if(diversi >0)//quindi ci sono numeri diversi tra di loro
    				out.write ("-");
    					else
    					out.write(numElementi()); //secondo me l'errore è qui :-(
    					
    					//se devo processare altre righe,vado a capo
    					if(i<numRighe-1)
    						out.write('\n');
    			}
    		}
    
    		
    		//il blocco finally viene eseguito SEMPRE,sia se c'è eccezione, sia se non si verifica alcuna eccezione
    		
    		finally
    		{
    			if(s!=null)
    				s.close();
    			if(out!=null)
    				out.close();
    		}
    }
    }

  2. #2
    Nessuno sa darmi un aiuto?

  3. #3
    ma il problema, di preciso, qual è?

  4. #4
    Il problema è che non funziona, mandandolo in esecuzione mi dà il seguente errore:
    Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at ValoriDistinti.main(ValoriDistinti.java:48)

  5. #5
    non posso compilare il codice ma mi chiedo: il file input.txt esiste ed è nella stessa directory del file .class?

  6. #6
    si si, per evitare errori ho salvato tutto nella stessa cartella

  7. #7
    Intanto dovresti cambiare

    codice:
    out.write(numElementi());
    in

    codice:
    out.write(numElementi);
    Inoltre, l'algoritmo per la ricerca di eventuali duplicati non è corretto.
    Assumiamo che la sequenza sia così composta:

    7 2 7 5

    Con il codice che hai scritto i controlli vengono effettuati due a due:
    - confronta il primo 7 con il 2 ed essendo diversi tutto va bene,
    - a questo punto il cursore è posizionato sul secondo 7 che confrontato con il 5 non darà problemi.

    La soluzione migliore è confrontare ogni elemento ricevuto in input con tutti quelli sino ad ora letti.
    Oppure, dal momento che si conosce il valore massimo N dei valori in input, si potrebbe pensare ad un array di N + 1 elementi inizializzati a 0.
    Letto un valore dal file si setta a 1 l'elemento con indice uguale al valore appena ricevuto:
    Es:

    - Array Doppioni

    0 0 0 0 0

    Leggo il valore 2 dal file

    codice:
    array[2] = 1
    - Array Doppioni

    0 0 1 0 0

    Se leggo un altro 2 e array[2] != 0 significa che l'elemento è già stato inserito.

  8. #8
    Grazie mille, adesso provo così

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.