| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 767 人关注过本帖
标题:为什么这个程序的运行结果是这样的,求解..
取消只看楼主 加入收藏
cangogo
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2015-4-28
结帖率:0
收藏
已结贴  问题点数:20 回复次数:6 
为什么这个程序的运行结果是这样的,求解..
问题是:已有一个已排好序的数组,输入一个数,要求按原来的排序规律将它插入到数组中。
我的程序是:
#include "stdio.h"
#define N 7
void paixu(int k,int *a);
void main()
{
 int i,a[N]={586,513,489,284,106,46,24};
 printf("the former array is:\n");
 for(i=0;i<N;i++)
 printf("%-5d",a[i]);
 printf("\ninput a Num:");
 scanf("%d",&i);
 paixu(i,a);
 for(i=0;i<=N;i++)
 printf("%-5d",a[i]);  
}
void paixu(int k,int *a)
{
 int t=N,i=N,j=0;
  while(1)
  {
      if(k>=a[j])
      {while(i>j)
       a[t--]=a[--i];
       a[j]=k;
       break;}
      j++;
  }
}
图片附件: 游客没有浏览图片的权限,请 登录注册

注:明明测试过当时赋值时a[N]是24的,不知道为什么运行后结果就变为7了。是不是要扩展数组长度?唉...
搜索更多相关主题的帖子: include former 
2015-04-28 18:13
cangogo
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2015-4-28
收藏
得分:0 
回复 3楼 林月儿
你试下int i,length=7,a[N]={586,513,489,284,106,46,24}; 这样声明,为什么不可以了...好奇试了试,如果intlength=7 ,i,a[N]={586,513,489,284,106,46,24};或者int i,length,a[N]={586,513,489,284,106,46,24}; length=7和你那样的声明就可以程序通过。好奇怪...想知道原理,是我编译器问题么,你也试试。
2015-04-29 18:42
cangogo
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2015-4-28
收藏
得分:0 
回复 2楼 情.难言ゝ
#include "stdio.h"
#include "stdlib.h"
#define N 7
int length=N;
void paixu(int k,int *a);
void main()
{
int i,*p,a[N]={586,513,489,284,106,46,24};
p=(int*)malloc((N+1)*sizeof(int));
printf("the former array is:\n");
for(i=0;i<length;i++){
*(p+i)=a[i];
printf("%-5d",a[i]);}
printf("\ninput a Num:");
scanf("%d",&i);
paixu(i,p);
for(i=0;i<=N;i++)
printf("%-5d",p[i]);
free(p);  
}
void paixu(int k,int *a)
{
int x=N,j=0;
  while(1)
  {
      if(k>=a[j])
      {while(length>j)
       a[x--]=a[--length];
       a[j]=k;
       break;}
      j++;
  }
}
扩展以后确实可以了,数组一开始就固定了吧,超过数组长度的值都是垃圾值,所以只能另起一个动态数组了,谢谢~
2015-04-29 19:41
cangogo
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2015-4-28
收藏
得分:0 
回复 6楼 liangrongye
#include<stdio.h>
#define N 8
void paixu(int val,int *a);
int main()
{
int i,a[N]={586,513,489,284,106,46,24};
printf("the former array is:\n");
for(i=0;i<N-1;i++)
printf("%d ",a[i]);
printf("\n");
printf("input a Num:");
scanf("%d",&i);
paixu(i,a);
for(i=0;i<N;i++)
printf("%d ",a[i]);
return 0;
}
void paixu(int val,int *a)
{
int i=0,j;
  while(i<N)
  {
      if(val>=a[i]){
        for(j=N-1;j>i;--j)
            a[j]=a[j-1];
        a[i]=val;
        break;
      }
      i++;
  }
}
你之前的代码while((i++)<N)是不能排到最大位数的,因为从循环开始就略过了a[0],以至于val无法与a[0]比较,帮你改写了下成品,这样应该没问题了。
2015-04-29 20:56
cangogo
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2015-4-28
收藏
得分:0 
回复 5楼 林月儿
嗯,我知道。但我不解int i,length=7,a[N]={586,513,489,284,106,46,24};为什么这个声明却不可以得到正确结果,你看看,好奇怪喔= =...是内存存入原理吗,唉。
2015-04-29 21:02
cangogo
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2015-4-28
收藏
得分:0 
回复 15楼 林月儿
......我知道你的意思,有效长度和实际数组分配内存长度的问题我懂。可是我不太解的是length这个变量的声明顺序位置为什么会影响到运行结果。我试了好几个length的声明位置。像intlength=7 ,i,a[N]={586,513,489,284,106,46,24};或者int i,length,a[N]={586,513,489,284,106,46,24}; length=7;或者你那样的i,a[N]={586,513,489,284,106,46,24},intlength=7 ;都可以运行得到正确结果。然而int i,length=7,a[N]={586,513,489,284,106,46,24}; 这种顺序位置的声明却得到错误的结果,其他代码一概没动过...所以我好奇为什么会有这种原因,还是就我的编辑器有问题,不然你试试看看。
2015-04-29 21:35
cangogo
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2015-4-28
收藏
得分:0 
回复 17楼 林月儿
就是你那个程序代码除了像那样改变了一下length的变量声明位置,其余的一概没变动过...
2015-04-29 21:45
快速回复:为什么这个程序的运行结果是这样的,求解..
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.056245 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved