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
  • in line 78(2)
grand defined in line 108; used 1 times
  • in line 70
selunit defined in line 11; used 1 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
Last modified: 1986-05-16
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1338
Valid CSS Valid XHTML 1.0 Strict