c语言从入门到精通_第1页
c语言从入门到精通_第2页
c语言从入门到精通_第3页
c语言从入门到精通_第4页
c语言从入门到精通_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

会计学1c语言从入门到精通第15章库函数□□□□命令行参数其它函数综合应用——猜数字游戏跟我上机第1页/共66页·

标准C库函数数学函数字符串处理函数字符处理函数转换和存储管理函数随机函数日期和时间处理函数诊断函数第15章库函数□□□□命令行参数其它函数综合应用——猜数字游戏跟我上机第2页/共66页标准C库函数数学函数字符串处理函数字符处理函数转换和存储管理函数随机函数日期和时间处理函数诊断函数第15章库函数□□□□命令行参数其它函数综合应用——猜数字游戏跟我上机第3页/共66页标准C库函数数学函数字符串处理函数字符处理函数转换和存储管理函数随机函数日期和时间处理函数诊断函数第15章库函数□□□□命令行参数其它函数综合应用——猜数字游戏跟我上机第4页/共66页标准C库函数数学函数字符串处理函数字符处理函数转换和存储管理函数随机函数日期和时间处理函数诊断函数第15章库函数□□□□命令行参数其它函数综合应用——猜数字游戏跟我上机第5页/共66页标准C库函数数学函数字符串处理函数字符处理函数转换和存储管理函数随机函数日期和时间处理函数诊断函数第15章库函数□□□□命令行参数其它函数综合应用——猜数字游戏跟我上机第6页/共66页标准C库函数数学函数字符串处理函数字符处理函数转换和存储管理函数随机函数日期和时间处理函数诊断函数第15章库函数□□□□命令行参数其它函数综合应用——猜数字游戏跟我上机第7页/共66页标准C库函数数学函数字符串处理函数字符处理函数转换和存储管理函数随机函数日期和时间处理函数诊断函数第15章库函数□□□□命令行参数其它函数综合应用——猜数字游戏跟我上机第8页/共66页标准C库函数数学函数字符串处理函数字符处理函数转换和存储管理函数随机函数日期和时间处理函数诊断函数第15章库函数·□□□命令行参数其它函数综合应用——猜数字游戏跟我上机第9页/共66页标准C库函数数学函数字符串处理函数字符处理函数转换和存储管理函数随机函数日期和时间处理函数诊断函数第15章库函数··□□命令行参数其它函数综合应用——猜数字游戏跟我上机第10页/共66页标准C库函数数学函数字符串处理函数字符处理函数转换和存储管理函数随机函数日期和时间处理函数诊断函数第15章库函数···□命令行参数其它函数综合应用——猜数字游戏跟我上机第11页/共66页标准C库函数数学函数字符串处理函数字符处理函数转换和存储管理函数随机函数日期和时间处理函数诊断函数第15章库函数·

跟我上机第12页/共66页标准C库函数数学函数字符串处理函数字符处理函数转换和存储管理函数随机函数日期和时间处理函数诊断函数命令行参数其它函数综合应用——猜数字游戏15.1 标准C库函数名称函数类型<assert.h>诊断函数<ctype.h>字符测试<errno.h>错误检测<float.h>系统定义的浮点型界限<limits.h>系统定义的整数界限<locale.h>区域定义<math.h>数学<stjump.h>非局部的函数调用<signal.h>异常处理和终端信号<stdarg.h>可变长度参数处理<stddef.h>系统常量<stdio.h>输入输出<stdlib.h>多种公用函数<string.h>字符串处理<time.h>时第间1和3日页期/共函数66页15.2

数学函数15.2.1绝对值函数15.2.2幂函数和开平方函数15.2.3指数函数和对数函数15.2.4三角函数15.2.5取整函数和取余函数第14页/共66页15.2.1

绝对值函数原型功能int

abs(int

n)计算整数n的绝对值long

labs(long

n)计算长整数n的绝对值double

fabs(double

x)计算双精度实数x的绝对值第15页/共66页15.2.1

