1: #ifndef lint
2: static char sccsid[] = "@(#)selunit.c 4.3 (Berkeley) 5/15/86";
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: gets(dobuff);
34: if (strcmp(dobuff, "bye") == 0)
35: wrapup(1);
36: level = dobuff;
37: if (todo=getlesson())
38: return;
39: }
40: alts = 0;
41: retry:
42: f = scrin; /* use old lesson to find next */
43: if (f==NULL) {
44: sprintf(fnam, "%s/%s/L%s", direct, sname, level);
45: f = fopen(fnam, "r");
46: if (f==NULL) {
47: perror(fnam);
48: fprintf(stderr, "Selunit: no script for lesson %s.\n", level);
49: wrapup(1);
50: }
51: while (fgets(zb, 200, f)) {
52: trim(zb);
53: if (strcmp(zb, "#next")==0)
54: break;
55: }
56: }
57: if (feof(f)) {
58: printf("Congratulations; you have finished this sequence.\n");
59: fflush(stdout);
60: todo = 0;
61: wrapup(-1);
62: }
63: for(i=0; fgets(s, 80, f); i++) {
64: sscanf(s, "%s %d", posslev[i], &diff[i]);
65: }
66: best = -1;
67: /* cycle through lessons from random start */
68: /* first try the current place, failing that back up to
69: last place there are untried alternatives (but only one backup) */
70: n = grand()%i;
71: for(k=0; k<i; k++) {
72: m = (n+k)%i;
73: if (already(posslev[m]))
74: continue;
75: if (best<0)
76: best = m;
77: alts++; /* real alternatives */
78: if (abs(diff[m]-speed) < abs(diff[best]-speed))
79: best = m;
80: }
81: if (best < 0 && nsave) {
82: nsave--;
83: strcpy(level, saved);
84: goto retry;
85: }
86: if (best < 0) {
87: /* lessons exhausted or missing */
88: printf("Sorry, there are no alternative lessons at this stage.\n");
89: printf("See someone for help.\n");
90: fflush(stdout);
91: todo = 0;
92: return;
93: }
94: strcpy (dobuff, posslev[best]);
95: if (alts>1) {
96: nsave = 1;
97: strcpy(saved, level);
98: }
99: todo = dobuff;
100: fclose(f);
101: }
102:
103: abs(x)
104: {
105: return(x>=0 ? x : -x);
106: }
107:
108: grand()
109: {
110: static int garbage;
111: int a[2], b;
112:
113: time(a);
114: b = a[1]+10*garbage++;
115: return(b&077777);
116: }
Defined functions
abs
defined in line
103; used 2 times
Defined variables
nsave
defined in line
8; used 3 times
review
defined in line
9; used 5 times
sccsid
defined in line
2;
never used