帮忙看下这里的逻辑判断到底有没有有关问题,还有搜索函数写法正确么
帮忙看下这里的逻辑判断到底有没有问题,还有搜索函数写法正确么。
如下,这是我写的一块循环判断的代码,我的if else if else if 这个里面的判断有用么?里面的lookup1函数是我自己写的搜索函数,有返回值的,搜索到了就返回1,没有就返回0,可是我糊涂了,我感觉我这么写只有第一个if会执行,其他三个不会,因为1&&0=0,if (0)是不执行的。我的想法是对J1,J2两个结构里的值J进行搜索,如果搜索到,temp =1,没有搜索到temp=0,lookup1函数返回temp,我发现有的J1.J明明可以搜索到的,却没搜索到,temp=0(我让其显示temp给我看的),就觉得是不是这部分代码有问题。解释部分是我自己的理解,不对之处还望大神们多指教
搜索函数lookup1中参数J是要匹配的值,拿J来与XYZ_1ST Var[]结构数组中的点号对比,若对应上了,则取出其对应的X,Y,Z坐标值,因为XYZ_1ST的结构数组里的点是有对称关系的,个位只有0,1,2,3四种情况,分别对应坐标轴4个象限的不同坐标值,所以lookup1里对其个位进行了判断,当为0时与NODE1判断匹配,为1时与NODE2判断匹配,以此类推,但是我有个点明明可以搜索到的,却不显示,目前只有NODE1的点匹配上了,其余temp我看都是0,所以不知道哪里出了问题。
另外lookup1里的参数temp是全局变量,初始化=0的,不知道这个有没有影响
------解决思路----------------------
刚开始入门···不懂哈···
------解决思路----------------------
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
------解决思路----------------------
我比较了你前后的 lookup1(),发现前面多了
还有个问题,你为什么要把全局变量的 temp 传到这个lookup1函数里面去?我完全看不出,它在里面的作用。而且作为全局变量,也不需要通过函数参数来传递。
如下,这是我写的一块循环判断的代码,我的if else if else if 这个里面的判断有用么?里面的lookup1函数是我自己写的搜索函数,有返回值的,搜索到了就返回1,没有就返回0,可是我糊涂了,我感觉我这么写只有第一个if会执行,其他三个不会,因为1&&0=0,if (0)是不执行的。我的想法是对J1,J2两个结构里的值J进行搜索,如果搜索到,temp =1,没有搜索到temp=0,lookup1函数返回temp,我发现有的J1.J明明可以搜索到的,却没搜索到,temp=0(我让其显示temp给我看的),就觉得是不是这部分代码有问题。解释部分是我自己的理解,不对之处还望大神们多指教
for(i=0;i<SIZE2;i++)
{
J1.J = Var2[i].J1;
J2.J = Var2[i].J2;
if(lookup1(J1.J,Var1,SIZE1,&J1,temp)==1 && lookup1(J2.J,Var1,SIZE1,&J2,temp)==1)
{
XYZ2[i].X1 = lambda[i]*J2.X + (1-lambda[i])*J1.X;
XYZ2[i].Y1 = lambda[i]*J2.Y + (1-lambda[i])*J1.Y;
XYZ2[i].Z1 = lambda[i]*J2.Z + (1-lambda[i])*J1.Z;
IS(XYZ2[i].IS,SIZE2);
}
else if(lookup1(J1.J,Var1,SIZE1,&J1,temp)==1 && lookup1(J2.J,Var1,SIZE1,&J2,temp)==0)
{
lookup2(J2.J,XYZ2,SIZE2,&J2,temp);
XYZ2[i].X1 = lambda[i]*J2.X + (1-lambda[i])*J1.X;
XYZ2[i].Y1 = lambda[i]*J2.Y + (1-lambda[i])*J1.Y;
XYZ2[i].Z1 = lambda[i]*J2.Z + (1-lambda[i])*J1.Z;
IS(XYZ2[i].IS,SIZE2);
}
else if(lookup1(J1.J,Var1,SIZE1,&J1,temp)==0 && lookup1(J2.J,Var1,SIZE1,&J2,temp)==1)
{
lookup2(J1.J,XYZ2,SIZE2,&J1,temp);
XYZ2[i].X1 = lambda[i]*J2.X + (1-lambda[i])*J1.X;
XYZ2[i].Y1 = lambda[i]*J2.Y + (1-lambda[i])*J1.Y;
XYZ2[i].Z1 = lambda[i]*J2.Z + (1-lambda[i])*J1.Z;
IS(XYZ2[i].IS,SIZE2);
}
else if(lookup1(J1.J,Var1,SIZE1,&J1,temp)==0 && lookup1(J2.J,Var1,SIZE1,&J2,temp)==0)
{
lookup2(J1.J,XYZ2,SIZE2,&J1,temp);
lookup2(J2.J,XYZ2,SIZE2,&J2,temp);
XYZ2[i].X1 = lambda[i]*J2.X + (1-lambda[i])*J1.X;
XYZ2[i].Y1 = lambda[i]*J2.Y + (1-lambda[i])*J1.Y;
XYZ2[i].Z1 = lambda[i]*J2.Z + (1-lambda[i])*J1.Z;
IS(XYZ2[i].IS,SIZE2);
}
else
fout << "NODE NOT FOUND!!!" << "___" << i << endl;
}
int lookup1(int J,XYZ_1ST Var[],int SIZE,JOINT * P,int tem)
{
int i,g; //传递JOINT 结构地址,这样便可以修改JOINT 结构J1,J2里的值,不然只是拷贝
g = J%10; //根据J的个位来决定让J在NODE1还是NODE2,3,4里搜
if(g == 0)
{
for(i=0;i<SIZE;i++)
{
if(J==Var[i].NODE1)
{
tem = 1;
P->J = Var[i].NODE1;
P->X = Var[i].X1;
P->Y = Var[i].Y1;
P->Z = Var[i].Z1;
break; //一旦if匹配上了即跳出循环
}
else
tem = 0;
}
}
else if(g == 1)
{
for(i=0;i<SIZE;i++)
{
if(J==Var[i].NODE2)
{
tem = 1;
P->J = Var[i].NODE2;
P->X = Var[i].X2;
P->Y = Var[i].Y2;
P->Z = Var[i].Z2;
break; //一旦if匹配上了即跳出循环
}
else
tem = 0;
}
}
else if(g == 2)
{
for(i=0;i<SIZE;i++)
{
if(J==Var[i].NODE3)
{
tem = 1;
P->J = Var[i].NODE3;
P->X = Var[i].X3;
P->Y = Var[i].Y3;
P->Z = Var[i].Z3;
break; //一旦if匹配上了即跳出循环
}
else
tem = 0;
}
}
else if(g == 3)
{
for(i=0;i<SIZE;i++)
{
if(J==Var[i].NODE4)
{
tem = 1;
P->J = Var[i].NODE4;
P->X = Var[i].X4;
P->Y = Var[i].Y4;
P->Z = Var[i].Z4;
break; //一旦if匹配上了即跳出循环
}
else
tem = 0;
}
}
return tem; //当J==Var[i].NODE1没满足时,不停的为temp赋0值。若遍历整个Var[i]都没满足,则temp=0
}
搜索函数lookup1中参数J是要匹配的值,拿J来与XYZ_1ST Var[]结构数组中的点号对比,若对应上了,则取出其对应的X,Y,Z坐标值,因为XYZ_1ST的结构数组里的点是有对称关系的,个位只有0,1,2,3四种情况,分别对应坐标轴4个象限的不同坐标值,所以lookup1里对其个位进行了判断,当为0时与NODE1判断匹配,为1时与NODE2判断匹配,以此类推,但是我有个点明明可以搜索到的,却不显示,目前只有NODE1的点匹配上了,其余temp我看都是0,所以不知道哪里出了问题。
另外lookup1里的参数temp是全局变量,初始化=0的,不知道这个有没有影响
#include <iostream>
#include <fstream>
#include <cstdlib> //exit()
#include <iomanip>
#include <cmath>
using namespace std;
const int CCN = 20; //CCN=CONTROL CODE NUMBER
const int MAX = 180; //最大工况数设置成180,也把此值用在其他需设上限的结构数组里
const int MAXNAME =100;
int CC[CCN]; //存放控制代码的数组
int temp = 0; //搜索匹配识别码,初值为0,如匹配则重新赋值为1
------解决思路----------------------
刚开始入门···不懂哈···
------解决思路----------------------
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
------解决思路----------------------
我比较了你前后的 lookup1(),发现前面多了
g = J%10;,然后 g 的值有可能是 0~9,但你只判断了 0~3,4~9就直接跳到 return 去了,既然你判断了它,那么加个else也是习惯吧。而后面写的代码却完全没有判断这个,功能不一样了。
还有个问题,你为什么要把全局变量的 temp 传到这个lookup1函数里面去?我完全看不出,它在里面的作用。而且作为全局变量,也不需要通过函数参数来传递。