yao_12345c_ 2017-05-16 13:57 采纳率: 0%
浏览 1598
已结题

怎么通过这个程序读取水准网平差原始数据.txt文件?

#include
#include
#include
#define M 20
#define BM 8
#define GS 13

double JH[M],l[M],v[M],B[M][M],BT[M][M],P[M][M],BTP[M][M],BTPB[M][M],BTPBN[M][M],BTPL[M],x[M],H[M],h[M],Qhh[M][M];
double danweiquanzhongwucha,gcz_zhongwucha[M],H_zhongwucha[M];
int fg_JH[M],fg[M][M];

struct
{
int qianshidian;
int houshidian;
double gaocha;
double changdu;
}gaochaguancezhi[M];

void shuzufuchushizhi()
{
int i,j;
for (i=0;i<M;i++)
{
for (j=0;j<M;j++)
{
fg_JH[i]=fg[i][j]=0;
l[i]=P[i][j]=BTP[i][j]=BTPB[i][j]=BTPBN[i][j]=BTPL[i]=0;
}
}
}

void shujuduqu()
{
int i,a,b,no;
double t1,t2;
FILE *fp;
fp=fopen("水准网原始数据.txt","r");
if (fp==NULL)
{
printf("打开文件失败!\n");
exit(0);
}
else
//读取高差观测值
for (i=1;i<=GS;i++)
{
fscanf(fp,"%d%d%d%lf%lf",&no,&a,&b,&t1,&t2);
gaochaguancezhi[i].houshidian=a;
gaochaguancezhi[i].qianshidian=b;
gaochaguancezhi[i].gaocha=t1;
gaochaguancezhi[i].changdu=t2;
}
//读取起始高程
fscanf(fp,"%d%lf",&a,&t1);
JH[a]=t1;
fg_JH[a]=1;
fclose(fp);
}

//计算近似高程
void jisuangaochengjinsizhi()
{
int i,a,b;
double t1;
for (i=1;i<=GS;i++)
{
a=gaochaguancezhi[i].houshidian;
b=gaochaguancezhi[i].qianshidian;
t1=gaochaguancezhi[i].gaocha;
if (fg_JH[a]!=0&&fg_JH[b]==0)
{
JH[b]=JH[a]+t1;
fg_JH[b]=1;
}
if(fg_JH[a]==0&&fg_JH[b]!=0)
{
JH[a]=JH[b]-t1;
fg_JH[a]=1;
}
}
}

void cal_xishu()
{
int i,hs,qs,x1,x2;
double xhs,xqs;
for (i=1;i<=GS;i++)
{
x1=x2=1;
hs=gaochaguancezhi[i].houshidian;
qs=gaochaguancezhi[i].qianshidian;
if (hs==8)
{
x1=0;
}
if (qs==8)
{
x2=0;
}
xhs=x1*(-1);
xqs=1*x2;
B[i][hs]=xhs;
B[i][qs]=xqs;

}
}

//计算常数矩阵
void cal_l()
{
int i,qs,hs;
double t;
for (i=1;i<=GS;i++)
{
qs=gaochaguancezhi[i].qianshidian;
hs=gaochaguancezhi[i].houshidian;
t=gaochaguancezhi[i].gaocha;
l[i]=t-(JH[qs]-JH[hs]);
l[i]=l[i]*1000;
}
}

//转置矩阵
void zhuanzhi()
{
int i,j;
for (i=1;i<=GS;i++)
{
for(j=1;j<BM;j++)
{
BT[j][i]=B[i][j];
}
}
}
//计算权阵
void cal_quanzhen()
{
double t;
int i;
for (i=1;i<=GS;i++)
{
t=gaochaguancezhi[i].changdu;
P[i][i]=1.0/t;
}
}

//矩阵乘法
void juzhenxiangcheng()

