숫자가 10의 배수인지 아니면 특정 범위 내에 있는지 확인


103

프로그램에 필요한 루프가 몇 개 있습니다. 의사 코드를 작성할 수 있지만 논리적으로 작성하는 방법을 완전히 모르겠습니다.

나는 필요하다 -

if (num is a multiple of 10) { do this }

if (num is within 11-20, 31-40, 51-60, 71-80, 91-100) { do this }
else { do this } //this part is for 1-10, 21-30, 41-50, 61-70, 81-90

이것은 내 질문에 더 이상 의미가 있다면 뱀과 사다리 보드 게임입니다.

모듈러스를 사용해야하는 첫 번째 if 문 if (num == 100%10)이 맞을까요?

두 번째는 전혀 모르겠습니다. 나는 그것을 쓸 수 if (num > 10 && num is < 21 || etc)있지만 그것 보다 더 똑똑한 것이 있어야한다.


16
일반적으로 좋은 코드의 길이는 그것이하는 일을 설명하는 영어의 길이에 비례합니다. 따라서 "사양"에 11-20, 31-40, 51-60, 71-80, 91-100이 표시되면 코드에서 해당 숫자도 언급 할 수 있습니다. 이러한 숫자가 어딘가에서 왔거나 어떤 이유로 생성 된 경우 숫자 대신 이유를 코딩 할 수 있는지 확인하십시오.
luqui

39
@ user3419168 : 컴파일러는 코드가 얼마나 읽기 쉬운 지 신경 쓰지 않습니다. 순식간에 컴파일됩니다. 그러나 코드를 읽는 인간의 경우 선택 사항에 따라 몇 초, 몇 분, 몇 시간 또는 전혀 이해되지 않을 수 있습니다. 이것은 비용을 부과합니다. 사람들은 코드를 읽고 이해하면 돈을 벌기 때문에 쉽게 이해할 수 있습니다. 가독성을 최대화하기 위해 항상 프로덕션 코드를 작성하고, 간결함이 반드시 코드 성능을 향상시키는 것은 아닙니다.
Eric Lippert 2014

2
@AmadeusDrZaius-거의 동일한 작업을 수행했지만 성능이 중요한 섹션에만 해당됩니다. 100M 번 호출되는 가장 엄격한 루프는 자격이 있습니다. 뱀과 사다리 게임의 if 문은 그렇지 않습니다. 그들 사이에 선을 그리는 곳은 개인적인 선택입니다.
Floris

2
나는 그것을 말하기 싫지만, 초보자가 실제 코드를 작성하는 것과 함께 충분한 기업 작업을 수행 했으므로 무차별 대입을 권장해야합니다. 그러면 새로운 사람들이 그것을 이해하고 깨뜨리지 않을 것이기 때문입니다. 슬프지만 사실입니다. 어떤 경우에는 멍청 해 지기도합니다.
Richard Le Mesurier

22
이것은 괜찮은 질문이며 포스터에서 아무것도 빼고 싶지 않지만 500 점 이상을받을 자격이 없습니다. 이것이 우리가 여기에서 권위자로 보이는 수천 점을 가진 사람들과 함께하는 말도 안되는 일로 끝나는 방법입니다. (이 의견이 다른 곳에 속한 경우 자유롭게 이동하십시오.)
GaTechThomas

답변:


86

첫 번째의 경우 숫자가 다중 사용인지 확인하려면 다음을 수행하십시오.

if (num % 10 == 0) // It's divisible by 10

두 번째 경우 :

if(((num - 1) / 10) % 2 == 1 && num <= 100)

그러나 그것은 다소 조밀하며 옵션을 명시 적으로 나열하는 것이 더 나을 수 있습니다.


당신이하고있는 일에 대해 더 나은 아이디어를 주 었으니, 두 번째는 다음과 같이 작성하겠습니다.

   int getRow(int num) {
      return (num - 1) / 10;
   }

   if (getRow(num) % 2 == 0) {
   }

