CyRhmU.jpeg
南方科技大学公共卫生及应急管理学院2026级博士研究生招生报考通知(长期有效)
查看: 765  |  回复: 4

smileheaven

金虫 (小有名气)

[求助] 这个C++程序到底哪里出了问题了?已有1人参与

最近需要交一个关于求解杆系问题的程序设计作业,但是苦于没有太多C++编程经验,因此在编写过程中出现了不能运行的错误,但是编译的时候是没有什么问题的,所以还请各位大神能够帮忙解答,不胜感激!
其中HELP.txt是程序文件
RZSCI.DAT是要读入的数据文件!
谢谢
回复此楼

» 本帖附件资源列表

  • 欢迎监督和反馈:小木虫仅提供交流平台,不对该内容负责。
    本内容由用户自主发布,如果其内容涉及到知识产权问题,其责任在于用户本人,如对版权有异议,请联系邮箱:xiaomuchong@tal.com
  • 附件 1 : HELP.txt
  • 2015-06-18 15:19:20, 14.02 K

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

探求、奋斗、不达目的誓不罢休
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

smileheaven

金虫 (小有名气)

忘了把要读的数据文件写上了:
附数据文件:
6,10,2,2,2.0E8
1,2.0,1.0
2,2.0,0.0
3,1.0,1.0
4,1.0,0.0
5,0.0,1.0
6,0.0,0.0
1,1,2,1.000
2,1,3,1.000
3,2,4,1.000
4,1,4,1.414
5,2,3,1.414
6,3,4,1.000
7,3,5,1.000
8,3,6,1.414
9,4,5,1.414
10,4,6,1.000
2,0.0,-1.0
4,0.0,-1.0
5,0,1,0.0,0.0
6,0,1,0.0,0.0
探求、奋斗、不达目的誓不罢休
2楼2015-06-18 19:09:14
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

smileheaven

金虫 (小有名气)

真的很急,拜托了!很简单的程序的!
探求、奋斗、不达目的誓不罢休
3楼2015-06-19 16:44:41
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

smileheaven

金虫 (小有名气)

