用C语言写的一个程序:有一个已排好的数组,要求输入一个数后,按原来排序的规律将它插入数组中。

#include<stdio.h>
int main()
{
int a[20],i,n,x,k;
printf("请输入一组顺序数(从小到大的顺序):");
for(i=0;getchar()!='\n';i++)
scanf("%d",&a[i]);
n=i; //n表示数组内数字的个数
printf("请输入需要插入的数:");
scanf("%d",&x);
for(i=0;i<n;i++)
if(x<a[i])
{
for(k=n-1;k>=i;k--)
a[k+1]=a[k];
a[i]=x;
break;
}
else a[n]=x;
for(i=0;i<=n;i++)
printf("%d ",a[i]);
printf("\n");
}
我是想自己输入数字,用空格分开,系统自己算出数字个数,在进行插入排序,但是总是输不出结果,我觉得问题是出在什么“输入缓冲区”里,有哪位高手可以指点一下吗?急需,谢谢!

第1个回答  推荐于2018-03-21
主要有两个问题:
第一:for(i=0;getchar()!='\n';i++)==>for循环里,每次执行前先检测getchar()!='\n',而我们需要的是要在输入数字后再检查是否输入回车,所以放在循环后面:

for( i=0; ;i++ )
{
scanf("%d",&a[i]);
if( getchar() == '\n' )
break;
}
第二:i 是从0开始计数的,所以数组数还要加1.比如输入0 1 2 3,i为3,但是是4个数。

//如下能正常运行:
#include <stdlib.h>
#include <stdio.h>
int main()
{
int a[20],i,n,x,k;
printf("请输入一组顺序数(从小到大的顺序):");
for( i=0; ;i++ )
{
scanf("%d",&a[i]);
if( getchar() == '\n' )
break;
}
n = i + 1; //n表示数组内数字的个数
printf("请输入需要插入的数:");
scanf("%d",&x);
for(i=0;i<n;i++)
{
if( x<= a[i] )
{
for( k= n-1; k >= i; k--)
{
a[k+1]=a[k];
}
a[i]=x;
break;
}
}
for(i=0;i<=n; i++)
{
printf("%d ",a[i]);
}
printf("\n");
system("pause");
}追问

你好,我还是不太理解为什么先检查是否输入回车和先赋值会有这么大的不同,能详细解释一下吗?

追答

对于for循环,for( 表达式1; 表达式2; 表达式3 )
第一次循环前执行表达式1;每次循环前都执行表达式2;然后执行大括号里的内容。每次执行完大括号里的后,都要执行表达式3.
考虑你实际的输入情况,for开始后,如果你打算输入三个数:1 2 3.
那么你的按键是这样的: 1 空格 2 空格 3 回车
那么for循环里就应该这样执行的:
i为0==》scanf("%d",&a[0]); ==》getchar()是空格不是'\n',继续进入下一个循环==》依次类推

加入是你写的这样:
for(i=0;getchar()!='\n';i++)

{
scanf("%d",&a[i]);

}
那么,根据上面for循环的执行规则,程序先执行getchar()等待你输入,但是你第一个输入的是1,往后的全乱套了。

本回答被提问者采纳
第2个回答  2012-11-04
代码如下:
#include<stdio.h>
int main()
{
int a[20],i=0,n,x,k,j;
printf("请输入一组顺序数(从小到大的顺序):");
while(~scanf("%d", &a[i]))
{
i++;
if(getchar() == '\n') break; //在这判断,否则原先的第一个数字读不进去
}
n=i;
for(i=0;i<n;i++) printf("%d ",a[i]);
printf("请输入需要插入的数:");
scanf("%d",&x);
if(a[0]>x) // 如果插入的数字比第一个还小,a[0]=x
{
for(j=n;j>=1;j--) a[j] = a[j-1];
a[0] = x;
}
else if(a[n-1]<x) a[n]=x; // 如果比最后一个还大,a[n]=x
else
for(i=0;i<n-1;i++) //在中间
{
if(a[i]<=x && a[i+1]>=x) //找到位置
{
for(j=n;j>=i+2;j--) a[j] = a[j-1]; // 从后往前赋值
a[i+1] = x; //
break;
}
}
for(i=0;i<=n;i++) printf("%d ",a[i]);
printf("\n");
}本回答被网友采纳

