Last active
June 4, 2019 13:40
-
-
Save zzzz465/78d4c0adedad7169a5e2584caf406d28 to your computer and use it in GitHub Desktop.
조별과제2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <string.h> | |
int mainLoop(); | |
int AddWord(); | |
int ShowAllDict(); | |
int Search(); | |
int ShowEnWords(int); | |
int isNullValue(char*); | |
int _AddNewWord(char*); | |
int _AddWord(char*, int); | |
int getIndex(char*); | |
typedef struct _WordData | |
{ | |
char KorWord[30]; | |
char EnWord[30][30]; | |
} WordData; | |
WordData Dictionary[1000]; | |
//0번째 배열 -> 1000개의 단어를 저장 | |
//1번째 배열 -> 0번은 한국어, 1~29번은 영어가 들어갈 공간 | |
int dictLength = 0; char input[50], buffer[50]; | |
// 0번째 배열중에서 몇번째까지 단어가 들어가있는지 알려주는 dictLength | |
// 입력을 받는 input[50], 버퍼 공간인 [50]; | |
int main() | |
{ | |
mainLoop(); | |
return 0; | |
} | |
int mainLoop() | |
{ | |
int menu; | |
while (1) | |
{ | |
printf("0번 -> 종료\n"); | |
printf("1번 -> 사전에 단어쌍 추가\n"); | |
printf("2번 -> 한국어 사전에 대한 영단어 검색\n"); | |
printf("3번 -> 사전의 모든 단어쌍 출력\n"); | |
printf("메뉴를 선택해주세요 : "); | |
scanf(" %d", &menu); | |
getchar(); // 엔터키 입력이 버퍼에 들어가서 에러나는걸 방지 | |
printf("\n"); | |
switch (menu) | |
{ | |
case 0: | |
return 0; | |
case 1: | |
AddWord(); | |
break; | |
case 2: | |
Search(); | |
break; | |
case 3: | |
ShowAllDict(); | |
break; | |
default: | |
break; | |
} | |
} | |
} | |
int ShowAllDict() // null문자를 만날때까지, 0부터 999번까지 한국어와 그에 해당하는 영단어를 전부 말해줌 | |
{ | |
for (int count = 0; count < 1000; count++) //0번째부터 999번째까지 반복 | |
{ | |
if (strcmp(Dictionary[count].KorWord, "\0") == 0) // 만약 dict[count][0]이 null이라면, 더이상 단어가 없는것이므로 함수 종료 | |
break; | |
printf("한국어 단어 : "); // 현재 한국어 단어가 무엇인지 알려줌 | |
fputs(Dictionary[count].KorWord, stdout); | |
printf("\n"); | |
for (int in_count = 1; in_count < 30; in_count++) // 영어 단어를 출력하는 공간 | |
{ | |
if (strcmp(Dictionary[count].EnWord[in_count], "\0") == 0) // 만약 영어 단어가 NULL일경우, 더이상 출력할 영어 단어가 없다는 것, 따라서 함수 종료 | |
break; | |
fputs(Dictionary[count].EnWord[in_count], stdout); // 출력 | |
} | |
printf("\n"); | |
} | |
return 0; | |
} | |
int Search() // 한국어 단어를 입력받아 검색을 수행 | |
{ | |
printf("검색하고싶은 한국어 단어를 입력하세요 (Case sensitive) : "); | |
fgets(input, 50, stdin); // 공백포함 입력을 받음 | |
int index = getIndex(input); // 한국어가 배열의 몇번째에 들어가있는지 알려줌. 배열에 한국어가 없을경우 -1를 반환 | |
if (index == -1) // 만약 한국어가 배열에 없을경우 | |
{ | |
printf("해당하는 한국어가 사전에 없습니다\n"); | |
return 0; | |
} | |
ShowEnWords(index); // index 번째에 있는 한국어를 출력해주는 함수 | |
return 0; | |
} | |
//해당하는 한국어에 대한 모든 영단어를 보여줌 | |
int ShowEnWords(int index) // 한국어에 대한 영어를 말해줌 | |
{ | |
for (int count = 1; count < 30; count++) // 3차원 배열의 1번째(0, 1, 2번째 중) 배열을 살펴보면, 0번 자리에는 한국어, 나머지 1~29 공간에는 영어가 들어가있다. | |
{ | |
if (strcmp(Dictionary[index].EnWord[count], "\0") == 0) // 만약 문자열이 NULL일경우 더이상 출력할 문자열이 없는 것이므로 함수를 반환 | |
return 0; | |
fputs(Dictionary[index].EnWord[count], stdout); | |
} | |
printf("\n"); | |
return 0; | |
} | |
int AddWord() | |
{ | |
printf("영단어를 추가하고싶은 한국어 단어를 입력하세요 : "); | |
fgets(input, 50, stdin); | |
int index = getIndex(input); // 한국어 단어의 위치를 가져옴. 없으면 -1 | |
if (index == -1) // 딕셔너리에 해당하는 한국어 단어가 없을경우 | |
_AddNewWord(input); // 한국어가 배열에 없을 때, 한국어를 배열에 추가해줌 | |
_AddWord(input, index); // 한국어에 영어를 추가해줌 | |
} | |
// 영단어 배열에서, 빈 자리를 찾아주는 함수(3차원 배열중, 2번째에서 (0번째는 한국어이므로), 1번부터 999번까지 검색해서 아무것도 없는 null 위치를 찾아서 Index를 반환) | |
int getNewPosArr2(int index, char input[]) // *p = 영단어 | |
{ | |
for (int count = 1; count < 30; count++) | |
{ | |
if (strcmp(input, Dictionary[index].EnWord[count]) == 0) | |
{ | |
printf("이미 동일한 영단어가 추가되어 있습니다!\n"); | |
return -2; | |
} | |
if (isNullValue(Dictionary[index].EnWord[count])) // 만약 3차원 배열중 2번째(0,1,2 중)가 Null 값을 가지고있으면, 비어있다는 뜻이므로 count를 반환해줌 | |
return count; | |
} | |
return -1; // 만약 빈 자리가 없을경우 -1를 리턴 | |
} | |
int isNullValue(char* p) // 문자열이 null인지 아닌지 확인 | |
{ | |
if (*p == '\0') | |
return 1; | |
else | |
return 0; | |
} | |
int _AddNewWord(char* p) // 구조-> 단어를 받아서 배열에 한국어 단어를 추가해줌 | |
{ | |
printf("사전에 해당하는 한국어가 없습니다. 한국어를 추가합니다...\n"); | |
if (dictLength >= 1000) | |
{ | |
printf("더이상 사전에 새로운 한국어 단어를 추가할 수 없습니다!\n"); | |
return 0; | |
} | |
strcpy(Dictionary[dictLength].KorWord, p); | |
dictLength++; | |
return 0; | |
} | |
//한국어 단어를 받고, 영단어를 추가함. p = 한국어 단어, index -> _AddNewWord에서 불러올 경우 사용하기위해 | |
int _AddWord(char* p, int index) // index는 추가할 공간을 말하는거임. 없을경우 -1를 넣어줘야함 | |
{ | |
if (index == -1) // index가 -1일경우 한국어 배열의 위치를 받아옴 | |
index = getIndex(p); | |
printf("변환할 영단어를 추가하세요. %s => ", Dictionary[index].KorWord); | |
fgets(input, 50, stdin); // 문자열읽어옴(공백포함) | |
int index2 = getNewPosArr2(index, input); // 영단어 위치를 알려줌 | |
if (index2 == -1) // 만약 영단어를 저장할 공간이 없을경우 | |
{ | |
printf("해당하는 한국어에 더이상 영어를 저장할 공간이 없습니다!\n"); | |
return -1; | |
} | |
else if (index2 == -2) | |
return 0; | |
strcpy(Dictionary[index].EnWord[index2], input); | |
printf("추가 완료!\n"); | |
return 0; | |
} | |
int getIndex(char* p) // 문자열 포인터를 받아옴, *p (한국어 문자)를 받아와, 3차원 배열에서 해당하는 한국어가 있는지 체크 있으면 Index 반환, 없으면 -1 반환 | |
{ | |
for (int count = 0; count < 1000; count++) | |
{ | |
if (strcmp(Dictionary[count].KorWord, "\0") == 0) | |
{ | |
return -1; | |
} | |
if ((strcmp(Dictionary[count].KorWord, p) == 0)) | |
{ | |
return count; | |
} | |
} | |
return -1; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment