2 lym77777 lym77777 于 2016.03.10 21:08 提问

c++中qsort函数自定义比较函数的问题(杭电1009)
            #include<iostream>
            #include<iomanip>
            #include<stdlib.h>
            #include<stdio.h>
            #include<algorithm>
            using namespace std;

            struct room
            {
                double amount,l;
                int number;
            };
            int comp(const void *x,const void *y);
            int main()
            {
                int n,m,k;
                double sum;
                while(cin>>n>>m)
                {
                    sum=0;
                    if(n==-1&&m==-1)
                        break;
                    room *a=new room [m];       
                    for(k=0;k<m;k++)
                    {
                        cin>>a[k].amount>>a[k].number;
                        a[k].l=a[k].amount/a[k].number;
                    }
                    qsort(a,m,sizeof(a[0]),comp);

                    for(k=0;k<m;k++)
                    {
                        if(n>a[k].number)
                        {
                            sum+=a[k].amount;
                            n-=a[k].number;
                        }
                        else
                        {
                            sum+=double(n)/a[k].number*a[k].amount;
                            break;      
                        }
                    }
            //      for(k=0;k<m;k++)
            //          cout<<a[k].amount<<" "<<a[k].number<<" "<<a[k].l<<endl;
                    cout<<setiosflags(ios::fixed)<<setprecision(3)<<sum<<endl;
                    delete [] a;
                }
                return 0;
            }
            int comp(const void *x,const void *y)
            {
                return (*(room *)y).l>(*(room *)x).l?1:-1;
            }

以上代码中qsort的比较函数如果写成上述代码形式可以过杭电1009
而如果写成
int comp(const void x,const void *y)
{
return (
(room )y).l-((room *)x).l;
}
则过不了,请问大神们这两种写法有什么区别啊?

int comp(const void *x,const void *y)
{
    return (*(room *)y).l>(*(room *)x).l?1:-1;
}

int comp(const void *x,const void *y)
{
    return (*(room *)y).l-(*(room *)x).l;
}

题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1009

5个回答

lym77777
lym77777   2016.03.10 21:11

萌新在这里谢过各位大神

visoncomputer
visoncomputer   2016.03.10 21:16

这个应该是指针的问题,直接读指针是读指针的地址,而前面加一个* 号就是读指针的值。

lym77777
lym77777 我下面给出的函数不知道是不是上传的时候弄错了
2 年多之前 回复
lym77777
lym77777 对于结构体来说不能这样比较么?但是我在使用的时候排序结果是一样的啊?
2 年多之前 回复
lym77777
lym77777   2016.03.10 21:26

后面的函数好像有点问题,应该是
int comp(const void x,const void *y)
{
return (
(room )y).l-((room *)x).l;
}

lym77777
lym77777 求教大神们
2 年多之前 回复
lx624909677
lx624909677   Ds   Rxr 2016.03.10 22:43
 #include<stdio.h>
#include<stdlib.h>
#define maxsize 10000

struct trade{
    int J;
    int F;
    double value;
} tradeObj[maxsize];

int cmp(const void *a,const void *b){
    struct trade *aa=(trade *)a;
    struct trade *bb=(trade *)b;
    return ((aa->value<bb->value)?1:-1);
}
int main(){
    int M,N,i;
    double totalMount;
    while(scanf("%d %d",&M,&N)!=EOF){
        totalMount=0.000;
        if(M==-1&&N==-1)
            break;
        for(i=0;i<N;i++){
            scanf("%d %d",&tradeObj[i].J,&tradeObj[i].F);
            tradeObj[i].value=((double)tradeObj[i].J)/((double)tradeObj[i].F);
        }
        if(N==0){
            printf("%.3f\n",totalMount);
            continue;
        }
        if(M==0){
            for(i=0;i<N;i++){
                if(tradeObj[i].F==0){
                    totalMount+=(double)tradeObj[i].J;
                }
            }   
            printf("%.3f\n",totalMount);
            continue;
        }   
        qsort(tradeObj,N,sizeof(tradeObj[0]),cmp);
        //for(i=0;i<N;i++)
        //  printf("%d %d %f\n",tradeObj[i].J,tradeObj[i].F,tradeObj[i].value);
        i=0;
        while(M){
            if(M>=tradeObj[i].F){
                totalMount+=(double)tradeObj[i].J;
                //totalMount+=tradeObj[i].J;
                M-=tradeObj[i].F;
            }
            else{
                totalMount+=((double)M)/((double)tradeObj[i].F)*((double)tradeObj[i].J);
                //totalMount+=M/tradeObj[i].F*tradeObj[i].J;
                break;
            }           
            i++;    
        }
        printf("%.3f\n",totalMount);
    }
    return 0;
} 
lym77777
lym77777 抱歉,您可能没理解我的意思,我是想问那两种qsort函数的比较函数有什么不同,谢谢
2 年多之前 回复
John_ToStr
John_ToStr   Rxr 2016.03.11 11:30

