• 締切済み

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 ■■■; }

みんなの回答

  • szkbksn
  • ベストアンサー率0% (0/0)
回答No.5

内容としては----以下のとおりです ・関数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)
回答No.4

> 辞書式配列 というのがよくわかりませんが、strcmp関数では単純比較しかできませんので違うように思います。 strxfrm関数で変換してから比較するのかもしれませんが、この穴埋めではsetlocaleを呼び出すのは無理があります(関数を無理やり呼ぶことはできますが、<locale.h>をインクルードできないので、LC_COLLATEまたはLC_ALLの定義が得られません)。 どうすべきなのかをもう少し明確にしてください。

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.3

#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)
回答No.2

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)
回答No.1

#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; } 宿題のようなので、真面目な答えは自分で考えましょう。

関連するQ&A

  • C言語の穴埋め問題です

    配列に初期化されたデータの中から最小値を求めるプログラムなのですが、■■■を教えて頂けないでしょうか? #include <stdio.h> #define N 5 //関数のプロトタイプ宣言 int min(int *p , int n); int main(void) { int data[N] = {15,34,28,12,33}; printf("最小値は%d\n" , ■■■); } int min(int *p , int n) { int min; //最小値 int i; //カウンタ min = *p; for(i = 1 , ■■■; i < n; i++ , ■■■){ if (min >■■■ ){ min =■■■ ; } } return ■■■; }

  • C言語でわからない問題があります

    下のプログラムのXXXの値なのですが、何を返すのかがわかりません プログラム(1)と(2)では、処理にどういう違いがあるのでしょうか、できれば教えてください プログラム(1) #include <stdio.h> #define N 5 //関数のプロトタイプ宣言 int min(int *p , int n); int main(void){ int data[N] = {15,34,28,12,33}; int index; //最小値の位置 index = min(data,N); printf("最小値はdata[%d]で%d\n" , index, data[index]); } int min(int *p , int n){ int *pmin; //最小値のアドレス int i; //カウンタ pmin = p; for(i = 1; i < n; i++){ if (*pmin > *(p+i)){ pmin = p+i; } } return XXX; } プログラム(2) #include <stdio.h> #define N 5 //関数のプロトタイプ宣言 int *min(int *p , int n); int main(void){ int data[N] = {15,34,28,12,33}; int *p; //最小値の位置 p = min(data,N); printf("最小値は%d\n" , *p); } int *min(int *p , int n){ int *pmin; //最小値のアドレス int i; //カウンタ pmin = p; for(i = 1; i < n; i++){ if (*pmin > *(p+i)){ pimn = p+i; } } return pmin; }

  • C言語のプログラムでおかしな動作をするのですが教えて頂けないでしょうか?

    VisualStudio2008使用しています。 問題は、サイコロを200回振ってその出た目の数の個数分*を表示するプログラムです。 サイコロの目はランダムで出しています。 次のプログラムは正常に動作するものです。 /* #include <stdio.h> #include<stdlib.h> #include<time.h> #define N 200 int DICE(int min,int max); int main() { int n,i,j; int y[7]={0}; srand((unsigned int)time(NULL)); for(i=0;i<N;i++){ n=DICE(1,6); y[n]++; } for(i=1;i<7;i++){ printf(" %2d: ",i); for(j=0;j<y[i];j++){ printf("*"); } printf("\n"); } return 0; } int DICE(int min,int max) { return min+(int)(rand()*(max-min+1.0)/(1.0+RAND_MAX)); } */ 次のプログラムが問題で、授業で先生が配列にはstaticをおまじないとしてつけないと暴走すると言われたので、つけて見ると明らかに間違ってると思われるプログラムで動作するのですが原因を教えて頂けないでしょうか? 以下問題のプログラム! 配列の前にstaticをつけたら、添え字をいくつにしても正常に動作します。普通は添え自分しか領域って確保されないですよね??? /* #include <stdio.h> #include<stdlib.h> #include<time.h> #define N 200 int DICE(int min,int max); int main() { int n,i,j; //以下が問題の配列宣言 static int y[2]={0}; srand((unsigned int)time(NULL)); for(i=0;i<N;i++){ n=DICE(1,6); y[n]++; } for(i=1;i<7;i++){ printf(" %2d: ",i); for(j=0;j<y[i];j++){ printf("*"); } printf("\n"); } return 0; } int DICE(int min,int max) { return min+(int)(rand()*(max-min+1.0)/(1.0+RAND_MAX)); } 質問の意味が正確に伝わらなかった場合は補足しますので、ご回答よろしくお願いします。

  • C言語の問題です!!

    すみません。 詳細表示をする際に、未ソート部の先頭要素の上に記号文字「*」を表示し、未ソート部の最小要素の上に記号文字「+」を表示したいと思い、以下のソースプログラムを作成したのですが、結果が何か違う気がします…。どこが違うのか、教えていただけませんか? また、プログラムを修正していただけませんか? #include<stdio.h> #include<stdlib.h> #include<time.h> #define swap(type,x,y) do{type t=x;x=y;y=t;}while(0) /*--- 単純選択ソート ---*/ void selection(int a[], int n) { int i, j,k,flg; char *disp[]={" ","[* ]","[ +]","[*+]"}; for (i = 0; i < n - 1; i++) { int min = i; for (j = i + 1; j < n; j++) { if (a[min] > a[j]) { min = j; } } for (k = 0; k < n; k++) { flg=0; if(k==i) flg|=1; if(k==min) flg|=2; printf("%s",disp[flg]); } printf("\n"); for (k = 0; k < n; k++) printf("[%2d]", a[k]); printf("\n"); swap(int, a[i], a[min]); } } int main(void) { int i, nx; int *x; printf("要素数 : "); scanf("%d", &nx); x = calloc(nx, sizeof(int)); srand(time(NULL)); for (i = 0; i < nx; i++) { x[i] = rand() % 100; printf("x[%d] = %d\n", i, x[i]); } selection(x, nx); for (i = 0; i < nx; i++) printf("x[%d] = %d\n", i, x[i]); free(x); return 0; }

  • C言語の問題で困っています。

    C言語の問題で困っています。 途中までできたのですが、この先が分かりません。 教えて頂くようお願いいたします。 【問題】 文字列の長さを求めるプログラムです。このプログラムを、入力した文字列の文字列長を求めるように変更してみましょう。  ただし、入力する文字列は半角で最大 20 文字までとし、指定された範囲外の値( 21 以上)が入力された場合は、正しい値が入力されるまで入力処理を繰り返すこと。 #include <stdio.h> int main(void) { char str[256] = "Hello"; int length, i; printf("文字列:"); scanf ("%s",str); length=0; i=0; while (str[i]!='\0') { i++; length++; } printf("\n文字列長:%d\n",length); }

  • C言語のプログラムを見てください

    ある100行の値がx列、y列の2列あるファイルを読み込んでそれを配列に入れ、yの最小値及びそれと同じ行にあるxの値を表示するプログラムを書きたいのですがy列の最小値を表示するプログラムを書き終えた所でコンパイルして実行してみると正しく値が表示されませんでした。それどころか実行するたびに値が変わってしまいます。どこがおかしいのかわからないため、ご指摘のほどよろしくお願いします。また、できれば同じ行にあるx列の値も表示させるプログラムを教えてください。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #define N 100 int main(void) { int x[N],i; double y[N],min; FILE *fp; fp=fopen("book.dat","r"); if(fp==NULL){ puts("can't open file!"); exit(-1); } for(i=0;i<N;i++){ fscanf(fp,"%d %lf", &x[N],&y[N]); printf("x=%d\n y=%lf\n",x[N],y[N]); } min=y[0]; for(i=1;i<N;i++){ if(y[i]<min) min=y[i]; } fclose(fp); printf("最小値:%lf\n",min); return 0; }

  • この問題を教えてください

    配列に初期化されたデータの最小値を求めるプログラムなのですが この問題のX,Yの部分がわかりません 教えて頂けないでしょうか? #include <stdio.h> #define N 5 //関数のプロトタイプ宣言 int min(int *p , int n); int main(void) { int data[N] = {15,34,28,12,33}; printf("最小値は%d\n" ,X); } int min(int *p , int n) { int min; //最小値 int i; //カウンタ min = *p; for(i = 1; i < n; i++){ if (min >Y ){ min = Y; } } return min; }

  • C言語 ポインタの問題

    プログラミング初心者です #include <stdio.h> #include <stdlib.h> #include <time.h> void shuffle(int *values, int n) { // 配列の最後尾から 1 番目の要素までループする (ループ変数を i とする) // 0 以上 i 以下の int 型の乱数を1つ得る (変数 j とする) // 配列の i 番目の要素と j 番目の要素を入れ替える } void int(int *values, int n) { // 0 〜 n - 1 の昇順の値を持つ配列を作成 } void print_values(int *values, int n) { } int main(int argc, char const *argv[]) { int num_test = 5; int values[10]; int n = sizeof(values) / sizeof(values[0]); srand(time(NULL)); for (int i = 0; i < num_test; i++) { printf("test: %d\n", i); init(values, n); print_values(values, n); shuffle(values, n); print_values(values, n); } return 0; } 実行結果 乱数に従いシャッフルするため,実行ごとに実行結果は変化する. test: 0 0123456789 8675912043 test: 1 0123456789 3908671452 test: 2 0123456789 4201735968 test: 3 0123456789 5378029164 test: 4 0123456789 7839025164 上の雛形を使って配列のシャッフルをするプログラムを書く問題なのですがよくわからないのですが教えて頂けると幸いです。

  • strrchrについて【C言語】

    このプログラムのp-strの部分は具体的にはどの様な計算をしているのでしょうか?? (xx-xxというふうに) あとint c は char c としなくても良いのでしょうか?? どなたかご教授よろしくお願いいたします<(_ _)> #include <string.h> #include <stdio.h> int main(void) { char str[]= "abcdefghijklmnabcdefghijklmn", *p; int c; printf("検索文字を入力してください。"); c = getchar(); p = strrchr(str, c); if (p != NULL) { printf("%cは文字列の%d番目にあります。\n", c, p-str); printf("以降の文字列は%sです。\n", p); } else printf("%cは見つかりませんでした\n", c); return 0; } 【実行結果例】 検索文字を入力してください。d dは文字列の17番目にあります。 以降の文字列はdefghijklmnです。

  • 【至急】C言語のプログラミングについての質問です。

    【至急】C言語のプログラミングについての質問です。 以下の5問の解答をお願い致します。 問1. サイズ3の2つの配列の和、差、内積を出力するプログラムを作成してください。 問2. m+1*n+1行列の配列aの 各行ごとの合計 gyouwa[i] i=0,1,・・・,m 各列ごとの合計 retuwa[i] i=0,1,・・・,n を計算するプログラムを作作成してください。 また、 各行内での最大値 aimax[i] i=0,1,・・・,m 各列内での最大値 ajmax[i] i=0,1,・・・,n を求めるプログラムを作成してください。 問3. 下のプログラムの[____]を埋めてください。ヒント:a,p,*p,p++,p=a,*p=a,*p++,(*p)++のいずれかが入ります。 #include<stadio.h> int main(void) { int a[5]={1,2,34,5,}; int i,+p; [____]; prntf("先頭のアドレスは%dです。\n",p); for(i=0;i<5;i++){ prntf("アドレス%dに%dが格納されています。\n"[____],[____]); [___]; } return0; } 問4. 下のプログラムの[____]を埋めてください。ヒント:p,*p,p=a,p=a[0],*p++,(*p)++のいずれかが入ります。 #include<stadio.h> int main(void) { int i; char *a[5],*p; a[0]="Hello"; a[1]="Good morning"; a[2]="Good evening"; a[3]="Good night"; a[4]="Bye Bye"; [____]; for(i=0;i<50;i++){ prntf("アドレス%dに%cが格納されています。\n"[____],[____]); [___]; } return0; } 問5. まず3つの整数知値(たとえば2,3,1)を書いたfile1という名前のテキストファイルを作成してください。 数値をカンマ(,)で区切って並べることで、複数の変数をfscanfで読み込むことが可能(CVS形式)となります。 このファイルから数値を読み込み、合計をファイルfile2に書き込むプログラムkaitou.cを作成してください。

専門家に質問してみよう