C编程的一个小题目:有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中。

自己写了个挺傻的程序#include<stdio.h>intmain(){inti,j,k,a[]={3,5,7,9,10,12,35},b[8];printf("请输入... 自己写了个挺傻的程序

#include <stdio.h>

int main()
{
int i,j,k,a[]={3,5,7,9,10,12,35},b[8];

printf("请输入需要插入的数:");
scanf("%d",&k);

for(i=0,j=0;i<7;i++,j++)
{
if(i==j)
{
if(k<a[i])
{
b[j]=k;
j=j+1;
}
if(i==6)
b[j+1]=k;
}
b[j]=a[i];

}

printf("原数组为:");
for(i=0;i<7;i++)
printf("%5d",a[i]);

printf("\n");

printf("新数组为:");

for(j=0;j<8;j++)
printf("%5d",b[j]);

printf("\n");

return 0;
}

已经知道把if(i==6)这里的i换成j就是对的,但是没想通为什么不改的话,程序会出现个奇怪的结果:

为什么第一个数组也改变了?

第一次用百度提问,望有大神帮小白解答一下。谢谢。。
展开
 我来答
问明6E
高粉答主

2019-05-30 · 每个回答都超有意思的
知道答主
回答量:279
采纳率:100%
帮助的人:12.4万
展开全部

#include&lt;stdio.h&gt;

int main()

{

int a[11]={1,4,6,9,13,16,19,28,40,100};

int temp,i=0,j=0;

scanf("%d",&temp);

for(i=9;i&gt;=0;i--)

{

if(temp&lt;a<i>){

a[i+1]=a<i>;

}else{

a[i+1]=temp;

break;

}

}

for(i=0;i&lt;11;i++)

{

printf("%d\t",a<i>);

}

system("pause");

return 0;

}

扩展资料:

printf用法:

printf()函数的调用格式为:printf("&lt;格式化字符串&gt;",&lt;参量表&gt;)。

其中格式化字符串包括两部分内容:一部分是正常字符,这些字符将按原样输出;另一部分是格式化规定字符,以"%"开始,后跟一个或几个规定字符,用来确定输出内容格式。

参量表是需要输出的一系列参数,其个数必须与格式化字符串所说明的输出参数个数一样多,各参数之间用","分开,且顺序一一对应,否则将会出现意想不到的错误。

比如:

int a=1234;

printf("a=%d\n",a);

输出结果为a=1234。

printf的格式控制的完整格式:

%-0 m.n l或h格式字符

下面对组成格式说明的各项加以说明:

①%:表示格式说明的起始符号,不可缺少。

②-:有-表示左对齐输出,如省略表示右对齐输出。

③0:有0表示指定空位填0,如省略表示指定空位不填。

④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。N指精度。用于说明输出的实型数的小数位数。为指定n时,隐含的精度为n=6位。

⑤l或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。

geniepengsz
推荐于2017-12-16 · TA获得超过2万个赞
知道大有可为答主
回答量:1.2万
采纳率:97%
帮助的人:2212万
展开全部

调试了一下,是末尾补值语句有逻辑错误,如下图:

数组a[],b[]在编译后在内存中是相邻的,即b[7]之后紧接a[0],在i=6时,b[]插入了23,j变成7,又走到i==6的判断,执行了b[j+1]=k语句,此时是b[8]=k(数组越界),b[8]就是a[0]的地址,故看到a[0]被赋值23.i==6的逻辑判断不严密。

 

修改代码和注释如下:

#include <stdio.h>

int main()

{

 int i,j,k,a[]={3,5,7,9,10,12,35},b[8];

 char flag_inserted=0;  //增加1个已完成插入的标志,中间插入与后边补值互斥

 printf("请输入需要插入的数:");

 scanf("%d",&k);

 for(i=0,j=0;i<7;i++,j++)

 {

  if(i==j)

  {

   if(k<a[i])

   {

    b[j]=k;

    j=j+1;

    flag_inserted=1;

   }

   //if((i==6)   //需要过滤已插入值的情况

   if((i==6)&&(flag_inserted==0))  

    b[j+1]=k;

  }

  b[j]=a[i];

 }

 printf("原数组为:");

 for(i=0;i<7;i++)

  printf("%5d",a[i]);

 printf("\n");

 printf("新数组为:");

 for(j=0;j<8;j++)

  printf("%5d",b[j]);

 printf("\n");

 return 0;

}

在VC6调试通过,如下图:

供参考。

本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式