|
あえてツッコミます。
rand関数に小数を発生させることはできません。
randで得たランダムな整数を使って小数を作ることはできるかもしれませんが…
小数第3位ぐらいで切り捨てとか怪しい条件が後からついたようですが、
最初の書き込みの話を素直に反映すればこうなるかと。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
typedef struct frq{ //度数を保持。二分木使用。
double d;
int count;
struct frq *child[2]; //0:小 1:大
}Frq;
Frq blank = {0, 1, {NULL, NULL}};
Frq *newfrq(double v){
Frq *f = malloc(sizeof(Frq));
if(!f) exit(1);
*f = blank;
f->d = v;
return f;
}
void additem(Frq *parent, double v){
Frq **newitem;
if(v == parent->d)
parent->count++;
else if(*(newitem = &parent->child[v > parent->d]))
additem(*newitem, v);
else
*newitem = newfrq(v);
}
void printascendingorder(Frq *f){
if(!f) return;
printascendingorder(f->child[0]);
printf("%e: %d回\n", f->d, f->count);
printascendingorder(f->child[1]);
}
double randomdouble(void){
int i, n;
unsigned char byte[sizeof(double)];
double rd;
for(i = 0; i < sizeof(double); i++) byte[i] = (unsigned char)rand();
memcpy(&rd, byte, sizeof(double));
return rd;
}
int main(void){
int i;
Frq root = {randomdouble(), 1, {NULL, NULL}};
srand((unsigned)time(NULL));
for (i = 1; i < 20; i++) additem(&root, randomdouble());
printascendingorder(&root);
return 0;
}
|