2

My problem is I am trying to make a message declared as a string show depending on whether or not it is true or false. The String not returning the right value is : snakeYearMsg

I have been trying to make this String return the desired value all day to no avail. In the end I tried a brute force method by listing all of the possible availabilities for SNAKE_YEAR.

The program lets the user enter data and then calculates an "Essscore" for them, depending on that input. My problem is that the last output of data to the user consistently displays that the user was born in a "Snake year" (a year of the snake, in the chinese zodiac), even if they are not.

This program is for an assignment that I have forgotten about and it is getting periously close to the due date, so any help will be greatly appreciated

the code is here:

/*Program designed by Some guy
*for KXT101 Assignment Number One*/


 import java.util.Scanner;
 public class AssigOne113

{
public static void main (String[] args)   
{
        final int CURRENT_YEAR = 2013;
        final int CALENDER_ROTATION = 12;
        final int SNAKE_YEAR = CURRENT_YEAR | 2001 | 1989 | 1977 | 1965 | 1953 | 1941 | 1929 | 1917 | 1905 | 1893 | 1881 | 1869 |
                                1857 | 1845 | 1833 | 1821 | 1809 | 1797 | 1785 | 1773 | 1761 | 1749 | 1737 | 1725 | 1713 | 1701 |
                                1689 | 1677 | 1665 | 1653 | 1641 | 1629 | 1617 | 1605 | 1593 | 1581 | 1569 | 1557 | 1545 | 1533 |
                                1521 | 1509 | 1497 | 1485 | 1473 | 1461 | 1449 | 1437 | 1425 | 1413 | 1401 | 1389 | 1377 | 1365 |
                                1353 | 1341 | 1329 | 1317 | 1305 | 1293 | 1281 | 1269 | 1257 | 1245 | 1233 | 1221 | 1209 | 1197 |
                                1185 | 1173 | 1161 | 1149 | 1137 | 1125 | 1113 | 1101 | 1089 | 1077 | 1065 | 1053 | 1041 | 1029 |
                                1017 | 1005 | 993  | 981  | 969  | 957  | 945  | 933  | 921  | 909  | 897  | 885  | 873  | 861  |
                                849  | 837  | 825  | 813  | 801  | 789  | 777  | 765  | 753  | 741  | 729  | 717  | 705  | 693  |
                                681  | 669  | 657  | 645  | 633  | 621  | 609  | 597  | 585  | 573  | 561  | 549  | 537  | 525  |
                                513  | 501  | 489  | 477  | 465  | 453  | 441  | 429  | 417  | 405  | 393  | 381  | 369  | 357  |
                                345  | 333  | 321  | 309  | 297  | 285  | 273  | 261  | 249  | 237  | 225  | 213  | 201  | 189  |
                                177  | 165  | 153  | 141  | 129  | 117  | 105  | 93   | 81   | 69   | 57   | 45   | 33   | 21   |
                                9;
        final int SUMMER_MONTH_JAN = 1;
        final int SUMMER_MONTH_FEB = 2;
        final int SUMMER_MONTH_DEC = 12;
        final int AUTUMN_MONTH_MAR = 3;
        final int AUTUMN_MONTH_APR = 4;
        final int AUTUMN_MONTH_MAY = 5;                         
        final int WINTER_MONTH_JUN = 6;
        final int WINTER_MONTH_JUL = 7;
        final int WINTER_MONTH_AUG = 8;                     
        final int SPRING_MONTH_SEP = 9;
        final int SPRING_MONTH_OCT = 10;
        final int SPRING_MONTH_NOV = 11;
        final int SIXTH_DAY = 06;
        final int SEVENTH_DAY = 07;
        final int JANUARY = 1;
        final int FEBUARY = 2;
        final int MARCH = 3;
        final int APRIL = 4;
        final int MAY = 5;
        final int JUNE = 6;
        final int JULY = 7;
        final int AUGUST = 8;
        final int SEPTEMBER = 9;
        final int OCTOBER = 10;
        final int NOVEMBER = 11;
        final int DECEMBER = 12;
        final int CALENDER_MAX = 12;

        Scanner sc;

        String essscorecalculate;
        String essscorerepeat;
        String userName;
        int birthYear;
        String junk;

        int yob;
        int day;
        int month = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;
        int essscore = 0;
        String summer = "Summer";
        String autumn = "Autumn";
        String winter = "Winter";
        String spring = "Spring";
        String seasonBorn = "any season";
        String monthBorn = "any month";
        String snakeYearMsg = "the year";

        boolean snakeYearBool;
        boolean haveS;

        double birthDay;

        char initial;

        //program begins

        System.out.println(" ");
        System.out.println("<------------------------------------------->");
        System.out.println("Sammy Snakes Sixth/Seventh Spring Of Success");
        System.out.println("<------------------------------------------->");
        System.out.println(" ");

        System.out.println("<------------------------------------------->");
        System.out.println("    I can calculate an Ess-Score for you     ");    
        System.out.println("   Would you like to calculate an Ess-Score? ");
        System.out.println("<------------------------------------------->");
        sc = new Scanner(System.in);
        essscorecalculate = sc.nextLine();
        {
            /*essscore.Reset;*/
            {

            }
        }
        System.out.println("<------------------------------------------->");
        System.out.println("         To begin, what is your name?        ");
        System.out.println("<------------------------------------------->");
        userName = sc.nextLine();
        initial =(userName.charAt(0));
        {
            if (initial == 'S')
                essscore =+ 4;
            if (initial == 's')
                essscore =+ 4;                  

        }
        System.out.println("<----------------------------------------------------------------->");
        System.out.println("  What year were you born? (Please enter in following format XXXX) ");
        System.out.println("<----------------------------------------------------------------->");
        birthYear = sc.nextInt();
        junk = sc.nextLine();
        {
            {
                if (birthYear == SNAKE_YEAR)
                    snakeYearBool = true;
                /*  essscore =+ 16; */      
                else if (birthYear != SNAKE_YEAR)
                    snakeYearBool = false;
            }
                {
                    if (snakeYearBool = false)
                        snakeYearMsg = "A non Snake year";
                    if (snakeYearBool = true)
                        snakeYearMsg = "Snake year";

                if (birthYear != SNAKE_YEAR)
                    essscore ++;            
                }
            }
        System.out.println("<--------------------------------------------------------------------->");
        System.out.println("Please enter your birthday (please enter in the following format DD.MM)");
        System.out.println("<--------------------------------------------------------------------->");
        birthDay = sc.nextDouble();
        junk = sc.nextLine();

            {
                {
                    day = (int)birthDay;
                        if (day == SIXTH_DAY)
                            essscore =+ 8;
                        if (day == SEVENTH_DAY)
                            essscore =+ 8;
                }
                {
                    month = ((int)Math.round(100*birthDay))%100;
                        /*System.out.print(month);*/
                }

                    {
                        if (month == 1)
                            monthBorn = "January";
                        if (month == 2)
                            monthBorn = "Febuary";
                        if (month == 3)
                            monthBorn = "March";
                        if (month == 4)
                            monthBorn = "April";
                        if (month == 5)
                            monthBorn = "May";                      
                        if (month == 6)
                            monthBorn = "June";                     
                        if (month == 7)
                            monthBorn = "July";                     
                        if (month == 8)
                            monthBorn = "August";                       
                        if (month == 9)
                            monthBorn = "September";                        
                        if (month == 10)
                            monthBorn = "October";                      
                        if (month == 11)
                            monthBorn = "November";                     
                        if (month == 12)
                            monthBorn = "December";                     
                    }

                {
                    if (month == SPRING_MONTH_SEP)
                        essscore =+2;
                    if (month == SPRING_MONTH_OCT)
                        essscore =+2;
                    if (month == SPRING_MONTH_NOV)
                        essscore =+2;                                                                       
                    {

                    if (month == SPRING_MONTH_SEP)                                                                                                                  
                        seasonBorn = "Spring";
                    else if (month == SPRING_MONTH_OCT)                                                                                                                 
                        seasonBorn = "Spring";
                    else if (month == SPRING_MONTH_NOV)                                                                                                                 
                        seasonBorn = "Spring";                      
                    else if (month ==AUTUMN_MONTH_MAR)
                        seasonBorn = "Autumn";
                    else if (month ==AUTUMN_MONTH_APR)
                        seasonBorn = "Autumn";
                    else if (month ==AUTUMN_MONTH_MAY)
                        seasonBorn = "Autumn";                          
                    else if (month == WINTER_MONTH_JUN)
                        seasonBorn = "Winter";
                    else if (month == WINTER_MONTH_JUL)
                        seasonBorn = "Winter";
                    else if (month == WINTER_MONTH_AUG)
                        seasonBorn = "Winter";                                                      
                    else if (month == SUMMER_MONTH_JAN)
                        seasonBorn = "Summer";
                    else if (month == SUMMER_MONTH_FEB)
                        seasonBorn = "Summer";
                    else if (month == SUMMER_MONTH_DEC)
                        seasonBorn = "Summer";                          
                    }
                }       
            }
        System.out.println("<------------------------------------------------>");   
        System.out.println(""+userName+" was born in "+seasonBorn+" on "+monthBorn+" "+day+" in "+snakeYearMsg+" "+birthYear+" ");
        System.out.println(""+essscore+""); 
        System.out.println("<------------------------------------------------>");

        System.out.println("<------------------------------------------------>");
        System.out.println("  Would you like to calculate another Ess-Score?  ");
        System.out.println("<------------------------------------------------>");
        essscorerepeat = sc.next();
}   

}