还是把源程序放上来吧,省的大神们还要下载
#include<iostream.h>
#include<fstream.h>
#include<stdlib.h>
#include<math.h>
#include<iomanip.h>
//以下定义函数
void INPUT(double X[], double Y[], int NCO[], double PROP[], double AL[],
int IB[], double REAC[]); //定义原始数据输入
void ASSEM(double X[], double Y[], int NCO[], double PROP[], double TK[][20],
double ELST[][5], double AL[]); //生成总刚度矩阵
void STIFF(int NEL, double X[], double Y[], int NCO[], double PROP[],
double ELST[][5], double AL[]); //生成单元刚度矩阵
void ELASS(int NEL, int NCO[], double TM[][20], double ELMAT[][5]); //单刚总刚传递
void BOUND(double TK[][20], double AL[], double REAC[], int IB[]);
void SLBSI(double A[][20], double B[], double D[], int N, int MS, int NRMX,
int NCMX);
void FORCE(int NCO[], double PROP[], double FORC[], double REAC[], double X[],
double Y[], double AL[]);
void OUTPT(double AL[], double FORC[], double REAC[]);
// 以下初始化全局变量
int NN,NE,NLN,NBN,N,MS;
double E,G;
// 定义输入输出数据
ifstream READ_IN;  //声明一个输入流
ofstream WRITE_IO; //声明一个输出流
//  初始化程序参数
int NRMX=200;
int NCMX=20;
int NDF=2;
int NNE=2;
int NDFEL=NDF*NNE;
int main()
{
    double X[100], Y[100], PROP[100], TK[200][20], AL[200], FORC[100], REAC[200]
    , ELST[5][5], V[20];
    int NCO[200], IB[60];
    char file1[20], file2[20];
//
//打开所有文件
    cin>>file1>>file2;
         WRITE_IO.open(file1);  
        READ_IN.open(file2);
//输入数据
    INPUT(X,Y,NCO,PROP,AL,IB,REAC);
//
//定义总体刚度矩阵
    ASSEM(X,Y,NCO,PROP,TK,ELST,AL);
//
//引入边界条件
    BOUND(TK,AL,REAC,IB);
//解总体方程
    SLBSI(TK,AL,V,N,MS,NRMX,NCMX);
//计算外载荷数量
    FORCE(NCO,PROP,FORC,REAC,X,Y,AL);
//
//输出
    OUTPT(AL,FORC,REAC);
//
// 关闭所有文件
    READ_IN.close();
    WRITE_IO.close();
    return 0;
}
//  子程序1:桁架静力分析子程序开始
//
///////////////////////////////////////////////////////////////////////
void INPUT(double X[], double Y[], int NCO[], double PROP[], double AL[],
int IB[], double REAC[]) //定义原始数据输入
{
//输入程序
//
    int I,NUM,N1,IC[2],K,L,L1,L2,N2;
    double W[3];
    WRITE_IO.setf(ios::fixed);
    WRITE_IO.setf(ios::showpoint);
    WRITE_IO<<" "<<
    "****************************************************"
            <<endl;
//
//读取基本参数
    READ_IN >> NN >> NE>> NLN >> NBN >> E;
    WRITE_IO <<"\n\n 内部数据 \n\n"<<"结点数           :"
             <<setw(10) << NN << "\n"<< "单元数         :"
             <<setw(10) << NE << "\n"<<"受载结点数      :"
             <<setw(10) << NLN <<"\n"<<"支持结点数      :"
             <<setw(10) << NBN <<"\n"<<"弹性模量        :"
             <<setw(15)<< setprecision(0) <<E<<"\n\n" << "结点坐标\n"
             <<setw(11)<< "结点"
             <<setw(7) << "X"
             <<setw(10)<< "Y\n";
//
//按行读取结点坐标
    for(I=1; I<=NN; I++)
    {
        READ_IN>>NUM>>X[NUM]>>Y[NUM];
    }
    for(I=1; I<=NN; I++)
    {
        WRITE_IO.precision(2);
        WRITE_IO<<setw(10)<<I<<setw(10)<<X[I]<<setw(10)<<Y[I]<<"\n";
    }
//按行读取单元连接
//单元属性
    WRITE_IO<<"\n 单元连接及属性\n"
            <<setw(11) << "单元"
            <<setw(23) << "开始结点   结束结点"
            <<setw(9)  << "区域"
            <<endl;
    for(I=1;I<=NE; I++)
    {
        READ_IN>>NUM>>IC[0]>>IC[1]>>PROP[NUM];
        WRITE_IO.precision(5);
        WRITE_IO <<setw(10) <<NUM
                 <<setw(10) <<IC[0]
                 <<setw(10) <<IC[1]
                 <<setw(15) <<PROP[NUM]
                 <<"\n";
        N1=NNE* (NUM-1);
        NCO[N1+1]=IC[0];
        NCO[N1+2]=IC[1];
    }
//
//计算实际未知数目并清除载荷向量
    N=NN*NDF;
    for(I=1; I<=N;I++)
    {
        REAC[I]=0.0;
        AL[I]=0.0;
    }
//读取结点载荷并按行存储
    WRITE_IO <<"\n 结点载荷\n"
             <<setw(11) <<"结点"
             <<setw(7)  <<"PX"
             <<setw(10) <<"PY"
             <<endl;
    for(I=1; I<=NLN; I++)
    {
        READ_IN>> NUM >>W[0] >>W[1];
        WRITE_IO.precision(2);
        WRITE_IO <<setw(10) <<NUM
                 <<setw(10) <<W[0]
                 <<setw(10) <<W[1]
                 <<"\n";
        for(K=1; K<=NDF; K++)
        {
            L=NDF*(NUM-1)+K;
            AL[L]=W[K-1];
        }
    }
//读取边界结点数据,存储位置状态的indicatiors
//IN ARRAY IB, AND PRESCRIBED UNKNOWN VALUES IN ARRAY REAC
    WRITE_IO <<"\n 边界条件数据 \n"
             <<setw(29) <<"状态"
             <<setw(31) <<"prescribed values\n"
             <<setw(37) <<"(0:prescribed, 1:free)\n"
                         <<setw(11) <<"结点"
             <<setw(9)  <<"U"
             <<setw(10) <<"V"
             <<setw(17) <<"U"
             <<setw(10) <<"V"
             <<endl;
    for(I=1; I<=NBN; I++)
    {
         READ_IN >>NUM>> IC[0]>> IC[1]>> W[0]>> W[1];
         WRITE_IO.precision(4);
         WRITE_IO <<setw(10)<< NUM
                  <<setw(10)<< IC[0]
                  <<setw(10)<< IC[1]
                  <<setw(20)<< W[0]
                  <<setw(10)<< W[1]
                  <<"\n";
         L1=(NDF+1)*(I-1)+1;
         L2=NDF*(NUM-1);
         IB[L1]=NUM;
         for(K=1; K<=NDF; K++)
         {
              N1=L1+K;
              N2=L2+K;
              IB[N1]=IC[K-1];
              REAC[N2]=W[K-1];
         }
    }
//子程序结束
    return;
}      
//子程序2:桁架静力分析子程序开始
//
/////////////////////////////////////////////////////////////////////////////////////////
void ASSEM(double X[], double Y[], int NCO[], double PROP[], double TK[][20],
double ELST[][5], double AL[]) //生成总刚度矩阵
{
//定义总矩阵
    int N1,I,L1,J,L2,J1,K,L3,L,NEL;
//计算半带宽并存入MS
    N1=NNE-1;
MS=0;
for(I=1; I<=NE; I++)
{
    L1=NNE*(I-1);
    for(J=1; J<=N1; J++)
    {
         L2=L1+J;
         J1=J+1;
         for(K=J1; K<=NNE; K++)
         {
              L3=L1+K;
              L=abs(NCO[L2]-NCO[L3]);
              if((MS-L)<=0)
              {
                   MS=L;
              }
         }
    }
}
     MS=NDF*(MS+1);
//清空总体刚度矩阵
    for(I=1;I<=N;I++)
{
    for(J=1;J<=MS;J++)
    {
          TK[I][J]=0.0;
    }
}
for(NEL=1; NEL<=NE; NEL++)
{
//计算单元刚度矩阵
    STIFF(NEL,X,Y,NCO,PROP,ELST,AL);
//放入总体刚度矩阵
    ELASS(NEL,NCO,TK,ELST);
}
//
return;
}
  // 子程序3:刚度矩阵分析子程序开始