绝对值函数【范例15-1】求整数的绝对值。01#include<stdio.h>/*包含标准输入输出头文件*/*包含标准输入输出头文件*//*包含数学头文件*/#include<math.h>/*包含数学头文件*int

main(){/*调用绝对值函数*//*调用绝对值函数*//*调用绝对值函数*//*等待键入字符*

/*等待键入字符*/int

x;x=-5;printf("|%d|=%d\n",x,abs(x));x=0;printf("|%d|=%d\n",x,abs(x));10

x=+5;printf("|%d|=%d\n",x,abs(x));getchar();return

0;14}第16页/共66页15.2.2

幂函数和开平方函数原型功能double

pow(double

x,double

y)计算双精度实数x的y次幂double

sqrt(double

x)计算双精度实数x的平方根第17页/共66页15.2.3

指数函数和对数函数原型功能double

exp(double

x)计算e的双精度实数x次幂double

log(double

x)计算以e为底的双精度实数x的对数ln(x)double

log10(double

x)计算以10为底的双精度实数x的对数log10(x)第18页/共66页15.2.4

三角函数原型功能double

sin(double

x)计算双精度实数x的正弦值double

cos(double

x)计算双精度实数x的余弦值double

tan(double

x)计算双精度实数x的正切值double

asin(double

x)计算双精度实数x的反正弦值double

acos(double

x)计算双精度实数x的反余弦值double

atan(double

x)计算双精度实数x的反正切值double

sinh(double

x)计算双精度实数x的双曲正弦值double

cosh(double

x)计算双精度实数x的双曲余弦值double

tanh(double

x)计算双精度实数x的双曲正切值第19页/共66页15.2.5

取整函数和取余函数原型功能double

ceil(double

x)计算不小于双精度实数x的最小整数double

floor(doulbe

x)计算不大于双精度实数x的最大整数double

fmod(double

x,double

y)计算双精度实数x/y的余数,余数使用x的符号double

modf(double

x,double

*ip)计算x的小数部分,使用x的符号,x的整数部分,使用x的符号,都被双精度实数

ip指向x的y次幂第20页/共66页15.2.5

取整函数和取余函数【范例15-3】取整和取余函数的应用01#include<stdio.h>/*包含标准输入输出头文件*/02#include<math.h>/*包含数学头文件*/03

int

