Newsgroup: it.comp.java
Titolo: console per sapere quanti giorni sono passati dall'inizio dell'anno( lungo)

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)
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

> Per chiarezza riporto il codice:
Oddio...
Ma perchè non inizi ad abituarti a progettare ad oggetti???
La tua applicazione ha come input una data, effettua un'elaborazione e poi
fornisce in output la risposta.
Tanto per cominciare potresti realizzare una classe che si occupa di gestire
l'input, facendo tutti i controlli del caso.
Poi realizzi la classe che effettua il conteggio dei giorni e restituisce il
valore.
Usando le classi Date e Calendar ce la fai.
Ciao
Marco 

 Usando le classi Date e Calendar ce la fai.
eh,magari potessi, ma l'esercizio mi obbliga a fare tutto in un solo
programma,facendo una sola classe chiamata Data_Inizio o magari
qualcos'altro di simile.É proprio il caso di dirlo: w la programmazione ad
oggetti.Ma che colpa ne ho se la prof si ostina a farci ragionare su
questi contorti programmi invece di insegnarci che java č diverso, che č
un linguaggio orientato agli oggetti, che in esso vi sono miriadi di
classi, di metodi, che non č un linguaggio come gli altri,si basa su
oggetti...potrei continuare per secoli ma comunque il programma deve
andare con il metodo main,con una sola classe.
perchč complicare per niente?mah,i segreti dei proffe di informatica.....


 perchè complicare per niente?mah,i segreti dei proffe di informatica.....
Ma frustare la prof?!... :-)
Ciao
Marco 

Vabbč, visto che devi farti del male, diamo un occhio al problema.
Tanto per cominciare spiegami una cosa.
Se devi realizzare un'applicazione-console, perchč diavolo utilizzi un 
InputDialog???
Se l'applicazione č a console, l'I/O deve essere a linea di comando.
Se mi dici che anche questo te l'ha detto la prof, allora va radiata 
dall'albo degli insegnanti!!! :-)
Non potrai usare altre classi, ma almeno altri metodi sě!!
Inizia a reaizzare dei metodi che ti possano tornare utili.
Ad esempio:
- isLeap(int year), che ti dice se l'anno č bisestile
- getDaysInMonth(int month), che ti restituisce il numero di giorni 
contenuti nel mese passato come argomento
- isValidDate(int day, int month, int year), che ti dice se la data č valida
In questo modo ti concentri sul codice di questi metodi e semplifichi 
enormemente il flusso principale del programma.
Ciao
Marco 

 metodi più semplici purtroppo.
Cicli si e array no eh?
Molto utili i cicli senza la possibilita' di utilizzare array o liste!
Cmq prova a modificare questo codice che mi sembra molto piu' chiaro del 
tuo:
public static void main(String args[]) {
  int month = 3;
  int day = 22;
  int year = 2005;
  int sum = 0;
  int temp = 2;
  if(month > 1) {
   switch(1) {
   case 1: sum += 31;
     if(month == temp++) break;
   case 2: sum += (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 
0))? 29 : 28;
     if(month == temp++) break;
   case 3: sum += 31;
     if(month == temp++) break;
   case 4: sum += 30;
     if(month == temp++) break;
   case 5: sum += 31;
     if(month == temp++) break;
   }
   // ......ecc fino a case 12
  }
  sum += day-1;
  System.out.println(sum);
 } 

 Marco
