Forum Informatica Unict

LAUREA TRIENNALE (D.M. 270/04) => Programmazione 1, 9 CFU => Topic started by: gigyrock on 15-03-2011, 11:23:20



Title: class, interface, or enum expected...di che si tratta?
Post by: gigyrock on 15-03-2011, 11:23:20
Salve ragazzi vi posto il testo e il codice che ho scritto, dell'esercizio che sto svolgendo...se ci sono errori di sintassi ecc è perchè ancora non l'ho rivisto, ma il primo errore che mi esce è questo qua: class, interface, or enum expected
e mi esce parecchie volte su quasi tutte le righe, che si trovano all'interno dei due metodi...quindi penso sia qualcosa di sbagliato a monte, che poi provoca questo tipo di errore, qualcuno sa dirmi cos'è?

cmq...
TESTO
Esercizio 2
Scrivere un metodo che prenda come parametri formali un array di stringhe A e restituisca in output
un array B di m stringhe, dove:
• m è la lunghezza media delle stringhe in A di lunghezza maggiore di 5, e
• la i-esima stringa di B è ottenuta concatenando (m*i) asterischi.

E il codice che ho scritto è questo:

Code:
public class eserciziosito2
{
public static void main (String[]args)
{
String []A={ciao, pulce, fame, fumo};

System.out.print(metodoB(calcola_m(A)));

}
}
public static int calcola_m (String[]A)
{
int M;
int c=0; int sommastringhe=0;
for(int i=0;i<A.length;i++)
{
if (A[i].length()>5)
{ c++;
sommastringhe+=A[i].length();
}
}
M=integer.parseint(sommastringhe/c);
return M;
}
public static string[] metodoB (int m)
{ String[]B=new String[m];
for (int i=0;i<B.length;i++)
{
for (int j=0;j<(m*i);j++)
{
B[i]= B[i]+ "*";
}

}
return B;
}



Title: Re:class, interface, or enum expected...di che si tratta?
Post by: ForbiddenAlex on 15-03-2011, 11:39:14
Non ho letto il codice per intero ma ti posso dire che la classe è stata definita contenendo solo il blocco statico main...i metodi li hai messi fuori, ma senza definire altre(eventuali) classi....chiudi la classe al termine della definizione dei metodi e vedi se ti da altri tipi(questo non dovrebbe dartelo più) di errori o eccezioni!


Title: Re:class, interface, or enum expected...di che si tratta?
Post by: havoc on 15-03-2011, 11:50:54
Code:
String []A={ciao, pulce, fame, fumo};

Oso un'ipotesi: dovevi mettere le virgolette doppie nelle stringhe.


Title: Re:class, interface, or enum expected...di che si tratta?
Post by: gigyrock on 15-03-2011, 11:59:49
Allora si le virgolette le ho dimenticate, però il problema era quello di chiudere il main dopo i metodi...quindi grazie =)
però ora ho un'altro problema
cioè:
"
Code:
cannot find symbol
symbol  : method parseInt(int)
location: class java.lang.Integer
M=Integer.parseInt(sommastringhe/c);
vi posto di nuovo il codice per comodità:
Code:
public class eserciziosito2
{
public static void main (String[]args)
{
String []A={"ciao", "pulce", "fame", "fumo"};

System.out.print(metodoB(calcola_m(A)));

}

public static int calcola_m (String[]A)
{
int M;
int c=0; int sommastringhe=0;
for(int i=0;i<A.length;i++)
{
if (A[i].length()>5)
{ c++;
sommastringhe+=A[i].length();
}
}
M=Integer.parseInt(sommastringhe/c);
return M;
}
public static String[] metodoB (int m)
{ String[]B=new String[m];
for (int i=0;i<B.length;i++)
{
for (int j=0;j<(m*i);j++)
{
B[i]= B[i]+ "*";
}

}
return B;
}
}

il risultato dell'operazione "sommastringhe/c" dovrebbe essere un byte, perchè non riesce a convertirlo?


Title: Re:class, interface, or enum expected...di che si tratta?
Post by: ForbiddenAlex on 15-03-2011, 12:36:07
Prova così:

