PDA

View Full Version : Esercizio java. Mi aiutate a spiegarlo?


Frenky-90
05-01-2012, 11:33
Ciao Ragazzi sto seguendo un corso java via Web. Sono arrivato al punto delle esercitazioni. Questo è l'esercizio

Basandosi sulla dispensa "Ricevere dati da tastiera" e sapendo che l'affermazione
int valore = Integer.parseInt("1977");
restituisce un intero di valore 1977. Scrivere un programma che chiede all'utente il suo anno di nascita e restituisce la sua età.


Questo è il programma compilato.
import javax.swing.JOptionPane;

import java.util.Calendar;


public class CalcolaEta {


public static void main(String[] args){

String annoInput = JOptionPane.showInputDialog("inserisci il tuo anno di nascita:");

int eta = calcolaEta(annoInput);

String msg = "La tua età è di "+eta+" anni";

JOptionPane.showMessageDialog(null, msg);


}

public static int calcolaEta(String anno){

int annoNascita = Integer.parseInt(anno);

Calendar oggi = Calendar.getInstance();

int annoCorrente = oggi.get(Calendar.YEAR);


if(annoCorrente>=annoNascita){

return annoCorrente - annoNascita;

}
else {return 0;}


}


}

Fino alla prima parte di codice ci sto, perchè è il metodo joptinpane per crearmi una finestra per ricevere dati. E' la seconda parte del codice che non mi è proprio chiara. Qualcuno puo aiutarmi ad analizzarla?
Grazie.

