2011-09-30 95 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循環,可以保證不會無限循環發生。