동일한 논리이지만 함수를 사용하면 의미를 더 명확하게 이해할 수 있습니다.


79
if((num - 1) / 10) % 2 == 1 && num < 100)-그걸 본다면 울 것입니다.
Daniel Kamil Kozar 2014

32
@DanielKamilKozar, 당신이해야합니다.
Winston Ewert 2014

2
@ user3419168, 그 자체로 세상에서 그것이 무엇을 의미하는지 궁금해합니다. 그것은 세상에서 무엇을하려고하는지에 대한 힌트를주지 않습니다. 그래서 편집에서 논리를 함수로 분할하여 계산이 실제로 수행하는 작업을 더 명확하게하는 버전을 보여주었습니다.
Winston Ewert 2014

3
num >= 11(1) 하한이 금지되고 (2) %음수에 대해서도 음수를 반환 한다고 주장하는 것이 현명 할 수 있습니다 . ( & 1여기서 사용하는 것이 "안전하다"는 것을 인정해야 하지만 추가 지식이 있다고 가정합니다.)
usr2564301

2
편집을 위해 +1하면 범위 목록의 이유를 파악하고 읽을 수있는 방식으로 표시합니다. IMO, 한 단계 더 나아가는 getRow(num) % 2 == 0함수로 래핑 하여 의도가 무엇인지 명확하게 만드는 것입니다. bool inEvenRow(int num){ return getRow(num) % 2 ==0;}
Mr.Mindor 2014-04-28

40

if (num은 10의 배수) {do this}

if (num % 10 == 0) {
  // Do something
}

if (num is within 11-20, 31-40, 51-60, 71-80, 91-100) {do this}

여기서 트릭은 범위 사이에서 일종의 공통성을 찾는 것입니다. 물론 "brute force"방법을 항상 사용할 수 있습니다.

if ((num > 10 && num <= 20) ||
    (num > 30 && num <= 40) ||
    (num > 50 && num <= 60) ||
    (num > 70 && num <= 80) ||
    (num > 90 && num <= 100)) {
  // Do something
}

그러나 1에서 빼면 num범위가 있음을 알 수 있습니다.

10-19, 30-39, 50-59, 70-79, 90-99

즉, 첫 번째 숫자가 홀수 인 모든 두 자리 숫자입니다. 다음으로 이것을 표현하는 공식이 필요합니다. 10으로 나누어 첫 번째 숫자를 얻을 수 있고 2로 나눌 때 나머지 1을 확인하여 홀수인지 테스트 할 수 있습니다. 모두 합치면 :

if ((num > 0) && (num <= 100) && (((num - 1) / 10) % 2 == 1)) {
  // Do something
}

길지만 유지 관리 할 수있는 코드와 더 짧은 "영리한"코드 사이의 절충안을 고려할 때 매번 더 길고 명확하게 선택합니다. 최소한 영리 해 지려고한다면 달성하려는 작업을 정확히 설명하는 의견을 포함 해주세요.

코드를 작업 할 다음 개발자가 무장하고 귀하가 사는 곳을 알고 있다고 가정하면 도움이됩니다. :-)


7
나는 여전히 영리한 코드를 원하지만 함수를 추출하여 유지 관리 가능한 코드로 전환합니다. 마지막 비트가라고 말하면 && isTensDigitOdd(num), 아마도 그것이하는 일을 설명하는 함수 정의 앞에 주석을 달아서 읽을 수있을 것입니다. 그러한 패턴이 존재한다면, 패턴에 대한 이유를 설명하는 주석은 유지 보수성 imo에 대한 계몽입니다.
크리스

3
Chris, "영리함"이 분명한 이점을 가질 때 훌륭한 전략입니다. 코드가 훨씬 짧아 지거나 (특히 변경 될 경우 오타 가능성이 적음) 효율성이 크게 향상됩니다. 간결성, 명확성 및 효율성 사이에는 거의 항상 절충안이 있으며 좋은 타협점을 찾는 것은 개발할 수있는 훌륭한 기술입니다. ( 스니커는 stackoverflow.com/a/2151844/29157 참조 )
Adam Liss 2014

1
이것은 훨씬 더 나은 접근 방식입니다. '영리한 코드'보다 이해하기 훨씬 쉬우 며 성능 차이는 아마도 무시할 만합니다.
user1477388 2014-04-28

@AdamLiss, 예, 이러한 결정의 영향을 볼 충분한 경험이 없기 때문에 제 의견은 가치가 없습니다. 조만간 내가 할 것이라고 확신하며 필요한 경우 2 차 의견을 듣도록하겠습니다.
chris

1
자신을 짧게 팔지 마십시오. 당신의 본능은 매우 현명하고 계속 배우고 싶어하는 것 같습니다. 정당한 이유가 있다면 모든 의견은 가치가 있으며 때로는 그렇지 않더라도 가치가 있습니다. 나는 당신이 멀리 갈 돈을 걸 것입니다.
Adam Liss 2014

30

GCC 또는 대소 문자 범위 를 지원하는 컴파일러를 사용하는 경우 이를 수행 할 수 있지만 코드는 이식 가능하지 않습니다 .

switch(num)
{
case 11 ... 20:
case 31 ... 40:
case 51 ... 60:
case 71 ... 80:
case 91 ... 100:
    // Do something
    break;
default:
    // Do something else
    break;
}

1
이 코드를 이식 할 수없는 이유를 말씀해 주시겠습니까?
M Sharath Hegde 2014

8
@MSharathHegde이 표준의 일부가 아닌 일부 컴파일러를 지원하지 않습니다 GCC 확장, 필요로하기 때문에
브라이언 첸

5
의도가 무엇인지 즉시 알 수 있기 때문에 정답입니다. 모듈로의 모든 '영리한'답변은 댓글이 있더라도 유지 관리의 악몽입니다.
smirkingman 2014

@smirkingman 사실 그것이 내가 주요 질문에 대한 내 의견에서 말한 것입니다. 명백한 방법이 종종 똑똑한 닌자 방법보다 훨씬 낫다는 것을 깨닫기 위해서는 기업 업무에서 새로운 코더의 경험이 필요합니다.
Richard Le Mesurier 2014

15

이것은 초보자보다 미래의 방문객을위한 것입니다. 보다 일반적인 알고리즘 유사 솔루션의 경우 시작 및 종료 값 목록을 가져 와서 전달 된 값이 그 중 하나 내에 있는지 확인할 수 있습니다.

template<typename It, typename Elem>
bool in_any_interval(It first, It last, const Elem &val) {
    return std::any_of(first, last, [&val](const auto &p) {
        return p.first <= val && val <= p.second;
    });
}

간단하게하기 위해 명시적인 pair인수 대신 다형성 람다 (C ++ 14)를 사용했습니다 . 이것은 또한 아마 사용에 충실해야 <하고 ==표준 알고리즘과 일치하도록하지만만큼이 같은 작품 Elem이있다<= 그것을 정의했다. 어쨌든 다음과 같이 사용할 수 있습니다.

std::pair<int, int> intervals[]{
    {11, 20}, {31, 40}, {51, 60}, {71, 80}, {91, 100}
};

const int num = 15;
std::cout << in_any_interval(std::begin(intervals), std::end(intervals), num);

여기에 라이브 예제가 있습니다 .


깔끔한 솔루션. 한 줄에 2 개의 숫자로 형식을 지정하여 쌍을 나타낼 수 있기 때문에 단일 배열을 사용했을 것입니다.
Kevin Lam

@ HunterGuy2, 아주 좋은 지적입니다. 어떤 이유로 든 zip 반복자에 대해서만 생각했기 때문에 실제로 쌍으로 작동하도록 변경할 것입니다.
크리스

정말 멋진 stl 접근 방식! 그것을 사랑하십시오!
higuaro 2014

5

첫 번째는 쉽습니다. 모듈로 연산자를 num 값에 적용하면됩니다.

