土木狗自己写的土石方计算程序,控制台程序,只因太菜。。。
2015-08-21 18:02
363 查看
本人土木狗,一直对编程神往,终于在毕业后,读研之前有幸学了学,试着写了个平时用的着的小程序,这是第二个,第一个是计算柱子受压配筋的小程序,太烂就不算数了。So 这个就算是第一份作业吧~
写完之后运行N次,终于能够正确计算出结果,不过,后来看了看,发现这些完全就是C的风格嘛~没用到一丢丢的面向对象的特性。。。惭愧,只有等下一个作业了,相信会越来越多。还有这个程序中的一些变量的权限感觉也有点问题。。。有一些不需要成为全局变量的都给弄成全局变量了。。。
算了,不说了,说多了都是泪,继续努力~
********************************************************以下是代码主体部分**************************************************************
********************************************************************我是分割线*********************************************************************
********************************************************************以下是Data.h部分*************************************************************
*******************************************************>.<完了**************************************************
就是酱紫了,边学边做吧~
写完之后运行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
*******************************************************>.<完了**************************************************
就是酱紫了,边学边做吧~
相关文章推荐
- 具有 Button 风格的 Panel(覆盖TCustomPanel的Paint函数,用到了ThemeServices)
- Unity3d之协程自实现测试
- mysql查询各种类型的前N条记录
- GIT的标准文档 使用和服务介绍
- nginx的web连接出现过多的TIME_WAIT
- Longest Common Prefix
- Posix信号灯
- [经典算法] 字符串相似度-编辑距离
- WINDOWS和Linux上安装php7 alpha 并安装 yaf
- linux权限管理
- 谈谈Android App运行时文件系统路径问题
- leetcode 149: Max Points on a Line
- unity3d中,脚本的相互调用。
- 一首诗的代码
- 一首诗的代码
- 数据库 - 备份与恢复
- 动画-七夕言情
- 2015 Multi-University Training Contest 10 hdu 5412 CRB and Queries
- AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】
- 大论文实验参考资料笔记