tags:

views:

347

answers:

7

I have this programming assignment that converts between meters and feet, and between kilograms and pounds. When I tell the program I want to convert weight (by entering "w" when prompted), it gives me my "Error: Too many input characters, ". error. I worked on this for a long time, but can't figure it out. Can someone please tell me how to make the weight conversion work like the length conversion?

import java.util.Scanner;

/**This class..
 *
 */

public class UnitConversion3b
{
    public static void main(String[] args)   
    {

            Scanner keyboard = new Scanner(System.in);


        String maxInputWarning = "\nError: Too many input characters."
        + "\nProgram is now terminating.";
        String lengthOrWeight;
        final double LENGTH_CONVERSION_FACTOR = 3.2808399;
        final double WEIGHT_CONVERSION_FACTOR = 2.20462;
        String whichWeightConversion = "empty" , whichLengthConversion = "empty";
        double feet = 0, meters = 0, pounds =0 , kilograms = 0;
        double metersConvertedToFeet, feetConvertedToMeters;
        double poundsConvertedToKilograms, kilogramsConvertedToPounds;

        System.out.println("");
        System.out.print("What kind of value would you like to convert?");
        System.out.print("\nEnter L for length, or W for weight: ");
        lengthOrWeight = keyboard.nextLine();
        if (lengthOrWeight.length() > 1 ) {
            System.out.println(maxInputWarning);
            System.out.print("Press Enter to continue ... ");
            keyboard.nextLine();
            return;
        }else if ((!(lengthOrWeight.equalsIgnoreCase("l"))
            && (!(lengthOrWeight.equalsIgnoreCase("w"))))){
            System.out.println("\nError: Unrecognized conversion type."
            + "\nProgram is now terminating.");
            System.out.print("Press Enter to continue ... ");
            keyboard.nextLine();
            return;
        }else if (lengthOrWeight.equalsIgnoreCase("l")){
            System.out.println("\nConverting feet or meters?");
            System.out.print("Enter F to convert feet, or M for meters: "); 
            whichLengthConversion = keyboard.nextLine();
                }if (whichLengthConversion.length() > 1 ) {
                    System.out.println(maxInputWarning);
                    System.out.print("Press Enter to continue ... ");
                    keyboard.nextLine();
                    return;
                }else if ((!(whichLengthConversion.equalsIgnoreCase("f"))
                    && (!(whichLengthConversion.equalsIgnoreCase("m"))))){
                    System.out.println("\nError: Unrecognized unit of "
                    + "measurement.\nProgram is now terminating."     );
                    System.out.print("Press Enter to continue ... ");
                    keyboard.nextLine();
                    return;
                }else if (whichLengthConversion.equalsIgnoreCase("f")){
                    System.out.print ("Enter the number of feet to"
                    + " convert to meters: ");
                    feet = keyboard.nextDouble();
                    feetConvertedToMeters = feet / LENGTH_CONVERSION_FACTOR;
                    System.out.println("The number of meters in " + feet +
                    " feet is " + feetConvertedToMeters + ".");
                    keyboard.nextLine();
                    System.out.print("Press Enter to continue ... ");
                    keyboard.nextLine();
                    return;
                }else if (whichLengthConversion.equalsIgnoreCase("m")){
                    System.out.print ("Enter the number of meters to"
                    + " convert to feet: ");
                    meters = keyboard.nextDouble();
                    metersConvertedToFeet = meters * LENGTH_CONVERSION_FACTOR;
                    System.out.println("The number of feet in " + meters +
                    " meters is " + metersConvertedToFeet + ".");
                    keyboard.nextLine();
                    System.out.print("Press Enter to continue ... ");
                    keyboard.nextLine();
                    return;
        }if (lengthOrWeight.equalsIgnoreCase("w")){
            System.out.println("Converting pounds or kilograms?");
            System.out.print("Enter P to convert pounds, or K for kilograms: ");
            whichWeightConversion = keyboard.nextLine();
                }if (whichWeightConversion.length() > 1 ) { 
                    System.out.println(maxInputWarning);
                    System.out.print("Press Enter to continue ... ");
                    keyboard.nextLine();
                    return;
                }else if ((!(whichWeightConversion.equalsIgnoreCase("p"))
                    && (!(whichWeightConversion.equalsIgnoreCase("k"))))){
                    System.out.println("\nError: Unrecognized unit of "
                    + "measurement.\nProgram is now terminating."     );
                    System.out.print("Press Enter to continue ... ");
                    return;
                }else if (whichWeightConversion.equalsIgnoreCase("p")){
                    System.out.println("Enter the number of pounds to"
                    + " convert to kilograms:");
                    pounds = keyboard.nextDouble();
                    poundsConvertedToKilograms = pounds / WEIGHT_CONVERSION_FACTOR;
                    System.out.println("The number of pounds in " + kilograms +
                    " kilograms is " + poundsConvertedToKilograms + ".");
                    keyboard.nextLine();
                    System.out.print("Press Enter to continue ... ");
                    keyboard.nextLine();
                    return;
                }else if (whichLengthConversion.equalsIgnoreCase("k")){
                    System.out.print ("Enter the number of kilograms to"
                    + " convert to pounds: ");
                    kilograms = keyboard.nextDouble();
                    kilogramsConvertedToPounds = kilograms * WEIGHT_CONVERSION_FACTOR;
                    System.out.println("The number of pounds in " + pounds +
                    "pounds is " + kilogramsConvertedToPounds + ".");
                    keyboard.nextLine();
                    System.out.print("Press Enter to continue ... ");
                    keyboard.nextLine();
                    return;

        }else{ 
            return;
        }
    }
}
+4  A: 

