qey

Atitude is Everything.-- 关注C/C++,关注Linux(Unix) ,关注网络。 Better Late Than Never.
随笔 - 4, 文章 - 13, 评论 - 7, 引用 - 0
数据加载中……

stdlib.h 中常用函数[3]简单数值函数和算法函数

基本信息// joen.hong#gmain.com
// 可任意转载,但请注明连接;
// 本文为巩固基础学习之用;
// 2009年10月09日
// 本文内容来源于C库头文件和Linux manual

一、
简单数值函数函数原型:int abs(int j);
          long int labs(long int j);
          long long int llabs(long long int j);
          #include <inttypes.h>
          intmax_t imaxabs(intmax_t j);
功能描述:abs() 函数计算参数j的绝对值。labs() llabs() imaxabs() 计算函数对应的合适类型整数j 的绝对值。
返 回 值:返回函数适合的整数类型的参数绝对值。
参考函数:cabs(3)<complex.h>, ceil(3), fabs(3)<math.h>, floor(3)<math.h>, rint(3)
floor(double) 不大于参数的最大整数。
ceil(double) 不小于参数的最小整数。
fabs() 浮点数绝对值。
cabs() 复数取模。
rint() 返回整数附近的值。
例外说明:abs() labs() C89标准就包含了,llabs() imaxabs() 在C99标准加入。
(特殊数值:+0, -0 , NaN, infinite )


函数原型:div_t div(int numerator, int denominator);
          ldiv_t ldiv(long numerator, long denominator);
          lldiv_t lldiv(long long numerator, long long denominator);
          #include <inttypes.h>
          imaxdiv_t imaxdiv(intmax_t numerator, intmax_t denominator);
功能描述:div() 函数计算numerator/denomiator 的值,返回商(quotient)和余数(remainder)到div_t 结构体中。
          在结构体中,包含两个整型成员quot 和rem。商往0靠。结果满足 quot*denominator+rem = numerator。
          ldiv(),  lldiv(), and imaxdiv() 函数具有相同功能,只是返回值在结构中的类型和除数的相同。
返 回 值:返回相应的结构体,div_t, ldiv_t, lldiv_t
例外说明:例如div_t q = div(-5, 3); 结构中q.quot 和q.rem 分别为-1 为-2.

简单算法函数函数原型:void qsort(void *base, size_t nmemb, size_t size,
                  int(*compar)(const void *, const void *));
功能描述:qsort() 函数将元素大小为size,的nmemb 个元素组成的数组排序。base指针指向数组的开始。
          数组的内容升序或降序排列是根据compar指向的比较函数,比较函数被调用来比较两个参数指向
          的对象。
          比较函数必须返回小于0,等于0或大于0,他们分别表示参数1指向对象小于,等于或大于第二个。
          如果两个成员比较相等,那么它们在数组中顺序不确定(不是稳定排序)。
返 回 值:没有返回值。
参考函数:GNU有可重入类型对应函数,qsort_r(), __USE_GNU;
例外说明:快速排序。

函数原型:void *bsearch(const void *key, const void *base,
                     size_t nmemb, size_t size,
                     int (*compar)(const void *, const void *));
功能描述:bsearch() 函数搜索nmemb对象的数组,base指向最初成员,寻找和key 匹配的对象。数组每个成员的大小为size。
          数组内容应该由compar 指向的比较函数升序排列好,compar 例程和qsort 的一样。
返 回 值:返回指向匹配数组成员的指针;如果没有匹配发现就返回NULL。如果成员中有多个和key匹配,那么返回是不确定的。
参考函数:hsearch(3)<search.h>, lsearch(3)<search.h>, qsort(3)<stdlib.h>, tsearch(3)<search.h>
hsearch() 哈希(hash)查找;
lsearch() 线性(linear)查找;
tsearch() 二叉树(binary tree)查找;
例外说明:折半查找,二分检索。


简单应用例子:

       #include <stdio.h>
       #include 
<stdlib.h>
       #include 
<string.h>
       #include 
<assert.h>
       
        
/* 
         * 字符串比较函数,传送过来的是指向字符串指针的指针 
         
*/
       
static int
       cmpstringp(
const void *p1, const void *p2)
       {
           
return strcmp(* (char * const *) p1, * (char * const *) p2);
       }
        
/* 
         * 整数的比较函数,传送过来的参数是整数的指针 
         
*/
       
static int 
       comintp(
const void *ip1, const void *ip2)
       {
           
return *(int *)ip1 - *(int *)ip2;
       }

        
/* 
         * 其他结构的参数也差不多,先通过指针求得
         * 比较的对象,然后在进行比较,假设有一个student 结构,
         * 按该结构的成员id值来排序,比较函数类似如下: 
         
*/
       typedef 
struct student {
           
int id;
           
char name[32];
       } student;

       
static int
       comstup(
const void *stup1, const void *stup2)
       {
           
return ((student *)stup1)->id - ((student *)stup2)->id;
       }

       
int
       main(
int argc, char *argv[])
       {
           
int j;

           
int array[10={9556468332339192};
           qsort(array, 
10sizeof(int), comintp);
           
           
for(j = 0; j < 10; j++)
               printf(
"%d\t", array[j]);
           printf(
"\n");

           qsort(
&argv[1], argc - 1sizeof(argv[1]), cmpstringp);
           
           
for (j = 1; j < argc; j++)
               puts(argv[j]);
           exit(EXIT_SUCCESS);
       }




posted on 2009-10-09 22:50 无声无色 阅读(787) 评论(0)  编辑 收藏 引用 所属分类: 语言基础


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理