내 질문은 :
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
}
이 논리는 더 짧지 만 미래 프로그래머가 유지하기 어려울 수 있습니다.
답변
두 가지 옵션이 있습니다.
-
“액션 C”를 수행하는 함수를 작성하십시오.
-
중첩 된 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 {
...
}
이것이 우리가 세 가지 경우를 타격하는 방법입니다.
- 중첩 된
do action C
질문의 논리가 필요condition A
하고condition B
로true
-이 논리에서, 우리는이 도달 할 경우 차 에서 용어를if
-statement 우리가 아는condition A
것입니다true
우리가 즉 평가하기 위해 필요한 모든 따라서condition B
이다true
- 중첩 된
else
질문의 논리 – 블록이 필요condition A
로true
하고condition B
할false
– 우리가 도달 할 수있는 유일한 방법else
경우 것이이 논리 – 블록을condition A
했다true
하고condition B
있었다false
- 외부
else
질문의 논리 – 블록이 필요condition A
로false
하는 경우이 논리에 –condition A
우리는 또한 거짓do action C
나를 바로 잡기위한 코드 견습생을위한 제안. 그가 편집하지 않고 올바르게 제시했기 때문에 그의 대답을 수락하는 것이 좋습니다 .
답변
논리 개념에서이 문제를 다음과 같이 해결할 수 있습니다.
f = ab +! a
f =?
입증 된 문제로 결과는 다음과 같습니다 f = !a + b
. 진리표, Karnaugh지도 와 같은 문제를 증명하는 몇 가지 방법이 있습니다. .
따라서 C 기반 언어에서는 다음과 같이 사용할 수 있습니다.
if(!a || b)
{
// Do action C
}
PS : Karnaugh Map 은보다 복잡한 일련의 조건에도 사용됩니다. 부울 대수 표현을 단순화하는 방법입니다.
