Median = 7.5                   X
                                   X   X X   X
                             X     X X X X   X X
                 X X     X X X     X X X X X X X
    ___X_______X_X_X_____X_X_X_X_X_X_X_X_X_X_X_X_
      0 . 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . 10
A grade scale:        D       C       B       A
Note on grade scales:  One exam is not sufficient to assign a very
detailed grade scale or well defined cutoffs between grades.
     1 0000: 16    |    B   22    ; 11 had big hexadecimal problems
     2 0001: 22    |X:  B   #22
     3 0002: 01    |    B   X
     4             |; commentary
     5 0003: 0A    |    B   Y     ; 12 had big problems with this
     6 0004: 05    |    B   Z     ; 11 had big problems with this
     7             |Y   =   10
     8             |Z:
     9             |              ; 11 had perfect scores
; symbol table:
X       =       #0001
Y       =       #000A
Z       =       #0005             ; many had trouble with this
For a bit more credit, most correctly identified lines 5 and 6 above
as containing forward references.
4 students had perfect answers to this!#define twice(x) x * 2 #define next(x) x + 1 int i = twice(next(4));
a) 4 is the actual parameter to next. 7 missed this entirely.
b) 4 + 1 is the actual parameter to twice. 10 missed this
	entirely.  5 prematurely evaluated the expression, passing 5.
20 suggested next(4), and were incorrectly penalized.
Those who received a 0.2 point penalty for this answer should see me!
c) 4 + 1 * 2 replaces twice(next(4)). 5 missed this entirely. about half tried to evaluate the expression, giving the value 10, and many gave a parenthesized expression, with no hint of how the parentheses got introduced.
c) The initial value of i is 6!
     1 0000: 02    |    B   X
     2             |Z:
     3             |.   =   .+1    ; many ignored this line!
     4 0002: 0F    |X:  B   15
     5 0003: 0F    |Y:  B   15     ; 4 had no credit at all
     6             |.   =   Z
     7 0001: 03    |    B   Y      ; 10 had perfect scores here
     8             |.   =   Y+1
; symbol table:
X       =       #0002
Y       =       #0003
Z       =       #0001
For a bit more credit, 12 correctly noted that all of the symbols
in the symbol table are relocatable.
void parse_s_exper()
{
    if (lex_this != '(') {
        parse_atom();                    /* 21 got this */
    } else {
        lex_scan();
        if ( lex_this != ')' ) {         /* 12 got essentially this */
            parse_s_expr();
            while (( lex_this != '.' )   /* 16 got essentially this */
            &&     (lex_this != ')')) {
                    parse_s_expr();      /* 27 got this */
            }
            if (lex_this == '.') {
                lex_scan();              /* 31 got this */
                parse_s_expr();
            }
        }
        if (lex_this != ')') EXCEPT_RAISE( parse_error );
        lex_scan();
    }
}
     1             |    MACRO X I
     2             |      IF I > 0
     3             |        B I
     4             |        X (I-1)
     5             |      ENDIF
     6             |    ENDMAC
     7             |
     8             |    X 0
     9 0000: 01    |    X 1
    10 0001: 02    |    X 2
    10 0002: 01
    11 0003: 03    |    X 3
    11 0004: 02
    11 0005: 01