1、练习 4一、选择题。1. 以下对编译预处理命令的正确的说法是( ABC ) 。A、 C 语言中的编译预处理命令包含宏定义、文件包含和条件编译B、 C 语言中的编译预处理命令以#号开头C、C 语言中的编译预处理命令一般位于程序代码的首部D、C 语言中的编译预处理命令以分号结束2. 设有不带参的宏定义#define N 20+1 ,则以下说法不正确的是:( C ) 。A、 编译预处理阶段,程序代码中所有的宏名 N 被原样替换为 20+1B、 该不带参宏定义中的 20+1 为宏替换字符串C、 该不带参宏定义中的 20+1 为整型表达式D、 该不带参宏定义中的宏名 N 没有数据类型的概念3. 定义一个
2、带参的宏名 f(x)计算表达式 2*x*(x+1)的值,则以下带参宏定义中正确的定义形式是:( B ) 。A、#define f(x) 2*x*(x+1) B、#define f(x) (2*(x)*(x)+1)C、#define 2*(x)*(x)+1) f(x) D、#define f 2*x*(x+1)4. 以下对条件编译不正确的说法是( B ) 。A、 条件编译是指在部分程序代码在满足指定条件的情况下才参与编译,否则不参与编译。B、 无论是否使用条件编译,所有程序代码均要进行编译C、 使用条件编译和使用 if 语句是有区别的D、 合理使用条件编译可以减少需要参与编译的语句数量,生成的目
3、标程序小,程序执行效率高。5. 文件包含命令#include 和#include“math.h ”的区别在于( D ) 。A、 前者先在编译系统指定的目录下查找文件 math.h,如果找不到再到用户当前目录下查找B、 后者先在编译系统指定的目录下查找文件 math.h,如果找不到再到用户当前目录下查找C、 两者均是先在编译系统指定的目录下查找文件 math.h,如果找不到再到用户当前目录下查找D、 前者仅在编译系统指定的目录下查找文件 math.h,后者先在用户当前目录中查找文件,如果找不到再到编译系统指定的目录下查找6. 以下对将 C 程序的多个源文件连接生成可执行文件的说法中不正确的是(
4、C ) 。A、 使用工程文件的方式下,每个源文件分别编译生成一个目标文件,然后再进行连接生成可执行文件B、 使用文件包含命令的方式下,通过编译预处理生成一个包含所有源文件代码的新的源文件,将该源文件编译成目标文件,然后再进行连接生成可执行文件。C、 使用文件包含命令的方式下,不必考虑多条文件包含命令的顺序。D、 工程文件的作用是告诉编译系统需要将那些源文件进行编译、连接并生成一个可执行文件7. 当说明一个结构体变量时,系统分配给它的内存是( A )A、结构体中各成员所需内存量的总和 B、结构体中第一个成员所需内存量C、结构体中占内存量最大的成员所需的内存量 D、结构体中最后一个成员所需内存量8
5、. 当说明一个共用体变量时,系统分配给它的内存是( C )A、共用体中各成员所需内存量的总和 B、共用体中第一个成员所需内存量C、共用体中占内存量最大的成员所需的内存量 D、共用体中最后一个成员所需内存量9. 以下关于 typedef 的叙述不正确的是( B )A、 用 typedef 可以定义各种类型名,但不能用来定义变量 B、 用 typedef 可以增加新类型C、 用 typedef 只是将已存在的类型用一个新的名称来代表 D、 使用 typedef 便于程序通用10. 下面四个运算符中,优先级最低的是( A )A、 ( ) B、 C、 - D、+11. 以下关于枚举的叙述不正确的是(
6、D )A、枚举变量只能取对应的枚举类型的枚举元素表中的元素B、可以在定义枚举类型时对枚举元素进行初始化C、枚举元素表中元素有先后次序,可以进行比较 D、枚举元素的值可以是整数或者字符串。12在下列程序中,枚举变量 c1 和 c2 的值分别是( A )和( D )#includevoid main( )enum color red,yellow,blue=4,green,whitec1,c1;c1=yellow;c2=white;printf(“%d,%dn“,c1,c2);A、 1 B、3 C、 5 D、 613已知有如下定义,若有 p=float b;data,*p;A、 (*p).data
7、.a B、 (*p).a C、p-data.a D、p.data.a14设有以下定义和语句,struct studentint num,age;struct student stu3=2001,20,2001,21,2001,19;struct studeng *p=stu;则以下错误的引用是( D )A、(p+)-num B、p+ C、(*p).num D、p= float y; char z;example;则下面的叙述中不正确的是( B )A、struct 是结构类型的关键字 B、example 是用户定义的结构类型名C、x,y,z 都是结构成员名 D、struct ex 是用户定义的结
8、构类型16设有以下语句:struct st int n;st *next;static st a3=5,p=则以下表达式值为 6 的是( B )A、p+-n B、+p-n C、(*p).n+ D、p-n+17选择下面程序的运行结果是( B )#include struct stu int num; char name10;int age;void fun(stu *p) printf(“%sn“,(*p).name); void main() struct stu students3=9801,“Zhang“,20,9802,“Long“,21,9803,“Xue“,19;fun(studen
9、ts+2);A、Zhang B、Xue C、Long D、1818当已存在一个 abc.txt 文件时,执行 fopen(“abc.txt“,“r+“)的功能是( D )A、打开 abc.txt 文件,清除原有的内容 B、打开 abc.txt 文件,只能写入新的内容C、打开 abc.txt 文件,只能读取原有内容 D、打开 abc.txt 文件,可以读取和写入新的内容19若用 fopen 函数打开一个新的二进制文件,该文件可以读也可以写,则文件打开的模式是( C )A、“ab+“ B、“wb+“ C、“rb+“ D、“ab“20若用 fopen 函数打开一个已经存在的文本文件,保留该文件原有数
10、据且可以读也可以写,则文件操作模式是( C )A、“r+“ B、“w+“ C、“a+“ D、“a“21使用 fseek 函数可以实现的操作是( C )A、改变文件的位置指针的当前位置 B、文件的顺序读写C、文件的随机读写 D、以上都不对22fread(buf,64,2,fp)的功能是( D )A、从 fp 文件流中读出整数 64,并存放在 buf 中;B、从 fp 文件流中读出整数 64 和 2,并存放在 buf 中;C、从 fp 文件流中读出 64 个字节的字符,并存放在 buf 中; D、从 fp 文件流中读出 2 个 64 个字节的字符,并存放在 buf 中;23 以下程序的功能是( B
11、 )#includevoid main()FILE *fp;char str=“Hello“;fp=fopen(“PRN“,“w“);fputs(str,fp);fclose(fp);A、在屏幕上显示“Hello“ B、把“Hello“ 存入 PRN 文件中C、在打印机上打印出“Hello“ D、以上都不对24检测 fp 文件流的文件位置指针在文件头的条件是( B )A、fp=0 B、ftell(fp)=0 C、fseek(fp,0,SEEK_SET) D、feof(fp)25以下程序的功能是( A )#includevoid main()FILE *fp;fp=fopen(“abc“,“r+
12、“);while(!feof(fp)if(fgetc(fp)=*)fseek(fp,-1L,SEEK_CUR);fputc($,fp);fseek(fp,ftell(fp),SEEK_SET);fclose(fp);A、将 abc 文件中所有* 均替换成$ B、查找 abc 文件中所有*C、查找 abc 文件中所有 $ D、将 abc 文件中所有字符均替换成$二、填空题1、C 语言提供的预处理命令功能主要有三种: 宏定义 , 文件包含 , 条件编译 。且分别用 #define , #include , #if 或#endif 来实现。为了与一般的 C 语句相区别,这些命令以 # 符号开头。2、
13、结构体变量成员的引用方式是使用 成员运算符. 运算符,结构体指针变量成员的引用方式是使用 成员运算符- 运算符。3、设 struct student int no;char name12;float score3; sl,* p = b; 则 sizeof(b)的值是_100_。7、C 语言流式文件的两种形式是 ASCII 码文件 和 二进制文件 。8、C 语言打开文件的函数是 fopen ,关闭文件的函数是 fclose 。9、按指定格式输出数据到文件中的函数是 fprintf ,按指定格式从文件读取数据的函数是 fscanf ,判断文件指针到文件末尾的函数是 EOF 。10、输出一个数据块
14、到文件中的函数是 fwrite ,从文件中输入一个数据块的函数是 fread ;输出一个字符串到文件中的函数是 fputs ,从文件中输入一个字符串的函数是 fgets 。11、feof(fp)函数用来判断文件是否结束,如果遇到文件结束,函数值为 0 ,否则为 1 。12、在 C 语言中,文件的存取是以 字节 为单位的,这种文件被称作 流式 文件。三、阅读程序,写出运行结果。1#define PI 3#define S PI*r*r#define V 4*S*r/3void main()float r=2;printf(“S=%.2f, V=%.2f”,S,V);答案:S=12.00, V=3
15、2.002 #define FX(x) x*(x+2)(x-2)void main( )int a=3,b=2;printf(“%dn“, FX(2+a+b);答案:953 #define PRT(x) printf(“%dt”,x)#define PRINT(x) PRT(x);printf(“well done!”)void main()int x=3,i;for(i=0;istruct twoint x, *y ; *p;int a8=1,2,3,4,5,6,7,8;two b4=100,void main() p=b;printf(“%dn“,+(p-x);答案:1015#includ
16、estruct n_cint x;char c;void func(struct n_c b)b.x=20;b.c=y;void main( )struct n_c a=10,x;func(a);printf(“%d%c“,a.x,a.c);return 0;答案:10x四、编程题。1、圆柱形体积公式为:v=area*h。其中 area=*r*r,圆周率 取值为 3.14。要求使用不带参宏定义实现计算圆柱体体积功能,r 和 h 的值由用户键盘输入。#include#define PI 3.14#define Area PI*r*r#define V Area*hvoid main()int r
17、,h;printf(“请输入圆柱的半径:“);scanf(“%d“,printf(“请输入圆柱的高 : “);scanf(“%d“,printf(“圆柱的体积为 %.2f:“,V);2、编写一个带参的宏定义,实现通过宏替换求式子 f(x)=4x3+3x2-2x+1 值的功能,其中 x 为形参。要求在 main 函数中通过宏替换求下面两个式子的值,式子中的 m 由用户键盘输入。#include#define f(x) 4*(x)*(x)*(x)+3*(x)*(x)-2*(x)+1void main()int m,f;printf(“请输入一个整数:“);scanf(“%d“,printf(“f(
18、x)=%d“,f(m);3、编写 3 个源文件 file1.c、 file2.c 和 file3.c,在 file2.c 中编写函数 fun1 求两个整数的和,在file3.c 中编写函数 fun2 求两个整数的差,在 file1.c 中编写 main 函数调用这两个函数求两个整数的和与差并输出结果。file1.c:#includeint fun1(int a,int b);int fun2(int a,int b);void main()int x,y,sum,Diff;printf(“请输入 x 和 y 两个整数 :“);scanf(“%d,%d“,sum=fun1(x,y);Diff=f
19、un2(x,y);printf(“n %d+*%d=%d“,x,y,sum);printf(“n %d-%d=%d“,x,y,Diff);file2.c:int fun1(int a,int b)int c;c=a+b;return c;file3.c:int fun2(int a,int b)int c;c=a-b;return c;4、要求:分别使用工程文件和文件包含命令两种方式将 3 个源文件连接生成一个可执行文件。答案:见例题。5、有 4 个学生,每个学生包括学号,姓名,成绩。要求找出成绩最高者的姓名和成绩。#include struct stu int No; char Name10
20、; int Score; int searchMax(struct stu *student,int n)int i,max;max=0;for(i=0;iScoreScore)max=i;return(max);void main() struct stu student4;int i,n;for(i=0;i struct data int year; int month; int day; int Day(struct data *y)int t=28,n=0;if(y-year%4=0switch(y-month)case 12: n+=30;case 11:n+=31; case 10
21、:n+=30;case 9:n+=31;case 8:n+=31;case 7:n+=30;case 6:n+=31;case 5:n+=30;case 4:n+=31;case 3:n+=t;case 2:n+=31;n+=y-day;return(n);void main() struct data s;int t=0,k,n;dok=0;printf(“请输入年月日 (1999.6.18):“);scanf(“%d.%d.%d“,if(s.year%4=0if(s.month12)printf(“月份输入错误 !n“);k=1;continue;switch(s.month)case 1
22、:case 3:case 5:case 7:case 8:case 10:case 12:if(s.day31)printf(“日期输入错误!n“);k=1;break;case 4:case 6:case 9:case 11:if(s.day30)printf(“日期输入错误!n“);k=1;break;case 2:if(t=0k=1;break;else if(t=1k=1;break;while(k=1);n=Day(printf(“是第 %d 天n“,n);7、编写一个 C 程序,将指定的文本文件中的所有小写字母转换成对应的大写字母,其他的字符格式不变。#includevoid main()FILE *fp;char c;fp=fopen(“abc.txt“,“r+“);while(!feof(fp)c=fgetc(fp);if(c=afputc(c-32,fp);fseek(fp,ftell(fp),SEEK_SET);fclose(fp);