c++ - 使嵌套的 if-else 更易于管理和高效

标签 c++

我正在从事一个分析和预测波浪模式的项目,但问题是嵌套 if/else 的代码变得越来越难以管理,这里是片段:

for (int x = 1; x <= 24; x++)            
{
if ((15 <= Angles[x]) && (Angles[x] <= 30))
  {
   if(x<=6)
    {
      counter=counter+4;
      if (edges[x] < edges[x+2]) { counter = counter - 4; }
      else{counter=counter+5; };
      if (Angles[x] < Angles[x + 2]) { counter = counter - 6; }
      else{counter=counter + 4; };
      if ((edges[x+1] - edges[x]) < (edges[x + 3] - edges[x + 2])) { counter= counter - 6; }
      else{counter-counter + 5; };
      if (gradient[x] < gradient[x + 2]) { counter = counter - 6; }
      else{counter=counter + 5; };
    };

if((7<=x)&&(x<=12))
{
  counter = counter - 10;
  if (edges[x] < edges[x+2]) { counter = counter - 5; }
  else{counter=counter + 6; };
  if (Angles[x] < Angles[x + 2]) { counter = counter - 7; }
  else{counter=counter + 6; };
  if ((edges[x+1] - edges[x]) < (edges[x + 3] - edges[x + 2])) { counter = 
  counter - 6; }
  else{counter-counte+7; };
  if (gradient[x] < gradient[x + 2]) { counter = counter - 6; }
  else{counter=counter+8; };
};

if((13<=x)&&(x<=18))
{
  counter = counter - 30;
   if (edges[x] < edges[x+2]) { counter = counter - 7; }
   else{counter=counter + 6; };
   if (Angles[x] < Angles[x + 2]) { counter = counter - 7; }
   else{counter=counter + 5; };
   if ((edges[x+1] - edges[x]) < (edges[x + 3] - edges[x + 2])) { counter = 
   counter - 7; }
   else{counter-counter+5; };
   if (gradient[x] < gradient[x + 2]) { counter = counter + 5; }
   else{counter=counter + 5; };
};

//there are more waves classification and weightage to come//
if ((30 <= Angles[x]) && (Angles[x] <= 45)){}.....
if ((45 <= Angles[x]) && (Angles[x] <= 60)){}.....
if(60 < Angles[x]){}....

};  

Angles is a container storing wave angle values. edges are peak and trough of waves. gradient contains the gradient value of wave counter is the weightage of the current pattern. values are stored in serial manner in a vector.

这只是一个粗略的精简代码片段(如果您发现语法错误,请忽略语法错误)。 每个模式都包含一个 for 循环,其中嵌套了 if/else。 还有 13 种模式。

我已经写了 5000 行代码,只是写那些 if/else for 循环。你们能帮我让它更易于管理吗?

最佳答案

代替

   if(x<=6)
    {
      counter=counter+4;
      if (edges[x] < edges[x+2]) { counter = counter - 4; }
      else{counter=counter+5; };
      if (Angles[x] < Angles[x + 2]) { counter = counter - 6; }
      else{counter=counter + 4; };
      if ((edges[x+1] - edges[x]) < (edges[x + 3] - edges[x + 2])) { counter= counter - 6; }
      else{counter-counter + 5; };
      if (gradient[x] < gradient[x + 2]) { counter = counter - 6; }
      else{counter=counter + 5; };
    };

你可以写

   if(x<=6)
    {
      counter = counter
        + 4
        + ((edges[x] < edges[x+2]) ? -4 : 5)
        + ((Angles[x] < Angles[x + 2]) ? -6 : 4)
        + (((edges[x+1] - edges[x]) < (edges[x + 3] - edges[x + 2])) ? -6 : 5)
        + ((gradient[x] < gradient[x + 2]) ? -6 : 5)
    };

如果您可以将条件放在自己的函数中,代码也会变得更清晰。

我看到很多条件,比如 array[x] < array[x+2]。你可以像这样定义 lambdas

auto raisingEdge = [&](int x) { return edges[x] < edges[x+2]; };

像这样使用它

counter += raisingEdge(x) ? -4 : 5;

这可以使您的代码更具可读性:

  if(x<=6)
    {
      counter = counter
        + 4
        + (raisingEdge(x) ? -4 : 5)
        + (raisingAngle(x) ? -6 : 4)
        + (raisingEdgeDelta(x) ? -6 : 5)
        + (raisingGradient(x) ? -6 : 5)
    };

(名称只是为了展示概念;我不知道也不关心这些值到底是什么)

关于c++ - 使嵌套的 if-else 更易于管理和高效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49974037/

相关文章:

c++ - 混合 C/C++ 库

C++ Pugixml通过属性id获取父级的子级

c++ - 命名构造成语和新操作符

c++ - 将C++代码编译成汇编然后反汇编

c++ - 在 omnet++ IDE 中找不到 -lC :\SQLAPI\lib\sqlapi. 库

c++ - wxWidgets 中的自定义内存分配

c++ - 通过拆分 char 数组创建字符串

c++ - 在应用程序中使用不同的文件夹构建 makefile

c++ - 尝试在 C++ 中的 Fltk GUI 中右键单击

c++ - zlib 对结构中 float 的压缩