PDA

View Full Version : [JAVA] Modificare il metodo main()


noskilled
30-10-2006, 09:07
Salve a tutti, ho da poco cominciato a studiare java all'universita, le difficolta non mancano e spesso anche il supporto dedicato alle maticole suppone un po troppo da chi di programmazione conosce magari solo linguaggi di markup :(

Fortunatmente esiste la rete e in particolare HWU :)

Il mio problema potrà sembrare a molti di voi scontato ma sta diventando per me un incubo, passo percio a descrivervelo:

L'esercizio in questione prevede di ricevere in input una stringa e di emettere in out la stessa stringa corredata di cornice di asterischi.
Fin qui tutto ok eccovi il codice :


import prog.io.*;

class Cornice {
public static void main(String[] args) {

//predisposizione dei canali di comunicazione
ConsoleInputManager in = new ConsoleInputManager();
ConsoleOutputManager out = new ConsoleOutputManager();

//le righe utilizzate per la cornice
String rigaAsterischi = "********************" +
"********************" +
"********************" +
"********************"; //80 asterischi in totale

String rigaBianca = " " +
" " +
" " +
" "; //80 spazi in tutto

String frase;
int lunghezza;
out.println();// riga vuota
frase = in.readLine("Inserisci una frase: ");//immissione input
lunghezza = frase.length();

//costruzione delle stringhe
String rigaCornice, rigaIntermedia, rigaTesto, spazi;
rigaCornice = rigaAsterischi.substring(0, lunghezza + 6);
spazi = rigaBianca.substring(0, lunghezza + 4);
rigaIntermedia = "*" + spazi + "*";
rigaTesto = "* " + frase + " *";

//visualizzazione della cornice
out.println();
out.println(rigaCornice);
out.println(rigaIntermedia);
out.println(rigaTesto);
out.println(rigaIntermedia);
out.println(rigaCornice);
out.println();
}
}


Il codice è corredato di classi e metodi particolari progettati per il corso, per il seguente esercizio mi è dato di usare le seguenti classi:


ConsoleOutputManager => classe di riferimento per il dispositivo di out
ConsoleInputManager => classe di riferimento per il dispositivo di input
String => classe di riferimento per le stringhe


La classe string mette a sua volta a disposizione i metodi:


.substring() [per estrarre un determinato numero di caratteri dalla stringa]
.lenght() [restituisce un intero rappresentante il numero di caratteri che compongono il riferimento all'oggetto stringa che utilizza il metodo]


Ed ora ecco la consegna :

L'output fornito dalla classe cornice è allineato a sinistra sullo schermo. Modificare il metodo main in modo che l'output risulti centrato orizzontalmente (si supponga di avere uno schermo di 80 colonne; la divisione tra interi è indicata dall'operatore /)


Qui casca l'asino, sono due settimane che cerco di trovare una soluzione a questo esercizio maledetto (tra l'altro l'unico ancora irrisolto) :muro:

Spero di avervi fornito tutto quello di cui avete bisogno per farvi un idea.

Grazie mille per qualsiasi supporto vogliate fornirmi.

NoskD

andbin
30-10-2006, 09:21
L'output fornito dalla classe cornice è allineato a sinistra sullo schermo. Modificare il metodo main in modo che l'output risulti centrato orizzontalmente (si supponga di avere uno schermo di 80 colonne; la divisione tra interi è indicata dall'operatore /)Conosci StringBuffer???

Crei un nuovo StringBuffer, poi ci inserisci dentro le seguenti cose in questa sequenza:
- un carattere '*'
- N spazi
- la stringa inserita in input
- M spazi
- un carattere '*'

dove N+M è uguale a 78-frase.length(). Il numero di spazi lo dividi per 2 in modo da suddividere in modo più o meno equo gli spazi.
Poi ottieni la stringa da stampare con buf.toString().

EDIT:
P.S. questa è solo una delle possibili soluzioni. Un'altra potrebbe essere quella di fare tante out.print() per ognuna delle singole parti (senza usare quindi StringBuffer).

noskilled
30-10-2006, 09:43
asd in effetti la prima soluzione e stata proprio quella di utilizzare out.print(), ma mi sembrava poco fine e la consegna richiede di modificare il metodo main (cosa che nn ho ancora capito bene come fare) cmq ora provo StringBuffer e vedimo come va a finire.

Grazie mille per la risposta quasi immediata :D :D

jappilas
30-10-2006, 09:56
Conosci StringBuffer???

Crei un nuovo StringBuffer, poi ci inserisci dentro le seguenti cose in questa sequenza:
- un carattere '*'
- N spazi
- la stringa inserita in input
- M spazi
- un carattere '*'

dove N+M è uguale a 78-frase.length(). Il numero di spazi lo dividi per 2 in modo da suddividere in modo più o meno equo gli spazi.
Poi ottieni la stringa da stampare con buf.toString().
la soluzione è carina, ma ... se la stringa fosse di un numero dispari di caratteri, quindi avanzasse un numero dispari (che so, 53 e 25) di spazi ? :D

andbin
30-10-2006, 10:06
la soluzione è carina, ma ... se la stringa fosse di un numero dispari di caratteri, quindi avanzasse un numero dispari (che so, 53 e 25) di spazi ? :DFare 2 calcoli, no?? ;)
int lenFrase = frase.length();

int n = (78 - lenFrase) / 2;
int m = 78 - lenFrase - n;

jappilas
30-10-2006, 10:08
Fare 2 calcoli, no?? ;)
int lenFrase = frase.length();

int n = (78 - lenFrase) / 2;
int m = 78 - lenFrase - n;
ma lo so, è che in realtà volevo sentirlo da lui... ultimamente mi sento molto insegnante rompiballe ( che si mette a fare domande a trabocchetto... ):D :sofico:

andbin
30-10-2006, 10:11
ma lo so, è che in realtà volevo sentirlo da lui... mi sento molto insegnante rompiballe ultimamente... :D :sofico:E ... dirlo prima, no??? :D :D

jappilas
30-10-2006, 10:20
E ... dirlo prima, no??? :D :D
era implicito :O :mc: :D

cmq stavo pensando, se già usi uno string buffer per formattare la "sezione centrale" (stringa originale da incoriniciare più due asterischi di margine), non lo si potrebbe utilizzare direttamente anche per gli asterischi iniziali e finali e le righe di spazi? (posto di dover appendere per ognuna anche il carattere di fine linea)
si dovrebbe ottenere un risparmio nelle chiamate esterne. oltre che un codice forse più omogeneo ... :stordita:

andbin
30-10-2006, 10:29
cmq stavo pensando, se già usi uno string buffer per formattare la "sezione centrale" (stringa originale da incoriniciare più due asterischi di margine), non lo si potrebbe utilizzare direttamente anche per gli asterischi iniziali e finali e le righe di spazi? (posto di dover appendere per ognuna anche il carattere di fine linea)
si dovrebbe ottenere un risparmio nelle chiamate esterne. oltre che un codice forse più omogeneo ... :stordita:Si potrebbe fare un metodo apposito per generare una stringa dalla ripetizione di 1 carattere. Sarebbe utile sia per le linee di asterischi che per gli spazi. ;)
Ma stavolta non posto il codice. :p

lovaz
30-10-2006, 13:08
Puoi usare anche StringBuilder, identico a StringBuffer, ma più veloce.