You're missing a right curly-brace after your meters-to-feet case.

There are some other curly-brace issues throughout your code -- for example, on line 47, there's a right brace where you don't want one. Check over your block structure and, in each case, make sure you're opening and closing blocks where it makes logical sense to do so.

Etaoin
Try a Java code formatter to automatically indent your code; it's much easier than tracking down braces by eye. If you IDE doesn't have one, see http://stackoverflow.com/questions/996646/stand-alone-java-code-formatter-beautifier-pretty-printer
Lee Reeves
Where exactly would the right curly-brace go? Sorry, but I'm not to familiar with looking at code and as you can see, I haven't formatted mine well either. Would this missing curly brace make the program behave properly or are there many curly-braces messing it up?
Like I said, this isn't the only problem you have. Remember, curly braces denote a block of code treated as a logical unit -- for example, `if (this condition is true) {do all of this stuff;}` You need the curly brace I suggested because it will end the block of things to do if lengthOrWeight is `"l"`.
Etaoin
Thanks for helping me Lee and Etaoin!
+2  A: 

My professor makes us seperate our main class from the Class that is doing the work. It helps a lot. I know it seems like a lot of extra work, but if you pulled your SOPs/inputs out into a DemoMain class and then had your UnitConversion3b class seperate it would be a lot easier to read. Also, I know a lot of people put their {'s right after the close of a paren, but honestly I find my own code a lot easier to read if I drop my opening { down a line. I think your logic is good statement wise, but it's so hard to tell with the brace issues. I think you have some hanging if issues, where you mean to have some of the statements inside a conditional but they are actually outside :-/

Quinn1000
Thanks. I'll spend some time doing that when I get things working. Sorry it's so hard on the eyes.
Actually you should try to separate you application so that each class has one main responsibility that is indicated by its name(this is difficult but very useful afterwards). Do the same thing to your functions
Roman A. Taycher
... to try to avoid methods that are very long/ Also try to give good descriptive names to your classes and methods, this can be hard (Phil Karton said There are only two hard problems in Computer Science: cache invalidation, naming things) but try, also one of the best ide features is that it helps you rename things later without breaking code.
Roman A. Taycher
Thanks for the tips, Roman.
+1  A: 

Try getting rid of

(!(lengthOrWeight.equalsIgnoreCase("l"))
            && (!(lengthOrWeight.equalsIgnoreCase("w"))))){

and just putting the following block in the else

else{
    System.out.println("\nError: Unrecognized conversion type."
            + "\nProgram is now terminating.");
            System.out.print("Press Enter to continue ... ");
            keyboard.nextLine();
            return;
}

It might not help but it will make things clearer.

Also you don't need to check length when you can do line.equalsIgnoreCase("l"), if the input is longer it will not be equal.

Roman A. Taycher
+3  A: 

You made lots of errors by not changing the code while copy pasting the logic from one place to the other. Your code can be improved a lot by reducing the repetitions and I will be more optimistic in my 'if' 'else' conditions to capture the right cases first and leaving all the wrong cases to the end...Below is the working version of your code modified slightly by fixing the typos and order of the logic.

import java.util.Scanner;

public class UnitConversion3b {
    public static void main(String[] args) {

        Scanner keyboard = new Scanner(System.in);

        String maxInputWarning = "\nError: Too many input characters."
                + "\nProgram is now terminating.";
        String lengthOrWeight;
        final double LENGTH_CONVERSION_FACTOR = 3.2808399;
        final double WEIGHT_CONVERSION_FACTOR = 2.20462;
        String whichWeightConversion = "empty", whichLengthConversion = "empty";
        double feet = 0, meters = 0, pounds = 0, kilograms = 0;
        double metersConvertedToFeet, feetConvertedToMeters;
        double poundsConvertedToKilograms, kilogramsConvertedToPounds;

        System.out.println("");
        System.out.print("What kind of value would you like to convert?");
        System.out.print("\nEnter L for length, or W for weight: ");

        lengthOrWeight = keyboard.nextLine();
        if (lengthOrWeight.length() > 1) {
            System.out.println(maxInputWarning);
            System.out.print("Press Enter to continue ... ");
            keyboard.nextLine();
            return;
        } else if ((!(lengthOrWeight.equalsIgnoreCase("l")) && (!(lengthOrWeight
                .equalsIgnoreCase("w"))))) {
            System.out.println("\nError: Unrecognized conversion type."
                    + "\nProgram is now terminating.");
            System.out.print("Press Enter to continue ... ");
            keyboard.nextLine();
            return;
        } else if (lengthOrWeight.equalsIgnoreCase("l")) {
            System.out.println("\nConverting feet or meters?");
            System.out.print("Enter F to convert feet, or M for meters: ");
            whichLengthConversion = keyboard.nextLine();

            if (whichLengthConversion.length() > 1) {
                System.out.println(maxInputWarning);
                System.out.print("Press Enter to continue ... ");
                keyboard.nextLine();
                return;
            } else if ((!(whichLengthConversion.equalsIgnoreCase("f")) && (!(whichLengthConversion
                    .equalsIgnoreCase("m"))))) {
                System.out.println("\nError: Unrecognized unit of "
                        + "measurement.\nProgram is now terminating.");
                System.out.print("Press Enter to continue ... ");
                keyboard.nextLine();
                return;
            } else if (whichLengthConversion.equalsIgnoreCase("f")) {
                System.out.print("Enter the number of feet to"
                        + " convert to meters: ");
                feet = keyboard.nextDouble();
                feetConvertedToMeters = feet / LENGTH_CONVERSION_FACTOR;
                System.out.println(feet + " Feet in Meters is "
                        + feetConvertedToMeters + ".");
                keyboard.nextLine();
                System.out.print("Press Enter to continue ... ");
                keyboard.nextLine();
                return;
            } else if (whichLengthConversion.equalsIgnoreCase("m")) {
                System.out.print("Enter the number of meters to"
                        + " convert to feet: ");
                meters = keyboard.nextDouble();
                metersConvertedToFeet = meters * LENGTH_CONVERSION_FACTOR;
                System.out.println(meters + " Meters in Feet is "
                        + metersConvertedToFeet + ".");
                keyboard.nextLine();
                System.out.print("Press Enter to continue ... ");
                keyboard.nextLine();
                return;
            }
        }

        else {
            System.out.println("Converting pounds or kilograms?");
            System.out.print("Enter P to convert pounds, or K for kilograms: ");
            whichWeightConversion = keyboard.nextLine();

            if (whichWeightConversion.length() > 1) {
                System.out.println(maxInputWarning);
                System.out.print("Press Enter to continue ... ");
                keyboard.nextLine();
                return;
            } else if ((!(whichWeightConversion.equalsIgnoreCase("p")) && (!(whichWeightConversion
                    .equalsIgnoreCase("k"))))) {
                System.out.println("\nError: Unrecognized unit of "
                        + "measurement.\nProgram is now terminating.");
                System.out.print("Press Enter to continue ... ");
                return;
            } else if (whichWeightConversion.equalsIgnoreCase("p")) {
                System.out.println("Enter the number of pounds to"
                        + " convert to kilograms:");
                pounds = keyboard.nextDouble();
                poundsConvertedToKilograms = pounds / WEIGHT_CONVERSION_FACTOR;
                System.out.println(pounds + " Pounds in Kilograms is "
                        + poundsConvertedToKilograms + ".");
                keyboard.nextLine();
                System.out.print("Press Enter to continue ... ");
                keyboard.nextLine();
                return;
            } else if (whichWeightConversion.equalsIgnoreCase("k")) {
                System.out.print("Enter the number of kilograms to"
                        + " convert to pounds: ");
                kilograms = keyboard.nextDouble();
                kilogramsConvertedToPounds = kilograms
                        * WEIGHT_CONVERSION_FACTOR;
                System.out.println(kilograms + " Kilograms in Pounds is "
                        + kilogramsConvertedToPounds + ".");
                keyboard.nextLine();
                System.out.print("Press Enter to continue ... ");
                keyboard.nextLine();
                return;

            }
        }
    }
}
johnbk
johnbk, thanks for helping me. I'm comparing your code and my code now.
@user465001 - Ok..Please accept the best answer that helped you the most when you are done with your home work..:)
johnbk
A: 

