您的位置:首页 > 其它

土木狗自己写的土石方计算程序,控制台程序,只因太菜。。。

2015-08-21 18:02 363 查看
本人土木狗,一直对编程神往,终于在毕业后,读研之前有幸学了学,试着写了个平时用的着的小程序,这是第二个,第一个是计算柱子受压配筋的小程序,太烂就不算数了。So 这个就算是第一份作业吧~
写完之后运行N次,终于能够正确计算出结果,不过,后来看了看,发现这些完全就是C的风格嘛~没用到一丢丢的面向对象的特性。。。惭愧,只有等下一个作业了,相信会越来越多。还有这个程序中的一些变量的权限感觉也有点问题。。。有一些不需要成为全局变量的都给弄成全局变量了。。。
算了,不说了,说多了都是泪,继续努力~

********************************************************以下是代码主体部分**************************************************************

//那个Data.h根本就不需要好嘛>.<~

#include "Data.h"
#include <iostream>
using namespace std;

int main()
{
int n;
system("mode con cols=110 lines=30");
system("color 70");
cout<<"*************************************************************************************************************"<<endl
<<"*     本程序采用三棱柱法计算方格网土方量,可以计算规则矩形场地的土方量                                      *"<<endl
<<"*   高程数据文件为以逗号分隔的数据文件(*.csv)可以用Microsoft Office中的Excel进行编辑                      *"<<endl
<<"*   高程数据文件(包含原始高程及直接输入的设计高程)按行按列依次记录节点高程                                *"<<endl
<<"*   数据文件中不应包含其他字符例如一个3X3的方格网的数据文件应包含4X4个高程数据,格式如下:                  *"<<endl
<<"*   155.123,155.321,155.456,155.654                                                                         *"<<endl
<<"*   155.123,155.321,155.456,155.654                                                                         *"<<endl
<<"*   155.123,155.321,155.456,155.654                                                                         *"<<endl
<<"*   155.123,155.321,155.456,155.654                                                                         *"<<endl
<<"*   本程序计算高程中的自动计算采用的是最小二乘法,使得挖方量与填方量平衡                                    *"<<endl
<<"*************************************************************************************************************"<<endl<<endl<<endl;
cout<<"请输入结果数据文件保存路径:(*.csv)"<<endl;
cin>>path_out;
cout<<"请输入原始高程数据文件路径:(*.csv)"<<endl;
cin>>path_ori;
cout<<"请输入方格网节点行数:"<<endl;
cin>>row;
cout<<"请输入方格网节点列数:"<<endl;
cin>>col;
cout<<"请输入方格网边长:(m)"<<endl;
cin>>d;
data_ori=get_data(row,col,path_ori);

cout<<"请选择设计高程的输入方式:1:选择设计高程数据文件;2:计算设计高程。"<<endl;
cin>>dat.n_mthd;
if(dat.n_mthd==1)
{
cout<<"请输入设计高程数据文件路径:(*.csv)"<<endl;
cin>>path_dsg;
dat.data_dsg=get_data(row,col,path_dsg);

}else if(dat.n_mthd==2){

cout<<"请输入计算方式:"<<endl
<<"1:自动计算"<<endl
<<"2:以某一边为最低边计算"<<endl
<<"3:以某一点为最低点计算"<<endl;
cin>>dat.n_type;
if(dat.n_type==1)
{

cout<<"自动计算中……"<<endl;
dat.data_dsg=cacl_data_auto(row,col,d,data_ori);

}else if(dat.n_type==2){

cout<<"请选择最低边:1:上;2:下;3:左;4:右"<<endl;
cin>>dat.n_bian;
cout<<"请输入最低边高程:"<<endl;
cin>>dat.h_min;
cout<<"请输入坡度:"<<endl;
cin>>dat.i;
dat.data_dsg=cacl_data_bian(row,col,d,dat);

}else if(dat.n_type==3){

cout<<"请选择最低点:1:左上;2:右上;3:左下;4:右下"<<endl;
cin>>dat.n_dian;
cout<<"请输入最低点高程:"<<endl;
cin>>dat.h_min;
cout<<"请输入横向坡度:"<<endl;
cin>>dat.ix;
cout<<"请输入纵向坡度:"<<endl;
cin>>dat.iy;
dat.data_dsg=cacl_data_dian(row,col,d,dat);

}

}

data_wrk=minus_data(data_ori,dat.data_dsg);
re=result(data_wrk);

for(i=0;i<row-1;i++)
{
for(j=0;j<col-1;j++)
{
re[i][j].Vol1=Vol(d,re[i][j].h2,re[i][j].h3,re[i][j].h1);
re[i][j].Vol2=Vol(d,re[i][j].h2,re[i][j].h3,re[i][j].h4);
}
}

n=Out(data_ori,re,dat,path_out);

/*for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
cout<<data_wrk[i][j]<<"  ";
}
cout<<endl;
}*/
cmd="start  "+path_out;
if(n==1)
{
cout<<"按任意键打开结果数据文件!"<<endl;
system("pause");
system(cmd.c_str());
}else if(n==0){

cout<<"生成数据文件出错!"<<endl;
cout<<"按任意键退出!"<<endl;
system("pause");
}
system("cls");

return main();

};

