数组问题,求解答。

左眼看到鬼 2012-03-13 10:03:56
#include <stdio.h>
#define N 5
int main(void)
{
int i,j,tmp,m;
int a[N];
for(i=0;i<N;i++)
scanf("%d",&a[i]);
for(i=0;i<N;i++)
for(j=0;j<N-i;j++)
{
if(a[j]>a[j+1])
{
tmp = a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
for(i=0;i<N;i++)
printf("%d ",a[i]);
printf("\n");
printf("input a number:\n");
scanf("%d",&m);
for(i=0;i<N;i++)
{
if(m>a[i])
;
else{
for(j=N;j>i;j--)
a[j]=a[j-1];
a[i]=m; //这里不能把m的值赋给a【i】
break;
}
}
for(i=0;i<N+1;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}

1 3 5 7 9
1 3 5 7 9
input a number:
2
1 9 3 5 7 9

输出结果是这样的,不知道是什么问题。
...全文
171 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
ckcz123 2012-03-14
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 luckyaslan 的回复:]

引用 19 楼 bowen07 的回复:
我也看出来了,a[5]你没定义,你可以在插入的时候再声明一个b[N+1],把a中的内容拷给b就应该可以了

嗯,可以这样做,谢谢帮忙,
[/Quote]


所以我说建议你定义a[N+1]呗。。。
左眼看到鬼 2012-03-14
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 zhangtieqiang 的回复:]

引用 22 楼 luckyaslan 的回复:

引用 21 楼 ckcz123 的回复:

引用 20 楼 luckyaslan 的回复:

引用 19 楼 bowen07 的回复:
我也看出来了,a[5]你没定义,你可以在插入的时候再声明一个b[N+1],把a中的内容拷给b就应该可以了

嗯,可以这样做,谢谢帮忙,



所以我说建议你定义a[N+1]呗。。。

……
[/Quote]
刚学C语言不到一个月,呵呵,还有很多欠缺啊
zhangtieqiang 2012-03-14
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 luckyaslan 的回复:]

引用 21 楼 ckcz123 的回复:

引用 20 楼 luckyaslan 的回复:

引用 19 楼 bowen07 的回复:
我也看出来了,a[5]你没定义,你可以在插入的时候再声明一个b[N+1],把a中的内容拷给b就应该可以了

嗯,可以这样做,谢谢帮忙,



所以我说建议你定义a[N+1]呗。。。

恩,昨天晚上看的时候,用a【N+1】的时候,冒泡法那……
[/Quote]。。
zhangtieqiang 2012-03-14
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 luckyaslan 的回复:]

引用 21 楼 ckcz123 的回复:

引用 20 楼 luckyaslan 的回复:

引用 19 楼 bowen07 的回复:
我也看出来了,a[5]你没定义,你可以在插入的时候再声明一个b[N+1],把a中的内容拷给b就应该可以了

嗯,可以这样做,谢谢帮忙,



所以我说建议你定义a[N+1]呗。。。

恩,昨天晚上看的时候,用a【N+1】的时候,冒泡法那……
[/Quote]。。
左眼看到鬼 2012-03-14
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 ckcz123 的回复:]

引用 20 楼 luckyaslan 的回复:

引用 19 楼 bowen07 的回复:
我也看出来了,a[5]你没定义,你可以在插入的时候再声明一个b[N+1],把a中的内容拷给b就应该可以了

嗯,可以这样做,谢谢帮忙,



所以我说建议你定义a[N+1]呗。。。
[/Quote]
恩,昨天晚上看的时候,用a【N+1】的时候,冒泡法那出点问题,今天发现了,在排序的时候不把第N+1个地址的内容排进去就行了,谢谢了
左眼看到鬼 2012-03-13
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 bowen07 的回复:]
我也看出来了,a[5]你没定义,你可以在插入的时候再声明一个b[N+1],把a中的内容拷给b就应该可以了
[/Quote]
嗯,可以这样做,谢谢帮忙,
bowen07 2012-03-13
  • 打赏
  • 举报
回复
我也看出来了,a[5]你没定义,你可以在插入的时候再声明一个b[N+1],把a中的内容拷给b就应该可以了
左眼看到鬼 2012-03-13
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 phelovhl 的回复:]

本来a[5]你并没有定义,所以即使程序输出正确也只是恰好m的地址不在a[4]后面,不管怎么说,使用没定义的a[5]是不符合编程规范和代码风格的
引用 15 楼 luckyaslan 的回复:

引用 14 楼 phelovhl 的回复:

内存分配不是我们的代码可以决定,编译系统会决定具体如何分配地址空间,你最好还是让数组长度变大一点
引用 8 楼 luckyaslan 的回复:
……
[/Quote]恩,确实是这样。等明天看看老师怎么讲吧,很感谢你的帮忙,谢谢
phelovhl 2012-03-13
  • 打赏
  • 举报
回复
本来a[5]你并没有定义,所以即使程序输出正确也只是恰好m的地址不在a[4]后面,不管怎么说,使用没定义的a[5]是不符合编程规范和代码风格的
[Quote=引用 15 楼 luckyaslan 的回复:]

引用 14 楼 phelovhl 的回复:

内存分配不是我们的代码可以决定,编译系统会决定具体如何分配地址空间,你最好还是让数组长度变大一点
引用 8 楼 luckyaslan 的回复:

引用 4 楼 phelovhl 的回复:

