求助!急!谁能把这个C++的程序改写成VB.NET的啊?
#include "stdio.h"#include "math.h"
//申明全局变量
float q,i,n,m,b,a,r,v2,ja,jb,es1,es2;
double csn,srm,alfa;
int ds,ns,dr=0;
//主要函数
int main(){
//申明变量
double h[201],v[201],s[201];
double hk,h0,hb;
float downx,upx;
float wucha;
float hd;
int l;
//申明后来要用到的函数
double erfenfa(int f,float x1,float x2,float eps);
double fe(float h);
double fhk(float h);
double fh0(float h);
//用到的文件
FILE *fbl;
//定义某些变量的初始值
alfa=1.05;
downx=0.0;
upx=40.0;
wucha=0.0005f;
//输入输出
fbl=fopen("Results.dat", "w");/* Results.dat 为输出计算结果的数据文件 */
printf("请输入流量Q:");
scanf("%f'\t'", &q);
// */坡度i,糙率n,边坡m,底宽b\n";
printf("请输入坡度i:");
scanf("%f'\t'", &i);
printf("请输入糙率n:");
scanf("%f'\t'", &n);
printf("请输入边坡m:");
scanf("%f'\t'", &m);
printf("请输入底宽b:");
scanf("%f'\t'", &b);
//(" %f %f %f %f",, &i, &n, &m, &b);
fprintf(fbl,"流量:%6.2f (m**3/s)坡度:%8.5f 糙率: %6.4f 边坡:%4.2f 底宽:%7.2f",q, i, n, m, b);
fprintf(fbl,"流量:%6.2f,(m**3/s),坡度:,%8.5f,糙率:,%6.4f,边坡:%4.2f,底宽:,%7.2f", q, i, n, m, b);
csn=pow((1-i*i),0.5);
srm=pow((1+m*m),0.5);
/* 计算临界水深HK */
hk=erfenfa (1, downx , upx , wucha);//二分法求临界水深,函数子程序fhk附在主程序之后
printf("\n临界水深hk=%9.6f \t", hk,"(m)\n\t");
fprintf(fbl, "\n临界水深hk=%9.6f \t", hk, "(m)\n\t");
/* 计算正常水深h0 */
if ( i <=0.0 ){
h0=100;
printf("\n坡度小于或等于0.0,没有正常水深.\t");
fprintf(fbl,"\n坡度小于或等于0.0,没有正常水深.\t");
}else{
h0=erfenfa(2, downx, upx, wucha); //二分法求正常水深,函数子程序fhk附在主程序之后
printf("\n正常水深=%f", h0);
fprintf(fbl,"正常水深=%f",h0);
}
printf("\n请输入控制水深,步长和计算步数\n");
scanf("%f %d %d", &hd,&ds,&ns);
h[0]=hd;
a=float((b+m*h[0])*h[0]);
r=a/(b+float(2*h[0]*srm));
v[0]=q / a; //计算起始断面参数
ja=float(pow(pow(v[0], 2/r), 4.0/3));
es1=float(csn*h[0]+alfa*pow(v[0], (2/19.6)));
//判断水面线计算方向:dr=1,控制断面在上游;dr=-1,控制断面在下游
if ((hd>hk)||((hd==hk) && (hd <h0))){
dr=-1;
}else{
dr=1;
}
// 二分法区间端点hb取值
if (((hk>h0)&&(hd>hk))||((h0>hk)&&(hd <hk))){
hb=hk;
}else{
hb=h0;
}
s[0]=0.0;
for (l=1;l <ns+1;l++){
if (fabs(h[l-1]-h0) <0.005){
h[1]=h0;
v[l]=v[l-1];
}else{
h[l]=erfenfa(3,float(h[l-1]),float(hb),0.001f);
a=float((b+m*h[l])*h[l]);
v[l]=q/a;
ja=float(pow(n*v[l],2)/pow((a/(b+2*h[l]*srm)),(4.0/3)));
es1=float(csn*h[l]+alfa*v[l]*v[1]/19.6);
}
s[l]=l*ds;
}
//输出计算结果
printf("\n hd=%6.3f (m) ds=%7.2d (m) ns=%d r=%d\n", hd, ds, ns,dr);
fprintf(fbl,"\n hd=%6.3f (m) ds=%7.2f (m) ns=%d r=,%d\n", hd, ds, ns,dr);
printf("l h[1] v[l] s[l] (m) (m/s) (m)");
fprintf(fbl,"l h[l] v[l] s[l] (m) (m/s) (m)");
for (l=0;l <ns+l;l++){
printf("\n %3d %7.3f %7.3f %10.2f", l, h[l] ,v[l],s[l]);
fprintf(fbl,"\n %3d %7.3f %7.3f %10.2f", l, h[l],v[l],s[l]);
}
return(0);
}
//子函数
//计算fhk
double fhk(float h0){
double w;
double pw;
pw=pow((b+m*h0),3.0);
w=9.8*csn*pw-alfa*q*q*(b+2*m*h0);
return(w);
}
//计算fh0
double fh0(float h){
double t;
t=q*n/(pow(i,0.5))*pow((b+2*srm*h),(2.0/3))-pow(((b+m*h)*h),(5.0/3));
return(t);
}
//计算fe
double fe(float h){
double g;
a=(b+m*h)*h;
v2=q/a;
jb=float(pow((n*v2),2)/pow((a/b*(2*h*srm)),(4.0/3)));
es2=float(csn*h+alfa*v2*v2/19.6);
g=es1-es2+dr*(i-(ja+jb)/2)*ds;
return(g);
}
//计算二分差
double erfenfa(int f, float x1,float x2, float eps){
double Er, fm;
float a1, a2, fa, fb;
int k;
a1=x1;
a2=x2;
do{
switch (f){
case 1:fa=float(fhk(a1)),fb=float(fhk(a2));break;
case 2:fa=float(fh0(a1)),fb=float(fh0(a2));break;
case 3:fa=float(fe(a1)),fb=float(fe(a2));break;
default:printf("error\n");
}
if(fa*fb>0.0){
printf("无解,请输入上下边界");
scanf("%f,%f",&a1,&a2);
}
}while(fa*fb>0.0);
k=1;
while(fabs(a2-a1)>eps){
Er=(a1+a2)*0.5;
if(fabs(a2-a1) <eps)
return(Er);
switch (f){
case 1:fm=fhk(float(Er));break;
case 2:fm=fh0(float(Er));break;
case 3:fm=fe(float(Er));break;
default:printf("error\n");
}
if ((fm*fa) <0.0)
a2=float(Er);
else
a1=float(Er);
k=k+1;
}
return(Er);
}
计算步骤:
2.1 对于微分方程 ,采用二分法,计算积分
2.2计算过程,包括两个主要步骤:
(a)输入参数Q,I,n,m,b,求临界水深hk和正常水深h0。
临界水深hK满足方程 f1(hK)=A3cosθ-BαQ2/g=0
考虑了较大底坡的影响,且程序中取α=1.05。当底坡i>0时求解正常水深,h0满足方程
=0
i≤0时,可取h0为一大值(程序中取为100m)。
在程序中调用二分法函数子程序ERFENFA求解以上两个代数方程,初始区间取为[0,40](m),误差限取0.0005m。
(b)输入控制水深hD、步长Δs和计算步数N,计算各断面的水深计算渠段的总长为Δs×N,共N+1个断面。h1=hD,计算从控制断面开始,共计算N步。
每一步中,hL-1为已知的前一断面水深;hL为待求的下一断面水深,满足方程
(7-6-8)
L=2,…,N+1
其中断面比能ES=hcosθ+αv2/2g。求解出hL,便一步步地计算出N个断面上的水深。
方程(7-6-8)可能有两个解,因为在同一断面上对应于同一个ES值可有两个水深。为避免得到错误的结果,在迭代计算过程中应对hL的取值范围加以限制。我们知道,水面曲线在三个区域内是各自单调升、降的,令hB为水面曲线从hD出发所趋向的该区域水深界限,hL的取值只能在区间[hB,hL-1]或[hL-1,hB]上,程序中以此为初始区间,用二分法求解hL。
本程序根据渠道底坡性质和控制水深自动对hB和方向参数r取值(读者不难根据需要将其改为人工输入参数)。方向参数r的取值根据控制断面的流态来决定:急流时(hD<hK)控制断面在上游,r=1;缓流时(hD>hK)控制断面在下游,r=-1。hD=hK时,若hK>hD(陡坡),应该是S2型曲线,控制断面在上游,r=1;若hD>hK(缓坡),应该是M2型曲线,r=-1;hD=hK=h0时为临界坡渠道上的均匀流,不必计算水面曲线。
已知控制水深和水面线计算方向,hB在水面线变化范围的另一端,根据情况可能是hK或h0(i≤0时h0取值为100m)。程序中根据hD、hK和h0的值确定hB;当hD>hK>h0(S1型曲线),或hD<hK<h0(M3、H3和A3型曲线)时,hB=hK;当hD<h0<hK(S3型曲线),hD>h0>hK(M1型曲线),h0≤hD≤hK(S2型曲线),或hK≤hD≤h0(M2、H2、A2型曲线)时,hB=h0;临界坡渠道,hB=h0=hK。
--------------------编程问答-------------------- http://www.developerfusion.com/tools/convert/csharp-to-vb/ --------------------编程问答-------------------- 谢谢拉 --------------------编程问答-------------------- 那个是C井的 --------------------编程问答-------------------- 看看 --------------------编程问答-------------------- http://code2code.net/ --------------------编程问答-------------------- http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=2575&lngWId=10
补充:.NET技术 , VB.NET