Research V7 development
[unix-history] / usr / src / games / arithmetic.c
CommitLineData
010c11ea
KT
1#include <signal.h>
2
3#define MAX 100
4
5char types[10];
6int right[MAX];
7int left[MAX];
8int rights;
9int wrongs;
10long stvec;
11long etvec;
12long dtvec;
13
14main(argc,argv)
15char *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
63loop:
64 if(++k%20 == 0)
65 score();
66
67start:
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
101loop1:
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
121getline(s)
122char *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
142getnum(s)
143char *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
156random(range)
157{
158 return(rand()%range);
159}
160
161skrand(range){
162int temp;
163 temp = random(range) + random(range);
164 if(temp > range - 1) temp = 2*range - 1 - temp;
165 return(temp);
166 }
167
168score()
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
185delete()
186{
187 if(rights + wrongs == 0.) {
188 printf("\n");
189 exit(0);
190 }
191 score();
192 exit(0);
193}