Steahan
  • 33
  • 3
  • 1
    Look up the `|` operator. A *bitwise or* is not useful here - in particular because *none* of the usages appear to be mutually-exclusive bitfields. (See `ArrayList.contains` but better, use a deterministic formula, if such can be applied - i.e. are years *always* in cycles of 12? If not, can the few exceptions be handled separately?) – user2246674 Apr 17 '13 at 05:43
  • possible duplicate of [String comparison in java, again](http://stackoverflow.com/questions/8702986/string-comparison-in-java-again) Oh CRAP! Bad close vote - this is not related to String comparison! My apologies – Andrew Thompson Apr 17 '13 at 05:44
  • Sorry just solved my own question, I was missing an extra couple of "=" signs for "snakeYearBool" – Steahan Apr 17 '13 at 05:47
  • @user2246674 is correct. If you want to represent a range of integers, either you need an array of them, a different data structure such as hashmap or arraylist, or a function that returns if a supplied integer is part of the range or not. – Patashu Apr 17 '13 at 05:52

2 Answers2

1

While I won't say this is the only problem, one crucial problem is that using a bitwise-or in an attempt to encode years (and months) is wrong.

This is because int SNAKE_YEAR = x | y | z .. results in a single integer value which is known as SNAKE_YEAR. Because the components (all the years) have overlapping bit sequences this results in a loss of information. However, even if there isn't a loss of information, this leads to incorrect results when using a simple == (e.g. SNAKE_YEAR == 2001 results in false when it should be true).

Instead, use a List (or a Set) and contains or, better create a method that uses a discrete formula (i.e bool isYearOfSnake(int year)). I'm going to guess that the "cyclic 12 year structure" can be handled using a simple modulus from the difference to a known Snake year ..

user2246674
  • 7,503
  • 24
  • 27
0

There are two main issues in your code.

One is that you are trying to bitwise or a whole lot of integers and then treating it as if it will check them all for you. Unfortunately java won't do that for you, so you need to do a modulus operator when you want to see if a birth year is a snake year. This can be achieved by using this line:

if (((birthYear - 9) %12) == 0)

instead of

 if (birthYear == SNAKE_YEAR)

Your other main issue is that when you check to see if snakeYearBool is false or true, you used a single = instead of 2 =, so no matter what it's always going to return true because you initialize snakeYearBool to true in the second if statement. So change those lines to this:

if (snakeYearBool == false)
                    snakeYearMsg = "A non Snake year";
if (snakeYearBool == true)
                    snakeYearMsg = "Snake year";

And that should fix your issues. Good luck!

Andrew T.
  • 4,402
  • 3
  • 33
  • 50