首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

火眼金睛:考验一下大家的眼力,该如何处理

2012-03-06 
火眼金睛:考验一下大家的眼力#includestdio.hintmain(void){intarr[10]{1,1,1,2,3,3,3,4,5,6}//10个已

火眼金睛:考验一下大家的眼力
#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。


热点排行