I know this may sound a little nutty, but it works: Imagine your user input as a little animal and you have set a trap for it. You need to catch the animal and do something to it. For our animal lovers' sake, let's say you need to catch it, tranquilize it, weigh it, and put a radio collar on it and then release it relatively unharmed provided it is of type Cougar. So, our trap is a multi-function trap. Whatever enters it, a value will be produced.

WHAM!!! Something is in the trap. Luckily, our trap is automatic. If it doesn't land a float value, then the trap opens and it leaves. It isn't a Cougar.

OK, the trap is still closed. It must be a Cougar. We can work on it.

Now, we ask the guy wearing the Banana Republic gear with the big Nikon around his neck for some help. We have this Float value in the trap. Now, we ask the Scientist in the Banana Repubic gear what our number means.

"Hey, Scientist Guy, what does the number in our trap mean?"

If "It's the length", he answers:

This is the length of the Cougar in feet, I need it it converted to meters...

This is the length of the Cougar in  meters, I need it it converted to feet...

If "it's the weight", he answers:

This is the weight in pounds, I need it converted to kilos...

This is the weight in kilos, I need it converted to pounds...

You may find that, when you think about it, your Teacher was asking 'how do you set up the problem'? In other words, by asking the user for the value first, you can cut down on the amount of questions the program has to answer.

