簡體   English   中英

需要幫助來建立循環

[英]Need help creating a loop

我的循環需要能夠生成字母ABC ext。 垂直是這樣的:

A
B
C 

但是,當到達字母J時,它需要重新開始。 用戶通過命令行輸入要生成的行數。 我在想辦法讓循環在到達字母J之后重新開始時遇到了麻煩。我在這里有我的代碼:

#include <iostream>

using namespace std;

int main(int argc, char **argv)
{
    int letter = 65;

    for(int i = 0; i < atoi(argv[1]); i++)
    {
        cout <<(char)letter++;
        cout << endl;

        if(letter == 75)
        {
            int letter = 65;
        }
    }   

    return(0);
}

注意,在if語句中, int letter替換為letter

#include <iostream>
#include <cstdlib>

using namespace std;

int main(int argc, char **argv)
{
    int letter = 65;

    for(int i = 0; i < atoi(argv[1]); i++)
    {
        cout <<(char)letter++;
        cout << endl;

        if(letter == 75)
        {
            letter = 65;
        }
    }

    return(0);
}

輸入為16的輸出

A
B
C
D
E
F
G
H
I
J
A
B
C
D
E
F

您可以這樣做:

#include <iostream>
#include <cassert>
#include <cstdlib>

int main(int argc, char **argv)
{
  using namespace std;

  assert(argc >= 1 + 1); //Fail with an error message rather than a segfault if the argument isn't provided

  int n_iterations = atoi(argv[1]);
  int range_size = 'J' - 'A' + 1; //include 'J'

  for(int i=0; i < n_iterations; i++){
    cout<< char('A'+i % range_size) << '\n';
  }

  return 0;
}

要點如下:

  • 一次調用atoi ,而不是在每次迭代中
  • 描述性代碼(即'A' )比魔術數字更好
  • 要環繞數字,請使用i % range_size而不是if
  • 每行結束后不刷新( endl刷新)會更好地提高管道的性能(如果您想要性能,您還可能希望通過執行ios::sync_with_stdio(false);stdio同步)

如果您確實要使用if ,則存在以下問題:

 if(letter == 75)
        {
            int letter = 65;
        }

是因為int letter = 65; 在新的作用域(=大括號)中,它將創建一個新的本地letter變量,該變量將使原始letter變暗。

if(letter == 75){
   letter = 65;
}

應該解決問題。

這里 :

 if(letter == 75)
 {  
  int letter = 65;
 }

您是在花括號內重新聲明letter ,而不是修改現有的letter變量。 letter變量在該塊中是局部的,並且隱藏了其他letter變量。

您可以通過在程序的開始處放置一個斷點,然后在其中觀察letter變量來自己調試此問題。 您可能已經注意到,進入if時不會對其進行修改。

嘗試這個:

   if(letter == 75)
      {
        letter = 65;
       }

有很多方法可以完成任務。 例如,您可以通過以下方式編寫程序

#include <iostream>
#include <cstdlib>

int main( int argc, char **argv )
{
    const int N = 'J' - 'A' + 1;

    int n = 0;

    if ( argv[1] ) n = std::atoi( argv[1] ); 

    for ( int i = 0; i < n; i++ ) std::cout << char( 'A' + i % N ) << std::endl;
}    

例如,如果將命令行參數設置為14,則輸出將類似於

A
B
C
D
E
F
G
H
I
J
A
B
C
D

或者,您可以編寫本演示程序中所示的主循環

#include <iostream>
#include <cstdlib>

int main( int argc, char **argv )
{
    const char A = 'A', J = 'J';

    int n = 0;

    if ( argv[1] ) n = std::atoi( argv[1] ); 

    for ( char c = A; n-- > 0; c == J ? c = A : ++c ) std::cout << c << std::endl;
}    

輸出將與上述相同。

另一種方法。

#include <iostream>
#include <cstdlib>

int main( int argc, char **argv )
{
    const char *letters = "ABCDEFGHIJ";

    int n = 0;

    if ( argv[1] ) n = std::atoi( argv[1] ); 

    for ( const char *p = letters; n-- > 0; *++p ? p : p = letters )
    {        
        std::cout << *p << std::endl;           
    }        
}    

至於您的代碼,則不應使用像65或75這樣的幻數。首先,這會使代碼難以理解,在其他編碼系統(例如EBCDIC)中,這些幻數將變得毫無意義。

同樣在此代碼段中

if(letter == 75)
{
    int letter = 65;
}

您要聲明的另一個帶有名稱letter局部變量在大括號后將不復存在。 因此,此代碼段也沒有意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM