请帮忙改下程序(条件运算,三角函数)
这个程序前面输入相同,“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
#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;
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 == 'J' ) {
func2();
}
else if ( str == '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);
} 本帖最后由 晚起鸟儿 于 2015-6-20 20:12 编辑
可能大伙对我这个顽固的家伙纠结这个写得乱,差还老弄上来的程序烦不胜烦,但我能力只有这点呀,我希望通过思考和学习使它更好呀,等这个程序基本能应对凯达数控编程的运算后,我希望给它加个按钮,窗口,漂亮的界面,更规范的编写,甚至对著名的FANUC系统自动编程(无非是一些较难的节点进行数学计算,并对实践中的差异进行校正)请高手们不吝指导哦{:5_91:} 代码修改的4个地方我用注释标明了。
另外,浮点数运算有舍入误差,所以你对比下结果,有一些偏差。 呵呵。。。编程就是为了解决现实生活中的问题。你在编程能力不是很强的情况下,就有这种想法。。。很好
希望能坚持下去。 仰望天上的光 发表于 2015-6-20 22:00
代码修改的4个地方我用注释标明了。
另外,浮点数运算有舍入误差,所以你对比下结果,有一些偏差。
这个是你是完全正确的,我把小数点后面数省略了(我想技术部在用CAD画图时也是把精度要求不太高的位置小数点后面的数省略,这样看起来也清楚些)正确数值是输入(84.5-81.8)/2/tan15≈5.038
本帖最后由 晚起鸟儿 于 2015-6-20 23:55 编辑
仰望天上的光 发表于 2015-6-20 22:02
呵呵。。。编程就是为了解决现实生活中的问题。你在编程能力不是很强的情况下,就有这种想法。。。很好
...
谢谢光版主帮助,下面顺序改成后面的就报错,可以帮忙解释和修改下么?另外 func2和func3可以直接继承func1赋值和前面输入的数值么,这样程序比较短和清晰
if ( str == 'J' ) {
func2();
}
else if ( str == 'C' ) {
func3();
}
else {
(sscanf(str,"%lf",&g));
func1();
}
if {
(sscanf(str,"%lf",&g));
func1();
}
else if ( str == 'J' ) {
func2();
}
else ( str == 'C' ) {
func3();
} 晚起鸟儿 发表于 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;
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 == 'J' ) {
func2();
} else if ( str == 'C' ) {
func3();
}
else {
(sscanf(str,"%lf",&g));
func1();
}*/
if( isdiget(str) ) {//strêÇêy×Ö
(sscanf(str,"%lf",&g));
func1();
}else if ( str == 'J' ) {
func2();
}elseif(str == '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×¢êí
} 顺序的交换见函数void deal_data(void) 仰望天上的光 发表于 2015-6-21 09:36
这也太复杂了吧,完全不是我这种菜鸟看得懂的,而且有很多乱码。。。继承还是不要用了,顺序也改好了
if (sscanf(str,"%lf",&g)){
func1();
}
else if ( str == 'J' ) {
func2();
}
else if ( str == 'C' ) {
func3();
}
页:
[1]