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

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

新規登録して質問してみよう
ただいま回答率
85.49%
C++

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

3回答

6509閲覧

配列を奇数番目の要素と偶数番目の要素で分けて二つの配列にする

yossy0502denpa

総合スコア5

C++

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/02/11 05:36

編集2020/02/11 05:45

前提・実現したいこと

下記のプログラムで7000行×9列のcsvファイルを演算処理しプログラム文中のAverageの配列を作成しました.
ここからこの配列の奇数番目の要素だけの配列,偶数番目の要素だけの配列(仮にAverage1,2とする)を作成したいです.
どのようなプログラム文を書けばよいでしょうか?
今回使用しているcsvファイルは行数が決まっていますが,実際は新しい行,数値が追加されていくので要素数が変数になります.
※MIDIに関するプログラム文もありますがたぶん無視して大丈夫と思います

該当のソースコード

C++

1int main(){ 2 std::ifstream ifs("筋電・加速度データ.csv"); //csvファイル読み込み 3 std::string str; 4 bool flag = true; 5 std::vector<double> Balance_sum;    //差(Balance)の要素 6 double Average = 0;     //基準値を決める 7 MMRESULT mmres = midiOutOpen(&hMidiOut, MIDI_MAPPER, NULL, NULL, CALLBACK_NULL); //リターンコードを示す変数の型 8 //音声出力、MIDI_MAPPARは引数 9 if (mmres != MMSYSERR_NOERROR) //エラーがあった場合 10 { 11 fprintf(stderr, "MIDIが利用できません。\n"); 12 return 1; 13 } 14 15 while (getline(ifs, str)){ 16 if (flag){ 17 flag = false; 18 continue; //その行が文字列なら処理を飛ばす 19 } 20 else{ 21 int num; //行の各値をそれぞれ設定する 22 double EMGR, rightx, righty, rightz, EMGL, leftx, lefty, leftz; 23 sscanf_s(str.c_str(), "%d,%10lf,%10lf,%10lf,%10lf,%10lf,%10lf,%10lf,%10lf", &num, &EMGR, &rightx, &righty, &rightz, &EMGL, &leftx, &lefty, &leftz); 24 25 //まず左右の計測値を絶対値化 26 double RightData = rightx*rightx + righty*righty + rightz*rightz; 27 double LeftData = leftx*leftx + lefty*lefty + leftz*leftz; 28 double Balance = RightData - LeftData; //計測値の差 29 Balance_sum.push_back(Balance); //BalanceをBalance_sumの配列の末尾に要素として追加 30 } 31 } 32 double Total = 0; //1500行のBalance_sumの総和 33 34 for (int counter = 0; counter < Balance_sum.size(); counter++){ //配列の行数を一行ずつカウントしていく 35 Total = Total + Balance_sum.at(counter); //Totalに1行ずつBalance.sumの要素を足していく 36 37 if (counter % 1500 == 1499){ //カウントが1499行目(要素で言うと1500個目)になったとき 38 Average = Total / 1500; //TotalからAveragaを設定、デモデータでは差異が-0.18~0.002なので、 39 Element = Element + 1; //要素数をカウント 40 }

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

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

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

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

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

fana

2020/02/11 06:14

> プログラム文中のAverageの配列を作成しました その配列とは,ソースコード内のどれにあたるのでしょうか?
yossy0502denpa

2020/02/11 06:19

Average = Total / 1500; で計算された数値です. もしかしてこのAverageは配列では無いのですか?
coco_bauer

2020/02/11 06:22

何が問題なのですか? どこで躓いているのですか?  「Averageの配列」と呼んでいるのは、"std::vector<double> Balance_sum; "の事ですか?(コメントを読むと、"計測値の差"の配列になりそうですが)
yossy0502denpa

2020/02/11 06:31

>>>coco_bauerさん 質問が破綻しているようで申し訳ありません. 演算処理後に出てくるAverageを奇数番目のもの,偶数番目のものに分けてAverage1とAverage2にしたいのです. 質問中でAverageのことを配列と言っていますが配列では無いかもしれません...
fana

2020/02/11 06:36

> double Average = 0; これを見る限り,Averageは配列ではない. > 演算処理後に出てくるAverageを奇数番目のもの,偶数番目のものに分けてAverage1とAverage2にしたい とりあえず,まずは計算結果を単一の配列に格納するところから始めてみては…
fana

2020/02/11 06:42

提示されているソースコードの上の方を書いた人の質問とは思えないので,読込部分は別の誰かが書いたのだろうか? 可能であれば,それを書いた人に相談すべき.
guest

回答3

0

配列の奇数番目の要素だけの配列,偶数番目の要素だけの配列(仮にAverage1,2とする)を作成したいです.

C++

1#include <iostream> 2#include <vector> 3 4int main() { 5 using namespace std; 6 vector<int> Average = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 7 vector<int> Average1; // 奇数番目はコッチへ 8 vector<int> Average2; // 偶数番目はコッチへ 9 10 // ふりわけ 11 bool is_even = true; 12 for ( auto val : Average ) { 13 (is_even ? Average2 : Average1).push_back(val); 14 is_even = !is_even; 15 } 16 17 // できたかな? 18 for ( auto val : Average1 ) cout << val << ' '; cout << endl; 19 for ( auto val : Average2 ) cout << val << ' '; cout << endl; 20 21}

投稿2020/02/11 08:21

episteme

総合スコア16614

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

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

0

色々質問と載せているコードが違っていますので、推測しながらですが。
whileのループの時点で奇数と偶数にわけて、今あるBalanceSumに突っ込むのと同じことする処理を追加すればよいのでは?
そこまでいけばあとはわかりますよね。

投稿2020/02/11 06:31

ardin

総合スコア544

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

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

0

a.cpp

c++

1#include <iostream> 2#include <vector> 3using namespace std; 4 5void show_v2(vector<vector<int> > data) { 6 for(vector<int> row : data) { 7 for (int x : row) { 8 std::cout << x << ", "; 9 } 10 cout << endl; 11 } 12 cout << endl; 13} 14 15int main() { 16 vector<vector<int> > data{ 17 {101, 102, 103, 104, 105}, 18 {201, 202, 203, 204, 205}, 19 {301, 302, 303, 304, 305}, 20 }; 21 cout << "data =" << endl; 22 show_v2(data); 23 24 vector<vector<int> > data_0; 25 vector<vector<int> > data_1; 26 for (int y = 0; y < 3; y++) { 27 vector<int> r0; 28 vector<int> r1; 29 for (int x = 0; x < 5; x++) { 30 if (x % 2) { 31 r0.push_back(data[y][x]); 32 } else { 33 r1.push_back(data[y][x]); 34 } 35 } 36 data_0.push_back(r0); 37 data_1.push_back(r1); 38 } 39 40 cout << "data_0 =" << endl; 41 show_v2(data_0); 42 cout << "data_1 =" << endl; 43 show_v2(data_1); 44 45 return 0; 46}

実行例

イメージ説明

投稿2020/02/11 06:28

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問