//
///////////////////////////////////////////////////////////////////////////////////////////
void STIFF(int NEL, double X[], double Y[], int NCO[], double PROP[],
double ELST[][5], double AL[]) //生成单元刚度矩阵
{
//计算所在单元刚度矩阵
//
    int L,N1,N2,I,J,K1,K2;
    double D,CO,SI,COEF;
//
//
    L=NNE*(NEL-1);
    N1=NCO[L+1];
    N2=NCO[L+2];
//
//计算单元长度以及X轴的正弦与余弦值
    D=sqrt(pow((X[N2]-X[N1]),2)+pow((Y[N2]-Y[N1]),2));
    CO=(X[N2]-X[N1])/D;
    SI=(Y[N2]-Y[N1])/D;
//
//计算单元刚度矩阵
    COEF=E*PROP[NEL]/D;
    ELST[1][1]=COEF*CO*CO;
    ELST[1][2]=COEF*CO*SI;
    ELST[2][2]=COEF*SI*SI;
    for (I=1;I<=2;I++)
    {
        for(J=1;J<=2;J++)
        {
              K1=I+NDF;
              K2=J+NDF;
              ELST[K1][K2]=ELST[I][J];
              ELST[I][K2]=-ELST[I][J];
        }
    }
    ELST[2][3]=-ELST[1][2];
    return;
}
//
//子程序4
///////////////////////////////////////////////////////////////////////////////////////////////
void ELASS(int NEL, int NCO[], double TM[][20], double ELMAT[][5]) //单刚总刚传递
{
//在总体刚度矩阵中存储单元刚度矩阵值
     int L1,I,L2,N1,I1,J1,J,N2,I2,J2,K,KI,KR,IC,K1,K2,L,KC;
     L1=NNE*(NEL-1);
     for(I=1;I<=NNE;I++)
     {
           L2=L1+I;
           N1=NCO[L2];
           I1=NDF*(I-1);
           J1=NDF*(N1-1);
           for(J=1;J<=NNE;J++)
           {
                 L2=L1+J;
                 N2=NCO[L2];
                 I2=NDF*(J-1);
                 J2=NDF*(N2-1);
                 for(K=1;K<=NDF;K++)
                 {
                       KI=1;
                       if((N1-N2)==0)
                       {
                             KI=K;
                       }
                       if((N1-N2)<=0)
                       {
                             KR=J1+K;
                             IC=J2-KR+1;
                             K1=I1+K;
                       }
                       else
                       {
                             KR=J2+K;
                             IC=J1-KR+1;
                             K2=I2+K;
                       }
                       for(L=KI;L<=NDF;L++)
                       {
                             KC=IC+L;
                             if((N1-N2)<=0)
                             {
                                    K2=I2+L;
                             }
                             else
                             {
                                    K1=I1+L;
                             }
                             TM[KR][KC]=TM[KR][KC]+ELMAT[K1][K2];
                       }
                 }
           }
     }
     return;
}                              
//
//子程序5
///////////////////////////////////////////////////////////////////////////////
void BOUND(double TK[][20], double AL[], double REAC[], int IB[])
{
//引入边界条件
    int L,L1,NO,K1,I,L2,KR,J,KV;
    for (L=1;L<=NBN;L++)
    {
        L1=(NDF+1)*(L-1)+1;
        NO=IB[L1];
        K1=NDF*(NO-1);
        for(I=1;I<=NDF;I++)
        {
              L2=L1+I;
              if(IB[L2]==0)
              {
                    KR=K1+I;
                    for(J=2;J<=MS;J++)
                    {
                          KV=KR+J-1;
                          if((N-KV)>=0)
                          {
                                AL[KV]=AL[KV]-TK[KR][J]*REAC[KR];
                                TK[KR][J]=0.0;
                          }
                          KV=KR-J+1;
                          if(KV>0)
                          {
                                AL[KV]=AL[KV]-TK[KV][J]*REAC[KR];
                                TK[KV][J]=0.0;
                          }
                    }
                    TK[KR][1]=1.0;
                    AL[KR]=REAC[KR];
              }
        }
    }
    return;
}
//
//子程序6
/////////////////////////////////////////////////////////////////////////////////////////////
void SLBSI(double A[][20], double B[], double D[], int N, int MS, int NRMX,
int NCMX)
{
//
//
    int N1,K,K1,NI,L,J,K2,I,K3;
    double C;
//
    N1=N-1;
    for(K=1;K<=N1;K++)
    {
        C=A[K][1];
        K1=K+1;
        if(C<=0.000001&&C>=-0.000001)
        {
             WRITE_IO<<"****row奇异性****"<<setw(5)<<K;
             return;
        }
        else
        {
            NI=K1+MS-2;
            if(N1<=N)
                        {L=N1;}
                        else
                        {L=N;}
            for(J=2;J<=MS;J++)
            {
                 D[I]=A[K][J];
            }
            for(J=K1;J<=L;J++)
            {
                 K2=J-K+1;
                 A[K][K2]=A[K][K2]/C;
            }
            B[K]=B[K]/C;
            //
            //
            for(I=K1;I<=L;I++)
            {
                K2=I-K1+2;
                C=D[K2];
                for(J=I;J<=L;J++)
                {
                    K2=J-I+1;
                    K3=J-K+1;
                    A[I][K2]=A[I][K2]-C*A[K][K3];
                }
                B[I]=B[I]-C*B[K];
            }
        }
    }
    if(A[N][1]<=0.000001&&A[N][1]>=0.000001)
    {
         WRITE_IO<<"****ROW奇异****"<<setw(5)<<K;
         return;
    }
    else
    {
        B[N]=B[N]/A[N][1];
//
//
    for(I=1;I<=N1;I++)
    {
         K=N-I;
         K1=K+1;
         NI=K1+MS-2;
         if(NI<=N)
                 {L=NI;}
                 else
                 {L=N;}
         for(J=K1;J<=L;J++)
         {
               K2=J-K+1;
               B[K]=B[K]-A[K][K2]*B[J];
         }
    }
}
//
return;
}

