由于本学期有一门计算方法的课需要C语言编程,在这里记录一下。
由于这是第一章且后面的课大约也有相似的属性,比如对n个点的使用和函数的调用,这里就进行一个小封装,方便以后吃老本。
欢迎需要参考的同学复制粘贴,互相交流.
//POINTS.h
#pragma once
#include<vector>
using namespace std;
#ifndef _POINTS_
#define _POINTS_
class POINTS
{
public:
typedef struct MYPOINT
{
double x;
double y;
}mypoint;
int len;
int size;
virtual void run(double val);
virtual void loaddata(double* vallist);
};
#endif // !_POINTS_
//POINTS.cpp
#include "POINTS.h"
#include<iostream>
using namespace std;
void POINTS::run(double val)
{
cout << "计算函数" << endl;
}
void POINTS::loaddata(double* vallist)
{
cout << "数据处理函数" << endl;
}
//LAGRANGE.h
#pragma once
#include "POINTS.h"
#ifndef _LAGRANGE_
#define _LAGRANGE_
class LAGRANGE :
public POINTS
{
public:
LAGRANGE(int n);
vector<mypoint> datalist;
virtual void run(double val);
virtual void loaddata(double* vallist);
};
#endif // !LAGRANGE
//LAGRANGE.cpp
#include "LAGRANGE.h"
#include<iostream>
using namespace std;
LAGRANGE::LAGRANGE(int n)
:datalist(n)
{
this->size = n;
this->len = 0;
}
void LAGRANGE::run(double val)
{
double sum = 0.0;
vector<double> templist;
for (size_t i = 0; i < this->size; i++)
{
double tempval = 1.0;
for (size_t j = 0; j < this->size; j++)
{
if (j != i)
tempval *= ((val - this->datalist.at(j).x) /
(this->datalist.at(i).x - this->datalist.at(j).x));
else
continue;
}
templist.push_back(tempval);
}
for (size_t i = 0; i < this->size; i++)
{
sum += this->datalist.at(i).y * templist.at(i);
}
cout << "拉格朗日" << this->size << "项插值计算为:" << sum << endl;
}
void LAGRANGE::loaddata(double* vallist)
{
cout << "正在处理数据..." << endl;
for (size_t i = 0; i < this->size * 2; i++)
{
if (((i + 1) % 2) == 0)
{
this->datalist.at(this->len).y = vallist[i];
this->len++;
}
else
{
this->datalist.at(this->len).x = vallist[i];
}
}
}
//main.cpp
#include<iostream>
#include"POINTS.h"
#include"LAGRANGE.h"
using namespace std;
int main()
{
cout << "例1" << endl;
//实例化工具类
LAGRANGE lgr(2);
//构建运算参数表
double val[4] = { 100.0,10.0,121.0,11.0 };
//调用处理数据函数
lgr.loaddata(val);
//传入目标x运算,例1
lgr.run(115);
//传入目标x运算,例2
cout << "例2" << endl;
LAGRANGE lgr1(3);
double val1[6] = { 100.0,10.0,121.0,11.0,144.0,12.0 };
lgr1.loaddata(val1);
lgr1.run(115);
//课上的题目求ln3.16
cout << "求ln3.16" << endl;
LAGRANGE lgr2(2);
double val2[4] = { 3.1,1.1314,3.2,1.1632 };
lgr2.loaddata(val2);
lgr2.run(3.16);
system("pause");
return 0;
}