pjbk@cs.hw.ac.uk (Peter King) (06/08/89)
A minor modification that I have made to the sc spreadsheet, which sometimes seems useful (the modification, not `sc'!). A new function has been added (@count(range)) which returns the number of numeric cells in the region. Perhaps other will find it useful too. One ought to be able to feed this directly to 'patch'. diff -c /usr/src/local/sc/gram.y ./gram.y *** /usr/src/local/sc/gram.y Thu Sep 15 13:37:05 1988 --- ./gram.y Thu Jun 8 12:56:57 1989 *************** *** 72,77 %token K_PROD %token K_AVG %token K_STDDEV %token K_ACOS %token K_ASIN %token K_ATAN --- 72,78 ----- %token K_PROD %token K_AVG %token K_STDDEV + %token K_COUNT %token K_ACOS %token K_ASIN %token K_ATAN *************** *** 243,248 { $$ = new_range (REDUCE | 'a', $4); } | '@' K_STDDEV '(' var_or_range ')' { $$ = new_range (REDUCE | 's', $4); } | '@' K_MAX '(' var_or_range ')' { $$ = new_range (REDUCE | MAX, $4); } | '@' K_MAX '(' e ',' expr_list ')' --- 244,251 ----- { $$ = new_range (REDUCE | 'a', $4); } | '@' K_STDDEV '(' var_or_range ')' { $$ = new_range (REDUCE | 's', $4); } + | '@' K_COUNT '(' var_or_range ')' + { $$ = new_range (REDUCE | 'c', $4); } | '@' K_MAX '(' var_or_range ')' { $$ = new_range (REDUCE | MAX, $4); } | '@' K_MAX '(' e ',' expr_list ')' diff -c /usr/src/local/sc/help.c ./help.c *** /usr/src/local/sc/help.c Thu Sep 15 13:37:05 1988 --- ./help.c Thu Jun 8 14:24:58 1989 *************** *** 232,237 " @sum(r) Sum all valid cells in the range.", " @prod(r) Multiply together all valid cells in the range.", " @avg(r) Average all valid cells in range.", " @max(r) Return the maximum value in the range.", " @min(r) Return the minimum value in the range.", " See also the numeric versions of max and min.", --- 232,238 ----- " @sum(r) Sum all valid cells in the range.", " @prod(r) Multiply together all valid cells in the range.", " @avg(r) Average all valid cells in range.", + " @count(r) Count all valid cells in range.", " @max(r) Return the maximum value in the range.", " @min(r) Return the minimum value in the range.", " See also the numeric versions of max and min.", diff -c /usr/src/local/sc/interp.c ./interp.c *** /usr/src/local/sc/interp.c Thu Sep 15 13:37:06 1988 --- ./interp.c Thu Jun 8 13:22:11 1989 *************** *** 240,245 } double dosum(minr, minc, maxr, maxc) int minr, minc, maxr, maxc; { --- 240,261 ----- } double + docount(minr, minc, maxr, maxc) + int minr, minc, maxr, maxc; + { + int v; + register r,c; + register struct ent *p; + + v = 0; + for (r = minr; r<=maxr; r++) + for (c = minc; c<=maxc; c++) + if ((p = tbl[r][c]) && p->flags&is_valid) + v ++; + return v; + } + + double dosum(minr, minc, maxr, maxc) int minr, minc, maxr, maxc; { *************** *** 587,592 case REDUCE | '+': case REDUCE | '*': case REDUCE | 'a': case REDUCE | 's': case REDUCE | MAX: case REDUCE | MIN: --- 603,609 ----- case REDUCE | '+': case REDUCE | '*': case REDUCE | 'a': + case REDUCE | 'c': case REDUCE | 's': case REDUCE | MAX: case REDUCE | MIN: *************** *** 603,608 case REDUCE | '+': return dosum(minr, minc, maxr, maxc); case REDUCE | '*': return doprod(minr, minc, maxr, maxc); case REDUCE | 'a': return doavg(minr, minc, maxr, maxc); case REDUCE | 's': return dostddev(minr, minc, maxr, maxc); case REDUCE | MAX: return domax(minr, minc, maxr, maxc); case REDUCE | MIN: return domin(minr, minc, maxr, maxc); --- 620,626 ----- case REDUCE | '+': return dosum(minr, minc, maxr, maxc); case REDUCE | '*': return doprod(minr, minc, maxr, maxc); case REDUCE | 'a': return doavg(minr, minc, maxr, maxc); + case REDUCE | 'c': return docount(minr, minc, maxr, maxc); case REDUCE | 's': return dostddev(minr, minc, maxr, maxc); case REDUCE | MAX: return domax(minr, minc, maxr, maxc); case REDUCE | MIN: return domin(minr, minc, maxr, maxc); *************** *** 1632,1637 case REDUCE | '+': range_arg( "@sum(", e); break; case REDUCE | '*': range_arg( "@prod(", e); break; case REDUCE | 'a': range_arg( "@avg(", e); break; case REDUCE | 's': range_arg( "@stddev(", e); break; case REDUCE | MAX: range_arg( "@max(", e); break; case REDUCE | MIN: range_arg( "@min(", e); break; --- 1650,1656 ----- case REDUCE | '+': range_arg( "@sum(", e); break; case REDUCE | '*': range_arg( "@prod(", e); break; case REDUCE | 'a': range_arg( "@avg(", e); break; + case REDUCE | 'c': range_arg( "@count(", e); break; case REDUCE | 's': range_arg( "@stddev(", e); break; case REDUCE | MAX: range_arg( "@max(", e); break; case REDUCE | MIN: range_arg( "@min(", e); break; diff -c /usr/src/local/sc/sc.doc ./sc.doc *** /usr/src/local/sc/sc.doc Thu Sep 15 13:37:08 1988 --- ./sc.doc Thu Jun 8 14:23:03 1989 *************** *** 1225,1230 Average all valid (nonblank) entries in the specified region. .\" ---------- .TP 18 .BR @max (r) Return the maximum value in the specified region. See also the multi argument version of --- 1225,1234 ----- Average all valid (nonblank) entries in the specified region. .\" ---------- .TP 18 + .BR @count (r) + Count all valid (nonblank) entries in the specified region. + .\" ---------- + .TP 18 .BR @max (r) Return the maximum value in the specified region. See also the multi argument version of -- Peter King, Computer Science Department JANET: pjbk@uk.ac.hw.cs Heriot-Watt University ARPA: pjbk@cs.hw.ac.uk 79 Grassmarket, Edinburgh EH1 2HJ or pjbk%cs.hw.ac.uk@ucl-cs Phone: (+44) 31 225 6465 Ext. 555 UUCP: ..!ukc!cs.hw.ac.uk!pjbk