작성
·
458
0
if (!isspace(c))
n_chars++;
if (c == '\n') {line_flag = false;}
if (!isspace(c) && !line_flag) {
n_lines++;
line_flag = true; }
예문대로 하는 거랑 조건문 순서를 바꾸는 것에 큰 차이가 있을까요?
flag를 사용하는 방법을 이해하려해도 잘 되지 않습니다.
그래서 조건문 순서를 바꾸고 생각 해봤는데 이해하기 훨신 수월했습니다.
제가 예문 코드를 이해하기로는 한 사이클을 돌고 '\n'이 있으면 다음 사이클에서 n_lines++을 하게 되는건데 이것보단 저렇게 조건문 순서를 바꾸는게 더 정확하지 않나요..? 계속 의문이 들어 질문 올립니다.
답변 1
2
- flag는 상태를 나타내기 위해 사용하는 변수라고 생각하시면 됩니다. 하나의 단어가 끝나는 것은 공백 문자가 나타났을 때이고(단어는 공백으로 구분하니까요), 하나의 단어가 시작되는 것은 공백이 아닌 문자인 동시에 여태 공백 상태였는데 처음으로 공백이 아닐때로 구분할 수 있겠네요. 그리고 또한 띄어쓰기공백 문자가 나오기 전까진 단어가 아직 안끝난것으로 간주하고 단어수를 증가하지 말아야합니다. 이때 도움이 될 수 있는게 flag 변수를 사용하는 것입니다. 하나의 단어가 시작되어 끝나지 않은 동안에는 word_flag 값을 true로 두기로 하고 하나의 단어가 끝났다면 word_flag 값을 false로 하겠다고 가정해보면 word_flag 값이 true인 동안에는 단어 수를 세지 않으면 되겠죠! 예를 들어 ABCD 라는 한 단어에서 현재 getchar로 'C' 문자를 검사중이라면, 오직 C 문자 하나만 봐서는 이게 새로운 단어에 포함되는 것인지 기존 단어에 포함되는 것인지 알 수가 없겠죠. 근데 단어의 첫문자인 'A'를 검사할때 word_flag 를 true로 바꿔두었으니, C를 검사할땐 아직 word_flag가 true일겁니다. 공백이 아직 안나왔으니까요! 그래서 word_flag가 아직 true인 것을 보고 아직 단어가 안끝났구나~단어수는 아직 증가시키면 안되겠다~라고 알 수 있게 되겠죠! 이러다가 공백이 등장하면 이제 기존 단어가 끝났구나 새로운 단어가 나오겠구나 하고 word_flag를 다시 false로 바꿔주는 것이구요. 그럼 이제 공백이 아닌 다음 문자는 새로운 단어의 문자구나 하고 간주되어 단어 수를 증가할 수 있겠죠! 줄바꿈에 사용된 flag의 사용법 또한 마찬가집니다.
- 강의에서 사용된 예제 코드와 질문자님께서 적어주신 순서가 조금 바뀐 코드와 결과에 차이는 없습니다. 질문자님 코드대로 하셔도 괜찮습니다. 둘 다 결과가 동일합니다. c에 '\n' 개행 문자가 들어올 때, 강의 코드대로라면 다음 반복 사이클 때 라인수가 증가될테고, 질무자님 코드대로라면 바로 다음 if에 걸려서 같은 사이클 내에서 라인수가 증가 되겠네요. 강의 코드는 새로운 줄이 되자마자 첫 문자에서 라인 수를 증가시키는 것이고 질문자님은 '\n'를 만났을 때 바로 라인 수를 증가시키는 그 차이일 뿐입니다. 질문자님의 코드는 line_flag 은 초기값이 false이기 때문에 첫 줄의 첫문자에서 라인수를 증가시킬 테고 그 이후부턴 '\n'를 검사하는 사이클에서 바로바로 다음줄을 미리 라인 수 증가시키는게 될 것입니다. 최종 결과는 차이가 없습니다.
- 예를 들어 "A 한줄 띄우고 B ." 라고 입력을 했다면 최종 라인수는 2가 되겠지요. 강의 코드대로라면 c에 첫문자인 'A'문자가 들어올 때 라인수가 증가되고, 질문자님의 코드도 마찬가지로 line_flag 값이 초기값은 false이기 때문에 'A' 문자에서 라인수가 증가될 것입니다. 그 다음 '\n' 문자가 c에 들어올 때 강의 코드대로라면 이 반복 사이클 내에서는 라인수를 증가시키지않고 질문자님 코드대로라면 \n을 만났으니 미리 다음줄을 증가시키게 될 것입니다.