• 締切済み

C言語の度数分布の問題

C++についての問題です。 200個の数値があり、 freq[0],freq[1],...,freq[8],freq[9] に,0 以上10未満のデータ数,10 以上20 未満のデータ数,…,80 以上90 未満のデータ数,90 以上100 未満のデータ数がそれぞれ入るようにする問題です。 #include <stdio.h> int main() { int x[] = {30,94,91,42,7,45,37,63,5,51,65, 97,49,82,35,41,2,62,50,86,35,53,98,62,33,2, 79,15,18,13,68,76,32,47,1,11,93,66,92,90,40, 57,3,59,64,10,39,11,1,91,57,86,29,56,91,97, 35,64,56,79,74,95,6,98,16,13,39,35,99,11,36, 11,14,12,42,45,37,13,10,33,57,81,69,86,89,7, 21,40,16,36,27,12,77,15,28,50,7,91,84,24,75, 56,29,29,26,31,56,61,20,65,34,72,87,32,44,67, 37,69,7,72,76,90,43,9,89,97,12,9,77,14,68,28, 17,12,58,51,43,35,84,74,7,92,30,50,67,30,0,98, 1,73,11,29,80,82,57,71,50,85,99,46,38,36,59, 11,33,98,60,3,44,74,98,77,54,62,39,81,56,78, 12,71,27,60,84,96,73,58,31,78,73,98,6,16,77, 51,44,10,30,48,1,29}; int freq[10]={0}; int i,n; この部分だけをうまくやればできるはずなんですが、よくわかりません。 ↓↓↓ for(){ for(i=0,i<10,i++){ if(i*10<=x[] && x[]<(i+1)*10) freq[i]++; } } ↑↑↑ for ( i = 0 ; i < 10 ; i++ ) { printf("%d 以上%d 未満のデータ数:%d", i*10, (i+1)*10, freq[i]); } while(1); return 0; } 10で割るやり方は使わずに、 0以上10未満ならカウントfreq[0]のカウントを1増やす、10以上20未満ならfreq[1]のカウントを1増やす……というのを繰り返しで処理して それをxにある数値全部について繰り返しで処理するという二重構造だと思うのですが 『for』と『if』と『i』と『n』をどう組み立てていいかわかりません。 わかる方よろしくお願いします(>_<) できればその部分を書いて解説いただけるとわかりやすくてありがたいです。

みんなの回答

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.1

for (i = 0; i < 200; i++) { freq[x[i] / 10]++; }

takaisunnzenn
質問者

お礼

ありがとうございます。 しかしnも使って10で割らないやり方を求めています。 先ほどfor二重使用で自己解決したので締め切ります。