Code:
public class eserciziosito2
{     


public static void main(String[] args) {
String[] A = {"cane", "scarpa", "pulce", "lama", "monitor"};
String[] B = metodo(A);
for (int i=0; i<B.length; i++)
System.out.println(B[i]);
}

public static String[] metodo(String[] s) {
int stringheMaggioriCinque = 0;
int count = 0;
int m = 0;
for (int i=0; i<s.length; i++) {
if (s[i].length()>5) {
count += s[i].length();
stringheMaggioriCinque++;
}
}
String[] output = new String[stringheMaggioriCinque];
m = count/output.length;

for (int i=0; i<output.length; i++) {
output[i] = "";
int numeroAsterischi = m*i;
for (int j=0; j<numeroAsterischi; j++)
output[i] += "*";
        }
return output;
}
}


Title: Re:class, interface, or enum expected...di che si tratta?
Post by: gigyrock on 15-03-2011, 13:24:48
Prova così:

Code:
public class eserciziosito2
{     


public static void main(String[] args) {
String[] A = {"cane", "scarpa", "pulce", "lama", "monitor"};
String[] B = metodo(A);
for (int i=0; i<B.length; i++)
System.out.println(B[i]);
}

public static String[] metodo(String[] s) {
int stringheMaggioriCinque = 0;
int count = 0;
int m = 0;
for (int i=0; i<s.length; i++) {
if (s[i].length()>5) {
count += s[i].length();
stringheMaggioriCinque++;
}
}
String[] output = new String[stringheMaggioriCinque];
m = count/output.length;

for (int i=0; i<output.length; i++) {
output[i] = "";
int numeroAsterischi = m*i;
for (int j=0; j<numeroAsterischi; j++)
output[i] += "*";
        }
return output;
}
}
scusami ma è la stessa cosa supergiù, il problema non è quello, il problema è che il risultato di una divisione non è sempre int, mentre a noi serve ottenere un int o comunque arrotondarlo in modo da stampare tanti asterischi quanto è questo int...e in teoria è giusto come faccio io ma perchè in pratica la funzione Integer.parseInt mi da errore???


Title: Re:class, interface, or enum expected...di che si tratta?
Post by: ForbiddenAlex on 15-03-2011, 14:03:43
per quanto riguarda questa divisione a te non interessa il resto(ad esempio 13/2=6, col resto di 1), devi effettuare una media matematica, se la media viene 6,25(ad esempio), non puoi creare stringhe formate da 6,25 asterischi ma da 6...quindi del resto non ti interessa nulla. A mio avviso la tua implementazione è un pò confusionaria. Per quanto riguarda il parseInt...stai provando ad effettuare il parsing ad intero, di un tipo che già è un intero...quindi è ovvio che ti dia errore...secondo me in questo caso il parseInt non ti serve proprio a nulla!


Title: Re:class, interface, or enum expected...di che si tratta?
Post by: gigyrock on 15-03-2011, 14:38:24
per quanto riguarda questa divisione a te non interessa il resto(ad esempio 13/2=6, col resto di 1), devi effettuare una media matematica, se la media viene 6,25(ad esempio), non puoi creare stringhe formate da 6,25 asterischi ma da 6...quindi del resto non ti interessa nulla. A mio avviso la tua implementazione è un pò confusionaria. Per quanto riguarda il parseInt...stai provando ad effettuare il parsing ad intero, di un tipo che già è un intero...quindi è ovvio che ti dia errore...secondo me in questo caso il parseInt non ti serve proprio a nulla!
ma come può essere un intero se è una media e quindi una divisione fra interi? E' probabile che venga un numero con la virgola...cosa vuoi dire spiegati meglio? che il casting avviene in automatico? cioè il numero perde i decimali dopo la virgola essendo m un intero? non capisco...perchè ammeno chè non mi sono rincitrullito
m è un intero e assegno ad m una divisione tra interi, il quale risultato non è detto che sia un intero... non capisco   :-)| :-)| :-)|


