qq_41023904
qq_41023904
2021-06-15 22:35
采纳率: 0%
浏览 179

用MFC写了一段程序运行不出来,求大神指教

void CMy1Dlg::OnOK() 
{
    // TODO: Add extra validation here
    //MessageBox("Hello, Windows!");
    if(((CButton *)GetDlgItem(IDC_RADIO10))->GetCheck() && ((CButton *)GetDlgItem(IDC_RADIO11))->GetCheck()){
        //MessageBox("ddf");能弹出MessageBox,但是再往下的程序运行不出来。
        
        //MessageBox("请输入您测量的转角数");
        int n= GetDlgItemInt(IDC_EDIT1);
        //cin>>n;
        //cout<<"请输入转角数"<<endl;
        //cin>>n;
        ifstream ep;
        ep.open("闭合导线各边距.txt",ios::in);
        if(!ep.is_open()){
            cout<<"打开文件失败"<<endl;
            return ;
        }
        for(i=1;i<=n;i++){
            ep>>di[i];
            cout<<"第"<<i<<"导线边距为"<<di[i]<<endl;
            g=g+di[i];
        }
        ep.close();
        cout<<"各导线边的和"<<g<<'\n';
        ifstream jp;
        jp.open("闭合导线各测角观测值.txt",ios::in);
        if(!jp.is_open()){
            cout<<"打开文件失败"<<endl;
            return ;
        }
        for(i=1;i<=n;i++){
            jp>>d[i]>>f[i]>>m[i];
            sumd=sumd+d[i]+(sumf+f[i]+(summ+m[i])/60)/60;
            sumf=(sumf+f[i]+(summ+m[i])/60)%60;
            summ=(summ+m[i])%60;
            cout<<d[i]<<"°"<<f[i]<<"′"<<m[i]<<"″"<<"\n";
        }
        jp.close();
        cout<<"内角和为"<<sumd<<"°"<<sumf<<"′"<<summ<<"″"<<"\n";
        cout<<"角度闭合差为"<<sumd-(n-2)*180<<"°"<<sumf<<"′"<<summ<<"″";
        if(abs(sumd-(n-2)*180)*60+sumf*60+summ>60*sqrt(60)){
            cout<<"角度闭合差超限";
        }
        else{
            gz=-((sumd-(n-2)*180)*60+sumf*60+summ)/n;
            cout<<"角度闭合差符合精度要求,水平角改正数为"<<gz<<"″"<<'\n';
        }
        for(i=1;i<=n;i++){
            if(abs(gz)<60){
                m[i]=m[i]+gz;
                if(m[i]<0){
                    f[i]=f[i]-1;m[i]=m[i]+60;
                    if(d[i]<0){
                        d[i]=d[i]-1;f[i]=f[i]+60;}
                        if(m[i]>=60){
                            m[i]=m[i]%60;f[i]=f[i]+m[i]/60;
                            if(f[i]>60){
                                f[i]=f[i]%60;d[i]=d[i]+f[i]/60;
                            }
                        }
                    }
                }
            if(abs(gz)>=60&&abs(gz)<3600){
                f[i]=f[i]+gz/60;d[i]=d[i]+f[i]/60;
            }
            if(abs(gz)>=3600){
                d[i]=d[i]+gz/3600;
            }
            yd[i]=d[i]+(long double)f[i]/60+(long double)m[i]/3600;
            cout<<"改正后的第"<<i<<"个水平角为"<<d[i]<<"°"<<f[i]<<"′"<<m[i]<<"″"<<'\n';
            gsumd=gsumd+d[i]+(gsumf+f[i]+(gsumm+m[i])/60)/60;
            gsumf=(gsumf+f[i]+(gsumm+m[i])/60)%60;
            gsumm=(gsumm+m[i])%60;
        }

        cout<<"改正后内角和"<<gsumd<<"°"<<gsumf<<"′"<<gsumm<<"″";
        if(gsumd!=(n-2)*180){
            cout<<"调整后角度不闭合,请查找错误";
            return ;
        }
        ifstream ap;
        ap.open("闭合导线已知方位角.txt",ios::in);
        if(!ap.is_open()){
            cout<<"打开文件失败"<<endl;
            return ;
        }
        ap>>fd[1]>>ff[1]>>fm[1];
        ap.close();
        cout<<"导线边1的方位角为"<<fd[1]<<"°"<<ff[1]<<"′"<<fm[1]<<"″"<<'\n';
        B[1]=fd[1]+(long double)ff[1]/60+(long double)fm[1]/3600;//导线边1的方位角小数形式
        for(i=2;i<=n;i++){//开始求算各边方位角
            fm[i]=fm[i-1]+m[i];//前进方向边的方位角=后方方位角+观测角-180
            ff[i]=ff[i-1]+f[i];
            fd[i]=fd[i-1]+d[i]-180;
            if(fm[i]>=60){
                ff[i]=ff[i]+1;fm[i]=fm[i]%60;
            }
            if(ff[i]>=60){
                fd[i]=fd[i]+1;ff[i]=ff[i]%60;
            }
            if(fd[i]>=360){
                fd[i]=fd[i]%360;
            }
            if(fd[i]<0){
                fd[i]=fd[i]+360;
            }
            B[i]=fd[i]+(long double)ff[i]/60+(long double)fm[i]/3600;
            cout<<"导线边"<<i<<"的坐标方位角为"<<fd[i]<<"°"<<ff[i]<<"′"<<fm[i]<<"″"<<'\n';
        }
        tB=B[n]+yd[1]-180;
        if(tB<0){
            tB=tB+360;cout<<"tB="<<tB<<'\n';
        }
        cout<<"初始方位角为"<<B[1]<<"推算的坐标方位角为"<<tB<<'\n';
        
        if(tB!=B[1]){
            cout<<"推算坐标方位角与原角不等,请查明原因";
            return ;
        }
        else{
            cout<<"推算坐标方位角与原角一致,下面开始计算坐标增量";
        }

        for(i=1;i<=n;i++){
            B[i]=B[i]*(pi/180);
            yd[i]=long double(yd[i]*pi/180);
            x[i+1]=di[i]*cos(B[i]);
            y[i+1]=di[i]*sin(B[i]);
            if(x[i+1]>0){//纵坐标增量
                x[i+1]=int(x[i+1]*100+0.5)/100.0;
            }
            if(x[i+1]<0){
                x[i+1]=int(x[i+1]*100-0.5)/100.0;
            }
            if(y[i+1]>0){//横坐标增量{
            y[i+1]=int(y[i+1]*100+0.5)/100.0;
            }
            if(y[i+1]<0){
                y[i+1]=int(y[i+1]*100-0.5)/100.0;
            }//四舍五入,保留两位小数
            sumx=sumx+x[i+1];sumy=sumy+y[i+1];
            cout<<x[i+1]<<'\t'<<y[i+1]<<'\n';}
            cout<<"纵坐标增量闭合差为"<<"米"<<sumx<<"横坐标增量闭合差为"<<sumy<<"米"<<'\n';
            fp=sqrt(pow(sumx,2)+pow(sumy,2));
            K=double(fp/g);
            cout<<"导线全长闭合差为"<<fp<<"米"<<setiosflags(ios::fixed)<<setprecision(5)<<"导线全长相对闭合差为"<<K<<"米"<<'\n';
            double yunxu=0.0005;
            if(K>=yunxu){
                cout<<"成果不合格"<<endl;
                return ;
            }
            else{
                cout<<"符合精度要求"<<endl;
            }
            for(i=1;i<=n;i++){
                if(sumx<0){
                    vx[i]=int(-sumx*di[i]*100/g+0.5)/1.0;
                    sumxz=sumxz+vx[i];
                }
                else{
                    vx[i]=int(-sumy*di[i]*100/g-0.5)/1.0;
                    sumxz=sumxz+vx[i];
                }
            if(sumy<0){
                vy[i]=int(-sumy*di[i]*100/g+0.5)/1.0;
                sumyh=sumyh+vy[i];
            }
            else{
                vy[i]=int(-sumy*di[i]*100/g-0.5)/1.0;
                sumyh=sumyh+vy[i];
            }
            cout<<"纵坐标增量改正数为"<<vx[i]<<"厘米"<<","<<"横坐标增量改正数为"<<vy[i]<<"厘米"<<endl;
        }
        for(i=1;i<=n;i++){
            x[i+1]=x[i+1]+float(vx[i]/100);
            y[i+1]=y[i+1]+float(vy[i]/100);
            if(i+1>n){
            x[1]=x[1]+float(vx[n]/100);
            y[1]=y[1]+float(vy[n]/100);}
            cout<<"改正后的导线"<<i<<"的纵坐标增量为"<<x[i+1]<<"米"<<","<<"横坐标增量为"<<y[i+1]<<"米"<<endl;
        }
        ifstream zp;
        zp.open("闭合导线已知坐标.txt",ios::in);
        if(!zp.is_open()){
            cout<<"打开文件失败"<<endl;
            return ;
        }
        zp>>xz[1]>>yh[1];
        zp.close();
        for(i=2;i<=n;i++){
            xz[i]=xz[i-1]+x[i];
            yh[i]=yh[i-1]+y[i];
        }
        for(i=1;i<=n;i++){
            cout<<i<<"导线点的坐标为"<<setiosflags(ios::fixed)<<setprecision(2)<<"("<<xz[i]<<","<<yh[i]<<")"<<endl;
        }

        xzt=xz[n]+x[1];
        yht=yh[n]+y[1];
        cout<<setiosflags(ios::fixed)<<setprecision(2)<<"推算出的起始坐标为"<<"("<<xzt<<","<<yht<<")"<<endl<<endl;
        
        cout<<"您已完成导线测量内业计算,各导线点的坐标为"<<endl;
        for(i=1;i<=n;i++){
            cout<<setiosflags(ios::fixed)<<setprecision(2)<<"    "<<i<<"    "<<"("<<xz[i]<<","<<yh[i]<<")"<<endl;
        }
        ofstream op;
        op.open("闭合导线结果存放.txt",ios::app);
        if(!op.is_open()){
            cout<<"打开文件失败"<<endl;
            return ;
        }
        for(i=1;i<=n;i++){
            op<<setiosflags(ios::fixed)<<setprecision(2)<<i<<"    "<<"("<<xz[i]<<","<<yh[i]<<")"<<endl;
        }
        op.close();
    }
    else{
        return;
    }
    CDialog::OnOK();
}
 

  • 点赞
  • 收藏

7条回答 默认 最新

  • technologist_37
    CSDN专家-link 2021-06-15 22:42

    数组d的长度是多少,为何你循环都是从1到n,而不是从0到n?

    点赞 评论
  • software7503

     int n= GetDlgItemInt(IDC_EDIT1);

    这条语句你是想获取文本框的值吗?

    点赞 评论
  • qq_41023904
    qq_41023904 2021-06-15 22:43

    这是我创建的对话框

    点赞 评论
  • wlwdecs_dn
    逆向通信猿 2021-06-16 07:28

    可以把整个工程上传一下吗,我可以帮你调试一下

    点赞 评论
  • weixin_41891396
    登楼流樱 2021-06-16 09:00

    GetDlgItemInt(int nID,BOOL *lpTrans=NULL,BOOL bSigned=TRUE)
    参数1:nID是控件的ID,


    参数2:主要是为了接收错误信息可能出现的错误信息有: ID无效,并且超过指定大小,比如说:ID为12345677,这个就不行.
    还有就是输入不能解析为一个int类型的,比如输入:"bvbvbvbv","3.5666",
    当然后面可以解析为一个浮点型,在这里取得的值为3,但是还是会有错误信息
    如果不指定第二个参数,就不会获得任何错误信息,这个参数很有用的,对输入的判断是否可以解析为int类型或者是否有效,很有用的,我们经常有这个参数来判断用户的输入是否合法

    参数3:默认的为true,主要是针对"-123",像这样的字符,它可以把前面的"-"解析为负号,那么就是标准的int类型了,如果设置为false,那么它不可以有负数,因为在这里的"-"号,被认为是不合法的

    点赞 评论
  • qq_40909394
    qq_40909394 2021-06-16 13:34

    针对你说的运行不出来,cout在mfc中是不能正常显示的,可在OnInitDialog()中添加上AllocConsole(); freopen("CONOUT$", "w", stdout);

    便于直接显示调试信息,然后你没有添加显示功能,将需要显示的信息用GetDlgItemInt(IDC_EDIT1)->SetWindowText(_T(""));

    点赞 评论
  • QA_Assistant
    有问必答小助手 2021-06-17 15:55

    您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

    如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

    ps: 问答会员年卡【8折】购 ,限时加赠IT实体书,即可 享受50次 有问必答服务,了解详情>>>https://t.csdnimg.cn/RW5m

    点赞 评论

相关推荐