Esercizio carattere che si ripete di più

di il
28 risposte

Esercizio carattere che si ripete di più

Questo esercizio va bene? Ci sono modi per farlo meglio?
package vacanze_estive_7;

/**
 *
 * @author OOO
 */
import java.util.*;
import javax.swing.JOptionPane;

public class Vacanze_estive_7 {

    public static void main(String[] args) {

        Random generatore = new Random();
        String output = "";
        char caratteri[] = {'Q',
            'A', 'Z', 'W', 'S', 'X', 'E', 'D', 'C', 'R', 'F',
            'V', 'T', 'G', 'B', 'Y', 'H', 'N', 'U', 'J', 'M', 'I', 'K', 'O', 'L', 'P'};

        String input = JOptionPane.showInputDialog("Quanto vuoi che sia grande il vettore? ");
        int grandezza = Integer.parseInt(input);
        int cont1 = 0;
        int cont2 = 0;
        char massimo = ' ';
        char caratteriCasuali[] = new char[grandezza];
        int i = 0;
        int c = 0;

        for (i = 0; i < grandezza; i++) {
            caratteriCasuali[i] = caratteri[generatore.nextInt(caratteri.length)];
            if ((i+1) % 10 == 0) {
                output += caratteriCasuali[i] + "\n";
            } else {
                output += caratteriCasuali[i] + "  ";
            }
        }
        for (i = 0; i < caratteri.length; i++) {
            for (c = 0; c < grandezza; c++) {
                if (caratteri[i] == caratteriCasuali[c]) {
                    cont1++;
                }
            }
            if (cont1 > cont2) {
                massimo = caratteri[i];
            }
            cont2 = cont1;
            cont1 = 0;
        }

        JOptionPane.showMessageDialog(null, output + "\n\nIl carattere che viene ripetuto più volte è " 
                + massimo);
    }
}