関連するQ&A

  • C言語 探索に関して

    C言語探索プログラムについて質問です。 #include <stdio.h> #define MAXSIZE 100 void swapData(int *x, int *y){ int tmp; tmp = *x; *x = *y; *y = tmp; } void simpleSort(int data[], int first, int last) { int i, j; for(i = first; i < last; i++){ for(j = i+1; j <= last; j++){ if(data[i] > data[j]) { swapData(&data[i], &data[j]); } } } } int ArrayBinarySearch(int data[], int n, int x) { int left = 0, right = n - 1, center; while(left <= right){ center = (left + right)/2; if(data[center]=x){ return center; }else if(x > data[center]){ left = center + 1; }else if(x < data[center]){ right = center - 1; } } return -1; } int main(int argc, char *argv[]) { int data[MAXSIZE]; int i, x; FILE *fp; scanf("%d", &x); fp = fopen(argv[1], "r"); for(i = 0; i < MAXSIZE; i++) { if (fscanf(fp,"%d", &data[i]) == EOF) break; } simpleSort(data, 0, i-1); printf("%d", ArrayBinarySearch(data, i, x )); return 0; } 数値が書かれたファイルを読み込んでソートした後に二分探索を行うプログラムをつくったのですが、うまく動きません。 どこがおかしいか教えてください。 お願いいたします。 ちなみに関数ArrayBinarySearchは目的の値が見つかれば配列中でのインデックスを、見つからない場合は-1を返す関数にしているつもりです。

  • C言語の問題について教えていただきたいのですが

    【身長デ一タを順次入力していき、160(cm)未満,160(cm)以上,170(cm)未満、170(cm)以上,180(cm)未満、180(cm)以上のデータがそれぞれいくつあったかを出力する(同時に全入力デ一タ数も出力する)プログラムを作成せよ。但し,データとして999 が入力された時点でプログラムの実行が終了するものとする.なお,999 というデータは,全入力データ数に入れないものとする.】 という問題が解けません・・・。わかる方いらっしゃいましたら教えてください。 一応私なりに #include <stdio.h> void main() { int n=0,i=0,j=0,k=0,l=0; double a; printf("身長を入力してください\n"); scanf("%lf",&a); while(a!=999){ scanf("%d",&n); n++; if(a<160){ i++; }else if(a>=160 && a<170){ j++; }else if(a>=170 && a<180){ k++; }else{ l++; } } printf("入力データ数 %d\n",n-1); printf("160cm未満 %d\n",i); printf("160cm以上170cm未満 %d\n",j); printf("170cm以上180cm未満 %d\n",k); printf("180cm以上 %d\n",l); } と作ってみたものの…;;; 正しいプログラムを教えていただけると嬉しいです。よろしくお願いします。

  • 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言語の問題です。お教えください。 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言語の素数判定について質問です。

    C言語の素数判定について質問です。 「与えられた数値以下で、最大の素数を返す関数を作成しなさい。 素数が存在しない場合、0を返すこと。 int max_prime (int x);を使用する。」 という問題なのですが。まったくの初心者なので何をすればよいか分かりません。 例として以下のようなプログラムを見せられたのですが、他の例などないでしょうか。 もし分かるかたがいらっしゃれば教えていただけないでしょうか。よろしくお願いします。 #include<stdio.h> int is_prime (int i){ int a; for(a=2;a<=i-1;a++){ if(i%a == 0){ return i; } } return 0; } int max_prime(int x){ int i; for(i=x;i>1;i--){ if(is_prime(i)!=i){ return i; } } return 0; } int main(void){ int x,z; scanf("%d",&x); z=max_prime(x); printf("%d数値以下で最大の素数は[%d]である!\n",x,z); return 0; }

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

    以下の文を出力して入力:に16進数を入れると10進数に変換した数値の小さい列順に並ぶプログラムを作りたいのですがうまく出来ません。 仕様は以下に記載します。 入力:__、__、__、__、__EnterKeyで結果を表示。 以下のバブルソートの文のどこをいじれば良いでしょうか? 返答宜しくお願いします。 #include <stdio.h> int main (void) { char data[256]; int val[100]; int i = 0; int work; int j; int k; printf("入力 = "); scanf("%s",data); for(i=0;i<100;i++){ val[i] = 0; } k=0; for(i = 0;i<100 ; i++){ if(data[i] == 0x00){ //data[i]がNULLだったら処理を抜ける k++; break; //enterキーでprintf出力 } else if(data[i] == ','){ //カンマだったら /*printf("%d\n",k);*/ k++; } else{ if(data[i] >= 'A' && data[i] <= 'Z'){ //data[i]にAからZが入ったら val[k] = val[k] *16 + data[i] -'A'+10; } else if(data[i] >= '0' && data[i] <= '9'){ //data[i]に0から9が入ったら val[k] = val[k] *16 + data[i] -'0'; } } } /* printf("k=%d\n",k); for(i=0;i<k;i++){ printf("出力 = %d\n",val[i]); } */ //バブルソート//     for(i=0; i<k-1; i++) { if(val[i] < val[i+1]) { } else{ work = val[i]; val[i] = val[i+1]; val[i+1] = work; } } for(i=0;i<k;i++) { printf("出力 = %d\n",val[i]); } }

  • C言語の問題がわからないです。

    C言語のプログラムで、列数を自分で決めて、 (例)3列         ●(この行を最後として)   □● ●□● 上記のプログラムを作りたいのですが、 上手くいきません。途中まで作ったのですが、なかなか思うようにいかないです。どうすれば上記のようになりますでしょうか? #include <stdio.h> void disp(int x, int y); main() { int i,n; printf("表示する列:"); scanf("%d",&n); disp(3,3); for(i=1;i<=n;i++){ if(i%2==0){ disp(n-i,4); disp(i,2); } else{ disp(n-i,4); disp(i,1); } disp(1,3); } } void disp(int x, int y) { int i; for(i=0;i<x;i++){ if(y==1){ printf("●"); } else if(y==2){ printf("□"); } else if(y==3){ printf("\n"); } else{ printf("\0"); } } }

  • C言語のIF関数のアドバイスお願いします。

    #include <stdio.h> int main(){ int x,i,div=0; printf("x="); scanf("%d",&x); for(i=1;i<=x;i++){ if(x%i == 0){ div++; } } if(ここがわかりません) printf("%dは素数です\n",x); else printf("%dは素数でありません\n",x); return 0; }

  • ファイルから読み込むC言語の問題

    C言語の問題です。 file.txtを読み込む。 データの値を奇数と偶数に分け、それぞれ合計値・個数・平均値を出力せよ。 奇数データの数・偶数データの数がゼロの場合は、平均値を求めないようにしなさい。 file.txtの中身は「10 11 8 21 6 8 13 26 9 3」です。 #include <stdio.h> #define SIZE 10 int main(void) { FILE *infile; int i, data[SIZE]; int ksum, knum, gsum, gnum; ksum = 0; gsum = 0; infile = fopen("file.txt", "r"); if(infile == NULL) { printf("入力ファイルを開くことができません\n"); else{ fscanf(infile, "%d"); if(data[i]%2){ ksum += data[i]; knum += 1; } else if(data[i]/2==0){ gsum += data[i]; gnum += 1; } } return 0; } for(i = 0; i < SIZE; i ++ ) { fscanf(infile, "%d", &data[i]); } for(i = 0; i < SIZE; i ++ ) { printf(" %3d", data[i]); } printf("%d %d %f", ksum, knum, (double)ksum/knum); printf("%d %d %f", gsum, gnum, (double)gsum/gnum); return 0; } このように考えたのですが、うまく実行できません。 間違っている箇所やその修正方法などを教えていただけたら嬉しいです。 ちなみに16行目で「else 文が if と一致しません。」というエラーが出てしまいます。 もうひとつ「奇数データの数・偶数データの数がゼロの場合は、平均値を求めない」というのはどのように表せば良いのでしょうか? ご指導よろしくお願いします。

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