火眼金睛:考验一下大家的眼力
#include <stdio.h>
int main (void)
{
int arr[10] = {1, 1, 1, 2, 3, 3, 3, 4, 5, 6};// 10个已经排好序的数
int i, j;
j = 0;
for (i=0; i <10; i++)
{
if (arr[i] != arr[++i])// 判断当前元素与下一个元素是否相等
{
arr[j++] = arr[i];
}
}
printf ( "\nNew Array: ");
for (i=0; i <j; i++)
{
printf ( "%-5d ", arr[j]);
}
putchar ( '\n ');
return 0;
}
(程序的本意是想对10个已经排好序的数进行更改,使新数组中不再有重复的数字,即每种数字只出现一次。)
程序很短,大家可以猜一下结果会是什么样?
[解决办法]
arr[i] != arr[++i] 未定义行为 ...
[解决办法]
for (i=0; i <10; i++)
for (i=0; i <9; i++)
最后一个数单独处理下
[解决办法]
for (i=0; i <10; i++)
{
a[j] = arr[i];
while(a[j]==arr[i+1])
{
i++;
}
j++;
}
for (i=0; i <j; i++)
{
printf ( "%d\t ", a[i]);
}
[解决办法]
看看这个呢? 看到楼上的很好,只是重新再定义一个数组有点浪费了。
main()
{
int a[10]={1,1,1,2,3,3,3,4,5,6},i,j=0;
for(i=0;i <10;i++)
{while(a[j]==a[i+1])
i++;
a[++j]=a[i+1];}
for(i=0;i <j;i++)
printf( "%d ",a[i]);
getch();
}
[解决办法]
if (arr[i] != arr[++i])中,i=9时数组越界
改成下面这样行吗?
for(i=1;i <10;i++)
if (arr[i]!=arr[j])
arr[j+1]=arr[i];
即让以i为序列号的原始数组数据与其前面一个比较,如果不相同,则保存到以j为序列号的新数组中。具体程序可能还要完善一下。
[解决办法]
arr[i] != arr[++i];
未定义行为。
不要理解未定义行为,应该避免未定义行为。
[解决办法]
VC 6.0下j没有变化。
[解决办法]
不同编译器可能结果不同。
[解决办法]
在C#中试了,j会增加,最后j=3,答案2 4 6;问题出现在if中,每次循环i增加2。还有一个问题是数组越界的问题,当数组大小为偶数时不会越界,当为奇数时出现错误,数组越界。期待答案!
[解决办法]
(程序的本意是想对10个已经排好序的数进行更改,使新数组中不再有重复的数字,即每种数字只出现一次。)
lz的程序arr[j++]=a[i];最后结果是2,4,6不满足lz的意思.
上面lz说每种数字只出现一次.一共十个元素每个不同.但是初始化时一共只有1,2,3,4,5,6
没有外来赋值怎么让10个元素每个不一样.
[解决办法]
用的MYTC5.2
[解决办法]
arr[i] != arr[++i] 语句 是先执行 ++i
此语句恒假
[解决办法]
把a[j]改成a[i]结果应该是2,4,6;
大家看啊:在a=0,1时a[i]=a[++i];在a=2时是拿a[2]跟a[3]比较;此时两个数是不同的。 注意:此时i的值已变为3。所以是把a[3]即2送给a[0](j=0),即a[0]=2;
然后j自增;i也自增变为4。a[4]=a[5]=a[6];j不增。i增到6;
a[6]!=a[7];同上理由把a[7]给a[1](因为此时j=1) 即a[1]=4,j自增;
i继续自增变为8;再判断a[8]和a[9];a[8]!=a[9];
所以把a[9]赋给a[2](j=2);
j自增变为3 。所以最后j的值为3;结果就为2,4,6。