기타

[토익 Voca Test 프로그램] 모르는 단어만 랜덤 반복 초간편 암기 프로그램 (TOEIC 필수 단어 2000개 포함)

restudy 2021. 10. 25. 10:25
반응형

안녕하세요.

 

오늘은 제가 토익 공부를 하며 단어를 편하게 암기하기 위해 몇 시간정도 들여서 직접 제작한 초간편 토익 단어 암기 프로그램을 공유하려고 합니다.

프로그램은 C언어로 작성되었으며, 기본 터미널 하에서 돌아가기 때문에 별도의 다른 프로그램의 설치가 필요하지 않습니다.

토익 필수 영단어 리스트들이 기본으로 포함되어 있으며, 원하는 단어만 직접 정리하여 반복 암기가 가능합니다.

 

 

 

** 단어의 저작권과 관련하여 추후 문제 발생시 즉시 게시물을 삭제 조치하도록 하겠습니다.

** 다만 저작권 관련 이슈 발생 우려에도 이 글을 게시하는 이유는, 영단어 자체에 별도의 저작권이 있을 거라고 생각하지 않기 때문입니다. (문제가 없어 보이긴 하나 혹시라도 문제가 발생 시 게시글을 삭제하도록 하겠습니다.)

 

 

Restudy TOEIC Voca 프로그램만의 차별적 장점

제가 알기로 많은 토익 Voca 암기 어플리케이션이나 프로그램들이 있는 것으로 알지만, 그러한 어플리케이션이나 프로그램들이 가지고 있는 단점을 모두 보완하였습니다.

이 프로그램만이 가지고 있는 차별적 장점들은 다음과 같습니다.

 

 

- Voca Test 상태에서는 키 2개만 가지고도 모든 조작이 가능하여 손가락 1개만 가지고도 암기를 계속 돌릴 수 있습니다.

  즉, 노트북만 가지고 있다면 누워서도 손가락 한 개만으로도 편하게 암기할 수 있습니다.

- 이 때 조작 키를 직접 설정하여 편한 키로 바꾸어 조작이 가능합니다.

- 토익 800점, 900점 필수 단어들을 이미 포함하고 있으며, 토익에서 나오는 idiom들도 별도로 수록되어 있습니다.

- 단어들은 매번 랜덤으로 1개씩 나오며, 안다 모른다를 체크하여 모르는 단어만 계속해서 나오도록 하여 최소 시간 안에 모든 단어들을 최소한 1번씩은 외울 수 있습니다.

- 한 사이클을 돌릴 때까지는 같은 단어가 중복으로 나오지 않아 모르는 단어들 내에서는 최대한 고르게 단어들을 암기할 수 있습니다.

- 모든 pc 사양에 있는 메모장을 기반으로 단어를 저장 및 관리할 수 있기 때문에, 언제든 원하는 단어들을 추가 및 제거할 수 있고, 원하는 Test List를 편하게 생성 또는 삭제할 수 있습니다.

- all mode : all을 입력하면 모든 txt파일에 있는 모든 단어들을 취합하여 하나의 test로써 진행할 수 있습니다.

 

 

토익 Voca 초간편 암기 프로그램 설치

프로그램이 괜찮은 것 같으시다면 아래의 프로그램을 다운로드 해주시면 됩니다.

 

TOEIC Voca Test (Restudy).zip
0.08MB

 

위의 파일을 다운로드 받아 사용하시면 됩니다.

용량은 약 0.08MB로 소스 코드 200줄 미만의 간단한 프로그램입니다.

필수 Voca List 메모장 여러 개와 간단한 터미널 프로그램 하나로 구성되어 있습니다.

 

 

프로그램 사용 방법

1. 기본적인 프로그램 실행 방법

먼저 프로그램은 파일 내에 있는 TOEIC_word_test.exe를 실행해주시면 됩니다.

 

 

프로그램에 기본으로 위와 같이 토익 필수 800, 900점 단어와 idiom을 포함하고 있기 때문에 위의 단어 중에서 하나를 골라서 사용하셔도 됩니다.

일단은 day25 800을 실행해 보겠습니다. (이 때 txt는 제외하고 파일 이름만 입력해야 합니다.)

** Test 파일이 없는 경우 Test 파일이 없다는 오류 메시지가 출력되도록 프로그래밍 되어있습니다.

 

 

그러면 위와 같이 Test가 실행됩니다.

위의 상황의 경우에서는 expense가 어떤 단어인지를 예상하며 공부를 할 수 있으며, 다음 단어로 넘기면 expense의 뜻이 나오며 이런 뜻의 단어였구나 하는 것을 빠르게 익힐 수 있습니다.

인터페이스에 대해서 설명드리겠습니다.

 

day25 800.txt : 현재 진행중인 Test의 원본 파일 이름입니다. 예를 들어 test05.txt라는 파일에 있는 단어를 불러와 테스트를 진행 중일 때는 "test05.txt"로 표기됩니다.

