1.(レポート課題)データ処理
今回のプログラムには、以下のようなデータ処理機能を持たせて下さい。
1.1 配列要素の四則演算
ある一つの値と配列の各要素の間で四則演算を行うものです。つまり、xという値に対する足し算であれば、
result[0] = data[0] + x
result[1] = data[1] + x
...
ということです。引き算、かけ算、割り算も同様です。
1.2以降の演算でも同様ですが、演算を行う前に、「すでにデータ配列に値が読み込まれているか」をチェックするようにするとよいでしょう。配列を動的に確保しているひとであれば、プログラムの始めにポインタをNULLで初期化しておけば、ポインタがNULLのままである(まだメモリが確保されていない)ということがデータの準備ができていないという目印になります。
if (data==NULL) {
return
NO_DATA;
}
また、結果用の配列が準備できていない時は、データと同じサイズのメモリを確保しなくてはなりません。
if (result== NULL) {
/*
resultのmalloc */
}
さらに、前回の演算でつかった結果用配列が残っていても、そのサイズがこれから扱おうとするデータのサイズと異なっている場合は、いったん結果用メモリを解放した後、あらためて新しいサイズのメモリを確保しなくてはなりません。
1.2 配列間での四則演算
2つの配列の対応する要素同士の四則演算を行うものです。【課題5−2】と同じですが、剰余(%)の機能は要りません。
データ配列の準備ができているかのチェックに加えて、「2つのデータのサイズが等しいか」をチェックする必要があります。構造体を使っているのであれば、例えば
if (dt[0]->length !=
dt[1]->length) {
return
SIZE_MISMATCH;
}
のようになります。
1.3 平滑化処理
この図の例のように、ノイズが大きいデータに対して「平滑化(smoothing)」処理をすることがあります。平滑化にはいろいろな手法がありますが、ここでは以下の2通りの方法で処理できる機能を加えて下さい。
1.3.1 平均
ある要素の値とその前後の値の平均値をとる方法です。
result[n] = (data[n-1] + data[n] +
data[n+1]) / 3
ただ、配列の両端の処理には気をつけて下さい。
余裕がある人は、平均をとる幅(前後何個ずつの値を使うか)も指定できるようにするのもよいでしょう。幅を広くすれば、平滑化の効果がより強くなります。
1.3.2 中間値
ある要素の値とその前後の値の中間値をとる方法です。
例えば、data[n-1] > data[n+1] > data[n] であれば result[n] = data[n+1]
余裕がある人は、これも幅を指定できるようにするとよいでしょう。
1.4 演算結果のコピー
ある演算結果に対して、さらにつづけて演算をしたい場合、演算結果をデータ用の配列にコピーできる機能があると便利です。
data[n] = result[n]
以下は二次元データを扱うプログラムへの拡張にチャレンジしているひとのための情報です
(参考)二次元データの演算・処理について
二次元データについても、配列要素の四則演算や配列間の四則演算については、一次元データのものをそのまま拡張すればよいでしょう。
平滑化については、一次元データでは「前後の要素」を使いますが、二次元データでは「前後の列と前後の行の要素」を使って、平均ないしは中間値を求めます。つまりdata[n][m]については、
data[n-1][m-1] data[n-1][m] data[n-1][m+1]
data[n][m-1] data[n][m] data[n][m+1]
data[n+1][m-1] data[n+1][m] data[n+1][m+1]
の9つの値を用いることになります。