clockover
05-01-2012, 12:07
public static int calcolaEta(String anno){

//"trasforma" la stringa anno in un numero intero
int annoNascita = Integer.parseInt(anno);

//Oggetto calendario
Calendar oggi = Calendar.getInstance();
//restituisce l'anno corrente
int annoCorrente = oggi.get(Calendar.YEAR);

//se l'anno corrente è maggiore uguale all'anno di nascita
if(annoCorrente>=annoNascita){
//ti stituisce la loro differenza, quindi l'età
return annoCorrente - annoNascita;

}
//altrimenti ritorna 0
else {return 0;}

Frenky-90
05-01-2012, 13:21
E' normale che io non abbia mai potuto sapere inserire questi due comandi?

Calendar oggi = Calendar.getInstance();
int annoCorrente = oggi.get(Calendar.YEAR);


Un'altra cosa questa è una super classe che poi dovra contenere sotto classi Leone, lupo gatto cane. A che cosa serve il this.??


public class Animale {
private boolean domestico;
private int numero zampe;
private String famiglia;
public animale (boolean domestico, int numero zampe, String famiglia); {
This.domestico = domestico;
this.numerozampe = numeroZampe;
this.famiglia = famiglia;

P.s ce ne vuole di tempo per entrare nella logica del linguaggio java vero?


Grazie.. userò questo thread per postare altri dubbi..
Grazie dell aiuto.

ndakota
05-01-2012, 13:24
E' normale che io non abbia mai potuto sapere inserire questi due comandi?

Calendar oggi = Calendar.getInstance();
int annoCorrente = oggi.get(Calendar.YEAR);

E' normale. Imparerai a conoscere classi della libreria standard un po' alla volta, quando ti serviranno.

Un'altra cosa questa è una super classe che poi dovra contenere sotto classi Leone, lupo gatto cane. A che cosa serve il this.??

In questo caso stai dicendo che quel famiglia, è riferito al membro della classe Animale(perché siamo dentro la classe animale).


public class Animale {
private boolean domestico;
private int numero zampe;
private String famiglia;
public animale (boolean domestico, int numero zampe, String famiglia); {
This.domestico = domestico;
this.numerozampe = numeroZampe;
this.famiglia = famiglia;

P.s ce ne vuole di tempo per entrare nella logica del linguaggio java vero?

Se è il tuo primo linguaggio probabilmente sì.

Grazie.. userò questo thread per postare altri dubbi..
Grazie dell aiuto.

Risposte ciccione.

Frenky-90
05-01-2012, 20:53
Ok chiaro. Grazie.
Tornerò con altri esercizi.:)

Frenky-90
06-01-2012, 13:01
//Avvio di Notepad
class StartNotepad {

public static void main(String args[]) {

Runtime rt = Runtime.getRuntime();

Process proc;

try {

proc = rt.exec("notepad");

proc.waitFor();
}
catch (Exception e) {

System.out.println("notepad è un comando sconosciuto.");
}

}

}

Può essere spiegato?
Qui c'è il blocco try catch, a che cosa serve qui?
Avviandolo da prompt, mi apre il blocco note.

Mettiu_
06-01-2012, 13:32
L'istruzione proc = rt.exec("notepad"); provoca l'esecuzione del programma notepad (che è appunto il blocco note di win).
L'istruzione proc.waitFor(); è usata per mettere in attesa il thread corrente della terminazione del processo prima avviato (il notepad). Il try-catch serve ad intercettare eccezioni di run-time. Ad esempio se il notepad non viene trovato o, per qualche motivo, non è possibile lanciarlo, ecc...

P.S. Il programma passato per l'esecuzione (in questo caso notepad) viene cercato nel tuo PATH di sistema.

Frenky-90
07-01-2012, 12:29
L'istruzione proc = rt.exec("notepad"); provoca l'esecuzione del programma notepad (che è appunto il blocco note di win).
L'istruzione proc.waitFor(); è usata per mettere in attesa il thread corrente della terminazione del processo prima avviato (il notepad). Il try-catch serve ad intercettare eccezioni di run-time. Ad esempio se il notepad non viene trovato o, per qualche motivo, non è possibile lanciarlo, ecc...

P.S. Il programma passato per l'esecuzione (in questo caso notepad) viene cercato nel tuo PATH di sistema.

grazie. :)
e se io invece del notepad avessi voluto avviare una qualsiasi altra applicazione di windows come sarebbe dovuta essere la sintassi?

Grazie mille.

Mettiu_
07-01-2012, 13:01
La sintassi è la stessa, cambia solo ciò che scrivi tra parentesi:
proc = rt.exec("eseguibileCheVuoiAvviare");
Se l'eseguibile è sito in una cartella inclusa nel path di sistema ti basta il nome dell'eseguibile. Diversamente, devi specificare il percorso (relativo o assoluto) dell'applicazione quindi ad es. C:\Programmi\miaCartella\mioprog.exe.

Frenky-90
07-01-2012, 21:15
cioè in proc = rt.exec("C:\Program Files\Speccy.exe") ??

Così?

Mettiu_
08-01-2012, 00:43
cioè in proc = rt.exec("C:\Program Files\Speccy.exe") ??

Così?

No, così:

proc = rt.exec("C:\\Program Files\\Speccy.exe");

Frenky-90
08-01-2012, 11:26
Ho provato ma se per esempio metto questa estensione, mi fà lo javac, ma allo java mi dice speccy un comando sconosciuto. Entra in atto il try Catch xke non riesce a trovare l'exe.

clockover
08-01-2012, 12:51
Ho provato ma se per esempio metto questa estensione, mi fà lo javac, ma allo java mi dice speccy un comando sconosciuto. Entra in atto il try Catch xke non riesce a trovare l'exe.

Il tuo "ti fa lo javac" vuol dire che in fase di compilazione non ci sono errori, quindi la sintassi è corretta.

Il tuo errore è dunque a runtime e l'eseguibile da te indicato non c'è

Frenky-90
17-01-2012, 11:19
ESERCITAZIONI PER L’ARGOMENTO “ECCEZIONI”

2 Scrivere un programma che, dato il nome di un file, scrive su questo file il testo che l'utente digita a console, quindi rilegge il contenuto e lo stampa sull'output.


Soluzione

import java.io.*;

/**
* Dato il nome di un file, scrive su questo file il testo che l'utente digita
* a console, quindi rilegge il contenuto e lo stampa sull'output
*/
public class SimpleEditor {

/**
* Scrive su file il contenuto del buffered reader fino a che non trova una riga vuota
*/
static void scriviSuFile(BufferedReader input, String file) throws FileNotFoundException, IOException {
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new FileWriter(file));
String line = null;
while(!(line = input.readLine()).equals("")) {
bw.write(line);
bw.newLine();
}
} finally {
if(bw != null)
try {
bw.close(); // questo implica la flush
} catch(Exception e) {}
}
}

/**
* Stampa sull'output fornito il contenuto del file
*/
static void stampaSuOutput(PrintStream out, String file) throws FileNotFoundException, IOException {
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(file));
String line = null;
while((line = br.readLine()) != null) {
out.println(line);
}
} finally {
if(br != null)
try {
br.close();
} catch(Exception e) {}
}
}

public static void main(String[] args) {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

System.out.println("Indica il nome del file di testo da creare: ");
String file = in.readLine();

System.out.println("Ora digita il contenuto del file di testo. \n" +
"Premi due volte invio per terminare");
scriviSuFile(in, file);

System.out.println("Il file e' stato scritto. Ora lo rileggo e ti mostro il contenuto");
stampaSuOutput(System.out, file);
} catch(FileNotFoundException fnfe) {
System.out.println("Non ho trovato il file specificato");
fnfe.printStackTrace();
} catch(IOException e) {
System.out.println("Errore di io generico riscontrato durante l'operazione.");
e.printStackTrace();
}
}
}


