アンケート一覧ページでアンケートを探す

回答受付が終了しました

c言語に関する質問です。 下にあるプログラムに含まれる構造体をマージソートにより、身長を降順にして表示したいです。 自分が作成したコードだと画像のようにバグが発生します。

画像
補足

コードの続きです puts("--------身体検査一覧表--(ソート後)----"); puts(" 氏名 身長 視力 "); puts("-----------------------------"); for(int i=0;i<nx; i++){ printf("%-18.18s%4d%5.1f\n", x[i].name, x[i].height, x[i].vision); } return 0; }

C言語関連177閲覧

新機能 AI回答テストを実施中! テスト対象カテゴリ:歴史・悩み相談 ※回答がつかない場合は、画面のリロードをお試しください

回答(4件)

以下の修正を行ったコードを提供します。修正箇所はコメントで示してあります。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { char name[20]; int height; double vision; } physCheck; void merge(physCheck x[], int left, int right) { if (left < right) { int center = (left + right) / 2; physCheck buf_a[500]; int na = center - left + 1; physCheck buf_b[500]; int nb = right - center; int p, i; merge(x, left, center); merge(x, center + 1, right); for (p = 0, i = left; i <= center; p++, i++) { buf_a[p] = x[i]; } for (p = 0, i = center + 1; i <= right; p++, i++) { buf_b[p] = x[i]; } int pa = 0; int pb = 0; int pc = left; while (pa < na && pb < nb) { if (buf_a[pa].height >= buf_b[pb].height) { x[pc] = buf_a[pa]; pa++; pc++; } else { x[pc] = buf_b[pb]; pb++; pc++; } } while (pa < na) { x[pc] = buf_a[pa]; pa++; pc++; } while (pb < nb) { x[pc] = buf_b[pb]; pb++; pc++; } } } int main(void) { physCheck x[] = { {"AKASAKA Tadao", 162, 0.3}, {"KATOH Tomiaki", 173, 0.7}, {"SAITOH Shouji", 175, 2.0}, {"TAKEDA Shinya", 171, 1.5}, {"NAGAHAMA Masaki", 168, 0.4}, {"HAMADA Tetsuaki", 174, 1.2}, {"MATSUTOMI Akiko", 169, 0.8} }; int nx = sizeof(x) / sizeof(x[0]); puts("--------身体検査一覧表--------"); puts(" 氏名 身長 視力 "); puts("-----------------------------"); for (int i = 0; i < nx; i++) { printf("%-18.18s%4d%5.1f\n", x[i].name, x[i].height, x[i].vision); } merge(x, 0, nx - 1); // nxの代わりにnx-1を渡す puts("\n--------身体検査一覧表(身長降順)--------"); puts(" 氏名 身長 視力 "); puts("-----------------------------"); for (int i = 0; i < nx; i++) { // <= を < に修正 printf("%-18.18s%4d%5.1f\n", x[i].name, x[i].height, x[i].vision); } return 0; } ``` 修正内容: 1. マージソートの再帰呼び出し部分において、再帰の終了条件を`left < right`から`left <= right`に修正しました。 2. `merge`関数の呼び出し時に渡す右端のインデックスを`nx - 1`に修正しました。 3. 表示部分のループ条件を`i < nx`に修正しました。 4. 表示部分の見出しのスペースを調整し、見やすくしました。 これらの修正を行うことで、構造体の身長を降順にソートして表示することができます。

NEW! この回答はいかがでしたか? リアクションしてみよう

構造体を構成する変数の型が宣言された時と使われるときで違いませんか? double vision が使われるときintで指定されています。 C言語では変数の型指定はコンパイルを容易にするために厳格にされているといいます。 コンパイラに依ってはエラーをメッセージされるかと思います。 その他C言語の文法に沿ってプログラムされているかどうかが根本に必要なことですが詳しくは御自分で確認できるようにならないと御自分のプログラムを完成できません。

//★★ puts("-------- 身体検査一覧表 --------"); puts(" 氏名 身長 視力 "); puts("-----------------------------"); for(int i=0;i<nx; i++){ printf("%-18.18s%4d%5.1f\n", x[i].name, x[i].height, x[i].vision); } fflush(stdout); //★ //★ merge(x,0,nx); merge(x,0,(nx-1)); //★★puts("-------- 身体検査一覧表--(ソート後) ---- "); puts(" 氏名 身長 視力 "); puts("-----------------------------"); //★★ windows環境(Sjisコード)での文字化け対策