V7/usr/src/games/arithmetic.c
#include <signal.h>
#define MAX 100
char types[10];
int right[MAX];
int left[MAX];
int rights;
int wrongs;
long stvec;
long etvec;
long dtvec;
main(argc,argv)
char *argv[];
{
int range, k, dif, l;
char line[100];
int ans,pans,i,j,t;
extern delete();
signal(SIGINT, delete);
range = 11;
dif = 0;
while(argc > 1) {
switch(*argv[1]) {
case '+':
case '-':
case 'x':
case '/':
while(types[dif] = argv[1][dif])
dif++;
break;
default:
range = getnum(argv[1]) + 1;
}
argv++;
argc--;
}
if(range > MAX) {
printf("Range is too large.\n");
exit(0);
}
if(dif == 0) {
types[0] = '+';
types[1] = '-';
dif = 2;
}
for(i = 0; i < range; i++) {
left[i] = right[i] = i;
}
time(&stvec);
k = stvec;
srand(k);
k = 0;
l = 0;
goto start;
loop:
if(++k%20 == 0)
score();
start:
i = skrand(range);
j = skrand(range);
if(dif > 1)
l = random(dif);
switch(types[l]) {
case '+':
default:
ans = left[i] + right[j];
printf("%d + %d = ", left[i], right[j]);
break;
case '-':
t = left[i] + right[j];
ans = left[i];
printf("%d - %d = ", t, right[j]);
break;
case 'x':
ans = left[i] * right[j];
printf("%d x %d = ", left[i], right[j]);
break;
case '/':
while(right[j] == 0)
j = random(range);
t = left[i] * right[j] + random(right[j]);
ans = left[i];
printf("%d / %d = ", t, right[j]);
break;
}
loop1:
getline(line);
dtvec += etvec - stvec;
if(line[0]=='\n') goto loop1;
pans = getnum(line);
if(pans == ans) {
printf("Right!\n");
rights++;
goto loop;
}
else {
printf("What?\n");
wrongs++;
if(range >= MAX) goto loop1;
left[range] = left[i];
right[range++] = right[j];
goto loop1;
}
}
getline(s)
char *s;
{
register char *rs;
rs = s;
while((*rs = getchar()) == ' ');
while(*rs != '\n')
if(*rs == 0)
exit(0);
else if(rs >= &s[99]) {
while((*rs = getchar()) != '\n')
if(*rs == '\0') exit(0);
}
else
*++rs = getchar();
while(*--rs == ' ')
*rs = '\n';
}
getnum(s)
char *s;
{
int a;
char c;
a = 0;
while((c = *s++) >= '0' && c <= '9') {
a = a*10 + c - '0';
}
return(a);
}
random(range)
{
return(rand()%range);
}
skrand(range){
int temp;
temp = random(range) + random(range);
if(temp > range - 1) temp = 2*range - 1 - temp;
return(temp);
}
score()
{
time(&etvec);
printf("\n\nRights %d; Wrongs %d; Score %d%%\n", rights, wrongs,
(rights * 100)/(rights + wrongs));
if(rights == 0) return;
printf("Total time %ld seconds; %.1f seconds per problem\n\n\n",
etvec - stvec,
(etvec - stvec) / (rights + 0.));
sleep(3);
time(&dtvec);
stvec += dtvec - etvec;
}
delete()
{
if(rights + wrongs == 0.) {
printf("\n");
exit(0);
}
score();
exit(0);
}