【问题标题】:break statement in CC中的break语句
【发布时间】:2011-07-18 04:13:21
【问题描述】:

我是自学C编程的新手。

给出一个非递减顺序的整数列表。您需要删除重复的元素并输出仅包含唯一元素的列表。

示例: 输入:2 3 5 6 8 8 9 11 11 11 20 输出:2 3 5 6 8 9 11 20

这是我的有效代码。但是如果我删除“else break”语句(我知道这会产生错误的输出),它怎么会给我输出 2 3 5 6 8 8 9 11?我想我还没有掌握break的逻辑。

谢谢!

#include <stdio.h>
#define MAXSIZE 100
typedef int ElemType;
typedef struct{
    ElemType data[MAXSIZE];
    int length;
}SqList;

void Create_SqList(SqList *L, int n){
        L->length=n;
    int i=0;
    printf("\ninput %d data: ", n);
    while(i<n){
        scanf("%d", &L->data[i]);
        i++;
    }
}

void Print_SqList(SqList *L){
    int i, n;
    n=L->length;
    i=0;
    printf("\noutput %d data: ", n);
    while(i<n){
        printf("%d ", L->data[i]);
        i++;
    }
    printf("\n");
}

void Reduce_SqList(SqList *L){
    int n = L->length;
    int i, j, k, count=0;
    ElemType t;
    for(i=0;i<n;i++){
       t=L->data[i];
       for(j=i+1;j<n;j++){
        if(L->data[j]==t)   
            count++;    
             else break;      // without break, it produeced the wrong output!
       }


       if(count){
        for(k=j;k<n;k++)
            L->data[k-count]=L->data[k];
        n=n-count;
        count=0;
       }
    }
    L->length=n;
}


int main(){
    SqList L;
    int n;
    printf("\ninput n: ");
    scanf("%d",&n);
    Create_SqList(&L,n);
    Print_SqList(&L);
    Reduce_SqList(&L);
    Print_SqList(&L);

    return 0;
}

【问题讨论】:

    标签: c


    【解决方案1】:

    break 立即退出循环。

    for(j=i+1;j<n;j++){
        if(L->data[j]==t)   
            count++;    
                 else break;      // without break, it produeced the wrong output!
    
       }
    

    首先,让它更具可读性。

    for(j=i+1;j<n;j++) {
        if(L->data[j]==t) { 
            count++;    
        } else {
            break;
        }
    }
    

    此代码执行完全相同的操作,但更具可读性。无需阅读您解决方案的其余部分,我就可以解释 break 正在做什么来改变您的程序流程。

    for 循环向上计数,直到不再满足条件 j

    但是,它也可以被“break”语句终止。因此,使用您添加的 if 条件,循环也将在 L->data[j] != t 时终止,这会触发 else 子句 breaks 您的代码退出循环。程序在循环后立即继续执行。

    【讨论】:

      【解决方案2】:

      break 使控制流直接跳出当前循环结构(forwhiledo-while)。在您的示例中,如果您跳出,则逻辑不同,并且在您break时提前结束计数。如果你不这样做,那么循环会继续运行,你会得到更多的结果。

      【讨论】:

        【解决方案3】:

        Break 跳出当前循环。您可以使用它来跳出 For 循环、While 循环或 Do 循环。您还可以使用它来中断 switch 语句,以防止逻辑流入下一个 switch 子句。

        【讨论】:

          【解决方案4】:

          “break”只是终止你的“for()”循环。内部“for()”循环。

          所以循环将执行 UNTIL:

          • j >= n

            ...或...

          • L->数据[j] != t

          以先到者为准:)

          【讨论】:

            【解决方案5】:

            我发现了你的错误:你依赖 j 作为重复值的最后一个位置。没有 break j 会递增直到等于 n。

            这搞乱了这里的逻辑:

               if(count){
                for(k=j;k<n;k++)
                    L->data[k-count]=L->data[k];
                n=n-count;
                count=0;
               }
            }
            L->length=n;
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-09-06
              • 2014-02-21
              • 2013-02-16
              • 2018-09-17
              • 2022-01-22
              • 1970-01-01
              • 1970-01-01
              • 2018-03-14
              相关资源
              最近更新 更多