2015-11-30 60 views
-6

該代碼爲每2個字母創建一個文本文件。 aa.txt ab.txt ac.txt ad.txt ae.txt af.txt ba.txt bb.txt bc.txt等等,等等。嵌套循環沒有達到預期的效果

這是一個更大程序的簡化版本。

#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 

int main() 
{ 
    for(int i = 0; i < 6; i++) 
    { 
     string letter1; 
     if(i = 0){letter1 = "a";} 
     if(i = 1){letter1 = "b";} 
     if(i = 2){letter1 = "c";} 
     if(i = 3){letter1 = "d";} 
     if(i = 4){letter1 = "e";} 
     if(i = 5){letter1 = "f";} 

     for(int x = 0; x < 6; x++) 
     { 
      string letter2; 
      if(i = 0){letter2 = "a";} 
      if(i = 1){letter2 = "b";} 
      if(i = 2){letter2 = "c";} 
      if(i = 3){letter2 = "d";} 
      if(i = 4){letter2 = "e";} 
      if(i = 5){letter2 = "f";} 

      std::ofstream o(letter1 + letter2 + ".txt"); 
     } 
    } 
    return 0; 
} 

的問題是,它完全跳過其他字母並且僅創建ff.txt。 我在處理另一個項目時遇到了類似的問題,因此它會重複出現。我從來沒有解決過一個以太。我個人無法找到可能是什麼問題。一切似乎都是正確的,但顯然我錯了。

+0

你從不用'x'的值做任何事情。 – MrEricSir

+0

怎麼樣?增加它是不夠的,我假設。 – Hennry

回答

4

在你的內循環中,你檢查的值是i,而不是x,可能是複製粘貼錯誤。

這是因爲這樣的事情,代碼中的重複被認爲是非常糟糕的。每當你發現自己多次說出同樣的東西(或幾乎完全相同的東西)時,考慮如何重構代碼以避免重複自己是值得的。

在這種情況下,而不是兩個if語句,我們就可以把替代字母到一個數組和循環兩次來選擇字母,我們希望:

int main() { 
    static constexpr std::array<char, 6> letters = { 'a', 'b', 'c', 'd', 'e', 'f' }; 

    for (int i = 0; i < 6; i++) { 
     for (int j = 0; j < 6; j++) { 
      std::cout << letters[i] << letters[j] << ".txt\n"; 
     } 
    } 
} 
4

您使用=作爲比較的象徵,但在C++ =中僅用於分配。如果你想比較兩件事情,你需要使用==操作符。

即:

if(i = 5) // wrong ! you set the value of i to 5 
if(i == 5) // right ! i == 5 is true when i is in fact equal to 5. 

正如人們所指出的,你需要在你的第二個循環,不i來測試x