Program based on a physics concept

Posted on

Problem

I am a beginner and I wanted to make programs that would help me while I learnt Java. I made a program to help me in my assignments. Any suggetions?

Main method

public class MirrorFormula {

public static void main(String[] args) {
        Scanner keyboardInput = new Scanner(System.in);
        double u =0;
        double v =0;
        double f =0;

        System.out.println("Hello! This is a calculator based on the Mirror Formula. n");
        System.out.println("The mirror formula is a relation between the object distance, the image distance n and the focal length.");
        System.out.println("The formula is : 1/u + 1/v = 1/f.  (u=distance of object, v=distance of image, f=focal length.)");
        System.out.println("It is applicable for both convex mirrors and concave mirrors.");
        System.out.println();
        System.out.println("This calculator can calculate :");
        System.out.println();
        System.out.println("1. Distance of the object from the pole of the spherical mirror.");
        System.out.println("2. Distance of the image from the pole of the spherical mirror.");
        System.out.println("3. Focal length");
        System.out.println("[If you have 2 of the values.]");
        System.out.println("________________________________________________________________________________________________________________________________");
        System.out.println("What value would you like to find out? ");
        System.out.println("Enter: n 1. for Distance of object n 2. for distance of image n 3. for Focal length n (Please note that you don't need to enter units. The ans. is in whatever unit you enter the values)" );

        int userChoice = keyboardInput.nextInt();

        System.out.println("________________________________________________________________________________________________________________________________");

        switch (userChoice) {

        case 1 :
            System.out.println("Please enter the distance of the image: ");
            v = keyboardInput.nextDouble();
            System.out.println("Please enter the focal length: ");
            f = keyboardInput.nextDouble();
            u = findU(v, f);
            break;

        case 2 :
            System.out.println("Please enter the distance of the object: ");
            u = keyboardInput.nextDouble();
            System.out.println("Please enter the focal length: ");
            f = keyboardInput.nextDouble();
            v = findV(u, f);
            break;

        case 3 :
            System.out.println("Please enter the distance of the object: ");
            u = keyboardInput.nextDouble();
            System.out.println("Please enter the distance of the image: ");
            v = keyboardInput.nextDouble();
            f = findF(u, v);
            break;


        }
    System.out.println("___________________________________________________");
    System.out.println(" Distance of the object from the pole is  | " + u + "  |");
    System.out.println(" Distance of the image from the pole is   | " + v + "  |");
    System.out.println(" The focal length                         | " + f + "  |");
    System.out.println("___________________________________________________");
}

Other methods

These calculate the ans. based on the input:

public static double findU(double v, double f) {

    double oneUpon;

    oneUpon = 1/f - 1/v;
    return 1/oneUpon;

}

public static double findV(double u, double f){

    double oneUpon;

    oneUpon = 1/f - 1/u;
    return 1/oneUpon;
}

public static double findF(double u, double v){

    double oneUpon = 1/u + 1/v;
    return 1/oneUpon;
}

}

Solution

First, the findX functions don’t need to initialise the variable oneUpon inside. It’s also unclear, anyway.

public static double findU(double v, double f) {

    double oneUpon;

    oneUpon = 1/f - 1/v;
    return 1/oneUpon;

}

public static double findV(double u, double f){

    double oneUpon;

    oneUpon = 1/f - 1/u;
    return 1/oneUpon;
}

public static double findF(double u, double v){

    double oneUpon = 1/u + 1/v;
    return 1/oneUpon;
}

Just return the variable directly.

I’d also like to point out that findU and findV are identical in function, just named differently.

Consider the following instead:

public static double findUV(double uv, double f) {
    return 1/(1/f - 1/uv);
}

public static double findF(double u, double v){
    return 1/(1/u + 1/v);
}

    System.out.println("Hello! This is a calculator based on the Mirror Formula. n");
    System.out.println("The mirror formula is a relation between the object distance, the image distance n and the focal length.");
    System.out.println("The formula is : 1/u + 1/v = 1/f.  (u=distance of object, v=distance of image, f=focal length.)");
    System.out.println("It is applicable for both convex mirrors and concave mirrors.");
    System.out.println();
    System.out.println("This calculator can calculate :");
    System.out.println();
    System.out.println("1. Distance of the object from the pole of the spherical mirror.");
    System.out.println("2. Distance of the image from the pole of the spherical mirror.");
    System.out.println("3. Focal length");
    System.out.println("[If you have 2 of the values.]");

This is not how you print large blocks. Separate your strings with line separators like /n. Keep the text as a large multi-line string block, and print that out instead. It will take less maintenance and less System.out.println calls.


Feel free to take the user input as a string/letter instead of an integer, makes everything much clearer. On a related note, an exit function would be nice too.

    switch (userChoice) {

    case 1 :

FunU and FindV do the same thing you should find an appropriate name for the operation it does instead. Consider changing your function findV to

return (f * u) / (u - f);

You can change findF in a similar way. More importantly functions findV and findU will fail when both parameters are equal. (Division by zero).

Leave a Reply

Your email address will not be published. Required fields are marked *