c++基礎の質問

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
nanakamado

c++基礎の質問

#1

投稿記事 by nanakamado » 12年前

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を使用していません。
色が変わっておらず、見づらくなってしまいすみません。
よろしくお願いします。

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

Re: c++基礎の質問

#2

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

nanakamado さんが書きました:ソースコード用のタグで囲ったところ、正しく表示されなかった為BBcodeを使用していません。
おそらくIE10をお使いですね?
Firefoxなど、別のブラウザを使用してみてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: c++基礎の質問

#3

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

nanakamado さんが書きました:

コード:

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;
}
}
どう考えても要素数の範囲外にアクセスしています。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: c++基礎の質問

#4

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

ほかの部分も大量の範囲外アクセスが見られます。
宣言がint square[5][5];なので、1番目、2番目の添字共に0~4の整数しか使えません。
オフトピック
厳密には使えないわけではないですが、危険です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: c++基礎の質問

#5

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

nanakamado さんが書きました:

コード:

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--;
}
この部分も怪しいです。
最初でいきなり範囲外にアクセスする危険がありますし、すでにi==5なのにさらにi+=2;するのも変だと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: c++基礎の質問

#6

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

アルゴリズムを実装して試したところ、各行、各列、2本の対角線の数字の和が全て65である出力が生成されました。
従って、アルゴリズムはおそらく合っていると思います。
► スポイラーを表示
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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