//
//子程序7
//////////////////////////////////////////////////////////////////////////////////////////////////////
void FORCE(int NCO[], double PROP[], double FORC[], double REAC[],
double X[], double Y[], double AL[])
{
    int I,NEL,L,N1,N2,K1,K2;
    double D,CO,SI,COEF;
//
//
    for(I=1;I<=N;I++)
    {
        REAC[I]=0.0;
    }
    for(NEL=1;NEL<=NE;NEL++)
    {
        L=NNE*(NEL-1);
        N1=NCO[L+1];
        N2=NCO[L+2];
        K1=NDF*(N1-1);
        K2=NDF*(N2-2);
        D=sqrt(pow((X[N2]-X[N1]),2)+pow((Y[N2]-Y[N1]),2));
        CO=(X[N2]-X[N1])/D;
        SI=(Y[N2]-Y[N1])/D;
        COEF=E*PROP[NEL]/D;
        FORC[NEL]=COEF*((AL[K2+1]-AL[K1+1])*CO+(AL[K2+2]-AL[K1+2])*SI);
        REAC[K1+1]=REAC[K1+1]-FORC[NEL]*CO;
        REAC[K1+2]=REAC[K1+2]-FORC[NEL]*SI;
        REAC[K2+1]=REAC[K2+1]+FORC[NEL]*CO;
        REAC[K2+2]=REAC[K2+2]+FORC[NEL]*SI;
    }
    return;
}
  //
