C言語配列の問題について

このQ&Aのポイント
  • C言語配列の問題について解説します。重複している数値を表示するプログラムの解説不足について詳しく説明します。
  • プログラムは10個の数値を入力させ、重複している数値を認識するものです。具体的には、match==i[k]という処理を使い、重複を検出しています。
  • プログラムの流れとしては、まず10個の数値を入力し、それぞれの数字について他の数字と比較し、重複があれば表示します。
回答を見る
  • ベストアンサー

c言語配列の問題について

c言語配列の問題について 以下のプログラムは10個の数値を入力させ重複している文字を表示するプログラムですが match==i[k]でどの様に重複した数値を認識しているのかが解説不足で理解できません。 どの様に処理されているのか詳しく解説できる方がいましたらご教授願います。 #include <stdio.h> int main(void) { int i[10],j,k,match; printf("10個の数字を入力して下さい"); for(j=0;j<10;j++) scanf("%d",&i[j]); for(j=0;j<10;j++){ match=i[j]; for(k=j+1;k<10;k++) if(match==i[k]) printf("%dが重複しています\n",match); } return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

 最初にmatchに1個数字を取り出して、その数字より配列の後ろに同じ数字が無いか順番に1個ずつ調べてるだけです。これを1番目の数字から10番目の数字まで繰り返してるのです。なぜ、その数字より後ろしか調べてないかというと、前にある数字はその数字を調べる前にすでに調べてるからです。  いきなり10個から考えずに、3個とかの場合から考えてみたら分かりやすいと思います。 配列に1、2、1が入ってる場合 (1)1個目 (match = 1)   ・2個目を調べる (match != 2)   ・3個目を調べる (match == 1) -> 表示 (2)2個目 (match = 2)   (1個目と2個目はすでに(1)で調べてる)   ・3個目を調べる (match != 1) (3)3個目 (match = 1)   (1個目と3個目はすでに(1)で調べてる)   (2個目と3個目はすでに(2)で調べてる) 終わり   

smokerls3930
質問者

お礼

イメージし易くすぐに理解する事ができました。 今後とも宜しくお願い致します。

smokerls3930
質問者

補足

なぜ、その数字より後ろしか調べてないかというと、前にある数字はその数字を調べる前にすでに調べてるからです。とありますが取り出したmatchの前に数値は無いのではないでしょうか?

その他の回答 (3)

  • chie65535
  • ベストアンサー率43% (8519/19365)
回答No.4

やっている事は、 1.jを0にする 2.要素のj番目をmatchに取り出す 3.kをj+1にする 4.matchと要素のk番目を比較する 5.同一なら重複していると表示する 6.kに1を足し、9番目まで終ってないなら4.から繰り返す。終っているなら7.以降を行う 7.jに1を足し、9番目まで終ってないなら2.から繰り返す。終っているなら8.以降を行う 8.関数を抜けて0でリターンする です。 結局は 要素0と要素1を比較、要素0と要素2を比較、要素0と要素3を比較、…、要素0と要素9を比較 要素1と要素2を比較、要素1と要素3を比較、要素1と要素4を比較、…、要素1と要素9を比較 要素2と要素3を比較、要素2と要素4を比較、要素2と要素5を比較、…、要素2と要素9を比較 要素3と要素4を比較、要素3と要素5を比較、要素3と要素6を比較、…、要素3と要素9を比較 要素4と要素5を比較、要素4と要素6を比較、要素4と要素7を比較、…、要素4と要素9を比較 要素5と要素6を比較、要素5と要素7を比較、要素5と要素8を比較、要素5と要素9を比較 要素6と要素7を比較、要素6と要素8を比較、要素6と要素9を比較 要素7と要素8を比較、要素7と要素9を比較 要素8と要素9を比較 という処理をしているだけ。

smokerls3930
質問者

お礼

またまた丁寧なご解答有難う御座います。 すごく理解するのに助かりました。 今後も宜しくお願いいたします。

  • anicicle
  • ベストアンサー率36% (129/356)
回答No.3

外のfor()ループは、文字の先頭から最後までをmatchに入れていく。 中のfor()ループは「k=j+1」なのでmatchに入れた次の配列の要素から最後までループ。 ここで一致するものがあるかをifで確認する。 変数「j」と「k」の変化の仕方、それに寄ってmatchに何が格納されるか書き出せばわかりやすい。

smokerls3930
質問者

お礼

jとkの変化をノートに書き出し理解できました。 丁寧な解説有難う御座いました。

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.1

