CPPのプログラム。俺自身学習中なので、どうぞご一緒に。
ちなみに、これはMS-DOS上で最小二乗法を計算するプログラムです。ファイルセーブなんかができます。めんどくさいので、ソースの説明は直接俺に聞いてください。コメントもあんま丁寧には書いていません。 ダメじゃん(>_<)
一部ホムペでうまく表示できてないです。iostream.hとmath.h、stdio.hなんかをインクルードしてください。
Text2.exe
|
text2.cpp
#include
#include "xydata.h"
#include "saisyou2.h"
main()
{
cout << "------------------------------------------------------" << endl
<< "最小2乗法で推定式と誤差を計算するプログラムversion2.0" << endl
<< " 6/NOV/2003 by 奈良裕樹 " << endl
<< "------------------------------------------------------" << endl;
xydata xyd;//////クラスの宣言
saisyou2 cal;////
int e;
cout << "ファイルからのデータ読み込みなら0、入力ならそれ以外を押して下さい" << endl;
cin >> e;
if (e == 0)
{
if (xyd.fileread(&xyd))
{
//ファイル処理の失敗
return 0;
}
cal.kinji(&xyd);/////xydataのメンバ変数をポインタで渡している
cal.gosa(&xyd);
}
else
{
xyd.nyuryoku();////////////////メンバ関数呼び出し
cal.kinji(&xyd);/////xydataのメンバ変数をポインタで渡している
cal.gosa(&xyd);
cout << "データ保存なら0、そうでなければそれ以外の数を入力して下さい" << endl;
cin >> e;
if (e == 0)
{
xyd.filesave(&xyd);
cout << "保存されました。" << endl;
}
}
return 0;
|
saisyou2.cpp
#include
#include "xydata.h"
#include "saisyou2.h"
#include
void saisyou2::gosa(xydata *xyd)
{
double y,g[100];
int i;
cout << "推定式からの誤差はそれぞれ" << endl;
for (i=0;i< xyd->imax ;i++)
{
y = xyd->b * xyd->xdata[i] + xyd->a;
g[i] = pow((y-xyd->ydata[i])*(y-xyd->ydata[i]),0.5);
cout << "(" << xyd->xdata[i] << "," << xyd->ydata[i] << ")---" << g[i] << endl;
}
};
void saisyou2::kinji(xydata *xyd)/////class saisyou2のメンバ関数
{/////////xydataのメンバ変数をポインタとして受け取って処理
double xs=0,ys=0,x2s=0,x,y,x2,xy,xys=0;
int i;
for (i=0;i< xyd->imax ;i++)
{
x = xyd->xdata[i];
y = xyd->ydata[i];
x2=x*x;
xy=x*y;
xs=xs+x;
ys=ys+y;
xys=xys+xy;
x2s=x2s+x2;
}
xyd->b=(xyd->imax * xys - xs * ys)/(xyd->imax * x2s - xs * xs);
xyd->a=(x2s * ys - xs * xys)/(xyd->imax * x2s - xs * xs);
cout << "推定される式は" << endl;
cout << "y=" << xyd->b << "x+" << xyd->a << endl;
}
|
saisyou2.h
class saisyou2 : public xydata////class saisyou2はclass xydataから派生
{
public:
void kinji(xydata *xyd);
void saisyou2::gosa(xydata *xyd);
};
|
xydata.h
#include
#include "xydata.h"
#include
int xydata::fileread(xydata *xyd)
{
FILE *fp;
char filename[20];
cout << "ファイル名を入力して下さい" << endl;
cin >> filename;
if (!(fp = fopen(filename,"rb")))
{
//ファイルオープンに失敗
cout << "ファイルオープンに失敗しました" << endl;
return 1;
}
//ファイルオープンに成功
fread(&xyd,sizeof(class xydata),1,fp);
if (fclose(fp))
{
//ファイルクローズに失敗
cout << "ファイルクローズに失敗しました" << endl;
unlink("filename");
return 1;
}
else
//ファイルクローズに成功
return 0;
}
int xydata::filesave(xydata *xyd)
{
FILE *fp;
char filename[20];
cout << "ファイル名を入力して下さい" << endl;
cin >> filename;
if (!(fp = fopen(filename,"wb")))
{
//ファイルオープンに失敗
cout << "ファイルオープンに失敗しました" << endl;
return 1;
}
//ファイルオープンに成功
if (fwrite(&xyd, sizeof(class xydata),1,fp) < 1)
{
//書き込みエラー発生
cout << "書き込みエラーが発生しました" << endl;
if (fclose(fp))
//ファイルクローズに失敗
cout << "ファイルクローズに失敗しました" << endl;
unlink("filename");
return 1;
}
if (fclose(fp))
{
//ファイルクローズに失敗
cout << "ファイルクローズに失敗しました" << endl;
unlink("filename");
return 1;
}
else
return 0;
}
void xydata::nyuryoku()////class xydataのメンバ関数
{
int i,h;
do{
cout << "データ数を入力(100個以内)" << endl;
cin >> imax;
}while(imax > 100);
for (i=0;i> xdata[i];
cout << "y=";
cin >> ydata[i];
}
do{
for (i=0;i> h;
if (h > imax)
{
cout << h <<"番目のデータはありません" << endl;
}
else if (h != 0)
{
cout << h <<"番目のxとyの組を入力" << endl;
cout << "x=";
cin >> xdata[h-1];
cout << "y=";
cin >> ydata[h-1];
}
}while(h != 0);
}
|
xydata.h
class xydata/////class xydataの記述
{
public:
int imax;
double a,b;
double xdata[100],ydata[100];
void nyuryoku();
int fileread(xydata *xyd);
int filesave(xydata *xyd);
};
TOP
|