使用指针与不使用指针的区别以及int (*compare)(int a,int b)的用法

来源:互联网 发布:外汇模拟软件下载 编辑:程序博客网 时间:2024/05/16 16:05

同样的功能效果

不使用指针代码如下:

/*指针与普通代码的比较*/
#include<stdio.h>
#define N 40

int ReadScore(int score[])
{
    int i = -1;
    do{
        i++;
        printf("输入成绩:");
        scanf("%d",&score[i]);
    }while(score[i]>=0);
        return i;
}

void PrintScore(int score[],int n)
{
    int i;
    for(i = 0;i<n;i++)
    {
        printf("%4d",score[i]);
    }
    printf("\n");
}

void AscendingSort(int a[],int n)
{
    int i,j,k,temp;
    for(i = 0;i<n-1;i++)
    {
        k = i;
        for(j = i+1;j<n;j++)
        {
            if(a[j]<a[k])
            {
                k = j;
            }
        }
        if(k!=i)
        {
            temp = a[k];
            a[k] = a[i];
            a[i] = temp;
        }
    }
}

void DescendingSort(int a[],int n)
{
    int i,j,k,temp;
    for(i = 0;i<n-1;i++)
    {
        k = i;
        for(j = i+1;j<n;j++)
        {
            if(a[j]>a[k])
            {
                k = j;
            }
        }
        if(k!=i)
        {
            temp = a[k];
            a[k] = a[i];
            a[i] = temp;
        }
    }
}

int main(){
    int score[N],n;
    int order;
    n = ReadScore(score);
    printf("总计人数:%d\n",n);
    printf("输入1升序,输入2降序:");
    scanf("%d",&order);
    printf("原成绩:\n");
    PrintScore(score,n);
    if(order == 1)
    {
        AscendingSort(score,n);
        printf("升序:\n");
    }else{
        DescendingSort(score,n);
        printf("降序\n");
    }
    PrintScore(score,n);
    return 0 ;
}



使用指针代码如下:

#include<stdio.h>
#define N 40

int ReadScore(int score[])        //录入成绩,没的说
{
    int i = -1;
    do{
        i++;
        printf("输入成绩:");
        scanf("%d",&score[i]);
    }while(score[i]>0);
    return i;
}

void PrintScore(int score[],int n)        //输出成绩
{
    int i;
    for(i=0;i<n;i++)
    {
        printf("%4d",score[i]);
        /*************
        %4d是printf的格式化参数,表示输出一个整型数值,输出宽度为4,且右对齐,如:
        printf( "%4d", 1 );
            1     //输出1的前边有3个空格,补齐4位的宽度
        printf( "%4d", 11);
          11    //输出11前边有2个空格,补齐4位的宽度
        printf( "%4d", 11111 );
        11111  //因为超过了4位,所以前边没有空格
        如果要左对齐,则改为 %-4d
        *********************/
    }
    printf("\n");
}

void SelectionSort(int a[],int n,int (*compare)(int a,int b))        //交换法排序
{
    int i,j,k,temp;
    for(i = 0;i<n-1;i++)
    {
        k = i;
        for(j=i+1;j<n;j++)
        {
            if((*compare)(a[j],a[k]))        //调用指针compare指向的函数
            {
                k = j;
            }
        }
        if(k!=i)
        {
            temp = a[k];
            a[k] = a[i];
            a[i] = temp;
        }
    }
}

int Asending(int a,int b)        //使用数据升序排序
{
    return a<b;
}

int Descenging(int a,int b)
{
    return a>b;
}

int main()
{
    int score[N],n;
    int order;
    n = ReadScore(score);
    printf("总人数:%d\n",n);
    printf("升序输1,降序输2:\n");
    scanf("%d",&order);
    printf("原顺序:\n");
    PrintScore(score,n);
    if(order == 1){
        SelectionSort(score,n,Asending);
        printf("升序:");
        }else{
            SelectionSort(score,n,Descenging);
            printf("降序:\n");
            }
            PrintScore(score,n);
            return 0;
}



/**********************
int (*compare)(int a,int b)表示:compare --> * --> () --> int,告诉我们形参compare是一个指针变量,指向一个两个整形形参、返回值为整型的函数
而int *compare(int a,int b)表示:compare --> () --> * -->int,它声明的是一个两个整型参数并返回整型指针的函数
函数SelectionSort()用函数指针作为形参,既可以指向函数Asending(),也可以指向Descenging(),
主函数里,用户输入1,则用函数名Asending作为函数实参调用SelectionSort(),将指向函数Asending()的指针传给SelectionSort(),使数组a按升序排序
************************/

阅读全文
1 0
原创粉丝点击