• ベストアンサー

配列の要素数を増やすには?[C++]

中央値を探すプログラムで困っています。中央値の算出の仕方自体はわかるのですが 途中で配列の値を増やさないといけないのでてこずっています。 int main( ) { Median m; double d[5]= {3,4,5,10,12}; m.addValue( 1 ); m.addValue( 2 ); m.addArray( d, 5 ); cout << “Median = “ << m.computeMedian( ) << endl; m.clear( ); } このプログラムを実行したら Median = 4 とでるようにしないといけないんですが、 addValue()とaddArray()をどう書けばいいのかわかりません。 m.addValue(1)と(2)で1と2を配列の中に足してそこから中央値を算出し ないといけないんですが要素数を後から増やすことはできるんでしょうか?  ちなみにヘッダーは下の通りで、privateの部分は自由に変えても結構です。 お手数ですが力をお貸しください。 public: Median( ); void addValue( double d ); void addArray( double d[], int size ); void clear(); double computeMedian( ) const; private: double my_Values[ MAXSIZE ]; int number;

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#include <iostream.h> class Median { public: Median(){ size = 5; my_Values = new double[size]; pos =-1; } Median(const Median& x){ size=x.size; my_Values = new double[size]; pos = x.pos; for(int i=0;i<pos;i++) my_Values[i]=x.my_Values[i]; } Median& operator=(const Median& x){ if(&x != this){ delete[] my_Values; size = x.size; my_Values = new double[size]; for(int i=0;i<pos;i++) my_Values[i]=x.my_Values[i]; } return (*this); } void extend(void){ Median tmp = *this; delete [] my_Values; size+=5; my_Values = new double[size]; for(int i=0;i<tmp.pos;i++) my_Values[i]=tmp.my_Values[i]; } void addValue( double d ){ if(pos==size){ extend(); } my_Values[++pos]=d; } void addArray( double d[], int size ){ if(this->size<=pos+size){ extend(); } for(int i=0;i<size;i++) my_Values[++pos]=d[i]; } void clear(){ delete[] my_Values; pos = -1; size = 5; my_Values = new double[size]; } double computeMedian(void) const { return(my_Values[pos / 2]);//でたらめ } private: double *my_Values; int number; int pos; int size; }; int main(void) { Median m; double d[5]= {3,4,5,10,12}; m.addValue( 1 ); m.addValue( 2 ); m.addArray( d, 5 ); cout << "Median = " << m.computeMedian( ) << endl; m.clear( ); }

azex
質問者

お礼

またまたご親切に回答していただきありがとうございます。 これを参考にして自分でも書いてみます。

その他の回答 (2)

回答No.2

#include <iostream> #include <vector> #include <algorithm> class Median { std::vector<double> data; public: void addValue(double d) { data.insert(std::lower_bound(data.begin(), data.end(), d), d); } void addArray(double d[], int size ) { for ( int i = 0; i < size; ++i ) addValue(d[i]); } void clear() { data.clear(); } double computeMedian( ) const { return (data.size() % 2) ? data[(data.size()-1)/2] : (data[data.size()/2-1]+data[data.size()/2])/2; } }; int main() { Median m; double d[5]= {3,4,5,10,12}; m.addValue( 1 ); m.addValue( 2 ); m.addArray( d, 5 ); std::cout << "Median = " << m.computeMedian() << std::endl; m.clear( ); return 0; }

azex
質問者

お礼

これがvectorというものなんですね。 回答ありがとうございます。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

配列の動的確保もできるでしょうけども、 全部自分でやらないといけないので面倒です。 vector<double>を使ってはどうですか?

azex
質問者

お礼

回答どうもありがとうございます。 vectorはまだ使えるレベルではないので 動的確保でがんばってみます。

関連するQ&A