编程高手进来帮我找下这程序问题出在哪……
阿童木升级版2009/07/03软件综合 IP:重庆
很久很久以前,我发表了一篇文章《浅析模型火箭轨道》提出利用计算机解决“一个受与其速度成一非2k/π的角度的加速度的物体的运动分析”(XXXXXXXXXXXXXXXXXXXXXXXX/t/16723

由于本人编程能力基本没有(顶多看得懂程序)故请朋友帮忙,现在大概是写出来了,但是有严重BUG,根本无法正常计算。希望各位大虾帮忙……谢谢了

BUG主要见下图:
BUG.jpg

源码如下:
#include<iostream>
#include<math.h>
#include<iomanip>
using namespace std;
double Ft,M0,Mt,aj,a,g,p,A,D,t,Tz,i,Fj;
double Tj,x,y,v0x,v0y,M,fjf,ax,ay,vmx,vmy,xz,yz,fx,fy;
double sin(double shuju);
double cos(double shuju);
double atan(double shuju);

void init()
{
     cout<<"输入火箭推力Ft,单位牛顿(N)"<<endl;
     cin>>Ft;
     if(Ft<=0){cout<<"输入数据为非正常数据,请重新输入各个已知量。";return init();}
     cout<<"输入火箭初始质量M0,单位千克(KG)"<<endl;
     cin>>M0;
     if(M0<=0){cout<<"输入数据为非正常数据,请重新输入各个已知量。";return init();}
     cout<<"输入火箭终了质量Mt,单位千克(KG)"<<endl;
     cin>>Mt;
     if(Mt<=0||Mt>=M0) {cout<<"输入数据为非正常数据,请重新输入各个已知量。";return init();}
     cout<<"输入火箭发射倾角a,单位度(°)"<<endl;
     cin>>aj;
     if(aj<=0||aj>=180){cout<<"输入数据为非正常数据,请重新输入各个已知量。";return init();}
     a=(aj*3.1415926535897932384626)/180;
     g=9.8056;
     p=1.29;
     cout<<"输入气阻有效面积A,单位平方米(m2)"<<endl;
     cin>>A;
     if(A<=0) {cout<<"输入数据为非正常数据,请重新输入各个已知量。";return init();}
     cout<<"输入气阻常数D"<<endl;
     cin>>D;
     if(D<=0){cout<<"输入数据为非正常数据,请重新输入各个已知量。";return init();}
     cout<<"输入火箭推力有效时间t,单位秒(S)"<<endl;
     cin>>t;
     if(t<=0){cout<<"输入数据为非正常数据,请重新输入各个已知量。";return init();}
     cout<<"输入时间间隔Tz,必须小于火箭推力有效时间,单位秒(s)"<<endl;
     cin>>Tz;
     if(Tz<=0||Tz>t){cout<<"输入数据为非正常数据,请重新输入各个已知量。";return init();}
     x=0;
     y=0;
     Tj=0;
     v0x=0;
     v0y=0;
}

void jisuan1()
{
     M=((Mt-M0)/t)*Tj+M0;
     Fj=(-(M*M*M*M)+sqrt((M*M*M*M)+2*p*A*D*t*t*Ft*M*M))/p*A*D*Tj*Tj;
     ax=(fjf*cos(a))/M;
     ay=(fjf*sin(a)-M*g)/M;
     vmx=ax*Tz;
     vmy=ay*Tz;
     xz=v0x*t+((1/2)*ax*t*t);
     yz=v0y*t+((1/2)*ay*t*t);
     x=x+xz;
     y=y+yz;
     if(y<0){cout<<"Y坐标小于0,计算结束。"<<endl;return;}
     Tj=Tj+Tz;
     cout<<"输出时刻:"<<setprecision(10)<<Tj<<endl;
     cout<<"输出横坐标:"<<setprecision(10)<<x<<endl;
     cout<<"输出纵坐标:"<<setprecision(10)<<y<<endl;
     v0x=vmx;
     v0y=vmy;
     a=atan(v0y/v0x);
     fx=(1/2)*p*A*D*v0x*v0x*cos(a);
     fy=(1/2)*p*A*D*v0y*v0y*cos(a);
     ax=fx/Mt;
     ay=(fy+M*g)/Mt;
     xz=v0x*(Tz-t)+(1/2)*ax*(Tz-t)*(Tz-t);
     yz=v0y*(Tz-t)+(1/2)*ay*(Tz-t)*(Tz-t);
     x=x+xz;
     y=y+yz;
     Tj=Tj+Tz;
     if(y<0){cout<<"Y坐标小于0,计算结束。"<<endl;return;}
     cout<<"输出时刻:"<<setprecision(10)<<Tj<<endl;
     cout<<"输出横坐标:"<<setprecision(10)<<x<<endl;
     cout<<"输出纵坐标:"<<setprecision(10)<<y<<endl;
    
    
}

int main()
{
    init();
    for(i=0;i<=t;i+=Tz)
    {
       jisuan1();
    }
    system("pause");
    return 0;
}
另附全部组件(程序,代码,论文)

鄙人QQ:563184214
邮箱:BeyoundATOM@XXXXXXXXX
attachment icon 浅析模型火箭轨道.rar 384.21KB RAR 23次下载
来自:计算机科学 / 软件综合
16
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
acmilan
15年8个月前 IP:未同步
118313
错误很明显。。。汗。。。VC++6
--------------------Configuration: adasdf - Win32 Debug--------------------
Compiling...
afasdf.cpp
c:\\program files\\microsoft visual studio\\myprojects\\adasdf\\afasdf.cpp(15) : error C2562: 'init' : 'void' function returning a value
        c:\\program files\\microsoft visual studio\\myprojects\\adasdf\\afasdf.cpp(11) : see declaration of 'init'
c:\\program files\\microsoft visual studio\\myprojects\\adasdf\\afasdf.cpp(18) : error C2562: 'init' : 'void' function returning a value
        c:\\program files\\microsoft visual studio\\myprojects\\adasdf\\afasdf.cpp(11) : see declaration of 'init'
c:\\program files\\microsoft visual studio\\myprojects\\adasdf\\afasdf.cpp(21) : error C2562: 'init' : 'void' function returning a value
        c:\\program files\\microsoft visual studio\\myprojects\\adasdf\\afasdf.cpp(11) : see declaration of 'init'
c:\\program files\\microsoft visual studio\\myprojects\\adasdf\\afasdf.cpp(24) : error C2562: 'init' : 'void' function returning a value
        c:\\program files\\microsoft visual studio\\myprojects\\adasdf\\afasdf.cpp(11) : see declaration of 'init'
c:\\program files\\microsoft visual studio\\myprojects\\adasdf\\afasdf.cpp(30) : error C2562: 'init' : 'void' function returning a value
        c:\\program files\\microsoft visual studio\\myprojects\\adasdf\\afasdf.cpp(11) : see declaration of 'init'
c:\\program files\\microsoft visual studio\\myprojects\\adasdf\\afasdf.cpp(33) : error C2562: 'init' : 'void' function returning a value
        c:\\program files\\microsoft visual studio\\myprojects\\adasdf\\afasdf.cpp(11) : see declaration of 'init'
c:\\program files\\microsoft visual studio\\myprojects\\adasdf\\afasdf.cpp(36) : error C2562: 'init' : 'void' function returning a value
        c:\\program files\\microsoft visual studio\\myprojects\\adasdf\\afasdf.cpp(11) : see declaration of 'init'
c:\\program files\\microsoft visual studio\\myprojects\\adasdf\\afasdf.cpp(39) : error C2562: 'init' : 'void' function returning a value
        c:\\program files\\microsoft visual studio\\myprojects\\adasdf\\afasdf.cpp(11) : see declaration of 'init'
Error executing cl.exe.

adasdf.exe - 8 error(s), 0 warning(s)
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
acmilan
15年8个月前 IP:未同步
118315
return init();大汗
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
acmilan
15年8个月前 IP:未同步
118333
而且碰巧你的所有return init();都是在if里,要是有一个在if外就stack overflow咯。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
epi.clyce
15年8个月前 IP:未同步
118370
这程序的可读性。。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
yy+sy
15年8个月前 IP:未同步
118406
你要求重新输入你用do{continue;}while false;啊...这用不着递归吧...
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°
15年8个月前 IP:未同步
118409

问题就出在,本人有编程能力,但是程序基本看不懂(特别是我写了什么,看不懂
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
acmilan
15年8个月前 IP:未同步
118412
ls正解...
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
fw。
15年8个月前 IP:未同步
118474
引用第6楼93°于2009-07-03 22:39发表的  :

问题就出在,本人有编程能力,但是程序基本看不懂(特别是我写了什么,看不懂

写点注释, 规范变量名
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
阿童木升级版作者
15年8个月前 IP:未同步
118493
啥意思……
已经把各位的意见给朋友了,等消息中……
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
phpskycn
15年8个月前 IP:未同步
118749
首先,搞不懂你前面double sin()之类的干啥
using namespace std也可以不用
return init();错误,init()函数未定义……改成return 0;
从错误报告上看应该是这个问题,现在没电脑用
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
phpskycn
15年8个月前 IP:未同步
118750
很好奇你是怎么编译成功的
难道…用的是BCB吗?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
阿童木升级版作者
15年8个月前 IP:未同步
118974
……
看各位说的……貌似这个程序很危险一样……看来我电脑RP不错……
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
warmonkey
15年8个月前 IP:未同步
118998
using namespace std.不用的话,cin、cout和system()可能出错

我没时间看你的计算流程了,计算流程错误或者是数学函数发生错误,例如sin(),cos()返回0值,就可能导致x坐标计算出问题。
还有就是如果进行除法计算时,除数/分母为0,也会把计算结果变成0.lz看看是不是这个问题

返回太多的“计算结束”是因为:
if(y<0){cout<<"Y坐标小于0,计算结束。"<<endl;return;}
在jisuan1()中,而这个函数中执行return并不能终止循环。
应该把这行拿到for循环中:
for(i=0;i<=t;i+=Tz)
    {
      jisuan1();
      if(y<0){cout<<"Y坐标小于0,计算结束。"<<endl;break;}
    }

另外lz的计算顺序有点问题
应该是先算质量,然后加速度,输出各项参数,计算速度,计算阻力,计算倾角,计算坐标,最后T=T+Tj;

我自己写了一个轨道计算器,不过要考试了没时间测试,呵呵。

希望lz帮我写个计算空气阻力的函数:
double fa(double velocity)  //需要的参数如气阻常数D,正截面积S,空气密度,气压等参数在全局变量中指定,该函数只有一个参数:速度,返回当前速度下的空气阻力
我就差这一个模块就可以完成了
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
phpskycn
15年8个月前 IP:未同步
119016
LZ没用到std::啊
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
rc5
15年8个月前 IP:未同步
121839
天哪。。。
用的全部是全局变量。。。
还有system("pause"); 是dos下的TC, BC?

lz拿调试器单步跟踪,设断点,纯计算的程序很好调的。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
rc5
15年8个月前 IP:未同步
121841
单纯就文风来讲,对jisuan1()这样大的函数调用,总要有些参数有效性检查之类,可惜lz无论是在jisuan1()里面,还是在调用的地方都没有做这类检查,所以非常可能越界,除0之类。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
阿童木升级版
学者 机友 笔友
文章
46
回复
341
学术分
2
2008/02/05注册,3个月20天前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}