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

    Non riesco a concepire questo algoritmo... qualche aiuto?

    Salve a tutti. Ho un problema con un algoritmo, non riesco a capire come funziona... il programma dovrebbe simulare il tastierino di un telefono, dove ad ogni numero da 2 a 9 corrispondono 3 lettere tranne al numero 7 e 9 che ne corrispondono 4. Dato un numero di 7 cifre (da 2 a 9), stampare a video ogni possibile combinazione, ad esempio se prendiamo in considerazione il numero "234" si avrebbe:

    ADG
    BEH
    CFI
    ecc...

    ho provato a creare una parte del programma in questo modo:

    Codice PHP:
    import java.util.*;
    public class 
    CalcolaParole
    {
        public static 
    void main(String[] args)
        {
            
    String number "234";
            
    String string "";
            
    String stringT "";
            
            
    char[][] matrice = new char[7][4];
            
            for (
    byte i 0number.length(); i++)
            {
                switch (
    Byte.valueOf(number.substring(i,i+1)).byteValue())
                {
                    case 
    2:
                        
    matrice[i][0] = 'A';
                        
    matrice[i][1] = 'B';
                        
    matrice[i][2] = 'C';
                        break;
                    case 
    3:
                        
    matrice[i][0] = 'D';
                        
    matrice[i][1] = 'E';
                        
    matrice[i][2] = 'F';
                        break;
                    case 
    4:
                        
    matrice[i][0] = 'G';
                        
    matrice[i][1] = 'H';
                        
    matrice[i][2] = 'I';
                }
            }
            
            for (
    byte i 0number.length(); i++)
            {
                for (
    byte j 03j++)
                {
                    
    string "";
                    
    stringT "";
                    
                    for (
    int x 03x++)
                    {
                        if (
    != i)
                        {
                            
    stringT += matrice[x][j];
                        }
                    }

                    
    string += matrice[i][j] + stringT;
            
                    
    System.out.printf("%s\n",string);
                }            
            }
        }

    Ovviamente il codice è errato (oltre che incompleto), e non riesco ad andare avanti... c'è qualcuno che può chiarirmi le idee? ^^

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    C'è una vecchia discussione, questa, che forse potrebbe interessarti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Raga ecco il programma quasi completato

    codice:
    import java.util.*;
    public class CalcolaParole
    {
    	public static void main(String[] args)
    	{
    		String number = "3342398";
    		String string = "";
    		String stringT = "";
    		
    		char[][] matrice = new char[7][4];
    		
    		for (byte i = 0; i < number.length(); i++)
    		{
    			switch (Byte.valueOf(number.substring(i,i+1)).byteValue())
    			{
    				case 2:
    					matrice[i][0] = 'A';
    					matrice[i][1] = 'B';
    					matrice[i][2] = 'C';
    					matrice[i][3] = ' ';
    					break;
    				case 3:
    					matrice[i][0] = 'D';
    					matrice[i][1] = 'E';
    					matrice[i][2] = 'F';
    					matrice[i][3] = ' ';
    					break;
    				case 4:
    					matrice[i][0] = 'G';
    					matrice[i][1] = 'H';
    					matrice[i][2] = 'I';
    					matrice[i][3] = ' ';
    					break;
    				case 5:
    					matrice[i][0] = 'J';
    					matrice[i][1] = 'K';
    					matrice[i][2] = 'L';
    					matrice[i][3] = ' ';
    					break;
    					
    				case 6:
    					matrice[i][0] = 'M';
    					matrice[i][1] = 'N';
    					matrice[i][2] = 'O';
    					matrice[i][3] = ' ';
    					break;
    				case 7:
    					matrice[i][0] = 'P';
    					matrice[i][1] = 'Q';
    					matrice[i][2] = 'R';
    					matrice[i][3] = 'S';
    					break;
    				case 8:
    					matrice[i][0] = 'T';
    					matrice[i][1] = 'U';
    					matrice[i][2] = 'V';
    					matrice[i][3] = ' ';
    					break;
    				case 9:
    					matrice[i][0] = 'W';
    					matrice[i][1] = 'X';
    					matrice[i][2] = 'Y';
    					matrice[i][3] = 'Z';
    			}
    		}
    		int cont = 0;
    		for (byte g = 0; g < 4; g++)
    			for (byte f = 0; f < 4; f++)
    				for (byte e = 0; e < 4; e++)
    					for (byte d = 0; d < 4; d++)
    						for (byte c = 0; c < 4; c++)
    							for (byte b = 0; b < 4; b++)
    								for (byte a = 0; a < 4; a++)
    								{
    									string += matrice[0][g];
    									string += matrice[1][f];
    									string += matrice[2][e];
    									string += matrice[3][d];
    									string += matrice[4][c];
    									string += matrice[5][b];
    									string += matrice[6][a];
    
    									if (string.indexOf(' ') != -1)
    									{
    										System.out.printf("%s\n",string);
    										cont++;
    									}
    
    									string = "";
    								}
    		System.out.print(cont);
    	}
    }
    L'unico problema è che la condizione evidenziata in grassetto non funziona come dovrebbe... mi spiego meglio. Siccome nella matrice di caratteri ci sono alcuni spazi vuoti, voglio evitare che le stringhe che si vanno a formare appaiano a video se contengono spazi vuoti... ma anche con quella condizione, mi appaiono le stringhe con caratteri vuoti. Perchè non funziona come dovrebbe? :confuso:

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    codice:
    public class CombinazioniTastiera
    {
        private static final String[] alphabet = { "", "", "ABC", "DEF", "GHI", "JKL", "MNO", "PQRS", "TUV", "WXYZ" };
    
        public static void main (String[] args)
        {
            String number = "3342398";
    
            int len = number.length ();
    
            int[] digits = new int[len];
            String[] letters = new String[len];
    
            for (int i = 0; i < len; i++)
            {
                digits[i] = Integer.parseInt (String.valueOf (number.charAt (i)));
                letters[i] = alphabet[digits[i]];
            }
    
            int[] indexes = new int[len];
            int carry;
    
            do {
                for (int i = 0; i < len; i++)
                    System.out.print (letters[i].charAt (indexes[i]));
    
                System.out.println ();
    
                carry = 1;
    
                for (int i = 0; i < len; i++)
                {
                    if (letters[i].length () > 0)
                    {
                        indexes[i] += carry;
                        if (indexes[i] >= letters[i].length ())
                            indexes[i] = 0;
                        else
                            carry = 0;
                    }
                }
            } while (carry == 0);
        }
    }
    Che non solo è molto più corto ma ha un grande vantaggio: funziona per un qualunque numeri di digit!!!
    Potrei mettere String number = "33423983245645735"; e funziona lo stesso.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Originariamente inviato da andbin
    codice:
    public class CombinazioniTastiera
    {
        private static String[] alphabet = { "", "", "ABC", "DEF", "GHI", "JKL", "MNO", "PQRS", "TUV", "WXYZ" };
    
        public static void main (String[] args)
        {
            String number = "3342398";
    
            int len = number.length ();
    
            int[] digits = new int[len];
            String[] letters = new String[len];
    
            for (int i = 0; i < len; i++)
            {
                digits[i] = Integer.parseInt (String.valueOf (number.charAt (i)));
                letters[i] = alphabet[digits[i]];
            }
    
            int[] indexes = new int[len];
            int carry;
    
            do {
                for (int i = 0; i < len; i++)
                    System.out.print (letters[i].charAt (indexes[i]));
    
                System.out.println ();
    
                carry = 1;
    
                for (int i = 0; i < len; i++)
                {
                    if (letters[i].length () > 0)
                    {
                        indexes[i] += carry;
                        if (indexes[i] >= letters[i].length ())
                            indexes[i] = 0;
                        else
                            carry = 0;
                    }
                }
            } while (carry == 0);
        }
    }
    Che non solo è molto più corto ma ha un grande vantaggio: funziona per un qualunque numeri di digit!!!
    Potrei mettere String number = "33423983245645735"; e funziona lo stesso.
    Ti ringrazio però vorrei capire perchè quella condizione non funziona come dovrebbe... hai qualche idea? o_O

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da Dreamer89
    vorrei capire perchè quella condizione non funziona come dovrebbe
    Quella condizione l'hai fatta al contrario. Se vuoi che stampi solo se non ci sono spazi, devi fare:

    if (string.indexOf(' ') == -1)
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  7. #7
    Perfetto. Davvero grazie mille, ottimo programma. Però non mi è ancora chiaro cosa fa il vettore indexes, e in particolare il primo ciclo for che si trova nel do-while, cioè, all'inizio il vettore è vuoto, ma lo si utilizza per specificare il carattere all'interno della stringa... o_O

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da Dreamer89
    Però non mi è ancora chiaro cosa fa il vettore indexes, e in particolare il primo ciclo for che si trova nel do-while, cioè, all'inizio il vettore è vuoto, ma lo si utilizza per specificare il carattere all'interno della stringa... o_O
    Il mio sorgente usa la stessa logica usata nei sistemi di numerazione "pesati".

    Supponiamo di avere i digit "72" le stringhe interessate sono "PQRS" e "ABC". Mettiamole in verticale ed associamo un indice alle lettere:

    codice:
    S        3
    R C      2 2 
    Q B  --> 1 1
    P A      0 0
    L'array indexes inizialmente è 00.
    Incremento il primo indice: 10 ... poi 20 ... poi 30 ....
    Quando "fa il giro", lo rimetto a 0 ed il carry si "propaga" all'indice successivo, quindi 01
    E così via ....

    P.S. Nel mio sorgente ho scelto di partire con gli incrementi da sinistra ma bastava "girare" l'ultimo for per incrementare da destra.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

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 © 2024 vBulletin Solutions, Inc. All rights reserved.