{
int i,j,k;
double t;
//计算BTP
for(i=1;i<BM;i++)
{
for(j=1;j<=GS;j++)
{
t=0;
for(k=1;k<=GS;k++)
{
t+=BT[i][k]*P[k][j];
}
BTP[i][j]=t;
}
}
//计算BTPB
for(i=1;i<BM;i++)
{
for(j=1;j<BM;j++)
{
t=0;
for(k=1;k<=GS;k++)
{
t+=BTP[i][k]*B[k][j];
}
BTPB[i][j]=t;
}
}
//计算BTPL
for(i=1;i<BM;i++)
{
t=0;
for(k=1;k<=GS;k++)
{
t+=BTP[i][k]*l[k];
}
BTPL[i]=t;
}
}

//交换两个数的值
void swap(double *a,double *b)
{
double c;
c=*a;
*a=*b;
*b=c;
}

//BTPB矩阵求逆
int inverse()
{
int i,j,k,aa[M],bb[M];
double d;
for (i=0;i<=M;i++)
{
for (j=0;j<=M;j++)
{
BTPBN[i][j]=BTPB[i][j];
}
}
for (k=1;k {
d=0;
for (i=k;i {
for (j=k;j {
if (fabs(BTPBN[i][j])>d)
{
d=fabs(BTPBN[i][j]);
aa[k]=i;
bb[k]=j;
}
}
}
if (d+1.0==1.0)
{
return 0;
}
if (aa[k]!=k)
{
for (j=1;j {
swap(&BTPBN[k][j],&BTPBN[aa[k]][j]);
}
}
if (bb[k]!=k)
{
for (i=1;i {
swap(&BTPBN[i][k],&BTPBN[i][bb[k]]);
}
}
BTPBN[k][k]=1/BTPBN[k][k];
for (j=1;j {
if (j!=k)
{
BTPBN[k][j]=BTPBN[k][j]*BTPBN[k][k];
}
}
for (i=1;i {
if (i!=k)
{
for (j=1;j {
if (j!=k)
{
BTPBN[i][j]=BTPBN[i][j]-BTPBN[i][k]*BTPBN[k][j];
}
}
}
}
for (i=1;i {
if (i!=k)
{
BTPBN[i][k]=-BTPBN[i][k]*BTPBN[k][k];
}
}
}
for (k=BM-1;k>=1;k--)
{
for (j=1;j<BM;j++)
{
if (bb[k]!=k)
{
swap(&BTPBN[k][j],&BTPBN[bb[k]][j]);
}
}
for (i=1;i<BM;i++)
{
if (aa[k]!=k)
{
swap(&BTPBN[i][k],&BTPBN[i][aa[k]]);
}
}

}
return 1;
}

//解法方程
void jiefafangcheng()
{
int i,k;
double t;
for(i=1;i<BM;i++)
{
t=0;
for(k=1;k<=GS;k++)
{
t+=BTPBN[i][k]*BTPL[k];
}
x[i]=t;
}
}

// 计算平差值
void cal_gaochengpingchazhi()
{
int i;
for(i=1;i<=BM;i++)
{
H[i]=JH[i]+x[i]/1000;
}

}

//计算观测值改正数
void guancezhigaizhengshu()
{
int i,j;
double t;
for(i=1;i<=GS;i++)
{
t=0;
for(j=1;j<=BM;j++) //
{
t+=B[i][j]*x[j];
}
v[i]=t-l[i];
}
}

//计算观测值平差值
void cal_guancezhipingchazhi()
{
int i;
for (i=1;i<=GS;i++)
{
h[i]=gaochaguancezhi[i].gaocha+(v[i]/1000);
}
}

// 计算观测值协因数
void cal_gczxieyinshu()
{
int i,j,k;
double BNBBN[M][M],t;
//计算BNBBN
for (i=1;i<=GS;i++)
{
for (j=1;j<BM;j++)
{
t=0;
for (k=1;k<BM;k++)
{
t+=B[i][k]*BTPBN[k][j];
}
BNBBN[i][j]=t;
}
}
//计算Qhh
for (i=1;i<=GS;i++)
{
for (j=1;j<=GS;j++)
{
t=0;
for (k=1;k<BM;k++)
{
t+=BNBBN[i][k]*BT[k][j];
}
Qhh[i][j]=t;
}
}
}

//精度评定
void jingdupingding()
{
int i;
double t=0,VTP[M];
//计算VTP
for(i=1;i<=GS;i++)
{

VTP[i]=P[i][i]*v[i];
}
//计算单位权中误差
for(i=1;i<=GS;i++)
{
t+=VTP[i]*v[i];
}
danweiquanzhongwucha=sqrt(t/(GS-BM+1));

//计算点位高程中误差
for(i=1;i<=BM;i++)
{
    H_zhongwucha[i]=sqrt(BTPBN[i][i])*danweiquanzhongwucha;
}

//计算观测值平差值中误差
for (i=1;i<=GS;i++)
{
    gcz_zhongwucha[i]=sqrt(Qhh[i][i])*danweiquanzhongwucha;
}   

}

//数据输出
void shujushuchu()
{
int i,j;
FILE *fp;
fp=fopen("水准网数据处理成果.txt","w");
if (fp==NULL)
{
printf("打开文件失败!\n");
exit(0);
}
//输出观测数据
fprintf(fp,"原始观测数据为:\n");
fprintf(fp,"水准点1 水准点2 高差观测值(m) 两水准点间距离(km)\n");
for (i=1;i<=GS;i++)
{
fprintf(fp,"%10d%10d%20.5lfm%20.5lfkm\n",gaochaguancezhi[i].houshidian,gaochaguancezhi[i].qianshidian,gaochaguancezhi[i].gaocha,gaochaguancezhi[i].changdu);
}
//输出各点近似高程
fprintf(fp,"\n各点近似高程为:\n");
fprintf(fp,"点号 近似高程(m)\n");
for (i=1;i<=BM;i++)
{
fprintf(fp,"%5d%15.5lfm\n",i,JH[i]);
}
//输出系数矩阵(B)
fprintf(fp,"\n系数矩阵(B)为:\n");
for (i=1;i<BM;i++)
{
fprintf(fp,"x%-19d",i);
}
fprintf(fp,"\n");
for (i=1;i<=GS;i++)
{
for (j=1;j<BM;j++)
{
fprintf(fp,"%-15.5lf",B[i][j]);
}
fprintf(fp,"\n");
}
fprintf(fp,"\n");
// 输出常数项
fprintf(fp,"常数矩阵(l)为:\n");
for (i=1;i<=GS;i++)
{
fprintf(fp,"l%d=%-10.6lfmm\n",i,l[i]);
}
//输出BTPB
fprintf(fp,"\n法方程系数阵(BTPB)为:\n");
for (i=1;i<BM;i++)
{
for(j=1;j<BM;j++)
{
fprintf(fp,"%-15.5lf ",BTPB[i][j]);
}
fprintf(fp,"\n");
}
fprintf(fp,"\n");
//输出法方程常数向量(BTPL)
fprintf(fp,"法方程常数向量(BTPL)为:\n");
for (i=1;i<BM;i++)
{
fprintf(fp,"%15.5lfmm\n",BTPL[i]);
}
fprintf(fp,"\n");

//输出BTPBN
fprintf(fp,"BTPBN:\n");
for (i=1;i<BM;i++)
{
    for(j=1;j<BM;j++)
    {
        fprintf(fp,"%-15.6lf ",BTPBN[i][j]);
    }
    fprintf(fp,"\n");
}
fprintf(fp,"\n");
//输出Qhh
fprintf(fp,"Qhh:\n");
for (i=1;i<=GS;i++)
{
    for(j=1;j<=GS;j++)
    {
        fprintf(fp,"%-15.6lf ",Qhh[i][j]);
    }
    fprintf(fp,"\n");
}
//输出权阵
fprintf(fp,"\n观测值的权阵为:\n");
for (i=1;i<=GS;i++)
{
    for(j=1;j<=GS;j++)
    {
        fprintf(fp,"%-15.6lf ",P[i][j]);
    }
    fprintf(fp,"\n");
}
//输出法方程的解
fprintf(fp,"\n法方程参数解为:\n");
for (i=1;i<BM;i++)
{
    fprintf(fp,"x%d=%-10.5lfmm\n",i,x[i]);
}
fprintf(fp,"\n");
//输出观测值改正数的解
fprintf(fp,"观测值改正数的解:\n");
for (i=1;i<=GS;i++)
{
    fprintf(fp,"v%d=%lfmm\n",i,v[i]);
}
fprintf(fp,"\n");
//输出观测值平差值
fprintf(fp,"观测值平差值:\n");
for (i=1;i<=GS;i++)
{
    fprintf(fp,"h%d=%lfm\n",i,h[i]);
}
fprintf(fp,"\n");
//输出单位权中误差
fprintf(fp,"单位权中误差为:\n");
fprintf(fp,"σ0=%lfmm\n",danweiquanzhongwucha);
fprintf(fp,"\n");
//输出观测值协因数
fprintf(fp,"观测值平差值的协因数为:\n");
for (i=1;i<=GS;i++)
{
    fprintf(fp,"Qh%dh%d=%lf\n",i,i,Qhh[i][i]);
}
fprintf(fp,"\n");
//输出观测值平差值中误差
fprintf(fp,"观测值平差值的中误差为:\n");
for (i=1;i<=GS;i++)
{
    fprintf(fp,"σh%d=%lfmm\n",i,gcz_zhongwucha[i]);
}
fprintf(fp,"\n");
//输出高程平差值中误差
fprintf(fp,"各点高程平差值的中误差为:\n");
for (i=1;i<=BM;i++)
{
    fprintf(fp,"σH%d=%lfmm\n",i,H_zhongwucha[i]);
}
fprintf(fp,"\n");
//输出最终成果
fprintf(fp,"最终成果\n观测值平差值及精度\n");
fprintf(fp,"起止点   高差观测值平差值  高差观测值平差值中误差\n");
for (i=1;i<=GS;i++)
{
    fprintf(fp,"%5d%5d%20.5lfm%25.5lfmm\n",gaochaguancezhi[i].houshidian,gaochaguancezhi[i].qianshidian,h[i],gcz_zhongwucha[i]);
}
fprintf(fp,"\n各点高程及精度\n");
fprintf(fp,"点号       高程(m)         高程中误差(mm)\n");
for (i=1;i<=BM;i++)
{
    fprintf(fp,"%5d%15.5lfm%15.5lfmm\n",i,H[i],H_zhongwucha[i]);
}
fclose(fp);

}

void main()
{
shuzufuchushizhi(); // 给数组赋初始值
shujuduqu(); // 读取数据
jisuangaochengjinsizhi(); // 计算高程近似值
cal_xishu(); // 计算系数矩阵
cal_l(); // 计算常数项
zhuanzhi(); // 计算BT
cal_quanzhen(); // 计算权阵
juzhenxiangcheng(); // 矩阵相乘,计算BTP、BTPB、BTPL
inverse(); // 计算BTPBN
jiefafangcheng(); // 解法方程
cal_gaochengpingchazhi(); // 计算高程平差值
guancezhigaizhengshu(); // 计算观测值改正数
cal_guancezhipingchazhi(); // 计算观测值平差值
cal_gczxieyinshu(); // 计算观测值协因数
jingdupingding(); // 精度评定
shujushuchu(); // 数据输出
}
图片说明
这是水准网平差原始数据.txt文件,老是无法读取文件,无法输出正确的处理后的数值。每次执行只显示“press any key to continue”

  • 写回答

2条回答 默认 最新

  • threenewbee 2017-05-16 16:08
    关注

    目测文档中的都好是全角的

    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?