1: #include <signal.h>
2:
3: #define MAX 100
4:
5: char types[10];
6: int right[MAX];
7: int left[MAX];
8: int rights;
9: int wrongs;
10: long stvec;
11: long etvec;
12: long dtvec;
13:
14: main(argc,argv)
15: char *argv[];
16: {
17: int range, k, dif, l;
18: char line[100];
19: int ans,pans,i,j,t;
20: extern delete();
21:
22: signal(SIGINT, delete);
23:
24: range = 11;
25: dif = 0;
26: while(argc > 1) {
27: switch(*argv[1]) {
28: case '+':
29: case '-':
30: case 'x':
31: case '/':
32: while(types[dif] = argv[1][dif])
33: dif++;
34: break;
35:
36: default:
37: range = getnum(argv[1]) + 1;
38: }
39: argv++;
40: argc--;
41: }
42: if(range > MAX) {
43: printf("Range is too large.\n");
44: exit(0);
45: }
46:
47: if(dif == 0) {
48: types[0] = '+';
49: types[1] = '-';
50: dif = 2;
51: }
52:
53: for(i = 0; i < range; i++) {
54: left[i] = right[i] = i;
55: }
56: time(&stvec);
57: k = stvec;
58: srand(k);
59: k = 0;
60: l = 0;
61: goto start;
62:
63: loop:
64: if(++k%20 == 0)
65: score();
66:
67: start:
68: i = skrand(range);
69: j = skrand(range);
70: if(dif > 1)
71: l = random(dif);
72:
73: switch(types[l]) {
74: case '+':
75: default:
76: ans = left[i] + right[j];
77: printf("%d + %d = ", left[i], right[j]);
78: break;
79:
80: case '-':
81: t = left[i] + right[j];
82: ans = left[i];
83: printf("%d - %d = ", t, right[j]);
84: break;
85:
86: case 'x':
87: ans = left[i] * right[j];
88: printf("%d x %d = ", left[i], right[j]);
89: break;
90:
91: case '/':
92: while(right[j] == 0)
93: j = random(range);
94: t = left[i] * right[j] + random(right[j]);
95: ans = left[i];
96: printf("%d / %d = ", t, right[j]);
97: break;
98: }
99:
100:
101: loop1:
102: getline(line);
103: dtvec += etvec - stvec;
104: if(line[0]=='\n') goto loop1;
105: pans = getnum(line);
106: if(pans == ans) {
107: printf("Right!\n");
108: rights++;
109: goto loop;
110: }
111: else {
112: printf("What?\n");
113: wrongs++;
114: if(range >= MAX) goto loop1;
115: left[range] = left[i];
116: right[range++] = right[j];
117: goto loop1;
118: }
119: }
120:
121: getline(s)
122: char *s;
123: {
124: register char *rs;
125:
126: rs = s;
127:
128: while((*rs = getchar()) == ' ');
129: while(*rs != '\n')
130: if(*rs == 0)
131: exit(0);
132: else if(rs >= &s[99]) {
133: while((*rs = getchar()) != '\n')
134: if(*rs == '\0') exit(0);
135: }
136: else
137: *++rs = getchar();
138: while(*--rs == ' ')
139: *rs = '\n';
140: }
141:
142: getnum(s)
143: char *s;
144: {
145: int a;
146: char c;
147:
148: a = 0;
149: while((c = *s++) >= '0' && c <= '9') {
150: a = a*10 + c - '0';
151: }
152: return(a);
153: }
154:
155:
156: random(range)
157: {
158: return(rand()%range);
159: }
160:
161: skrand(range){
162: int temp;
163: temp = random(range) + random(range);
164: if(temp > range - 1) temp = 2*range - 1 - temp;
165: return(temp);
166: }
167:
168: score()
169: {
170: time(&etvec);
171:
172: printf("\n\nRights %d; Wrongs %d; Score %d%%\n", rights, wrongs,
173: (rights * 100)/(rights + wrongs));
174:
175: if(rights == 0) return;
176: printf("Total time %ld seconds; %.1f seconds per problem\n\n\n",
177: etvec - stvec,
178: (etvec - stvec) / (rights + 0.));
179:
180: sleep(3);
181: time(&dtvec);
182: stvec += dtvec - etvec;
183: }
184:
185: delete()
186: {
187: if(rights + wrongs == 0.) {
188: printf("\n");
189: exit(0);
190: }
191: score();
192: exit(0);
193: }
Defined functions
main
defined in line
14;
never used
Defined variables
dtvec
defined in line
12; used 3 times
etvec
defined in line
11; used 5 times
left
defined in line
7; used 11 times
right
defined in line
6; used 13 times
rights
defined in line
8; used 7 times
stvec
defined in line
10; used 6 times
types
defined in line
5; used 4 times
wrongs
defined in line
9; used 4 times
Defined macros
MAX
defined in line
3; used 4 times