...序的数组,要求输入一个数后,按原来排序的规律将它插入数组中_百度知 ...
本程序首先对数组a中的10个数从大到小排序并输出排序结果。然后输入要插入的整数n。再用一个for语句把n和数组元素逐个比较,如果发现有n>a[i]时,则由一个内循环把i以下各元素值顺次后移一个单元。后移应从后向前进行(从a[9]开始到a[i]为止)。 后移结束跳出外循环。插入点为i,把n赋予a[i...

...序的数组,要求输入一个数后,按原来排序的规律将它插入数组中。_百度...
C语言,有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中。解:include int main(){ int a[11]={1,4,6,9,13,16,19,28,40,100};int temp1,temp2,number,end,i,j;printf("array a:\\n");for (i=0;i<10;i++)printf("%5d",a[i]);printf("\\n");pri...

有一个已经排好序的数组,现输入一个数,要求按原来的规律将它插入数组中...
【答案】:程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。程序源代码如下。main(){ int a[11]=(1,4,6,9,13,16,19,28,40,100};int tempI,temp2,number,end,i,j;printf("original array is:\\n");for(i=0:i<10...

...序的数组,要求输入一个数后,按原来排序的规律将它插入数组中。_百度...
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]);}...

...要求从键盘输入一个数后,按原来排序的规律将它插入数组中_百度知 ...
include <stdlib.h> include <stdio.h> int main(){ int a[20],i,n,x,k;printf("请输入一组顺序数(从小到大的顺序):");for( i=0; ;i++ ){ scanf("%d",&a[i]);if( getchar() == '\\n' )break;} n = i + 1; \/\/n表示数组内数字的个数 printf("请输入需要插入...

...序的数组,今输入一个数,要求按原来排序的规律将它插入数组中。”_百...
输入12,输出结果如下:总结:一组数组,直到找到大于或等于输入数的时候,找到插入数的下标,a[i+1]=a意思是将a的值给a[i+1],往后移一个(插入一个数,后面元素依次往后移动一个)方法二、include<stdio.h> void main(){ int data,temp,k;static int a[9]={-10,2,4,8,10,15,25,50...

...序的数组,要求输入一个数后,按原来排序的规律将它插入数组中。数组就...
本程序首先对数组a中的10个数从大到小排序并输出排序结果。然后输入要插入的整数n。再用一个for语句把n和数组元素逐个比较,如果发现有n>a[i]时,则由一个内循环把i以下各元素值顺次后移一个单元。后移应从后向前进行(从a[9]开始到a[i]为止)。 后移结束跳出外循环。插入点为i,把n赋予a[i...

有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中...
int[] C = insert(a,B);print(C);} \/\/ 选择排序 private static int[] sort(int[] A){ int[] B = new int[A.length];for(int i=0;i<A.length-1;i++){ int min = A[i];for(int j=i+1;j<A.length;j++){ if(min>A[j]){ int temp = min;min = A[j];A[j] ...

在c语言中,将一个数插入一个数组中的程序怎么写?
有一个已排好序(从大到小)的数组有5个元素,从键盘输入一个数,要求按原排序的规律将它插入到数组中1.#include<stdio.h>void main({int i,x,j; int {1,5,10,15,20}; scanf("%d",&x);for(i=0;i<5;i++) if(x=j;i--)a[i+1]=a[i]; \/*将位置j以后的数据都向后移一位...

...90},现输入一个数,要求按原来的规律将它插入数组中
main(){ int i,j,t,a[10]={10,20,30,40,50,60,70,80,90};printf("请输入一个数:\\n");scanf("%d",&a[9]);for(i=0;i<9;i++)if(a[9]=i;j--){ a[j+1]=a[j];a[j]=t;} } for(i=0;i<10;i++)printf("%d ",a[i]);return 0;} 改正了。认真看看那两个f...

相似回答