改进了,程序运行挺好,只是有个小问题

来源:百度知道 编辑:UC知道 时间:2024/05/24 18:22:58
运行十几次之后,又出现问题了,修改后源程序如下:
/*circle*/
#include<stdio.h>
main()
{
int i=0,j=0;
float x[i],y[j];

do
{
x[0]=2,y[0]=0;
// printf("%d,%d\n",i,j);
//printf("x[%d]=%f,y[%d]=%f\n",i,x[i],j,y[j]);
x[i+1]=x[i]-0.001;
i++;
j++;

//printf("x[%d]=%f\n",i,x[i]);
y[j]=sqrt(4-x[i]*x[i]);
//printf("y[%d]=%f\n",j,y[j]);
// printf("x[%d]=%f,y[%d]=%f\n",i,x[i],j,y[j]);
}
while(i<2000);

do
{
x[i+1]=x[i]-0.001;
i++;
j++;
y[j]=-sqrt(4-x[i]*x[i]);
}
while(i<4000) ;
for(i=0,j=0;i<4000,j<4000;i++,j++)
printf("%f,%f\n",x[i],y[j]);

}
运行结果出现:程序产生一个访问违例(段异常)

你究竟是用的什么编译器。。。我拿到VS2005上错误一大堆。
首先
float x[i],y[j];
这是什么意思,i=j=0,在C里不是定义一个长度为0的数组吗?
接着
x[i+1]=x[i]-0.001;
0.001作为常数被视为双精度浮点数,你把一个单精度浮点数减去一个双精度浮点数,然后再赋给一个单精度浮点数,直接造成了精度丢失。
看你的代码风格很有Delphi的感觉。学C的话最好还是多试试写C风格的代码吧。
至于算法我没仔细看,时间太晚了,访问违例的话,你的代码里也没指针,大多是下标越界吧,你自己再看看。