Quinn1000
Quinn, Thanks for the advice and examples. They're a helping me learn more from this assignment.
A: 

OK, so here is an example of two classes, a main demo class and the actual working class:

TestMain.java goes like this:

import java.util.Scanner;

public class TestMain
{
public static void main(String[] args) 
    {
    float theValue;
    float theAnswerIs;
    char getLengthOrWeight;
    String theValueAsString;
    boolean lOrW; //length or width
    boolean fOrM; //feet or meters
    boolean pOrK;  //pounds or kilos... it's a CS joke haha
    char getFeetOrMeters;
    char getPoundsOrKilos;


    //Set up a Scanner instance called keyboard   
    Scanner keyboard = new Scanner(System.in);

    UnitConversion3b converterInstance = new UnitConversion3b();

    //Request user for the number to convert
    System.out.println("What is the value you will be converting?");
    theValueAsString = keyboard.nextLine();

    //convert that value and trap
    theValue = floatToString(theValueAsString);


    //Request user for length or weight conversion
    System.out.println("What kind of value would you like to convert?"); 
    System.out.println("Enter L for length, or W for weight: ");
    //variable = console.next().charAt(0);
    getLengthOrWeight = keyboard.next().charAt(0);
    lOrW = converterInstance.lengthOrWeight(getLengthOrWeight);

    //create a new UnitConversion3B object and pass it the L or W or bad string the user inputs



    //if(true) then user asked for length
    if(lOrW)
    {
        System.out.println("\nConverting feet or meters?"); 
        System.out.print("Enter F to convert feet to meters, or M for meters to feet: ");
        //set our main's feetOrMeters variable to the value received when we ask our
        //converterInstance the question whichLengthConversion?
        getFeetOrMeters = keyboard.next().charAt(0);
        fOrM = converterInstance.feetOrMeters(getFeetOrMeters);

        //if(fOrM) aka user asked for a length conversion in feet, let's convert it:
        if(fOrM)
        {
            theAnswerIs = (float) (theValue * 3.28083);
            System.out.println("The answer is: " + theAnswerIs + " feet."); 
        }

        //if(!fOrM) aka user asked for a length conversion in meters, let's convert it:
        if(!fOrM)
        {
            theAnswerIs = (float) (theValue * 0.3048);
            System.out.println("The answer is: " + theAnswerIs + " feet."); 
        }
        //bad input should be trapped in the feetOrMeters function of the converterInstance
    }

    //if(false) then user asked for weight
    else if(!lOrW)
    {
      System.out.println("Converting pounds or kilograms?"); 
      System.out.print("Enter P to convert pounds to kilos, or K for kilograms to pounds: "); 

        getPoundsOrKilos = keyboard.next().charAt(0);
        pOrK = converterInstance.poundsOrKilos(getPoundsOrKilos);

        //if(pOrK) aka user asked for a pounds to kilos conversion, let's convert it:
        if(pOrK)
        {
            theAnswerIs = (float) (theValue * 0.45359237);
            System.out.println("The answer is: " + theAnswerIs + " feet."); 
        }

        //if(!pOrK) aka user asked for a kilos to pounds conversion, let's convert it:
        if(!pOrK)
        {
            theAnswerIs = (float) (theValue * 2.20462262);
            System.out.println("The answer is: " + theAnswerIs + " feet."); 
        }
        //bad input should be trapped in the poundsOrKilos function of the converterInstance

    }

}

private static float floatToString(String theValueAsString) {
    // thanks for this method from http://devdaily.com/java/edu/qanda/pjqa00013.shtml
    float f = 0;

    try
    {
      f = Float.valueOf(theValueAsString.trim()).floatValue();
    }
    catch (NumberFormatException nfe)
    {
      System.out.println("NumberFormatException: " + nfe.getMessage());
    }


    return f;
}

}

and UnitConversion3b.java goes like:

public class UnitConversion3b 
{

    private boolean lengthOrWeightSwitch;
    boolean feetOrMeters;
    final double LENGTH_CONVERSION_FACTOR = 3.2808399; 
    final double WEIGHT_CONVERSION_FACTOR = 2.20462;
    boolean poundsOrKilograms;

    public UnitConversion3b(String getLengthOrWeight) {
        if(getLengthOrWeight == "W")
            lengthOrWeightSwitch = true;
        else if(getLengthOrWeight == "L")
            lengthOrWeightSwitch = false;
        else
        {
            badInput();
        }   
    }

    public boolean getConversionType()
    {
        return lengthOrWeightSwitch;
    }

    public boolean whichLengthConversion(String whichLength)
    {

        if(whichLength == "F")
            feetOrMeters = true;
        else if(whichLength == "M")
            feetOrMeters = false;
        else
        {
            badInput();
        }
        return feetOrMeters;
    }

    public  boolean whichWeightConversion(String whichWeight)
    {

        if(whichWeight == "P")
            poundsOrKilograms = true;
        else if(whichWeight == "K")
            poundsOrKilograms = false;
        else
        {
            badInput();
        }
        return poundsOrKilograms;

    }


    public void badInput()
    {
        System.out.println("Invalid input");
        System.exit(0);
    }

    public String valueToFeet(float theValue) {
        //assumes value entered need to be converted from meters to feet
        return "" + (theValue*LENGTH_CONVERSION_FACTOR);
    }

    public String valueToMeters(float theValue) {
        //assumes value entered need to be converted from feet to meters
        return "" + (theValue/LENGTH_CONVERSION_FACTOR);
    }

    public String valueToPounds(float theValue) {
        // assumes value entered needs to be converted to pounds
        return ""+ (theValue * WEIGHT_CONVERSION_FACTOR);
    }

    public String valueToKilos(float theValue) {
        // TODO Auto-generated method stub
        return ""+ (theValue / WEIGHT_CONVERSION_FACTOR);
    }

    public void setConversionType(char getLengthOrWeight) {
        if(getLengthOrWeight == 'L')
            lengthOrWeightSwitch = true;
        if(getLengthOrWeight == 'W')
            lengthOrWeightSwitch = false;
        else
            badInput();
    }

    public boolean lengthOrWeight(char getLengthOrWeight) {
        if(getLengthOrWeight == 'L')
            return true;
        if(getLengthOrWeight == 'W')
            return false;

        return false;
    }

    public boolean feetOrMeters(char getFeetOrMeters) {
        if(getFeetOrMeters == 'F')
            return true;
        if(getFeetOrMeters == 'M')
            return false;

        //these functions return false under 'false' conditions... work on the logic :-) 
        return false;
    }

    public boolean poundsOrKilos(char getPoundsOrKilos) {
        if(getPoundsOrKilos == 'P')
            return true;
        if(getPoundsOrKilos == 'K')
            return false;

        //these functions return false under 'false' conditions... work on the logic :-) 
        return false;
    }


}

Now please note, even if I pasted this correctly you are going to get a worse than bad score on your assignment if you turn in this code. It compiles and runs, but it ignores the max char# input you seemed to have constrained on your assignment. Probably there are other issues, howver, I think it is somewhat followable code. I would probably want to break it even further into more classes, but I hope this helps.

Quinn1000
A: 

The reason why it gives you that error is because Scanner's nextLine() method returns the line as well as the newline character ('\n') that ends the line.

Try this line instead, using String's trim() method to cut off all whitespace from either end :

lengthOrWeight = keyboard.nextLine().trim();
Olathe