配列を表示させたい!

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
KTN19
記事: 23
登録日時: 9年前

配列を表示させたい!

#1

投稿記事 by KTN19 » 9年前

配列の要素を出力したいのですが上手くいきません。
どうかご教授を願います。

コード:

#include<stdio.h>

#define NUM_POINT 100

int main( void )
{
	int i, j, k;
	int point[ NUM_POINT ] = {
		1,  4,  9, 19,  8, 10, 10,  9, 15, 10,
		2, 19, 20,  4, 20,  7,  3, 15, 16, 16, 
		17, 14, 12,  9,  2,  5,  5, 13,  1, 19, 
		5,  0,  3, 12, 17,  9,  1,  7, 16, 16, 
		15, 18, 12, 14, 20, 10, 20,  2,  2, 15, 
		17, 19,  7,  8,  8,  9, 11, 11,  1, 10, 
		9,  6, 11, 12, 17,  5, 19, 18, 10, 14, 
		12,  3,  9,  3, 17,  9, 11, 14,  9, 14, 
		7,  3, 12, 14, 11, 18,  0,  2,  8,  1,  
		12, 18,  5,  0,  7,  1,  4,  6, 18, 14, 
		};
		
		int up15 = 0;
		int dist[ 21 ];
		
		k = 0;
		for( i = 0; i <= 20; i++ ) dist[ i ] = 0;
		for( j = 0; j <= NUM_POINT; j++ )
		{
			if( j == point[ j ] )
			{
				dist[ point[ j ] ] += dist[ i ];
			}
			
			if( dist[ i ] >= 15 )
			{
				up15++;
			}
		}
		printf("15点以上の学生は %d 人です.\n", up15);
		printf("点数の分布は以下の通りです.\n");
		for (i=0; i<=20; i++) 
		{
			printf("%2d点: %d\n", i, dist[ i ]);
		}
		
		return 0;

}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 配列を表示させたい!

#2

投稿記事 by みけCAT » 9年前

とりあえず、point[NUM_POINT]は確保された領域の外なので、アクセスしてはいけません。
また、30行目および33行目のdist[ i ]も25行目のfor文によってi = 21になっているので、範囲外です。範囲外にアクセスしてはいけません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: 配列を表示させたい!

#3

投稿記事 by かずま » 9年前

j の forループは、これではありませんか?

コード:

    for (j = 0; j < NUM_POINT; j++) {
        dist[point[j]]++;
        if (point[j] >= 15) up15++;
    }

KTN19
記事: 23
登録日時: 9年前

Re: 配列を表示させたい!

#4

投稿記事 by KTN19 » 9年前

みけCATさんとかずまさんの意見を参考にしつつ訂正してみました.

コード:

#include<stdio.h>

#define NUM_POINT 100

int main( void )
{
	int i, j, k;
	int point[ NUM_POINT ] = {
		1,  4,  9, 19,  8, 10, 10,  9, 15, 10,
		2, 19, 20,  4, 20,  7,  3, 15, 16, 16, 
		17, 14, 12,  9,  2,  5,  5, 13,  1, 19, 
		5,  0,  3, 12, 17,  9,  1,  7, 16, 16, 
		15, 18, 12, 14, 20, 10, 20,  2,  2, 15, 
		17, 19,  7,  8,  8,  9, 11, 11,  1, 10, 
		9,  6, 11, 12, 17,  5, 19, 18, 10, 14, 
		12,  3,  9,  3, 17,  9, 11, 14,  9, 14, 
		7,  3, 12, 14, 11, 18,  0,  2,  8,  1,  
		12, 18,  5,  0,  7,  1,  4,  6, 18, 14, 
		};
		
		int up15 = 0;
		int dist[ 20+1 ];
		
		
		for( i = 0; i <= 20; i++ ) dist[ i ] = 0;
		
		for( i = 0; i <= 20; i++){
			for( j = 0; j <= NUM_POINT; j++ )
			{
				if( i == point[ j ] )
				{
					dist[ i ]++;
					if( point[ j ] >= 15 && point[ j ] <= 20 ) up15++;
				}
				
			}
		}
		printf("15点以上の学生は %d 人です.\n", up15);
		printf("点数の分布は以下の通りです.\n");
		for (i=0; i<=20; i++) 
		{
			printf("%2d点: %d\n", i, dist[ i ]);
		}
		
		return 0;

}

かずま

Re: 配列を表示させたい!

#5

投稿記事 by かずま » 9年前

KTN19 さんが書きました:みけCATさんとかずまさんの意見を参考にしつつ訂正してみました.
全然 参考にしていないようです。

point は point[0]~point[99] の 100個(NUM_POINT個) しかないのに
j <= NUMPOINT で point[j] だと、point[100] を参照しています。

また、for の二重ループで 2000回実行してしまいます。

正解は次の通り。

コード:

#include <stdio.h>
 
#define NUM_POINT 100
 
int main(void)
{
    int i;
    int point[NUM_POINT] = {
         1,  4,  9, 19,  8, 10, 10,  9, 15, 10,
         2, 19, 20,  4, 20,  7,  3, 15, 16, 16, 
        17, 14, 12,  9,  2,  5,  5, 13,  1, 19, 
         5,  0,  3, 12, 17,  9,  1,  7, 16, 16, 
        15, 18, 12, 14, 20, 10, 20,  2,  2, 15, 
        17, 19,  7,  8,  8,  9, 11, 11,  1, 10, 
         9,  6, 11, 12, 17,  5, 19, 18, 10, 14, 
        12,  3,  9,  3, 17,  9, 11, 14,  9, 14, 
         7,  3, 12, 14, 11, 18,  0,  2,  8,  1,  
        12, 18,  5,  0,  7,  1,  4,  6, 18, 14, 
    };
    int up15 = 0;
    int dist[20 + 1] = { 0 };
    
    for (i = 0; i < NUM_POINT; i++) {
        dist[point[i]]++;
        if (point[i] >= 15) up15++;
    }
    printf("15点以上の学生は %d 人です.\n", up15);
    printf("点数の分布は以下の通りです.\n");
    for (i = 0; i <= 20; i++) 
        printf("%2d点: %d\n", i, dist[i]);
    return 0;
}

閉鎖

“C言語何でも質問掲示板” へ戻る