c言語の基礎、配列を使用しての奇数魔法陣についてです。
以下のようなプログラムをうってみたのですが、真っ暗な画面が表示されるだけでエラーすら表示されません。
色々考えて試してはみたのですが、どこを直せば良いのか分からず困っています。
初歩的な質問ですみませんが、回答よろしくお願いします。
ルールは、
魔法陣は5×5
スタートは上真ん中
右上に進む
上へはみ出すとはみ出した列の一番下へ
右にはみ出すとはみ出した行の一番左へ
隅からはみ出すとはみ出す前の列のひとつ下へ
もう数字が入っている場合は前の列のひとつ下へ
このアルゴリズムも、合っているかは確信がありません。
ソースコードは以下です。
[code]
#include<stdio.h>
int main(void)
{
int square[5][5]; // 魔方陣を格納する変数
// 魔方陣を初期化
int i, j;
for(i=0;i<5*5-1;i++)
{
for(j=0;j<5*5-1;j++)
{
square[i][j]=0;
}
}
// 魔方陣を生成
int number;
number = 1;
// 最上段中央からはじめる
i = 1;
j = (5 / 2) + 1;
square[i][j] = number;
number++;
for( number = 2; number <= 5 * 5; number++ ) // 2以降はここで処理
{
// 右上に移動
i--;
j++;
while( square[i][j] != 0 ) // 右上に数字を置けないとき
{
if(i==0||i==6) // マトリックスから上にはみ出した
i = 5;
if(j==0||j==5+1) // 横にはみ出した
j = 1;
if(i==5||j==5) // 隅に来た
i += 2;
j--;
if(square[i][j]!=0) // 先客がいる
i += 2;
j--;
}
square[i][j] = number; // 魔方陣に数字を置く
}
// 魔方陣を表示する
for( i = 1; i <= 5 ; i++ )
{
for( j = 1; j <= 5 ; j++ )
printf( "%4d", square[i][j] );
printf( "\n" );
}
printf( "\n" );
return 0;
}
[/code]
ソースコード用のタグで囲ったところ、正しく表示されなかった為BBcodeを使用していません。
色が変わっておらず、見づらくなってしまいすみません。
よろしくお願いします。
c++基礎の質問
Re: c++基礎の質問
おそらくIE10をお使いですね?nanakamado さんが書きました:ソースコード用のタグで囲ったところ、正しく表示されなかった為BBcodeを使用していません。
Firefoxなど、別のブラウザを使用してみてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: c++基礎の質問
ほかの部分も大量の範囲外アクセスが見られます。
宣言がint square[5][5];なので、1番目、2番目の添字共に0~4の整数しか使えません。
宣言がint square[5][5];なので、1番目、2番目の添字共に0~4の整数しか使えません。
オフトピック
厳密には使えないわけではないですが、危険です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: c++基礎の質問
この部分も怪しいです。
最初でいきなり範囲外にアクセスする危険がありますし、すでにi==5なのにさらにi+=2;するのも変だと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: c++基礎の質問
アルゴリズムを実装して試したところ、各行、各列、2本の対角線の数字の和が全て65である出力が生成されました。
従って、アルゴリズムはおそらく合っていると思います。
従って、アルゴリズムはおそらく合っていると思います。
► スポイラーを表示
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)