关于vc++6.0中的程序到c++2008中有些数据发生突变的情况,希望大家能给与帮助!
各位大侠,首先道个歉,刚发的那个贴有点水,还是把我真正的问题拿出来,就是有点长,我实在解决不了,希望大家能耐心地帮帮忙。首先是在vc++6.0中的程序如下:
#include "iostream.h"
#include "math.h"
#include "fstream.h"
#define Pi 3.14159
int ne,n[4][3441],nr[200],ns[100],nd[522];
double x[522],y[522],aij[4][4],fe[4],anm[522][522],fu[522],ur[72];
//=============================================高斯消去法求解子程序
void gauss()
{
int i,j,nn,nm1,io,k,kp1,ip1;
double c,t;
nn=522;
nm1=nn-1;
for(k=1;k<nm1;k++)
{
c=0.0;
for(i=k;i<nn;i++)
{
if(fabs(anm[i][k])>fabs(c))
{
c=anm[i][k];
io=i;
}
}
if(io!=k)
{
for(j=k;j<nn;j++)
{
t=anm[k][j];
anm[k][j]=anm[io][j];
anm[io][j]=t;
}
t=fu[k];
fu[k]=fu[io];
fu[io]=t;
}
kp1=k+1;
c=1.0/c;
fu[k]=fu[k]*c;
for(j=kp1;j<nn;j++)
{
anm[k][j]=anm[k][j]*c;
for(i=kp1;i<nn;i++)
anm[i][j]=anm[i][j]-anm[i][k]*anm[k][j];
fu[j]=fu[j]-anm[j][k]*fu[k];
}
}
fu[nn-1]=fu[nn-1]/anm[nn-1][nn-1];
cout<<"开始回代"<<endl;;
for(k=1;k<nm1;k++)
{
i=nn-k;
c=0.0;
ip1=i+1;
for(j=ip1;j<nn;j++)
c=c+anm[i][j]*fu[j];
fu[i]=fu[i]-c;
}
}
//=============================================================网格生成子程序
void grid()
{
int i,j,temp1;
double temp,temp2;
//////////////////////////////////// x坐标
//////第一块
for(i=0;i<=5;i++)
{
temp=1.25-cos(9*i*Pi/180.0)/4.0;
temp=temp/20.0;
for(j=0;j<=20;j++)
x[j*21+i+1]=temp*j;
}
////////第二块
temp=(1.25-cos(45*Pi/180.0)/4.0)/20.0;
for(i=7;i<=21;i++)
{
for(j=0;j<=20;j++)
x[j*21+i]=temp*j;
}
//////////第三块
for(i=6;i<=10;i++)
{
temp=1.25-cos(9*i*Pi/180.0)/4.0;
for(j=1;j<=16;j++)
x[441+16*(i-6)+j]=temp;
}
///////////////////////////////////////// y坐标
///////////第一块
for(i=1;i<=6;i++)
{
temp=sin(9*(i-1)*Pi/180)/4;
for(j=0;j<21;j++)
{
y[i+21*j]=temp;
}
}
//////////第二块
temp=(1-(sin(45*Pi/180)/4.0))/15;
temp2=sin(45*Pi/180)/4.0;
for(i=7;i<=21;i++)
{
for(j=1;j<=21;j++)
y[21*(j-1)+i]=temp2+temp*(i-6);
}
//////////第三块
for(i=6;i<=10;i++)
{
temp=sin(9*i*Pi/180)/4;
temp2=(1-temp)/15;
for(j=1;j<=16;j++)
y[441+(i-6)*16+j]=temp+temp2*(j-1);
}
//////////////////////////////写文件
fstream file1;
file1.open("grid.dat",ios::out);
for (i=1;i<=521;i++)
file1<<x[i]<<" "<<y[i]<<" "<<y[i]<<endl;
file1.close();
//////////////////计算n=n[4][951]
for(ne=1;ne<951;ne++)
{
if(ne%2==1)
{
if(ne>=801)
temp1=(ne+1)/2+25+(ne-800)/30;
else
temp1=(ne+1)/2+(ne-1)/40;
n[1][ne]=temp1+1;
n[2][ne]=temp1;
if(ne>=801)
n[3][ne]=temp1+16;
else
n[3][ne]=temp1+21;
}
else
{
if(ne>=801)
temp1=(ne)/2+25+(ne-801)/30;
else
temp1=ne/2+(ne-1)/40;
n[1][ne]=temp1+1;
if(ne>=801)
n[2][ne]=temp1+16;
else
n[2][ne]=temp1+21;
if(ne>=801)
n[3][ne]=temp1+17;
else
n[3][ne]=temp1+22;
}
}
///////////强制边条//////////共76个
for(i=1;i<=21;i++)
nr[i]=i;
for(i=1;i<=20;i++)
nr[21+i]=1+21*i;
for(i=1;i<=5;i++)
nr[41+i]=421+i;
for(i=1;i<=5;i++)
nr[46+i]=426+i*16;
for(i=1;i<=20;i++)
nr[51+i]=21+21*i;
for(i=1;i<=5;i++)
nr[71+i]=441+16*i;
///////////自然边条//////////共14个
for(i=1;i<=14;i++)
ns[i]=506+i;
////////////////强制边条的值
for(i=1;i<=21;i++)
ur[i]=(i-1)/20.0;
for(i=1;i<=30;i++)
ur[21+i]=0.0;
for(i=1;i<=25;i++)
{
ur[51+i]=1.0;
cout<<ur[51+i]<<endl;
}
}
//===============================================================单元函数计算子程序
void elmt()
{
int i,j,k;
double d,b[4],c[4],xe[4],ye[4],f[4];
for (i=1;i<=3;i++)
{
k=n[i][ne];
xe[i]=x[k];
ye[i]=y[k];
f[i]=0;
}
d=xe[2]*ye[3]-xe[3]*ye[2]+xe[3]*ye[1]-xe[1]*ye[3]+xe[1]*ye[2]-xe[2]*ye[1];
for(i=1;i<=3;i++)
{
j=i+1;
if(j>3) j=j-3;
k=j+1;
if(k>3) k=k-3;
b[i]=(ye[j]-ye[k])/d;
c[i]=(xe[k]-xe[j])/d;
}
for(i=1;i<=3;i++)
for(j=1;j<=3;j++)
aij[i][j]=0.5*(b[i]*b[j]+c[i]*c[j])*d;
}
//====================================================================主程序
void main()
{
cout<<"hello,begin!\n";
int i,j,temp,temp2,k;
/////////////////生成网格
grid();
cout<<n[3][950]<<endl<<endl;
cout<<"hello,grid finished!"<<endl;
cout<<"ur76="<<ur[76]<<endl;
/////////////////系数矩阵元素,右端项元素置零
for (i=1;i<522;i++)
{
fu[i]=0;
for(j=1;j<522;j++)
anm[i][j]=0;
}
cout<<"ur76="<<ur[76]<<endl;
///////////////调用计算单元系数矩阵的子程序
cout<<"计算单元函数并合成"<<endl;
for(ne=1;ne<=950;ne++)
{
//////////////调用单元子程序并总体合成
elmt();
for(i=1;i<=3;i++)
{
temp=n[i][ne];
fu[temp]+=fe[i];
for(j=1;j<=3;j++)
{
temp2=n[j][ne];
anm[temp][temp2]+=aij[i][j];
}
}
}
cout<<"总体合成结束!"<<endl;
for(i=1;i<=3;i++)
for(j=1;j<=3;j++)
cout<<aij[i][j]<<endl;
//////////////计算强制边条
for(i=1;i<=76;i++)
{
k=nr[i];
anm[k][k]=1e20*anm[k][k];
fu[k]=anm[k][k]*ur[i];
}
cout<<"ur76="<<ur[76]<<endl;
cout<<"强制边条计算完毕"<<endl;
cout<<"输出总体刚度矩阵文件,文件名amn.dat"<<endl;
fstream file2;
file2.open("amn.dat",ios::out);
file2<<"总体刚度矩阵521*521"<<endl;
for (i=1;i<522;i++)
{
file2<<"=============================="<<i<<"==================="<<endl;
for(j=1;j<522;j++)
{
file2<<anm[i][j]<<" ";
if(j%21==0)
file2<<endl;
}
file2<<endl;
}
file2.close();
/////////////调用高斯消去法
cout<<"高斯消去法开始计算"<<endl;
gauss();
//////////////结果输出
cout<<"写结果--文件名result.dat"<<endl;
fstream file1;
file1.open("result.dat",ios::out);
file1<<"Title = 有限元大作业"<<endl;
file1<<"Variables = X,Y,result"<<endl;
file1<<"Zone T=zone1, I=21,j=21,F=Point"<<endl;
for (i=1;i<=441;i++)
file1<<x[i]<<" "<<y[i]<<" "<<fu[i]<<endl;
file1<<"Zone T=zone2, I=16,j=6,F=Point"<<endl;
for (i=426;i<=521;i++)
file1<<x[i]<<" "<<y[i]<<" "<<fu[i]<<endl;
file1.close();
cout<<"hello,successfully over!"<<endl;
cout<<endl;
}
谢谢大侠你能看完,在vc++6.0中,三个红色标记的 Ur76 的值都是1,而同样的程序复制到c++2008中之后,我将最开始的头文件(可能说法不准,就是有下划线的开头3行)改成如下:
#include <iostream>
using namespace std;
#include <math.h>
#include <fstream>
using namespace std;
其他的都没有改,但是3个 Ur76 的值却依次变成了:
Ur76=1
Ur76=0
Ur76=3.21688e+019
各位大侠,这个问题困扰了我三天了,谢谢你们的帮助,小弟感激不尽~~~
因为是新手,只有10分了,实在不好意思,不知道能不能追分