if ( ( num % 10 ) == 0)

C ++는 0이 아닌 모든 숫자를 true로 평가하므로 다음과 같이 작성할 수도 있습니다.

if ( ! ( num % 10 ) )  // Does not have a residue when divided by 10

두 번째는 이해하기 더 깔끔하다고 생각합니다.

패턴은 20마다 반복되므로 모듈로 20을 계산할 수 있습니다. 원하는 모든 요소는 20으로 나눌 수있는 요소를 제외하고 한 행에 있습니다.

그것들도 얻으려면 음수 처리를 피하기 위해 num-1 또는 더 나은 num + 19를 사용하십시오.

if ( ( ( num + 19 ) % 20 ) > 9 )

이것은 패턴이 영원히 반복된다는 가정하에 111-120에 대해 다시 적용됩니다. 그렇지 않으면 숫자를 100으로 제한해야합니다.

if ( ( ( ( num + 19 ) % 20 ) > 9 ) && ( num <= 100 ) )

5

코드에 몇 가지 좋은 주석이 있으면 매우 간결하고 읽기 쉽게 작성할 수 있습니다.

// Check if it's a multiple of 10
if (num % 10 == 0) { ... }

// Check for whether tens digit is zero or even (1-10, 21-30, ...)
if ((num / 10) % 2 == 0) { ... }
else { ... }

2
첫 번째 주석은 필요하지 않습니다. 약간의 경험이있는 프로그래머라면 10의 배수 num % 10 == 0와 같은 것을 알 것 num입니다.
Justin

7
네,하지만 초보자도이 사이트를 읽습니다. 나는 일반적으로 내 코드에서 그 주석을 사용하지 않지만이 초보자 질문의 혜택을받는 초보자에게 더 명확한 대답을 제공합니다.
La-comadreja 2014

2
절대 이러지 마세요. 실제로 독자의 속도를 늦추고 모든 것을 두 번 읽도록 강제함으로써 가독성을 떨어 뜨립니다. 그것을 이해하지 못하는 프로그래머 는 당신의 코드를 유지해서는 안되는 if (num % 10 == 0)것과 같은 의미 입니다. 이것은 잘 알려진 안티 패턴입니다. // Check if it's a multiple of 10
Dawood ibn Kareem 2014 년

1
@DavidWallace는 위의 주석을 참조하십시오. 이 게시물의 독자가이 안티 패턴을 알 것이라고 보장 할 수 없습니다.
La-comadreja

1
아니, 나는 그것이 무엇을하는지 말하기 위해 각 줄에 주석을다는 것은 반 패턴이라는 것을 의미한다. 사용하는 %것이 반 패턴 이라는 의미는 아닙니다 . 분명히 그렇지 않습니다. 실제로이 게시물의 많은 독자가 초보자라고 가정 할 때 이러한 스타일의 주석 작성을 가르치는 것은 프로그래머로서의 개발에 부정적인 기여를하고 있습니다.
Dawood ibn Kareem

4

기본적으로 답변을 직접 설명했지만 경우를 대비하여 여기에 코드가 있습니다.

if((x % 10) == 0) {
  // Do this
}
if((x > 10 && x < 21) || (x > 30 && x < 41) || (x > 50 && x < 61) || (x > 70 && x < 81) || (x > 90 && x < 101)) {
  // Do this
}

2
x < 41 x > 50괄호를 수정 하고 넣으십시오.
101010 2014-04-27

1
@ 40two, 기술적으로 operator&&는.보다 우선 순위가 높기 operator||때문에 괜찮지 만 어쨌든 GCC가 그것에 대해 경고한다고 확신합니다.
chris

18
불평등을 나타내는 고려 10 < x < 2110 < x && x < 21가 아니라 x > 10 && x < 21. 수학적으로 쓰는 것과 같은 순서 일 때 불평등을 읽는 것이 더 쉽습니다.
Eric Lippert 2014

