弾を残像させる方法について
弾を残像させる方法について
こんにちは、お世話になってます。
龍神録のプロジェクトを利用させてもらってゲームをつくっているのですが、
タイトル通り、弾を残像させるエフェクトの作り方についての質問です。
残像というよりも、弾が尾を引くようなエフェクトといった方がいいかもしれません。
どなたか分かる方いましたらよろしくお願いします。
龍神録のプロジェクトを利用させてもらってゲームをつくっているのですが、
タイトル通り、弾を残像させるエフェクトの作り方についての質問です。
残像というよりも、弾が尾を引くようなエフェクトといった方がいいかもしれません。
どなたか分かる方いましたらよろしくお願いします。
Re:弾を残像させる方法について
残像させる、尾を引く、どちらでもですが過去の座標や方向などを配列に残してやる方法を使います。
新しく移動する度に座標を残して配列に格納していくわけです。
その配列に残された過去の座標を時系列順に取り出して残像などに使います。
イメージは伝わりましたかね?
新しく移動する度に座標を残して配列に格納していくわけです。
その配列に残された過去の座標を時系列順に取り出して残像などに使います。
イメージは伝わりましたかね?
Re:弾を残像させる方法について
前フレームの弾の座標を記憶しておいて、アルファブレンドすればそれっぽくなりそうですね。
α値は試行錯誤で良い値を見つけていくことになると思いますが、
例えば
「1フレーム前にあった座標x1,y1にα値240で描画」
「2フレーム前にあった座標x2,y2にα値230で描画」
「3フレーム前にあった座標x3,y3にα値220で描画」
「4フレーム前にあった座標x4,y4にα値210で描画」
「5フレーム前にあった座標x5,y5にα値200で描画」
「6フレーム前にあった座標x6,y6にα値190で描画」
.....
みたいな感じで古いものほど薄く描画すれば尾を引いた感じになりそうです。
α値は試行錯誤で良い値を見つけていくことになると思いますが、
例えば
「1フレーム前にあった座標x1,y1にα値240で描画」
「2フレーム前にあった座標x2,y2にα値230で描画」
「3フレーム前にあった座標x3,y3にα値220で描画」
「4フレーム前にあった座標x4,y4にα値210で描画」
「5フレーム前にあった座標x5,y5にα値200で描画」
「6フレーム前にあった座標x6,y6にα値190で描画」
.....
みたいな感じで古いものほど薄く描画すれば尾を引いた感じになりそうです。
Re:弾を残像させる方法について
ありがとうございます。
nフレーム前の座標を所得して、その座標にαブレンドした弾の画像を描画する…ということでしょうか?
どのような処理を書いていったらいいのかがよく分からないのです;
サンプルなどないでしょうか…
nフレーム前の座標を所得して、その座標にαブレンドした弾の画像を描画する…ということでしょうか?
どのような処理を書いていったらいいのかがよく分からないのです;
サンプルなどないでしょうか…
Re:弾を残像させる方法について
今後、弾幕を作っていくのにサンプルばかりに頼るのも初心者脱出の妨げになるので穴埋め問題にしてみました。
まず、前の座標を覚える配列を用意します。
10フレーム前まで覚えるなら
double bx[10];
double by[10];
double bangle[10];
を弾の構造体に追加します。
0.配列を初期化します。画面外にしたほうが良いでしょう。
※ 自分で考えてみてください。
1.座標をシフトします。後ろからやっている理由は考えてみてください。
for( int b=9 ; b>0 ; b-- ) {
shot[n].bullet[k].bangle = shot[n].bullet[k].bangle[b-1];
shot[n].bullet[k].bx = shot[n].bullet[k].bx[b-1];
shot[n].bullet[k].by = shot[n].bullet[k].by[b-1];
}
2.今の弾の座標を移動する前にコピーします。
shot[n].bullet[k].bangle[0] = shot[n].bullet[k].angle;
shot[n].bullet[k].bx[0] = shot[n].bullet[k].x;
shot[n].bullet[k].by[0] = shot[n].bullet[k].y;
3.残存の弾を表示します。
※ これも自分で考えてみてください。
まず、前の座標を覚える配列を用意します。
10フレーム前まで覚えるなら
double bx[10];
double by[10];
double bangle[10];
を弾の構造体に追加します。
0.配列を初期化します。画面外にしたほうが良いでしょう。
※ 自分で考えてみてください。
1.座標をシフトします。後ろからやっている理由は考えてみてください。
for( int b=9 ; b>0 ; b-- ) {
shot[n].bullet[k].bangle = shot[n].bullet[k].bangle[b-1];
shot[n].bullet[k].bx = shot[n].bullet[k].bx[b-1];
shot[n].bullet[k].by = shot[n].bullet[k].by[b-1];
}
2.今の弾の座標を移動する前にコピーします。
shot[n].bullet[k].bangle[0] = shot[n].bullet[k].angle;
shot[n].bullet[k].bx[0] = shot[n].bullet[k].x;
shot[n].bullet[k].by[0] = shot[n].bullet[k].y;
3.残存の弾を表示します。
※ これも自分で考えてみてください。
Re:弾を残像させる方法について
そうですね、少し自分で考えてやってみようと思います。
質問が二つあるのですが、①、手順0の「画面外に」とはどういうことなのでしょうか?
②、手順1以降の処理は、「graph.cpp」>「if(boss_shot.flag>0){//弾幕データがオンなら~~」の中で、「if(boss.shot.bullet[j].eff_detail==2){~~」というような分岐をさせて、その中に書くということで大丈夫なのでしょうか?
質問が二つあるのですが、①、手順0の「画面外に」とはどういうことなのでしょうか?
②、手順1以降の処理は、「graph.cpp」>「if(boss_shot.flag>0){//弾幕データがオンなら~~」の中で、「if(boss.shot.bullet[j].eff_detail==2){~~」というような分岐をさせて、その中に書くということで大丈夫なのでしょうか?
Re:弾を残像させる方法について
①、手順0の「画面外に」とはどういうことなのでしょうか?
画面内だと表示されてしまいますから。
別の方法として、表示しないフラグを追加するのも良い方法です。
②、それは表示である3.だけにしといたほうが良いですね。
1.と2.は弾の座標を計算している処理ところでやったほうが良いでしょう。
画面内だと表示されてしまいますから。
別の方法として、表示しないフラグを追加するのも良い方法です。
②、それは表示である3.だけにしといたほうが良いですね。
1.と2.は弾の座標を計算している処理ところでやったほうが良いでしょう。
Re:弾を残像させる方法について
うーん……
配列の初期化について調べてみたのですが、例えば
int hairetsu[5] = {0,1,2,3,4};
のようなものである
と書いてありました。
…画面外、画面内とはどこで指定すれば…
というか、そもそも自分が配列の初期化の意味を取り違えているような気もするのですが…
もしできたらもう少し詳しく教えていただけないでしょうか?
配列の初期化について調べてみたのですが、例えば
int hairetsu[5] = {0,1,2,3,4};
のようなものである
と書いてありました。
…画面外、画面内とはどこで指定すれば…
というか、そもそも自分が配列の初期化の意味を取り違えているような気もするのですが…
もしできたらもう少し詳しく教えていただけないでしょうか?
Re:弾を残像させる方法について
>配列の初期化
確かに私の書き方が悪かったですね。申し訳ないです。
弾を生成する度に、画面外の値を与えてくださいって意味です。
画面外の値とは、-100とか画面内に表示されない位置であれば何でも良いです。
確かに私の書き方が悪かったですね。申し訳ないです。
弾を生成する度に、画面外の値を与えてくださいって意味です。
画面外の値とは、-100とか画面内に表示されない位置であれば何でも良いです。
Re:弾を残像させる方法について
double bx[10] = -100;
残念ですが、C言語はこんな初期化は出来ません。
それに
>弾を生成する度
と書いたんですが、理解されてますか?
それと
>弾の構造体に追加します。
の部分を見逃していますよ。
もう一度私の書いた事を読み直してみてください。
その上で分からない部分はスルーするのではなく意味を聞いてくださいね。
残念ですが、C言語はこんな初期化は出来ません。
それに
>弾を生成する度
と書いたんですが、理解されてますか?
それと
>弾の構造体に追加します。
の部分を見逃していますよ。
もう一度私の書いた事を読み直してみてください。
その上で分からない部分はスルーするのではなく意味を聞いてくださいね。
Re:弾を残像させる方法について
今日もよろしくお願いしますm(__)m
>構造体に追加
struct.h内のbullet_tに、
double bx[10],by[10],bangle[10];
と追加したのですが、これで大丈夫でしょうか?
>弾を生成する度に
for(j=0;j<BOSS_BULLET_MAX;j++)
のループ内に書くということですか?
>構造体に追加
struct.h内のbullet_tに、
double bx[10],by[10],bangle[10];
と追加したのですが、これで大丈夫でしょうか?
>弾を生成する度に
for(j=0;j<BOSS_BULLET_MAX;j++)
のループ内に書くということですか?
Re:弾を残像させる方法について
>struct.h内のbullet_tに、
>double bx[10],by[10],bangle[10];
>と追加したのですが、これで大丈夫でしょうか?
大丈夫だと思います。
あと忘れていたのですが、ボスの弾に残像がある弾と無い弾があるなら残像の有無フラグも追加した方が良いでしょう。
>>弾を生成する度に
>for(j=0;j<BOSS_BULLET_MAX;j++)
>のループ内に書くということですか?
それってgraph_bullet()関数では?ここは弾の表示をする場所ですよね。
弾の残像の表示はここになりますが、弾を生成(発生)させているのは別の場所です。
そうですね。
たぶん、龍神録のすべての関数の役割を理解されていない物と思われますので、ボスに関係するすべての関数と役割を書いてみてもらえますか?
(例)
graph_bullet()・・・。弾の表示を行う関数。
雑魚の弾とボスの弾の表示を行っています。
少なくとも、ボスの行動、ボスの弾幕の制御、ボスの弾幕の生成、ボスの弾幕の制御、ボスの弾幕から弾の生成の部分は何処かは書き出してくださいね。
>double bx[10],by[10],bangle[10];
>と追加したのですが、これで大丈夫でしょうか?
大丈夫だと思います。
あと忘れていたのですが、ボスの弾に残像がある弾と無い弾があるなら残像の有無フラグも追加した方が良いでしょう。
>>弾を生成する度に
>for(j=0;j<BOSS_BULLET_MAX;j++)
>のループ内に書くということですか?
それってgraph_bullet()関数では?ここは弾の表示をする場所ですよね。
弾の残像の表示はここになりますが、弾を生成(発生)させているのは別の場所です。
そうですね。
たぶん、龍神録のすべての関数の役割を理解されていない物と思われますので、ボスに関係するすべての関数と役割を書いてみてもらえますか?
(例)
graph_bullet()・・・。弾の表示を行う関数。
雑魚の弾とボスの弾の表示を行っています。
少なくとも、ボスの行動、ボスの弾幕の制御、ボスの弾幕の生成、ボスの弾幕の制御、ボスの弾幕から弾の生成の部分は何処かは書き出してくださいね。
Re:弾を残像させる方法について
遅れました
間違っている可能性大ですが、
boss_shot_main()
enter_boss()
enter_boss_shot()
→ボス弾幕の制御でしょうか…
ボス関係で一番重要な関数だと思うのですが、詳しくは分かりませんでした…
boss_shot_bullet[boss.knd]()
boss_shot_calc)()
→弾幕の生成と計算
graph_boss()
→ボス本体の描画
calc.boss()
→ボスの動き(上下にふわふわと浮くような)の計算
waitandenter()
→弾幕関数にいくまでの時間を設定する
間違っている可能性大ですが、
boss_shot_main()
enter_boss()
enter_boss_shot()
→ボス弾幕の制御でしょうか…
ボス関係で一番重要な関数だと思うのですが、詳しくは分かりませんでした…
boss_shot_bullet[boss.knd]()
boss_shot_calc)()
→弾幕の生成と計算
graph_boss()
→ボス本体の描画
calc.boss()
→ボスの動き(上下にふわふわと浮くような)の計算
waitandenter()
→弾幕関数にいくまでの時間を設定する
Re:弾を残像させる方法について
やはり、関数群の役割を理解されていませんかね。
これを理解していないと改造など出来るはずもありませんので、なんども見直して考えてみましょう。ヒントを書きますので、もう一度コードを眺めたり、改造して動かして見てください。
まず基本的なソースコードの解読手法。
実は非常に有効な学習方法でもあります。
1.名前から機能を類推する。
例えば、enter_boss()ならenterは入り口とか参加するとかの意味ですね。
って事はenter_boss()はボス発生じゃないかと類推出来るワケです。
2.関数内で、どの構造体を変更しているかで機能を推測する。
使われている構造体とその内容から行っていることを推測します。
例えば、enter_boss()はボス構造体の初期化をしています。さらにnumが0の時は中ボスとして処理されている事がわかりますね。
3.関数の一部をコメントアウトしてみて動作の変化から機能を見つける。
例えば、graph_boss()の中身を全てコメントアウトするとボスが表示されなくなりますよね。
これでボスの表示をしている所だと分かるわけです。
4.デバッガで動きをトレースする。
調べたい関数の先頭でブレークした後、ステップ実行でプログラムの流れを追います。
if文など分岐点を調べる場合は、更にブレークポイントを設定して調べます。
で、今回の回答の正解か不正解かですが。
>boss_shot_main()
>enter_boss()
>enter_boss_shot()
>→ボス弾幕の制御でしょうか…
>ボス関係で一番重要な関数だと思うのですが、詳しくは分かりませんでした…
ヒントを出しましたので、もう少し調べてみてください。
ちなみに、boss_shot_main()は名前から類推出来る機能と実際に書かれているコードが食い違っています。
>boss_shot_bullet[boss.knd]()
関数ポインタによる呼び出しです。
実際に呼び出されている関数の方を書いてください。
>boss_shot_calc() →弾幕の生成と計算
惜しいですが微妙に違います。具体的にどんな計算をしているかも簡単に書いてください。
>graph_boss() →ボス本体の描画
これは名前通りですね。正解です。
>calc_boss() →ボスの動き(上下にふわふわと浮くような)の計算
これも正解です。
>waitandenter() →弾幕関数にいくまでの時間を設定する
微妙に違います。
enter_boss_shot()との関係でわかりますよ。
これを理解していないと改造など出来るはずもありませんので、なんども見直して考えてみましょう。ヒントを書きますので、もう一度コードを眺めたり、改造して動かして見てください。
まず基本的なソースコードの解読手法。
実は非常に有効な学習方法でもあります。
1.名前から機能を類推する。
例えば、enter_boss()ならenterは入り口とか参加するとかの意味ですね。
って事はenter_boss()はボス発生じゃないかと類推出来るワケです。
2.関数内で、どの構造体を変更しているかで機能を推測する。
使われている構造体とその内容から行っていることを推測します。
例えば、enter_boss()はボス構造体の初期化をしています。さらにnumが0の時は中ボスとして処理されている事がわかりますね。
3.関数の一部をコメントアウトしてみて動作の変化から機能を見つける。
例えば、graph_boss()の中身を全てコメントアウトするとボスが表示されなくなりますよね。
これでボスの表示をしている所だと分かるわけです。
4.デバッガで動きをトレースする。
調べたい関数の先頭でブレークした後、ステップ実行でプログラムの流れを追います。
if文など分岐点を調べる場合は、更にブレークポイントを設定して調べます。
で、今回の回答の正解か不正解かですが。
>boss_shot_main()
>enter_boss()
>enter_boss_shot()
>→ボス弾幕の制御でしょうか…
>ボス関係で一番重要な関数だと思うのですが、詳しくは分かりませんでした…
ヒントを出しましたので、もう少し調べてみてください。
ちなみに、boss_shot_main()は名前から類推出来る機能と実際に書かれているコードが食い違っています。
>boss_shot_bullet[boss.knd]()
関数ポインタによる呼び出しです。
実際に呼び出されている関数の方を書いてください。
>boss_shot_calc() →弾幕の生成と計算
惜しいですが微妙に違います。具体的にどんな計算をしているかも簡単に書いてください。
>graph_boss() →ボス本体の描画
これは名前通りですね。正解です。
>calc_boss() →ボスの動き(上下にふわふわと浮くような)の計算
これも正解です。
>waitandenter() →弾幕関数にいくまでの時間を設定する
微妙に違います。
enter_boss_shot()との関係でわかりますよ。
Re:弾を残像させる方法について
言われたとおりプログラムを見直してみました。
少しはプログラムの意味が分かってきた……ような気が…
各関数の役割の訂正も含めて、ボス関係の主な処理の流れを簡単にまとめてみたのですが、こんな感じであってるでしょうか?
boss_shot_main()
中ボス開始時間又はラスボス開始時間で、かつboss.flagが0
↓
enter_boss(0)
雑魚敵消去
雑魚弾幕消去
ボスの初期座標設定
(以上が中ボスの時だけの処理)
弾幕残り時間設定
弾幕の種類を一つづつ送る(boss.knd++)
boss.stateを1(待機中状態)に
↓
boss.stateが1になったので、boss_shot_main()の分岐を通ってwaitandenter()へ
waitandenter()
設定した時間がたったらenter_boss_shot()へ
↓
enter_boss_shot()
弾情報初期化
boss_shot.flagを1に
boss.stateを2(弾幕中状態)に
HP設定
↓
boss.stateが2になったので、boss_shot_main()の条件分岐を通って、
・boss_shot_bullet(0)
↑
1番目の弾幕
・boss_shot_calc()
↑
弾の座標計算(…もしかして此処に弾の残像の処理を書くのですか?)
へ。
boss_shot_main()内分岐
1番目の弾幕中でボスの体力が0になったら、
敵のピチュリ音
レーザー、弾情報初期化 enter_boss(1)へ
↓
enter_boss(1)
弾幕残り時間設定
弾幕の種類を一つづつ送る(boss.knd++)
boss.stateを1(待機中状態)に
・
・
・
繰り返し
・
・
・
最後の弾幕で、ボスの体力が0になったら
ボス撃破音
boss.flagを0に
少しはプログラムの意味が分かってきた……ような気が…
各関数の役割の訂正も含めて、ボス関係の主な処理の流れを簡単にまとめてみたのですが、こんな感じであってるでしょうか?
boss_shot_main()
中ボス開始時間又はラスボス開始時間で、かつboss.flagが0
↓
enter_boss(0)
雑魚敵消去
雑魚弾幕消去
ボスの初期座標設定
(以上が中ボスの時だけの処理)
弾幕残り時間設定
弾幕の種類を一つづつ送る(boss.knd++)
boss.stateを1(待機中状態)に
↓
boss.stateが1になったので、boss_shot_main()の分岐を通ってwaitandenter()へ
waitandenter()
設定した時間がたったらenter_boss_shot()へ
↓
enter_boss_shot()
弾情報初期化
boss_shot.flagを1に
boss.stateを2(弾幕中状態)に
HP設定
↓
boss.stateが2になったので、boss_shot_main()の条件分岐を通って、
・boss_shot_bullet(0)
↑
1番目の弾幕
・boss_shot_calc()
↑
弾の座標計算(…もしかして此処に弾の残像の処理を書くのですか?)
へ。
boss_shot_main()内分岐
1番目の弾幕中でボスの体力が0になったら、
敵のピチュリ音
レーザー、弾情報初期化 enter_boss(1)へ
↓
enter_boss(1)
弾幕残り時間設定
弾幕の種類を一つづつ送る(boss.knd++)
boss.stateを1(待機中状態)に
・
・
・
繰り返し
・
・
・
最後の弾幕で、ボスの体力が0になったら
ボス撃破音
boss.flagを0に
Re:弾を残像させる方法について
良いですよ!さっきより大分と整理されましたね。
問題などポイントを絞って説明しますね。
>enter_boss_shot()
弾情報初期化じゃなくて弾幕情報の初期化ですね。
理解されているとは思いますけど念のため。
>・boss_shot_calc()
>↑
>弾の座標計算(…もしかして此処に弾の残像の処理を書くのですか?)
>へ。
そうです。残像の配列をコピーしたり配列への座標設定はここに記述します。
あと問題は、弾が生成される場所が書かれていないので残像の座標を画面外に設定する場所が決まりません。
弾の残像の表示場所は前回出ているのでわかりますね?
問題などポイントを絞って説明しますね。
>enter_boss_shot()
弾情報初期化じゃなくて弾幕情報の初期化ですね。
理解されているとは思いますけど念のため。
>・boss_shot_calc()
>↑
>弾の座標計算(…もしかして此処に弾の残像の処理を書くのですか?)
>へ。
そうです。残像の配列をコピーしたり配列への座標設定はここに記述します。
あと問題は、弾が生成される場所が書かれていないので残像の座標を画面外に設定する場所が決まりません。
弾の残像の表示場所は前回出ているのでわかりますね?
Re:弾を残像させる方法について
後少しで過去ログにいってしまいそうだったので、コメントだけでも…
ここ数日学校の用事のため書き込みができませんでした;
softyaさん申し訳ないです。
今日の夜にはPCを開くことができそうなので、ご教授お願いしますm(__)m
ここ数日学校の用事のため書き込みができませんでした;
softyaさん申し訳ないです。
今日の夜にはPCを開くことができそうなので、ご教授お願いしますm(__)m
Re:弾を残像させる方法について
大分後ろに下がってしまったのでコメントだけでも…
ここ数日、学校の用事で書き込みができませんでした;
softyaさん申し訳ないです。
今日の夜にはPCを開くことができそうなので、ご教授お願いしますm(__)m
ここ数日、学校の用事で書き込みができませんでした;
softyaさん申し訳ないです。
今日の夜にはPCを開くことができそうなので、ご教授お願いしますm(__)m
C++の宿題での質問です
今回は3x3行列の和、差、積という宿題についての質問です。
宿題の内容は以下の通りです。
=問題=
* 以下の機能を持つプログラムを、「プログラム作成の系統的な手順」に従って作成せよ。
1. 指定された3x3の行列(行列1または行列2)に値を入力する
2. 行列1+行列2を求める
3. 行列1-行列2を求める
4. 行列1x行列2を求める
5. 行列1、行列2、または計算結果を表示する
6. 行列1x行列2の中間式を表示する。なお、負の数は()で囲むこと
7. プログラムを終了する
* 5種類の機能を個別に実行できるようにすること
* 行列の要素はint型
* 行列の要素の初期値は0
=演習問題の考え方=
関数
* 主プログラム(main)
* 指定された行列を入力する。(getMatrix)
* 指定された行列を表示する。(showMatrix)
* 行列の和を求める。(addMatrix)
* 行列の差を求める。(subtractMatrix)
* 行列の積を求める。(multiplyMatrix)
* 行列の積の中間結果を表示する。(showMultiplicationFormula)
* 機能を一覧表示する。(showMenu)
=アルゴリズム=
定数: 行列の大きさ N
定数: 機能番号0 「終了」
機能番号1 「行列の入力」
機能番号2
「行列の表示」
機能番号3 「行列の和」
機能番号4 「行列の差」
機能番号5 「行列の積」
機能番号6 「中間式の表示」
=主プログラム=
変数: 機能番号 int functionNo
操作する行列番号 int matrixNo
配列1 int matrix1[N][N]
配列2 int matrix2[N][N]
計算結果 int matrix3[N][N]
1. 機能を一覧表示する。
2. 機能番号を入力する。
3. 機能番号が「終了」でない限り以下の処理を繰り返す。
3-1. 機能番号が「行列の入力」ならば、以下の処理を実行する。
3-1-1. 行列番号(1=配列1 or 2=配列2)を入力する。
3-1-2. 指定された行列に値を入力する。
3-2. 機能番号が「行列の表示」ならば、以下の処理を実行する。
3-2-1. 行列番号(1=配列1, 2=配列2 or 3=計算結果)を入力する。
3-2-2. 指定された行列を表示する。
3-3. 機能番号が「行列の和」ならば、行列の和を求める。
3-4. 機能番号が「行列の差」ならば、行列の差を求める。
3-5. 機能番号が「行列の積」ならば、行列の積を求める。
3-6. 機能番号が「中間式の表示」ならば、行列の積を求める中間式を表示する。
3-7. 機能を一覧表示する。
3-8. 機能番号を入力する。
指定された行列に値を入力する
引数:指定された行列
アルゴリズムはプログラミング演習1-10を参考にすること。
指定された行列を表示する
引数:指定された行列
アルゴリズムはプログラミング演習1-10を参考にすること。
行列の和を求める
引数:行列1、行列2、計算結果
1. 各行row に対して以下の処理を繰り返す
1-1. 当該行の各列column に対して以下の処理を繰り返す。
1-1-1. 行列1のrow行 column列の値と行列2のrow行 column列の値を加えて、計算結果のrow行 column列に代入する。
行列の差を求める
引数:行列1、行列2、計算結果
1. 各行row に対して以下の処理を繰り返す
1-1. 当該行の各列column に対して以下の処理を繰り返す。
1-1-1. 行列1のrow行 column列の値から行列2のrow行 column列の値を引いて、計算結果のrow行 column列に代入する。
行列の積を求める
引数:行列1、行列2、計算結果
1. 各行row に対して以下の処理を繰り返す
1-1. 当該行の各列column に対して以下の処理を繰り返す。
1-1-1. 計算結果のrow行 column列を 0 とする。
1-1-2. 変数 iの値を0~N-1まで変えながら以下の処理を繰り返す。
1-1-2-1. 行列1のrow行 i列の値と行列2のi行 column列の値を乗じて、計算結果のrow行 column列に加算する。
行列の積を求める中間式を表示する
引数:行列1、行列2
1. 各行row に対して以下の処理を繰り返す。
1-1. 当該行の各列column に対して以下の処理を繰り返す。
1-1-1. 変数 iの値を0~N-1まで変えながら以下の処理を繰り返す。
1-1-1-1. 行列1のrow行 i列の値を表示する。(負数の場合のみ()で囲む)
1-1-1-2. "*"を表示する。
1-1-1-3. 行列2のi行 column列の値を表示する。(負数の場合のみ()で囲む)
1-1-1-4. iがN-1でなければ"+"を表示する。
1-2. 改行する。
機能の一覧を表示する
アルゴリズムはプログラミング演習1-10を参考にすること。
宿題の内容は以下の通りです。
=問題=
* 以下の機能を持つプログラムを、「プログラム作成の系統的な手順」に従って作成せよ。
1. 指定された3x3の行列(行列1または行列2)に値を入力する
2. 行列1+行列2を求める
3. 行列1-行列2を求める
4. 行列1x行列2を求める
5. 行列1、行列2、または計算結果を表示する
6. 行列1x行列2の中間式を表示する。なお、負の数は()で囲むこと
7. プログラムを終了する
* 5種類の機能を個別に実行できるようにすること
* 行列の要素はint型
* 行列の要素の初期値は0
=演習問題の考え方=
関数
* 主プログラム(main)
* 指定された行列を入力する。(getMatrix)
* 指定された行列を表示する。(showMatrix)
* 行列の和を求める。(addMatrix)
* 行列の差を求める。(subtractMatrix)
* 行列の積を求める。(multiplyMatrix)
* 行列の積の中間結果を表示する。(showMultiplicationFormula)
* 機能を一覧表示する。(showMenu)
=アルゴリズム=
定数: 行列の大きさ N
定数: 機能番号0 「終了」
機能番号1 「行列の入力」
機能番号2
「行列の表示」
機能番号3 「行列の和」
機能番号4 「行列の差」
機能番号5 「行列の積」
機能番号6 「中間式の表示」
=主プログラム=
変数: 機能番号 int functionNo
操作する行列番号 int matrixNo
配列1 int matrix1[N][N]
配列2 int matrix2[N][N]
計算結果 int matrix3[N][N]
1. 機能を一覧表示する。
2. 機能番号を入力する。
3. 機能番号が「終了」でない限り以下の処理を繰り返す。
3-1. 機能番号が「行列の入力」ならば、以下の処理を実行する。
3-1-1. 行列番号(1=配列1 or 2=配列2)を入力する。
3-1-2. 指定された行列に値を入力する。
3-2. 機能番号が「行列の表示」ならば、以下の処理を実行する。
3-2-1. 行列番号(1=配列1, 2=配列2 or 3=計算結果)を入力する。
3-2-2. 指定された行列を表示する。
3-3. 機能番号が「行列の和」ならば、行列の和を求める。
3-4. 機能番号が「行列の差」ならば、行列の差を求める。
3-5. 機能番号が「行列の積」ならば、行列の積を求める。
3-6. 機能番号が「中間式の表示」ならば、行列の積を求める中間式を表示する。
3-7. 機能を一覧表示する。
3-8. 機能番号を入力する。
指定された行列に値を入力する
引数:指定された行列
アルゴリズムはプログラミング演習1-10を参考にすること。
指定された行列を表示する
引数:指定された行列
アルゴリズムはプログラミング演習1-10を参考にすること。
行列の和を求める
引数:行列1、行列2、計算結果
1. 各行row に対して以下の処理を繰り返す
1-1. 当該行の各列column に対して以下の処理を繰り返す。
1-1-1. 行列1のrow行 column列の値と行列2のrow行 column列の値を加えて、計算結果のrow行 column列に代入する。
行列の差を求める
引数:行列1、行列2、計算結果
1. 各行row に対して以下の処理を繰り返す
1-1. 当該行の各列column に対して以下の処理を繰り返す。
1-1-1. 行列1のrow行 column列の値から行列2のrow行 column列の値を引いて、計算結果のrow行 column列に代入する。
行列の積を求める
引数:行列1、行列2、計算結果
1. 各行row に対して以下の処理を繰り返す
1-1. 当該行の各列column に対して以下の処理を繰り返す。
1-1-1. 計算結果のrow行 column列を 0 とする。
1-1-2. 変数 iの値を0~N-1まで変えながら以下の処理を繰り返す。
1-1-2-1. 行列1のrow行 i列の値と行列2のi行 column列の値を乗じて、計算結果のrow行 column列に加算する。
行列の積を求める中間式を表示する
引数:行列1、行列2
1. 各行row に対して以下の処理を繰り返す。
1-1. 当該行の各列column に対して以下の処理を繰り返す。
1-1-1. 変数 iの値を0~N-1まで変えながら以下の処理を繰り返す。
1-1-1-1. 行列1のrow行 i列の値を表示する。(負数の場合のみ()で囲む)
1-1-1-2. "*"を表示する。
1-1-1-3. 行列2のi行 column列の値を表示する。(負数の場合のみ()で囲む)
1-1-1-4. iがN-1でなければ"+"を表示する。
1-2. 改行する。
機能の一覧を表示する
アルゴリズムはプログラミング演習1-10を参考にすること。
Re:C++の宿題での質問です
わかる範囲で以下のように書いてみてコンパイルしたところ、 「'showMatrix' : 関数に 1 個の引数を指定できません。」とエラーがでましたが、どうしたらいいかわかりません。
OS:Vista
コンパイラ:VC++ 2008
C++は数カ月程度の初心者です。 どうかお願いします。
長すぎるようなので、二つに切りました(その1)
OS:Vista
コンパイラ:VC++ 2008
C++は数カ月程度の初心者です。 どうかお願いします。
長すぎるようなので、二つに切りました(その1)
#include <iostream> using namespace std; //定数定義 #define N 3 #define END 0 //終了 #define INPUT 1 //行列の入力 #define SHOW 2 //表示 #define ADD 3 //行列の和 #define SUB 4 //行列の差 #define MULTI 5 //行列の積 #define SHOWMULTI 6 //中間式の表示 //プロトタイプ宣言 void showMenu(int matrix[N][N]); //機能の一覧を表示する関数 void getMatrix(int matrix[N][N]); //行列に値を入力する関数 void showMatrix(int matrix1[N][N], int matrix2[N][N], int matrix3[N][N]); //行列を表示する関数 void addMatrix(int matrix1[N][N], int matrix2[N][N], int matrix3[N][N]); //行列の和を求める関数 void subtractMatrix(int matrix1[N][N], int matrix2[N][N], int matrix3[N][N]); //行列の差を求める関数 void multiplyMatrix(int matrix1[N][N], int matrix2[N][N], int matrix3[N][N]); //行列の積を求める関数 void showMultiplicationFormula(int matrix1[N][N], int matrix2[N][N]); //行列の積の中間結果を表示する関数 void showMenu(void); //機能の一覧を表示する関数 /****************************** メイン関数 ******************************/ void main(){ int functionNo; //機能番号 int matrixNo; //操作する行列番号 int matrix1[N][N] = { //配列1 {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, }; int matrix2[N][N] = { //配列2 {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, }; int matrix3[N][N] = { //計算結果 {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, }; //1.機能の一覧を表示する showMenu(); //2.機能番号を入力する cout << "機能番号を入力してください"; cin >> functionNo; //3.機能番号が「終了」でない限り、以下の処理を繰り返す while(functionNo != END){ //機能番号に対応する処理に分岐する switch(functionNo) { //3.1機能番号が「行列の入力」ならば、以下の処理を実行する case INPUT: //3.1.1行列番号(1=配列1 or 2=配列2)を入力する cout << "入力する配列は? (1 or 2) : "; cin >> matrixNo; //3.1.2指定された行列を入力する if(matrixNo == 1){ getMatrix(matrix1); } else if(matrixNo == 2){ getMatrix(matrix2); } else{ cout << "配列番号がおかしいです"; } break; //3.2機能番号が「行列の表示」ならば、以下の処理を実行する case SHOW: //3.2.1配列番号を入力する cout << "表示する配列は? (1, 2 or 3) : "; cin >> matrixNo; //3.2.2指定された行列を表示する if(matrixNo == 1){ showMatrix(matrix1); } else if(matrixNo == 2){ showMatrix(matrix2); } else if(matrixNo == 3){ showMatrix(matrix3); } else{ cout << "配列番号がおかしいです"; } break; //3.3機能番号が「行列の和」ならば、以下の処理を実行する case ADD: addMatrix(matrix1, matrix2, matrix3); break; //3.4機能番号が「行列の差」ならば、以下の処理を実行する case SUB: subtractMatrix(matrix1, matrix2, matrix3); break; //3.5機能番号が「行列の積」ならば、以下の処理を実行する case MULTI: multiplyMatrix(matrix1, matrix2, matrix3); break; //3.6機能番号「中間式の表示」ならば、以下の処理を実行する case SHOWMULTI: showMultiplicationFormula(matrix1, matrix2); break; //機能番号が0~6以外ならば、コメントを表示する default: cout << "機能番号が対応していません" << endl; break; //3.7機能を一覧表示する showMenu(); cout << "機能番号="; //3.8機能番号を入力する cin >> functionNo; } } }
Re:C++の宿題での質問です
(その2)です。
/************************************ 指定された行列に値を入力する ************************************/ void getMatrix(int matrix[N][N]){ //1.各行rowに対して以下の処理を繰り返す for(int i = 0; i < N; i++){ //1.1.当該行の各列columnに対して以下の処理を繰り返す for(int j = 0; j < N; j++){ //1.1.1.指定された行列のrow行column列の要素に値を入力する cout << "行列の" << i << "行" << j << "列要素を入力してください:"; cin >> matrix[j]; } } } /************************************ 指定された行列を表示する ************************************/ void showMatrix(int matrix[N][N]){ //1.各行rowに対して以下の処理を繰り返す for(int i = 0; i < N; i++){ //1.1.各列columnに対して以下の処理を繰り返す for(int j = 0; j < N; j++){ //1.1.1.行列のrow行 column列の要素の値を表示する cout << matrix[j] << "\t"; } cout << endl; } cout << endl; } /************************** 行列の和を求める **************************/ void addMatrix(int matrix1[N][N], int matrix2[N][N], int matrix3[N][N]){ //1.配列の各要素を加算する for(int i = 0; i < N; i++){ for(int j = 0; j < N; j++){ matrix3[j] = matrix1[j] + matrix2[j]; } } } /************************** 行列の差を求める **************************/ void subtractMatrix(int matrix1[N][N], int matrix2[N][N], int matrix3[N][N]){ //1.配列の各要素を減算する for(int i = 0; i < N; i++){ for(int j = 0; j < N; j++){ matrix3[j] = matrix1[j] - matrix2[j]; } } } /************************** 行列の積を求める **************************/ void multiplyMatrix(int matrix1[N][N], int matrix2[N][N], int matrix3[N][N]){ //1.各行rowに対して以下の処理を繰り返す for(int i = 0; i < N; i++){ //1.1.当該行の各列columnに対して以下の処理を繰り返す for(int j = 0; j < N; j++){ //1.1.1.計算結果のrow行column列を0とする matrix3[j] = 0; //1.1.2.変数 kの値を0~N-1まで変えながら以下の処理を繰り返す for(int k = 0; k < N-1; k++){ //1.1.2.1.行列1のrow行 k列の値と行列2のk行 column列の値を乗じて、計算結果のrow行 column列に加算する。 int x = matrix3[j] + matrix1[i][k] * matrix2[k][j]; matrix3[i][j] = x; } } } } /********************************* 行列の積を求める中間式を表示する *********************************/ void showMultiplicationFormula(int matrix1[N][N], int matrix2[N][N]){ //1.各行rowに対して以下の処理を繰り返す for(int i = 0; i < N; i++){ //1.1.当該行の各列columnに対して以下の処理を繰り返す for(int j = 0; j < N; j++){ //1.1.1.変数 kの値を0~N-1まで変えながら以下の処理を繰り返す for(int k = 0; k < N-1; k++){ //1.1.1.1.行列1のrow行 i列の値を表示する。(負数の場合のみ()で囲む) cout << matrix1[i][k]; //1.1.1.2."*"を表示する cout << " * "; //1.1.1.3.行列2のi行 column列の値を表示する。(負数の場合のみ()で囲む) cout << matrix2[k][j]; //1.1.1.4.kがN-1でなければ "+"を表示する if(k != N-1){ cout << " + "; } } } //1.2.改行する cout << endl; } } /****************************** 機能の一覧を表示する ******************************/ void showMenu(void){ //1.機能番号の一覧を表示する cout << "機能番号を選択してください" << endl; cout << " 0 " << "プログラムの終了(END)" << endl; cout << " 1 " << "行列の入力(INPUT)" << endl; cout << " 2 " << "行列の表示(SHOW)" << endl; cout << " 3 " << "行列の和(ADD)" << endl; cout << " 4 " << "行列の差(SUB)" << endl; cout << " 5 " << "行列の積(MULTI)" << endl; cout << " 6 " << "中間式の表示(SHOWMULTI)" << endl; }
Re:C++の宿題での質問です
> 「'showMatrix' : 関数に 1 個の引数を指定できません。」とエラーがでましたが、どうしたらいいかわかりません。
選択肢は次のどれかです。
・showMatrixに適切な実引数を3つ渡す。
・showMatrixに省略時実引数を設定する。
・多重定義されたshowMatrixの宣言を呼出しより前に行う。
・showMatrixではなく、別の関数を呼び出す。
・showMatrixの呼び出しそのものをやめる。
選択肢は次のどれかです。
・showMatrixに適切な実引数を3つ渡す。
・showMatrixに省略時実引数を設定する。
・多重定義されたshowMatrixの宣言を呼出しより前に行う。
・showMatrixではなく、別の関数を呼び出す。
・showMatrixの呼び出しそのものをやめる。
Re:C++の宿題での質問です
>showMatrixに省略時実引数を設定する。
>多重定義されたshowMatrixの宣言を呼出しより前に行う。
とは、具体的にどうしたらいいんでしょうか?
>多重定義されたshowMatrixの宣言を呼出しより前に行う。
とは、具体的にどうしたらいいんでしょうか?
Re:C++の宿題での質問です
以下のように書き換えたところ当初のエラーはなくなったのですが、新たに 「'addMatrix' : 1 番目の引数を 'int' から 'int [/url][3]' に変換できません。(新しい機能 ; ヘルプを参照)」と表示されました。
どうしたらいいでしょうか?
どうしたらいいでしょうか?
//プロトタイプ宣言 void showMenu(int matrix[N][N]); //機能の一覧を表示する関数 void getMatrix(int matrix[N][N]); //行列に値を入力する関数 void showMatrix(int matrix[N][N]); //行列を表示する関数 void addMatrix(int matrix1[N][N], int matrix2[N][N], int matrix3[N][N]); //行列の和を求める関数 void subtractMatrix(int matrix1[N][N], int matrix2[N][N], int matrix3[N][N]); //行列の差を求める関数 void multiplyMatrix(int matrix1[N][N], int matrix2[N][N], int matrix3[N][N]); //行列の積を求める関数 void showMultiplicationFormula(int matrix1[N][N], int matrix2[N][N]); //行列の積の中間結果を表示する関数 void showMenu(void); //機能の一覧を表示する関数 /****************************** メイン関数 ******************************/ void main(){ int functionNo; //機能番号 int matrixNo; //操作する行列番号 int matrix1[N][N] = { //配列1 {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, }; int matrix2[N][N] = { //配列2 {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, }; int matrix3[N][N] = { //計算結果 {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, }; //1.機能の一覧を表示する showMenu(); //2.機能番号を入力する cout << "機能番号を入力してください。機能番号= "; cin >> functionNo; //3.機能番号が「終了」でない限り、以下の処理を繰り返す while(functionNo != END){ //機能番号に対応する処理に分岐する switch(functionNo) { //3.1機能番号が「行列の入力」ならば、以下の処理を実行する case INPUT: //3.1.1行列番号(1=配列1 or 2=配列2)を入力する cout << "入力する配列は? (1 or 2) : "; cin >> matrixNo; //3.1.2指定された行列を入力する if(matrixNo == 1){ getMatrix(matrix1); } else if(matrixNo == 2){ getMatrix(matrix2); } else{ cout << "配列番号がおかしいです"; } break; //3.2機能番号が「行列の表示」ならば、以下の処理を実行する case SHOW: //3.2.1配列番号を入力する cout << "表示する配列は? (1, 2 or 3) : "; cin >> matrixNo; //3.2.2指定された行列を表示する if(matrixNo == 1){ showMatrix(matrix1); } else if(matrixNo == 2){ showMatrix(matrix2); } else if(matrixNo == 3){ showMatrix(matrix3); } else{ cout << "配列番号がおかしいです"; } break; //3.3機能番号が「行列の和」ならば、以下の処理を実行する case ADD: addMatrix(matrix1[N][N], matrix2[N][N], matrix3[N][N]); break; //3.4機能番号が「行列の差」ならば、以下の処理を実行する case SUB: subtractMatrix(matrix1[N][N], matrix2[N][N], matrix3[N][N]); break; //3.5機能番号が「行列の積」ならば、以下の処理を実行する case MULTI: multiplyMatrix(matrix1[N][N], matrix2[N][N], matrix3[N][N]); break; //3.6機能番号「中間式の表示」ならば、以下の処理を実行する case SHOWMULTI: showMultiplicationFormula(matrix1, matrix2); break; //機能番号が0~6以外ならば、コメントを表示する default: cout << "機能番号が対応していません" << endl; break; } //3.7機能を一覧表示する showMenu(); //3.8機能番号を入力する cout << "機能番号="; cin >> functionNo; } }
Re:C++の宿題での質問です
>'addMatrix' : 1 番目の引数を 'int' から 'int [/url][3]' に変換できません
渡す引数が間違っているからエラーになります。
渡そうとした引数の中身を確認してみましょう。
渡す引数が間違っているからエラーになります。
渡そうとした引数の中身を確認してみましょう。