2012-01-10 56 views
2

這裏是我的Codecamedy's FizzBuzz lessonCodecademy網站FizzBu​​zz應用,停留在步驟1中

var i; 
for (i = 1; i > 20; i++) { 
    "hello" 
    if (i % 3 === 0) { 
    if (i % 5 === 0) { 
     "FizzBuzz"; 
    } 
    else { 
     "Fizz"; 
    } 
    } 
    else if (i % 5 === 0) { 
    "Buzz"; 
    } 
else { 
    i; 
    } 
} 

我想第一次測試的數(i)是否碼是被3整除。如果是這樣,我再想檢查它是否也可以被5整除。如果兩個條件都成立,我想讓它說「FizzBu​​zz」。如果只有第一個條件是真的,它應該說「Fizz」。然後,在確定我不能被3整除之後,它應該檢查我是否可以被5整除,如果是這樣的話就顯示「Buzz」。如果沒有全部的可分性,它應該只顯示數字。

正如我所料......它不能按預期工作。我犯了什麼非常令人尷尬的錯誤?

回答

2

考慮所有其他很好的答案在這裏之後:

既然你「停留在第1步」與您提供的代碼,我假設您在點擊鏈接並閱讀說明之後做了同樣的錯誤。第一步實際上並沒有要求你解決Fizzbuzz問題。要通過這一步,你只需要做更簡單的事情。再次閱讀(不太好)的說明;)

+0

啊哈!其他答案確實很好,而且非常有幫助。但你是對的。我在這裏領先於自己。這些說明應該重申。我剔除了所有fizzbuzz的東西,並通過了這一步,並且色彩鮮明。謝謝。向前!被5除盡的 – mrdavidjcole 2012-01-10 02:57:17

8

首先,你的循環甚至沒有離開地面:由於中間狀態最初是假

for (i = 1; i > 20; i++) 

不會重複甚至一次。我想你的意思是:

for (i = 1; i <= 20; i++) 

"FizzBuzz"; 

只是字面的JavaScript已經忽略的字符串。你需要輸出這個字符串莫名其妙:

console.log("FizzBuzz"); 

此外,該塊

else { 
    i; 
    } 

也沒有做任何事情。你想顯示可以被3和5整除的數字嗎?

else { 
    console.log(i); 
    } 

而且,在類似的說明中,什麼是"hello"在頂部循環應該做的?


從更積極的方面,我看到你使用全等:

if (i % 5 === 0) 

這是一個非常,非常好的習慣是在非嚴格相等的==操作符會。如果你不小心做各種隱式轉換。 總是使用嚴格的平等,除非您有意要這些隱式轉換髮生。

+0

另外,一定不要在頂部 – fivedigit 2012-01-10 02:30:29

+0

@fivedigit日誌 「你好」 的字符串 - 確實如此。我添加了一個關於這個的筆記。也許這應該是一個調試聲明,只要確保該程序是活着的? – 2012-01-10 02:32:42

+0

謝謝亞當。真棒的建議在這裏。事實證明,我對本課的第一步太過分了 - 請看下面的Andreas的評論。 – mrdavidjcole 2012-01-10 02:58:43

3

你的具體問題,你必須爲for循環,像"somestring"i聲明實際上並沒有做任何錯感。你想要做的是輸出它做控制檯(或某種其他輸出流) - 如何做到這一點取決於你的Javascript運行的環境,以及你想要的信息去。

您也可以記住,任何可被3個五整除的數字都是15的倍數。

這樣你就可以像簡化代碼:

for all numbers in range: 
    if num is a multiple of 15: 
     print "FizzBuzz" 
     continue for loop 

    if num is a multiple of 3: 
     print "Fizz" 
     continue for loop 

    if num is a multiple of 5: 
     print "Buzz" 
     continue for loop 

    print i 

還有那些會抱怨多個出口或重新啓動的循環點,但你可以放心地忽略他們,因爲他們不理解的原因在指南後面,避免意大利麪代碼。

任何你可以看到單個頁面上的所有控制流(如上面的十一行)的代碼都不能成爲意大利麪代碼,尤其是考慮到一致的處理。


下面是等價的Javascript代碼,包裝成一個Web頁面來進行測試:

<html><head></head><body><script type="text/javascript"> 
    var i; 
    for (i = 1; i <= 20; i++) { 
     if (i % 15 === 0) { 
      document.write ("FizzBuzz<br>"); 
      continue; 
     }; 

     if (i % 3 === 0) { 
      document.write ("Fizz<br>"); 
      continue; 
     }; 

     if (i % 5 === 0) { 
      document.write ("Buzz<br>"); 
      continue; 
     }; 

     document.write (i + "<br>"); 
    } 
</script></body></html> 

