プログラム指摘

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

プログラム指摘

#1

投稿記事 by sim » 10年前

コード:

#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と指摘を受けました。全く意味が分かりません。

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

Re: プログラム指摘

#2

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

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が負の数の時もエラーにするべきだと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

sim
記事: 48
登録日時: 10年前

Re: プログラム指摘

#3

投稿記事 by sim » 10年前

コード:

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

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

Re: プログラム指摘

#4

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

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を使うことは問題無いです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

sim
記事: 48
登録日時: 10年前

Re: プログラム指摘

#5

投稿記事 by sim » 10年前

どのようにするのが良いでしょうかね?

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

Re: プログラム指摘

#6

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

sim さんが書きました:どのようにするのが良いでしょうかね?
  • ループする範囲を1~NUMではなく0~(NUM-1)にする
  • 計算時に(NUM-1)→0の方向にループし、出力時に0→(NUM-1)の方向にループする(ループの方向を今と逆にする)
    ※ここでの「ループの方向」 = ループで使うカウンタ変数の値を変える(増やすor減らす)方向
  • 常にnisinnsuu[7]を出力するのではなく、nisinnsuuまたはnisinnsuu[j] (用いるカウンタ変数に応じて適切な方)を出力する
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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