C编程的一个小题目:有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中。
#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就是对的,但是没想通为什么不改的话,程序会出现个奇怪的结果:
为什么第一个数组也改变了?
第一次用百度提问,望有大神帮小白解答一下。谢谢。。 展开
#include<stdio.h>
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>=0;i--)
{
if(temp<a<i>){
a[i+1]=a<i>;
}else{
a[i+1]=temp;
break;
}
}
for(i=0;i<11;i++)
{
printf("%d\t",a<i>);
}
system("pause");
return 0;
}
扩展资料:
printf用法:
printf()函数的调用格式为:printf("<格式化字符串>",<参量表>)。
其中格式化字符串包括两部分内容:一部分是正常字符,这些字符将按原样输出;另一部分是格式化规定字符,以"%"开始,后跟一个或几个规定字符,用来确定输出内容格式。
参量表是需要输出的一系列参数,其个数必须与格式化字符串所说明的输出参数个数一样多,各参数之间用","分开,且顺序一一对应,否则将会出现意想不到的错误。
比如:
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型。
调试了一下,是末尾补值语句有逻辑错误,如下图:
数组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调试通过,如下图:
供参考。