質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.48%

キューに変更したプログラムの書き方

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 429

score 1

#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;

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • K_3578

    2021/05/31 17:39

    Javaタグ← Cとかじゃないの?

    ソースコードはMarkDownのcode機能でブロック化してご提示ください。

    キャンセル

  • y_waiwai

    2021/05/31 17:44 編集

    このままではコードが見づらいので、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください

    また、エラーが出たなら、エラーメッセージを提示しましょう
    エラーメッセージは、いらぬ翻訳省略しないで、出たそのママをコピペで提示してください

    キャンセル

  • 退会済みユーザー

    2021/06/01 09:38

    複数のユーザーから「意図的に内容が抹消された質問」という意見がありました
    解決後に編集機能を用いて質問内容を改変し関係のない内容にしたり、内容を削除する行為は禁止しています。
    投稿していただいた質問は、後に他の誰かが困ったときに助けになる情報資産になると考えるからです。
    「質問を編集する」ボタンから編集を行い、他のユーザにも質問内容が見えるように修正してください。

  • 退会済みユーザー

    2021/06/01 17:07

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る