- 締切済み
C言語の穴埋め問題です
次のプログラムは、初期化により文字列を定義し、辞書式配列にしたとき、どの文字列が先頭にくるかを調べるプログラムなのですが。■■■を教えてください #include <stdio.h> #include <string.h> #define N 5 //関数のプロトタイプ宣言 char *min(char *p[] , int n); int main(void) { char *p[N] = {"Hello" , "Hi" , "Happy" , "HaHaHa" , "Heaven"}; printf("辞書式配列で先頭となる文字列は%s\n" , ■■■); } char *min(char *p[] , int n) { int min; //最小値のアドレス Int i; //カウンタ min = 0; for(i = 1; i < n; i++){ if (strcmp(■■■ , ■■■) > 0){ ■■■= ■■■; } } return ■■■; }
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- szkbksn
- ベストアンサー率0% (0/0)
内容としては----以下のとおりです ・関数minはp[min]=最小となる文字列へのポインタを返すのでprintfの%sにそのまま渡します ・変数minが、最小となる要素へのインデックスを覚えておくので、 strcmp(p[min] , p[i]) でp[i]の方が小さければ、 min=i で最小インデックスminをiに更新します ---- #include <stdio.h> #include <string.h> #define N 5 //関数のプロトタイプ宣言 char *min(char *p[] , int n); int main(void) { char *p[N] = {"Hello" , "Hi" , "Happy" , "HaHaHa" , "Heaven"}; printf("辞書式配列で先頭となる文字列は%s\n" , min(p, N)); } char *min(char *p[] , int n) { int min; //最小値のアドレス int i; //カウンタ min = 0; for(i = 1; i < n; i++){ if (strcmp(p[min] , p[i]) > 0){ min=i; } } return p[min]; }
- jacta
- ベストアンサー率26% (845/3158)
> 辞書式配列 というのがよくわかりませんが、strcmp関数では単純比較しかできませんので違うように思います。 strxfrm関数で変換してから比較するのかもしれませんが、この穴埋めではsetlocaleを呼び出すのは無理があります(関数を無理やり呼ぶことはできますが、<locale.h>をインクルードできないので、LC_COLLATEまたはLC_ALLの定義が得られません)。 どうすべきなのかをもう少し明確にしてください。
- hitomura
- ベストアンサー率48% (325/664)
#1ですが、さすがに答を直書きでは問題ですよね? というわけで、きちんと先頭を探すプログラムを書きます。 (i) 配列を破壊しないもの 最初の■■■: (strcmp(a[0], a[1]) < 0) ? (strcmp(a[0], a[2]) < 0) ? (strcmp(a[0], a[3]) < 0) ? (strcmp(a[0], a[4]) < 0) ? a[0] : a[4] : (strcmp(a[3], a[4]) < 0) ? a[3] : a[4] : (strcmp(a[2], a[3]) < 0) ? (strcmp(a[2], a[4]) < 0) ? a[2] : a[4] : (strcmp(a[3], a[4]) < 0) ? a[3] : a[4] : (strcmp(a[1], a[2]) < 0) ? (strcmp(a[1], a[3]) < 0) ? (strcmp(a[1], a[4]) < 0) ? a[1] : a[4] : (strcmp(a[3], a[4]) < 0) ? a[3] : a[4] : (strcmp(a[2], a[3]) < 0) ? (strcmp(a[2], a[4]) < 0) ? a[2] : a[4] : (strcmp(a[3], a[4]) < 0) ? a[3] : a[4] 後の■■■:前回の回答と同じ (ii) 配列を破壊するもの 最初の■■■: ( (a[0] = (strcmp(a[0], a[1]) < 0) ? a[0] : a[1]), (a[0] = (strcmp(a[0], a[2]) < 0) ? a[0] : a[2]), (a[0] = (strcmp(a[0], a[3]) < 0) ? a[0] : a[3]), (a[0] = (strcmp(a[0], a[4]) < 0) ? a[0] : a[4]), a[0] ) 後の■■■:前回の回答と同じ 代わりに宿題です。上で何をやっているのか説明しなさい。
- jjon-com
- ベストアンサー率61% (1599/2592)
C/C++の宿題片付けます 154代目 http://hibari.2ch.net/test/read.cgi/tech/1322562648/1-2 Java の宿題ここで答えます Part 71 http://toro.2ch.net/test/read.cgi/tech/1309076891/1-2
- hitomura
- ベストアンサー率48% (325/664)
#include <stdio.h> #include <string.h> #define N 5 //関数のプロトタイプ宣言 char *min(char *p[] , int n); int main(void) { char *p[N] = {"Hello" , "Hi" , "Happy" , "HaHaHa" , "Heaven"}; printf("辞書式配列で先頭となる文字列は%s\n" , p[3]); } char *min(char *p[] , int n) { int min; //最小値のアドレス Int i; //カウンタ min = 0; for(i = 1; i < n; i++){ if (strcmp("" , "") > 0){ min= min; } } return NULL; } 宿題のようなので、真面目な答えは自分で考えましょう。