关于C语言一个基础的题目,不太懂

主要是要你编写一段子函数
要实现从数组a中取出一个4位数,如果该四位数连续大于这个数以后的5个数且该数是奇数(该数后不满5个则不统计),则统计出满足此条件的数的个数cnt,并把这些4位数按从小到大的顺序存入数组b中

我的想法是这样写的

for(i=0;i<MAX-5;i++)
{for(j=i;j<=i+5;j++)
if(a[i]>a[j]&&a[i]%2==1){b[cnt]=a[i];cnt++}
else {k=0;break;}
}
for(i=0;i<cnt;i++)
for(j=i;j<cnt;j++)
if(b[i]>b[j]){k=b[i];b[i]=b[j];b[j]=k;}
}
不知道对不对?

答案是这样的
for(i=0;i<MAX-5;i++)
{for(j=i;j<=i+5;j++)
if(a[i]>a[j]&&a[i]%2==1) flag=1;
else {flag=0;break;}
if(flag==1){b[cnt]=a[i];cnt++;}
}
for(i=0;i<cnt;i++)
for(j=i;j<cnt;j++)
if(b[i]>b[j]){flah=b[i];b[i]=b[j];b[j]=flag;}
}
这个答案为什么要用个flag变量?
不能直接写出来么?
还请高手能检查下 里面有没有什么逻辑错误

谢谢了....会适当的追加分的..

哦不好意思 上面我自己的答案打错了

虽然是答案 但是两个都得出满足条件的数为0
这是为什么?

else后面直接是break 没有k=0了

逻辑错误很明显啊,这句,就是条件判断上
if(a[i]>a[j]&&a[i]%2==1){b[cnt]=a[i];cnt++}
else {k=0;break;}
}
你想下是连续五个数小于a[i]才满足条件,所以你这里只要有一个满足就可以了,比如五个数字中我的第一个满足,但是第二个不满足,你却将a[i]保存到数组中了。所以在这里需要加一个标志,判读是否是五次都满足,
.....
int flag_five=0
if (a[i]>a[i]&&a[i]%2 == 1)
{
flag_five++;
if (flag_five == 5)
{
b[cnt] = a[i];
cnt++
}

}
.....
完整代码如下
就你的改的,我没有测试,好久没搞c了

for(i=0;i<MAX-5;i++)
{ int flag_five=0
for(j=i;j<=i+5;j++)
{
if (a[i]>a[i]&&a[i]%2 == 1)
{
flag_five++;
if (flag_five == 5)
{
b[cnt] = a[i];
cnt++
}

}

}
}
for(i=0;i<cnt;i++)
for(j=i;j<cnt;j++)
if(b[i]>b[j]){k=b[i];b[i]=b[j];b[j]=k;}
}

这下应该没什么问题了,有的话应该是语法错误,如果你是编程新手,请一定要注意编程风格,当代码写多了后就知道这样写不好维护的
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-08-19
定义了K没?flag变量是标志位。你可以自己定义的吧,不一定用它。
还有你下面的正确答案真的能出结果吗?
第2个回答  2008-08-19
你的程序和答案其实是一样的,答案用变量flag,就是起一个判断作用,其实没什么实际作用,你写的一样可以
第3个回答  2008-08-19
一个4位数,为什么你的问题很多我都读不懂,希望你能讲清楚点吗
但是从下面答案来看,你写的和答案是一样的,可以这样写,老师的flag其实就是和你的k一样
第4个回答  2008-08-19
1.这个答案为什么要用个flag变量?
不能直接写出来么?
ans:直接写的话,是在双重循环里面,{b[cnt]=a[i];cnt++;} 这句执行的次数明显多于实际次数。
2.正确答案不敢苟同,应该用continue而不能用break。否则一次不满足条件就会直接退出,而不能得出正确答案。
3.下面是修改的,试一下吧

#define MAX 10

void main()
{
int i,j;
int flag=0,cnt=0;
int a[MAX] = {9,8,7,6,5,4,3,2,1,0};
int b[MAX] = {0};

for(i=0;i<MAX-5;i++)
{
for(j=i;j<=i+5;j++)
{
if(a[i]>a[j]&&a[i]%2==1)
flag=1;
else
{
flag=0;
continue;
}
}
if(flag==1)
{
b[cnt]=a[i];
cnt++;
}
}

for(i=0;i<cnt;i++)
{
for(j=i;j<cnt;j++)
if(b[i]>b[j])
{
flag=b[i];
b[i]=b[j];
b[j]=flag;
}
}

for(i=0;i<cnt;i++)
printf("%d,", b[i]);
}
第5个回答  2008-08-19
flag就是一个软开关,没什么问题啊