28 Risposte

  • Re: Esercizio carattere che si ripete di più

    lolol ha scritto:


    Questo esercizio va bene? Ci sono modi per farlo meglio?
    Ciao,
    ci daresti anche il testo dell'esercizio? E' vero che si può anche provare a ricavarlo dal codice, però se ci posti quello originale è meglio ed evitiamo possibili errori.
  • Re: Esercizio carattere che si ripete di più

    Ogni volta che faccio andare l'esercizio mi dice che la lettera che si ripete più volte è la L, è giusto?
    consegna dell'esercizio:
    Sia dato un vettore di caratteri. Si scriva una funzione che ricevendo in ingresso il vettore e restituisca il carattere che più frequente. Ad esempio, se il vettore contiene i caratteri A F L M P S T L M la funzione dovrà restituire il carattere L.
    Io ho fatto che si generano casualmente in automatico, provo a vedere adesso se invece funziona mettendolo in input.
  • Re: Esercizio carattere che si ripete di più

    Sì, ho provato a metterlo come input e funziona, è semplicemente il generatore casuale che fa così ...
  • Re: Esercizio carattere che si ripete di più

    Però il testo ti chiedeva una cosa leggermente diversa: scrivere una funzione che prende in ingresso il vettore e restituisce il carattere che si ripete più volte.
    Quindi direi che devi scrivere una funzione del tipo
    char caratterePiuRipetuto(char[] vettore) { ... }
    Poi dal main ti limiti a richiamarla.
  • Re: Esercizio carattere che si ripete di più

    Hai ragione, hanno chiesto la funzione. Sinceramente non trovo la comodità delle funzioni, comunque:
    package vacanze_estive_7;
    
    /**
     *
     * @author OOO
     */
    import java.util.*;
    import javax.swing.JOptionPane;
    
    public class Vacanze_estive_7 {
    
        public static char carattere(char[] vettore1, char[] vettore2) {
            int cont1 = 0;
            int cont2 = 0;
            char massimo = ' ';
            int i = 0;
            int c = 0;
            for (i = 0; i < vettore1.length; i++) {
                for (c = 0; c < vettore2.length; c++) {
                    if (vettore1[i] == vettore2[c]) {
                        cont1++;
                    }
                }
                if (cont1 > cont2) {
                    massimo = vettore1[i];
                }
                cont2 = cont1;
                cont1 = 0;
            }
    
            return massimo;
        }
    
        public static void main(String[] args) {
    
            Random generatore = new Random();
            String output = "";
            char massimo = ' ';
            char caratteri[] = {'Q',
                'A', 'Z', 'W', 'S', 'X', 'E', 'D', 'C', 'R', 'F',
                'V', 'T', 'G', 'B', 'Y', 'H', 'N', 'U', 'J', 'M', 'I', 'K', 'O', 'L', 'P'};
    
            String input = JOptionPane.showInputDialog("Quanto vuoi che sia grande il vettore? ");
            int grandezza = Integer.parseInt(input);
    
            char caratteriCasuali[] = new char[grandezza];
            int i = 0;
    
            for (i = 0; i < grandezza; i++) {
    
                caratteriCasuali[i] = caratteri[generatore.nextInt(caratteri.length)];
    
    //            input = JOptionPane.showInputDialog("Inserisci la "+(i+1)+" lettera.");
    //            caratteriCasuali[i] = Character.toUpperCase(input.charAt(0));
                
                if ((i + 1) % 10 == 0) {
                    output += caratteriCasuali[i] + "\n";
                } else {
                    output += caratteriCasuali[i] + "  ";
                }
            }
            massimo = carattere(caratteri, caratteriCasuali);
    
            JOptionPane.showMessageDialog(null, output + "\n\nIl carattere che viene ripetuto più volte è "
                    + massimo);
        }
    }
    
  • Re: Esercizio carattere che si ripete di più

    Questo esercizio va bene? Ci sono modi per farlo meglio?
    Questa è un'altra possibile risoluzione dell'esercizio.
    L'array aggiuntivo "occorrenze" occupa sì memoria, ma così hai la possibilità di fare altri controlli (es. carattere alfabeticamente minore, ordinare i caratteri in base al num di occorrenze, ecc... ) senza riesaminare tutto l'array.
    public static int max(int[] vettore){     //ritorna il massimo in un array di interi
            int i,max,pos = 0;
            
            for(i = 0, max = 0; i<vettore.length ; i++){
                if(max<vettore[i]){
                    max = vettore[i];
                    pos = i;
                }
            }
            
            return pos;
        }
        
        public static char carattere(char[] str){
            int[] occorrenze = new int[26];     //lettere dell'alfabeto
            int i;
            
            for(i=0; i<str.length; i++)
                occorrenze[str[i]-'a']++;
            
            return (char) ('a'+max(occorrenze));      //carattere più presente
        }
    
        public static void main(String[] args) {
    
            String input = JOptionPane.showInputDialog("Inserisci la stringa da analizzare");
    
            char[] caratteri = input.toCharArray();
            
            JOptionPane.showMessageDialog(null, "\n\nIl carattere che viene ripetuto più volte è "
                    + carattere(caratteri));
        }
    Sinceramente non trovo la comodità delle funzioni
    Beh, senza funzioni i linguaggi "ad alto livello" non esisterebbero...
  • Re: Esercizio carattere che si ripete di più

    Ho fatto copia e incolla dell'esercizio che mi hai scritto ma mi da errore
    package vacanze_estive_7_b;
    
    /**
     *
     * @author OOO
     */
    import javax.swing.*;
    
    public class Vacanze_estive_7_b {
    
        public static int max(int[] vettore) {     //ritorna il massimo in un array di interi
            int i, max, pos = 0;
    
            for (i = 0, max = 0; i < vettore.length; i++) {
                if (max < vettore[i]) {
                    max = vettore[i];
                    pos = i;
                }
            }
    
            return pos;
        }
    
        public static char carattere(char[] str) {
            int[] occorrenze = new int[26];     //lettere dell'alfabeto
            int i;
    
            for (i = 0; i < str.length; i++) {
                occorrenze[str[i] - 'a']++;
            }
    
            return (char) ('a' + max(occorrenze));      //carattere più presente
        }
    
        public static void main(String[] args) {
    
            String input = JOptionPane.showInputDialog("Inserisci la stringa da analizzare");
    
            char[] caratteri = input.toCharArray();
    
            JOptionPane.showMessageDialog(null, "\n\nIl carattere che viene ripetuto più volte è "
                    + carattere(caratteri));
    
        }
    }
    
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -65
    at vacanze_estive_7_b.Vacanze_estive_7_b.carattere(Vacanze_estive_7_b.java:28)
    at vacanze_estive_7_b.Vacanze_estive_7_b.main(Vacanze_estive_7_b.java:41)
    Java Result: 1



    e un'altra domanda: Quanti anni bisogna studiare java per essere esperti?
  • Re: Esercizio carattere che si ripete di più

    Ciao,
    l'ho eseguito e mi pare che il problema sia dovuto al fatto che non puoi inserire caratteri diversi dalle lettere minuscole. In effetti se provi ad inserire numeri, spazi, lettere maiuscole, etc. va in errore. Appena ho un attimo proverò ad implementare la mia soluzione.
    saluti
    Ste
  • Re: Esercizio carattere che si ripete di più

    Oh, grazie mille, allora attendo una risposta
  • Re: Esercizio carattere che si ripete di più

    Ciao, qui sotto il nuovo listato.
    Come vedi ho modifcato leggermente il codice di ale99 ma adesso calcola qualsiasi carattere ascii.
    Se non esce nulla vuol dire che il carattere preponderante è lo spazio
    Ciao
    Ste

    >e un'altra domanda: Quanti anni bisogna studiare java per essere esperti?
    Sinceramente, escono tecnologie e nuove versioni ogni anno legate al mondo Java (non necessariamente al linguaggio).
    Penso che si debba studiare sempre....usque ad finem .
  • Re: Esercizio carattere che si ripete di più

    Package vacanze_estive_7_b;

    /**
    *
    * @author OOO
    */
    import javax.swing.*;

    public class Vacanze_estive_7_b {

    public static int max(int[] vettore) { //ritorna il massimo in un array di interi
    int i, max =0, pos = 0;

    for (i = 0; i < vettore.length; i++) {
    if (max < vettore) {
    max = vettore;
    pos = i;
    }
    }

    return pos;
    }

    public static char carattere(char[] str) {
    int[] occorrenze = new int[255]; //caratteri ascii
    int i;

    for (i = 0; i < str.length; i++) {
    occorrenze[(int)str]++;
    }

    return (char) (max(occorrenze)); //carattere più presente
    }

    public static void main(String[] args) {

    String input = JOptionPane.showInputDialog("Inserisci la stringa da analizzare");

    char[] caratteri = input.toCharArray();

    JOptionPane.showMessageDialog(null, "\n\nIl carattere che viene ripetuto più volte è "
    + carattere(caratteri));

    }
    }
  • Re: Esercizio carattere che si ripete di più

    Perdonami se non sono riuscito ad identare il codice.
    Fammi sapere se funziona.
    Ariciao
    Ste
  • Re: Esercizio carattere che si ripete di più

    steve1 ha scritto:


    Perdonami se non sono riuscito ad identare il codice.
    Sìsì non fa niente, c'è l'indentazione automatica.
    Sinceramente l'esercizio non m'è quasi per niente chiaro... Ho provato a fare una modifica e mi da errore
    package vacanze_estive_7_b;
    
    /**
     *
     * @author OOO
     */
    import javax.swing.*;
    
    public class Vacanze_estive_7_b {
    
        public static int max(int[] vettore) { //ritorna il massimo in un array di interi
            int i, max = 0, pos = 0;
    
            for (i = 0; i < vettore.length; i++) {
                if (max < vettore[i]) {
                    max = vettore[i];
                    pos = i;
                }
            }
    
            return pos;
        }
    
        public static char carattere(char[] str) {
            int[] occorrenze = new int[255]; //caratteri ascii
            int i;
    
            for (i = 0; i < str.length; i++) {
                occorrenze[(int) str[i]]++;
            }
    
            return (char) (max(occorrenze)); //carattere più presente
        }
    
        public static void main(String[] args) {
    
            String input = JOptionPane.showInputDialog("Inserisci la stringa da analizzare");
    
            char[] caratteri = input.toCharArray();
    
            if(carattere(caratteri)=!' '){
            JOptionPane.showMessageDialog(null, "Il carattere che viene ripetuto più volte è "
                    + carattere(caratteri));
            }
            else {
                JOptionPane.showMessageDialog(null, "Il carattere che viene ripetuto più volte è lo spazio."
                    );
            }
    
        }
    }
    
    Non capisco proprio l'esercizio ho capito che la seconda funzione ripende la prima funzione e poi non capisco proprio...
    che cos'è occorrenze[(int) str]++ questo?

    Credo che quello che non capisco è che è una funzione che ripende un'altra funzione...
  • Re: Esercizio carattere che si ripete di più

    Il codice era specifico per contare il numero di occorrenze di ciascun elemento nell'insieme U={ lettere minuscole dell'alfabeto}

    Se l'insieme Universo fosse (ad esempio) U={ 0<=x<=99 } avresti dovuto usare un array "occorrenze" di 100 elementi e modificare in modo opportuno il return della funzione principale;
Devi accedere o registrarti per scrivere nel forum
28 risposte