5
이 코드는 상당히 읽을 수 없으며 실제 논리에 대해 거의 설명하지 않습니다. 나는이 대답을 싫어한다.
Dariusz 2014

3
나는 당신이 OP가 한 일에 정확히 대답했기 때문에 이것을 반대합니다.
Bruno Ferreira 2014

3

당신은 이것을 지나치게 생각할 수 있습니다.

if (x % 10)
{
   .. code for 1..9 ..
} else
{
   .. code for 0, 10, 20 etc.
}

첫 번째 줄 if (x % 10)은 (a) 10의 배수 인 값이 '0'으로 계산되고 다른 숫자는 나머지 값이되고 (b) an의 값이 0으로 if간주 false되고 다른 값은이므로 작동 true합니다.

편집하다:

20 대에 앞뒤로 전환하려면 동일한 트릭을 사용하십시오. 이번에 핵심적인 숫자는 10다음과 같습니다.

if (((x-1)/10) & 1)
{
  .. code for 10, 30, ..
} else
{
   .. code for 20, 40, etc.
}

x/100에서 9까지의 숫자를 0, 10에서 19 까지 등으로 반환합니다 1. 짝수 또는 홀수 테스트-the-는 & 1그것이 짝수인지 홀수인지 알려줍니다. 범위가 실제로 "11-20"이므로 테스트하기 전에 1을 뺍니다.


1

가독성에 대한 간청

이미 몇 가지 좋은 답변이 있지만 향후 독자가 코드를 더 쉽게 읽을 수있는 프로그래밍 기술을 추천하고 싶습니다. 6 개월 후에 동료가 코드 검토를 수행하도록 요청했습니다. .

이것은 어떤 "영리한"문장을 그것이하는 일을 정확히 (이름과 함께) 보여주는 함수로 감싸는 것입니다. 성능에 약간의 영향이 있지만 ( "함수 호출 오버 헤드"에서) 이것은 이와 같은 게임 상황에서 정말 무시할 만합니다.

그 과정에서 입력 내용을 정리할 수 있습니다 (예 : "불법"값 테스트). 따라서 이와 같은 코드로 끝날 수 있습니다. 얼마나 더 읽기 쉬운 지 보시겠습니까? "도우미 기능"은 어딘가에 숨겨져있을 수 있습니다 (메인 모듈에있을 필요는 없습니다. 이름에서 무엇을하는지 명확합니다).

#include <stdio.h>

enum {NO, YES, WINNER};
enum {OUT_OF_RANGE=-1, ODD, EVEN};

int notInRange(int square) {
  return(square < 1 || square > 100)?YES:NO;
}

int isEndOfRow(int square) {
  if (notInRange(square)) return OUT_OF_RANGE;
  if (square == 100) return WINNER; // I am making this up...
  return (square % 10 == 0)? YES:NO;
}

int rowType(unsigned int square) {
  // return 1 if square is in odd row (going to the right)
  // and 0 if square is in even row (going to the left)
  if (notInRange(square)) return OUT_OF_RANGE; // trap this error
  int rowNum = (square - 1) / 10;
  return (rowNum % 2 == 0) ? ODD:EVEN; // return 0 (ODD) for 1-10, 21-30 etc.
                                       // and 1 (EVEN) for 11-20, 31-40, ...
}

int main(void) {
  int a = 12;
  int rt;
  rt = rowType(a); // this replaces your obscure if statement

  // and here is how you handle the possible return values:
  switch(rt) {
  case ODD:
    printf("It is an odd row\n");
    break;
  case EVEN:
    printf("It is an even row\n");
    break;
  case OUT_OF_RANGE:
    printf("It is out of range\n");
    break;
  default:
    printf("Unexpected return value from rowType!\n");
  }

  if(isEndOfRow(10)==YES) printf("10 is at the end of a row\n");
  if(isEndOfRow(100)==WINNER) printf("We have a winner!\n");
}

3
그것과 너무 멀리 밀어하려고하지 않습니다 YESNO?
rmobis 2014

