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

#include<stdio.h>intmain(){inta[20],i,n,x,k;printf("请输入一组顺序数(从小到大的顺序):");for(i=0;getc... #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");
}
我是想自己输入数字,用空格分开,系统自己算出数字个数,在进行插入排序,但是总是输不出结果,我觉得问题是出在什么“输入缓冲区”里,有哪位高手可以指点一下吗?急需,谢谢!
展开
 我来答
百度网友1e2806e6f
推荐于2018-03-21 · 超过29用户采纳过TA的回答
知道答主
回答量:62
采纳率:0%
帮助的人:84.6万
展开全部
主要有两个问题:
第一: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,往后的全乱套了。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wanglixin1001
2012-11-04 · TA获得超过4173个赞
知道大有可为答主
回答量:1758
采纳率:80%
帮助的人:854万
展开全部
代码如下:
#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");
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式