正の整数を次々にscanfで入力し、最後に0が入力されたら、その正の整 数(最後の0は除く)を「N番目の数はN回繰り返して」出力するプログラ ムを作成せよ。たとえば「2 3 1 0」であれば「2 3 3 1 1 1」を出力す る(プログラムでは1行に1個ずつ書式文字列 "%d\n" により出力する)。 最後の0が入力されるまで出力を始めてはならない。ただし配列機能は 使わないこと。そのかわり、次のヘッダファイルiqueue.hが提供する キュー機能を呼び出して用いる。出力される数の個数は100に満たない ものとする。
// iqueue.h #include <stdbol.h> struct iqueue; typedef struct iqueue *iqueuep; iqueuep iqueue_new(int size); bool iqueue_isempty(iqueuep p); bool iqueue_isfull(iqueuep p); void iqueue_enq(iqueuep p, int v); int iqueue_deq(iqueuep p);
参考までに、テキストに載っている実装を示す。
// iqueue.c --- int type queue impl. with array #include <stdlib.h> #include "iqueue.h" struct iqueue { int ip, op, size; int *arr; }; iqueuep iqueue_new(int size) { iqueuep p = (iqueuep)malloc(sizeof(struct iqueue)); p->ip = p->op = 0; p->size = size; p->arr = (int*)malloc(size * sizeof(int)); return p; } bool iqueue_isempty(iqueuep p) { return p->ip == p->op; } bool iqueue_isfull(iqueuep p) { return (p->ip+1)%p->size == p->op; } void iqueue_enq(iqueuep p, int v) { p->arr[p->ip++] = v; if(p->ip > p->size) { p->ip = 0; } } int iqueue_deq(iqueuep p) { int v = p->arr[p->op++]; if(p->op > p->size) { p->op = 0; } return v; }
プログラムでは下請け関数は用いないこと。