【问题标题】:Implementing loops on the basis of condition in C基于C语言条件实现循环
【发布时间】:2015-12-10 06:34:09
【问题描述】:

我有一组语句需要在两个不同的循环中执行;根据检查条件的结果标识的循环。这种类型有多个这样的集合。

Set A : statement 1
        statement 2
        statement 3

Set B : statement 4
        statement 5
        statement 6

and so on..

现在它们需要执行如下:

if(condition 1)
    loop over some Loop A
        execute Set A
else if(condition 2)
    loop over some loop B
        execute Set A

These loops can be completely different from each other.

现在,为了代码清晰起见,我不想写上面提到的代码。另一个原因是我必须制作多组才能将它们组合在一起。

是否有任何机制可以实现以下目标:

CHECK_CONDITION_AND_LOOP_HERE
    execute Set A

我已经尝试使用宏来实现这一点,在表达式中使用 braced-group 但不能。我也尝试使用 三元运算符 以及 fall through a switch case 来实现这一点,但无法获得相同的结果。

在 C 语言中有什么方法可以实现我想要的行为吗?

问题的示例代码:

if(condition A)
    for(i=0; i<10; i++, k*=2) {
        execute Set A;  //Operations performed here use variable k
    }
else if(condition B)
    for(j=5; j<75; j+=5, k*=arr[j]) {
        execute Set A;  //Operations performed here use variable k
    }

【问题讨论】:

  • 有条件地确定开始和结束值,然后循环?或者使“执行集A”成为一个功能?或者甚至使循环和“执行集合 A”成为一个函数?有很多方法比宏更好。
  • 它不仅仅是基于开始结束值的循环。更新问题以获得更好的清晰度。
  • 这些半生不熟的伪代码示例恐怕无法明确您的要求。如果不想复制通用代码,就单独做一个函数,不管是exec(A)还是exec_A()。您没有说明循环有何不同,但您也可以编写一些类似迭代器的函数并有条件地确定。

标签: c loops for-loop foreach


【解决方案1】:

第 1 版问题​​的答案:

鉴于唯一的区别是执行语句的值范围,您可以使用几个变量来存储范围端点,例如

int first = 0;
int last = -1;

if (condition1) {
    first = 1;
    last = 10;
} else if (condition2) {
    first = 3;
    last  = 7;
}

for ( int i = first; i <= last; i++ )
    execute set A

请注意,如果两个条件都不满足,将 last 初始化为小于 first 会阻止循环体运行。


第二版问题的答案:

这是问题中的代码。为了清楚起见,我做了一些更改,并使问题更加具体。

if (cond1)
    for (initA;condA;updateA)
        execute SetX
else if (cond2)
    for (initB;condB;updateB)
        execute SetX

这是重构的代码

int is1 = cond1;
int is2 = is1 ? 0 : cond2;

if (is1)
    initA;
if (is2)
    initB;

while ( (is1 && condA) || (is2 && condB) )
{
    execute SetX
    if ( is1 )
        updateA;
    if ( is2 )
        updateB;
}

【讨论】:

  • 第二个版本的伪代码 sn-p 是我的问题的确切表示。重构代码是我不必在两个地方执行/复制 set X 语句的一种方式。但是,任何进一步的建议都是开放的。
【解决方案2】:

一个函数,也许吧?

void func_A() {
    printf("Here0\n");
    printf("Here1\n");
}

...

if(a < b) {
    for(i = 1; i <= 10; i++) {
        func_A()
    }
}
else if(a == b) {
    for(i = 3; i <= 7; i++) {
        func_A()
    }
}

或者,如果您只想拨打一个电话/阻止:

if(a < b) {
    min = 1; max = 10;
}
else if(a == b) {
    min = 3; max = 7;
}
for(i = 3; i <= 7; i++) {
    printf("Here0\n");
    printf("Here1\n");
}

【讨论】:

  • 集合是函数的另一种表示。我必须为此创建多个我想避免的函数。
  • @rango:为什么?如果你想要一些具体的东西,我需要一个很难的例子。据我所知,这符合您的问题。
  • 我现在更新了这个问题。如果您还需要任何进一步的示例,请告诉我!
  • @rango:嗯,它似乎仍然适合.. 我建议添加实际 C 语句的示例以及您已经尝试过的内容;这将使这里的人们了解您的解决方案为什么会给您带来问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-26
  • 2016-10-16
  • 2021-12-14
  • 2020-10-01
  • 2014-11-22
  • 2019-03-25
相关资源
最近更新 更多