鱼C论坛

 找回密码
 立即注册
查看: 2285|回复: 9

请帮忙改下程序(条件运算,三角函数)

[复制链接]
发表于 2015-6-20 16:55:19 | 显示全部楼层 |阅读模式
88鱼币
这个程序前面输入相同,“R角”处有三种输入,分别为大写字母“C”(意为长度),大写字母“J”(意为角度),双精度浮点数(指针为g)。

在输入大写字母“J”,双精度浮点数时结果正确,但输入大写字母“C”时结果错误,不知道是不是给“s”赋值错误(s是角度度数),
(我这里倒角长度就是三角形一条直角边,另一条直角边用(“大外圆”减去“倒角下方外圆”)结果再除以2)
请帮忙改下使它达到如图所示结果(这个图是输入“J”的,我希望输入“C”运算结果一样)

下面是三组测试数据
64.5        42        62        76.5        60.5        84.5        2
64.5        42        62        76.5        60.5        84.5        J        15        81.8        2.5
64.5        42        62        76.5        60.5        84.5        C        5        81.8        2.5



三种条件.jpg
三种条件.rar (936 Bytes, 下载次数: 9)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-20 16:55:20 | 显示全部楼层
#include<conio.h>
#include<math.h>
#include<stdio.h>
#define PI 3.1416
double a,b,c,d,e,f,g,aa,bb,cc,ccc,dd,ddd,ee,ff,gg,qi,zon,o,w,v,q,qq,
qirx,zonrx,zonrz,xierx,xierz,k,l,m,n,
P,s;
char str[9];
void func1();
void func2();
void func3();

int main()
{
        
        printf("内球面直径:\n");
        scanf("%lf",&a);
        printf("球心距:\n");
        scanf("%lf",&b);
        printf("长度:\n");
        scanf("%lf",&c);
        printf("大内孔:\n");
        scanf("%lf",&d);
        printf("小内孔:\n");
        scanf("%lf",&e);
        printf("大外圆:\n");
        scanf("%lf",&f);
        printf("R角:\n");
        scanf("%s",str);
        
        
        
        
        if ( str[0] == 'J' ) {
                func2();
        }
        
        else if ( str[0] == 'C' ) {
                func3();
        }
        else {
                (sscanf(str,"%lf",&g));
                func1();
        }
        
        getch();
}  

void func1 () 
{
        dd=d+2;
        cc=c+4;
        ccc=c+1.1;
        ee=e+0.35;
        qi=b-38+48.72;
        zon=b-38+20.5;
        ddd=d-3;
        ff=f-(g+1)*2;
        o=g+1; 
        v=tan(PI/3.83);
        w=(dd-ee)/2/v;
        q=ccc-w-qi;
        if(b<=56)qq=58-b;
        if(b>56)qq=78-b;
        
        printf("O6450\n");
        printf("X%.1lf\n",dd);
        printf("Z%.1lf\n",cc);
        printf("Z%.1lf\n",ccc);
        printf("W-%.2lf\n",w);
        printf("Z%.2lf\n",qi);
        printf("Z%.2lf\n",zon);
        printf("Z%.1lf\n",cc);
        printf("X%.1lf\n",ddd);
        printf("Z%.1lf\n",c);
        printf("X%.1lf\n",ff);
        printf("X%.1lf W-%.1lf R%.1lf\n",f,o,o);
        printf("过渡=%.2lf\n",q);
        printf("打表垫片=%.1lf\n",qq);
        
}

void func2 ()
{
        printf("角度:\n");
        scanf("%lf",&n);
        printf("倒角下方外圆:\n");
        scanf("%lf",&k);
        printf("R角:\n");
        scanf("%lf",&l);
        
        dd=d+2;
        cc=c+4;
        ccc=c+1.1;
        ee=e+0.35;
        qi=b-38+48.72;
        zon=b-38+20.5;
        ddd=d-3;
        ff=f-(g+1)*2;
        o=g+1; 
        v=tan(PI/3.83);
        w=(dd-ee)/2/v;
        q=ccc-w-qi;
        if(b<=56)qq=58-b;
        if(b>56)qq=78-b;
        
        m=l+1.2;
        qirx=k-l/tan((n+90)/2*PI/180)*2-2.4; 
        zonrx=k+(sin(n*PI/180))*(l/tan((n+90)/2*PI/180)*2)-(1.2-(cos(n*PI/180)*1.2))*2;
        zonrz=cos(n*PI/180)*l/tan((n+90)/2*PI/180)-sin(n*PI/180)*1.2+1.2;
        xierx=f;
        xierz=c-((f-k)/2/tan(n*PI/180)+1.2);
        
        printf("O6450\n");
        printf("X%.1lf\n",dd);
        printf("Z%.1lf\n",cc);
        printf("Z%.1lf\n",ccc);
        printf("W-%.2lf\n",w);
        printf("Z%.2lf\n",qi);
        printf("Z%.2lf\n",zon);
        printf("Z%.1lf\n",cc);
        printf("X%.1lf\n",ddd);
        printf("Z%.1lf\n",c);
        printf("x%.2lf\n",qirx);
        printf("G3 x%.2lf w-%.2lf R%.2lf\n",zonrx,zonrz,m);
        printf("G1 x%.2lf z%.2lf\n",xierx,xierz);
        printf("过渡=%.2lf\n",q);
        printf("打表垫片=%.1lf\n",qq);
}
void func3 ()
{
        
        
        printf("倒角长度:\n");
        scanf("%lf",&P);
        printf("倒角下方外圆:\n");
        scanf("%lf",&k);
        printf("R角:\n");
        scanf("%lf",&l);
        
        dd=d+2;
        cc=c+4;
        ccc=c+1.1;
        ee=e+0.35;
        qi=b-38+48.72;
        zon=b-38+20.5;
        ddd=d-3;
        ff=f-(g+1)*2;
        o=g+1; 
        v=tan(PI/3.83);
        w=(dd-ee)/2/v;
        q=ccc-w-qi;
        if(b<=56)qq=58-b;
        if(b>56)qq=78-b;
        
        m=l+1.2;

        s=atan(((f-k)/2)/P)/PI*180;//仰望天上的光add

        qirx=k-l/tan((s+90)/2*PI/180)*2-2.4; 
        zonrx=k+(sin(s*PI/180))*(l/tan((s+90)/2*PI/180)*2)-(1.2-(cos(s*PI/180)*1.2))*2;
        zonrz=cos(s*PI/180)*l/tan((s+90)/2*PI/180)-sin(s*PI/180)*1.2+1.2;
        xierx=f;
        //xierz=c-((f-k)/2/tan(n*PI/180)+1.2);//仰望天上的光注释
        xierz=c-((f-k)/2/tan(s*PI/180)+1.2);//仰望天上的光add
        //s=tan(P/((f-k)/2))/PI*180;//仰望天上的光注释        
        printf("O6450\n");
        printf("X%.1lf\n",dd);
        printf("Z%.1lf\n",cc);
        printf("Z%.1lf\n",ccc);
        printf("W-%.2lf\n",w);
        printf("Z%.2lf\n",qi);
        printf("Z%.2lf\n",zon);
        printf("Z%.1lf\n",cc);
        printf("X%.1lf\n",ddd);
        printf("Z%.1lf\n",c);
        printf("x%.2lf\n",qirx);
        printf("G3 x%.2lf w-%.2lf R%.2lf\n",zonrx,zonrz,m);
        printf("G1 x%.2lf z%.2lf\n",xierx,xierz);
        printf("过渡=%.2lf\n",q);
        printf("打表垫片=%.1lf\n",qq);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-6-20 20:10:52 | 显示全部楼层
本帖最后由 晚起鸟儿 于 2015-6-20 20:12 编辑

可能大伙对我这个顽固的家伙纠结这个写得乱,差还老弄上来的程序烦不胜烦,但我能力只有这点呀,我希望通过思考和学习使它更好呀,等这个程序基本能应对凯达数控编程的运算后,我希望给它加个按钮,窗口,漂亮的界面,更规范的编写,甚至对著名的FANUC系统自动编程(无非是一些较难的节点进行数学计算,并对实践中的差异进行校正)请高手们不吝指导哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-20 22:00:48 | 显示全部楼层
代码修改的4个地方我用注释标明了。
另外,浮点数运算有舍入误差,所以你对比下结果,有一些偏差。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-20 22:02:42 | 显示全部楼层
呵呵。。。编程就是为了解决现实生活中的问题。你在编程能力不是很强的情况下,就有这种想法。。。很好

希望能坚持下去。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-6-20 23:21:25 | 显示全部楼层
仰望天上的光 发表于 2015-6-20 22:00
代码修改的4个地方我用注释标明了。
另外,浮点数运算有舍入误差,所以你对比下结果,有一些偏差。

这个是你是完全正确的,我把小数点后面数省略了(我想技术部在用CAD画图时也是把精度要求不太高的位置小数点后面的数省略,这样看起来也清楚些)正确数值是输入(84.5-81.8)/2/tan15≈5.038
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-6-20 23:29:43 | 显示全部楼层
本帖最后由 晚起鸟儿 于 2015-6-20 23:55 编辑
仰望天上的光 发表于 2015-6-20 22:02
呵呵。。。编程就是为了解决现实生活中的问题。你在编程能力不是很强的情况下,就有这种想法。。。很好

...


   谢谢光版主帮助,下面顺序改成后面的就报错,可以帮忙解释和修改下么?另外 func2和func3可以直接继承func1赋值和前面输入的数值么,这样程序比较短和清晰         



               if ( str[0] == 'J' ) {
                func2();
        }
        
              else if ( str[0] == 'C' ) {
                func3();
        }
        else {
              (sscanf(str,"%lf",&g));
                func1();
                }










     if {
                (sscanf(str,"%lf",&g));
                func1();
        }
        
        else if ( str[0] == 'J' ) {
                func2();
        }
        
        else ( str[0] == 'C' ) {
                func3();
        }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-21 09:36:29 | 显示全部楼层
晚起鸟儿 发表于 2015-6-20 23:29
谢谢光版主帮助,下面顺序改成后面的就报错,可以帮忙解释和修改下么?另外 func2和func3可以直接继 ...
#include<conio.h>
#include<math.h>
#include<stdio.h>
#include <ctype.h>
#define PI 3.1416
double a,b,c,d,e,f,g,aa,bb,cc,ccc,dd,ddd,ee,ff,gg,qi,zon,o,w,v,q,qq,
qirx,zonrx,zonrz,xierx,xierz,k,l,m,n,
P,s;
char str[9];
void func1();
void func2();
void func3();

void get_common_data(void);
void get_extra_data_fun2(void);
void get_extra_data_fun3(void);
void do_extra_compute_fun2(void);
void do_extra_compute_fun3(void);
void deal_data(void);
void pre_compute(void);
void output_version1(void);
void output_version2(void);

int main()
{
        
        get_common_data();
        deal_data();        
        getch();
}  

void func1 () 
{
        pre_compute();
        output_version1();
}

void func2 ()
{
        pre_compute();
        get_extra_data_fun2();
        do_extra_compute_fun2();
        output_version2();
}
void func3 ()
{
        pre_compute();
        get_extra_data_fun3();
        do_extra_compute_fun3();      
        output_version2();
}

void pre_compute(void) {
        dd=d+2;
        cc=c+4;
        ccc=c+1.1;
        ee=e+0.35;
        qi=b-38+48.72;
        zon=b-38+20.5;
        ddd=d-3;
        ff=f-(g+1)*2;
        o=g+1; 
        v=tan(PI/3.83);
        w=(dd-ee)/2/v;
        q=ccc-w-qi;
        if(b<=56)qq=58-b;
        if(b>56)qq=78-b;        
}

void output_version1(void) {
        printf("O6450\n");
        printf("X%.1lf\n",dd);
        printf("Z%.1lf\n",cc);
        printf("Z%.1lf\n",ccc);
        printf("W-%.2lf\n",w);
        printf("Z%.2lf\n",qi);
        printf("Z%.2lf\n",zon);
        printf("Z%.1lf\n",cc);
        printf("X%.1lf\n",ddd);
        printf("Z%.1lf\n",c);
        printf("X%.1lf\n",ff);
        printf("X%.1lf W-%.1lf R%.1lf\n",f,o,o);
        printf("1y¶é=%.2lf\n",q);
        printf("′ò±íμæƬ=%.1lf\n",qq);
}

void output_version2(void) {
        printf("O6450\n");
        printf("X%.1lf\n",dd);
        printf("Z%.1lf\n",cc);
        printf("Z%.1lf\n",ccc);
        printf("W-%.2lf\n",w);
        printf("Z%.2lf\n",qi);
        printf("Z%.2lf\n",zon);
        printf("Z%.1lf\n",cc);
        printf("X%.1lf\n",ddd);
        printf("Z%.1lf\n",c);
        printf("x%.2lf\n",qirx);
        printf("G3 x%.2lf w-%.2lf R%.2lf\n",zonrx,zonrz,m);
        printf("G1 x%.2lf z%.2lf\n",xierx,xierz);
        printf("1y¶é=%.2lf\n",q);
        printf("′ò±íμæƬ=%.1lf\n",qq);
}

void get_common_data(void) {
        printf("ÄúÇòÃæÖ±¾¶:\n");
        scanf("%lf",&a);
        printf("ÇòDľà:\n");
        scanf("%lf",&b);
        printf("3¤¶è:\n");
        scanf("%lf",&c);
        printf("′óÄú¿×:\n");
        scanf("%lf",&d);
        printf("D¡Äú¿×:\n");
        scanf("%lf",&e);
        printf("′óíaÔ2:\n");
        scanf("%lf",&f);
        printf("R½Ç:\n");
        scanf("%s",str);
}

void deal_data(void) {
        /*
        if ( str[0] == 'J' ) {
                func2();
        } else if ( str[0] == 'C' ) {
                func3();
        }
        else {
                (sscanf(str,"%lf",&g));
                func1();
        }*/
        if( isdiget(str[0]) ) {//str[0]êÇêy×Ö
                (sscanf(str,"%lf",&g));
                func1();
        }else if ( str[0] == 'J' ) {
                func2();
        }elseif(str[0] == 'C') {
                func3();
        }
}

void get_extra_data_fun2(void) {
        printf("½Ç¶è:\n");
        scanf("%lf",&n);
        printf("μ1½ÇÏ·½íaÔ2:\n");
        scanf("%lf",&k);
        printf("R½Ç:\n");
        scanf("%lf",&l);
}

void get_extra_data_fun3(void) {
        printf("μ1½Ç3¤¶è:\n");
        scanf("%lf",&P);
        printf("μ1½ÇÏ·½íaÔ2:\n");
        scanf("%lf",&k);
        printf("R½Ç:\n");
        scanf("%lf",&l);
}

void do_extra_compute_fun2(void) {
        m=l+1.2;
        qirx=k-l/tan((n+90)/2*PI/180)*2-2.4; 
        zonrx=k+(sin(n*PI/180))*(l/tan((n+90)/2*PI/180)*2)-(1.2-(cos(n*PI/180)*1.2))*2;
        zonrz=cos(n*PI/180)*l/tan((n+90)/2*PI/180)-sin(n*PI/180)*1.2+1.2;
        xierx=f;
        xierz=c-((f-k)/2/tan(n*PI/180)+1.2);
}

void do_extra_compute_fun3(void) {
        m=l+1.2;
        s=atan(((f-k)/2)/P)/PI*180;//ÑöíûììéÏμÄ1aadd
        qirx=k-l/tan((s+90)/2*PI/180)*2-2.4; 
        zonrx=k+(sin(s*PI/180))*(l/tan((s+90)/2*PI/180)*2)-(1.2-(cos(s*PI/180)*1.2))*2;
        zonrz=cos(s*PI/180)*l/tan((s+90)/2*PI/180)-sin(s*PI/180)*1.2+1.2;
        xierx=f;
        //xierz=c-((f-k)/2/tan(n*PI/180)+1.2);//ÑöíûììéÏμÄ1a×¢êí
        xierz=c-((f-k)/2/tan(s*PI/180)+1.2);//ÑöíûììéÏμÄ1aadd
        //s=tan(P/((f-k)/2))/PI*180;//ÑöíûììéÏμÄ1a×¢êí 
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-21 09:36:59 | 显示全部楼层
顺序的交换见函数void deal_data(void)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-6-21 09:44:09 | 显示全部楼层

这也太复杂了吧,完全不是我这种菜鸟看得懂的,而且有很多乱码。。。继承还是不要用了,顺序也改好了

        if (sscanf(str,"%lf",&g)){
                func1();
                }
        
       else if ( str[0] == 'J' ) {
                func2();
        }
        
        else if ( str[0] == 'C' ) {
                func3();
        }
       
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 02:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表