/*************************************************/

double **get_data(int row,int col,string path)
{
fstream infile;
char temp;
infile.open(path);
double **k;
k=new double*[row];
for(i=0;i<row;i++)
k[i]=new double[col];
if(!infile.is_open())
{
cout<<"打开文件失败,请重新选择数据文件!"<<endl;
main();
}
for(i=0;i<row;i++)
{
for(j=0;j<col-1;j++)
{
infile>>k[i][j];
infile>>temp;
if(temp!=',')
{
cout<<"数据文件格式出错,请重新选择数据文件!"<<endl;
main();
}

}
infile>>k[i][col-1];

}
infile.close();
return k;

};

double **minus_data(double **data_ori,double **data_dsg)
{
double **k;
k=new double*[row];
for(i=0;i<row;i++)
k[i]=new double[col];
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
k[i][j]=data_dsg[i][j]-data_ori[i][j];
}

}
return k;
};

Gc **result(double **data_wrk)
{
Gc **k;
k=new Gc*[row-1];
for(i=0;i<row-1;i++)
k[i]=new Gc[col-1];
for(i=0;i<row-1;i++)
{
for(j=0;j<col-1;j++)
{
k[i][j].h1=data_wrk[i][j];
k[i][j].h2=data_wrk[i][j+1];
k[i][j].h3=data_wrk[i+1][j];
k[i][j].h4=data_wrk[i+1][j+1];

}

}

return k;
};

double Vol(int d,double h1,double h2,double h3)
{
double k,k1,k2;
double h_min,temp1,temp2,temp3;

h_min=min(min(h1,h2),h3);

temp1=h1-h_min;
temp2=h2-h_min;
temp3=h3-h_min;

k1=0.5*d*d*h_min; //计算三棱柱体积;

if(h_min==h1)  //计算四棱锥体积;
{
k2=((temp2+temp3)*d*d)/6;

}else if(h_min==h2){

k2=((temp1+temp3)*d*d)/6;

}else if(h_min==h3){

k2=((temp1+temp2)*d*d)/6;

}

k=k1+k2;

return k;
};

int Out(double **data_ori,Gc **result,dsg dat,string path_out)
{
int k;
fstream out;
out.open(path_out,ios::out);
out<<"结果数据文件保存路径为:,,,"<<path_out<<endl;
out<<"方格网行节点数为:,,"<<row<<",方格网列节点数为:,,"<<col<<",方格网边长为,,"<<d<<",米"<<endl;

out<<endl<<endl<<"************************************************************************************原始高程数据************************************************************************************"<<endl;
//cout<<endl<<endl<<"************************************************************************************原始高程数据************************************************************************************"<<endl<<endl;
out<<"单位:,米"<<endl<<endl;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{

out<<data_ori[i][j]<<",";
//cout<<data_ori[i][j]<<",";

}
out<<endl;
//cout<<endl;

}
out<<endl<<endl<<"************************************************************************************设计高程数据************************************************************************************"<<endl;
//cout<<endl<<endl<<"************************************************************************************设计高程数据************************************************************************************"<<endl<<endl;

if(dat.n_type==1)
{

out<<"横向斜率为:,,"<<dat.ix<<",纵向斜率为:,,"<<dat.iy<<",方格网左上角设计高程为:,,,"<<dat.h_min<<endl;

}else if(dat.n_type==2){

out<<"斜率为:,,"<<dat.i<<",方格网最低边设计高程为:,,,"<<dat.h_min<<endl;

}else if(dat.n_type==2){

out<<"横向斜率为:,,"<<dat.ix<<",纵向斜率为:,,"<<dat.iy<<",方格网最低点设计高程为:,,,"<<dat.h_min<<endl;

}
out<<"单位:,米"<<endl<<endl;

for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{

out<<dat.data_dsg[i][j]<<",";
//cout<<data_dsg[i][j]<<",";

}
out<<endl;
//cout<<endl;

}

out<<endl<<endl<<"************************************************************************************施工高程数据************************************************************************************"<<endl;
//cout<<endl<<endl<<"************************************************************************************设计高程数据************************************************************************************"<<endl<<endl;
out<<"施工高程为:,,设计高程-原始高程"<<endl
<<"单位:,米"<<endl<<endl;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{

out<<data_wrk[i][j]<<",";
//cout<<data_wrk[i][j]<<",";

}
out<<endl;
//cout<<endl;

}

