[ create a new paste ] login | about

Link: http://codepad.org/Fs1wnLWh    [ raw code | output | fork ]

C, pasted on Jan 6:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAXLINE 1024/* Input line max size */
#define STUDENTMAX 5
typedef struct _heightset {
	double base[STUDENTMAX];
	double add[STUDENTMAX];
	double sum[STUDENTMAX];
	double example;
	double height;
} Heightset;

/* 0.1~0.5を0.1刻みで取得する */
double getrandom(void)
{
	return ((int)(5.0 * rand() / (RAND_MAX + 1.0)) + 1) / 10.0;
}

int getmin(int a[], int arraysize)
{
	int i, n, min;

#ifdef DEBUG1
	for (i = 0; i < arraysize; i++)
	{
		printf("%d: %d\t",i , a[i]);
	}
#endif
	min = a[0];
	n = 0;
	for (i = 1; i < arraysize; i++)
	{
		if (a[i] < min)
		{
			min = a[i];
			n = i;
		}
	}

#ifdef DEBUG1
	printf("min: %d\n", n);
#endif
	return n;
}

int getmax(int a[], int arraysize)
{
	int i, n, max;
#ifdef DEBUG2
	for (i = 0; i < arraysize; i++)
	{
		printf("%d: %d\t",i , a[i]);
	}
#endif

	max = a[0];
	n = 0;
	for (i = 1; i < arraysize; i++)
	{
		if (max < a[i])
		{
			max = a[i];
			n = i;
		}
	}

#ifdef DEBUG2
	printf("max: %d\n", n);
#endif
	return n;
}

int addheight(const char *inputf, const char *outputf)
{
	FILE *ifp, *ofp;
	char line[MAXLINE];
	char *sp;
	const char *delimiter = " ";
	double student[STUDENTMAX] = {0.0, };
	Heightset h[STUDENTMAX];
	int sum[STUDENTMAX] = {0, };/* temp */
	int example[STUDENTMAX] = {0, }, exp;/* temp */
	int i, k;/* temp */

	/* File open */
	ifp = fopen(inputf, "r");
	ofp = fopen(outputf, "w");
	if (ifp == NULL || ofp == NULL)
	{
		fprintf(stderr, "error: can't open file(s)\n");
		exit (1);
	}

	srand((unsigned)time(NULL));

	/* height pick */
	while ((fgets(line, MAXLINE, ifp)) != NULL)
	{
		/* 1行分のデータを配列に代入 */
		sp = strtok(line, delimiter);
		for (i = 0; sp != NULL; i++)
		{
			student[i] = atof(sp);
			sp = strtok(NULL, delimiter);
		}
		if (i != STUDENTMAX)
		{
			fprintf(stderr, "error: Invalid data(!= %d)\n", STUDENTMAX);
			exit (2);
		}

		/* データを算出する */
		for (i = 0; i < STUDENTMAX; i++)
		{
			/* -- 基礎データ(5人分) -- */
			for (k = 0; k < STUDENTMAX; k++)
			{
				h[i].base[k] = getrandom();
			}
			/* -- 付加データ(5人分) -- */
			for (k = 0; k < STUDENTMAX; k++)
			{
				h[i].add[k] = getrandom();
			}
			/* -- 基礎+付加(5人分) -- */
			for (k = 0; k < STUDENTMAX; k++)
			{
				h[i].sum[k] = h[i].base[k] + h[i].add[k];
				sum[k] = (int)(h[i].sum[k] * 10);
			}
			/* -- i回目の代表のデータ -- */
			k = getmin(sum, STUDENTMAX);
			h[i].example = h[i].sum[k];
			/* -- i回目の代表の身長 -- */
			h[i].height = student[k];
		}
		/* -- 行の代表のデータ -- */
		for (i = 0; i < STUDENTMAX; i++)
		{
			example[i] = (int)(h[i].example * 10);
		}
		exp = getmax(example, STUDENTMAX);/* exp:代表 */

		/* 出力する */
		/* -- 元データ -- */
		fprintf(ofp, "%.1f", student[0]);
		for (i = 1; i < STUDENTMAX; i++)
		{
			fprintf(ofp, "%s%.1f", delimiter, student[i]);
		}
		/* -- x5回 -- */
		for (i = 0; i < STUDENTMAX; i++)
		{
			/* -- 基礎データ(5人分) -- */
			for (k = 0; k < STUDENTMAX; k++)
			{
				fprintf(ofp, "%s%.1f", delimiter, h[i].base[k]);
			}
			/* -- 付加データ(5人分) -- */
			for (k = 0; k < STUDENTMAX; k++)
			{
				fprintf(ofp, "%s%.1f", delimiter, h[i].add[k]);
			}
			/* -- 基礎+付加(5人分) -- */
			for (k = 0; k < STUDENTMAX; k++)
			{
				fprintf(ofp, "%s%.1f", delimiter, h[i].sum[k]);
			}
			/* -- 回の代表のデータ -- */
			fprintf(ofp, "%s%.1f", delimiter, h[i].example);
			/* -- 回の代表の身長 -- */
			fprintf(ofp, "%s%.1f", delimiter, h[i].height);
		}
		/* -- 行の代表の身長 -- */
		fprintf(ofp, "%s%.1f\n", delimiter, h[exp].height);
	}

	/* File close */
	fclose(ifp);
	fclose(ofp);

	return 0;
}

int main(void)
{
	const char *inputf = "height.csv";
	const char *outputf = "result.csv";

	addheight(inputf, outputf);

	return 0;
}


Output:
1
error: can't open file(s)


Create a new paste based on this one


Comments: