Skip to content

Instantly share code, notes, and snippets.

@zzzz465
Last active June 4, 2019 13:40
Show Gist options
  • Save zzzz465/78d4c0adedad7169a5e2584caf406d28 to your computer and use it in GitHub Desktop.
Save zzzz465/78d4c0adedad7169a5e2584caf406d28 to your computer and use it in GitHub Desktop.
조별과제2
#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