求 C 翻译为 C#

qq34448635 2009-04-16 05:11:54
//曲线拟合
//as title

#include "stdio.h"
#include "math.h"
#define num 10


float neiji(float b[num],float c[num]) //内积函数
{ int p;
float nj=0;
for (p=1;p<num;p++)
nj+=c[p]*b[p];
return nj;
}
float s[num],x[num],y[num],fai[num][num],afa[num],beida[num],a[num],xfai[num],yd[num],max,pcpfh;


void main()
{ int i,j,k,n,index,flag;
char conti;
conti=' ';



printf("请输入已知点的个数n=\n");
scanf("%d",&n);

printf("请输入x和y:");
for(i=1;i<=n;i++)
{ printf("x[%d]=",i);
scanf("%f",&x[i]);
printf("y[%d]=",i);
scanf("%f",&y[i]);
}
while(conti==' ')
{ printf("请输入拟和次数=");
scanf("%d",&index);
pcpfh=0;
afa[1]=0;
a[0]=0;
for(i=1;i<=n;i++)
{afa[1]+=x[i];
a[0]+=y[i];
fai[0][i]=1;
}
afa[1]=afa[1]/n;
a[0]=a[0]/n;

for (i=1;i<=n;i++)
{
fai[1][i]=x[i]-afa[1];
}

a[1]=neiji(fai[1],y)/neiji(fai[1],fai[1]);

for(k=1;k<index;k++)
{ for(i=1;i<=n;i++)
xfai[i]=x[i]*fai[k][i];

afa[k+1]=neiji(fai[k],xfai)/neiji(fai[k],fai[k]);
beida[k]=neiji(fai[k],fai[k])/neiji(fai[k-1],fai[k-1]);
for(j=1;j<=n;j++)
fai[k+1][j]=(x[j]-afa[k+1])*fai[k][j]-beida[k]*fai[k-1][j];
a[k+1]=neiji(fai[k+1],y)/neiji(fai[k+1],fai[k+1]);

}

printf("%d次拟和结果为\n",index);
for(i=0;i<=index;i++)
printf("a[%d]=%f\n",i,a[i]);
for(i=1;i<=index;i++)
printf("afa[%d]=%f\n",i,afa[i]);
for(i=1;i<index;i++)
printf("beida[%d]=%f\n",i,beida[i]);

for(i=1;i<=n;i++)
{ for(k=0;k<=index;k++)
s[i]+=a[k]*fai[k][i];
yd[i]=float(fabs(y[i]-s[i]));
pcpfh+=yd[i]*yd[i];
s[i]=0;
}

max=0;
for(i=1;i<=n;i++)
if(yd[i]>max)
{max=yd[i];
flag=i;
}


printf("当x=%f时,偏差最大=%f,偏差平方和为%f\n",x[flag],max,pcpfh);

printf("继续拟和请按space,按其他键退出");

conti=getchar();
conti=getchar();

}
}




...全文
118 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq34448635 2009-04-27
  • 打赏
  • 举报
回复
为什么啊 唉 。。请高手帮忙啊
qq34448635 2009-04-27
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.Text;

