ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 3차원 배열의 활용 - 영한사전 만들기
    C/다차원 배열 2020. 10. 25. 20:58

    아래와 같이 입력에 대한 출력이 되도록 프로그램을 만들어보자.

    위의 입력과 출력결과를 먼저 분석해보면,

    각 영어 단어에 대한 한글 단어가 매치가 되고 있다. ( 단어는 문자열이다. )

    그리고 입력에서 공백문자를 포함해서 읽어들어야 하므로 scanf() 함수를 사용할 수 없다는 것을 알 수 있다.

    그리고 입력받은 데이터의 공백에 널문자 추가해야 한다.

    그 이유는 단어로 쪼개기 위해서. ( 널 문자 단위로 읽어 들인다. )

    즉, 영어 단어를 하나 찾고 그 영어 단어에 대응하는 한글 단어를 출력배열에 저장을 하면 될 것이다.

     

    먼저 필요한 자료구조에 대해서 이야기 해보자.

    한글과 영어라는 언어의 수는 2종류이다.

    그리고 한글과 영어단어는 모두 문자열이다.

    그리고 매치가 되는 한글 단어와 영어 단어의 묶음이 여러 개이다. 

    즉, { eat , 먹는다 }, { love, 사랑해 } , { you, 너를 }     <- 한글단어와 영어단어 세트가 여러 개이다.

    그래서 우리는 삼차원 배열이 하나 필요함을 알 수 있다.

    삼차원 배열의 요소는 어떻게 정의할지 살펴보자.

     

    char gDic[한글단어와 영어단어 세트의 수][한글과 영어라는 언어의 종류][단어들의 최대길이]

     

     

    위 3차원 배열의 맨마지막 요소가 20인 이유는 각 문자열의 길이가 20을 넘지 않도록하기 위해 쓴 것.

    위와 같이 3차원 배열을 정의를 한다.

     

    위의 문제를 조금 간단히 축소시켜보자.

    사용자로부터 영어단어 한개를 입력받아서 그 영어단어에 해당하는 한글단어를 출력하자.

    만약, 영어단어에 매치되는 한글단어가 없으면 영어단어로 출력되도록 만들자.

    먼저 아래의 예제를 보자.

    소스 코드

    더보기
    #define		_CRT_SECURE_NO_WARNINGS
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #define		MAX_WORD		5
    
    char gDic[MAX_WORD][2][20] =
    {
    	{	"i", "나"		},
    	{	"love","사랑해"	},
    	{	"you", "너"		},
    	{	"me", "나를"	},
    	{	"like","좋아해"	},
    };
    
    int main(void)
    {
    	char Input[128], Output[256] = { 0 };
    
    	int FindWord = -1;
    	int i = 0;
    
    	printf("영단어 입력 => ");
    	gets_s(Input, sizeof(Input) - 1);
    
    	//	입력 문자열을 소문자로 변경
    	_strlwr(Input);
    
    	for (i = 0; i < MAX_WORD; i++)
    	{
    		if (!strcmp(Input, gDic[i][0]))
    		{
    			FindWord = 1;
    			strcpy(Output, gDic[i][1]);
    		}
    	}
    
    	if (FindWord == -1)
    		strcpy(Output, Input);
    
    	printf("번역 => %s\n", Output);
    
    	return 0;
    }

     

    프로그램 실행결과

    위의 프로그램에서 사용자로부터 영어단어를 하나 입력 받고 나서

    첫 번째로 해야할 일은 3차원 배열에 사용자로부터 입력받은 영어단어가 존재하는지 찾아야 한다.

    즉, 총 5개의 단어세트 내에서 영어단어를 비교하면서 찾아내야 한다.

    영어단어는 초기화를 할 때, 0번째 요소에 저장하였으므로, Input과 gDic[i][0]와 비교를 해야한다.

    그리고 한글단어는 1번째 요소에 저장이되어있으며, 영어단어에 해당하는 한글은 gDic[i][1]에 있다.

     

    본격적인 문제 해결을 해보자.

    FindWord함수는 매개변수로 영어단어를 넘겨받아서, 그 영어단어에 대응하는 한글단어를 반환한다.

    영어단어 대응하는 한글단어가 없으면 NULL을 반환하는 함수이다.

    위 함수의 내용은 간략화한 문제의 코드와 유사함을 알 수 있다.

    위의 FindWord함수를 분석해보면,

    for문을 벗어 나왔다는 의미는 같은 문자열이 없었다는 의미 이다.
    입력받은 영문과 해당배열에 있는 영문이 같아야 영문에 대응 하는 한글을 가져올 수 있다.
    같은 문자열이 없다는 의미로, NULL을 반환한다.
    입력한 영문이 이차원 배열에 없으므로, 
    이 함수에서는 리턴형이 주소이므로 NULL을 반환.
    2차원 배열에서 gDic[i][1]은 주소를 의미.

     

     

    Translate함수가 하는 일은 입력받은 영어 단어 배열을 스캔하면서

    공백문자를 NULL문자로 바꾸면서 영어 단어에 대응하는 한글 단어를 찾아서 출력배열에 계속 저장하면 된다.

    함수에서 하는 일은 아래에서 분석한다.

    함수를 분석해보자.

    먼저 변수 선언부를 보도록 하자.

    변수 pEng는 입력받은 영어문자배열에서 영어단어의 위치를 옮겨주기위해 필요.

    pSour를 이용해서 pEng를 옮겨주면서, 문자열( 널문자까지 )을 읽는다.
    strcmp함수는 문자열이 같은지 다른지를 판단. 문자열은 맨 뒤에 NULL이 있는 것이라고 하였다.
    공백문자를 NULL로 두어서 문자열을 단어로 인식해서 하나 하나 쪼개줄려고 NULL을 쓴 것.

     

    아래의 변수선언부를 보도록 하자.

    변수 pKor은 gDic 3차원배열에 우리가 입력한 문자열에 매칭할 한글단어 받아주기 위해서 쓴 것.

     

    아래의 for루프를 보자.

    일반적으로 배열을 순회할 때 루프의 조건식은 보통 i < Len 인데,

    여기서는 Len + 1 이다. 그 이유를 알아보자.

    입력 배열 pSour에는 맨 마지막 요소에 NULL 문자가 있다. ( 문자열의 개념 ) 
    pSour를 맨 마지막(NULL)에 위치 시켜야 마지막 영어 단어를 읽어들일수 있으므로.
    그래서 for문의 조건이 i < Len이 아닌, Len+1이 되어야 한다. 

     

    아래의 if 조건을 분석해보자.

    위에서 pKor이 NULL이 아니면, 영어 단어 대응하는 한글 단어가 있다는 뜻이 되므로,

    한글 단어를 출력 배열에 strcat() 함수를 이용해서 덧붙여 쓰면 된다.

     

    아래의 else문은 위의 if문과 쌍을 이루는 else문이다. 분석해보자.

    이 경우는 pKor이 NULL값이므로, 주어진 문자열에서 일치하는 한글이 없다는 의미이므로.

    이 경우는 그냥 영어로 표기. ( 출력배열에 그냥 pEng을 덧붙여 쓰면 된다. )

     

    나머지 부분은 아래와 같다.

    프로그램 실행결과

     

    전체 프로그램 소스

    main.c
    0.00MB

     

     

     

    'C > 다차원 배열' 카테고리의 다른 글

    3차원 배열의 활용 - 테트리스 블록  (0) 2020.10.25
    3차원 배열의 개념  (0) 2020.10.25

    댓글

Designed by Tistory.