Calcular Dia de la Semana

quisiera qe alguin me ayudara kmo identificar los años biciestoos ya qe son los unicos que me fallan y kmo le puedo hacer para calcular los años negativoos (ya me qebre el cerebrooo) pero no encuentro ninguna formaa o si ven algun error porfavoor diganme :P

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package programaaño2;
import java.io.*;
/**
 *
 * @author Usuario
 */

public class Main {

    /**
     * @param args the command line arguments
     */

    public static void main(String[] args)throws IOException {
        // TODO code application logic here

        InputStreamReader isr = new InputStreamReader (System.in);
        BufferedReader br = new BufferedReader (isr);

        int dia,mes,año,año1,semana,x,añobici,y,z,total,u,j;

        System.out.print("Dame El Dia: ");
        dia=Integer.parseInt(br.readLine());
        System.out.print("Dame El Mes (En Numero): ");
        mes=Integer.parseInt(br.readLine());
        System.out.print("Dame El Año: ");
        año=Integer.parseInt(br.readLine());

        semana=0;
        {

        if((año / 100)%4 == 1)  x = semana + 5;
            else if ((año/100)%4==2)  x= semana+3;
                   else if ((año/100)%4==3) x = semana+1;
                          else if ((año/100)%4==0) x = semana+0;
                               
        else x=0;
         j=0;
            z = 0;
        año1=(año%100)+((año%100)/4);
        y=0;

                if (año % 400 == 0 && año % 100 != 0 && año % 4 == 0)
            if (mes==1 || mes==2) j=z-1;
                else j=z+0;

             if (mes == 8)u = y + 1;
        else if(mes == 2 || mes == 3 || mes == 11) u = y + 2;
        else if(mes == 6) u = y + 3;
        else if(mes == 9 || mes == 12 ) u = y + 4;
        else if(mes == 4 || mes == 7 ) u = y + 5;
        else if(mes == 1 || mes == 10 ) u = y + 6;
        else u = y + 0;

        total=x+y+z+año1+u+dia+j;

        if (total%7==1) System.out.print("Lunes");
            else if(total % 7 == 2) System.out.print("Martes");
            else if(total % 7 == 3) System.out.print("Miercoles");
            else if(total % 7 == 4) System.out.print("Jueves");
            else if(total % 7 == 5) System.out.print("Viernes");
            else if(total % 7 == 6) System.out.print("Sabado");
            else System.out.print("Domingo");
    }

}

y si me podrian dar consejos de como reducir la cantidad de variableees

Nota: talveeez consideren qe es un programa muy sencillo pero apenas estoi aprendiendo y es parte de una tarea finaal

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Usa Calendar

Estimado amigo no entiendo mucho tu problema según como leo tu código pides un día, un mes y un año y determinar si fue, es, o será Lunes. Martes,...
Ahora bien si estoy en lo correcto se sugiero utilizar la Clase Calendar.java que viene en java.util.Calendar

Calendar calendario = Calendar.getInstance();
//calendario.set(year, month, date);
calendario.set(2011, 3, 8);  // 2011-04-08
int dia = calendario.get(Calendar.DAY_OF_WEEK);

if (dia == 0) {
  System.out.print("Lunes");
} else if (dia == 1) {
  System.out.print("Martes");
}

Incluso hay otra forma más sencilla de hacer sin utilizar tanto IF

SimpleDateFormat formato = new SimpleDateFormat("EEEEEEE");

Calendar calendario = Calendar.getInstance();
calendario.set(year, month, date);

System.out.println(formato.format(calendario.getTime()));
<code>

bueno primero debes cambian la localización o Locale a Español para que el texto sea en español
En new SimpleDateFormat("EEEEEEE"); simplemente es un Regex si ves la documentación de SimpleDateFormat todo esta ahí y como funciona

Espero que te sirva. bueno si no te dejan usar clases de Java y te piden hacer puros cálculos solo ve las clase fuente de estos métodos y ya...
saludos

mmmm. no puedo utilizar calendar

mmm tengo que usar solamente el if, switch case, o ciclo for ya qe no eh visto aun en la clase el calendar xD y debe de ser con instrucciones qe hemos visto nada mas

como kiera agradesco tu consejoo :P ojala me puedas ayudar :P

El día de la semana o el año

El día de la semana o el año bisiesto? ¿Cuales son los años negativos?

Lo que puedes hacer para empezar es buscarlo en inglés, busca por "leap year java" y encontrarás muchísimos ejemplos.

Te pongo tu código tal cual re-formateado

package programaaño2;
import java.io.*;
/**
 *
 * @author Usuario
 */

public class Main {
    /**
     * @param args the command line arguments
     */

