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)查找;
例外说明:折半查找,二分检索。
简单应用例子:
// 可任意转载,但请注明连接;
// 本文为巩固基础学习之用;
// 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);
}
#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);
}