|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)selunit.c 4.4 (Berkeley) 9/11/87"; ! 3: #endif not lint ! 4: ! 5: #include "stdio.h" ! 6: #include "lrnref.h" ! 7: ! 8: int nsave = 0; ! 9: int review = 0; ! 10: ! 11: selunit() ! 12: { ! 13: static char dobuff[50]; ! 14: static char saved[20]; ! 15: char fnam[80], s[80], zb[200]; ! 16: char posslev[20][20]; ! 17: int diff[20], i, k, m, n, best, alts; ! 18: char *getlesson(); ! 19: FILE *f; ! 20: ! 21: if (again) { ! 22: again = 0; ! 23: if (todo=getlesson()) { ! 24: if (!review) ! 25: unsetdid(todo); ! 26: return; ! 27: } ! 28: wrapup(1); ! 29: } ! 30: while (ask) { ! 31: printf("What lesson? "); ! 32: fflush(stdout); ! 33: if (gets(dobuff) == NULL) ! 34: wrapup(1); ! 35: if (strcmp(dobuff, "bye") == 0) ! 36: wrapup(1); ! 37: level = dobuff; ! 38: if (todo=getlesson()) ! 39: return; ! 40: } ! 41: alts = 0; ! 42: retry: ! 43: f = scrin; /* use old lesson to find next */ ! 44: if (f==NULL) { ! 45: sprintf(fnam, "%s/%s/L%s", direct, sname, level); ! 46: f = fopen(fnam, "r"); ! 47: if (f==NULL) { ! 48: perror(fnam); ! 49: fprintf(stderr, "Selunit: no script for lesson %s.\n", level); ! 50: wrapup(1); ! 51: } ! 52: while (fgets(zb, 200, f)) { ! 53: trim(zb); ! 54: if (strcmp(zb, "#next")==0) ! 55: break; ! 56: } ! 57: } ! 58: if (feof(f)) { ! 59: printf("Congratulations; you have finished this sequence.\n"); ! 60: fflush(stdout); ! 61: todo = 0; ! 62: wrapup(-1); ! 63: } ! 64: for(i=0; fgets(s, 80, f); i++) { ! 65: sscanf(s, "%s %d", posslev[i], &diff[i]); ! 66: } ! 67: best = -1; ! 68: /* cycle through lessons from random start */ ! 69: /* first try the current place, failing that back up to ! 70: last place there are untried alternatives (but only one backup) */ ! 71: n = grand()%i; ! 72: for(k=0; k<i; k++) { ! 73: m = (n+k)%i; ! 74: if (already(posslev[m])) ! 75: continue; ! 76: if (best<0) ! 77: best = m; ! 78: alts++; /* real alternatives */ ! 79: if (abs(diff[m]-speed) < abs(diff[best]-speed)) ! 80: best = m; ! 81: } ! 82: if (best < 0 && nsave) { ! 83: nsave--; ! 84: strcpy(level, saved); ! 85: goto retry; ! 86: } ! 87: if (best < 0) { ! 88: /* lessons exhausted or missing */ ! 89: printf("Sorry, there are no alternative lessons at this stage.\n"); ! 90: printf("See someone for help.\n"); ! 91: fflush(stdout); ! 92: todo = 0; ! 93: return; ! 94: } ! 95: strcpy (dobuff, posslev[best]); ! 96: if (alts>1) { ! 97: nsave = 1; ! 98: strcpy(saved, level); ! 99: } ! 100: todo = dobuff; ! 101: fclose(f); ! 102: } ! 103: ! 104: abs(x) ! 105: { ! 106: return(x>=0 ? x : -x); ! 107: } ! 108: ! 109: grand() ! 110: { ! 111: static int garbage; ! 112: int a[2], b; ! 113: ! 114: time(a); ! 115: b = a[1]+10*garbage++; ! 116: return(b&077777); ! 117: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.