Annotation of 43BSDTahoe/usr.bin/learn/selunit.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.