2012-01-14 2 views
2

나는 두 개의 정수를 입력하라는 프로그램을 작성했다. 두 개의 정수는 입력 된 두 정수 중 큰 정수로 입력 된 두 정수 중 작은 정수부터 나열한다. 프로그램에서 마지막 정수 다음에 마침표를 넣고 싶습니다. for 루프를 사용하지 않고이 작업을 수행하는 방법을 찾았지만 왜이 코드가 작동하지 않는지 이해하고 싶습니다. 그 이후의 기간). 두 개의 정수가 입력 한 경우루프 예기치 않은 출력을위한 간단한 C++

#include <iostream> 

int main() 
{ 
std::cout << "Enter two integers, pressing <ENTER> after each integer." << std::endl; 
int num1, num2, lower, upper; 
std::cin >> num1 >> num2; 
if (num1 > num2) 
{ 
    upper = num1; 
    lower = num2; 
} 
else 
    if (num1 < num2) 
    { 
    upper = num2; 
    lower = num1; 
    } 
    else 
     if (num1 = num2) 
     { 
      upper = num1; 
      lower = num1; 
     } 
std::cout << "All integers between " << lower << " and " << upper << " are:" << std::endl; 
for (int val = lower; val <= upper; ++val) 
{ 
    if (val = upper) 
    { 
     std::cout << val << "." << std::endl; 
     ++val; 
    } 
    else 
    { 
     std::cout << val << std::endl; 
     ++val; 
    } 
} 
return 0; 

}

1, 5하다, 왜이 출력 5. 대신 1 2 3 4 5.합니까?

+0

실수로 비교 대신 할당을 사용하는 것에 대한 첫 번째 방어책은 항상 변경되지 않는 값에 항상 const를 사용하는 것입니다. 이 경우 std :: cin에서 스트리밍 한 후 num1 및 num2를 const int &에 넣어야합니다. 할당이 발생하면 컴파일러에서 경고합니다. 상단/하단도 const이어야하며 최대 및 최소 (표준 라이브러리 함수)로 초기화 할 수 있습니다. 예 : const upper = max (num1, num2); – Zoomulator

답변

3

먼저 비교 연산자 ==을 사용해야하는 할당 연산자 =을 사용하고 있습니다. 두 번째로 for 루프는 for 루프의 세 번째 명령문 (for (...; ...; ++val))으로 인해 이미 val을 증가시킵니다. 따라서 루프의 본문에서 val을 증가시킬 필요가 없습니다.

또한 모든 결과를 한 줄로 인쇄하려는 경우 std::endl 대신 반복 할 때마다 공백을 출력해야합니다. 공백이 아닌 마침표를 출력하려는 ​​경우 마지막 반복은 예외입니다. 아래의 고정 된 버전에서는 이것을 달성하기 위해 루프 본문에 ternary operator을 사용했습니다. 당신이 무슨 짓을 할

std::cout << "Enter two integers, pressing <ENTER> after each integer." << std::endl; 
int num1, num2, lower, upper; 
std::cin >> num1 >> num2; 
if (num1 >= num2) 
{ 
    upper = num1; 
    lower = num2; 
} 
else if (num1 < num2) 
{ 
    upper = num2; 
    lower = num1; 
} 

std::cout << "All integers between " << lower << " and " << upper << " are:" << std::endl; 
for (int val = lower; val <= upper; ++val) 
{ 
    std::cout << val << ((val == upper) ? "." : " "); 
} 
+0

고맙습니다. 저는 삼항 연산자 또는'='와'=='의 차이점에 대해 연구하거나 알지 못했습니다 ... 이것은 매우 도움이되었습니다. – lapse

2

문제는 = 상부 당신이 상위 값을 발에 영향을 미치는 것을 의미

if (val = upper) 
{ 
    std::cout << val << "." << std::endl; 
    ++val; 
} 

발입니다. 2 '='를 넣어서 효과 대신 비교합니다. 이

if (val == upper) 
{ 
    std::cout << val << "." << std::endl; 
    ++val; 
} 
1

때문에

if(Val = upper) 

가 발 값을 재 할당 마찬가지로 상부한다. 당신이 의미 한 바는

if(Val == upper) 

어쨌든 그럴 수 있습니다.

0

++ 발은 루프 선언 수준에 있지 내부의 경우 존재해야 모두 delannoyk 및 Gillaume07에서 언급 한 바와 같이 다른

for (int val = lower; val <= upper; ++val) 
    std::cout << val << (val==upper ? "." : " ") << std::endl; 
0

은 프로그램의 두 가지 오류가 있습니다. =은 C++의 대입 연산자이며 ==는 비교 연산자입니다. 거의 항상 진술은 비교 연산자를 가질 것입니다. 둘째, for 루프 문과 if/else에서 증분 작업을 수행하면 매 반복마다 카운터 변수에 2가 추가됩니다.

0

쉬운 방법이 대체가이와

for (int val = lower; val <= upper; ++val) 
{ 
    if (val = upper) 
    { 
     std::cout << val << "." << std::endl; 
     ++val; 
    } 
    else 
    { 
     std::cout << val << std::endl; 
     ++val; 
    } 
} 

: 다른 사람이 이미이 코드에 문제의 번호에 댓글을

for (int val = lower; val <= upper; ++val) 
{ 
    std::cout << val; 

} 
cout<<"."<<std::endl; 
0

. 여기에 내 애완 동물이 있습니다 : 입력이 실제로 정확했는지 확인해야합니다!즉, std::cin을 읽은 후에 이것이 성공했는지 확인해야합니다. 비 공백 및 숫자가 아닌 문자를 입력하면 임의의 가비지가 그대로 변수에 저장됩니다. std::istream에서 읽을 수있는 표준 방법은 다음과 같습니다

if (std::cin >> num1 >> num2) { 
    ... 
} 
else { 
    possibly an report error here 
} 
0

"=" "위"가 "발"의 값을 할당하는 데 사용됩니다. "val"과 "upper"의 값을 비교할 때 사용할 연산자는 "="대신 "=="이어야합니다. 따라서 다음 코드는 다음과 같아야합니다.

관련 문제