skrich
2006-01-01 20:44:41 UTC
devo realizzare un programma-console che, inserita una data in ingresso
dica quanti giorni sono passati dall'inizio dell'anno.
Riporto il codice per ulteriore chiarezza, ma quello che non mi piace del
programma è il ragionamento.
Premetto che posso usare if-else-cicli-al massimo switch,non array o
metodi più semplici purtroppo.
Allora, inserita una data composta da gg/mm/aaaa faccio il controllo degli
input,così se mi danno una data come mese febbraio e giorni 30 il
programma ripete la domanda,se il mese è un numero superiore al 12 ripete
la domanda. Il controllo degli input l'ho fatto con un do-while.
poi parte il programma.Prima di entrare nel ciclo, dal quale si esce
quando la variabile m (mese) raggiunge lo 0, sottraggo al mese di partenza
1,perchè non so da quanti giorni sia iniziato il mese.A fine programma
quindi sommo i giorni che mi da l'utente in ingresso al totale dei giorni
finali.
Dentro al ciclo metto le if,se il mese è 4-5-7-1 ecc. allora gtot (giorni
totali) sono uguali a gtot+31. Se il mese ha 30 giorni allora gtot=gtot+30
e così via.Il problema inizia con febbraio:faccio due tre if e scopro se
l'anno e bisestile, quando so se è bisestile a febbraio assegno 29g invece
che 28.
Alla fine si esce dal ciclo e si sommano i giorni messi in partenza
dall'utente alla varibile gtot.
Ma se l'utente mette in entrata il 29/2/2005 ad esempio, x il programma il
29/2 è una data possibile,infatti febbraio può avere 29 giorni.Solo che in
realtà il 2005 non ha avuto febbraio con 29 giorni!
ma il programma non se ne accorge perchè togliendo un mese prima di
entrare nel ciclo, calcola che gennaio (febbraio-1) ha 31 giorni,poi esce
dal ciclo e aggiunge a gtot che ora varrà 31 i giorni inseriti in input
dall'utente, cioè 29.Ma febbraio non ha 29 giorni nel 2005, quindi i
giorni passati dall'inizio dell'anno saranno 59 e non 60!
Mettere un if prima del ciclo per verificare se l'utente mette 29 giorni a
febbraio in un anno non bisestile farebbe diventare il programma troppo
lungo.Cosa mi consigliate?
Per chiarezza riporto il codice:
import javax.swing.*;
public class DataInizioAnno{
public static void main (String args[]){
int g,m,a,gmes,gtot=0;
do{
g=Integer.parseInt(JOptionPane.showInputDialog("inserisci il
giorno"));
}while (g>31||g<0);
do{
m=Integer.parseInt(JOptionPane.showInputDialog("inserisci il
mese"));
}while ( (m>12||m<0) || (m==2 & g>29) );
do{
a=Integer.parseInt(JOptionPane.showInputDialog("inserisci
l'anno"));
} while (a<0);
m=m-1;
while (m>0){
if (m==1 & g>29){
m=0;
}
else{
if (m==4||m==6||m==9||m==11) {
gmes=30;
gtot=gmes+gtot;
}//if
else{
if (m==1||m==3||m==5||m==7||m==8||m==10){
gmes=31;
gtot=gmes+gtot;
}
else{
if (a%100==0){
if(a%400==0){
if(m==2){
gmes=29;
gtot=gmes+gtot;
}
}
}
else{
if (a%4==0){
gmes=29;
gtot=gmes+gtot;
}
else{
gmes=28;
gtot=gmes+gtot;
}
}
}//else
}//else
m--;
}//else
}//while
gtot=gtot+g;
JOptionPane.showMessageDialog(null,"i giorni che sono passati
dall'inizio dell'anno sono "+gtot);
}
}
vi consiglio,se avete voglia di guardare il codice, di copiarlo e
incollarlo da qualche parte perchè è illeggibile così(almeno
l'indentazione l'ho fatta corretta)
dica quanti giorni sono passati dall'inizio dell'anno.
Riporto il codice per ulteriore chiarezza, ma quello che non mi piace del
programma è il ragionamento.
Premetto che posso usare if-else-cicli-al massimo switch,non array o
metodi più semplici purtroppo.
Allora, inserita una data composta da gg/mm/aaaa faccio il controllo degli
input,così se mi danno una data come mese febbraio e giorni 30 il
programma ripete la domanda,se il mese è un numero superiore al 12 ripete
la domanda. Il controllo degli input l'ho fatto con un do-while.
poi parte il programma.Prima di entrare nel ciclo, dal quale si esce
quando la variabile m (mese) raggiunge lo 0, sottraggo al mese di partenza
1,perchè non so da quanti giorni sia iniziato il mese.A fine programma
quindi sommo i giorni che mi da l'utente in ingresso al totale dei giorni
finali.
Dentro al ciclo metto le if,se il mese è 4-5-7-1 ecc. allora gtot (giorni
totali) sono uguali a gtot+31. Se il mese ha 30 giorni allora gtot=gtot+30
e così via.Il problema inizia con febbraio:faccio due tre if e scopro se
l'anno e bisestile, quando so se è bisestile a febbraio assegno 29g invece
che 28.
Alla fine si esce dal ciclo e si sommano i giorni messi in partenza
dall'utente alla varibile gtot.
Ma se l'utente mette in entrata il 29/2/2005 ad esempio, x il programma il
29/2 è una data possibile,infatti febbraio può avere 29 giorni.Solo che in
realtà il 2005 non ha avuto febbraio con 29 giorni!
ma il programma non se ne accorge perchè togliendo un mese prima di
entrare nel ciclo, calcola che gennaio (febbraio-1) ha 31 giorni,poi esce
dal ciclo e aggiunge a gtot che ora varrà 31 i giorni inseriti in input
dall'utente, cioè 29.Ma febbraio non ha 29 giorni nel 2005, quindi i
giorni passati dall'inizio dell'anno saranno 59 e non 60!
Mettere un if prima del ciclo per verificare se l'utente mette 29 giorni a
febbraio in un anno non bisestile farebbe diventare il programma troppo
lungo.Cosa mi consigliate?
Per chiarezza riporto il codice:
import javax.swing.*;
public class DataInizioAnno{
public static void main (String args[]){
int g,m,a,gmes,gtot=0;
do{
g=Integer.parseInt(JOptionPane.showInputDialog("inserisci il
giorno"));
}while (g>31||g<0);
do{
m=Integer.parseInt(JOptionPane.showInputDialog("inserisci il
mese"));
}while ( (m>12||m<0) || (m==2 & g>29) );
do{
a=Integer.parseInt(JOptionPane.showInputDialog("inserisci
l'anno"));
} while (a<0);
m=m-1;
while (m>0){
if (m==1 & g>29){
m=0;
}
else{
if (m==4||m==6||m==9||m==11) {
gmes=30;
gtot=gmes+gtot;
}//if
else{
if (m==1||m==3||m==5||m==7||m==8||m==10){
gmes=31;
gtot=gmes+gtot;
}
else{
if (a%100==0){
if(a%400==0){
if(m==2){
gmes=29;
gtot=gmes+gtot;
}
}
}
else{
if (a%4==0){
gmes=29;
gtot=gmes+gtot;
}
else{
gmes=28;
gtot=gmes+gtot;
}
}
}//else
}//else
m--;
}//else
}//while
gtot=gtot+g;
JOptionPane.showMessageDialog(null,"i giorni che sono passati
dall'inizio dell'anno sono "+gtot);
}
}
vi consiglio,se avete voglia di guardare il codice, di copiarlo e
incollarlo da qualche parte perchè è illeggibile così(almeno
l'indentazione l'ho fatta corretta)
--
questo articolo e` stato inviato via web dal servizio gratuito
http://www.newsland.it/news segnala gli abusi ad ***@newsland.it
questo articolo e` stato inviato via web dal servizio gratuito
http://www.newsland.it/news segnala gli abusi ad ***@newsland.it