Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110

    [JAVA] Frequenza carattere

    Ciao a tutti,
    devo programma che conti il numero delle volte che una cifra appare in un numero telefonico. Il numero telefonico deve essere letto da tastiera come stringa. Esaminare ogni carattere del numero telefonico e incrementare il conteggio relativo alla cifra dell'array.
    Ho abbozzato questo codice ma non so come confrontare le cifre della stringa con gli indici dell'array e, di conseguenza, come incrementare i valori di quest'ultimo.
    Potreste darmi una mano? Grazie


    Ecco il mio codice:


    codice:
    public static void frequenzaCarattere(){
        Scanner tastiera = new Scanner(System.in);
        String numerotelefono = "";
        int[] frequenza = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
        
        System.out.println("Inserire numero di telefono: ");
        numerotelefono = tastiera.nextLine();
        
        for(int i = 0; i < numerotelefono.length() ; i++)
        {
            int carattere = numerotelefono.charAt(i);
            for(int k=0;k<frequenza.length;k++)
            {
            
                    
            }
                    
        }
        
        for(int j=0;j<frequenza.length;j++)
        {
            System.out.println("La frequenza del carattere " + numerotelefono.charAt(j) + " è: " + frequenza[j]);
        }
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Hai fatto quasi tutto, ma ti perdi davanti al passaggio finale: sai che stai leggendo una stringa numerica, la stai già passando in rassegna carattere per carattere, ovvero cifra per cifra... allora in pseudocodice
    codice:
    frequenza[carattereNumericoLettoInEsame]++;
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110
    Avevo provato ma mi esce errore per aver sforato dei termini.

    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 48
    at Arrays.frequenzaCarattere(Arrays.java:81)
    at Arrays.main(Arrays.java:100)

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    perché l'intero che ti tira fuori è il codice ascii del carattere. Per intenderci, 0 corrisponde a 48, 1 a 49 etc etc.
    codice:
            for(int i = 0; i < numerotelefono.length() ; i++) {
                int carattere = numerotelefono.charAt(i)-48;            
                frequenza[carattere]++;
            }
    Ultima modifica di Andrea1979; 01-12-2016 a 21:09
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110
    Credo di essermi perso qualcosa... da quando mi tira fuori un codice ascii invece che il carattere?
    Per inciso, ho fatto così come hai detto tu:

    codice:
    int carattere = numerotelefono.charAt(i);
    		for(int k=0;k<frequenza.length;k++)
    		{
    			frequenza[carattere]++;
    				
    		}
    				
    	}
    devo forzare una conversione int da qualche parte?

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    codice:
    import java.util.Scanner;
    /**
     *
     * @author Andrea
     */
    public class FrequenzaCarattere {
    
    
        public static void frequenzaCarattere() {
            Scanner tastiera = new Scanner(System.in);
            String numerotelefono = "";
            int[] frequenza = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
            
            System.out.println("Inserire numero di telefono: ");
            numerotelefono = tastiera.nextLine();
    
    // questo controllo solo per la consistenza del dato inserito
            if (!numerotelefono.matches("\\d*")) {
                System.err.println("Errore formato");
                System.exit(0);
            }
    // fine controllo dato numerico
            
            int carattere;
            for(int i = 0; i < numerotelefono.length() ; i++) {
                carattere = numerotelefono.charAt(i)-48;            
                frequenza[carattere]++;
            }
            
            for(int j=0; j <frequenza.length; j++) {
                System.out.println("La frequenza del carattere " + j + " è: " + frequenza[j]);
            }
        }
    
    
        public static void main (String[] args) {
            frequenzaCarattere();
        }
    
    
    }
    Ultima modifica di Andrea1979; 02-12-2016 a 10:05
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110
    Innanzitutto grazie!
    Allora, ho fatto come dici tu ma il numero mi viene contato moltiplicato per 10, com'è possibile?

    codice:
    for(int i = 0; i < numerotelefono.length() ; i++)
    	{
    		int carattere = numerotelefono.charAt(i) -48;
    		for(int k=0;k<frequenza.length;k++)
    		{
    			frequenza[carattere]++;
    				
    		}
    codice:
    Inserire numero di telefono: 
    123456789
    La frequenza del carattere 0 è: 0
    La frequenza del carattere 1 è: 10
    La frequenza del carattere 2 è: 10
    La frequenza del carattere 3 è: 10
    La frequenza del carattere 4 è: 10
    La frequenza del carattere 5 è: 10
    La frequenza del carattere 6 è: 10
    La frequenza del carattere 7 è: 10
    La frequenza del carattere 8 è: 10
    La frequenza del carattere 9 è: 10
    E in generale, per capire, quando è che mi viene restituito il valore ascii invece del valore primitivo che ho dichiarato?

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Vedo un ciclo for annidato. Facendo un tracciato di quello che succede nel tuo codice:
    codice:
    1) Inserisco 123456789
    2) Ciclo for esterno (int i ...) => 
          assegno a int carattere il valore 1;
           3) Ciclo for annidato (int k ...) 
               k=0 -->    frequenza[1]++; // => frequenza[1] = 1;
               k=1 -->    frequenza[1]++; // => frequenza[1] = 2;
                  ....
               k = 9 --> frequenza[1]++; => frequenza[1] = 10;
          esco dal ciclo for annidato
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  9. #9
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110
    Giusto, ho risolto togliendo il secondo ciclo!
    Grazie!

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.