00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "mmxavg.h"
00014
00015
00016 #ifndef __GNUC__
00017 #ifndef __attribute__
00018 #define __attribute__(x)
00019 #endif
00020 #endif
00021
00022 static char __attribute__((unused)) ident[] = "$Id: mmxavg.c,v 1.3 2001/06/25 15:04:11 wshackle Exp $";
00023
00024 #ifndef MAIN
00025
00026
00027 int mmxavgInit(MMXAVG_STRUCT *mmxavg, double *space, int size)
00028 {
00029 if(0 == mmxavg)
00030 {
00031 return -1;
00032 }
00033 mmxavg->nums = space;
00034 mmxavg->size = size;
00035
00036 return mmxavgReset(mmxavg);
00037 }
00038
00039 int mmxavgReset(MMXAVG_STRUCT *mmxavg)
00040 {
00041 if(0 == mmxavg)
00042 {
00043 return -1;
00044 }
00045 mmxavg->sum = 0;
00046 mmxavg->index = 0;
00047 mmxavg->in = 0;
00048 mmxavg->inited = 0;
00049 mmxavg->min = 0.0;
00050 mmxavg->max = 0.0;
00051
00052 return 0;
00053 }
00054
00055 int mmxavgAdd(MMXAVG_STRUCT *mmxavg, double num)
00056 {
00057 if(0 == mmxavg)
00058 {
00059 return -1;
00060 }
00061 if(mmxavg->index >= mmxavg->size ||
00062 mmxavg->index < 0 )
00063 {
00064 return -1;
00065 }
00066 if (mmxavg->in == mmxavg->size)
00067 {
00068
00069 mmxavg->sum -= mmxavg->nums[mmxavg->index];
00070 }
00071 else
00072 {
00073 mmxavg->in++;
00074 }
00075
00076 mmxavg->nums[mmxavg->index] = num;
00077 mmxavg->sum += num;
00078 mmxavg->index++;
00079 if (mmxavg->index == mmxavg->size)
00080 {
00081 mmxavg->index = 0;
00082 }
00083
00084 if (! mmxavg->inited)
00085 {
00086 mmxavg->min = num;
00087 mmxavg->max = num;
00088 mmxavg->inited = 1;
00089 }
00090 else if (num < mmxavg->min)
00091 {
00092 mmxavg->min = num;
00093 }
00094 else if (num > mmxavg->max)
00095 {
00096 mmxavg->max = num;
00097 }
00098
00099 return 0;
00100 }
00101
00102 double mmxavgMin(MMXAVG_STRUCT *mmxavg)
00103 {
00104 if(0 == mmxavg)
00105 {
00106 return -1;
00107 }
00108 return mmxavg->min;
00109 }
00110
00111 double mmxavgMax(MMXAVG_STRUCT *mmxavg)
00112 {
00113 if(0 == mmxavg)
00114 {
00115 return -1;
00116 }
00117 return mmxavg->max;
00118 }
00119
00120 double mmxavgAvg(MMXAVG_STRUCT *mmxavg)
00121 {
00122 if(0 == mmxavg)
00123 {
00124 return -1;
00125 }
00126 if (mmxavg->in > 0)
00127 {
00128 return mmxavg->sum / mmxavg->in;
00129 }
00130 else
00131 {
00132 return 0.0;
00133 }
00134 }
00135
00136 #else
00137
00138
00139 #include <stdio.h>
00140 #include <string.h>
00141 #include <stdlib.h>
00142
00143
00144
00145
00146
00147
00148 int main(int argc, char *argv[])
00149 {
00150 MMXAVG_STRUCT mmxavg;
00151 int size;
00152 double *space;
00153 double num;
00154 int count = 0;
00155 int which = 3;
00156
00157
00158 if (argc < 2)
00159 {
00160 fprintf(stderr, "syntax: %s <size> {\"min\" | \"max\"}\n",
00161 argv[0]);
00162 exit(1);
00163 }
00164
00165
00166 if (1 != sscanf(argv[1], "%d", &size) ||
00167 size < 1)
00168 {
00169 fprintf(stderr, "size arg must be > 0\n");
00170 exit(1);
00171 }
00172
00173
00174 if (argc > 2)
00175 {
00176 if (!strcmp(argv[2], "min"))
00177 {
00178 which = 1;
00179 }
00180 else if (!strcmp(argv[2], "max"))
00181 {
00182 which = 2;
00183 }
00184 else
00185 {
00186 fprintf(stderr, "printing arg must be \"min\" or \"max\"\n");
00187 exit(1);
00188 }
00189 }
00190
00191
00192 space = (double *) malloc(size * sizeof(double));
00193 mmxavgInit(&mmxavg, space, size);
00194
00195 while (! feof(stdin))
00196 {
00197 if (1 != scanf("%lf", &num))
00198 {
00199 break;
00200 }
00201
00202 mmxavgAdd(&mmxavg, num);
00203
00204 if (which == 1)
00205 printf("%d\t%f\n", count++, mmxavgMin(&mmxavg));
00206 else if (which == 2)
00207 printf("%d\t%f\n", count++, mmxavgMax(&mmxavg));
00208 else
00209 printf("%d\t%f\n", count++, mmxavgAvg(&mmxavg));
00210 }
00211
00212
00213 free(space);
00214
00215 exit(0);
00216 }
00217
00218 #endif