初学C语言,谁能帮我解释这个程序

virm 2005-06-08 12:12:08
请各位前辈看看这个程序,该如何改进
还有怎么才能描叙这个算法
以后我会定期把我的程序拿出来请大家检视,谢谢

代码如下:

#include<stdio.h>
#define N 10

main()
{
int i;
int a[N],x;

printf("\nPlease input nine integer:");
for (i=0;i<N-1;i++)
scanf ("%d",&a[i]);


printf ("\nPlease input an integer :");
scanf ("%d",&x);

for(i=N-1;i>0; --i)
{
if (x<a[i-1])
{
a[i]=a[i-1];
a[i-1]=x;
}
else
{
break;
}
}
for (i=0;i<N;i++)
printf("%d ",a[i]);
}
...全文
232 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
virm 2005-06-08
  • 打赏
  • 举报
回复
我假定用户输入了N-1个数,是排好序的
wolfzxq 2005-06-08
  • 打赏
  • 举报
回复
先对数组进行排序.再插入.
wolfzxq 2005-06-08
  • 打赏
  • 举报
回复
你的程序是不是想将X按升序插入到数组a[N]中(比如a[N]={1,2,3,5,6,7,8,9,10},X=4,你是不是想将4插入到5的前面?) 如果是这样的话你的代码不能达到目的,因为你的数组本身就是无序的(除非你自己按升序顺序输入).改进方法是先对数组进行排序.
「已注销」 2005-06-08
  • 打赏
  • 举报
回复
原来的程序是想让x从后边开始比较。。把x插到里边。。使得。。x后边的数都比他大。。而他前边一个比他小(或者相等)。。。
wolfzxq 2005-06-08
  • 打赏
  • 举报
回复
你的程序是不是想将X按升序插入到数组a[N]中?如果是这样的话你的代码不能达到目的,因为你的数组本身就是无序的(随便你自己按升序顺序输入).改进方法是先对数组进行排序.
「已注销」 2005-06-08
  • 打赏
  • 举报
回复
有一个问题。。如果a[8]>x;那么就直接跳出去了。。那么a[9]呢??
「已注销」 2005-06-08
  • 打赏
  • 举报
回复
单独的一句 i++ 或 ++i 作用是一样的,不少书上都说推荐写成 ++i 的形式,却从来没说明道理。
为什么要推荐写成 ++i 呢?
---------------------------------------------------------------

i++; // 有一个临时变量
++i; // 无临时变量
---------------------------------------------------------------

收的一篇文章:
////////////////////////////////////////////////////////////////////

for ( int i = 0; i < 100; i++ )
{
/* ............ */
}


但是很少有人想过代码背后隐藏的问题。读过STL源代码的人,都会对下面的代码一定很熟悉。


template<class _II, class _OI> inline
_OI copy( _II _F, _II _L, _OI _X )
{
for ( ; _F != _L; ++_X, ++_F )
*_X = *_F;
return (_X);
}
// 摘自Visual C++ 6.0 STL实现,文件:xutility。



为什么它不写成


template<class _II, class _OI> inline
_OI copy( _II _F, _II _L, _OI _X )
{for ( ; _F != _L; _X++, _F++ )
*_X = *_F;
return (_X);
}


看完这篇文章,你就可以知道这样写的理由。

C++是一种非常强大的语言,它赋予了它的使用者和他的创建者相同的权力。每一个内在的数据类型所支持的操作,你几乎都可以为自己定义的类型实现。运算符重载是其中的重要组成部分。

对于一个类CInt的运算符(这里只讨论加法),我们一般会这样实现:


class CInt
{
public:
CInt& operator ++();
CInt operator ++( int );
CInt& operator +=( const CInt& that );
};

CInt operator +( const CInt& this, const CInt& that );


