回 帖 发 新 帖 刷新版面

主题:高手帮帮忙

在函数中进行 10个学生成绩从高到低排名, 再改进函数, 进行 n个学生成绩从高到低排名, 排名方式根据函数的style参数进行,如style为‘a'按升序排,style为 ' d ' 按降序排。 ( a:ascending 升,d:descending 降) 
编写多个不同函数,使之能实现不同的排序算法(3种以上),再编写一个通用输出函数,(要求用函数指针做参数)能分别打印不同排序算法的结果。
步骤、方法与要求
1.    在函数中进行10个学生成绩从高到低排名 sort(int a[10])
2.    改进第一步的函数为sort(int a[],int n),进行n个学生成绩从高到低排名,
3.    改进第二步的函数为sort(int a[],int n, char style), 将n个学生成绩从高到低排名,排名方式根据sort()函数的style参数进行,如style为‘a’按升序排,style为’d’按降序排。
(a:ascending  升,d:descending 降)
4.     编写4个排序函数,实现4种不同的排序算法(用冒泡法进行升序排序,用冒泡法进行降序排序,选择法进行升序排序,选择法进行降序排序等),函数返回指向排好序的数组的指针。
5.    编写通用输出函数 show(int  *(* fun)(a[ ], int n )),其中a[]为成绩数组,n为数组元素个数。
6.    编写主函数调用以上函数。

以下是我编的,怎样才能试验以上的要求
#include <stdio.h>
int sort (int a[10])
{
    int i=0,j=0,t;
    for(i=0;i<10;i++)
    {
        for(j=0;j<9;j++)
        {
            if(a[i]>a[j])
            {
                t=a[j];
                a[j]=a[i];
                a[i]=t;
            }
        }
    }
    return 0;
}
int sort1(int array[],int n)
{int i,j,k,t;
 for(i=0;i<n;i++)
{k=i;
for(j=i+1;j<n;j++)
if(array[j]>array[k])k=j;
t=array[k];
array[k]=array[i];
array[i]=t;
}
 return 0;
}
int sort3(int array[],int n, char style)
{int i,j,k,t;
 if(style=='d')
 for(i=0;i<n;i++)
{k=i;
for(j=i+1;j<n;j++)
if(array[j]>array[k])k=j;
t=array[k];
array[k]=array[i];
array[i]=t;
}
 else if(style=='a')
     for(i=0;i<n;i++)
{k=i;
for(j=i+1;j<n;j++)
if(array[j]<array[k])k=j;
t=array[k];
array[k]=array[i];
array[i]=t;
}
     return 0;
}
int bubblesorta(int array[],int n)
{
int i,j,m,*p;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i;j++)
if(array[j]>array[j+1])
{m=array[j];
array[j]=array[j+1];
array[j+1]=m;
}
}
 p=array;
return p;
}

int bubblesortd(int array[],int n)
{
int i,j,m,*p;
for(i=0;i<=n+1;i++)
{
for(j=0;j<=n+1;j++)
if(array[j]<array[j+1])
{m=array[j];
array[j]=array[j+1];
array[j+1]=m;
}
}
 p=array;
return p;
}

int selectionsorta(int array[],int n)
{int i,j,k,t,*p;
 for(i=0;i<n;i++)
{k=i;
for(j=i+1;j<=n;j++)
if(array[j]<array[k]);
t=array[k];
array[k]=array[i];
array[i]=t;
}
 p=array;
return p;
}

int selectionsortd(int array[],int n)
{int i,j,k,t,*p;
 for(i=0;i<=n+1;i++)
{k=i;
for(j=i+1;j<=n+1;j++)
if(array[j]>array[k])k=j;
t=array[k];
array[k]=array[i];
array[i]=t;
}
 p=array;
return p;
}
void main()
{
    int a[10],i;
    printf("输入10个学生的成绩\n");
    for(i=0;i<10;i++)
    {printf("a[%d]= ",i);
    scanf("%d",&a[i]);
    }
    printf("\n");
    printf("原始学生成绩顺序\n");
    for(i=1;i<=9;i++)
        printf("%5d ",a[i]);
    printf("\n");
    printf("排列好的成绩\n");
    sort(a);
    for(i=0;i<10;i++)
    {
        printf("%d ",a[i]);
    }

回复列表 (共8个回复)

沙发

函数指针就是你在程序里声明一个
int* (*fun)(int[],int);的东西
然后对于int* selectionsorta(int array[],int n)//顺便说一下这里返回值类型应该是int* 因为你要返回的是数组,所以只能用指针了
可以fun=selectionsorta;
之后还是形如fun(a,n)地调用

板凳

顺便提醒,是int main不是void main

3 楼

我改了之后还是实行不了啊....
编写主函数调用以上函数.  这一点我的有问题吗?

4 楼

程序中所有以 return p;结束的函数

应该写为
int* fname(....)
{ ....
}

注意应该是int* 而不是int

5 楼

[code=c]
#include <stdio.h>
int sort (int *a)
{
    int i=0,j=0,t;
    for(i=0;i<10;i++)
    {
        for(j=0;j<9;j++)
        {
            if(a[i]>a[j])
            {
                t=a[j];
                a[j]=a[i];
                a[i]=t;
            }
        }
    }
    return 0;
}
int sort1(int *array,int n)
{
    int i,j,k,t;
    for(i=0;i<n;i++)
    {
        k=i;
        for(j=i+1;j<n;j++)
        if(array[j]>array[k])k=j;
        t=array[k];
        array[k]=array[i];
        array[i]=t;
    }
    return 0;
}

int sort3(int *array,int n, char style)
{
    int i,j,k,t;
    if(style=='d')
    for(i=0;i<n;i++)
    {
        k=i;
        for(j=i+1;j<n;j++)
        if(array[j]>array[k])k=j;
        t=array[k];
        array[k]=array[i];
        array[i]=t;
     }
     else if(style=='a')
     for(i=0;i<n;i++)
     {
         k=i;
         for(j=i+1;j<n;j++)
         if(array[j]<array[k])k=j;
         t=array[k];
         array[k]=array[i];
         array[i]=t;
      }
     return 0;
}


int* bubblesorta(int *array,int n)
{
    int i,j,m,*p;
    for(i=0;i<n-1;i++)
    {
        for(j=0;j<n-i;j++)
        if(array[j]>array[j+1])
        {
            m=array[j];
            array[j]=array[j+1];
            array[j+1]=m;
         }
    }
    p=array;
    return p;
}

int* bubblesortd(int *array,int n)
{
    int i,j,m,*p;
    for(i=0;i<=n+1;i++)
    {
        for(j=0;j<=n+1;j++)
        if(array[j]<array[j+1])
        {
            m=array[j];
            array[j]=array[j+1];
            array[j+1]=m;
        }
    }
    p=array;
    return p;
}

int* selectionsorta(int *array,int n)
{
    int i,j,k,t,*p;
    for(i=0;i<n;i++)
    {
        k=i;
        for(j=i+1;j<=n;j++)
        if(array[j]<array[k]);
        t=array[k];
        array[k]=array[i];
        array[i]=t;
     }
    p=array;
    return p;
}

int* selectionsortd(int *array,int n)
{
    int i,j,k,t,*p;
    for(i=0;i<=n+1;i++)
    {    
        k=i;
        for(j=i+1;j<=n+1;j++)
        if(array[j]>array[k])k=j;
        t=array[k];
        array[k]=array[i];
        array[i]=t;
    }
    p=array;
    return p;
}

int main()
{
    int a[10],i;
    printf(" 输入10个学生的成绩\n");
    for(i=0;i<10;i++)
    {
        printf("a[%d]= ",i);
        scanf("%d",&a[i]);
    }
    printf("\n");
    printf(" 原始学生成绩顺序\n");
    for(i=1;i<=9;i++)
        printf("%5d ",a[i]);
    printf("\n");
    printf(" 排列好的成绩\n");
    sort(a);
    for(i=0;i<10;i++)
    {
        printf("%d ",a[i]);
    }
}
[/code]

应该在任何标准c编译器都能通过:
对此程序几点说明:
1. 一维数组传递应写为 int func( int *p,.....)用于可以改变一维数组的值的情况
 int func( const int *p,.....)用于不改变原始一维数组的值的情况
2.int* bubblesorta, int* bubblesortd, int* selectionsorta等,以返回指针的函数中,返回指针是多余的,因为返回的p就是指向你向子函数传递的数组,并且此时数组已改变。多余的指针最好不要在程序里出现!如果实在没办法,存在多余指针
请 将其设置为NULL。但为了说明参数返回的例子,我依然用了这个多余的东西:)

6 楼

返回一个额外的东西这样的用法其实个人感觉是pascal那样的语言留下的习惯
对于C代码来说,输出函数这样不涉及是否会成功的函数会被定义为void型,而涉及成功状态的函数则一般声明为默认的int,返回几个特殊值来作为状态标志。

7 楼

5楼的朋友,题目的意思就是要一个主函数同时调用到int* bubblesorta, int* bubblesortd, int* selectionsorta等这几个函数,但我想不到怎么调用. 其实这个是我课程设计的一个题目....按照上面的修改应该只会用到一个函数吧..

8 楼

int main()
{
    int a[10],i;
    int *p1,*p2,*p3,*p4;

    printf(" 输入10个学生的成绩\n");
    for(i=0;i<10;i++)
    {
        printf("a[%d]= ",i);
        scanf("%d",&a[i]);
    }
    printf("\n");
    printf(" 原始学生成绩顺序\n");
    for(i=1;i<=9;i++)
        printf("%5d ",a[i]);
    printf("\n");
    printf(" 排列好的成绩\n");
    sort(a);
    for(i=0;i<10;i++)
    {
        printf("%d ",a[i]);
    }

    p1 = selectionsorta(a,10);

    p2 = bubblesortd(p1,8);

    printf("\n");
    printf("Check point return:\n");
    for(i=0;i<10;i++)
    {
        printf("%d ",p2[i]);
    }


}

其它的自己调用....

我来回复

您尚未登录,请登录后再回复。点此登录或注册