■ 印刷物の重量の算出(線形リストを利用)
/*
** weight.c : 印刷物の重量の算出(線形リストを利用)
**
** Copyright (c) 2000 AOK.
**
** 2000.8.28 - 初版
**
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct list {
long size; /* 用紙の総面積 */
double weight; /* 用紙の重さ */
long number; /* 枚数 */
struct list *next; /* 次のデータへのポインタ */
} DATA;
long getsize()
{
long width, height;
puts("仕上がりサイズを入力して下さい.(単位: mm)");
printf("横? >");
scanf("%ld", &width);
printf("縦? >");
scanf("%ld", &height);
printf("仕上がり寸法は、%ldx%ld です.\n\n", width, height);
return width * height;
}
int input(DATA *p)
{
int n;
printf("用紙は何判? 0:終了 1:4/6判 2:B判 3:菊判 4:A判 >");
scanf("%d", &n);
switch (n)
{
case 0: return 0;
case 2: p->size = 765*1085; break;
case 3: p->size = 636* 939; break;
case 4: p->size = 625* 880; break;
default: p->size = 788*1091; break;
}
printf("用紙の重さ?(上質55kgの場合 55 と入力) >");
scanf("%lf", &p->weight);
printf("紙の枚数? >");
scanf("%ld", &p->number);
p->next = NULL;
putchar('\n');
return 1;
}
void add(DATA *p)
{
DATA *q = NULL;
for (;;)
{
q = (DATA *)malloc(sizeof(DATA));
if (!input(q))
{
free(q);
break;
}
p->next = q;
p = q;
}
}
void output(DATA *p, long size)
{
double total = 0, sub = 0;
int i = 0;
DATA *q = NULL;
while (p != NULL)
{
q = p->next;
sub = (double)(size * p->weight * p->number) / p->size;
printf("%2d: %.1lfkg %3ld枚 ---> %6.1lfg\n",
++i, p->weight, p->number, sub);
total += sub;
free(p);
p = q;
}
printf("\n仕上がりの重さ: %.1lf (g)\n", total);
puts("実際には、インクの重さなどが加算されて、さらに重くなります.");
}
int main()
{
long size;
DATA head = { 0, 0, 0, NULL };
puts("\n印刷物の重量を算出します.");
/* 入力処理 */
size = getsize();
add(&head);
putchar('\n');
/* 出力処理 */
output(head.next, size);
return 0;
}