컴퓨터를 공부하고자 마음먹은지 N일차

[18일차](홍정모의따배c)단어 세기 예제 본문

🖥C

[18일차](홍정모의따배c)단어 세기 예제

졸린새 2020. 9. 26. 01:17
728x90

[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가 꺼진다.

솔직히 감탄했다. 저런식으로 직관적이고 철저한 조건문을 만들수있는것이다.

내 짧은 생각으로 간과한것은

-반복문이지만 한번만 순회할것만 생각했다.

-철저한 조건문이 아니었다. 줄바꿈을했을때도 그 라인에 있던 단어도 카운트가

올라갔어야 했다

Comments