|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Dec 2009
Città: Varese
Messaggi: 274
|
Semplice programmino in Java
Ciao a tutti. Sono alle primissime armi con Java; voglio scrivere un programmino che quando inserisco una stringa mi restituisca un valore int contenente il numero dei caratteri da cui è composta la suddetta stringa.
Quello che ho fatto fino ad ora è: Codice:
//Contatore di parole
import prog.io.*;
import prog.utili.*;
class ContatoreParole {
public static void main(String[] args) {
//predisposizione canali di comunicazione
ConsoleInputManager tastiera = new ConsoleInputManager();
ConsoleOutputManager monitor = new ConsoleOutputManager();
//lettura stringa
String messaggio = tastiera.readLine();
int x = messaggio.lenght();
//comunicazione dati
monitor.println(x);
}
}
da qui in avanti però sono bloccato, non mi viene in mente cosa fare e non capisco se quello che ho fatto sia giusto: Codice:
//lettura stringa String messaggio = tastiera.readLine(); int x = messaggio.lenght(); //comunicazione dati monitor.println(x); Grazie a chi mi risponderà!
__________________
#FollowMe!AMD Ryzen 1700X, ASUS Crosshair VI Hero, 32 GB DDR4 Corsair Vengeance 3200, NVidia GTX 960, Samsung 970 PRO, Phanteks Enthoo EVOLV ATX TG, LC EKWB custom loop e un po' di RGB... Ultima modifica di djadry : 26-10-2011 alle 21:11. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
Hai lo stesso docente che ho avuto io due anni fa
Comunque riguardo al tuo problema non capisco, sembra corretto. Cosa non ti torna? Mi sembra tu abbia fatto tutto quello che ti eri prefissato di fare. Edit: Se proprio vogliamo essere pignoli hai detto che vorresti restituire un intero ma l'hai stampato. Il che francamente mi sembra coerente per il tipo di esercizio. Ultima modifica di ndakota : 26-10-2011 alle 22:08. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
Codice:
//predisposizione canali di comunicazione ConsoleInputManager tastiera = new ConsoleInputManager(); ConsoleOutputManager monitor = new ConsoleOutputManager(); Codice:
//lettura stringa String messaggio = tastiera.readLine(); int x = messaggio.lenght(); La seconda istruzione crea una variabile intera x e le assegna la lunghezza della stringa letta. Infatti "messaggio" è un oggetto String e contiene la stringa letta da tastiera; il metodo "length()" (occhio al TH e non HT Codice:
//comunicazione dati monitor.println(x); Purtroppo la sola documentazione non mi aiuta molto, diciamo che l'uso di quella classe personalizzata può risultare comodo in codici più lunghi ma qui, se fossi un professore, preferirei "mostrare di più e nascondere di meno". Di fatto l'uso di quella classe ti nasconde il senso di quello che stai facendo. Immaginando comunque il funzionamento di quel codice, te ne ripropongo un'altro che ho appena scritto, dovrebbe fare le stesse cose. Codice:
package prog;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class ContatoreParole {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
InputStreamReader strIn = new InputStreamReader(System.in);
BufferedReader in = new BufferedReader(strIn);
String messaggio = in.readLine();
int x = messaggio.length();
System.out.println(x);
}
}
La tua classe ConsoleInputManager altro non è che una estensione funzionale dello stream in ingresso (System.in). Nel mio codice prima creo un oggetto strIn di tipo InputStreamReader indicandogli che voglio leggere dallo stream System.in , poi creo un oggetto di tipo BufferedReader che mi da la possibilità di leggere un buffer dallo stream indicato (perchè con strIn posso leggere solo un carattere per volta). Fatto questo, il resto del programma come vedi è molto simile al tuo. Spero sia chiaro
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Dec 2009
Città: Varese
Messaggi: 274
|
grazie mille per le risposte!
rispondendo a ndakota, il compilatore mi da un errore. come mi fa notare però demos88, ho scritto "lenght" al posto di "length". rispondendo invece a demos88, purtroppo il codice che mi hai scritto non è molto chiaro (ho iniziato a scrivere programmi Java ieri non conosco le classi che hai usato Codice:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; Codice:
/** * @param args * @throws IOException */ se va poi provo a riscrivere seguendo il codice che hai suggerito tu.
__________________
#FollowMe!AMD Ryzen 1700X, ASUS Crosshair VI Hero, 32 GB DDR4 Corsair Vengeance 3200, NVidia GTX 960, Samsung 970 PRO, Phanteks Enthoo EVOLV ATX TG, LC EKWB custom loop e un po' di RGB... Ultima modifica di djadry : 26-10-2011 alle 22:42. |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Dec 2009
Città: Varese
Messaggi: 274
|
bene, perfetto. in definitiva avevo sbagliato proprio "lenght".
il codice finale è identico a quello nel primo post, con l'unica differenza del Codice:
//lettura stringa String messaggio = tastiera.readLine(); int caratteri = messaggio.length(); //comunicazione dati monitor.println(caratteri);
__________________
#FollowMe!AMD Ryzen 1700X, ASUS Crosshair VI Hero, 32 GB DDR4 Corsair Vengeance 3200, NVidia GTX 960, Samsung 970 PRO, Phanteks Enthoo EVOLV ATX TG, LC EKWB custom loop e un po' di RGB... |
|
|
|
|
|
#6 | ||
|
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
Quote:
Non è necessario conoscere a memoria cosa fa ogni classe delle librerie ufficiali (sono migliaia) ma quantomeno sapere che esistono. Come ti ho riassunto sopra, BufferedReader è una classe che si occupa di gestire uno streaming come se fosse un buffer, ovvero di leggerlo a blocchi di lunghezza variabile (detto in modo molto semplice). Mentre InputStreamReader è la classe che permette di leggere dallo stream che gli viene passato nel costruttore (nel ns caso System.in che è lo stream della tastiera). Un oggetto InputStreamReader che legge da tastiera posso passarlo a un BufferedReader in modo da leggere blocchi di caratteri, nel nostro caso righe intere. In realtà una delle peculiarità delle classi è la loro malleabilità, infatti se tu volessi leggere un file di testo anzichè da input tastiera, tu devi sempre creare un BufferedReader ma al posto di passargli un oggetto di tipo InputStreamReader, gliene passi uno di tipo FileReader (istanziato con uno stream a file). Questo funziona con le librerie standard di java, probabilmente non con le classi che usi te. Tuttavia capisco che se hai iniziato ieri, magari ti sto parlando in arabo, ma fra qualche settimana potrai capire tutto. L'importante è metterci un po' di passione e voglia di capire, perchè quando capisci la logica di fondo, che in java può sembrare ostica ma in realtà non lo è, ti troverai molto meglio. per completezza, la classe IOException è una delle classi eccezioni, ovvero degli oggetti che vengono creati e "sollevati" quando il codice incontra una inconsistenza (per esempio tentare di aprire un file che non esiste solleva una eccezione). Quote:
Sono dei commenti che se aggiunti al codice nei punti giusti (per es prima di un metodo) permettono di generare il documento HTML che si chiama documentazione. Se tu vedessi il codice sorgente delle classi del tuo professore vedresti commenti di questo tipo per ogni metodo, commenti che contengono la descrizione che poi viene trascritta nella documentazione (quella che hai linkato) da un programmino che si chiama javadoc
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight Ultima modifica di demos88 : 26-10-2011 alle 22:55. |
||
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Dec 2009
Città: Varese
Messaggi: 274
|
ho capito tutto invece, grazie alla spiegazione mooolto esaudiente
quindi di Codice:
/** * @param args * @throws IOException */ Codice:
// non so cosa scrivere
__________________
#FollowMe!AMD Ryzen 1700X, ASUS Crosshair VI Hero, 32 GB DDR4 Corsair Vengeance 3200, NVidia GTX 960, Samsung 970 PRO, Phanteks Enthoo EVOLV ATX TG, LC EKWB custom loop e un po' di RGB... |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
Quote:
Se lavori a progetti di dimensione non indifferente (sopra le 10mila righe) o se devi comunque fornire delle classi che altre persone devono usare, il javadoc è uno strumento essenziale di documentazione perchè è uno standard affermato (ed è lo stesso usato per documentare le classi delle librerie del java), altrimenti non è necessario, anche se usarlo nei progetti piccoli sarebbe buona abitudine. Se farai un corso di ingegneria del software, passerai ore a sentirti dire di documentare fino alla nausea
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight |
|
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Dec 2009
Città: Varese
Messaggi: 274
|
ok, ora mi è chiaro!
stamattina ha spiegato cose un pò più complesse, se avrò altri problemi continuerò in questa discussione
__________________
#FollowMe!AMD Ryzen 1700X, ASUS Crosshair VI Hero, 32 GB DDR4 Corsair Vengeance 3200, NVidia GTX 960, Samsung 970 PRO, Phanteks Enthoo EVOLV ATX TG, LC EKWB custom loop e un po' di RGB... |
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Dec 2009
Città: Varese
Messaggi: 274
|
Riuppo questo topic per un altro problemino.
Ho creato un semplice programmino che dall'inserimento del nome e dell'anno di nascita ti dice quanti anni hai... Tuttavia mi è venuto in mente che tutti scriverebbero il loro nome in minuscolo, quindi mi piacerebbe trasformare la prima lettera del nome in maiuscolo. il problema è che mi da un errore in compilazione. ho provato a sfogliare il libro ma non ho trovato nulla che mi aiutasse... scusate la banalità, sto facendo tutto per "allenarmi". ecco il codice: Codice:
import prog.io.*;
class CalcoloEta {
public static void main(String[] args)
{
//predisposizione canali comunuicazione
ConsoleInputManager tastiera = new ConsoleInputManager();
ConsoleOutputManager video = new ConsoleOutputManager();
//dichiarazione variabili utilizzate
int anno;
int eta;
String nome;
String inizNome;
String inizNomeToUp;
String restoNome;
//richiesta nome ed età
nome = tastiera.readLine("Inserisca il suo nome: ");
anno = tastiera.readInt("Inserisca il suo anno di nascita: ");
//calcolo età
eta = 2011 - anno;
//rendi maiuscola l'iniziale del nome
inizNome = nome.subsrting(0, 0);
inizNomeToUp = inizNome.toUpperCase();
//resto del nome
restoNome = nome.substring(1, 20);
//comunicazione risultato
video.println("Buongiorno " + inizNome + restoNome + ", hai " + eta + " anni.");
}
}
grazie in anticipo!
__________________
#FollowMe!AMD Ryzen 1700X, ASUS Crosshair VI Hero, 32 GB DDR4 Corsair Vengeance 3200, NVidia GTX 960, Samsung 970 PRO, Phanteks Enthoo EVOLV ATX TG, LC EKWB custom loop e un po' di RGB... Ultima modifica di djadry : 09-11-2011 alle 18:32. |
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Dec 2009
Città: Varese
Messaggi: 274
|
dopo un pò di scleri ho risolto così, grazie a tutti lo stesso
Codice:
import prog.io.*;
class CalcoloEta {
public static void main(String[] args)
{
//predisposizione canali comunuicazione
ConsoleInputManager tastiera = new ConsoleInputManager();
ConsoleOutputManager video = new ConsoleOutputManager();
//dichiarazione variabili utilizzate
int anno;
int eta;
String nome;
String inizNome;
String inizNomeToUp;
String restoNome;
//richiesta nome ed età
nome = tastiera.readLine("Inserisca il suo nome: ");
anno = tastiera.readInt("Inserisca il suo anno di nascita: ");
//calcolo età
eta = 2011 - anno;
//rendi maiuscola l'iniziale del nome
inizNome = nome.substring(0, 1);
inizNomeToUp = inizNome.toUpperCase();
//ricava numero caratteri
int lunghezza = nome.length();
//resto del nome
restoNome = nome.substring(1, lunghezza);
//comunicazione risultato
video.println("Buongiorno " + inizNomeToUp + "" + restoNome + ", hai " + eta + " anni.");
}
}
__________________
#FollowMe!AMD Ryzen 1700X, ASUS Crosshair VI Hero, 32 GB DDR4 Corsair Vengeance 3200, NVidia GTX 960, Samsung 970 PRO, Phanteks Enthoo EVOLV ATX TG, LC EKWB custom loop e un po' di RGB... |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
La mia soluzione
Codice:
nome = Character.toUpperCase(nome.charAt(0)) + nome.substring(1); |
|
|
|
|
|
#13 | |
|
Member
Iscritto dal: Dec 2009
Città: Varese
Messaggi: 274
|
Quote:
__________________
#FollowMe!AMD Ryzen 1700X, ASUS Crosshair VI Hero, 32 GB DDR4 Corsair Vengeance 3200, NVidia GTX 960, Samsung 970 PRO, Phanteks Enthoo EVOLV ATX TG, LC EKWB custom loop e un po' di RGB... |
|
|
|
|
|
|
#14 |
|
Member
Iscritto dal: Dec 2009
Città: Varese
Messaggi: 274
|
scrivo sempre in questo topic
ragazzi come gestisco la creazione di alcune stringhe a seconda di un int che immette l'utente? più nello specifico devo creare delle stringhe che mi rappresentino delle frazioni. sto provando a scrivere questo pezzo di codice, ma non so come continuare: Codice:
//quante frazioni?
int numF = tastiera.readInt("quante frazioni vuoi inserire? ");
//creazione frazioni in base al numero immesso
for (numF = 0; numF<10; numF++)
Per creare una frazione di solito: usiamo la classe "Frazione", in questo modo: Codice:
num = tastiera.readInt("Numeratore frazione ");
den = tastiera.readInt("Denominatore frazione ");
Frazione uno = new Frazione(num, den);
Frazione due = new Frazione(num, den);
edit: ps: avevo fatto una cosa del genere, ma mi sembrava un delirio totale ![]() Codice:
new Frazione((tastiera.readInt("Inserisci num e den").(num, den)));
__________________
#FollowMe!AMD Ryzen 1700X, ASUS Crosshair VI Hero, 32 GB DDR4 Corsair Vengeance 3200, NVidia GTX 960, Samsung 970 PRO, Phanteks Enthoo EVOLV ATX TG, LC EKWB custom loop e un po' di RGB... Ultima modifica di djadry : 20-11-2011 alle 18:33. |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
Codice:
for(int i = 0; i < numF; i++) {
int num = tastiera.readInt("Numeratore frazione ");
int den = tastiera.readInt("Denominatore frazione ");
Frazione f = new Frazione(num, den);
}
Codice:
Frazione[] frazioni = new Frazione[numF];
for(int i = 0; i < numF; i++) {
int num = tastiera.readInt("Numeratore frazione ");
int den = tastiera.readInt("Denominatore frazione ");
frazioni[i] = new Frazione(num, den);
}
|
|
|
|
|
|
#16 |
|
Member
Iscritto dal: Dec 2009
Città: Varese
Messaggi: 274
|
ok il definitivo è
Codice:
Frazione[] frazioni = new Frazione[numF]; //creo l'array per memorizzare le frazioni che inserirò
for (int pos = 0; pos < numF; pos++) {
int num = in.readInt("Numeratore? ");
int den = in.readInt("Denominatore? ");
frazioni [pos] = new Frazione(num, den);
}
for (int pos = 0; pos < frazioni.length; pos++)
out.println(frazioni[pos].toString());
}
}
ti ringrazio di nuovo
__________________
#FollowMe!AMD Ryzen 1700X, ASUS Crosshair VI Hero, 32 GB DDR4 Corsair Vengeance 3200, NVidia GTX 960, Samsung 970 PRO, Phanteks Enthoo EVOLV ATX TG, LC EKWB custom loop e un po' di RGB... |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:39.





















