перерыв заявление в C - PullRequest
1 голос
/ 18 июля 2011

Я новичок в программировании, изучая язык 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? Я предполагаю, что я все еще не понял логику разрыва.

Спасибо!

#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;
}

Ответы [ 5 ]

1 голос
/ 18 июля 2011

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;
    }
}

Этот код делает то же самое, но он более читабелен. Не читая остальную часть вашего решения, я могу объяснить, что делает перерыв, чтобы изменить поток вашей программы.

Цикл for считает вверх, пока условие j

Однако, это также может быть прервано оператором "break". Таким образом, с добавленным условием if цикл также завершается всякий раз, когда L-> data [j]! = T, что вызывает предложение else, которое break выводит ваш код из цикла. Программа продолжает выполняться сразу после цикла.

0 голосов
/ 18 июля 2011

Я нашел вашу ошибку: вы полагаетесь на то, что j - последняя позиция дублированного значения. Без разрыва 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;
0 голосов
/ 18 июля 2011

Break обрывает токовую петлю.Вы можете использовать его, чтобы выйти из циклов For, While Loop или Do Loops.Вы также используете его, чтобы отделить операторы switch, чтобы предотвратить попадание логики в следующее предложение switch.

0 голосов
/ 18 июля 2011

break заставляет поток управления просто выпрыгнуть из структуры токовой петли (for, while, do-while).В вашем примере логика отличается, если вы выпрыгиваете, и отсчет заканчивается рано, когда вы break.Если вы этого не сделаете, то цикл продолжится, и вы получите больше результатов.

0 голосов
/ 18 июля 2011

"break" просто завершает ваш цикл for (). Внутренний цикл for ().

Таким образом, цикл будет выполняться ДО:

  • j> = n

    ... или ...

  • L-> data [j]! = T

Что наступит раньше :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...