其輸出,根據需要:

1 
2 
Fizz 
4 
Buzz 
Fizz 
7 
8 
Fizz 
Buzz 
11 
Fizz 
13 
14 
FizzBuzz 
16 
17 
Fizz 
19 
Buzz 
+0

我能問一下=== 0在循環中的含義,例如if(i%15 === 0){..}? – Michel 2015-01-17 21:32:43

1

for (i = 1; i > 20; i++)意味着程序不會做任何事情。如果你期望變量i以1開始並以20結尾,那麼你應該像for(i = 1; i <= 20; i++)那樣做。如果你想測試你想要一些數字,你應該使用的功能等:

function TestFizzBuzz(num){ 
    ... 
    ... 
} 
TestFizzBuzz(1); 
TestFizzBuzz(990); 
... 
3
for (var i = 1; i <= 20; i++) { 
    if (i % 15 === 0) { 
     console.log("FizzBuzz"); 
    } 
    else if (i % 3 === 0) { 
     console.log("Fizz"); 
    } 
    else if (i % 5 === 0) { 
     console.log("Buzz"); 
    } 
    else{ 
    console.log(i); 
    }; 
} 
1

如果我們讓事情變得更加困難會怎樣? 1)不允許劃分或模數操作; 2)循環必須跳過所有不必要的迭代。 下面是答案:

int n3 = 3; 
int n5 = 5; 
int i = 3; 
while (i <= 100) 
{ 
    Console.Write(i.ToString() + " - "); 

    if (i == n3) 
    { 
     Console.Write("fizz"); 

     n3 = n3 + 3; 
    } 

    if (i == n5) 
    { 
     Console.Write("buzz"); 

     n5 = n5 + 5; 
    } 

    Console.WriteLine(); 

    i = n3 < n5 ? n3 : n5; 
} 
+0

可以更容易。只要檢查它是否結束於5或0.要檢查3分可以加起來每個單獨的號碼,直到你最終在0,3,6或9. http://www.aaamath.com/div66_x3.htm – jessehouwing 2014-12-22 11:42:38

+0

是,你是正確的,這些黑客肯定會加快代碼。但我的解決方案是通用的,它對於任何給定的數字對都可以正常工作。 – mik61 2014-12-23 10:27:38

0

我的解決辦法:

var nums = new Array(); 

for (var i = 0; i < 20; i++){ 
    nums[i] = i + 1; 
} 

for (var i = 0; i < 20; i++){ 
    if((nums[i] % 5 == 0) && (nums[i] % 3 == 0)){ 
     console.log("FizzBuzz"); 
    }else if(nums[i] % 5 == 0){ 
     console.log("Buzz"); 
    }else if (nums[i] % 3 == 0){ 
     console.log("Fizz"); 
    }else{ 
     console.log(nums[i]); 
    } 
} 
0

只是爲了急促的緣故,讓我們做一個行:

for (i=1;i<21;i++){console.log(i+": "+(i%3?(i%5?i:'Buzz'):(i%5?'Fizz':'FizzBuzz')));}; 
0
for(var i =1; i<=20; i++){ 
    if(i % 15 === 0){ 
     console.log("FizzBuzz"); 
    } 
    else if(i % 5 === 0){ 
     console.log("Buzz"); 
    } 

    else if(i % 3 === 0){ 
     console.log("Fizz"); 
    } 
    else{ 
     console.log(i); 
     } 

    }; 
0

的目標是打印「嘶嘶聲」的數字是3整數(沒有休息),「嗡嗡聲」5和「FizzBu​​zz」3和5,否則它應該打印數字。

  • 模(%)返回一個部門的其餘部分,因此,如果(X%y)返回0檢查的分工是不可或缺的
  • 爲模數可以返回0,我們需要記住truthy和falsy值 - 0是一個虛假值,因此如果我們想要檢查一個數是否「真實」,我們需要否定測試0

    例如:!(3%3)=>!(0)=>!假=>真

for (var i = 1; i <= 20; ++i) { 
 
    if (!(i % 3) && !(i % 5)) { // check if "i" is integral divisible by 3 & 5 
 
    console.log("FizzBuzz"); 
 
    } else if (!(i % 3)) {  // else check if "i" is only integral divisible by 3 
 
    console.log("Fizz"); 
 
    } else if (!(i % 5)) {  // else check if "i" is only integral divisible by 5 
 
    console.log("Buzz"); 
 
    } else { 
 
    console.log(i);   // else print the number 
 
    } 
 
}
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>

+3

請嘗試向您的代碼添加一些解釋 - 這使它對OP和未來的讀者更有用。特別是在這種情況下,OP不只是要求工作代碼,而是真的想知道原代碼出錯的地方。 – Serlite 2015-10-01 21:17:04