@Raphael_-아마도 "예를 들어"를 보여주고 있었을 것입니다. 많은 사람들이 분명히 참 / 거짓을 사용합니다. 그러나 나는 (다른 언어는 다른 규칙을 사용하기 때문에) 기억하지 않을 수 있습니다이다 TRUE, True또는 true? 어떤 헤더 파일이 있으면 일반 C에 포함해야합니까? 그래서 나는 내 자신을 굴렸다. downvote있어 그 무엇의 ... 궁금
플로리스

1

첫 번째 :

if (x % 10 == 0)

적용 대상 :

10, 20, 30, .. 100 .. 1000 ...

두 번째 경우 :

if (((x-1) / 10) % 2 == 1)

적용됩니다 :

11-20, 31-40, 51-60, ..

우리는 기본적으로 먼저 다음 x-1을 얻습니다.

10-19, 30-39, 50-59, ..

그런 다음이를 다음과 같이 나눕니다 10.

1, 3, 5, ..

따라서이 결과가 이상한지 확인합니다.


1

다음을 시도 할 수 있습니다.

        // multiple of 10
        if ((num % 10) == 0)
        {
           // Do something
        }
        else if (((num / 10) % 2) != 0)
        {
            //11-20, 31-40, 51-60, 71-80, 91-100
        }
         else
        {
            //other case
        }

OP 질문에서 10의 배수에 대한 검사는 범위 검사와 관련이 없으며 범위 검사에서 20은 코드 ((20/10) % 2)와 함께 11의 동일한 범위에 있어야합니다. 2 % 2)-> 0
Serpiton 2014

0

이 질문에 너무 많은 답변이 있다는 것을 알고 있지만 어쨌든 여기에 던질 것입니다 ...

Steve McConnell의 Code Complete , 2nd Edition에서 발췌 : "계단식 액세스 테이블 :

또 다른 종류의 테이블 액세스는 계단식 방법입니다. 이 액세스 방법은 인덱스 구조만큼 직접적이지는 않지만 많은 데이터 공간을 낭비하지 않습니다. 그림 18-5에 설명 된 계단 구조의 일반적인 개념은 테이블의 항목이 개별 데이터 포인트가 아닌 데이터 범위에 대해 유효하다는 것입니다.

여기에 이미지 설명 입력

그림 18-5 계단식 접근 방식은 "계단"에 도달하는 수준을 결정하여 각 항목을 분류합니다. 히트하는 "단계"에 따라 카테고리가 결정됩니다.

예를 들어, 채점 프로그램을 작성하는 경우 "B"입력 범위는 75 %에서 90 %까지입니다. 다음은 언젠가 프로그래밍해야 할 다양한 등급입니다.

여기에 이미지 설명 입력

계단식 방법을 사용하려면 각 범위의 상단을 테이블에 넣은 다음 루프를 작성하여 각 범위의 상단과 비교하여 점수를 확인합니다. 점수가 처음 범위의 상단을 초과하는 지점을 찾으면 점수가 무엇인지 알 수 있습니다. 계단식 기술을 사용하면 범위의 끝점을 적절하게 처리하도록주의해야합니다. 다음은이 예제를 기반으로 학생 그룹에 성적을 할당하는 Visual Basic의 코드입니다.

여기에 이미지 설명 입력

간단한 예이지만 여러 학생, 여러 채점 체계 (예 : 서로 다른 과제에 대해 서로 다른 점수 수준에 대해 서로 다른 성적) 및 채점 체계의 변경을 처리하기 위해 쉽게 일반화 할 수 있습니다. "

Code Complete , 2nd Edition, 426-428 페이지 (18 장).


왜 이것이 잘못된 질문이라고 생각하십니까? 내가 잘못된 질문 ... 대답 것을 의미하지 않는다 영업 경우에 대한 예제를 제공하지 않았기 때문에
lauCosma

0

다른 사람들이 지적했듯이 조건을 더 간결하게 만들면 컴파일이나 실행 속도가 빨라지지 않으며 가독성에도 도움이되지 않습니다.

