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