省二级C等级考试进阶考点2文件宏枚举库函数.docx
- 文档编号:26939736
- 上传时间:2023-06-24
- 格式:DOCX
- 页数:19
- 大小:24.93KB
省二级C等级考试进阶考点2文件宏枚举库函数.docx
《省二级C等级考试进阶考点2文件宏枚举库函数.docx》由会员分享,可在线阅读,更多相关《省二级C等级考试进阶考点2文件宏枚举库函数.docx(19页珍藏版)》请在冰豆网上搜索。
省二级C等级考试进阶考点2文件宏枚举库函数
枚举类型数据
1.枚举类型定义(**)
如果一个变量只有几种可能的值,可以将其定义为枚举类型
定义格式如下:
enum枚举类型名{枚举值1,枚举值2,……};
例如:
enumweekday{sun,mon,tue,wed,thu,fri,sat};
enum为关键字
weekday为枚举类型名
大括号中的数据称为枚举元素或者枚举常量。
枚举类型定义不分配内存。
2.枚举变量的命名、声明(***)
枚举类型变量名采用用户自定义的合法标识符。
枚举类型的功能是将变量可能的值一一列举出来,变量的值只能取列举出来的值之一。
1)先定义枚举类型,在声明枚举变量
一般形式如下:
enum枚举类型名枚举变量名列表;
例如,先定义枚举类型:
enumweekday{sun,mon,tue,wed,thu,fri,sat};
再声明枚举变量:
enumweekdayworkday,week_end;
枚举变量workday和week_end的值只能是sun~sat中的一个。
2)在定义枚举类型的同时声明枚举变量
例如:
enumweekday{sun,mon,tue,wed,thu,fri,sat}workday,week_end;
或者缺省枚举类型名:
enum{sun,mon,tue,wed,thu,fri,sat}workday,week_end;
此处,weekday为类型名,workday和week_end为变量名,类型名与变量名一定要分清。
3)用typedef说明枚举类型
例如:
typedefenumweekday{sun,mon,tue,wed,thu,fri,sat}WEEK;
WEEKworkday,week_end;
3.枚举常量的使用(***)
枚举元素的值均为常量,枚举元素也叫枚举常量,其值不能改变,不能被赋值。
在没有指定的情况下,枚举类型定义中第一个枚举元素的值为0,其后的顺序加1。
定义枚举类型时可由程序员指定枚举元素的值,例如:
enumweekday{sun=7,mon=1,tue,wed,thu,fri,sat}workday,week_end;
若没有指定,则后一个枚举元素的值为前一个枚举元素的值加1。
因此可以得到tue的值为2,wed的值为3,依次类推。
例如:
week_end=sat;printf("%d",week_end);输出整数6。
4.枚举变量的赋值及使用(**)
枚举变量的值只能为规定的枚举元素,不能为其他的值。
例如:
week_end=sat;
将变量week_end赋值为sat。
枚举类型与整型是不同的数据类型,不能直接赋值,要进行强制类型转换才可以进行赋值,例如:
workday=(enumweekday)3;
枚举类型可以进行判断,例如:
if(workday==mon)……
if(workday>wed)……
预处理命令
1.预处理的概念和特点(*)
1)预处理的概念(*)
凡是“#”号开头的行,都被称为“编译预处理”命令行。
所谓“编译预处理”,就是在C编译程序前对源程序进行编译前,由C语言编译预处理程序对这些预处理命令进行处理的过程。
2)预处理的特点(**)
1预处理命令以“#”号开头。
2预处理命令每行的末尾不得加分号“;”。
3预处理命令#defile和#include一般放在程序的开始位置。
4有的预处理命令根据需要可以出现在程序的任何一行的开头,其作用一直持续到源文件的末尾。
2.#define命令及其使用(****)
#defile命令实现宏定义,编译程序在宏替换时只做正文代换,不做任何计算。
1)定义符号常量(***)
不带参数的宏定义命令行形式如下:
#defile宏名替换文本
例如:
#defilePRICE10
标识符PRICE为宏名,也叫符号常量,是用户自己定义的合法的标识符。
在编译时,此命令行之后源程序中所有名为PRICE的标识符都用10来替换,这个过程称为“宏替换”。
1宏名习惯上用大写表示,便于与变量的区别,但也可允许用小写。
2宏定义不是说明或语句,在行未没有分号,如果加上分号,则一起替换。
3当宏定义一行写不下时,要写在下一行需要在最后一个字符后跟一个反斜线“\”。
4双引号中的与宏相同的字符串不替换。
5宏定义一般写在函数之外,作用范围是从宏定义命令开始到源程序结束,所以只有命令行之后的源程序中的宏名才会被替换。
若提早终止则用#undef命令。
6宏定义允许嵌套。
在宏定义的字符串中可以使用已经定义的宏名,在宏展开时层层替换。
7宏替换只是简单的替换,编译预处理不对其作语法检查。
2)定义带参数的宏(****)
带参数的宏定义命令行形式如下:
#defile宏名(形式参数表)替换文本
例如:
#defineADD(x,y)(x+y)
在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。
替换时,不仅要宏展开,而且要用实参代换形参。
1宏名和形式参数表间不能有空格。
2在替换过程中,先替换,再计算
注意替换文本中有没有圆括号,若没有,不要人为添加圆括号。
例如,写出以下程序的输出结果:
#include
#defineADD(x,y)x+y
main()
{inta=15,b=10,c=20,d=5;
printf(“%d\n”,ADD(a,b)/ADD(c,d));
}
3)带参数的宏与函数的区别(****)
(1)形参与实参的不同
带参数的宏中,形式参数不分配内存,没有类型说明,实际参数有具体的值,要替换形参,要有类型说明;
函数的形式参数与实际参数是两个不同的量,各有自己的作用域,都有类型说明。
(2)带参数的宏与带参数的函数本质上是不同的:
宏只是符号替换
函数存在值的传递。
(3)替换或传递时是否先求值
带参数的宏定义中的形参是标识符,宏调用中的实参可以是表达式,替换时对实参的表达式不作计算直接替换。
而函数调用时要把实参表达式的值求出来再传递给形参。
3.#include命令及其使用(****)
文件包含的意思就是在一个文件中包含另一个文件的全部内容。
C语言的“#include命令”实现文件包含操作。
#include预处理命令的形式如下:
#include<头文件名>
或者
#include"头文件名"
编译时,预编译程序用指定文件中的内容替换此命令行,从而将指定的文件和当前的文件连成一个源文件。
1#include命令行写在文件的开头,有时也把包含文件叫做“头文件”。
2在用到系统库函数时,要包含该函数所在的头文件。
例如:
#include
#include
3一个include命令只能指定包含一个被包含文件,若有多个文件要包含,需用多个include命令。
4文件包含允许嵌套,即在一个被包含文件中又可以包含另一个文件。
文件操作
文件是存储在外部介质上数据的集合,按数据的组织形式可以将文件分成两类:
(1)文本文件
ASCII文件,每个字节存放一个字符的ASCII码。
特点:
存储量大、速度慢、便于对字符操作。
(2)二进制文件
数据按其在内存中的存储形式原样存放。
特点:
存储量小、速度快、便于存放中间结果。
将运行结果及准考证号输出到文件是江苏省等级考试必考的内容。
文件部分必须掌握:
•文件指针变量的声明
•文件打开关闭操作
•文件的打开方式
•文件的输入输出函数。
1.文件指针变量的声明(*****)
1)定义文件指针
定义文件类型指针的一般形式如下:
FILE*文件指针变量名;
例如:
FILE*fp;
定义了fp是一个指向文件类型的指针变量。
通过文件指针就可以对它所指的文件进行各种操作。
1FILE实际上是一个结构体类型名,必须大写,该结构体类型在stdio.h文件中已声明,只要用#include
2文件指针变量名是用户自己定义的合法的标识符,命名方式与普通变量相同。
若只有一个文件指针变量,习惯上用fp。
习惯上就把fp看作一个指向文件的指针。
2.缓冲文件系统常用操作函数的使用
文件使用的方式分三步:
打开文件、文件读/写、关闭文件。
所以使用文件前必须先打开,使用完了以后必须要关闭。
1)文件的打开和关闭(*****)
文件的打开通过fopen()函数实现,关闭通过fclose()函数实现。
(1)fopen()
功能:
按指定方式打开文件。
正常打开,指向文件指针;打开失败,为NULL。
格式:
文件指针名=fopen("文件名","使用文件方式");
例如:
FILE*fp;
fp=fopen("c:
\\ex\\test.dat","r");
FILE*fp1;
fp1=fopen("ex","wb");
1“文件指针名”是被说明为“FILE”类型的指针变量。
2“文件名”是被打开文件的文件名。
文件包含盘符和路径。
盘符与文件夹之间、文件夹与文件夹之间、文件夹与文件名之间用双斜线“\\”,若缺省盘符指当前盘,缺省路径指当前文件夹。
“文件名”可以看作字符串常量或者字符串数组。
3使用文件的方式:
r/rb(只读)为输入打开一个文本/二进制文件
w/wb(只写)为输出打开或建立一个文本/二进制文件
a/ab(追加)向文本/二进制文件尾追加数据
r+/rb+(读写)为读/写打开一个文本/二进制文件
w+/wb+(读写)为读/写建立一个文本/二进制文件
a+/ab+(读写)为读/写打开或建立一个文本/二进制文件
有“b”表示打开的是二进制文件;
无“b”或者用“t”表示打开的是文本文件即ASCII码文件。
有“+”既可读又可写
无“+”只能读或者写或者追加:
“r”:
读方式,该文件已存在,一般有内容;
“w”:
写方式,打开一个文件,若该文件不存在,则建立该文件,若已存在,则删除该文件重建一个新文件;
“a”:
文件已存在,可以在末尾增加内容。
4文件打开与测试:
FILE*fp;
fp=fopen("d:
\\myf2.out","w");
if(fp==NULL)
{printf("Fileopenerror!
\n");
exit(0);
}
意为创建一个新的文件,成功返回文件指针fp,失败,返回0。
这样保证在程序中使用正确打开的文件。
这是等级考试上机编程题中必须有的内容,要把输出结果写到文件中,首先要创建一个文件,采用的方式就是用“w”方式打开一个不存在的文件。
(2)fclose()
功能:
关闭文件指针指向的文件。
格式:
fclose(文件指针名);
例如:
fclose(fp);
关闭fp指向的文件。
1文件读写操作完成后必须将文件关闭,不关闭文件可能会丢失数据。
2成功关闭返回0,否则返回非0。
2)格式化输入输出(****)
格式化输入输出函数可以按格式对文件进行I/O操作。
其功能与scanf和printf相同,都是格式化输入输出函数,他们的区别是:
•scanf和printf的读写对象是键盘和显示器
•fscanf和fprintf的读写对象是文件。
(1)fprintf()(*****)
功能:
将输出项按格式控制符的格式输出到fp指针指向的文件中。
格式如下:
fprintf(文件指针名,"格式控制字符串",输出表列);
例如:
fprintf(fp,"%d,%6.2f",i,t);
又如,将考生的准考证号“12345678”写到fp指向的文件中:
fprintf(fp,"12345678");
1磁盘文件必须是ASCII码文件。
2输出时将数据转换成字符串,因而速度较慢。
3输出格式与printf函数类似,只要在“格式串”前加上文件指针。
(2)fscanf()(****)
功能:
从fp指针指向的文件中读出格式控制符样式的文本到指定变量中。
格式如下:
fscanf(文件指针名,"格式控制字符串",输入表地址);
例如:
fscanf(fp,"%d,%f",&i,&t);
1磁盘文件必须是ASCII码文件。
2输入时将字符串转换成数字值(二进制)。
3输入格式与scanf函数类似,只要在“格式串”前加上文件指针。
3)字符输入输出(***)
(1)fgetc()
功能:
从文件指针指向的文件中读出一个字符赋值给变量。
格式如下:
变量名=fgetc(文件指针名);
例如:
c=fgetc(fp);
从fp指针指向的文件中读出一个字符赋给变量c。
本功能可以用fscanf实现:
fscanf(fp,"%c",&c);
(2)fputc()
功能:
把一个字符写入到fp指向的文件中。
格式如下:
fputc(ch,文件指针名);
ch是一个字符常量或字符变量。
例如:
fputc(c,fp);
把变量c中的字符写到fp指针指向的文件中。
本功能可以用fprintf实现:
fprintf(fp,"%c",c);
4)字符串输入输出(**)
(1)fgets()
功能:
从文件指针指向的文件中读出一个字符串到字符数组中。
格式如下:
fgetc(字符数组名,读出字符长度n,文件指针名);
例如:
fgets(str,10,fp);
从fp指针指向的文件中读9个字符到数组str中。
这里的字符个数为n-1,因为要在最后加上字符串结束标志‘\0’。
若用fscanf实现:
fscanf(fp,"%s",str);
读入字符串时,遇换行符或文件尾(EOF)即结束,并在最后加一个‘\0’。
(2)fputs()
功能:
把s指向的字符串写入fp指向的文件中。
格式如下:
fputs(字符数组名或字符串,文件指针名);
例如:
fputs("Hello",fp);
将字符串“Hello”写到fp指向的文件中。
若用fprintf实现:
fprintf(fp,"Hello");
5)数据块输入输出(****)
数据块输入输出函数用于读/写一个数据块。
(1)fread()
功能:
从文件指针指向的文件中读若干个指定大小的数据放入数组。
格式如下:
fread(buffer,size,count,fp);
例如:
fread(&f[i],4,1,fp);
从fp指向的文件中读4个字节的1块数据到数组元素f[i]中。
又如:
fread(f,4,2,fp1);
从fp1指向的文件中读4个字节的2块数据到数组f中。
f为实型数组名,本身表示地址,所以前面不要再加“&”。
实型数据占4个字节,即读了2个实数。
(2)fwrite()
功能:
将某指定地址中的指定大小的若干块数据写入fp指针指向的文件中,格式如下:
fwrite(buffer,size,count,fp);
例如:
fwrite(&f[i],4,1,fp);
将数组元素f[i]中的4个字节的1块数据写到fp指向的文件中。
1fread是输入,fwrite是输出,它们一般用于二进制文件的输入/输出。
2buffer:
输入/输出数据块的首地址,一般为数组名。
3size:
每个要读/写的数据块的大小(字节数)。
4count:
要读/写的数据块的个数。
5fp:
要读/写的文件指针。
6)与文件有关的其他函数(***)
(1)feof()(***)
功能:
判断文件是否结束。
格式如下:
feof(文件指针);
文件结束,返回真(非0);文件未结束,返回0。
例如:
判断二进制文件是否结束
while(!
feof(fp))
{c=fgetc(fp);
……}
又如:
while(!
feof(in))fputc(fgetc(in),out);/*复制*/
(2)rewind()(***)
功能:
重置文件位置指针到文件开头。
文件位置指针是指向文件当前读写位置的指针。
格式如下:
rewind(文件指针);
例如:
rewind(fp);
将fp指针指向的文件的文件位置指针指向该文件的起始位置。
(3)fseek()(****)
功能:
改变文件位置指针的位置,用于文件的定位。
格式如下:
fseek(文件指针,位移量,起始点)
fseek函数的起始点
起始点
名字
用数字代表
文件开始
SEEK_SET
0
文件当前位置
SEEK_CUR
1
文件末尾
SEEK_END
2
在fseek函数中,起始点既可以用名字也可以用数字代表。
例如:
fseek(fp,50L,0);
fseek(fp,-10L,SEEK_END);
(4)ftell()(*)
功能:
返回位置指针当前位置(用相对文件开头的位移量表示)。
格式如下:
ftell(fp);
其他常用库函数
在C语言中,系统提供了很多库函数,用户可以直接进行调用。
常用的库函数主要有:
•数学函数
•字符串处理函数
•字符处理函数。
使用库函数应注意以下几个问题:
(1)函数功能
(2)函数参数的数目和顺序,及各参数意义和类型
(3)函数返回值意义和类型
(4)需要使用的包含文件
1.数学函数(***)
数学函数在头文件math.h中,如果要使用数学库函数,必须用#include
下面主要列出各函数的功能,对于只标一个星号的函数只要在碰到的时候看得懂即可,一般很少考到。
1)求绝对值函数(***)
(1)abs(x):
求整数x的绝对值。
例如:
x=-1,abs(x)的值为1。
(2)fabs(x):
求实数x的绝对值。
例如:
x=-3.5,fabs(x)的值为3.5。
2)求根号函数(****)
sqrt(x):
求
的值。
3)求乘方函数(***)
pow(x,y):
求xy的值。
4)求整数余数函数(*)
fmod(x,y):
求x除以y的余数,x、y为整数。
5)三角函数(*)
(1)sin(x)、cos(x)、tan(x)
以上三个三角函数分别求x的正弦、余弦和正切。
x单位为弧度。
(2)asin(x)、acos(x)、atan(x)
asin(x):
求sin-1(x)的值,x应在-1到1的范围内。
acos(x):
求cos-1(x)的值,x应在-1到1的范围内。
atan(x):
求tan-1(x)的值
6)指数和自然对数(*)
(1)exp(x)
求ex的值
(2)log(x)
以e为底的对数,即lnx。
2.字符串处理函数(*****)
使用字符串处理函数,用#include
1)字符串比较函数strcmp()
功能:
比较两个字符串。
格式:
strcmp(字符串1,字符串2);
比较规则:
对两个字符串从左向右逐个字符比较其ASCII码值,直到遇到不同字符或字符串结束标志'\0'为止。
返回值:
返回int型整数
1若字符串1<字符串2,返回负整数
2若字符串1>字符串2,返回正整数
3若字符串1==字符串2,返回零
1字符串比较不能用“>”,“<”,或“==”,必须用strcmp。
例如:
charstr1[20]="word!
",str2[20]="world!
";
strcmp(str1,str2)的结果为:
字符“d”的ASCII值减字符“l”的ASCII值即为-8。
2)字符串连接函数strcat()
功能:
把字符串str2连到字符串str1后面。
格式:
strcat(str1,str2);
返回值:
返回str1的首地址
1字符数组str1必须足够大。
2连接前,两串均以'\0'结束;连接后,串1的'\0'取消,新串最后加'\0'。
3
例如:
charstr1[20]="Hello!
",str2[20]="world!
";
strcat(str1,str2);的结果是数组str1的内容为“Hello!
world!
”,str2不变。
strcat(str2,str1);的结果是数组str2的内容为“world!
Hello!
”,str1不变。
3)字符串复制函数strcpy()
功能:
将str2复制到str1中。
格式:
strcpy(str1,str2);
返回值:
返回str1的首地址。
1str1必须足够大。
2复制时'\0'一同复制。
3不能使用赋值语句为一个字符数组赋值。
例如:
charstr1[20],str2[20];
strcpy(str1,"Hello!
");
将字符串“Hello!
”复制到str数组中。
4)字符串长度函数strlen()
功能:
计算字符串实际长度。
格式:
strlen(字符数组)
返值:
返回字符串实际长度,不包括字符串结束标志\0'在内。
例如:
对于以下字符串,strlen(s)的值分别为多少?
(1)chars[10]={'A','\0','B','C','\0','D'};
(2)chars[]="\t\v\\\0will\n";
(3)chars[]="\x69\082\n";
下面的程序用到了上面讨论的四个字符串处理函数:
#include
#include
main()
{charstr1[]="Hello!
",str2[]="Howareyou?
",str[20];
intlen1,len2,len3;
len1=strlen(str1);len2=strlen(str2);
if(strcmp(str1,str2)>0)
{strcpy(str,str1);strcat(str,str2);}
elseif(strcmp(str1,str2)<0)
{strcpy(str,str2);strcat(str,str1);}
elsestrcpy(str,str1);
len3=strlen(str);
puts(str);
printf("Len1=%d,Len2=%d,Len3=%d\n",len1,len2,len3);
}
3.字符处理函数(***)
使用字符处理函数,用#include
下面的字符函数都是判断一个字符属于什么类型的字符:
是,返回1;不是,返回0。
(1)isalpha(ch):
检查ch是否是字母。
(2)isdigit(ch):
检查ch是否是数字。
(3)islower(ch):
检查ch是否是小写字母。
(4)isupper(ch):
检查ch是否是大写字母。
(5)isspace(ch):
检查ch是否是空格
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二级 等级 考试 进阶 考点 文件 枚举 库函数