#include <stdio.h> #include <string.h> #include <stdlib.h> #include <limits.h> #define MAX 10 #define NAME_LEN 20 /*--- 身体データ型 ---*/ typedef struct{ int height; /* 身長 */ double vision; /* 視力 */ } Body ; /*--- 身体検査データ型 ---*/ typedef struct{ char *name; /* 氏名 */ Body body; /* 身体データ型 ---*/ } PhysCheck ; /*--- 身体検査データ型スタックを実現する構造体 ---*/ typedef struct { int max; /* スタックの容量 */ int ptr; /* スタックポインタ */ char **que; /* スタック本体(char* へのポインタ配列 )*/ } PhysCheckStack; /*--- キューを実現する構造体 ---*/ typedef struct { int max; /*キューの容量*/ int num; /*現在の要素数*/ int front; /*先頭要素のカーソル*/ int rear; /*末尾要素のカーソル*/ int *que; /*キュー本体*/ }IntQueue; /*--- Boyer-Moore 法による文字列探索 ---*/ char *bm_match(char *pat , char *txt){ char *pt; /* txt をなぞるカーソル */ char *pp; /* pat をなぞるカーソル */ int txt_len = strlen(txt); /* txt の文字数 */ int pat_len = strlen(pat); /* pat の文字数 */ int skip[UCHAR_MAX + 1]; /* スキップテーブル */ int i; for (i = 0; i <= UCHAR_MAX; i++) /* スキップテーブルの作成 */ skip[i] = pat_len; for (pp = pat; *pp != '\0'; pp++) skip[*pp] = strlen(pp) - 1; skip[*(pp - 1)] = pat_len; /* パターンの最後文字の移動距離はパターンの文字数 */ pt = txt + pat_len - 1; /* pat の末尾と比較する txt の文字を決定 */ while ( pt < txt + txt_len) { /* txt の比較する文字の位置が txt の末尾を越えるまで */ pp = pat + pat_len - 1; /* pat の最後の文字に着目 */ while (*pt == *pp) { if (pp == pat) return pt; /* 一致した文字がパターンの最初の文字になれば終了 */ pp--; pt--; } pt += (skip[*pt]> strlen(pp)) ? skip[*pt] : strlen(pp); } return NULL; } /*--- キューの初期化 ---*/ int Initialize(IntQueue *q, int max){ q->num = q->front = q->rear =0; if ((q->que = calloc(max, sizeof(int))) == NULL) { /*stk=que ?? char*=int ??*/ q->max = 0; /* 配列の確保に失敗 */ return -1; } /* 配列の確保に成功 */ q->max = max; return 0; } /*--- キューにデータをエンキュー ---*/ int Enque(IntQueue *q, int x){ if (q->num >= q->max) return -1; /* スタック満杯 */ else{ q->num++; q->que[q->rear++] = x; if(q->rear == q->max) q->rear = 0; return 0; } } /*---キューからデータをデキュー ---*/ int Deque(IntQueue *q, int *x){ if (q->num <= 0) return -1; /* キューは空 */ else{ q->num--; *x = q->que[q->front++]; if(q->front == q->max) q->front = 0; return 0; } } /*--- キューからデータをピーク ---*/ int Peek(const IntQueue *q, int *x){ if (q->num <= 0) return -1; *x = q->que[q->front]; return 0; } /*--- キューの容量 ---*/ int Capacity(const IntQueue *q){ return q->max; } /*--- キューに積まれているデータ数 ---*/ int Size(const IntQueue *q){ return q->num; } /*--- 身体検査データを1つ表示 ---*/ void OneDataPrint(const IntQueue *q){ ➀ printf("%-18.18s%4d%5.1f\n", x->que, x->body.height, x-> body.vision); ➁ } /*--- キューの全データの表示 ---*/ void Print(const IntQueue *q){ int i; for(i = 0; i < q->num; i++) OneDataPrint(q->que+i); putchar('\n'); } /*--- スタックのデータにあるパターンの表示とその数を数える ---*/ int Search(IntQueue *q, int x){ int i, last, num = 0; char *txt, *pat = x->name; ➂ for(i = 0; i < q->num; i++){ /* 底から頂上へ */ txt = q->que[i].name; while((txt = bm_match(pat, txt)) != NULL){ num ++; txt ++; last = i; } } if (num > 0) OneDataPrint(q->que + last); return num; } int main(void){ IntQueue que; if(Initialize(&que, MAX)== -1){ puts("キューの生成に失敗しました。"); return 1; } Initialize(&s, MAX); while (1) { int menu, num; printf("現在のデータ数:%d/%d\n",Size(&que), Capacity(&que)); printf("(1) エンキュー (2)デキュー (3) ピーク (4) 表示 (5)探索 (0) 終了:"); scanf("%d", &menu); if (menu == 0) break; switch (menu) { case 1: /* エンキュー */ printf("名前: "); scanf("%s", x.name); printf("身長: "); scanf("%d", &(x.body.height)); printf("視力: "); scanf("%lf", &(x.body.vision)); if (Enque(&que, x) == -1) puts("\a エラー:エンキューに失敗しました。\n"); break; case 2: /* デキュー */ if (Deque(&que, &x) == -1) puts("\a エラー:デキューに失敗しました。\n"); else{ printf("デキューしたデータは,"); OneDataPrint(&x); } break; case 3: /* ピーク */ if (Peek(&que, &x) == -1) puts("\a エラー:ピークに失敗しました。\n"); else{ printf("ピークしたデータは,"); OneDataPrint(&x); } break; case 4: /* 表示 */ Print(&que); break; case 5: /* 検索 */ printf("探す名前:"); scanf("%s", x.name); if ((num = Search(&que, &x)) >0) printf("名前に含まれるパターン数は,%d 個です,\n",num); else{ puts("\a エラー:パターンは存在しません。\n "); } break; } } Terminate(&que); return 0; }
動的スタックのプログラムを,動的なキューに変更したプログラムに変更したく上記のように書き換えたのですが、➀➁➂でエラーが生じてしまいます。解決方法が分からないです。
①でのエラーは
Main.c:110:35: note: passing argument to parameter 'q' here
②でのエラーは
Main.c:111:31: error: use of undeclared identifier 'x'
printf("%-18.18s%4d%5.1f\n", x->que, x->body.height, x-> body.vision);
Main.c:111:39: error: use of undeclared identifier 'x'
printf("%-18.18s%4d%5.1f\n", x->que, x->body.height, x-> body.vision);
Main.c:111:55: error: use of undeclared identifier 'x'
printf("%-18.18s%4d%5.1f\n", x->que, x->body.height, x-> body.vision);
③でのエラーが
Main.c:124:23: error: member reference type 'int' is not a pointer char *txt, *pat = x->name;
あなたの回答
tips
プレビュー