Title: Re:class, interface, or enum expected...di che si tratta?
Post by: ForbiddenAlex on 15-03-2011, 14:50:06
Il tipo java int restituisce sempre la parte intera di un numero o delle operazioni effettuate su di esso. Per ottenere il resto intero dovresti usare il modulo. Se per esempio a=13, b=6: a%b=1(dove l'operatore % è il modulo, ovvero il resto intero di una divisione...) se invece tu volessi ottenere il numero con parte intera e parte decimale(virgola mobile) dovresti usare un double.

edit: ma il punto è che,  date le direttive di svolgimento di questo esercizio nello specifico, a te non interessa la parte decimale ma solo quella intera, altrimenti ,a limite puoi fare la seguente:
 - il valore m lo poni come double e utilizzi il metodo Math.round(m) per ottenere un arrotondamento all'intero più vicino alla media calcolata. Alla fine comunque il numero di asterischi dovrà sempre essere un intero!!!


Title: Re:class, interface, or enum expected...di che si tratta?
Post by: gigyrock on 16-03-2011, 12:07:14

edit: ma il punto è che,  date le direttive di svolgimento di questo esercizio nello specifico, a te non interessa la parte decimale ma solo quella intera, altrimenti ,a limite puoi fare la seguente:
 - il valore m lo poni come double e utilizzi il metodo Math.round(m) per ottenere un arrotondamento all'intero più vicino alla media calcolata. Alla fine comunque il numero di asterischi dovrà sempre essere un intero!!!
Così facendo però stravolgo tutto l'algoritmo, perchè anche l'altro modulo ha bisogno di un int come input che sarebbe m, non mi va di trasformarlo in un double anche perchè l'esercizio è chiaro, richiede un int...qui la questione è come fare il casting da byte a int di questa operazione
Code:
M=(sommastringhe/c)
spero che qualcuno lo sappia...
io ho provato a togliere l'Integer.parseInt...lasciando l'espressione così come l'ho scritta qui sopra, nella speranza che in automatico lui prendesse solo il numero prima della virgola, ma mi da questo errore:
Code:
[Ljava.lang.String;@3e25a5>Exit code: 0

qualcuno mi aiutiiii, non mi va di bloccarmi per una cavolata! =)  :pray


Title: Re:class, interface, or enum expected...di che si tratta?
Post by: ForbiddenAlex on 16-03-2011, 16:50:34
Secondo quanto riportato dal tuo codice hai:

int M;
int c=0; int sommastringhe=0;

dove sono questi fantomatici byte di cui parli? stai cercando di effettuare il casting di qualcosa che nel tuo codice nemmeno hai implementato...tra l'altro i byte non ti servono a nulla in questo caso. Il risultato che ottieni alla fine:

[Ljava.lang.String;@3e25a5>Exit code: 0

non è un errore(infatti in ouput ti dice "Exit code 0", se fosse stato un errore avrebbe stampato: "Exit code 1")... questo messaggio vuole avvertirti del fatto che stai cercando di stampare su standard output(System.out.println per intenderci) un array di stringhe(@3e25a5 dovrebbe indicare l'indirizzo di memoria in esadecimale in cui è contenuto l'array stesso) ma non è possibile stampare l'array per intero senza prima scorrerlo, ti consiglierei di far diventare il main così(che poi è quello che ho fatto io):

public static void main (String[] args)
   {
      String []A={"ciao", "pulce", "fame", "fumo"};
      String[] B = metodoB(calcola_a(A));
                for (int i=0; i<B.length; i++)
       System.out.println(B);
        }

In questo modo riuscirà a stamparti in output le singole stringhe dell'array e non(cosa non possibile) l'array per intero....spero di essere stato chiaro.





Title: Re:class, interface, or enum expected...di che si tratta?
Post by: gigyrock on 16-03-2011, 16:57:27
Secondo quanto riportato dal tuo codice hai:

int M;
int c=0; int sommastringhe=0;

allora mi sono rincitrullito io
"sommastringhe" è un int supponiamo che sommastringhe=16 che sono la somma di tutti i caratteri delle stringhe maggiori di 5;
e "c" è un int pure supponiamo sia c=3 cioè il numero di stringhe maggiori di 5;
risultato
16/3=5,3333333333 ora 5,3 periodico è un int?????????? no! ecco quale è il mio problema...posso assegnare questo eventuale risultato ad M che è un int?????


Title: Re:class, interface, or enum expected...di che si tratta?
Post by: ForbiddenAlex on 16-03-2011, 17:11:51
non ti sei rincitrullito...stai semplicemente ingigantendo un problema che infondo è molto più semplice di quel che pensi. 16/3=5,333 è un double. Se imposti(mi pare di avertelo già spiegato) int x=16, int y = 3 ed esegui x/y il risultato sarà un intero, quindi 5 trascurando la parte decimale. Se invece imposti double x=16, double y=3 ed esegui x/y il risultato sarà 5,333(ovvero un double). Secondo punto: che cavolo ci vuoi fare con i byte? Io ancora non l'ho capito, questi sono tipi numerici, non sono mica byte....l'esercizio non richiede l'utilizzo dei byte quindi è anche inutile prendere in considerazione il tipo byte. Se devi avere m*i asterischi, dove m è la media delle stringhe con più di 5 caratteri, che tu arrotondi alla fine o che tu utilizzi una divisione tra interi(che prende la parte intera e basta) alla fine dovrai "PER FORZA" effettuare una moltiplicazione(m*i) che restituisca un intero. Le strade da prendere possono essere 2:

1) dividere direttamente degli interi quindi ottenere un intero.
2) porre m come double ed effettuare un round su di esso(Math.round(m)), funzione che restituisce l'intero più vicino al double in questione.