namespace CurveMath
{
class Program
{
static void Main(string[] args)
{
float[] s = new float[10];
float[] X = new float[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f };
float[] Y = new float[] { 45.5f, 78.6f, 62.3f, 42.6f, 54.6f, 78.6f, 25.6f, 78.9f, 65.0f, 56.2f };

//float[,] fai = new float[10, 10];
float[][] fai = new float[][] { new float[10], new float[10] };

float[] afa = new float[10];
float[] beida = new float[10];
float[] a = new float[10];
float[] xfai = new float[10];
float[] yd = new float[10];
float max;
float pcpfh;

int i;
int j;
int k;
int n;
int index;
int flag;

string conti = " ";

Console.WriteLine("已知点的个数为 10");
n = 9;
Console.WriteLine("X Y 数据已有");

for (int number = 1; number < 10; number++)
{
Console.WriteLine("拟和次数为 {0}: ", number);

pcpfh = 0;
afa[1] = 0;
a[0] = 0;

for (i = 1; i <= n; i++)
{
afa[1] += X[i];
a[0] += Y[i];
fai[0][i] = 1;
}

afa[1] = afa[1] / n;
a[0] = a[0] / n;

for (i = 1; i <= n; i++)
{
fai[1][i] = X[i] - afa[1];
}

a[1] = neiji(fai[1], Y) / neiji(fai[1], fai[1]);

//
index = number;
for (k = 1; k < index; k++)
{
for (i = 1; i <= n; i++)
{
xfai[i] = X[i] * fai[k][i];
}

afa[k + 1] = neiji(fai[k], xfai) / neiji(fai[k], fai[k]);
beida[k] = neiji(fai[k], fai[k]) / neiji(fai[k - 1], fai[k - 1]);

for (j = 1; j <= n; j++)
{
fai[k + 1][j] = (X[j] - afa[k + 1]) * fai[k][j] - beida[k] * fai[k - 1][j]; }

a[k + 1] = neiji(fai[k + 1], Y) / neiji(fai[k + 1], fai[k + 1]);
}

Console.WriteLine("{0} 次拟和结果为:", index);

for (i = 0; i <= index; i++)
{
Console.WriteLine("a[{0}]={1}\n", i, a[i]);
}
for (i = 1; i <= index; i++)
{
Console.WriteLine("afa[{0}]={1}\n", i, afa[i]);
}
for (i = 1; i < index; i++)
{
Console.WriteLine("beida[{0}]={1}\n", i, beida[i]);
}

for (i = 1; i <= n; i++)
{
for (k = 0; k <= index; k++)
{
s[i] += a[k] * fai[k][i];
}
yd[i] = (float)System.Math.Abs(Convert.ToDouble(Y[i] - s[i]));
pcpfh += yd[i] * yd[i];
s[i] = 0;
}

max = 0;
for (i = 1; i <= n; i++)
{
if (yd[i] > max)
{
max = yd[i];
flag = i;
}

}

//Console.WriteLine("当x={0}时,偏差最大={1},偏差平方和为{2}", X[flag], max, pcpfh);
//Console.WriteLine("继续拟和请按space,按其他键退出");
}

Console.ReadKey();
}

public static float neiji(float[] f1, float[] f2)
{
float fResult = 0;
for (int i = 1; i < f2.Length; i++)
{
fResult += f1[i] * f2[i];
}
return fResult;
}
}
}



输出结果为:

已知点的个数为10
X Y数据已有
拟合次数为1:
1次拟合结果为:
a[0]=-0.631668

a[1]=-0.6316668

afa[1]=6
拟合次数为2:


fai[k + 1][j] = (X[j] - afa[k + 1]) * fai[k][j] - beida[k] * fai[k - 1][j]; 这个地方抛出异常:索引超出了数组界限。


龙宜坡 2009-04-24
  • 打赏
  • 举报
回复
下不为例,:)
aimeast 2009-04-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qq34448635 的回复:]
引用 1 楼 aimeast 的回复:
丫丫,自己写还不会啊?
这样的代码基本上不要有什么变动的。csdn不是免费的劳动力市场。



谢谢大哥  批评 ~~~~

说实话。我昨天尝试的转一下,没有成功,,关键的问题就是fai[num][num],这是一个二维的 ,在c#中 fai[,] 这样定义,
可是  a[1]=neiji(fai[1],y)/neiji(fai[1],fai[1]);      fai[1]  是什么意思(是二维数据中第一维?)?  我就不明白。
因为neiji函数的两个参数都…
[/Quote]
哈哈,看来你还是挺好学的。不过代码还是太长了点。如果实在搞不定,再找我吧。
only_lonely 2009-04-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 shrinerain 的回复:]
C/C++中, 数组"等同于"指针. 并且是连续分配内存的.

fai[i]是一个指针, 指向fai[i][0],fai[i][1]...fai[i][j]这一串值组成的数组.

你在C#中声明一个交错数组fai[i][j], 同样fai[i]也是指向fai[i][0],fai[i][1]...fai[i][j]这一串值组成的数组.

所以这里你不要声明二维数组[,], 声明交错数组,也是所谓"数组的数组" [][] 就可以了.
[/Quote]
```
qq34448635 2009-04-17
  • 打赏
  • 举报
回复
static void Main(string[] args)
{
float[] X = new float[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f };
float[] Y = new float[] { 45.5f, 78.6f, 62.3f, 42.6f, 54.6f, 78.6f, 25.6f, 78.9f, 65.0f, 56.2f };
float pcpfh;
float max;
float[] afa = new float[10];
float[] a = new float[10];
float[] xfai = new float[10];
float[] beida = new float[10];
float[] yd = new float[10];
float[] s = new float[10];
//float[,] fai = new float[10, 10];

float[][] fai = new float[][] { new float[10], new float[10] };

int i;
int j;
int k;
int n = 10;
int index = 10;
int flag = 0;

Console.WriteLine("已知点的个数10");
Console.WriteLine("X Y 数据已有");

for (int number = 1; number < 10; i++)
{
Console.WriteLine("拟和次数为{0}:", number);

pcpfh = 0;
afa[1] = 0;
a[0] = 0;

for (i = 1; i <= n; i++)
{
afa[1] += X[i];
a[0] += Y[i];
fai[0][i] = 1;
}

afa[1] = afa[1] / n;
a[0] = a[0] / n;

for (i = 1; i <= n; i++)
{
fai[1][i] = X[i] - afa[1];
}

a[1] = neiji(fai[1][0], Y) / neiji(fai[1][0], fai[1][0]);

for (k = 1; k < index; k++)
{
for (i = 1; i <= n; i++)
{
xfai[i] = X[i] * fai[k][i];
}

//afa[k + 1] = neiji(fai[k], xfai) / neiji(fai[k], fai[k]);
//beida[k] = neiji(fai[k], fai[k]) / neiji(fai[k - 1], fai[k - 1]);

for (j = 1; j <= n; j++)
{
fai[k + 1][j] = (X[j] - afa[k + 1]) * fai[k][j] - beida[k] * fai[k - 1][j];
}

//a[k + 1] = neiji(fai[k + 1], y) / neiji(fai[k + 1], fai[k + 1]);
}

Console.WriteLine("{0}次拟和结果为:", index);

for (i = 0; i <= index; i++)
{
Console.WriteLine("a[{0}]={1}\n", i, a[i]);
}
for (i = 1; i <= index; i++)
{
Console.WriteLine("afa[{0}]={1}\n", i, afa[i]);
}
for (i = 1; i < index; i++)
{
Console.WriteLine("beida[{0}]={1}\n", i, beida[i]);
}

for (i = 1; i <= n; i++)
{
for (k = 0; k <= index; k++)
{
s[i] += a[k] * fai[k][i];
}
yd[i] = (float)System.Math.Abs(Convert.ToDouble(Y[i] - s[i]));
pcpfh += yd[i] * yd[i];
s[i] = 0;
}

max = 0;
for (i = 1; i <= n; i++)
{
if (yd[i] > max)
{
max = yd[i];
flag = i;
}

}

Console.WriteLine("当x={0}时,偏差最大={1},偏差平方和为{2}", X[flag], max, pcpfh);
Console.WriteLine("继续拟和请按space,按其他键退出");
}
}

public static float neiji(float[] f1, float[] f2)
{
float fResult = 0;
for (int i = 1; i < f2.Length; i++)
{
fResult += f1[i] * f2[i];
}
return fResult;
}


一下是报错的地方
a[1] = neiji(fai[1][0], Y) / neiji(fai[1][0], fai[1][0]);
cannot convert from 'float' to 'float[]'

fai[1][0] 得到的是一个float值
shrinerain 2009-04-17
  • 打赏
  • 举报
回复
C/C++中, 数组"等同于"指针. 并且是连续分配内存的.

fai[i]是一个指针, 指向fai[i][0],fai[i][1]...fai[i][j]这一串值组成的数组.

你在C#中声明一个交错数组fai[i][j], 同样fai[i]也是指向fai[i][0],fai[i][1]...fai[i][j]这一串值组成的数组.

所以这里你不要声明二维数组[,], 声明交错数组,也是所谓"数组的数组" [][] 就可以了.



FlyBee 2009-04-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 aimeast 的回复:]
丫丫,自己写还不会啊?
这样的代码基本上不要有什么变动的。csdn不是免费的劳动力市场。
[/Quote]
确实是没什么可转的
qq34448635 2009-04-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 aimeast 的回复:]
丫丫,自己写还不会啊?
这样的代码基本上不要有什么变动的。csdn不是免费的劳动力市场。
[/Quote]


谢谢大哥 批评 ~~~~

说实话。我昨天尝试的转一下,没有成功,,关键的问题就是fai[num][num],这是一个二维的 ,在c#中 fai[,] 这样定义,
可是 a[1]=neiji(fai[1],y)/neiji(fai[1],fai[1]); fai[1] 是什么意思(是二维数据中第一维?)? 我就不明白。
因为neiji函数的两个参数都是 float[]
问了办公室的兄弟。。都不知道。不好意思!
ztenv 2009-04-16
  • 打赏
  • 举报
回复
的确没什么可转的,
aimeast 2009-04-16
  • 打赏
  • 举报
回复
丫丫,自己写还不会啊?
这样的代码基本上不要有什么变动的。csdn不是免费的劳动力市场。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