Viết chương trình bình sai gián tiếp lưới mặt bằng bằng ngôn ngữ C - Phần 3

vào lúc 19:50
(Tiếp tục)

V. Chương trình chính

Ø  Chương trình đọc dữ liệu từ file có tên là: “Luoido.txt”. Sau khi xử lý tính toán xong thì xuất dữ liệu ra một file có tên là: “ketqua.txt”.
int choan(int sdmoi)
{
     return 2*sdmoi;
}

void main()
{
     clrscr();
     diem *d;goc *g;canh *c;
     char *ten;
     FILE *fp;
     int sgoc,scanh,spv, sdm, sdg, i, j, ssgoc, *doo, *phut, tanglen=1, kt1=0 ;
     float a,b,*giay,*p,R[100][100],*x,pvv,dcx;
     printf("\nNhap vao do chinh xac can dat duoc:");scanf("%f",dcx);
     //Đọc dữ liệu từ file ‘Luoido.txt’
     fp=fopen("Luoido.txt","rt");
          while(kt1!=1)
          {
              fscanf(fp,"%s",tenluoi1);
              strcat(tenluoi2,tenluoi1);
              strcat(tenluoi2," ");
              if(getc(fp)=='\n')
                   kt1=1;
     }
     fscanf(fp,"%d%d%d%d%d",&sgoc,&scanh,&spv,&sdm,&sdg);
     d=new diem[sdm+sdg];
     g=new goc[sgoc];
     c=new canh[scanh];
     p=new float[sgoc+scanh];
     for(i=1;i<=sgoc+scanh;i++) p[i]=0;
     fscanf(fp,"%d%f%f",&ssgoc,&a,&b);
     for(i=0;i<sdg+sdm;i++)
          fscanf(fp,"%d%f%f",&d[i].loai,&d[i].x,&d[i].y);
     for(i=sdg;i<sdm+sdg;i++)
          fscanf(fp,"%s",&*d[i].ten);
     for(i=0;i<sdg;i++)
          fscanf(fp,"%s",&*d[i].ten);
     doo=new int[sgoc];
     phut=new int[sgoc];
     giay=new float[sgoc];
     for(i=0;i<sgoc;i++)
     {
     fscanf(fp,"%d%d%d%d%d%f",&g[i].trai,&g[i].giua,&g[i].phai,&doo[i],&phut[i],&giay[i]);
          g[i].trido=doidoraradian(doo[i],phut[i],giay[i]);
          g[i].mgoc=float(ssgoc);
          p[tanglen]=(ssgoc*ssgoc)/(g[i].mgoc*g[i].mgoc);
          tanglen+=1;
     }
     for(i=0;i<scanh;i++)
     {
          fscanf(fp,"%d%d%f",&c[i].dau,&c[i].cuoi,&c[i].chieudai);
          c[i].mchieudai=(a+b/1000000*c[i].chieudai/1000)/1000;
          p[tanglen]=(ssgoc*ssgoc)/(c[i].mchieudai*c[i].mchieudai);
          tanglen+=1;
     }
     fclose(fp);
     //Chọn ẩn
     int soan=choan(sdm);
     //Lập hệ phương trình số hiệu chỉnh và lập hệ phương trình chuẩn
     int kt=1;
     do //Thực hiện lặp
     {
          float *day;
          day=new float[soan+1];
          int trai,giua,phai,dau,cuoi;
          for(i=1;i<=soan+1;i++)
              for(j=1;j<=soan+1;j++)
                   R[i][j]=0;
          tanglen=1;
          for(i=0;i<sgoc;i++)
          {
              for(j=0;j<sdm+sdg;j++)
              {
                   if(d[j].loai==g[i].trai) trai=j;
                   if(d[j].loai==g[i].giua) giua=j;
                   if(d[j].loai==g[i].phai) phai=j;
              }
              hieuchinhgoc(trai,giua,phai,sdm,d,day,g[i].trido);
              printf("\n");
              for(int k=1;k<=soan+1;k++)
                   for(j=k;j<=soan+1;j++)
                        R[k][j]=R[k][j]+p[tanglen]*day[k]*day[j];
              tanglen+=1;
          }
          for(i=0;i<scanh;i++)
          {
              for(j=0;j<sdm+sdg;j++)
              {
                   if(d[j].loai==c[i].dau) dau=j;
                   if(d[j].loai==c[i].cuoi) cuoi=j;
              }
              hieuchinhcanh(dau,cuoi,sdm,d,day,c[i].chieudai);
              printf("\n");
              for(int k=1;k<=soan+1;k++)
                   for(j=k;j<=soan+1;j++)
                        R[k][j]=R[k][j]+p[tanglen]*day[k]*day[j];
              tanglen+=1;
          }
          //Giải hệ phương trình chuẩn và tính nghiệm
          x=new float[soan];
          int m;
          float b1;
          for(i=1;i<=soan+1;i++)
          {
              b1=R[i][i];
              for(m=1;m<i;m++)
                   b1=b1-R[m][i]*R[m][i];
              if(b1<0) b1=-b1;
              R[i][i]=sqrt(b1);
              for(j=i+1;j<=soan+1;j++)
              {
                   b1=R[i][j];
                   for(m=1;m<i;m++)
                        b1=b1-R[m][i]*R[m][i];
                   R[i][j]=b1/R[i][i];
              }
          }
          //Tính nghiệm
          for(i=soan;i>=1;i--)
          {
              b1=R[i][soan+1];
              for(m=soan;m>i;m--)
                   b1=b1-R[i][m]*x[m];
              x[i]=b1/R[i][i];
          }
          pvv=R[soan+1][soan+1        
          //Tính lại tọa độ gần đúng
          for(i=1;i<=sdm;i++)
          {
              for(j=0;j<sdm+sdg;j++)
                   if(d[i].loai==i)
                   {
                        d[i].x=d[i].x+x[2*i-1]/1000;
                        d[i].y=d[i].y+x[2*i]/1000;
                   }
          }
          kt=0;
          for(i=1;i<=soan;i++)
              if(x[i]/1000>dcx)
              {
                   kt=1;break;
              }
     }
     while(kt!=0);
     //Đánh giá độ chính xác
     float sstp,*ssvtd;
     ssvtd=new float[sdm];
     sstp=sqrt(pvv/(sgoc+scanh-soan));
     for(i=1;i<=sdm;i++)
     {
          ssvtd[i]=sqrt(sstp*sstp*(R[2*i-1][2*i-1]*R[2*i-1][2*i-1]+R[2*i][2*i]*R[2*i][2*i]));
     }
     //Ghi kết quả sau khi bình sai vào file "ketqua.txt"
     fp=fopen("ketqua.txt","wr");
     fprintf(fp,"         %s\n\n",tenluoi2);
     fprintf(fp,"Toa do cac diem goc trong luoi:\n");
     for(i=sdm+1;i<=sdm+sdg;i++)
          for(j=0;j<sdm+sdg;j++)
          if(d[j].loai==i)
          {
              fprintf(fp,"%s  %5f  %5f\n" ,d[j].ten, d[j].x, d[j].y);
          }
     fprintf(fp,"\nSo hieu chinh toa do X,Y cua cac diem moi la:\n");
     for(i=1;i<=sdm;i++)
          for(j=0;j<sdm+sdg;j++)
              if(d[j].loai==i)
                   fprintf(fp,"%s  %10f  %10f\n", d[j].ten, x[2*i-1],x[2*i]);
     fprintf(fp,"\nToa do cac diem moi trong luoi la:\n");
     for(i=1;i<=sdm;i++)
          for(j=0;j<sdm+sdg;j++)
          if(d[j].loai==i)
          {
              fprintf(fp,"%s  %5f  %5f\n", d[j].ten, d[j].x, d[j].y);
          }
     fprintf(fp,"\nSai so trung phuong trong so don vi la:\n" );
     fprintf(fp,"%6f\n",sstp);
     fprintf(fp,"\nSai so vi tri diem la:\n");
     for(i=1;i<=sdm;i++)
          for(j=0;j<sdm+sdg;j++)
              if(d[j].loai==i)
              {
                   fprintf(fp,"%s  %5f\n",d[j].ten,ssvtd[i]);
              }
     fclose(fp);
     getch();
}
Hãy like nếu bài viết có ích →
Kết bạn với gisgpsrs trên Facebook để nhận bài viết mới nóng hổi