因为条件给出了意想不到的结果

时间:2014-01-30 16:53:13

标签: c algorithm loops if-statement break

我在这样的问题: 我在下面的代码中遇到了问题。问题是我在if conditions两个中断之后做了一些加法部分。并且这个附加是循环的,而循环直到count>0问题是如果我把括号放入for循环然后它重复内部的部分直到它的条件不是假的。 Buti必须做加法,如下所示: 我们有一个数组数据[i] .freq = {0,1,2,3,4,5}和data [i] .next表示要添加的下一个成员。假设我添加0和1首先我得到“1 “结果,我把结果放在我的数组的最后一个索引中,像这样({0 1 2 3 4 5 1})现在0和1不能添加,因为它们已经添加(我不必重复添加相同的元素),所以下次添加将在最后一个元素之前的最后一个索引元素和最小元素之间(但不是那些已经添加的元素)。所以这里的加法将在最后一个索引中的“1”和右边的最小元素之间,即“2”注意,这里我们没有考虑到0和1,因为它们已经被添加,就像这个2下次不会添加,因为这次正在添加,而且他们的添加将是{0 1 2 3 4 5 1 3}我们必须重复相同的内容,直到剩下&元素终于。

    data[data_size].freq=data[i].freq+data[p].freq; // here i add the first 2 elements "0" and "1" in the example i given below.
    int count=5;
    do
    {
    for(i=0;data[i].next!=-1;i=data[i].next)//the problem is here if i put bracesit dont't do the ask which i expect it to do.
    if(data[data[i].next].freq>data[data_size].freq && data[data[i].next].flag==0)
    break;
       data[data_size+1].freq= data[data_size].freq+ data[data[i].next].freq; 
       data[data_size].next=data[i].next;
       data[i].next=data_size;
       data_size++;
    if(data[data[i].next].freq<data[data_size].freq && data[data[i].next].flag==0)
    break;
       data[data_size+1].freq= data[data_size].freq + data[i].freq
       data[data_size].next=data[i].next;
       data[i].next=data_size;
       data_size++;
       count--;
    } while(count>0)

任何人都可以帮我设计我想要实现的代码。

2 个答案:

答案 0 :(得分:2)

如果你写

for(i=0 ..any condition)
if(condition1)
break; 
if(condition2)
break;

你不仅有一个难以理解的混乱,但你也只有if循环中的第一个for子句。

如果您希望for循环扩展到两者,则必须将它们放入{}

for(...) {
    if(condition1) break;
    if(condition2) break;
}

我个人的偏好是当语句在下一行时总是使用大括号。 S不写

    if(condition1)
        break;

因为有人可能会试图插入一个条件声明并感到惊讶它不能正常工作,但要么

    if(condition1) break;

在一行或

    if(condition1) {
        break;
    }

添加功能不需要的大括号,但为了便于阅读。

答案 1 :(得分:1)

这是编译器查看代码的方式:

int count=5;
do
{
    for (i = 0; data[i].next != -1; i = data[i].next)
    {
        if (data[data[i].next].freq > data[data_size].freq && data[data[i].next].flag == 0)
            break; // break out of the enclosing 'for' loop (goes to point A)
    }
    // Point A
    data[data_size].next = data[i].next;
    data[i].next = data_size;
    data_size++;
    if (data[data[i].next].freq < data[data_size].freq && data[data[i].next].flag == 0)
    {
        break; // break out of the outer 'do' loop (goes to point B)
    }
    data[data_size].next = data[i].next;
    data[i].next = data_size;
    data_size++;
    count--;
} while (count > 0);
// Point B

根据您的代码评论,我认为您的问题是您的“休息”声明并未将您带到您认为他们带您去的地方。