C言語グループのモードについて

このQ&Aのポイント
  • 以下のプログラムは20個の数字を入力し、出現回数が最も多い数字をモードとして表示するものです。
  • プログラムの処理の流れについて詳しく解説してほしいです。
  • C言語のモードについて教えてください。
回答を見る
  • ベストアンサー

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

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

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

(1)まず、20個の数を入力します (2)oldcountを0で初期化 (3)その20個の数に付いて最初から順番に(4)~(5)の処理を繰り返します (4)countに1を設定 (5)該当の数以降の入力値について(6)の処理を繰り返す (6)その数が該当の数と等しいなら、oldmodeにその数を設定し、oldcountにcountを設定 (7)oldmodeを表示 20個の入力値について、それぞれ同じ数がないかをチェックして、一番最後に重複が見つかった数字を表示しています。 だた、countに1しか設定されてないし、oldcountが評価されたりしていないので、この2つの変数の意味が不明ですが。ま、重複があったかどうかのチェックに使うつもりだったのかもしれませんが……

smokerls3930
質問者

お礼

ご解答有難う御座いました。 質問のソースが間違っていた為、混乱させてしまい申し訳御座いません。 正確なソースについて再度解説していただけるなら宜しくお願いいたします。

smokerls3930
質問者

補足

申し訳御座いませんソースが間違っていましたので修正いたします。 #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]) count++; if(count>oldcount){ oldmode=mode; oldcount=count; } } printf("モードは%dです\n",oldmode); return 0; }

その他の回答 (3)

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.4

う~ん、どうなんだろう?。 投稿ソースを何度か試せば、「以下のプログラムは・・・モードを表示する物です」とは言えないはずなんだけど。 ・目的のものが得られないソースに、「解説が欲しい」。 ・目的のものが得られるようにソースを、「直して欲しい」。 前者は無意味だよね。 ・↓モードが同値の場合を考慮していません(◆先行入力優先)。 #include <stdio.h> int main( void ) {  int iCount[ 20 ], iStore[ 20 ];  int iVal, i, j, iMax, iOk;  int nn = 0, iNum = 0;  printf( "20個の数字を入力して下さい:\n" );  for( i = 0; i < 20; i++ ){   scanf( "%d", &iVal );   iOk = 0;   for( j = 0; j < nn; j++ ){  // いままで入力したものの中に    if( iVal == iStore[ j ] ){ // 同じものがあるか     iOk = 1;     iCount[ j ]++;     break;    }   }   if( iOk ) continue; // 重複入力   iStore[ nn ] = iVal; // 新しい数   iCount[ nn ] = 1;   // 初期化   nn++;  }  iMax = iCount[ 0 ];  for( i = 0; i < nn; i++ ){   if( iCount[ i ] > iMax ){ // ◆    iMax = iCount[ i ];    iNum = i;   }   printf( "%02d %d(%d)\n", ( 1 + i ), iStore[ i ], iCount[ i ] );  }  printf( "\nモードは %d(%d)です\n", iStore[ iNum ], iCount[ iNum ] );  return( 0 ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

smokerls3930
質問者

お礼

ご解答有難う御座いました。 質問のソースが間違っていた為、混乱させてしまい申し訳御座いません。 正確なソースについて再度解説していただけるなら宜しくお願いいたします

smokerls3930
質問者

補足

申し訳御座いませんソースが間違っていましたので修正いたします。 #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]) count++; if(count>oldcount){ oldmode=mode; oldcount=count; } } printf("モードは%dです\n",oldmode); return 0; }

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

で, #2 の説明から「これではモードが求まらない」ことも自明だね.

smokerls3930
質問者

お礼

解答有難う御座います。 ソース間違いに、気が付くきっかけになりました。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

モードって何ですか?

smokerls3930
質問者

補足

統計学では、ある数値グループの中でもっとも頻繁に現れる数値をそのグループのモード(最頻値)というそうです。