解説不足と書かれても・・・。 >for(j=0;j<10;j++){ は、比較文字を決定する為のループ >match=i[j]; は、matchに比較文字を代入 >for(k=j+1;k<10;k++) は、文字列のダブりを検知する為のループ >if(match==i[k]) は、比較文字matchと一致した文字が無いかの判定文 >printf("%dが重複しています\n",match); は、重複した文字の時表示するprint文

smokerls3930
質問者

お礼

申し訳御座いません。 通常言語を学ぶ人は、十分な解説で簡単に理解出来るレベルの内容なのですよね。 皆様に迷惑がかからぬ様、がんばります有難う御座いました。

関連するQ&A

  • 配列における数値の比較について

    #include <stdio.h> int main(void) { int i[10],j,k,match; printf("10個の数字を入力してください:\n"); for(j=0;j<10;j++) scanf("%d",&i[j]); // 一致する数字があるかどうか調べる // for(j=0;j<10;j++){ match=i[j]; for(k=j+1;k<10;k++) if(match==i[k]) printf("%dが重複しています\n",match); } return 0; } このコードなのですが、一致する数字があるかどうか調べているところの、 for(k=j+1;k<10;k++) このコードの内容が理解できません。 特にkの初期値が k=j+1 になっているのはなぜなのでしょうか? 配列i[j]には1から9までの数値が格納されているので、それと一致する数値を見つけ出すには for(k=0;k<10;k++) と同じことをすればよいのではないでしょうか? アルゴリズムがどうしても分かりません。 どなたか教えてくださる方がいたらよろしくお願いします。

  • C言語の問題

    以下はC言語の問題です。お教えください。 1000以下の素数を求めるプログラム prog.c を作成せよ。各素数を整数4桁で出力し、15個の素数を出力した時点で改行処理 を行うこと。作成したプログラムを提出せよ。 です。 僕の考えでは、 #include <stdio.h> #include <math.h> main(){ int i; int j; int ix; int k; printf("正の整数を入力して下さい: "); scanf("%d",&i); ix=(int)(sqrt((double)i)); k=0; for(j=2;j<=ix;j++) { if(i%j==0) { k=1; } } if(k==0) { printf("%d は素数です\n",i); } else { printf("%d は素数ではありません\n",i); } となると思うのですが。どうやら違うようです。全然わからないので、正しい答えを教えてください。

  • C言語 プログラミング 行列演算

    下記のプログラムのおかしい点と解決法を教えてください。 コンパイルは通りますがうまく動きません。。 #include<stdio.h> #define MAX 500 int main(void){ int matrA[MAX][MAX],matrB[MAX][MAX],matrC[MAX][MAX],l,m,n,i,j,k; printf("lとmを入力してください:"); scanf("%d",&l); scanf("%d",&m); printf("行列Aを入力してください"); for(i=0;i<l;i++){ printf(">"); for(j=0;l<m;j++){ scanf("%d",&matrA[i][j]); } printf("\n"); } printf("nを入力してください(m = %d):",m); scanf("%d",&n); printf("行列Bを入力してください"); for(i=0;i<m;i++){ printf(">"); for(j=0;j<n;j++){ scanf("%d",&matrB[i][j]); } printf("\n"); } printf("C=\n"); for(i=0;i<l;i++){ for(j=0;j<n;j++){ for(k=0;k<m;k++){ matrC[i][j]+=matrA[i][k]*matrB[k][j]; } printf("%d",matrC[i][j]); } printf("\n"); } }

  • C言語のソートの問題なんですが

    値を入力する→値を入力する度に昇順に表示する これを不の値を入力するまで続けるという プログラムを作ろうと思っているのですが #include<stdio.h> swap(int *a,int *b) { int t; t=*a; *a=*b; *b=t; } main() { int i,j,k,a[100]; for(i=0;;++i)  {   scanf("%d",&a[i]);   if(a[i] < 0)    break;   for(j=i+1;;++j)    if(a[i] > a[j])     swap(&a[i],&a[j]);   for(k=0;k <= i;++k)    printf("%d ",a[k]);  }  return 0; } のように書いたのですがjを使った繰り返しの部分でa[j]に 値が無いから動かないと思うのですが どのように直せばいいか分かりません どなたか分かる方御教授お願いします

  • c言語のプログラミングについて聞きたいのですが

    自分は課題で「10人分の名前と点数を入力して降順に並び替える」というプログラムを作ろうとしているのですが、なかなかうまくいきません。一応↓の形までできたのですがなぜか数字が変になります。 どうしてか教えていただけないでしょうか。 #include<stdio.h> int main(void) {     int i,j;     int tensu[10][3];     char namae[10][6]; for(i=0;i<10;i++){ printf("名前の入力>>"); scanf("%s",&namae[i]); printf("点数の入力>>"); scanf("%d",tensu[i]); } printf("名前   点数\n"); for(j=0;j<10;j++) { printf("%s ",&namae[j]); printf("%10d\n",tensu[j]); } return 0; } それとポインタ?みたいなのもよく理解できず、点数で降順にしたあとに点数を使って名前を並び替えるのかなと思うのですがそれもよくわかりません。 どなたか教えてください

  • C言語の配列について

    配列を20 定義し値を入力して合計値を出したいのですがどうすればよいのでしょうか 下のソースでエラーはおこりませんでした 何がちがうのでしょうか #include <stdio.h> int main() { int a[20]={}; int i, sum; printf("整数を入力してください:"); scanf("%d",&a); printf("\n"); for (i = 0; i < 10; i++) { sum += a[i]; } printf("sum= %d\n", sum); return 0; }

  • C言語で困っています...

    入力した数値の列だけ○と×を縦に、段々になるように表示する (最後の行は×にならなければいけない)プログラムを作成しています。 (実行例) ○と×を表示します。何列?:10            ×           ○×          ×○×         ○×○×         ×○×○×       ○×○×○×      ×○×○×○×    ○×○×○×○× ×○×○×○×○× ○×○×○×○×○× 途中までプログラミングできたのですが、 偶数の数値を入れたときはきちんと最後の行は×になっても 奇数の数値を入力すると○が最後の行になってしまい、うまくいきません。 どこがだめなのでしょうか? どなたか教えてください。 /* 入力した数値の列だけ、○と×を縦に、   段々になるように表示する(最後の行は×になる) */ #include <stdio.h> int main(void) { int i, j, n; printf("○と×を表示します。何列?:"); scanf("%d", &n); for (i=0; i<n; i++){ for (j=0; j<n; j++){ if (j >= (n - 1) - i){ if (j % 2 == 0) printf("○"); else printf("×"); } else printf(" ");//全角スペース } printf("\n"); } return 0; }

  • 配列

    /*10個の数字を受け取り,その中に一致する2つの数字があるかどうかを報告するプログラム*/ #include<stdio.h> int main(void) { int i,j,k; int item[9]; printf("10個の数字を入力してください\n"); for(i=0;i<10;i++) scanf("%d",&item[i]); for(j=0;j<10;j++) { for(k=j+1;k<10;k++) { if(item[j]==item[k]) printf("%dが2つ存在します.\n",item[j]); } } return 0; } というプログラムでエラーが出てしまいました. エラー内容は Stack around the variable 'item' was corrupted というものです. 原因を知りたいです.よろしくお願いします.

  • C言語 多重配列に関して

    以下のプログラムについての質問です。 10行目 for i = 0 の時、13行目 for j = 0 で scanf("%lf", &a[0][0])に10と代入します。 この時のドス画面は input 1-th line element:10 です。ここまではいいのですが、この次がよくわかりません。私の考えでは、10行目 i = 0 の時 13行目 j = 1 となって j がNMAXまでやったら、10行目のiが1になってまた同じように動いて、10行目の i がNMAXになったら、for文が終わると考えたのですが、このプログラムの実行結果(一番下にあります)を見てみると自分の考えが間違っていることに気がつきました。 3行3列のプログラムなので、a[0][0] a[0][1] a[0][2] a[1][0].......となると考え、scanfでドス画面に9回数字を打ち込むかと思ったのですが実際は3回でした。このプログラムはどのように読んだら良いのでしょうか?? 回答宜しくお願い致します。 1  #include <stdio.h> 2  #define NMAX 3 3 4  main() 5  { 6   double a[NMAX] [NMAX], b[NMAX] [NMAX], c[NMAX] [NMAX]; 7   int i,j,k; 8 9   printf("matrix 1:\n"); 10   for(i=0; i< NMAX; i++) 11   { 12   printf("input %d-th line element:", i+1); 13   for(j=0; j< NMAX; j++); 14   { 15   scanf("%lf", &a[i][j]); 16   } 17   } 18   printf("matrix 2:\n"); 19   for(i=0; i<NMAX; i++) 20   { 21   printf("input %d-th line element:", i+1); 22   for(j=0; j< NMAX; j++); 23   { 24   scanf("%lf", &b[i] [j]); 25   } 26   } 27  for(i=0; i<NMAX; i++) 28   { 29   for(j=0; j<NMAX; j++) 30   { 31   c[i][j] = 0; 32   for(k=0; k <NMAX; k++) 33   { 34   c[i][j] += a[i][k] * b[k][j]; 35   } 36   } 37   } 38 39  printf("matrix 1 * matrix2 = :\n"); 40  for(i=0; i<NMAX; i++) 41   { 42   printf("["); 43   for(j=0;j<NMAX; j++) 44   { 45   printf("%f", c[i][j]); 46   } 47   printf("]\n"); 48   } 49  }

  • C言語

    C言語 グループのモードについて 以下のプログラムは20個の数字を入力しモードを表示する物です。 処理の流れを詳しく解説出来る方がいましたらご教授願います。 #include <stdio.h> int main(void) { int stats[20],i,j; int mode,count,oldcount,oldmode; printf("20個の数字を入力して下さい:\n"); for(i=0;i<20;i++) scanf("%d",&stats[i]); oldcount=0; for(i=0;i<20;i++){ mode=stats[i]; count=1; for(j=i+1;j<20;j++) if(mode==stats[j]){ oldmode=mode; oldcount=count; } } printf("モードは%dです\n",oldmode); return 0; }

専門家に質問してみよう