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

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 = { 9 5 56 46 8 33 23 39 19 2 };
           qsort(array, 
10 sizeof ( int ), comintp);
           
           
for (j  =   0 ; j  <   10 ; j ++ )
               printf(
" %d\t " , array[j]);
           printf(
" \n " );

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




你可能感兴趣的:(stdlib.h 中常用函数[3]简单数值函数和算法函数)