関連するQ&A

  • C言語の質問です

    #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]) count++; /* 以前の数より多ければ、新しいモードを使用する */ if(count>oldcount) { oldmode = mode; oldcount = count; } } printf("モードは %d です\n", oldmode); return 0; } 上記のコードはユーザーに20個の数値を入力させ、 そのモード(最も頻繁に現れる数値)を調べて表示するプログラムです。 1番目のfor文までは分かります。そのあとが、どうしても分かりません!! 特に、oldcount = 0; とする所、count = 1; とする所、for文で j=i+1; とする所。 他、if文内が分かりません。 課題の丸投げではなく、本当に分からなくて困っています。 どなたか詳しく解説してくれないでしょうか?よろしくお願いします。

  • 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言語初心者です。

    #include <stdio.h> int main() { int b[100]; int i, n; int a, r, data; int count=0; printf("Please input two integers:"); fflush(0); scanf("%d %d", &a, &r); if(a<=0 || r<=1){ printf("Error\n"); } else{ for(n=0; b[n]<=80.0; n++){ if(n==0){ b[0]=0; count++; } else { for(i=0; i<=n-1; i++){ data*=r; } b[n]=a*data; printf("%d ", b[n]); count++; } } printf("\n"); for(; count>0; count--){ printf("%d ", b[count]); } } return 0; } windows8でeclipseを使ってC言語を書いてます。 eclipse上だと何もエラーが表示されてないのですが、実行し、 Please input two integers: と表示された後、適当な数字2つを入力しても何も反応しません。 稚拙な質問ですいません。どなたか原因を教えてください。

  • 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言語です

    c言語初心者です。今大学の課題でc言語のプログラムをかいているのですが、うまくいかないので助けて欲しいです。以下のようなプログラムで調和平均の値を出したいのですがなぜか表示されません。infと表示されてしまいます。あと調和平均とはn/(1/d1+1/d2+1/d3+.........+1/dn)の値です。ここでd1~dnは入力された数のことです。なので0が入力された場合は値を返さないようにしたいです。   どこをどのように直せばいいのか教えてください。よろしくお願いします。 #include <stdio.h> #include<math.h> #define M 1000 int main (int argc, const char * argv[]) { // insert code here... float d[M]; double e[M]; double wa=0.0,av,bun=0,kika=1,tyowa=0; /*avはaverageを,bunは分散を意味します*/ int i=0,j=0; printf("複数の数字を入力してください\n"); printf("数字入力を終了するときはnull文字を入力してください\n"); printf("数字以外が入力されたら\n"); printf("それまでの数字の計算結果を表します\n"); /*数字を入力、和を求める*/ while (scanf("%f",&d[i])!='\0') { wa=wa+d[i]; i++; } if (i!=0) { printf("算術平均は%fです\n",wa/i); av=wa/i; for (j=0; j<i; j++) { kika=kika*d[j]; } printf("幾何平均は%fです\n",pow(kika,1./i)); for (j=0; j<i; j++) { if (d[j]=0) { printf("調和平均は出せません\n"); } else e[j]=1/d[j]; } for (j=0; j<i; j++) { tyowa=tyowa+e[j]; } printf("調和平均は%fです\n",e[1]); for (j=0; j<i; j++) { bun=bun+(d[j]-av)*(d[j]-av); } printf("分散の値は%fです\n",bun/i); } else { printf("数字を入力してください\n"); } return 0; }

  • c言語で行列の積の値を求める

    行列の成分を入力した後に、 入力された行列は X = 1 2 3 4 5 6 7 8 9 10 11 12 Y = 1 5 2 6 3 7 4 8 のように表示して、(上の数字は適当です。) 行列 X と行列 Y の積を求めて結果を表示するプログラムが作りたいのですが、上手く表示できなくて困っています。 #include <stdio.h> int main(void) { double A[10][10]; double B[10][10]; double C[10][10]; int i,j,m,n,p,k; printf("行列xの行数は?:"); scanf("%d",&m); printf("行列xの列数(行列yの行数)は?:"); scanf("%d",&n); printf("行列yの列数は?:"); scanf("%d",&p); printf("行列xを入力してください。\n"); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { scanf("%d", &A[i][j]); } } printf("行列yを入力してください。\n"); for (i = 0; i < n; i++) { for (j = 0; j < p; j++) { scanf("%d", &B[i][j]); } } この後にどうすればいいのか教えてください。 よろしくお願いします。

  • C言語プログラミングで・・・

    つい最近、C言語プログラミングのお勉強をはじめた中学生です。 ある程度かけるようになってきて、こちらのサイトに掲載されている練習問題を解いていました。 http://akabas.net/lib/CExercise.aspx いろいろといていく中で、配列の章にはいりました。 配列の章の中の6問目と7問目の九九についてのコードを書いていたところ、どちらも問題なく実行を終了した後 「○○.exeは動作を停止しました。」というメッセージが現れました。 これはコードに何か問題があるのでしょうか? _____________________________________________________________________ //6問目 #include <stdio.h> void line (void){ int cnt; for (cnt = 0; cnt < 30; cnt++) printf("_"); printf("\n"); } int main() { int kuku[9][9], i, j; printf("九九を表示します\n"); for (i = 1; i <= 9; i++){ for (j = 1; j <= 9; j++){ kuku[i][j] = i * j; printf("%d * %d = %d\n", i, j, kuku[i][j]); } line(); } return 0; } ____________________________________________________________________ //7問目 #include <stdio.h> int main() { int kuku[9][9]; int i, j; for (i = 1; i <= 9; i++){ for (j = 1; j <= 9; j++) kuku[i][j] = i * j; } printf("1桁の数値(1 ~ 9に限定)を入力してください 1回目---"); scanf("%d", &i); printf("1桁の数値(1 ~ 9に限定)を入力してください 2回目---"); scanf("%d", &j); printf("\n"); printf("%d * %d = %d", i, j, kuku[i][j]); return 0; } ________________________________________________________________________________ まだ初心者のレベルなので、回答はできたらきつい言葉をつかってほしくないです^^; よろしくおねがいします ※こちらでは、Tabをうっているのですが、表示されてないみたいです。見づらいかと思いますが、よろしくおねがいします

  • C言語について。

    今、C言語に関する問題をやっているんですが、いまいちわかりません。 その問題というのは↓ ≪問題5 (繰り返し) 例題をもとに、次のような九九の表を出力するプログラムを作成しなさい。  1 2 3 4  5  6  7  8  9  2 4 6 8 10 12 14 16 18  ~(略)                                               ≫ という問題です。それで、その例題というのは↓ ≪例題4 (for文、do while文)  次のプログラムは、入力された整数を一辺とする正方形を出力するプログラムである。動作確認をしなさい。  4       (←入力)  ****  (←出力)  ****  ****  **** /* 正方形 */ #include <stdio.h> void main() {     int hen, i, j;     do{        printf("数字(2~9)を入力してください : ");        scanf("%d", &hen);        if( hen < 2 || hen > 9 )           printf("入力エラーです!\n");     }while( hen < 2 || hen > 9);     for( i = 1 ; i <= hen ; i++)     {         for( j = 1 ; j <= hen ; j++)           printf("*");         putchar('\n');    } }  ≫ ≪例題5 (for文、do while文) 次のプログラムは、入力された整数を一辺とする二等辺三角形を出力するプログラムである。動作確認しなさい。  4      (←入力)  *     (←出力)  **  ***  **** /* 二等辺三角形 */ #include <stdio.h> void main() {     int hen, i, j;     do{        printf("数字(2~9)を入力してください : ");        scanf("%d", &hen);        if( hen < 2 || hen > 9 )           printf("入力エラーです!\n");     }while( hen < 2 || hen > 9 );     for( i = 1 ; i <= hen ; i++ )     {            for( j = 1 ; j <= i ; j++ )              printf("*");          putchar('\n');     } }  ≫ 以上の二つが例題です。 わかりづらかったらすみませんm(_ _)m わかる方(問題5を)教えてくださるとありがたいです。

  • c言語で3人分の合計と平均を出を出したいのですが・・・

    #include <stdio.h> void main (void) { int i; int sum = 0; int count[3]; char ss[3][30]; for (i = 0; i < 3; i++){ printf("氏名: "); gets(ss[i]); printf("得点: "); scanf("%d" , &count[i]); } for (i = 0; i < 3; i++){ sum = sum + count[i]; } printf("\n\n"); printf("合計 :%d point\n" ,sum); printf("平均点:%f point\n" ,(double)sum/i); } このようなものを作ったのですが、実行すると1人分を入力したあと2人目の入力部分の表示が「氏名:得点:」となってしまい、氏名入力を飛ばし得点入力になります。 どのようにすれば2人目の氏名入力を飛ばさずに進行するのか教えてください。

  • C言語の問題を教えてください。初心者です。

    1000以下の整数を入力して、それ以下の素数を出力するプログラムをつくっています。 一応自分でやってみたのですが、どうもうまくできません。自分ではどこが間違っているのかさっぱりなので間違い箇所を指摘し、どうすれば良いのかを教えていただきたいです。ほかに効率的なやりかたがあったらあわせてお願いします。 初心者なので易しく説明していただけるとありがたいです。 <自分でやってみた> #include <stdio.h> int main(){ int i,j,N; int a[1000]; for (i=2; i<=1000; i++) { a[i]=1; } for (i=2; i<=1000; i++) { for (j=i++; j<=1000; j++) { if (a[j]=1 && j%i==0) { a[j]=0; } } } printf("2以上1000以下の整数を入力してください\n"); scanf("%d",&N); printf("%d以下の素数は\n",N); for (i=2; i<=N; i++) { if (a[i]=1) { printf("%d\n",i); } } } よろしくお願いしますm(_ _)m

専門家に質問してみよう