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