processivity : 진행도를 나타냅니다. 해당 테스트의 전체 단어 중에서 몇 개를 암기했는지 표기되며, 모든 단어를 암기할 경우 테스트는 종료됩니다. 위에서는 progressivity가 0/48이므로, 이 테스트의 단어는 48개이며 아직 1개도 외웠다고 체크하지 않은 경우임을 알 수 있습니다.

Rotation Count : 현재 단어를 몇 바퀴 돌렸는지를 나타내어 줍니다. 48개의 단어를 모두 한 번씩 보면 위의 Count가 0에서 1로 변경됩니다.

Next Word : 해당하는 키(위의 사진에서는 숫자 1 키에 해당)를 입력했을 때 다음 단어가 나타납니다. 다음 단어로 넘기면 processivity는 증가하지 않으며 Rotation Count에는 영향을 줍니다.

Remove Word : 해당 테스트에서 해당 단어는 더 이상 나타나지 않습니다. 외웠다고 체크를 하는 것이기 때문에, Remove Word를 하면 앞으로 나오지 않으므로 모르는 단어만 볼 수 있는 것입니다.

Back to Menu : esc키를 누르면 메인 메뉴로 되돌아가게 됩니다.

 

2. All Mode

 

 

초기 화면에서 Test 파일명 대신 "all"을 입력하면 모든 Test 파일을 찾아 단어들을 취합하여 하나의 Test로 정리해줍니다.

저의 경우에는 정리한 모든 단어의 수가 2596개여서 위와 같이 2596개의 단어가 랜덤으로 출력됨을 확인할 수 있습니다.

 

 

3. Test 단어 (메모장) 설정 방법

 

 

txt 폴더를 생성하여 위와 같이 영어 단어를 먼저 쓰고 그 다음줄에 그 단어의 뜻을 적으면 됩니다.

만약 영단어를 먼저 보고 그 뜻을 한글로 외워보고 싶다면 영어를 먼저 쓰고, 아랫줄에 한글 뜻을 적으면 됩니다.

** 이 때 메모장의 마지막 줄에 띄어쓰기 한 칸을 넣어주세요. (사용에 지장이 없기는 하지만 해당 단어의 마지막 글자가 깨지는 경우가 있습니다.)

 

 

그리고 반드시 인코딩 형식을 ANSI로 저장해주셔야 합니다.

UTF-8 형식으로 저장할 경우 한글이 깨지는 경우가 있습니다.

 

4. 단축키 설정 방법

 

 

Settings 폴더에 들어가 Settings.txt를 열고, 안에 해당하는 키를 바꾸어주시면 프로그램이 알아서 메모장에 입력되어있는 키를 읽어 반영합니다.

저의 경우 왼손이 아플 때는 오른손으로 편하게 조작하기 위해 / 하고 . 키로도 자주 바꿉니다.

 

 

프로그램 시연 영상

 

 

메모장 구성 형식과 프로그램 시연 영상입니다.

중간에 있는 Test 한 개하고 "all mode"로 한 개 시연해보았습니다.

 

 

프로그램 원본 소스코드

프로그램 원본 소스 코드를 오픈 소스로 무료 공개하도록 하겠습니다.

프로그램을 편한대로 수정해서 사용하고 싶으신 분이나 코드 구성을 참고하실 분들은 그대로 퍼가서 사용하셔도 좋습니다.

 

소스 코드를 보시려면 아래의 접은 글을 펴주세요.

더보기
// TOEIC word test program Ver. 1.5.
// Made by Restudy

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<conio.h>
#include<io.h>
#define LINE 50
#define MAX 5000
#define SCREENLINE 13

int word_count, check_count, removed_count, rotation_count;
char file_name[50], temp_line[100], print_line[30][100], rotation_count_string[10], next_key = '/', remove_key = '.';

void initailize_screen() {
    for(int i=0; i<=SCREENLINE; i++) print_line[i][0] = '\0';
}

void build_screen() {
    for(int i=0; i<SCREENLINE; i++) strcpy(print_line[i], print_line[i+1]);
    strcpy(print_line[SCREENLINE], temp_line);
    temp_line[0] = '\0';
}

void print_screen() {
    system("cls");
    printf("\n   %s ", file_name);
    // for(int i=0; i<13-strlen(file_name); i++) printf(" ");
    printf("| processivity : %2d/%2d | Rotation Count : %2d\n\n", removed_count, word_count, rotation_count);
    printf("   %c : Next word | %c : Remove word  | esc : Back to main menu\n\n", next_key, remove_key);
    for(int i=0; i<=SCREENLINE; i++) printf("%s\n", print_line[i]);
    printf("\n     ");
    for(int i=0; i<55; i++) printf("-");
    printf("\n");
}