内存空间实际上在分配的时候,m的地址是在数组之后,也就是在内存里实际上你所想要表示的a[5]代表的就是m。所以你判断完2比3小后,开始把数组往后挪,……
[/Quote]
左眼看到鬼 2012-03-13
  • 打赏
  • 举报
回复
谢谢楼上的各位朋友的帮忙
左眼看到鬼 2012-03-13
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 phelovhl 的回复:]

内存分配不是我们的代码可以决定,编译系统会决定具体如何分配地址空间,你最好还是让数组长度变大一点
引用 8 楼 luckyaslan 的回复:

引用 4 楼 phelovhl 的回复:

内存空间实际上在分配的时候,m的地址是在数组之后,也就是在内存里实际上你所想要表示的a[5]代表的就是m。所以你判断完2比3小后,开始把数组往后挪,这时把a[4]赋值给下一个地址,也就是m,所以这时……
[/Quote]
我重新定义了一个新的数组b【1】,来存放这个数,就可以了,但是我感觉这个道题这样考虑的话是不是考虑太多了,等明天老师把这个题讲完了我看看老师用什么方法吧
phelovhl 2012-03-13
  • 打赏
  • 举报
回复
内存分配不是我们的代码可以决定,编译系统会决定具体如何分配地址空间,你最好还是让数组长度变大一点
[Quote=引用 8 楼 luckyaslan 的回复:]

引用 4 楼 phelovhl 的回复:

内存空间实际上在分配的时候,m的地址是在数组之后,也就是在内存里实际上你所想要表示的a[5]代表的就是m。所以你判断完2比3小后,开始把数组往后挪,这时把a[4]赋值给下一个地址,也就是m,所以这时m的值已经被修改为9了,再用m来给a[1]赋值,a[1]输出当然是9

那应该怎么写才能让m的地址不在数组之后呢?不会收到数组地址的影响
[/Quote]
左眼看到鬼 2012-03-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zhutou100hao 的回复:]

你把注释中的相应地方改下就行了~~你排序用的是冒泡,但是你的好像有问题~~
[/Quote]
但是没有解决这个问题,
内存空间实际上在分配的时候,m的地址是在数组之后,也就是在内存里实际上你所想要表示的a[5]代表的就是m。所以你判断完2比3小后,开始把数组往后挪,这时把a[4]赋值给下一个地址,也就是m,所以这时m的值已经被修改为9了,再用m来给a[1]赋值,a[1]输出当然是9。
所以。。。。。
左眼看到鬼 2012-03-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zhutou100hao 的回复:]

你把注释中的相应地方改下就行了~~你排序用的是冒泡,但是你的好像有问题~~
[/Quote]
恩,冒泡法那应该是j=N-i-1;
猪头小哥 2012-03-13
  • 打赏
  • 举报
回复
你把注释中的相应地方改下就行了~~你排序用的是冒泡,但是你的好像有问题~~
左眼看到鬼 2012-03-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ckcz123 的回复:]

明白了。最开始定义a[N+1]再试试
[/Quote]定义N+1的话,在冒泡法排列的时候有问题,多定义的一个地址上面的内容是随机的
猪头小哥 2012-03-13
  • 打赏
  • 举报
回复
#include <stdio.h>

#define N 5

int main(void)
{
int a[10],i,j,t,m;
printf("Please input %d numbers: ",N); /*请输入十个合法的数字*/
for(i = 0; i < N; i++)
scanf("%d",&a[i]); /*将输入的合法的数字存储在数组a中*/
for(j = 0; j < N - 1; j++) /*第j趟比较*/
{
for(i = 0; i < N - 1 - j; i++) /*第j趟要比较的次数(9 - j)次*/
if(a[i] > a[i+1])
{
t = a[i]; /*将较大的数往后移*/
a[i] = a[i+1];
a[i+1] = t; /*最后肯定会冒出一个最大的数,并存储在a[i]中*/
}
}
printf("The sorted numbers: ");
for(i = 0; i < N; i++) /*最后按着从小到大的顺序打印出来*/
printf("%d ",a[i]);
printf("\n");

printf("input a number:\n");
scanf("%d",&m);
for(i = 0; i < N; i++)
{
if(m>a[i])
;
else{
for(j=N;j>i;j--)
a[j]=a[j-1];
a[i]=m; //这里不能把m的值赋给a【i】
break;
}
}
for(i = 0; i < N + 1; i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
左眼看到鬼 2012-03-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 phelovhl 的回复:]

内存空间实际上在分配的时候,m的地址是在数组之后,也就是在内存里实际上你所想要表示的a[5]代表的就是m。所以你判断完2比3小后,开始把数组往后挪,这时把a[4]赋值给下一个地址,也就是m,所以这时m的值已经被修改为9了,再用m来给a[1]赋值,a[1]输出当然是9
[/Quote]
那应该怎么写才能让m的地址不在数组之后呢?不会收到数组地址的影响
ckcz123 2012-03-13
  • 打赏
  • 举报
回复
明白了。最开始定义a[N+1]再试试
ckcz123 2012-03-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 luckyaslan 的回复:]

引用 3 楼 ckcz123 的回复:

我的天啊,,你不能把这句话放在i的for循环里面啊。。。

没有放在循环里啊,
for(j=N;j>i;j--)
a[j]=a[j-1]; //这里就结束循环了啊
a[i]=m;
[/Quote]


没看到break.......
加载更多回复(5)

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