//子程序8
//////////////////////////////////////////////////////////////////////////////////////
void OUTPT(double AL[], double FORC[], double REAC[])
{
     int I,K1,K2,J;
     WRITE_IO<<
     "\n\n ******************************************************\n\n"
             <<"结果\n\n"<<"结点位移\n"
             <<setw(11)<<"结点"
             <<setw(12)<<"U"
             <<setw(15)<<"V"
             <<endl;
     for(I=1;I<=NN;I++)
     {
          K1=NDF*(I-1)+1;
          K2=K1+NDF-1;
          WRITE_IO<<setw(10)<<I;
          for(J=K1;J<=K2;J++)
          {
               WRITE_IO<<setw(15)<<AL[J];
          }
                  WRITE_IO<<endl;
     }
     WRITE_IO <<"\n 结点支反力 \n"
              <<setw(11)<<"结点"
              <<setw(12)<<"PX"
              <<setw(15)<<"PY\n";
     for(I=1;I<=NN;I++)
     {
         K1=NDF*(I-1)+1;
         K2=K1+NDF-1;
         WRITE_IO<<setw(10)<<I;
         for(J=1;J<=K2;J++)
         {
               WRITE_IO<<setw(15)<<REAC[J];
         }
         WRITE_IO<<endl;
     }
     WRITE_IO<<"\n 结点数"
             <<setw(27)<<"结点   轴力\n";
     for(I=1;I<=NE;I++)
     {
          WRITE_IO<<setw(10)<<I<<setw(15)<<FORC[I]<<endl;
     }
     WRITE_IO<<
     "\n\n ************************************************* \n";
     return;
}
探求、奋斗、不达目的誓不罢休
4楼2015-06-19 21:59:14
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dk1013

木虫 (正式写手)

【答案】应助回帖

感谢参与,应助指数 +1
建议你把报错信息贴上来,另外不妨花些时间解释下你的程序。
到得还来别无事 庐山烟雨浙江潮
5楼2015-06-20 08:36:15
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 smileheaven 的主题更新
信息提示
请填处理意见