Riuscite a capirlo?

clockover
17-01-2012, 12:08
Potresti indentare il codice per piacere?
Codice indentato
public static void main(String args[]){
System.out.println("Ciao");
}


Codice non indentato
public static void main(String args[]){
System.out.println("Ciao");
}

ci aiuti a capire meglio quello che dobbiamo capire :)

Frenky-90
17-01-2012, 13:37
Il fatto è che non lo sò.
Questa è la soluzione dell esercizio proposta da loro.
Il tema è questo
Scrivere un programma che, dato il nome di un file, scrive su questo file il testo che l'utente digita a console, quindi rilegge il contenuto e lo stampa sull'output

Riusciresti comunque a fare qualcosa?:)

banryu79
17-01-2012, 14:36
Potresti indentare il codice per piacere?


Il fatto è che non lo sò.

Non riesci ad identare del codice? Voilà...

import java.io.*;

/**
* Dato il nome di un file, scrive su questo file il testo che l'utente digita
* a console, quindi rilegge il contenuto e lo stampa sull'output
*/
public class SimpleEditor {

/**
* Scrive su file il contenuto del buffered reader fino a che non trova
* una riga vuota
*/
static void scriviSuFile(BufferedReader input, String file)
throws FileNotFoundException, IOException {
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new FileWriter(file));
String line = null;
while (!(line = input.readLine()).equals("")) {
bw.write(line);
bw.newLine();
}
} finally {
if (bw != null) try {
bw.close(); // questo implica la flush
} catch (Exception e) {}
}
}

/**
* Stampa sull'output fornito il contenuto del file
*/
static void stampaSuOutput(PrintStream out, String file)
throws FileNotFoundException, IOException {
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(file));
String line = null;
while ((line = br.readLine()) != null) {
out.println(line);
}
} finally {
if (br != null) try {
br.close();
} catch (Exception e) {}
}
}

public static void main(String[] args) {
try {
BufferedReader in =
new BufferedReader(newInputStreamReader(System.in));

System.out.println("Indica il nome del file di testo da creare: ");
String file = in.readLine();

System.out.println("Ora digita il contenuto del file di testo." +
"\nPremi due volte invio per terminare");
scriviSuFile(in, file);

System.out.println("Il file e' stato scritto. " +
"Ora lo rileggo e ti mostro il contenuto");
stampaSuOutput(System.out, file);
} catch (FileNotFoundException fnfe) {
System.out.println("Non ho trovato il file specificato");
fnfe.printStackTrace();
} catch (IOException e) {
System.out.println("Errore di io generico riscontrato " +
"durante l'operazione.");
e.printStackTrace();
}
}
}

Frenky-90
17-01-2012, 16:10
aaaa ok ecco cos'è l'indentazione. !! Scusatemi , ma visto che sono ipernuovo non capivo che dovevo scalare il testo nel blocco note.
Nel blocco note è indentato, solo che con il copia incolla si è levato.
Sorry.

Potreste spigarmi? Sono ad un punto in java, dove vengono spiegate le eccezioni, con try catch, throw e finally, ma non troppo le ho intese nella teoria, o meglio, il blocco try catc in se per se si, ma throw finally no!
Spero che con gli esercizi mi entri bene i mente. Spero anche di confidare nel vostro aiuto.

Grazie

clockover
17-01-2012, 16:13
Potresti spiegarmi cosa hai fatto?

Ha indentato il codice

Frenky-90
17-01-2012, 16:18
Ha indentato il codice

si si..
Ho aggiornato il post sopra, xke ci sono arrivato in ritardo:p

clockover
17-01-2012, 16:25
quando entri in un blocco try vuol dire che stai eseguendo un pezzo di codice che potrebbe fallire e bloccare il tuo programma (in parole proprio spicciole) quindi
try{
fai qualcosa che potrebbe fallire
}catch(Eccezione){
fai qualcosa se fallisce per tentare di recuperare o stampa un messaggio di avviso, ecc
Eccezione è il tipo di errore che l'operazione "rischiosa" scatena in caso di fallimento.
Ad esempio IOException è un eccezione che può verificarsi scrivendo su un file. Magari un file protetto da scrittura provi a scriverci ma la scrittura fallisce.
}finally{
qui dentro ci finisci sempre, o fallisci o non fallisci
}

tutto in poche parole... comunque le eccezioni sono molto importanti... fai da solo delle prove più semplici per capire cosa succede, ad esempio prova a inserire delle System.out.println("qualcosa") nei blocchi catch e finally