ps: tra l'altro ho notato che hai inserito, all'interno del tuo array di stringhe, tutte stringhe di lunghezza <=5, quindi la media ti dovrebbe pure generare un errore(Exception NaN: Not a Number...o divided by zero).


Title: Re:class, interface, or enum expected...di che si tratta?
Post by: gigyrock on 16-03-2011, 17:24:25
a  ok quindi in automatico diventa double...apposto...no pensavo fosse un byte il risultato e non un double...
ok ma ora perchè questo output?
Code:
[Ljava.lang.String;@3e25a5>Exit code: 0
come risolvo?
mi è capitato anche in un altro esercizio...


Title: Re:class, interface, or enum expected...di che si tratta?
Post by: ForbiddenAlex on 16-03-2011, 17:26:56

[Ljava.lang.String;@3e25a5>Exit code: 0

non è un errore(infatti in ouput ti dice "Exit code 0", se fosse stato un errore avrebbe stampato: "Exit code 1")... questo messaggio vuole avvertirti del fatto che stai cercando di stampare su standard output(System.out.println per intenderci) un array di stringhe(@3e25a5 dovrebbe indicare l'indirizzo di memoria in esadecimale in cui è contenuto l'array stesso) ma non è possibile stampare l'array per intero senza prima scorrerlo, ti consiglierei di far diventare il main così(che poi è quello che ho fatto io):

public static void main (String[] args)
   {
      String []A={"ciao", "pulce", "fame", "fumo"};
      String[] B = metodoB(calcola_a(A));
                for (int i=0; i<B.length; i++)
       System.out.println(B);
        }

In questo modo riuscirà a stamparti in output le singole stringhe dell'array e non(cosa non possibile) l'array per intero....spero di essere stato chiaro.






Title: Re:class, interface, or enum expected...di che si tratta?
Post by: gigyrock on 18-03-2011, 12:33:42

[Ljava.lang.String;@3e25a5>Exit code: 0

non è un errore(infatti in ouput ti dice "Exit code 0", se fosse stato un errore avrebbe stampato: "Exit code 1")... questo messaggio vuole avvertirti del fatto che stai cercando di stampare su standard output(System.out.println per intenderci) un array di stringhe(@3e25a5 dovrebbe indicare l'indirizzo di memoria in esadecimale in cui è contenuto l'array stesso) ma non è possibile stampare l'array per intero senza prima scorrerlo, ti consiglierei di far diventare il main così(che poi è quello che ho fatto io):

public static void main (String[] args)
   {
      String []A={"ciao", "pulce", "fame", "fumo"};
      String[] B = metodoB(calcola_a(A));
                for (int i=0; i<B.length; i++)
       System.out.println(B);
        }

In questo modo riuscirà a stamparti in output le singole stringhe dell'array e non(cosa non possibile) l'array per intero....spero di essere stato chiaro.




Bene ora provo, non ci avevo pensato completamente, scusami sarà stata la stanchezza...


Title: Re:class, interface, or enum expected...di che si tratta?
Post by: gigyrock on 18-03-2011, 13:30:42
tutto risolto grazie  :-ciao
ps. che dite posto l'esercizio svolto così chi lo volesse vedere in futuro può farlo?