out<<endl<<endl<<"************************************************************************************最终结果数据************************************************************************************"<<endl;
//cout<<endl<<endl<<"************************************************************************************最终结果数据************************************************************************************"<<endl<<endl;
out<<"结果数据中:"<<endl
<<"V1为方格网中左上角三角形内的土方量,V2为方格网中右下角三角形内的土方量(单位:立方米)"<<endl
<<"h1为左上角角点施工高程,h2为右上角角点施工高程,h3为左下角角点施工高程,h4为右下角角点施工高程(单位:米)"<<endl<<endl;

out<<" ,";
//cout<<" ,";

for(i=0;i<col-1;i++)
{
out<<", ,"<<"第"<<i+1<<"列"<<", , ,";
//cout<<"第"<<i+1<<"列"<<", , , ,";

}
out<<endl;
//cout<<endl;

for(i=0;i<row-1;i++)
{
out<<"第"<<i+1<<"行:,";
//cout<<"第"<<i+1<<"行:,";

for(j=0;j<col-1;j++)
{
out<<"h1=,"<<re[i][j].h1<<",h2=,"<<re[i][j].h2<<", ,";
//cout<<"h1=,"<<re[i][j].h1<<",h2=,"<<re[i][j].h2<<",";

}
out<<endl<<" ,";
//cout<<endl;

for(j=0;j<col-1;j++)
{
out<<"V1=,"<<re[i][j].Vol1<<",V2=,"<<re[i][j].Vol2<<", ,";
//cout<<"V1=,"<<re[i][j].Vol1<<",V2=,"<<re[i][j].Vol2<<",";

}
out<<endl<<" ,";
//cout<<endl;

for(j=0;j<col-1;j++)
{
out<<"h3=,"<<re[i][j].h3<<",h4=,"<<re[i][j].h4<<", ,";
//cout<<"h3=,"<<re[i][j].h3<<",h4=,"<<re[i][j].h4<<",";

}
out<<endl<<endl;
//cout<<endl;

}
out<<endl<<endl<<"************************************************************************************统计结果数据************************************************************************************"<<endl<<endl;
//cout<<endl<<endl<<"************************************************************************************统计结果数据************************************************************************************"<<endl<<endl;

for(i=0;i<row-1;i++)
{
for(j=0;j<col-1;j++)
{
if(re[i][j].Vol1>=0)
{
vw=vw+re[i][j].Vol1;
}else if(re[i][j].Vol1<0){

vt=vt+re[i][j].Vol1;
}
if(re[i][j].Vol2>=0)
{
vw=vw+re[i][j].Vol2;
}else if(re[i][j].Vol2<0){

vt=vt+re[i][j].Vol2;
}

}

}
out<<"全场地共需挖方,,"<<vw<<",立方米,"<<endl;
out<<"全场地共需填方,,"<<-vt<<",立方米,"<<endl;
//cout<<"全场地共需挖方,"<<vw<<",立方米,"<<endl;
//cout<<"全场地共需填方,"<<vt<<",立方米,"<<endl;
if(vw+vt>0)
{
out<<"全场地需运出,,"<<vw+vt<<",立方米,"<<endl;
//cout<<"全场地需运出,"<<vw+vt<<",立方米,"<<endl;

}else if(vw+vt==0){

out<<"全场地挖土方与填土方平衡!"<<endl;
//cout<<"全场地挖土方与填土方平衡!"<<endl;

}else if(vw+vt<0){

out<<"全场地需填入,,"<<-(vw+vt)<<",立方米,"<<endl;
//cout<<"全场地需填入,"<<-(vw+vt)<<",立方米,"<<endl;

}
if(!out.is_open())
{
k=0;
}else{

k=1;
}
out.close();
return k;

};

