|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <signal.h> ! 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: char dir,sense; ! 21: extern delete(); ! 22: ! 23: signal(SIGINT, delete); ! 24: ! 25: range = 11; ! 26: dif = 0; ! 27: while(argc > 1) { ! 28: switch(*argv[1]) { ! 29: case '+': ! 30: case '-': ! 31: case 'x': ! 32: case '/': ! 33: while(types[dif] = argv[1][dif]) ! 34: dif++; ! 35: break; ! 36: ! 37: default: ! 38: range = getnum(argv[1]) + 1; ! 39: } ! 40: argv++; ! 41: argc--; ! 42: } ! 43: if(range > MAX) { ! 44: printf("Range is too large.\n"); ! 45: exit(); ! 46: } ! 47: ! 48: if(dif == 0) { ! 49: types[0] = '+'; ! 50: types[1] = '-'; ! 51: dif = 2; ! 52: } ! 53: ! 54: for(i = 0; i < range; i++) { ! 55: left[i] = right[i] = i; ! 56: } ! 57: time(&stvec); ! 58: k = stvec; ! 59: srand(k); ! 60: k = 0; ! 61: l = 0; ! 62: goto start; ! 63: ! 64: loop: ! 65: if(++k%20 == 0) ! 66: score(); ! 67: ! 68: start: ! 69: i = skrand(range); ! 70: j = skrand(range); ! 71: if(dif > 1) ! 72: l = random(dif); ! 73: ! 74: switch(types[l]) { ! 75: case '+': ! 76: default: ! 77: ans = left[i] + right[j]; ! 78: printf("%d + %d = ", left[i], right[j]); ! 79: break; ! 80: ! 81: case '-': ! 82: t = left[i] + right[j]; ! 83: ans = left[i]; ! 84: printf("%d - %d = ", t, right[j]); ! 85: break; ! 86: ! 87: case 'x': ! 88: ans = left[i] * right[j]; ! 89: printf("%d x %d = ", left[i], right[j]); ! 90: break; ! 91: ! 92: case '/': ! 93: while(right[j] == 0) ! 94: j = random(range); ! 95: t = left[i] * right[j] + random(right[j]); ! 96: ans = left[i]; ! 97: printf("%d / %d = ", t, right[j]); ! 98: break; ! 99: } ! 100: ! 101: ! 102: loop1: ! 103: getline(line); ! 104: dtvec += etvec - stvec; ! 105: if(line[0]=='\n') goto loop1; ! 106: pans = getnum(line); ! 107: if(pans == ans) { ! 108: printf("Right!\n"); ! 109: rights++; ! 110: goto loop; ! 111: } ! 112: else { ! 113: printf("What?\n"); ! 114: wrongs++; ! 115: if(range >= MAX) goto loop1; ! 116: left[range] = left[i]; ! 117: right[range++] = right[j]; ! 118: goto loop1; ! 119: } ! 120: } ! 121: ! 122: getline(s) ! 123: char *s; ! 124: { ! 125: register char *rs; ! 126: ! 127: rs = s; ! 128: ! 129: while((*rs = getchar()) == ' '); ! 130: while(*rs != '\n') ! 131: if(*rs == 0) ! 132: exit(); ! 133: else if(rs >= &s[99]) { ! 134: while((*rs = getchar()) != '\n') ! 135: if(*rs == '\0') exit(); ! 136: } ! 137: else ! 138: *++rs = getchar(); ! 139: while(*--rs == ' ') ! 140: *rs = '\n'; ! 141: } ! 142: ! 143: getnum(s) ! 144: char *s; ! 145: { ! 146: int a; ! 147: char c; ! 148: ! 149: a = 0; ! 150: while((c = *s++) >= '0' && c <= '9') { ! 151: a = a*10 + c - '0'; ! 152: } ! 153: return(a); ! 154: } ! 155: ! 156: int arand; ! 157: ! 158: srand(n) ! 159: { ! 160: arand = n&077774 | 01; ! 161: } ! 162: ! 163: rand() /*uniform on 0 to 2**13-1*/ ! 164: { ! 165: ! 166: arand *= 3125; ! 167: arand &= 077777; ! 168: return(arand/4); ! 169: } ! 170: ! 171: random(range) ! 172: { ! 173: return(hmul(rand(), 8*range)); ! 174: } ! 175: ! 176: skrand(range){ ! 177: int temp; ! 178: temp = rand() + rand(); ! 179: if(temp >017777) temp = 040000 - temp; ! 180: return(hmul(temp,8*range)); ! 181: } ! 182: ! 183: /* 'hmul' returns the upper 16 bits of the product, where the operands ! 184: are assumed to be 16-bit integers. It replaces an old PDP-11 ! 185: assembler language subroutine. -- dks. ! 186: */ ! 187: hmul(a,b) { return(a*b >> 16); } ! 188: score() ! 189: { ! 190: time(&etvec); ! 191: ! 192: printf("\n\nRights %d; Wrongs %d; Score %d%%\n", rights, wrongs, ! 193: (rights * 100)/(rights + wrongs)); ! 194: ! 195: if(rights == 0) return; ! 196: printf("Total time %ld seconds; %.1f seconds per problem\n\n\n", ! 197: etvec - stvec, ! 198: (etvec - stvec) / (rights + 0.)); ! 199: ! 200: sleep(3); ! 201: time(&dtvec); ! 202: stvec += dtvec - etvec; ! 203: return(0); ! 204: } ! 205: ! 206: delete() ! 207: { ! 208: if(rights + wrongs == 0.) { ! 209: printf("\n"); ! 210: exit(); ! 211: } ! 212: score(); ! 213: exit(); ! 214: } ! 215:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.