|
こういうことをしたかった、わけじゃないんだろうなと思いつつ混乱させてみる。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <math.h>
#define BUF 10
typedef struct S_Set{
int *item;
int count;
int sum;
int min;
void (*setitem)(struct S_Set *set, int i);
double (*getave)(struct S_Set *set);
double (*getsd)(struct S_Set *set);
}Set;
void set_item(Set *set, int i);
double get_ave(Set *set);
double get_sd(Set *set);
Set newSet(Set *set){
static Set newset = {NULL, 0, 0, INT_MAX, set_item, get_ave, get_sd};
memcpy(set, &newset, sizeof(Set));
return *set;
}
int main(void){
Set set = newSet(&set);
int i, n;
printf("x,y,z=");
for(i = 0; i < 3; i++){
scanf("%d", &n);
set.setitem(&set, n);
}
printf("Min=%d\n", set.min);
printf("Av.=%f\n", set.getave(&set));
printf("Sd.=%f\n", set.getsd(&set));
return 0;
}
void set_item(Set *set, int i){
void *vp;
if(set->count % BUF == 0){
vp = realloc(set->item, sizeof(int) * (set->count + BUF));
if(vp) set->item = vp;
else exit(1);
}
set->item[set->count] = i;
set->count++;
set->sum += i;
if(set->min > i) set->min = i;
}
double
get_ave(Set *set){
return (double)set->sum / set->count;
}
double get_sd(Set *set){
int i, c = set->count, d, d2 = 0;
double a = set->getave(set);
for(i = 0; i < c; i++){
d = set->item[i] - a;
d2 += d * d;
}
return sqrt(d2 / set->count);
}
|