[if-statement] 조건 A가 일치하면 조치 C를 수행하기 위해 조건 B를 일치시켜야합니다.

내 질문은 :

if (/* condition A */)
{
    if(/* condition B */)
      {
         /* do action C */
      }
    else
      /* ... */
}
else
{
   /* do action C */
}

행동 코드 C를 두 번이 아니라 한 번만 쓰는 것이 가능합니까?

그것을 단순화하는 방법?



답변

이러한 종류의 문제에서 첫 번째 단계는 항상 논리 테이블을 만드는 것입니다.

A | B | Result
-------------------
T | T | do action C
T | F | ...
F | T | do action C
F | F | do action C

일단 테이블을 만들면 해결책이 분명합니다.

if (A && !B) {
  ...
}
else {
  do action C
}

이 논리는 더 짧지 만 미래 프로그래머가 유지하기 어려울 수 있습니다.


답변

두 가지 옵션이 있습니다.

  1. “액션 C”를 수행하는 함수를 작성하십시오.

  2. 중첩 된 if 문이 너무 많지 않도록 논리를 다시 정렬하십시오. “액션 C”가 발생하는 조건을 스스로에게 물어보십시오. “조건 B”가 참이거나 “조건 A”가 거짓 일 때 발생하는 것처럼 보입니다. 이것을 “NOT A OR B”로 쓸 수 있습니다. 이것을 C 코드로 변환하면

    if (!A || B) {
        action C
    } else {
        ...
    }
    

이러한 종류의 표현에 대해 자세히 알아 보려면 인터넷 검색 “부울 대수”, “조건 자 논리”및 “조건 자 미적분학”을 제안합니다. 이것들은 깊은 수학적 주제입니다. 모든 것을 배울 필요는 없으며 기본 사항 만 있습니다.

“단락 평가”에 대해서도 배워야합니다. 이 때문에 표현식의 순서는 원래 논리를 정확하게 복제하는 데 중요합니다. B || !A논리적으로 동일 하지만 이 값을 조건으로 사용 B하면 값에 관계없이 true 일 때 “action C”가 실행됩니다 A.


답변

다음과 같이 설명을 단순화 할 수 있습니다.

if ((A && B) || (!A)) // or simplified to (!A || B) as suggested in comments
{
    do C
}

그렇지 않으면 ‘C’에 대한 코드를 별도의 함수에 넣고 호출하십시오.

DoActionC()
{
    ....
    // code for Action C
}
if (condition A)
{
    if(condition B)
      {
         DoActionC(); // call the function
      }
    else
      ...
}
else
{
   DoActionC(); // call the function
}


답변

패턴 일치가있는 언어에서는 QuestionC의 답변에 진리표를 더 직접 반영하는 방식으로 솔루션을 표현할 수 있습니다.

match (a,b) with
| (true,false) -> ...
| _ -> action c

구문에 익숙하지 않은 경우 각 패턴은 | 뒤에 (a, b)와 일치하는 값이 오며 밑줄은 “다른 값”을 의미하는 와일드 카드로 사용됩니다. 액션 c 이외의 다른 작업을 수행하려는 유일한 경우는 a가 true이고 b가 false 인 경우에만 해당 값을 첫 번째 패턴 (true, false)으로 명시한 다음이 경우 수행해야 할 모든 작업을 수행합니다. 다른 모든 경우에는 “와일드 카드”패턴으로 넘어 가서 조치 c를 수행합니다.


답변

문제 진술 :

조건 A가 일치하면 조치 C를 수행하기 위해 조건 B를 일치시켜야합니다.

시사점 설명 : A 는 (다른 답변에서 언급했듯이) 논리적 제안 인 B를 의미합니다 !A || B.

bool implies(bool p, bool q) { return !p || q; }

if (implies(/* condition A */,
            /* condition B */))
{
    /* do action C */
}


답변

Ugh, 이것도 저를 트립 시켰지만 Code-Apprentice지적한 것처럼do action C 중첩 else블록 이 필요 하거나 실행 해야 하므로 코드를 다음과 같이 단순화 할 수 있습니다.

if (not condition A or condition B) {
    do action C
} else {
    ...
}

이것이 우리가 세 가지 경우를 타격하는 방법입니다.

  1. 중첩 된 do action C질문의 논리가 필요 condition A하고 condition Btrue-이 논리에서, 우리는이 도달 할 경우 에서 용어를 if-statement 우리가 아는 condition A것입니다 true우리가 즉 평가하기 위해 필요한 모든 따라서 condition B이다true
  2. 중첩 된 else질문의 논리 – 블록이 필요 condition Atrue하고 condition Bfalse– 우리가 도달 할 수있는 유일한 방법 else경우 것이이 논리 – 블록을 condition A했다 true하고 condition B있었다false
  3. 외부 else질문의 논리 – 블록이 필요 condition Afalse하는 경우이 논리에 – condition A우리는 또한 거짓do action C

나를 바로 잡기위한 코드 견습생을위한 제안. 그가 편집하지 않고 올바르게 제시했기 때문에 그의 대답을 수락하는 것이 좋습니다 .


답변

논리 개념에서이 문제를 다음과 같이 해결할 수 있습니다.

f = ab +! a

f =?

입증 된 문제로 결과는 다음과 같습니다 f = !a + b. 진리표, Karnaugh지도 와 같은 문제를 증명하는 몇 가지 방법이 있습니다. .

따라서 C 기반 언어에서는 다음과 같이 사용할 수 있습니다.

if(!a || b)
{
   // Do action C
}

PS : Karnaugh Map 은보다 복잡한 일련의 조건에도 사용됩니다. 부울 대수 표현을 단순화하는 방법입니다.