将if-else语句中的变量返回给主程序

时间:2015-09-27 20:14:22

标签: java

我正在编写一个程序,当你输入rgb值时会给出cmyk输出。

我在Java之前做过Python,所以我现在是一个java noob 显然,if-else语句中的变量无法传递到主程序中。在blueJ中,它表示"找不到变量c"

public class color_conversion
{
    public static void main(String [] args)
    {
        int r = Integer.parseInt(args[0]);
        int g = Integer.parseInt(args[1]);
        int b = Integer.parseInt(args[2]);
        if ((r == 0 && g == 0)&&(g == 0 && b == 0))
        {
            double c = 0;
            double m = 0;
            double y = 0;
            double k = 0;
        }
        else         
        {
            int w = (int)(Math.max(r/255,(Math.max(g/255,b/255))));
            double c = (double)((w-(r/255))/w);
            double m = (double)((w-(g/255))/w);
            double y = (double)((w-(b/255))/w);
            double k = (double)(1-w);
        }
        System.out.println("cyan    =" + c);
        System.out.println("magenta =" + m);
        System.out.println("yellow  =" + y);
        System.out.println("black   =" + k);
    }
}

我做错了什么?

6 个答案:

答案 0 :(得分:2)

您定义所有变量cmyk两次 - 一次在if,一次在else块中,只为那些街区制作本地。

您需要在与rgb相同的级别定义这些变量,并在ifelse块中分配值。< / p>

所以它看起来像这样:

public static void main(String [] args)
{
    int r = Integer.parseInt(args[0]);
    int g = Integer.parseInt(args[1]);
    int b = Integer.parseInt(args[2]);

    double c;
    double m;
    double y;
    double k;

    if ((r == 0 && g == 0)&&(g == 0 && b == 0))
    {
        c = 0;
        m = 0;
        y = 0;
        k = 0;
    }
    else         
    {
        int w = (int)(Math.max(r/255,(Math.max(g/255,b/255))));
        c = (double)((w-(r/255))/w);
        m = (double)((w-(g/255))/w);
        y = (double)((w-(b/255))/w);
        k = (double)(1-w);
    }
    System.out.println("cyan    =" + c);
    System.out.println("magenta =" + m);
    System.out.println("yellow  =" + y);
    System.out.println("black   =" + k);
}

答案 1 :(得分:1)

if之前声明您的变量,就像使用rgb一样。 所以它会是

double c;
double m;
...

它们将是整个主要方法的本地。现在在没有类型的if内使用它们(如果你输入类型,你将为此声明新的变量,如果名称相同。)就像这样

c = 0;

目前你制作了两个本地的c,m,y和k集(每个集合都是它自己的块)

答案 2 :(得分:1)

将它们排除在if-else块之外。其他明智的编译器会将它们视为局部变量。

        double c;
        double m;
        double y;
        double k;

 if ((r == 0 && g == 0)&&(g == 0 && b == 0))
    {
        c = 0;
        m = 0;
        y = 0;
        k = 0;
    }
    else         
    {
        int w = (int)(Math.max(r/255,(Math.max(g/255,b/255))));
        c = (double)((w-(r/255))/w);
        m = (double)((w-(g/255))/w);
        y = (double)((w-(b/255))/w);
        k = (double)(1-w);
    }

答案 3 :(得分:1)

尝试像这样声明变量:

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


    double c = 0;
    double m = 0;
    double y = 0;
    double k = 0;
    int r = Integer.parseInt(args[0]);
    int g = Integer.parseInt(args[1]);
    int b = Integer.parseInt(args[2]);
    if (r != 0 || g != 0 || b != 0)        
    {
        int w = (int)(Math.max(r/255,(Math.max(g/255,b/255))));
        c = (double)((w-(r/255))/w);
        m = (double)((w-(g/255))/w);
        y = (double)((w-(b/255))/w);
        k = (double)(1-w);
    }
    System.out.println("cyan    =" + c);
    System.out.println("magenta =" + m);
    System.out.println("yellow  =" + y);
    System.out.println("black   =" + k);
}
}

答案 4 :(得分:1)

在Java中,所有变量和对象都有范围,这意味着变量/对象仅存在于此范围内。在您的示例中, c 变量仅存在于if语句中。当if语句中存在流时,GC会重新收集 c 变量。

所以,只需将 c,m,k,y 变量移到主函数的顶部即可。

答案 5 :(得分:1)

另一个问题:

你接受整数除法,例如&#39; r / 255&#39;,大部分时间都会给你&#39; 0&#39;。 要解决这个问题,你应该将其中一个投射到&#39; double&#39;,喜欢

(double)r/255

或者

r/255.0

或者

r/(double)255

或投两者。