新しく質問する

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

役に立った:0件
  • 質問者:azex
  • 投稿日時:2004/10/30 16:11
  • 困り度:困ってます
  • 友達に紹介
  • ブログに書く
  • 教えて!gooお気に入り

中央値を探すプログラムで困っています。中央値の算出の仕方自体はわかるのですが
途中で配列の値を増やさないといけないのでてこずっています。

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;

この質問への回答は締め切られました。
このQ&Aは役に立ちましたか?(役に立った:0件)
  • 参考になった:0件

No.3ベストアンサー20pt

  • 回答者:BLUEPIXY
  • 回答日時:2004/10/30 21:05

#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( );
}

通報する

この回答へのお礼

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

  • 参考になった:0件

No.2ベストアンサー10pt

  • 回答者:episteme
  • 回答日時:2004/10/30 19:14

#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;
}

通報する

この回答へのお礼

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

  • 参考になった:0件
  • 回答者:BLUEPIXY
  • 回答日時:2004/10/30 16:43

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

通報する

この回答へのお礼

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

  
このQ&Aは役に立ちましたか?(役に立った:0件)

このページのトップへ