#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void sort(int a[],int n)
{ int i,j,t
for(i=0 i<n-1 i++) //共进行n-1轮
{ for(j=0 j<n-1-i j++) //j的范围:0~n-1-i
if(a[j]>a[j+1]) //比较相邻两数:a[j]、a[j+1],如不对就交换
{ t=a[j]
a[j]=a[j+1]
a[j+1]=t
}
}
}
int main()
{ int n,i,a[10000]
scanf("%d",&n)
srand(time(0))
for(i=0 i<n i++)
{ a[i]=rand()%100
printf("%4d",a[i])
}
printf("\n")
sort(a,n)
for(i=0 i<n i++)
printf("%4d",a[i])
printf("\n")
return 0
}
一群菜鸟不懂的乱说。 我把楼主的代码改了一些,如下 #include<stdio.h>int input(int data[], int argc, int *n){
int i
printf("请输入要输入数的个数")
scanf("%d", n)
if(*n >argc) {
printf("segment fault!")
return -1
}
for(i = 0i <*ni++) {
printf("输入的第%d个数.", i+1)
scanf("%d", data+i)//canf("%d", &data[i])
}
printf("输入的数是:\n")
for(i = 0i <*ni++) {
printf("%5d\n", data[i])
}
return 0
}void sort(int n, int data[])
{
int i, j, temp
for(i = 0i <n-1i++) {
for(j = i+1j <nj++)
if(data[i] <data[j]) {
temp = data[i]
data[i] = data[j]
data[j] = temp
}
}
printf("排序后的结果如下:\n")
for(i = 0i <ni++)
printf("%5d\n", data[i])
}int main()
{
int data[100]
int n
if(input(data, 100, &n) == -1)
return -1
sort(n, data)
return 0
}
对于以上代码,做出如下解释:(1)C语言的参数有形参和实参的说法,形参在传递到函数内的时候,复制一个副本给函数,在函数内部和外部是两个完全不同的变量,函数结束,空间也被释放,所以不能在函数内部来改变外部的值。所以要像楼主这样用一个函数给一个变量赋值,要用实参int input(int data[], int argc, int *n)中的int *n就是实现形式,这种办法把n的地址传递给函数。当然,在调用函数的时候也同样要传递地址指针类型(&n)。(2)if(*n >argc) {
printf("segment fault!")
return -1
}这一段是我加进去的,因为按照楼主的意思,data数组的长度也要传递进去,但是意思何在?所以只好加了这一段,并把函数改为有类型的,以检验是否有数据溢出。(3)scanf("%d", data+i)//scanf("%d", &data[i])这里我改动的主要原因是为了提升程序速度,scanf("%d", &data[i])同样可以运行,但是寻址一次,又回头要地址,这样绕了一圈,没有必要。 对于楼主提几点建议:(1)C语言的精髓在于指针,刚才说到的实参,就是用指针的概念实现的。scanf("%d", data+i)一行,同样也是把数组头指针加上偏移地址,得到所要的地址。(2)C语言编程的时候特别要注意数据的溢出,这是所有初学者头疼的问题之一。建议在一开始就养成习惯,经常检验数组的边界。(3)void main一看就知道是看潭浩强的书长大的程序员。建议我们都用int main(){ return 0}的形式,可以看看C语言之父K&R的书。主函数的返回值是告诉操作系统,这个函数是正常退出(返回0),还是异常退出(非0,经常是-1)。(4)在做实际项目的时候,程序经常是要回头看的,也经常是要给别人看以达到维护的目的的。除了要养成良好的文档书写习惯以外(学习软件工程以后你就会掌握),还要养成良好的编程风格,这里我建议看《thinking in C++》,并按照里面例题的风格,养成自己的习惯。
sort不属于C语言的标准函数,所以也没有相应的头文件,但是可以自定义。
sort 函数为将整型数组从小到大排序。
voidsort(int*a,intl)//a为数组地址,l为数组长度。
{
inti,j
intv
//排序主体
for(i=0i<l-1i++)
for(j=i+1j<lj++)
{
if(a[i]>a[j])//如前面的比后面的大,则交换。
{
v=a[i]
a[i]=a[j]
a[j]=v
}
}}
扩展资料
c语言自有的qsort函数
#include<stdio.h>
#include<stdlib.h>
intcomp(constvoid*a,constvoid*b)//用来做比较的函数。
{
return*(int*)a-*(int*)b
}
intmain()
{
inta[10]={2,4,1,5,5,3,7,4,1,5}//乱序的数组。
inti
qsort(a,n,sizeof(int),comp)//调用qsort排序
for(i=0i<10i++)//输出排序后的数组
{
printf("%d\t",array[i])
}
return0
}