其中,CInt& operator ++();对应于++i;(如果i是CInt的一个实例,下同)返回引用的原因是因为在C++里,++i的结果应该是一个左值。对这个函数的调用,除了运算本身以外,并没有什么开销。(除了隐含的this以外,无传递参数,只有一个引用返回值,所以没有新的实例被创建)
CInt operator ++( int ); 对应于i++;那个int是无意义的,只是为了把前缀运算和后缀运算区分开。返回变量(而不是引用)的原因是因为在C++里,i++的结果应该是一个右值,并且是i在没有加之前的值(所以不能返回它的const引用)。在这个函数中,会创建一个临时变量,并把它作为返回值拷贝给调用者。
CInt& operator +=( const CInt& that );对应于i = i + j;传递一个参数,从理论上来说,它的开销和++I的开销是一样的,但是,如果你只是要对类的实例加一的话,应该用++I,因为那个函数可能为加一而特别优化过。(具体可以参见实例)
CInt operator +( const CInt& this, const CInt& that );对应于k = i + j;这个函数的开销与i++相同,但是要注意的是,i++可能为加一而优化的。

为了能够显著的测出各个函数的具体效率,我使用了一个非常"大"的类,CVector,一个65536维的整型向量。测试结果为:

Another += One : 4326
Another++ : 9274
Another = Another + One : 9223
++Another : 2153

可以看出,同样是加一,++i可以比i++快很多。

当然,编译器的优化也很重要,在某些情况下,编译器可以将i++的速度优化到和++i一样。但是,为什么不直接写出++i呢?这样可以保证在任何情况下都能获得较快的执行速度,而不是去依赖于编译器的优化。(至少,Visual C++ 6.0是不支持的)
-------------------------
源文:http://oldblog.blogchina.com/article_39872.834063.html

http://blog.csdn.net/gigix/archive/2002/06/27/2342.aspx
phoenixmax 2005-06-08
  • 打赏
  • 举报
回复
++i 和 i++ 相比,++i的效率能比i++高一点,所以应该优先使用++i,
能告诉我为什么这样吗?
我是实在菜的啊
希望指教
zhaokugua 2005-06-08
  • 打赏
  • 举报
回复
第一个程序问题很多啊,不过改过之后到基本没问题了,在此提一个小问题:

++i 和 i++ 相比,++i的效率能比i++高一点,所以应该优先使用++i,--一样,
虽然不是什么大问题,但C程序以效率著称,所以要不断提高程序的效率。
hanxingwuqing 2005-06-08
  • 打赏
  • 举报
回复
改过的程序我运行过了,没发现问题
jixingzhong 2005-06-08
  • 打赏
  • 举报
回复
if (x<a[i-1])
{
a[i]=a[i-1];
a[i-1]=x;
}


a[i-1]=x;
是多余的语句!!
纯粹是浪费系统的资源哦。


程序已经对了。
flying_no_9 2005-06-08
  • 打赏
  • 举报
回复
要先排序再说,不然的话出现的结果很难预料.
flying_no_9 2005-06-08
  • 打赏
  • 举报
回复
忙!
明天再说.
virm 2005-06-08
  • 打赏
  • 举报
回复
这是我重写过后的程序,请各位前辈看一下,
是否还须有改进的?谢谢!
#include<stdio.h>
#define N 10

main()
{
int i,j,temp;
int a[N],x;

printf("\nPlease input nine integer:");
for (i=0;i<N-1;i++)
scanf ("%d",&a[i]);
for (i=N-2;i>0;i--)
{
for (j=0;j<i;j++)
{
if (a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1] =temp;
}
}

}

printf ("\nPlease input an integer :");
scanf ("%d",&x);


for(i=N-1;i>0; --i)
{
if (x<a[i-1])
{
a[i]=a[i-1];
a[i-1]=x;
}
else
{
a[i]=x;
break;
}


}
for (i=0;i<N;i++)
printf(" %d",a[i]);
}
「已注销」 2005-06-08
  • 打赏
  • 举报
回复
我假定用户输入了N-1个数,是排好序的
----------------------------
这也可以。。昏。。重写把。。。

33,316

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