以下の青字で示されたプログラムを mule で打ち込み、"algo6.c" というファイル名で保存し、コンパイルし、実行せよ。
/* algo6.c (pp.47〜50)
*
* 店別、県別、地区別合計
* 多重コントロールブレーク
*/
/*
* 以下では「店別」、「県別」、「地区別」をコントロールブレイクの
* キーとして、即ち各キーが異なる毎に金額を集計し、「小計」、「中計」、
* 「大計」を求め、最後に総計を出す。即ち、「地区別」の総計を求める。
*/
#include <stdio.h>
#include <string.h>
int main(void) {
int uriage,daikei,chukei,syokei,soukei;
char *highvalue="High",dai[5],chu[5],syo[5];
char hokandai[5],hokanchu[5],hokansyo[5];
FILE *fin;
/* 読み込み用のファイルを開く */
if((fin=fopen("algo6.dat","r"))==NULL) {
printf("Cannot open %s\n","algo6.dat");
exit(1);
}
/* 初期化 */
/* データを読み込み、ファイル終端のときフラッグを立てる */
if (fscanf(fin,"%s %s %s %d",dai,chu,syo,&uriage)==EOF) {
strcpy(dai,highvalue);
strcpy(chu,highvalue);
strcpy(syo,highvalue);
}
/* フラッグが立っている限り処理を繰り返す */
while (strcmp(dai,highvalue)!=0) {
strcpy(hokandai,dai);
daikei=0;
do {
strcpy(hokanchu,chu);
chukei=0;
do {
strcpy(hokansyo,syo);
syokei=0;
do {
syokei += uriage;
if (fscanf(fin,"%s %s %s %d",dai,chu,syo,&uriage)==EOF) {
strcpy(dai,highvalue);
strcpy(chu,highvalue);
strcpy(syo,highvalue);
}
} while (strcmp(syo,hokansyo)==0 && strcmp(chu,hokanchu)== 0 &&
strcmp(dai,hokandai)== 0);
printf("------------- ");
printf("店舗:%s(県:%s、地区:%s)\n",hokansyo,hokanchu,hokandai);
printf("小計= %d\n",syokei);
chukei += syokei;
} while (strcmp(chu,hokanchu)== 0 && strcmp(dai,hokandai)== 0);
printf("============= ");
printf("県別:%s(地区:%s)\n",hokanchu,hokandai);
printf("中計= %d\n",chukei);
printf("=============\n");
daikei += chukei;
} while (strcmp(dai,hokandai)== 0);
printf("************* ");
printf("地区別:%s\n",hokandai);
printf("大計= %d\n",daikei);
printf("*************\n");
soukei += daikei;
}
printf("+++++++++++++\n");
printf("全店総計 = %d\n",soukei);
fclose(fin);
return 0;
}
"algo6.dat" というファイル名で以下の14行のデータを入れたファイルを作成せよ。
このデータ・ファイルは上記のプログラムで読みこまれる。
01 10 123 1000
01 10 123 2000
01 10 200 2000
01 10 200 5000
01 10 200 6000
01 11 100 2000
01 11 100 4000
01 11 100 5000
01 11 200 1000
01 11 200 2000
02 25 100 2000
02 25 100 3000
02 26 200 1000
02 26 200 5000