2011-09-30 81 views
1

你好,这是我的第一条消息溢出(对不起,如果问题太长),我也是初级在Java和英语。无限循环在哪里?

我最近读了一个思维游戏。问题是这样的: 有四个女人,他们的名字是:kirmizi - yesil -sari -mavi (这些是土耳其的颜色名称)每个女人都穿着这种颜色的裙子。例如;

马维女人穿纱丽裙

但有两条规则:

妇女的裙子颜色都不应该不是同他们的名字

也是他们的名字和裙子的长度不能是等于。例如,马维女人不能穿莎丽裙子。但她可以穿kirmizi和yesil。

你能找到每个女人的裙子颜色吗?

而且我试图解决它,但它进入无限循环

颜色为RENK 名= ISIM在土耳其:)

编辑:我刚刚发现了新的线索。 kirmizi小姐和纱丽不能穿mavi和yesil裙子。他们的裙子也是不同的颜色。我可以写出答案,如果你想,但我相信这是对像我这样的初学者:)

package ana; 

class Ana { 

    static boolean birtobir=false; 
    static boolean ikitoiki=false; 
    static boolean uctouc=false; 
    static boolean dorttodort=false; 

    String renk; 
    String isim; 
    public static void main(String[] args) { 

     String[] isimler={"bir","iki","uc","dort"}; 
     String[] renkler={"kirmizi","sari","yesil","mavi"}; 

     Ana bir = new Ana(); 
     bir.isim = "kirmizi"; 
     bir.renk="kirmizi"; 

     Ana iki = new Ana(); 
     iki.isim = "sari"; 
     iki.renk="sari"; 

     Ana uc = new Ana(); 
     uc.isim = "yesil"; 
     uc.renk="yesil"; 

     Ana dort = new Ana(); 
     dort.isim = "mavi"; 
     dort.renk="mavi"; 

     while (birtobir=true && bir.renk.matches(bir.isim)) 
       while(ikitoiki=true && iki.renk.matches(iki.isim)) 
         while(uctouc=true && uc.renk.matches(uc.isim)) 
           while(dorttodort=true && dort.renk.matches(dort.isim)) { 

            for (int a=0;a<renkler.length;a++) { 
             bir.renk=renkler[a]; 

             if(bir.renk.length()==bir.isim.length()) { 
              boolean birtobir=true; 
             } 

             for (int b=0;b<renkler.length;b++) { 
              iki.renk=renkler[b]; 

              if(iki.renk.length()==iki.isim.length()) { 
               boolean ikitoiki=true; 
              } 

              for (int c=0;c<renkler.length;c++) { 
               uc.renk=renkler[c]; 

               if(uc.renk.length()==uc.isim.length()) { 
               boolean uctouc=true; 

               for (int d=0;d<renkler.length;d++) { 
                dort.renk=renkler[d]; 

               } 
               if(dort.renk.length()==dort.isim.length()){ 
                boolean dorttodort=true; 
               } 

              } 
             } 
            } 
           }       
    } 


    System.out.println(bir.isim+"="+bir.renk); 
    System.out.println(iki.isim+"="+iki.renk); 
    System.out.println(uc.isim+"="+uc.renk); 
    System.out.println(dort.isim+"="+dort.renk); 


    } 
} 
+2

您应该首先正确缩进您的代码,以便其他人阅读并不困难。此外,而不是提供翻译指南,只是做一个搜索和替换。 –

+1

您是否尝试使用调试器并查看inifite循环的位置?当你处于无限循环时,变量/ s是恒定的还是超出范围? – amit

+1

嗨。请你能解释变种'birtobir',''ikitoiki','uctouc'和'dorttodort'的含义吗?另外,向你的代码添加注释来描述正在发生的事情不仅可以帮助其他人分析它,还可能帮助你自己理解它。 – megaflop

回答

6

一个很好的问题,这只是一个猜测,但在这里:

while (birtobir=true && bir.renk.matches(bir.isim)) 
       while(ikitoiki=true && iki.renk.matches(iki.isim)) 
         while(uctouc=true && uc.renk.matches(uc.isim)) 
           while(dorttodort=true && dort.renk.matches(dort.isim)){ 

最可能是你想要的: birtobir==true && .. ikitoiki==true && ... uctouc==true && ... dorttodort==true [使用运算符==代替运算符=]

birtobir=true套birtobir是真实的,而birtobir==true检查是否吨他的变量是真实的。在operators in java

更多的细节。如果它不是一个错误,而你真正想要设置vaeriable - 这是一个坏的风格,你应该refactor你的代码。

编辑: 还有一件事我可以看到:

if(bir.renk.length()==bir.isim.length()){ 
      boolean birtobir=true; 
     } 

在这里,您可以创建一个新的变量命名birtobir,并将其设置为true。该变量不是在while循环中检查的[或应该检查]的变量。我假设你实际上想要将类成员设置为true。为此,请将boolean birtobir=true;替换为birtobir=true;

+1

斑点。而且,当检查一个布尔值时,根本不需要使用'==':if(birtobir && ...'比if更好“if(birtobir == true && ...' – megaflop

+0

谢谢我从中学到了很多东西你 – Wardruna

0

单个=将值赋予变量,而==检查是否相等。这意味着您应该更改while循环中的条件以检查相等性而不是分配值。

I.E. while (birtobir=true && bir.renk.matches(bir.isim))实际上与while (bir.renk.matches(bir.isim))相同。 因此,应当改为while (birtobir==true && bir.renk.matches(bir.isim))

编辑:什么阿米特说..

0

这里是我的翻译。如果我理解正确,你想打印所有有效的组合?

public class Colours 
{ 
    private static String[] names = new String[]{"kirmizi","yesil", "sari", "mavi"}; 
    private static String[] colors = new String[]{"kirmizi","yesil", "sari", "mavi"}; 


    public static void main(String[] args) 
    { 
    for (int i = 0; i < names.length; i++) 
    { 
     for (int j = 0; j < colors.length; j++) 
     { 
     if(allowed(names[i], colors[j])) { 
      System.out.println(names[i] + " may wear " + colors[j]); 
     } 
     } 
    } 
    } 

    private static boolean allowed(String name, String color) { 
    return (!name.equals(color)) && (name.length() != color.length()); 
    } 
} 
+0

不,没有不是所有有效的组合。我需要找到哪个女人穿着哪条裙子?但你的代码非常好,简单,它帮助了我很多thx – Wardruna

0

不能肯定地告诉这是怎么回事,但你似乎有很多次。

我会尝试启动一个天真的,但简单的算法:

for (person in persons) { 
    for (color in skirtColors) { 
     if (person.name != color && person.name.lenght != color.lenght) { 
      person.skirtColor = color; 
     } else { 
      person.skirtColor = ""; 
     } 
    } 

    if (allPersonsHaveSkirts(persons)) { 
     // a more complete check should be done 
     // to make sure they all have different colored skirts 
     printSolution(); 
    } 
} 

通过使用两个简单的,有限for循环,可以保证不会无限循环发生。