[18일차](홍정모의따배c)단어 세기 예제
강의 시작하자마자
- 문제
위와같이 텍스트입력을 받고
글자수와, 단어수, 그리고 라인을 출력하는 프로그램을 만들어라.
- 내코드
#include <stdio.h>
#define PERIOD '.'
int main()
{
char ch;
int lineCount, charCount, wordCount;
printf("Enter text :");
for (ch = getchar(), wordCount = 1, lineCount = 1, charCount = 0; ch != PERIOD; )// update칸은 비워놈
{
if (ch == ' ')
wordCount++;
if (ch == '\n')
lineCount++;
if (ch != ' ' && ch != '\n')
charCount++;
}
printf("Characters = %d, Words = %d, Lines = %d", charCount, wordCount, lineCount);
return 0;
}
for문의 업데이트칸은 비워놨다.
업데이트 할게 없다..! 그렇다면 for문을 쓰면 안되는건가 while
을 쓰고 초기값 설정을 반복문 전에다 해놔야 하는가?
결과는 먹통이었다.
while문을 써서 다시 코드를 짜보자.
#include <stdio.h>
#define PERIOD '.'
int main()
{
char ch;
int lineCount, charCount, wordCount;
wordCount = 1;
lineCount = 1;
charCount = 0;
printf("Enter text :");
while((ch = getchar()) != PERIOD)
{
if (ch == ' ')
wordCount++;
if (ch == '\n')
lineCount++;
if (ch != ' ' && ch != '\n')
charCount++;
}
printf("Characters = %i, Words = %i, Lines = %i", charCount, wordCount, lineCount);
return 0;
}
먹통이다 뭐가 문제일까?
while문 안으로 if를 많이 써서 그런가?
종속시키지 않아서 그런가?
ㄴㄴ
xcode의 불안정한 컴파일러 문제였다
내가 xcode를 잘못써서 그런가보다 싶다 그냥.
된다.
앵간하면 xcode보다
https://www.onlinegdb.com/online_c_compiler
를사용하자
응급조치로 세이브하고 껏다키면 되긴되는데
글자수를 잘못읽는다 짜증나는 xcode
진정하고 교수님코드를 보자
- 교수님코드
#include <stdio.h>
#include <stdbool.h>
#include <ctype.h>
#define STOP '.'
int main()
{
char c;
int n_chars = 0;
int n_lines = 0;
int n_words = 0;
bool word_flag = false;
bool line_flag = false;
printf("Enter text :\n");
while ((c = getchar()) != STOP)
{
if (!isspace(c))
n_char++; //아무 공백캐릭터가 없을시 카운트가 올라간다.
if (!isspace(c) && !line_flag)
{
n_lines++;
line_flag = true;
}
if (c == '\n')
line_flag = false;
if (!isspace(c) && !word_flag)
{
n_words++;
word_flag = true;
}
if (isspace(c)0
word_flag = false;
}
printf("Characters = %d, Words = %d, Lines = %d\n", n_charts, n_words, n_lines);)
return 0;
}
우선 flag개념이 잘 서지않아서
질문칸을 뒤져봤다
왜 flag라는 개념을 굳이 활용해서 복잡한 코드를 만들지? 이해가 안갔다.
이런 의문이 들고도 몇분동안은
우선 while문 안에서 글자를 입력하는동안 계속 반복되고 있다는 사실을 간과했다
if (!isspace(c))
n_char++; //아무 공백캐릭터가 없을시 카운트가 올라간다.
if (!isspace(c) && !line_flag)
{
n_lines++;
line_flag = true;
}
조건1. 위 주석처럼 아무 공백캐릭터가 없을시 n_char은 1증가한다.
조건2. 아무 공백캐릭터가 아니고 line_flag가 아니면
n_lines는 1증가하고 line_flag는 사실이된다. 즉 스위치가 line_flag라는
스위치가 켜진다.
if (c == '\n')
line_flag = false;
if (!isspace(c) && !word_flag)
{
n_words++;
word_flag = true;
}
조건3. 입력받은 문장중 라인을 바꾸면 line_flag스위치는 다시꺼진다.
조건4. 아무공백캐릭터를 안받았고 , word_flag가 꺼져있는상태라면,
n_words는 1증가하고 word_flag는 켜진다.
if (isspace(c))
word_flag = false;
조건5. 공백캐릭터를 받는다면 다시 word_flag가 꺼진다.
솔직히 감탄했다. 저런식으로 직관적이고 철저한 조건문을 만들수있는것이다.
내 짧은 생각으로 간과한것은
-반복문이지만 한번만 순회할것만 생각했다.
-철저한 조건문이 아니었다. 줄바꿈을했을때도 그 라인에 있던 단어도 카운트가
올라갔어야 했다