banryu79
17-01-2012, 16:39
@ Frenky-90:
Mastichi l'inglese? Se sì, ti consiglio caldamente la lettura di questa trail dei Java Tutorial nel sito della Oracle:
Java Tutorial -> Lesson: Exceptions (http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html)

Frenky-90
18-01-2012, 09:17
S un pochetto si.

Ho due slide che mi ha fornito il corso in cui si parla di eccezioni e Threads, però sai vengono applicati a piccoli esempi.
Se mi danno un esercizio con questo tema: Scrivere un programma che, dato il nome di un file, scrive su questo file il testo che l'utente digita a console, quindi rilegge il contenuto e lo stampa sull'output, non avrei mai saputo scrivere tutto quel patatrack che ho postato prima.
Come mai?

Rileggendo la slide ho visto che
-Le eccezioni sono oggetti, quindi vengono raggruppate, tipo definite in java.IO, dove sono presenti errori come FileNotFoundException e IOExceptio.
-il throws serve ad indicare che viene ignorata quella eccezione e si passa la gestione ad n altro metodo.
- Il blocco finally deve essere sempre sempre inserito dopo Try-Catch???
-throw crea eccezioni...trhow new

Ora però è possibile spiegare i blocchi di esercizio come fatto con gli altri esercizi?
import java.io.*;
public class SimpleEditor
static void scriviSuFile(BufferedReader input, String file)
throws FileNotFoundException, IOException {
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new FileWriter(file));
String line = null;
while (!(line = input.readLine()).equals("")) {
bw.write(line);
bw.newLine();
}
} finally {
if (bw != null) try {
bw.close(); // questo implica la flush
} catch (Exception e) {}
}
}


static void stampaSuOutput(PrintStream out, String file)
throws FileNotFoundException, IOException {
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(file));
String line = null;
while ((line = br.readLine()) != null) {
out.println(line);
}
} finally {
if (br != null) try {
br.close();
} catch (Exception e) {}
}
}


public static void main(String[] args) {
try {
BufferedReader in =
new BufferedReader(newInputStreamReader(System.in));

System.out.println("Indica il nome del file di testo da creare: ");
String file = in.readLine();

System.out.println("Ora digita il contenuto del file di testo." +
"\nPremi due volte invio per terminare");
scriviSuFile(in, file);

System.out.println("Il file e' stato scritto. " +
"Ora lo rileggo e ti mostro il contenuto");
stampaSuOutput(System.out, file);
} catch (FileNotFoundException fnfe) {
System.out.println("Non ho trovato il file specificato");
fnfe.printStackTrace();
} catch (IOException e) {
System.out.println("Errore di io generico riscontrato " +
"durante l'operazione.");
e.printStackTrace();
}
}
}

Frenky-90
24-01-2012, 09:46
Ciao.
Se vi posto un test di java mi aiutate a farlo?
Se nn lo passo non mi sblocca le altre parti di lezione. intanto ora mi sto concentrando su MySql e XHTML.

Posso?

ndakota
24-01-2012, 14:41
Vai.

Frenky-90
25-01-2012, 12:16
ok

ndakota
25-01-2012, 13:03
Boh, non saprei :stordita:

banryu79
25-01-2012, 13:05
@Frenky-90: e anche a tutti gli altri.
Ricordo che il regolamento di sezione di questo forum vieta di chiedere (e fornire) risposte/soluzioni complete a esercizi/test/esami scolastici, per ovvie ragioni.

Un conto è aiutare a dipanare i dubbi di utente in difficoltà, o a ragionare assieme a lui e/o a correggere del codice; un altro è dare soluzioni ad esercizi o test soggetti a valutazione.

Scusate la pedanteria, ma vedo che ultimamente i mod latitano.

clockover
25-01-2012, 13:07
E io ancora non riesco a capire se indentare il codice si paghi :doh:

Frenky-90
25-01-2012, 13:10
si adesso cancello.
cancellerà anche ndakota...
cmq grazie.
Cmq è un test che ho pagato, non è un esame.. puoi farti aiutare da chi vuoi, basta che capisci l'esercizio.

banryu79
25-01-2012, 13:17
Cmq è un test che ho pagato, non è un esame.. puoi farti aiutare da chi vuoi, basta che capisci l'esercizio.
Ah bon, guarda, io mi sono solo limitato a ricordare cosa dice il regolamento del forum: non sono un moderatore ne pretendo che tu o ndakota cancelliate alcunchè.
Fine OT.

ndakota
25-01-2012, 18:44
Io mi chiedo che fine abbia fatto Cionci. E anche PGI-Bis :cry: