
楼主,你的程序中确实存在隐患,不过好在被你的测试数据给发现了。变量r和u定义后没有初始化,导致它们可能具有非常大的值,而循环体也不能保证一定对它们重新赋值,这样最后用它们来做数组的下标很可能要越界的。
你的第二组数据,第一个是5,我们可以断定它就是最大值了,这样循环体中的else if的字句始终不会执行,u一直没有赋值,后面a[u]=e直接用u的值作隐族下标是不合适的。
其实楼主在循环开始前对max和min进行了初始化,建议你在这里先把u和r都赋为0,用它们当数组的下标,像min=a[r],以和你灶枝弊后面的风格一致。这样应该可以对所有合法数据通过了吧。
今天又看了一下,发觉这里面还有一个问题,楼主可以试试5,1,3,4,2,1就被覆盖掉了。我在你最后的两次交换之间加了个判断。这是改后的代码。
#include<stdio.h>
main()
{
int a[9],n,i,min,r,max,u,e//n表示输入数据的个数(小于10),r表示最小值的下标,u表示最大值的下标,e用于换值。
scanf("%d",&n)
scanf("%d",&a[0])
min=a[0]
r=0
max=a[0]
u=0
for(i=1i<ni++)
{
scanf("%d",&a[i])
if(min>a[i])
{
min=a[i]
r=i
}//挨个搜寻最小值,并记下下标
else if(max<a[i])
{
max=a[i]
u=i
} //挨个搜寻最大值,并记下下标
}//如果最后一个else什么也不做则不必带,C语言不要求if必须带else。
e=a[0]
a[0]=min
a[r]=e//最小值和第一个数交换
if(e==max)//如果原来的第一个数恰好是最大值,则更新前面循环所记录的最大值对应的下标u
u=r
e=a[n-1]
a[n-1]=max
a[u]=e//最大值和最后一个交换
for(i=0i<=n-1i++)
printf("%d ",a[i])//输出交换后
printf("\n")//最后加个换行,看着终端的新提示符被挤到一旁去了挺不爽的。
}
Gcc最基本的用法是∶gcc [options] [filenames] 其中options就是编译器所需要的参数,filenames给出相关的文件名称。 -c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代此裂码文件生成.o为后缀的目标文件,森亩闭通常用于编译不包含主程序的子程序文件。 -o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个耐中选项,gcc就给出预设的可执行文件a.out。 -g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。 -O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。 -O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢.例子:
gcc -o test test.c
结果生成可执行文件test
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)