ciao!!!!ci vedremo al funerale della proffe....ah,noi sul forum non ci
siamo mai incontrati....cmq il codice l'ho rifatto appena adesso
ascoltanto si può dare di + e pupo.Nella speranza di finire presto le
canzoni ho elaborato un contorto ragionamento.Vuoi provare a compilarlo
senza cercare di capirci qualcosa???
import javax.swing.*;
public class DataInizioAnno{
    public static void main (String args []){
        int g,m,a,gtot=0,gmes,bis=0;
        do{
            g=Integer.parseInt(JOptionPane.showInputDialog("inserisci un
giorno"));
        } while (g<0 || g>31);
        do{
            m=Integer.parseInt(JOptionPane.showInputDialog("inserisci un
mese"));
        } while (m<0 || m>12);
        do{
            a=Integer.parseInt(JOptionPane.showInputDialog("inserisci un
anno"));
        } while (m<0);
 
        if (a%100==0){
            if (a%400==0){
                bis=1;
            }
        }
        else{
            if (a%4==0){
                bis=1;
            }
        }
        if ( (bis==0) && (m==2 & g>28) ){
            JOptionPane.showMessageDialog(null,"febbraio non può avere più
di 28 giorni, perchè l'anno non è bisestile");
        }
        else{
            m=m-1;
            while (m>0){
                if (m==4||m==6||m==9||m==11){
                    gmes=30;
                    gtot=gtot+gmes;
                }
                else{
                    if (m==1||m==3||m==5||m==7||m==8||m==10){
                        gmes=31;
                        gtot=gtot+gmes;
                    }
                    else{
                        if (m==2 & bis==0){
                            gmes=28;
                            gtot=gtot+gmes;
                        }
                        else{
                            gmes=29;
                            gtot=gtot+gmes;
                        }//else
                    }
                }
                m--;
            }//while           
            gtot=gtot+g;
            JOptionPane.showMessageDialog(null,"dall'inizio dell'anno sono
passati "+gtot+" giorni");
        }//else
    }//class
}//main


 Marco


  }
grazie!nella mia mente contorta ho elaborato un'altra soluzione....è molto
complicata da capire senza spiegazioni di chi l'ha fatta, e questo se non
sbaglio è assolutamente contro ai principi della programmazione, ma sai,
da oggi nei nuovi corsi ci insegnano così: programmi in java? tralascia
gli oggetti,le classi,i metodi, fai casino con 2 if e un ciclo, non far
capire il ragionamento agli altri,perdici una giornata su un cazzosissimo
problema che lo puoi fare in 3 secondi grazie alla semplicità di java,
spreca cicli macchina,appesandisci tutto il sistema....
ma vaffanc, passa la voglia di studiare informatica!
cmq grazie per il suggerimento
ciao



Java puo' essere usato anche in maniera procedurale volendo. Basta fare 
classi con metodi e campi statici.
Immagino che l'obiettivo del corso non sia insegnare il linguaggio Java ma i 
fondamenti di programmazione quindi i costrutti di base, gli algoritmi ecc.
Non condivido il modo in cui si sta cercando di insegnarli, perche' vi sta 
inculcando una cattiva programmazione.
Ma questo non per il fatto di vietare l'utilizzo di cio' che riguarda gli 
oggetti in Java.
Potresti scrivere un bel codice pulito utilizzando array e funzioni, ma 
vietare anche queste e' contro i principi della programmazione, e non vi 
servira' a nulla imparare a fare switch come quello che ti ho mostrato io 
per esempio. 

 per esempio.
oltre a quello hanno un senso questi problemi??Vado a pensare ogni volta
alle soluzioni + lunghe e laboriose, e poi quando ho dei dubbi e posto un
messaggio  tutti mi dicono:ma perchè non usi array?perchè non lo dividi in
classi?perchè non usi altre classi?
la risposta è unica x tutte le domande, ho trovato una soluzione per
risolvere una classe di problemi:proffe


 metodi piů semplici purtroppo.
Basta calcolare il giorno giuliano, anzi una cosa molto piů semplice visto
che  devi solo calcolare i giorni passati dall'inizio dell'anno. Facendo
cosě basta fare una differenza per sapere i giorni passati.
Cerca i dettagli dell'algoritmo su internet, e magari semplificalo: sono
tutti banali calcoli matematici...
ciao
uL


 alle soluzioni + lunghe e laboriose, 
Hanno molto senso: secondo te come si fa ad implementare le classi del jdk
(Calendar, per esempio)? 
E' un piccolo problema ma didatticamente è più interessante che usare
delle classi già fatte. Inoltre ha due soluzioni tipiche, una con il
giuliano ed una senza (come l'hai impostata tu). Può essere usato come
esempio per capire l'incapsulamento
uL



Non credo che sia affatto interessante dover scrivere codice "espanso" 
perche' la docente mi vieta l'utilizzo di strutture dati come ad esempio gli 
array.
Inoltre non credo che usare algoritmi particolari sia quello che vuole il 
docente...lei voleva solo farli impratichire con i costrutti di base del 
linguaggio, ma a mio avviso nella maniera sbagliata.