[04a1] 数の連続1

正の整数を次々にscanfで入力し、最後に0が入力されたら、その正の整 数(最後の0は除く)を「その回数だけ」出力するプログラムを作成せよ。 たとえば「2 1 3 0」であれば「2 2 1 3 3 3」を出力する(プログラム では1行に1個ずつ書式文字列 "%d\n" により出力する)。最後の0が入力 されるまで出力を始めてはならない。ただし配列機能は使わないこと。 そのかわり、次のヘッダファイルiqueue.hが提供するキュー機能を呼び 出して用いる。出力される数の個数は100に満たないものとする。

// iqueue.h
#include <stdbool.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;
}

プログラムでは下請け関数は用いないこと。

記号列 

コード 

選択肢

ア #include "iqueue.h"
イ #include <stdbool.h>
ウ #include <stdio.h>
エ int main(void) {
オ }
カ return 0;
キ int i, k, n;
ク iqueuep q = iqueue_new(100);
ケ for(k = 0; k < i; ++k) {
コ for(k = 0; k <= i; ++k) {
サ for(k = 0; k < n; ++k) {
シ for(k = 0; k <= n; ++k) {
ス for(n = 1; !iqueue_isempty(q); ++n) {
セ for(n = 1; ; ++n) {
ソ while(!iqueue_isempty(q)) {
タ while(true) {
チ if(i == 0) { break; }
ツ iqueue_enq(q, i);
テ i = iqueue_deq(q);
ト printf("%d\n", i);
ナ printf("i> "); scanf("%d", &i);

選択肢の行をドラグして上のコード領域に配置してください。 コード領域の行はドラグにより位置が変更できます。 削除したい場合は選択肢の領域に戻してください。