Last Update: Jan.10,2001

C Source Library

「LSI C-86 Ver.3.30c 試食版」を使用しています。

■ 印刷物の重量の算出(線形リストを利用)

/*
**  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;
}