質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
if

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

ループ

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

C++

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

Q&A

解決済

2回答

2244閲覧

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

yossy0502denpa

総合スコア5

if

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

ループ

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

C++

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

0グッド

0クリップ

投稿2020/02/10 04:58

編集2020/02/10 06:52

前提・実現したいこと

概要として,二重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

回答2

0

ベストアンサー

一つ目の条件式でD1を出力,二つ目の条件式でD2を出力して一つ目の条件式に戻る
また一つ目の条件式でD3を,二つ目の条件式でD4を...とループさせたいです.

データペア毎に処理する話みたいですので,とりあえず,

//何かN個のデータ列があって… int Data[N]; //この辺でData[]の中身に適切な値が入れられるのだとして… //処理ループ for( int i=0; i<N-1; i+=2 ) { //データのペア int data1 = Data[i]; int data2 = Data[i+1]; //処理関数にデータのペアを渡して処理する WorkFunc( data1, data2 ); }

…みたいなループ処理がどこかにあるのだとして,処理関数の側で,

//データペアに対する処理 void WorkFunc( int data1, int data2 ) { //2重のif if( data1 == 0 ) { /*1個目のデータが0であるときの処理*/ //1個目のデータが0であるときの,2個目のデータの処理のためのif if( data2 == 0 ){ /*2個目のデータが0であるとき*/ } else if( data2 == 1 ){ /*2個目のデータが1であるとき*/ } } else if( data1 == 1 ) { /*1個目のデータが1であるときの処理*/ //1個目のデータが1であるときの,2個目のデータの処理のためのif if( data2 == 0 ){ /*2個目のデータが0であるとき*/ } else if( data2 == 1 ){ /*2個目のデータが1であるとき*/ } } }

…とかなってれば良いという話に見えます.

投稿2020/02/10 07:22

fana

総合スコア11658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yossy0502denpa

2020/02/10 07:47

具体的なプログラム文を提示していただいてありがとうございます!
fana

2020/02/10 07:54

そんな具体的でもないと思うけど…… とりあえず本番のプログラムをいじくる前に,こんな感じの小さいのを書いてみて原理確認的なことをしてみると良いのではないかと思います.
guest

0

Averageが配列だということですので、まとめます。

まず、配列は、配列名を書いただけで都合よく最初に1つ目、次に2つ目が取り出せるものではありません。
仮にAverageに{0.2, 0.3, 0.15, 0.6}のようにデータが入っているとしたら
それぞれAverage[0],Average[1],Average[2],Average[3]として指定するものになります。

まずは配列の操作について学習してください。

投稿2020/02/10 07:00

riko111

総合スコア149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yossy0502denpa

2020/02/10 07:08

分かりました! 配列の操作の仕方について調べてみます.
fana

2020/02/10 07:26

配列というか,使う言語の初歩的な部分の復習を行った方が良いように見受けます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問