#include

struct room
{
double amount, l;
int number;
};

double comp(const void x, const void *y)
{
return (
(room )y).l - ((room *)x).l;
}

int comp1(const void x, const void *y)
{
return (
(room )y).l > ((room *)x).l ? 1 : -1;
}

int main()
{
double a = comp1("asd", "fgh");
printf("%f\n", a);
return 0;
}

没有不同,我用VS2013编译没问题,你把出错界面我看看

John_ToStr
John_ToStr 回复lym77777:看看你的返回值就有问题,
2 年多之前 回复
lym77777
lym77777 谢谢,运行没有问题,但是提交杭电就WA。
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
sort()/qsort()函数的用法及cmp比较函数的写法
转自:白马王的博客 一、STL中的sort函数: 头文件:#include Tips:    STL中的sort函数有两种:    templateRanIt>        void sort(RanIt fist, RanIt last);    templateRanIt, class Pred>        void sort(RanIt fist, RanI
c语言qsort()函数中compare()函数参数写法
linux的man手册中提供了一个比较函数的示例: #include <stdio.h> #include <stdlib.h> #include <string.h> static int cmpstringp(const void *p1, const void *p2) { /* The actual arguments to this funct
C中qsort函数的六类详细使用方法
sort()函数是C++中的排序函数其头文件为:#include头文件; qsort()是C中的排序函数,其头文件为:#include  1、qsort()----六类qsort排序方法  qsort函数很好用,但有时不太会用比如按结构体一级排序、二级排序、字符串排序等。 函数原型:  void qsort(void *base, size_t nelem, size_t width, in
sort 和qsort函数cmp函数各种写法
用sort 函数,要加头文件以及using namespace std;另外文件的后缀要改为.cpp 用qsort函数,要加头文件这个是c里的,文件的后缀可以是.c   int型: sort函数: int cmp(int a,int b) {     return a>b;//(从大到小)return a } qsort函数: int cmp(const  void *a,co
C函数库qsort函数及最后一个参数的相关问题
在学习数据结构的时候,我们会学习到很多不同的排序算法,比如说冒泡排序法,哈希表(大雾),以及快速排序。而C的函数库也给我们了一个快速排序的函数。就是我所提到的这个qsort。这个函数内部是一个写好了的快速排序算法的函数。
C/C++中的qsort()函数及其cmp()
1.函数简介 功 能:  使用快速排序例程进行排序 头文件:stdlib.h 函数原型:void __cdecl qsort ( void *base, size_t num, size_t width, int (__cdecl *comp)(const void *, const void *) )
C语言关于qsort函数的用法详细说明
快速排序是一种用的最多的排序算法,在C语言的标准库
浅谈C++中qsort与sort的使用方法与区别
这两天在刷leetcode时看到了一些关于排序的题目,其中遇到各种大神对sort与qsort的使用,个人在使用时对比发现了一些sort与qsort的区别,并对它们的使用方法进行了一些总结介绍。 在平时编程时,排序是一种经常要用到的操作。如果每次都自己临场写)排序算法,不仅容易出错,而且浪费宝贵的时间。在C++的STL里面有两个sort与qsort可以直接用于对各种类型的数据以及容器进行排序。
【原+转】STL之优先队列的cmp函数和sort以及qsort函数的cmp
sort以及qsort函数的cmp 转自 http://blog.csdn.net/lionel_d/article/details/41746135 写的很好,直接复制粘贴过来了,感谢一、sort 以及 qsort首先,我们来谈谈大名鼎鼎的void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *...
如何利用C语言中的qsort库函数实现快速排序?
之前,我们已经写过快速排序的程序,而在C语言的库函数中就有快速排序的库函数,即为qsort, 其用法如下: 功 能: 快速排序 头文件:stdlib.h 用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *)); 参数:  1 待排序数组首元素的地址  2 数