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