Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755

    anomalia nella stampa di un indice nel for

    Nel comporre il codice di un esercizio trovato su un forum da un utente in cerca di aiuto mi sono imbattuto in una (almeno apparente) anomalia di stampa...innanzitutto vi posto in cosa consiste il programma e a seguito il codice da me scritto:

    Traccia esercizio:
    Leggere dal file Input2.txt un testo e data una stringa STR visualizzare a video, per ogni riga del file di input che contiene la sottostringa STR il numero di riga stessa e il numero di volte che STR è presente.

    Esempio:

    Input2.txt:
    4
    La casa è bella ed è una casa costosa
    Nella sua casa ci sono tante stanze
    In giardino non ci sono ancora piante
    All’interno della casa le porte sono sempre aperte

    STR=casa

    Output (a video):
    1 2
    2 1
    4 1


    Mio codice:
    codice:
    import java.util.Scanner;
    import java.io.FileReader;
    
    class Leggi2 {
    
    	public static void main (String [] args) throws Exception {
    		Scanner s = new Scanner (new FileReader ("Input2.txt"));
    		String chiave = "casa";
    		int n = s.nextInt ();
    		int n1;
    		for (int i=0;i<=n;i++) {
    			n1 = numeroOccorrenze (s.nextLine () , chiave);
    			if (n1 != 0) {
    				System.out.println (i + "\t" + n1);
    			}
    		}
    	}
    
    	public static int numeroOccorrenze (String riga , String chiave) {
    		int numero = 0;
    		int indice;
    		while ((indice = riga.indexOf (chiave)) != -1) {
    			numero++;
    			riga = riga.substring (indice + chiave.length ());
    		}
    
    		return numero;
    	}
    
    }

    Quello che non mi torna è alla riga in grassetto , dove mettendo i , a mio avviso viene stampato (i+1)
    secondo quello che era la mia previsione , mettendo nel codice "i" sarebbe dovuto uscire a video:

    0 2
    1 1
    3 1

    mentre invece esce:

    1 2
    2 1
    4 1

    che è proprio quello voluto...ma il perchè avviene ciò?c'è qualcosa che mi sfugge?

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Tu usi nextInt() per leggere la prima riga... ma in realtà non leggi la prima riga, bensì solo i caratteri fino al newLine (escluso!). Poi passi ad usare nextLine() e la prima volta verrà invocato proprio sul newLine() che avevi avanzato nella prima lettura. Ecco perchè ti stampa gli indici a partire da 1: perchè la prima "riga" (il newLine che non hai letto con nextInt()) per lui è senza occorrenze.

    Cerco di essere più chiaro. La prima riga di quel file è così composta (in esadecimale, supponendo di essere sotto Windows):

    codice:
    0x34 0x0d 0x0a
    Il metodo nextInt() legge solo il carattere 0x34... i rimanenti due caratteri verranno letti dalla prima invocazione di nextLine().

    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
    Nov 2009
    Messaggi
    755
    Era proprio quello che pensavo...grazie mille!

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.