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

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

新規登録して質問してみよう
ただいま回答率
85.44%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

623閲覧

線形探索と構造体配列について

Takumi092519191

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2023/05/01 01:01

実現したいこと

身長を入力して、該当するものがあれば'*'をつけるというプログラムを作りたい。
ここに実現したいことを箇条書きで書いてください。

  • ▲▲機能を動作するようにする

前提

ここに質問の内容を詳しく書いてください。
1つ目の部分までしかいかなくて175などの1つ目以降の値を読み取ってくれない。171と入力したら、2つ'*'が表示されるプログラムを作りたいが、そこの部分がわからない。
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

ソースコード ```/* 構造体配列を線形探索 */ #include <stdio.h> /*--- 身体検査データ型 ---*/ typedef struct { char name[20]; /* 氏名 */ int height; /* 身長 */ double vision; /* 視力 */ int weight; /* 体重 */ char flag; /* 発見フラグ(発見時に「*」を代入) */ } PhysCheck; /* * 要素数「n」の構造体配列「a」から構造体メンバ「height」が探索キー「key」と一致する要素を線形探索 * 見つかった場合は「1」、見つからなかった場合は「0」を返却すること(つまり、見つかった場合は「result」に「1」を代入) */ int search(PhysCheck a[], int n, int key){ int i, result = 0; /* この部分を実装せよ ↓(ここから) */ for(i = 0; i < n; i++){ if(a[i].height == key){ a[i].flag = '*'; result = 1; } return result; } } int main(void) { int i, nx, ky, idx; PhysCheck x[] = { {"AKASAKA Tadao", 171, 0.3, 50,' '}, {"KATOH Tomiaki", 173, 0.7, 75,' '}, {"SAITOH Syouji", 175, 2.0, 95,' '}, {"TAKEDA Shinya", 171, 1.5, 60,' '}, {"NAGAHAMA Masaki", 168, 0.4, 55,' '}, {"HAMADA Tetsuaki", 174, 1.2, 100,' '}, {"MATSUTOMI Akio", 169, 0.8, 88,' '} }; nx = (sizeof(x) / sizeof(x[0])); /* 人数 */ puts("■□■ 身体検査一覧表 ■□■"); puts(" 氏名 身長 視力 体重"); puts("----------------------------------"); for (i = 0; i < nx; i++){ printf("%-18.18s%4d%5.1f%5d\n", x[i].name, x[i].height, x[i].vision, x[i].weight); } printf("\n探す値(身長) : "); scanf("%d", &ky); idx = search(x, nx, ky); /* 配列xから値がkyである要素を線形探索 */ puts(""); if (idx == 0){ puts("一致するデータは存在しません。"); }else{ puts("■□■ 身体検査一覧表(探索結果) ■□■"); puts(" 氏名 身長 視力 体重 一致"); puts("----------------------------------------"); for (i = 0; i < nx; i++){ printf("%-18.18s%4d%5.1f%5d%6c\n", x[i].name, x[i].height, x[i].vision, x[i].weight, x[i].flag); } } return 0; } ### 試したこと ここに問題に対して試したことを記載してください。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2023/05/01 01:19

実行時の出力内容を提示しよう
guest

回答2

0

ベストアンサー

search関数のreturnの位置が適切ではありません。
forの中でreturnしているため、ループの一回目で関数から出てしまいます。
正しくは以下です。

C

1int search(PhysCheck a[], int n, int key){ 2 int i, result = 0; 3 4 /* この部分を実装せよ ↓(ここから) */ 5 6 for(i = 0; i < n; i++){ 7 if (a[i].height == key) { 8 a[i].flag = '*'; 9 result = 1; 10 } 11 } 12 return result; //変更点 13}

投稿2023/05/01 01:30

ALOHAMS

総合スコア195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

searchを以下のように変えてください。
{}のインデントをきちんと書くと、違いが判るかと。

C

1int search(PhysCheck a[], int n, int key) 2{ 3 int i, result = 0; 4 5 /* この部分を実装せよ ↓(ここから) */ 6 7 for (i = 0; i < n; i++) { 8 if (a[i].height == key) { 9 a[i].flag = '*'; 10 result = 1; 11 } 12 } 13 return result; 14} 15

投稿2023/05/01 01:26

tatsu99

総合スコア5487

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問