초딩 1학년인 딸아이가 학교에선 뺄셈 들어가는데 아직 덧셈도 잘하지 못해

안되겠다 싶어 여러 문제를 만들어 봄.

 

 - A+B 가 10보다 작은 경우만 수집함. -> 총 55가지인가 나옴.

 - 결과를 랜덤으로 섞음.

 - 몇장 만들 것인지 설정할 수 있음.

 

 - 추가로 빼기 경우도 만들어봄.

 - 결과가 음수인 경우는 배제. 큰 수의 최대값은 9임.

 

Ubuntu 14.04 에서 컴파일 함.

 

결과물 txt 파일을 MS-Word 로 복사해 출력하여 교재로 활용함.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include <cstdio>
#include <cstdlib>
 
#include <algorithm>
#include <vector>
 
#define SEED_FILE "seedValue.dat"
 
#define PAGE_NUMBER     20    // 생성할 페이지 수
 
#define ADD            // 덧셈 예제를 생성함.
//#define SUB         // 뺄셈 예제를 생성함.
 
// ADD, SUB 둘 다 define 되어있거나, 
// 아무것도 define 되어있지 않은지 체크함.
#if defined(ADD) && defined(SUB)
#error "defined both ADD and SUB."
#endif
 
#if !defined(ADD) && !defined(SUB)
#error "NOT Defined anything."
#endif
 
// srand() 함수에 사용될 seed 값을 증가함.
// 이전값을 기억하여 랜덤 결과가 겹치지 않도록 함.
unsigned int getSeed()
{
        FILE* fp = fopen(SEED_FILE, "rt") ;
        if(!fp)
        {
                FILE* fp = fopen(SEED_FILE, "wt") ;
                fprintf(fp, "1") ;
                fclose(fp) ;
                return 1 ;
        }
 
        unsigned int seed ;
        char szText[128] ;
 
        fgets(szText, sizeof(szText), fp) ;
        seed = atoi(szText) ;
 
        fclose(fp) ;
 
        return seed + 1 ;
}
 
// 예제에 사용될 샘플을 수집하여 vector에 저장함.
int makeList(std::vector<int>* pVecInt)
{
        int result ;
        for(int ii = 0; ii <= 9; ii++)
        {
                for(int jj = 0; jj <= 9; jj++)
                {
#ifdef ADD
                        result = ii + jj ;
 
                        if(result >= 10)
                                continue ;
#elif defined SUB
                        result = ii - jj ;
 
                        if(result < 0)
                                continue ;
#endif
 
                        result  = (ii * 10) + jj ;
                        pVecInt->push_back(result) ;
                }
        }
 
        return 1 ;
}
 
// 수집한 샘플을 파일로 저장함.
int makeFile(std::vector<int>* pVecInt, int seed, FILE* fp)
{
 
        int a, b ;
        int cnt = 0 ;
        const int ROW = 4 ;
        std::vector<int>::iterator      vecIntIter ;
 
 
        fprintf(fp, "Seed Index : %d\r\n", seed - 1 ) ;
 
        vecIntIter = pVecInt->begin() ;
        for(; vecIntIter != pVecInt->end(); vecIntIter++)
        {
                a = *vecIntIter / 10 ;
                b = *vecIntIter % 10 ;
 
 
                if(cnt % ROW != 0)
                        fprintf(fp, "      ") ;
 
#ifdef ADD
                fprintf(fp, "%d + %0d = ", a, b) ;
#elif defined SUB
                fprintf(fp, "%d - %0d = ", a, b) ;
#endif
 
                if(cnt % ROW == ROW - 1)
                        fprintf(fp, "\r\n") ;
 
                cnt++ ;
        }
 
        return 1 ;
}
 
int main()
{
        std::vector<int>                        vecInt ;
        static char szName[128] ;
 
        unsigned int seed = getSeed() ;
        srand(seed) ;
 
#ifdef ADD
        printf("ADD mode : %d\n", seed) ;
        sprintf(szName, "addTest_%d-%d.txt", seed, seed - 1 + PAGE_NUMBER) ;
#elif defined SUB
        printf("SUB mode : %d\n", seed) ;
        sprintf(szName, "subTest_%d-%d.txt", seed, seed - 1 + PAGE_NUMBER) ;
#endif
 
        FILE* fp = fopen(szName, "wt") ;
 
        for(int ii = 1; ii < PAGE_NUMBER; ii++)
        {
                seed++ ;
 
                if(seed == 0x8fffffff)
                        seed = 1  ;
 
                FILE* fpSeed = fopen(SEED_FILE, "wt") ;
                fprintf(fpSeed, "%d", seed) ;
                fclose(fpSeed) ;
 
                vecInt.clear() ;
 
                makeList(&vecInt) ;
 
                // 수집한 샘플을 섞음.
                random_shuffle(vecInt.begin(), vecInt.end()) ;
 
                makeFile(&vecInt, seed, fp) ;
 
                fprintf(fp, "\r\n") ;
                fprintf(fp, "\r\n") ;
 
        }
 
        fclose(fp) ;
 
        return 1 ;
}
 

+ Recent posts