繁体   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