| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 464 人关注过本帖
标题:关于vc++6.0中的程序到c++2008中有些数据发生突变的情况,希望大家能给与帮 ...
只看楼主 加入收藏
qq369329828
Rank: 1
来 自:浙江
等 级:新手上路
帖 子:9
专家分:0
注 册:2011-5-29
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:4 
关于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分了,实在不好意思,不知道能不能追分
搜索更多相关主题的帖子: 子程序 
2011-05-29 13:03
qq369329828
Rank: 1
来 自:浙江
等 级:新手上路
帖 子:9
专家分:0
注 册:2011-5-29
收藏
得分:0 
各位大侠,帮帮忙看看,别让贴沉了,谢谢

共同努力
2011-05-30 08:27
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:10 
数组越界  double x[522],y[522],aij[4][4],fe[4],anm[522][522],fu[522],ur[72];

收到的鲜花
  • qq3693298282011-05-31 09:30 送鲜花  2朵   附言:我很赞同
2011-05-30 22:00
qq369329828
Rank: 1
来 自:浙江
等 级:新手上路
帖 子:9
专家分:0
注 册:2011-5-29
收藏
得分:0 
回复 3楼 寒风中的细雨
非常感谢版主,我整弄了一天之后才发现,开始改了后面一个撤销忘改回来了~~编程粗心是个大问题哈,一定要细心

共同努力
2011-05-31 09:29
qq369329828
Rank: 1
来 自:浙江
等 级:新手上路
帖 子:9
专家分:0
注 册:2011-5-29
收藏
得分:0 
一个人找不到的问题,大家一起来看看,就能找到,谢谢版主,我对论坛又充满希望了

共同努力
2011-05-31 09:32
快速回复:关于vc++6.0中的程序到c++2008中有些数据发生突变的情况,希望大家能给 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.127874 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved