ページ 11

プログラム指摘

Posted: 2015年8月22日(土) 21:07
by sim

コード:

#include <stdio.h>
#define NUM 8
int main(void)
{
	int seisuu;
	int i,j;
	int nisinnsuu[NUM];
	
	printf("10進数(0〜255)を入力してください\n");
	scanf("%d",&seisuu);
	
	printf("2進数に変換\n");
	
	/*2進数に変換する処理*/
	if(seisuu<256)
	{
		for(i=1;i<=NUM;i++)
		{
			nisinnsuu[i]=seisuu%2;
			seisuu=seisuu/2;
		}
		for(j=NUM;j>=1;j--)
		{
			printf("%d",nisinnsuu[j]);
		}
	}
	else
	{
		printf("エラー");
	}
	
	printf("\n");
	
	return 0;
}
このプログラムは、上位ビット0、下位ビット7と指摘を受けました。全く意味が分かりません。

Re: プログラム指摘

Posted: 2015年8月22日(土) 21:43
by みけCAT
sim さんが書きました:

コード:

		for(i=1;i<=NUM;i++)
		{
			nisinnsuu[i]=seisuu%2;
			seisuu=seisuu/2;
		}
		for(j=NUM;j>=1;j--)
		{
			printf("%d",nisinnsuu[j]);
		}
nisinnsuu[NUM]は確保された領域の範囲外であり、アクセスしてはいけません。
sim さんが書きました:このプログラムは、上位ビット0、下位ビット7と指摘を受けました。全く意味が分かりません。
想像ですが、最上位ビットをnisinnsuu[0]に、最下位ビットをnisinnsuu[7]に入れろという意味かもしれません。
この解釈と比較すると現状のプログラムは、前述の範囲外アクセスの問題に加えてビットの配置が逆になっているという問題もあるようですね。

また、seisuuが負の数の時もエラーにするべきだと思います。

Re: プログラム指摘

Posted: 2015年8月22日(土) 21:54
by sim

コード:

for(i=1;i<=NUM;i++)
        {
            nisinnsuu[i]=seisuu%2;
            seisuu=seisuu/2;
        }
        for(i=NUM;i>=1;i--)
        {
            printf("%d",nisinnsuu[7]);
        }
これでもいけますかね?

Re: プログラム指摘

Posted: 2015年8月22日(土) 22:03
by みけCAT
sim さんが書きました:

コード:

for(i=1;i<=NUM;i++)
        {
            nisinnsuu[i]=seisuu%2;
            seisuu=seisuu/2;
        }
        for(i=NUM;i>=1;i--)
        {
            printf("%d",nisinnsuu[7]);
        }
これでもいけますかね?
全然ダメです。
さらに劣化しています。

  • 範囲外アクセスの問題が直っていない
  • せっかく計算したnisinnsuu[1]~nisinnsuu[6]、nisinnsuu[8](範囲外)が利用されず、seisuuを2進数に変換した値とは限らない何かが出力されます。
jの代わりにiを使うことは問題無いです。

Re: プログラム指摘

Posted: 2015年8月22日(土) 22:10
by sim
どのようにするのが良いでしょうかね?

Re: プログラム指摘

Posted: 2015年8月22日(土) 22:48
by みけCAT
sim さんが書きました:どのようにするのが良いでしょうかね?
  • ループする範囲を1~NUMではなく0~(NUM-1)にする
  • 計算時に(NUM-1)→0の方向にループし、出力時に0→(NUM-1)の方向にループする(ループの方向を今と逆にする)
    ※ここでの「ループの方向」 = ループで使うカウンタ変数の値を変える(増やすor減らす)方向
  • 常にnisinnsuu[7]を出力するのではなく、nisinnsuuまたはnisinnsuu[j] (用いるカウンタ変数に応じて適切な方)を出力する