c语言怎么用自定义函数排序

Python023

c语言怎么用自定义函数排序,第1张

#include <stdio.h>

#include <string.h>#define NUM 3

struct student

{

char name[20] /*姓名*/

long num /*12位学号*/

double sum /*总分*/

}

void Create_Students(struct student stu[NUM])

{

struct student *p

printf("请输入学生姓名 学号(12位) 总分:\n")

for( p = stup <stu+NUMp++)

{

scanf("%s %d %lf",p->name,&p->num,&p->sum)}

}

void Order_Students(struct student stu[NUM])//起泡法

{

int i,j

struct student temp

for(i=NUM-1i>=0i--)

for(j=0j<ij++)

if(stu[j].sum<stu[j+1].sum)

{

temp = stu[j]

stu[j] = stu[j+1]

stu[j+1]=temp

}

}

void main()

{

int i=1

struct student *p

struct student stu[NUM]

Create_Students(stu)

Order_Students(stu)

printf("%-20s %-13s %-6s %4s\n","姓名","学号(12位)","总成绩","名次")

for(p=stup<stu+NUMp++,i++)

{

printf("%-20s %-13.0d %-8.2f %2d\n",p->name,p->num,p->sum,i)

}

}//你参考参考,嘿

一群菜鸟不懂的乱说。 我把楼主的代码改了一些,如下 #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++》,并按照里面例题的风格,养成自己的习惯。