正の整数を次々に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);
|
選択肢の行をドラグして上のコード領域に配置してください。 コード領域の行はドラグにより位置が変更できます。 削除したい場合は選択肢の領域に戻してください。