나중에 6 x 6 보드에서 유아용 게임 버전을 원하거나 40 x 50 보드에서 고급 버전 (밤새도록 플레이 할 수 있음)을 원할 경우 프로그램을보다 유연하게 만드는 데 도움이 될 수 있습니다. .

따라서 다음과 같이 코딩합니다.

// What is the size of the game board?
#define ROWS            10
#define COLUMNS         10

// The numbers of the squares go from 1 (bottom-left) to (ROWS * COLUMNS)
// (top-left if ROWS is even, or top-right if ROWS is odd)
#define firstSquare     1
#define lastSquare      (ROWS * COLUMNS)
// We haven't started until we roll the die and move onto the first square,
// so there is an imaginary 'square zero'
#define notStarted(num) (num == 0)
// and we only win when we land exactly on the last square
#define finished(num)   (num == lastSquare)
#define overShot(num)   (num > lastSquare)

// We will number our rows from 1 to ROWS, and our columns from 1 to COLUMNS
// (apologies to C fanatics who believe the world should be zero-based, which would
//  have simplified these expressions)
#define getRow(num)   (((num - 1) / COLUMNS) + 1)
#define getCol(num)   (((num - 1) % COLUMNS) + 1)

// What direction are we moving in?
// On rows 1, 3, 5, etc. we go from left to right
#define isLeftToRightRow(num)    ((getRow(num) % 2) == 1)
// On rows 2, 4, 6, etc. we go from right to left
#define isRightToLeftRow(num)    ((getRow(num) % 2) == 0)

// Are we on the last square in the row?
#define isLastInRow(num)    (getCol(num) == COLUMNS)

// And finally we can get onto the code

if (notStarted(mySquare))
{
  // Some code for when we haven't got our piece on the board yet
}
else
{
  if (isLastInRow(mySquare))
  {
    // Some code for when we're on the last square in a row
  }


  if (isRightToLeftRow(mySquare))
  {
    // Some code for when we're travelling from right to left
  }
  else
  {
    // Some code for when we're travelling from left to right
  }
}

예, 장황하지만 게임 보드에서 무슨 일이 일어나고 있는지 정확히 알 수 있습니다.

이 게임을 휴대폰이나 태블릿에 표시하도록 개발하는 경우 상수 대신 ROWS 및 COLUMNS 변수를 만들어 화면 크기와 방향에 맞게 동적으로 (게임 시작시) 설정할 수 있습니다.

또한 게임 중반에 언제든지 화면 방향을 변경할 수 있습니다. ROWS와 COLUMNS의 값을 전환하고 나머지는 모두 남겨두기 만하면됩니다 (각 플레이어가 켜져있는 현재 제곱 숫자와 모든 뱀과 사다리의 시작 / 끝 사각형)은 변경되지 않습니다. 그런 다음 '그냥'보드를 멋지게 그리고 애니메이션에 대한 코드를 작성해야합니다 (나는 그것이 if진술 의 목적이라고 가정합니다 ) ...


또한 Floris의 답변에 찬성 투표했습니다. 비슷한 결과를 얻는 다른 스타일로, 제가 답변을 작성하기 전에는 보지 못했던 것입니다
Laurence Renshaw

2
대신 인라인 함수를 사용해야합니다.#define
Bryan Chen

함수와 같은 #define명령어 를 사용할 때 확장에서 나타나는 인수를 괄호로 묶는 것이 좋습니다. 따라서 대신 #define finished(num) (num == lastSquare)작성해야합니다 #define finished(num) ((num) == lastSquare). 그 이유는 우선 순위가 낮은 연산자가 포함 된 표현식에 이러한 명령어를 사용하면 예상 한 답을 얻지 못하기 때문입니다. 이 경우 추가 괄호를 사용하지 않으면 원하는대로 finished(a & b)확장 (a & b == lastSquare)되지 않습니다.
Dawood ibn Kareem 2014 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.