double **cacl_data_auto(int row,int col,int d,double **data_ori)
{
double **k;
double **p;
long *x,*y;
double p_,px,py,pz,pxx,pxy,pyy,pyz,pxz;
k=new double*[row];
p=new double*[row];
x=new long[col];
y=new long[row];

for(i=0;i<row;i++)
{
k[i]=new double[col];
p[i]=new double[col];
}

for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
p[i][j]=4;
x[j]=d*j;
y[i]=d*i;
}
}
for(i=1;i<row-1;i++)
{
p[i][0]=2;
p[i][col-1]=2;
}
for(j=1;j<col-1;j++)
{
p[0][j]=2;
p[row-1][j]=2;
}
p[0][0]=1;
p[0][col-1]=1;
p[row-1][0]=1;
p[row-1][col-1]=1;
p_=px=py=pz=pxx=pxy=pyy=pyz=pxz=0;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
p_=p_+p[i][j];
px=px+p[i][j]*x[j];
py=py+p[i][j]*y[i];
pz=pz+p[i][j]*data_ori[i][j];
pxx=pxx+p[i][j]*x[j]*x[j];
pxy=pxy+p[i][j]*x[j]*y[i];
pyy=pyy+p[i][j]*y[i]*y[i];
pyz=pyz+p[i][j]*y[i]*data_ori[i][j];
pxz=pxz+p[i][j]*x[j]*data_ori[i][j];
}
}
dat.ix=((pz*py-p_*pyz)*(py*px-p_*pxy)-(pz*px-pxz*p_)*(py*py-p_*pyy))/(pow((px*py-p_*pxy),2.0)-(px*px-p_*pxx)*(py*py-p_*pyy));
dat.iy=((px*py-p_*pxy)*(pz*px-pxz*p_)-(px*px-p_*pxx)*(pz*py-p_*pyz))/(pow((px*py-p_*pxy),2.0)-(px*px-p_*pxx)*(py*py-p_*pyy));
dat.h_min=(pz-px*dat.ix-py*dat.iy)/p_;

for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
k[i][j]=dat.h_min+dat.ix*x[j]+dat.iy*y[i];
}
}

cout<<"横向斜率为:"<<dat.ix<<"  纵向斜率为:"<<dat.iy<<"  左上角点设计高程:"<<dat.h_min<<endl;

return k;
};

double **cacl_data_bian(int row,int col,int d,dsg input)
{
double **k;
long *x,*y;

k=new double*[row];
x=new long[col];
y=new long[row];

for(i=0;i<row;i++)
k[i]=new double[col];

for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
x[j]=d*j;
y[i]=d*i;
}
}
if(input.n_bian==1)
{
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
k[i][j]=input.h_min+input.i*y[i];
}
}

}else if(input.n_bian==2){

for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
k[i][j]=input.h_min+input.i*y[row-1-i];
}
}

}else if(input.n_bian==3){

for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
k[i][j]=input.h_min+input.i*x[j];
}
}

}else if(input.n_bian==4){

for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
k[i][j]=input.h_min+input.i*x[col-1-j];
}
}
}

return k;
};

double **cacl_data_dian(int row,int col,int d,dsg input)
{
double **k;
long *x,*y;

k=new double*[row];
x=new long[col];
y=new long[row];

for(i=0;i<row;i++)
k[i]=new double[col];

for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
x[j]=d*j;
y[i]=d*i;
}
}
if(input.n_dian==1)
{
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
k[i][j]=input.h_min+input.ix*x[j]+input.iy*y[i];
}
}

}else if(input.n_dian==2){

for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
k[i][j]=input.h_min+input.ix*x[col-1-j]+input.iy*y[i];
}
}

}else if(input.n_dian==3){

for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
k[i][j]=input.h_min+input.ix*x[j]+input.iy*y[row-1-i];
}
}

}else if(input.n_dian==4){

for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
k[i][j]=input.h_min+input.ix*x[col-1-j]+input.iy*y[row-1-i];
}
}
}

return k;
};


********************************************************************我是分割线*********************************************************************
********************************************************************以下是Data.h部分*************************************************************

#ifndef DATA_H_
#define DATA_H_
#include <iostream>
#include <cmath>
#include <string>
#include <iomanip>
#include <fstream>

using namespace std;

struct Gc
{
double h1;
double h2;
double h3;
double h4;
double Vol1;
double Vol2;
};
struct dsg
{
int n_mthd;
int n_type;
int n_bian,n_dian;
double h_min;
double i;
double ix,iy;
double **data_dsg;
};

string path;
string temp;
string path_ori;
string path_dsg;
string path_out;
string cmd;

Gc **re;
dsg dat;
double **data_ori;

double **data_wrk;
double vw=0,vt=0;

int i,j; //循环体变量;
int row,col,d; //方格网行数,列数及方格网边长;

double **get_data(int row,int col,string path); //获取高程数据;

double **cacl_data_auto(int row,int col,int d,double **data_ori); //采用最优土方量计算设计高程;
double **cacl_data_bian(int row,int col,int d,dsg input); //以某边为最低,计算设计高程;
double **cacl_data_dian(int row,int col,int d,dsg input); //以某点为最低,计算设计高程;

double **minus_data(double **data_ori,double **data_dsg); //高程数据差,即计算施工高程;

double Vol(int d,double h1,double h2,double h3); //计算体积;
Gc **result(double **data_wrk); //将数组中的数据传递到二位结构数组中,并计算体积;

int Out(double **data_ori,Gc **result,dsg dat,string path_out); //输出结果;
int main();

#endif


*******************************************************>.<完了**************************************************
就是酱紫了,边学边做吧~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: