我是自己编程学习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;
}
答案 0 :(得分: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;
}
}
此代码完全相同,但更具可读性。在没有阅读其余解决方案的情况下,我可以解释为改变程序的流程正在做些什么。
for循环向上计数直到条件j <1。 n不再符合。
但是,它也可以通过“break”语句终止。因此,对于你添加的if条件,只要L-> data [j]!= t,循环也会终止,这会触发break
你的代码离开循环的else子句。程序在循环后立即继续执行。
答案 1 :(得分:0)
“break”只会终止你的“for()”循环。内部的“for()”循环。
因此循环将执行UNTIL:
j&gt; = n
...或......
L-&gt; data [j]!= t
以先到者为准:)
答案 2 :(得分:0)
break
使控制流刚跳出当前循环结构(for
,while
,do-while
)。在您的示例中,如果您跳出逻辑,则逻辑会有所不同,并且当您break
时它会提前结束计数。如果不这样做,那么循环将继续运行,并且您将获得更多结果。
答案 3 :(得分:0)
中断突破当前循环。您可以使用它来打破For循环,While循环或Do循环。您还可以使用它来断开switch语句,以防止逻辑流入下一个switch子句。
答案 4 :(得分:0)
我发现了你的错误:你依赖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;