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

delete defined in line 185; used 2 times
getline defined in line 121; used 1 times
getnum defined in line 142; used 2 times
main defined in line 14; never used
random defined in line 156; used 5 times
score defined in line 168; used 2 times
skrand defined in line 161; used 2 times

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
Last modified: 1979-01-14
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 614
Valid CSS Valid XHTML 1.0 Strict