[英]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.