質問するログイン新規登録

Q&A

解決済

2回答

3023閲覧

二重if文が思うように動作してくれない

yossy0502denpa

総合スコア5

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/02/10 04:58

編集NaN/aN/aN aN:aN

0

0

前提・実現したいこと

概要として,二重if文と複数個のデータ,それぞれD1,D2,D3,D4...があり,
一つ目の条件式でD1を出力,二つ目の条件式でD2を出力して一つ目の条件式に戻る
また一つ目の条件式でD3を,二つ目の条件式でD4を...とループさせたいです.

しかし下記のプログラムでは仕様のような動きをせず,D1がそのまま条件式1,2に適用されています.

どうすれば一つの条件式に対し一つの計測値を対応させることが出来るでしょうか?
また,この仕様の動きをさせるには二重if文以外の文がいいでしょうか?
どのようなプログラム文にすればいいか教えてください

該当のソースコード

C++ if (Average < -0.30){ //左に偏りすぎ→最も低い和音C play(chord::```C```); Total = 0; //コードを出力して初期化 if (Average < -0.30){ //左に偏りすぎ→音程そのままマイナー play(chord::```Cm```); Total = 0; //完結 次のコード進行へ } else if ((-0.30 <= Average) && (Average < -0.10)){ //左に少し偏っている→低く明るいコード進行和音 play(chord::```Csus4```); Total = 0; //完結 次のコード進行へ } else if ((-0.10 <= Average) && (Average <= 0.10)){ //正常→転換 noteOn(60, 127); Sleep(375); noteOn(64, 127); Sleep(375); noteOn(67, 127); Sleep(375); noteOn(72, 127); Sleep(375); noteOff(60); noteOff(64); noteOff(67); noteOff(72); Total = 0; //転換 次のコード進行へ } else if ((0.10 < Average) && (Average <= 0.30)){ //右に少し偏っている→高く明るいコード進行和音 play(chord::```Dsus4```); Total = 0; //完結 次のコード進行へ } else if (0.30 < Average){ //右に偏りすぎ→音程一個上がってマイナー play(chord::```CSm```); Total = 0; //完結 次のコード進行へ } } else if ((-0.30 <= Average) && (Average < -0.10)){ //左に少し偏っている→二番目に低い和音DS play(chord::```DS```); Total = 0; if (Average < -0.30){ //左に偏りすぎ→音程一個下がってマイナー play(chord::```Dm```); Total = 0; //完結 次のコード進行へ } else if ((-0.30 <= Average) && (Average < -0.10)){ //左に少し偏っている→低く明るいコード進行和音 play(chord::```CSsus4```); Total = 0; //完結 次のコード進行へ } else if ((-0.10 <= Average) && (Average <= 0.10)){ //正常→転換 noteOn(63, 127); Sleep(375); noteOn(67, 127); Sleep(375); noteOn(70, 127); Sleep(375); noteOn(75, 127); Sleep(375); noteOff(63); noteOff(67); noteOff(70); noteOff(75); Total = 0; //転換 次のコード進行へ } else if ((0.10 < Average) && (Average <= 0.30)){ //右に少し偏っている→高く明るいコード進行和音 play(chord::```Fsus4```); Total = 0; //完結 次のコード進行へ } else if (0.30 < Average){ //右に偏りすぎ→音程一個上がってマイナー play(chord::```Em```); Total = 0; //完結 次のコード進行へ } } else if ((-0.10 <= Average) && (Average <= 0.10)){ //正常→基準の和音FS play(chord::```FS```); Total = 0; if (Average < -0.30){ //左に偏りすぎ→音程一個下がってマイナー play(chord::```Fm```); Total = 0; //完結 次のコード進行へ } else if ((-0.30 <= Average) && (Average < -0.10)){ //左に少し偏っている→低く明るいコード進行和音 play(chord::```Esus4```); Total = 0; //完結 次のコード進行へ } else if ((-0.10 <= Average) && (Average <= 0.10)){ //正常→明るいコード進行FSsus4 play(chord::```FSsus4```); Total = 0; //完結 次のコード進行へ } else if ((0.10 < Average) && (Average <= 0.30)){ //右に少し偏っている→高く明るいコード進行和音 play(chord::```GSsus4```); Total = 0; //完結 次のコード進行へ } else if (0.30 < Average){ //右に偏りすぎ→音程一個上がってマイナー play(chord::```Gm```); Total = 0; //完結 次のコード進行へ } } else if ((0.10 < Average) && (Average <= 0.30)){ //右に少し偏っている→2番目に高い和音A play(chord::```A```); Total = 0; if (Average < -0.30){ //左に偏りすぎ→音程一個下がってマイナー play(chord::```GSm```); Total = 0; //完結 次のコード進行へ } else if ((-0.30 <= Average) && (Average < -0.10)){ //左に少し偏っている→低く明るいコード進行和音 play(chord::```Gsus4```); Total = 0; //完結 次のコード進行へ } else if ((-0.10 <= Average) && (Average <= 0.10)){ //正常→転換 noteOn(69, 127); Sleep(375); noteOn(73, 127); Sleep(375); noteOn(76, 127); Sleep(375); noteOn(81, 127); Sleep(375); noteOff(69); noteOff(73); noteOff(76); noteOff(81); Total = 0; //転換 次のコード進行へ } else if ((0.10 < Average) && (Average <= 0.30)){ //右に少し偏っている→高く明るいコード進行和音 play(chord::```Bsus4```); Total = 0; //完結 次のコード進行へ } else if (0.30 < Average){ //右に偏りすぎ→音程一個上がってマイナー play(chord::```ASm```); Total = 0; //完結 次のコード進行へ } } else if (0.30 < Average){ //右に偏りすぎ→最も高い和音hiC play(chord::```hiC```); Total = 0; if (Average < -0.30){ //左に偏りすぎ→音程一個下がってマイナー play(chord::```Bm```); Total = 0; //完結 次のコード } else if ((-0.30 <= Average) && (Average < -0.10)){ //左に少し偏っている→低く明るいコード進行和音 play(chord::```ASsus4```); Total = 0; //完結 次のコード進行へ } else if ((-0.10 <= Average) && (Average <= 0.10)){ //正常→転換 noteOn(72, 127); Sleep(375); noteOn(76, 127); Sleep(375); noteOn(79, 127); Sleep(375); noteOn(84, 127); Sleep(375); noteOff(72); noteOff(76); noteOff(79); noteOff(84); Total = 0; //転換 次のコード進行へ } else if ((0.10 < Average) && (Average <= 0.30)){ //右に少し偏っている→高く明るいコード進行和音 play(chord::```hiCsus4```); Total = 0; //完結 次のコード進行へ } else if (0.30 < Average){ //右に偏りすぎ→音程そのままマイナー play(chord::```hiCm```); Total = 0; //完結 次のコード進行へ } }

簡易的なプログラム文

例えば計測データが「0,0,1,0...」だった場合,下記のようなプログラムを経て
C,Cm,hiC,hiCm と出力してほしいのです.

if (Data == 0){ play(chord::C); Total = 0; if (Data == 0){ play(chord::Cm); Total = 0; } else if (Data == 1){ play(chord::Csus4); Total = 0; } } else if (Data == 1){ play(chord::hiC); Total = 0; if (Data == 0){ play(chord::hiCm); Total = 0; } else if (Data == 1){ play(chord::hiCsus4); Total = 0; } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

riko111

2020/02/10 05:15

編集画面でコード部分を選択後、<code>ボタンをクリックして、コードの表示にしてください。
yossy0502denpa

2020/02/10 05:48

このような形でよろしいでしょうか!
riko111

2020/02/10 05:53

ああ、すみません、コードというのは音楽のコードのことではなくて、プログラムのソースコードのことです。 というか、あなたが1週間前にした質問だとちゃんとプログラムのソースコードがちゃんとした表示になってるようですけど…。 前の質問のやり直しがこの質問ということなら、前の質問はちゃんと終了させておいてください。
takabosoft

2020/02/10 05:56

MIDIかなにかの再生ルーチンなのかと思いますが、質問が全く理解できません・・・
yossy0502denpa

2020/02/10 06:05

>>>takabosoft おっしゃる通りMIDIの出力です. 現状,計測データ一つが条件1,2どちらにも適応されているので, 条件一つにつき一つの計測データだけを適応し,二つ目の条件には2個目の計測データを参照したいのです.
riko111

2020/02/10 06:05

ループさせたい、ということですが条件分岐(if文)しか見当たりません。 書き写して頂いたところ以外の部分に繰り返しのコードが書かれているのでしょうか?
fana

2020/02/10 06:10

質問内容の話(「2重のifと複数個のデータがどうの…」という話)をすることができる10行程度の完結したコード例を示すとか,あるいはせめて処理フローに無関係な部分を省略するなりした状態のコードを示すことはできないのでしょうか?
yossy0502denpa

2020/02/10 06:11

>>>riko111さん いいえ. 繰り返しのコードの書き方が分からなかったのと,実行した際に一つ目の計測データの出力が終わったあと二つ目,三つ目の計測データも順に出力されたので繰り返しのコードは書かれていないです.
yossy0502denpa

2020/02/10 06:12

>>>fanaさん 追記しますので少々お待ちください!
fana

2020/02/10 06:17

いや,別に私が待つわけでもないのですが… 現状,質問内容が他者に伝わらないのではないかな,と. 例えば,「複数個のデータ」を何個かのintなりint型配列として「出力」をprintf()か何かにしたようなものでも処理フローの話はできると思うのです.
riko111

2020/02/10 06:20

確認 1.if文で使用されているAverageという変数には何が格納されているのでしょう? 2.1つ目の計測データ、2つ目の計測データ、等と言われていますが、if文に書かれているのは全部おなじAverageなのはなぜですか?
Zuishin

2020/02/10 06:40

「簡易的なプログラム」を見る限りネストさせる必要はまるでありませんね。
yossy0502denpa

2020/02/10 06:46

>>>riko111さん Averageは,この分の前のプログラム文中で, 約7000行のエクセルデータを計算しpush_backで配列にしたものを1500行ずつ総和を出し,それを1500で割った平均値が入っています. 0~1499行分の総和から出した平均が概要中のData1,以下同様です.
riko111

2020/02/10 06:48

つまり、Averageも配列のデータだというとですか?
yossy0502denpa

2020/02/10 06:53

>>>riko111さん はい,そのはずです!
yossy0502denpa

2020/02/10 06:56

>>>Zuishinさん 簡易的なプログラム文においてどういう動きをしてほしいかを追記しましたが,こうだとどうでしょう? ネスト,というものを調べましたがよくわかりませんでした...
guest

回答の取得に失敗しました

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.25%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問