int main() {
    int random, input, check[MAX], removed[MAX], esc, all_mode;
    char word_eng[MAX][LINE], word_kor[MAX][LINE];
    struct _finddata_t file_data; long handle; int result;
    srand(time(NULL));
    FILE *fp, *settings;

    while(1) { // program

        word_count = 0, random = 0, input = 0, check_count = 0, removed_count = 0, rotation_count = 0, esc = 0, all_mode = 0;
        temp_line[0] = '\0', initailize_screen();

        for(int i=0; i<MAX; i++) {
            check[i] = 0;
            removed[i] = 0;
            word_eng[i][0] = '\0';
            word_kor[i][0] = '\0';
        }

        settings = fopen("./Settings/Settings.txt", "r"); // key settings
        if(settings != NULL) {
            fscanf(settings, "Next Key : %c\n", &next_key);
            fscanf(settings, "Remove Key : %c", &remove_key);
            fclose(settings);
        }

        do { // load file
            system("cls");

            result = 1; // find txt files
            handle = _findfirst(".\\*.txt",&file_data);
            if (handle == -1) {
                printf("\n   There are no test(.txt) files!!\n\n");
                return 0;
            }
            printf("\n   [Test File Lists]\n\n");
            for(int i=0; result!=-1; i++) {
                strcpy(temp_line, file_data.name);
                temp_line[strlen(temp_line)-4] = '\0';
                printf("   - %s ", file_data.name);
                if(!file_data.size) printf("(Empty)");
                else {
                    int j;
                    fp = fopen(file_data.name, "r");
                    for(j=0; !feof(fp); j++) fgets(temp_line, LINE, fp);
                    printf("(%d words)", j/2);
                    fclose(fp);
                }
                temp_line[0] = '\0';
                if(i%2) printf("\n");
                else for(int j=0; j<20-strlen(file_data.name); j++) printf(" ");
                result = _findnext(handle, &file_data);
            }
            _findclose(handle);

            printf("\n\n   If you input \"all\", You can take all the words in one test.\n");
            printf("\n   Which file do you want to test? (without .txt) : ");
            gets(file_name);
            if(!strcmp(file_name, "all")) {
                all_mode = 1;
                break;
            }
            strcat(file_name, ".txt");
            fp = fopen(file_name, "r");
        } while(fp == NULL);

        if(all_mode) { // for "all mode"
            result = 1; // find txt files
            handle = _findfirst(".\\*.txt",&file_data);
            for(int i=0; result!=-1; i++) {
                fp = fopen(file_data.name, "r");
                while(!feof(fp)) { // arrange words
                    fgets(word_eng[word_count], LINE, fp);
                    fgets(word_kor[word_count], LINE, fp);
                    word_eng[word_count][strlen(word_eng[word_count])-1] = '\0';
                    word_kor[word_count][strlen(word_kor[word_count])-1] = '\0';
                    word_count++;
                }
                fclose(fp);
                result = _findnext(handle, &file_data);
            }
        }
        else { // for normal input (file name)
            while(!feof(fp)) { // arrange words
                fgets(word_eng[word_count], LINE, fp);
                fgets(word_kor[word_count], LINE, fp);
                word_eng[word_count][strlen(word_eng[word_count])-1] = '\0';
                word_kor[word_count][strlen(word_kor[word_count])-1] = '\0';
                word_count++;
            }
        }

        print_screen();
        while(1) { // each test (each word)

            if(removed_count >= word_count) {
                printf("\n%42s", "TEST OVER!!");
                Sleep(3000);
                break;
            }

            do { // check duplication or removal
                random = rand()%word_count;
            } while(check[random] || removed[random]);
            build_screen(); build_screen();
            for(int i=0; i<30-strlen(word_eng[random]); i++) strcat(temp_line, " ");
            strcat(temp_line, word_eng[random]);
            printf("\n%30s  ", word_eng[random]);

            while(1) { // get input
                input = getch();
                if(input == next_key) break;
                else if(input == 27) {
                    esc = 1;
                    break;
                }
                else if(input == remove_key) {
                    removed[random] = 1;
                    break;
                }
            }
            if(esc) break;

            strcat(temp_line, "  "); strcat(temp_line, word_kor[random]);
            for(int i=0; i<30-strlen(word_kor[random]); i++) strcat(temp_line, " ");

            if(removed[random]) strcat(temp_line, "\t"), strcat(temp_line, "Removed!!"), removed_count++;
            else check[random] = 1, check_count++;
            build_screen(); print_screen();

            if(check_count >= word_count - removed_count) {
                for(int i=0; i<word_count; i++) check[i] = 0;
                rotation_count++;
                itoa(rotation_count, rotation_count_string, 10);
                print_line[1][55] = '\0';
                strcat(print_line[1], rotation_count_string);
                check_count = 0;
            }
        }

    }
}

 

 

 

반응형