main()04{/*调用取余函数*//*调用取余函数*/double

x,y,i;x=74.12;y=6.4;printf("74.12/6.4:

%f\n",fmod(x,y));x=74.12;10

y=-6.4;11

printf("74.12/(-6.4):

%f\n",fmod(x,y));12

x=modf(-74.12,&i);13

printf("-74.12=%.0f+(%.2f)",i,x);getchar();

/*等待键入字符*/return

0;16}第21页/共66页15.3

字符串处理函数

C语言没有为以数组为整体的对象提供内置操作,例如数组赋值或者数组比较。因为字符串只是一个以’\0’字符终止的字符数组,不是一个有它自己的权限的数据类型,这就意味着不能为字符串提供赋值运算和关系运算。

但是,在C语言的标准库函数中,包含了大量的字符串处理函数和字符处理函数,起到辅助完成字符串进行处理的功能。

字符串库函数的调用方式与所用的C语言函数的调用方式一样,要使用这些字符串函数,需要包含头文件<string.h>。第22页/共66页15.3.1

字符串长度函数原型功能int

strlen(char

*d)返回字符串d的长度,不包括终止符NULL第23页/共66页15.3.2

字符串连接函数原型功能char

*strcat(char

*d,char

*s)连接字符串s到字符串d,返回字符串dchar

*strncat(char

*d,char

*s,int

n)连接字符串s中至多n个字符到字符串d,返回字符串d第24页/共66页15.3.2

字符串连接函数【范例15-4】字符串连接函数的应用/*包含标准输入输出头文件*//*包含字符串处理头文件*//*调用字符串连接函数*//*等待键入字符*/#include

<stdio.h>#include

<string.h>int

main(){char

d1[20]="Hello";char

d2[20]="Hello";07

char

*s1="

World";08

char

*s2="

Worldabc"09

strcat(d1,s1);

/*调用字符串连接函数*/printf("%s\n",d1);strncat(d2,s2,6);printf("%s\n",d2);getchar();return

0;15

}第25页/共66页15.3.3

字符串复制函数原型功能char

*strcpy(char

*d,char

*s)复制字符串s到字符串d,返回字符串dchar

*strncpy(char

*d,char

*s,int

n)复制字符串s中至多n个字符到字符串d;如果s小于n个字符,用’\0’补上,返回字符串dvoid

*memcpy(void

*d,void

*s,int

n)从s复制n个字符到d,返回字符串dvoid

*memmove

(void

*d,void

*s,int

n)和memcpy相同,即使d和s部分相同也运行第26页/共66页15.3.3

字符串复制函数【范例15-5】字符串复制函数的应用。/*包含标准输入输出头文件*//*包含字符串处理头文件*//*调用字符串复制函数*//*等待键入字符*/01

#include

<stdio.h>02

#include

<

string.h

>03

int

main()04

{05

char

*s1="Hello

World";06

char

*s2="Hello

World";07

char

d1[20]="***************";08

char

d2[20]="***************";09

strcpy(d1,s1);

/*调用字符串复制函数*/printf("%s\n",d1);strncpy(d2,s2,strlen(s2));printf("%s\n",d2);getchar();return

0;15

}第27页/共66页15.3.4

字符串比较函数原型功能char

*strcmp(char

*d,char

*s)比较字符串d与字符串s;如果d<s,返回-1,若果d==s,返回0,如果d>s,返回1char

*strncmp(char

*d,char

*s,int

n)比较字符串d中至多n个字符与字符串s;如果d<s,返回-1,若果d==s,返回

0,如果d>s,返回1void

*memcmp(void

*d,void

*s,int

n)比较d的首先n个字符与s,和strcmp返回值相同第28页/共66页15.3.4

字符串比较函数【范例15-6】字符串比较函数的应用01#include<stdio.h>

/*包含标准输入输出头文件*/02#include<string.h>/*包含字符串处理头文件*/03

int

main()04

{05

char

*s1="Hello,

Programmers!";06

char

*s2="Hello,

programmers!";07

int

r;r=strcmp(s1,s2);

/*调用字符串比较函数*/if(!r)printf("s1

and

s2

are

identical");elseif(r<0)printf("s1

less

than

s2");elseprintf("s1

greater

than

s2");getchar();

/*等待键入字符*/return

0;}第29页/共66页15.3.5

字符串查找函数原型功能char

*strchr

(char

*d,char

*c)返回一个指向字符串d中c第一次出现的指针,或者如果没有找到c,返回指向NULL的指针char

*strrchr(char

*d,char

*c)返回一个指向字符串d中c第一次出现的指针,或者如果没有找到c,返回指向NULL的指针char

*strstr(char

*d,char

*s)返回一个指向字符串d中字符s第一次出现的指针,或者如果没有找到s,返回指向NULL的指针void

*memchr(void

*d,char

c,int

n)返回一个指向被d所指向的n个字符中c第一次出现的指针,或者如果没有找到c,返回指向NULL的指针第30页/共66页15.3.5

字符串查找函数【范例15-7】字符串查找函数的应用01#include<stdio.h>

/*包含标准输入输出头文件*/02#include<string.h>/*包含字符串处理头文件*/03

int

main()04

{/*调用字符串查找函数*//*调用字符串查找函数*//*等待键入字符*/05

char

*s="Hello

World";06

char

*ps="llo";char

*p;p=strchr(s,"W");if(p)printf("%s\n",p);elseprintf("Not

Found!\n");p=strstr(s,ps);if(p)printf("%s\n",p);elseprintf("Not

Found!\n");getchar();return

0;20

}第31页/共66页15.3.6

字符串填充函数【范例15-8】字符串填充函数的应用01#include<stdio.h>/*包含标准输入输出头文件*//*包含字符串处理头文件*/02

#include

<

string.h

>03

int

main()04

{/*调用字符串填充函数*//*等待键入字符*/05

char

array[]="Hello

World";06

char

*s=array;memset(s,"W",5);printf("%s",s);getchar();10

return

0;11

}原型功能void

*memset(void

*d;char

c,int

n)使用n个字符c填充void*类型变量d第32页/共66页15.4

字符处理函数15.4.1字符类型判断函数15.4.2字符大小写转换函数第33页/共66页15.4.1

字符类型判断函数原型功能int

isalnum(int

c)如果整数c是文字或数字返回非零,否返回零int

isalpha(int

c)如果整数c是一个字母返回非零,否返回零int

iscntrl(int

c)如果整数c是一个控制符返回非零,否返回零int

isdigit(int

c)如果整数c是一个数字返回非零,否返回零int

isgraph(int

c)如果整数c是可打印的(排除空格)返回非零,否返回零int

islower(int

c)如果整数c是小写字母返回非零,否返回零int

isprint(int

c)如果整数c是可打印的(包括空格)返回非零,否返回零int

ispunct(int

c)如果整数c是可打印的(除了空格、字母或数字之外)返回非零,否返回零int

isspace(int

c)如果整数c是一个空格返回非零,否返回零int

isupper(int

c)如果整数c是大小字母返回非零,否返回零int

isxdigit(int

c)如果整数c是十六第进3制4页数/字共返66回页非零,否返回零15.4.1

字符类型判断函数【范例15-9】字符类型判断函数的应用第35页/共66页15.4.2

字符大小写转换函数原型功能int

tolower(int

c)转换整数c为小写字母,当c为大写英文字母,则返回对应的小写字母;否则返回原来的值int

toupper(int

c)转换整数c为大写字母,当c为小写英文字母,则返回对应的大写字母;否则返回原来的值第36页/共66页15.5

转换和存储管理函数15.5.1转换函数15.5.2存储管理函数第37页/共66页15.5.1

转换函数原型功能int

atoi(string)转换一个ASCII字符串为一个整数。在第一个非整型字符处停止double

atof(string)转换一个ASCII字符串为一个双精度数。在第一个不能被解释为一个双精度数的字符处停止string

itoa(int,char

*,int)转换一个整数为一个ASCII字符串。为返回的字符串分配的空间必需足够大于被转换的数值第38页/共66页15.5.1

转换函数【范例15-10】转换函数的应用/*包含标准输入输出头文件*//*包含转换和存储头文件*//*等待键入字符*/#include

<stdio.h>#include

<stdlib.h>int

main(){05

int

num=12345;06

char

*str="12345.67";char

array[10];itoa(num,array,sizeof(array));/*调用转换函数*/printf("num=%d,array=%s\n",num,array);printf("%d",atoi(str));getchar();return

0;13

}第39页/共66页15.5.2

存储管理函数原型功能void

*malloc(size_tn)为一个大小为n的对象分配存储空间void

*calloc(size_n,size_n)为n个对象的数组分配存储空间,每个大小为n,初始化所有被分配的自己为0void

*realloc(void

*p,size_n)重新分配空间的大小为n,内容保持与旧的相同,等于新的大小void

free(void

*p)释放指向的空间第40页/共66页15.5.2

存储管理函数例如,函数调用malloc(10*sizeof(char))请求足够存储10个字符存储空间,而函数

malloc(sizeof(int))请求足够存储一个整型数据的存储空间。被malloc()分配的空间来自计算机空闲存储区,这个存储区形成在堆上。堆是由未分配的存储区组成的,这个存储区能够在这个程序执行时根据请求分配给一个程序。程序中如果使用了free()函数,可以把使用malloc()分配的存储区被返回给这个堆。为了提供访问这些位置的能力,malloc()返回已经被保存的第一个位置的。当然,这个地址必须赋值给一个指针。通过malloc()返回一个指针,对创建数组或者个是一组数据结果是很有帮助的。需要注意到,返回的指针类型是void类型,这样不管请求的数据是什么

类型,返回的地址必须使用强制类型转换重新转换成希望得到的类型。第41页/共66页15.5.2

存储管理函数例如,有个变量pt,是一个指向整型的指针,已经使用malloc()创建了,如下所示:pt

=

malloc(sizeof(int))malloc创建的是void指针类型,所以需要重新定义pt为一个整型指针,如下所示:(int

*)pt;下面看一段代码,功能是创建一个整型数组,数组大小由用户在运行时输入决定。int

*pt;printf(“输入数值\n”);scanf(“%d”,&number);pt

=

(int

*)

malloc(number

*

sizeof(int));经过这样的处理,就可以使用pt[i]或者*(pt+i)访问数组中第i个元素了。第42页/共66页15.5.2

存储管理函数【范例15-11】存储管理函数的应用第43页/共66页15.6

随机函数15.6.1初识随机函数15.6.2使用随机函数第44页/共66页15.6.1

初识随机函数

在实践中,找到真正的随机数字是很困难的。数字计算机只能在一个限定的范围内和有限的精度下去处理数字。在大多数情况下,一个人能够做的最好的方法是产生伪随机数,而不是真正意义的随机数,它的意义是,单次产生的数列是无法预测的,但是每次都会生成同样一组随机数列。第45页/共66页15.6.1

初识随机函数标准C函数库提供一个随机数函数,rand()函数,它返回[0,MAX]之间均匀分布的伪随机

整数。rand()函数不接受参数,默认以1为种子(即起始值),它总是以相同的种子开始,所以形成的伪随机数列也相同,不是真正的随机。这是有意设计的,目的是为了便于程序

的调试。另一个函数srand(),可以使用该函数指定不同的数(无符号整数)为种子。但是如果种子相同,伪随机数列也相同。有两种方法可以采用,一种办法是让用户输入种子,但是效果

不是很理想;另外一种比较理想的方法是采用变化的数,常用时间来作为随机数生成器

的种子。这样种子不同,产生的随机数也也就不同。第46页/共66页15.6.2

使用随机函数

rand()函数没有参数,它返回一个从0到最大值之间的随机整。如果要产生0~10的随机整数,可以表达为:int

n=

rand()

%

11;如果要产生1~10,则是这样:int

n=1+rand()%10;

总的来说,要生成一个[a,b]范围内的一个随机整数,可以用下式来表示:int

n=a

+

rand()

%

(b-a+1)第47页/共66页15.6.2

使用随机函数【范例15-12】随机函数的应用/*包含标准输入输出头文件*//*包含转换和存储头文件*//*包含日期时间处理头文件*//*产生十个随机数*//*设定随机数范围并输出*/#include

<stdio.h>#include

<stdlib.h>#include

<time.h>#define

MAX

100int

main(){int

i;srand(

(unsigned)time(

NULL

)

);

/*随机数播种函数*/09

for

(i=0;i<10;i++)printf("%d\n",rand()%MAX);return

0;12

}第48页/共66页15.6.2

使用随机函数

srand()函数的参数是一个带NULL参数的

time()函数。NULL参数使time()函数以秒为单位读取计算机内部时钟的时间。然后

srand()函数使用使这个时间初始化rand()随机函数发生函数,也就是常说的产生一个

以当前时间开始的随机种子。第49页/共66页15.6.2

使用随机函数

在实践中,需要对rand()函数生成的随机数进行修改,比如需要生成的随机数的范围

在0到1之间,那该怎么办呢?可以这样做,首先产生范围0~10的随机正整数,然后除以10.0,根据需要再明确精度,这样就可以了,其它情况依此类推。第50页/共66页15.7

日期和时间处理函数原型功能char

*asctime(const

struct

tm

*timeptr)将参数timeptr所指的tm结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果以字符串形态返回。char

*ctime(const

time_t

*timep)将参数timep所指的time_t结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果以字符串形态返回。struct

tm*gmtime(const

time_t*timep)参数timep所指的time_t结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果由结构tm返回。struct

tm

*localtime(const

time_t

*timep)参数timep所指的time_t结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果由结构tm返回.结构tm的定义请参考gmtime()。第51页/共66页15.7

日期和时间处理函数/*目前秒数,正常范围为0-59,但允许至61秒*//*目前分数,范围0-59*//*从午夜算起的时数,范围为0-23*//*目前月份的日数,范围01-31*//*目前月份,从一月算起,范围从0-11*//*从1900年算起至今的年数*//*一星期的日数,从星期一算起,范围为0-6*//*从今年1月1日算起至今的天数,范围为0-365*/例如下面的代码:struct

tm{int

tm_sec;int

tm_min;int

tm_hour;int

tm_mday;int

tm_mon;int

tm_year;int

tm_wday;int

tm_yday;};此函数返回的时间日期未经时区转换,而是UTC时间(UTC是协调世界时Universal

Time

Coordinated的英文缩写),是由国际无线电咨询委员会规定和推荐,并由国际时间局负责保持的以秒为基础的时间标度。UTC相当于本初子午线(即经度0°)上的平均太阳时,过去曾用格林威治平均时(GMT)来表示。第52页/共66页15.7

日期和时间处理函数【范例15-13】日期和时间函数的应用。/*包含标准输入输出头文件*//*包含日期时间处理头文件*/#include

<stdio.h>#include

<time.h>int

main(){char

*wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};time_t

timep;07

struct

tm

*p;08

time(&timep);09

printf("%s",ctime(&timep));

/*调用日期时间处理处理函数*/p=gmtime(&timep);/*调用日期时间处理处理函数*/printf("%s",asctime(p));

/*调用日期时间处理处理函数*/printf("%d-%d-%d

",(1900+p->tm_year),

(1+p->tm_mon),p->tm_mday);printf("%s

%d:%d:%d\n",

wday[p->tm_wday],

p->tm_hour,

p->tm_min,

p->tm_sec);p=localtime(&timep);/*调用日期时间处理处理函数*/printf

("%d-%d-%d

",

(1900+p->tm_year),(

1+p->tm_mon),

p->tm_mday);printf("%s

%d:%d:%d\n",

wday[p->tm_wday],p->tm_hour,

p->tm_min,

p->tm_sec);return

0;}第53页/共66页15.8

诊断函数

assert()函数是诊断函数,它的作用是测试一个表达式的值是否为false,也就是为0,并且在条件为false时终止程序,参数的表达式的结果是一个整型数据。assert()函数定义在标准函数库<assert.h>头文件中定义的。例如

assert(a==b);

当a和b想当时,表达的结果是1,也就等同于true,如果a和b不等时,结果就是0,也就是false,然后根据结果决定是否终止程序。当程序出现异常时,可以使用abort()函数以非正常方式立即结束应用程序。第54页/共66页15.8

诊断函数【范例15-14】诊断函数的应用01#include<stdio.h>/*包含标准输入输出头文件*//*包含诊断处理头文件*//*调用诊断函数*/#include

<assert.h>struct

ITEM{int

key;int

value;};/*诊断ITEM结构对象是否为false*/09

void

additem(struct

ITEM

*itemptr)10{assert(itemptr

!=

NULL);}int

main(){additem(NULL);return

0;}第55页/共66页15.9

命令行参数

标准C允许主函数main()有或没有参数列表,所以可以在主函数main()中使用一个或多个的参数,比如下面主函数的形式:int

main(int

argc,

char

*argv[])

这是main函数通常的写法,其中第一个参数argc,argc是英文argumentcounter的简写,表示传递给主函数main()有多少个参数,第2个参数argv[]以字符串数组的形式用来接收真正的参数,它是英文argument

value的简

写。

main()函数本身是索引为0的参数,所以,argc至少为1。用户在控制台环境中程序路径和名称后键入含参数将传递给argv[1],argv[2]等。第56页/共66页15.9

命令行参数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论