    public static void main(String[] args)throws IOException {
        // TODO code application logic here
        InputStreamReader isr = new InputStreamReader (System.in);
        BufferedReader br = new BufferedReader (isr);
        //int añobici;
        System.out.print("Dame El Dia: ");
        // Declara la variable lo más cerca
        // a donde la quieres usar.
        int dia=Integer.parseInt(br.readLine());
        System.out.print("Dame El Mes (En Numero): ");
        int mes=Integer.parseInt(br.readLine());
        System.out.print("Dame El Año: ");
        int año=Integer.parseInt(br.readLine());
        int semana=0;
        /*{*/ // por que esta esta llave aqui?
        int x;
        // los ifs es mejor que lleven llaves siempre
        // aunque sea de una sola linea
        if((año / 100)%4 == 1) {
            x = semana + 5;
        } else if ((año/100)%4==2) {
            x= semana+3;
        } else if ((año/100)%4==3) {
            x = semana+1;
        } else if ((año/100)%4==0) {
            x = semana+0;
        } else {
            x=0;
        }
        int j=0;
        int z = 0;
        int año1=(año%100)+((año%100)/4);
        int y=0;
        if (año % 400 == 0 && año % 100 != 0 && año % 4 == 0) {
            if (mes==1 || mes==2) {
                j=z-1;
            } else {
                j=z+0;
            }
        }
        int u;
        if (mes == 8) {
            u = y + 1;
        } else if(mes == 2 || mes == 3 || mes == 11) {
            u = y + 2;
        } else if(mes == 6) {
            u = y + 3;
        } else if(mes == 9 || mes == 12 ) {
            u = y + 4;
        } else if(mes == 4 || mes == 7 ) {
            u = y + 5;
        } else if(mes == 1 || mes == 10 ) {
            u = y + 6;
        } else {
            u = y + 0;
        }
        int total=x+y+z+año1+u+dia+j;
        if (total%7==1) {
            System.out.print("Lunes");
        } else if(total % 7 == 2) {
            System.out.print("Martes");
        } else if(total % 7 == 3) {
            System.out.print("Miercoles");
        } else if(total % 7 == 4) {
            System.out.print("Jueves");
        } else if(total % 7 == 5) {
            System.out.print("Viernes");
        } else if(total % 7 == 6) {
            System.out.print("Sabado");
        } else {
            System.out.print("Domingo");
        }
    }
}

Esto mejora un poco la legibilidad ( para otros , claro, puedo ver que para tí el código está muy claro ) y permite modificarlo un poco más fácilmente.

También puedes meter funciones para que tu main no quede tan largo y poner nombres más descriptivos:

public static getU(int mes, int y ) {
        int u;
        if (mes == 8) {
            u = y + 1;
        } else if(mes == 2 || mes == 3 || mes == 11) {
            u = y + 2;
        } else if(mes == 6) {
            u = y + 3;
        } else if(mes == 9 || mes == 12 ) {
            u = y + 4;
        } else if(mes == 4 || mes == 7 ) {
            u = y + 5;
        } else if(mes == 1 || mes == 10 ) {
            u = y + 6;
        } else {
            u = y + 0;
        }
       return u;
}

Ahorita es un método de 70 lineas, pero así es como nacen los monstruos de 2000 lineas, poco a poco y metiendole cada ves más y más al mismo método. También así vas reduciendo el número de variables ( porque las repartes entre los demás métodos )

mmmmm... es qe el programa es

mmmmm... es qe el programa es para calcular el dia de la semana y solo me fallan las fachas con años biciestos y qisiera saber kmo hacer qe tambien el programa me de los años negativos como el 300 a. C por ejemplo tambien me falla en los años menores a 100 :(

pequeña ayudadita

Si de algo te sirve, este metodo te dice cuantos dias tiene el mes en el año indicado

        public static int calculaUltimoDia (int mes, int ano) {
       
                switch (mes) {
       
                        case 1: case 3: case 5: case 7: case 8: case 10: case 12:
                                return 31;      // En estos meses siempre hay 31 dias
       
                        case 4: case 6: case 9: case 11:
                                return  30;     // En estos meses siempre hay 30 dias
       
                        case 2:
                                return  ((ano % 4 == 0) ? 28 : 29);     // En estemes hay que evaluar si es primo
                }
       
                return 0;
        }

para calcular el año biiesto, podrias usar

        public boolean isLeapYear(int year){
                return year % 4 == 0;
        }

en la linea ... (ano % 4 == 0)  ...

cuando quieras usar años

cuando quieras usar años negativos, conviertelos a positivos: ES LO MEEEEESMOOO!!!

(year: +100) == (year: -100)

porque los bicioestos comienzan desde el año cero antes de cristo, o era el cero despues de cristo? no me acuerdo pero empiezan del año 0

podias usar (tomando e cuenta mi metodo:

isLeapYear(year< 0 ? (year*-1) : year);
Imagen de ezamudio

no hay año 0

No hay año 0. Del año -1 pasas al año 1.

aaaah pus si verdáaa?? bueno

aaaah pus si verdáaa??

bueno pero no ha cambio en el algoritmo, pues si vamos restando o sumando el -4 es primo igual que el 4 y asi

Imagen de ezamudio

Algoritmo

Este es el algoritmo para calcular si un año es bisiesto.

-4 y 4 no son primos. Un número primo sólo es divisible entre sí mismo y 1. Ningún número par arriba de 2 es primo porque es divisible entre 2.

Ops, si lo consulte, tienes

Ops, si lo consulte, tienes razon Enrique, mi forma de calcular esta erronea (siempre he tenido esa idea de que bastaba con calcular el modulo 4 del año

bueno tomando lo de wikipedia, seria :

        public static boolean isLeapYear(int year){
                return year % 4==0 && (year % 100 == 0 && year % 400 != 0);
        }

y por o visto no soy el unico http://es.easycalculation.com/date-day/days-in-month.php ahi dice que e 4 si es bisiesto (como yo lo creí)

...

(acabo de corregir, habia escrito primo en lugar de bisiesto)

Imagen de ezamudio

no

Si lo quieres en una sola línea entonces return (year % 400 == 0) || ((year % 100 != 0) && (year % 4 == 0))

Si el año es divisible entre 400, es bisiesto (ahí termina la evaluación, por corto circuito). Si no es divisible entre 400, entonces... si es divisible entre 100 NO es bisiesto, pero si no es divisible entre 100 pero sí entre 4, es bisiesto. Compara eso con el pseudocódigo que está en wikipedia.

No encuentro nada que diga que el número 4 es primo en la liga que pusiste. Tal vez estás diciendo que el año 4 es bisiesto (y sí lo es), pero no encuentro por ninguna parte nada que diga que el número 4 es primo (lo cual sería una barbaridad).

Reviviendo el tema viejo.

Pues me había encontrado en la necesidad de explicar este algoritmo (del año bisiesto) y mi código quedó como lo siguiente:

public boolean isThatYearLeap(long year){
----return year%100==0 ? year%400==0 : year%4==0;
}

Mi argumento
Lo que creo es si el año es divisible entre 100, es necesario comparar si es divisible entre 400, por lo que, si divide en 400 también divide en 4, eso no se cumple a la inversa (ej. 1400/4 = 350 , 1400/400 = 3.5. 1600/4 = 400, 1600/400 = 4). Así que si el año es divisible entre 100 pero no entre 400 regresará false, y si ese año no es divisible entre 100 si es divisible entre 4 regresará true. Si encuentran error(es), pues avísenme.