第九章编译预处理与带参数的主函数
一、单项选择题
1.C程序中,以#号带头的行是预编译(A)。
A.命令
B.语句
C.函数
D.字符串
2.下列正确的预编译命令是(B)。
A.define PI 3.14159
B.#define p(a,b) strcpy(a,b)
C. #include stdio.h
D. # define PI3.14159
3.下列命令或语句中,正确的是(C)。
A.#define MYNAME= “ABC”
B.#include stdio.h
C. for(i=0;i<10;i++);
D.struct int stu{int name};
4.下列命令或语句中,正确的是(A)。
A.#define PI 3.14159
B. include “stdio.h”
C.for(i=0,i<10,i++)a++
D.static struct {int i;}b={2};
5.下列命令或语句中,错误的是(B)。
A. #define PI 3.14159
B.#include
C.if(2);
D.for(; ;) if(1) break;
6.定义带参数的宏计算两式乘积(如x2+3x-5与x-6),下列定义中哪个是正确的(C)。
A.#define muit(u,v)u*v
B.#define muit(u,v)u*v;
C.#define muit(u,v)(u)*(v)
D.#define muit(u,v)=(u)*(v)
7.宏定义#define div(a,b) a/b的引用div(x+5,y-5)替换展开后是(A)。
A.x+5/y-5
B.x+5/y-5;
C.(x+5)/(y-5)
D.(x+5)/(y-5);
8.定义带参数的宏“#define jh(a,b,t)t=a;a=b;b=t”,使两个参数a、b的值交换,下列表述中哪个是正确的(D)。
A.不定义参数a和b将导致编译错误
B.不定义参数a、b、t将导致编译错误
C.不定义参数t将导致运行错误
D.不必定义参数a、b、t类型
9.设有宏定义#define AREA(a,b) a*b,则正确的“宏调用”是(D)。
A.s=AREA(r*r)
B.s=AREA(x*y)
C.s=AREA
D.s=c*AREA((x+3.5),(y+4.1))
10.设有以下宏定义,则执行语句z=2*(N+Y(5+1));后,z的值为(C)。
#define N 3
#define Y(n) ((N+1)*n)
A.出错
B.42
C.48
D.54
11.设有以下宏定义,int x,m=5, n=1时,执行语句IFABC(m+n,m,x);后,x的值为(B)。
#define IFABC(a,b,c) c=a>b?a:b
A.5
B.6
C.11
D.出错
12.以下程序中的for循环执行的次数是(C)。
#include “stdio.h”
#define N 2
#define M N+1
# define NUM (M+1)*M/2
void main( )
{ int i,n=0;
for(i=1;i<=NUM;i++){n++; printf(“%d”,n);}
printf(“\n”);
}
A.5
B.6
C.8
D.9
13.设有一程序编译连接成目标程序名为psl.exe,如果输入如下的命令:
psl 123 456 AAA ↙(其中的↙表示回车),则程序运行时,
会出错的语句是(B)。
A.printf(“%d”,argc);
B.printf(“%ds”,argv[4]);
C.printf(“%s”,argv[3]);
D.printf(“%s”,argv[2]);
14.格式1 #include “文件名”
格式2 #include <文件名>
下面4个结论,正确的是(D)。
A.格式1中的文件名能带路径,而格式2不能
B.格式1中的文件名不能带路径,而格式2可以
C.如果被包含文件在当前目录下,两种格式都能用
D.如果文件名中不带路径,格式1能搜索当前目标和系统规定的路径中搜索包含文件,而格式2
不行。
15.程序ccw1.c中有函数max1( ),程序ccw2.c中有调用函数max1( )的语句,则当程序ccw.c中有包含命令时,正确的写法是(C)。
A.#include “ccw2.c”
B.#include
#include “ccw1.c”#include
C.#include “ccw1.c”
D.两个包含命令次序可以任意
#include “ccw2.c”
二、填充题
1.C程序中,以“#”符号开头的命令是在源程序正式编译前进行处理的,称为编译预
处理命令。
2.使用分别编译方法时,在不同的编译单位间能传递的变量和函数是非静态存储类型变量和外部
函数。
3.设有定义如下:#include F(N) 2*N,则表达式F(2+3)的值是7 。
4.宏定义语句#define f(x,y) printf(x,y)的引用f(“%d\n”,m);置换展开printf(“%d\n”,m) 。
5.宏定义语句#define f(x,y)fopen(x,y)的引用f(“a.txt”, “rw”);置换展开后为forpen(“a.txt”, “rw”; 。
6.宏定义语句#define f(c) c> ‘A’&&c<= ‘Z’的引用f(x[i])置换展开后为x[i]>= ‘A’&&x[i]<= ‘Z’。
7.设有如下的宏定义:#include P(r,a) printf(r,a)当程序中执行“P(str,3);”语句后会输出i=3,则在程序
中应有定义语句char *str= “i=%d\n”;
8.设有下列程序:
#include
void main (int argc, char *argv[ ])
{ while (--argc>c) printf(“%s”,argv[argc]);
printf(“\n”);
}
假定上述程序编译连接成目标程序名为p.exe,如果输入如下的命令:
p 123 AAA BBB ↙(其中的↙表示回车)
则输出结果是BBB AAA 123 命令行中有4个字符串(包括p),因此,
argc=4, argv[0]→p, argv[1]→123, argv[2]→AAA, argv[3]→BBB。
三、程序分析题
1.阅读下面程序,写出运行结果。
#define M 5
#define N M*3+4
#define MN N*M
void main( )
{ printf(“%d,%d\n”,2*MN, MN/2);
}
程序运行结果为:50 25
2.阅读下面程序,写出运行结果。
#define EXCH(a,b) { int t; t=a;a=b;b=t}
void main( )
{ int x=5,y=9;
EXCH(x,y);
printf(“x=%d,y=%d\m”,x,y);
}
程序运行结果为:x=9, y=5
3.阅读下面程序,写出运行结果。
#define PR(ar) printf(“%d,”,ar)
void main( )
{ int j,a[]={1,3,5,7,9,11,13,15},*p=a+5;
for(j=3;j;j--)
switch(j)
{ case 1:
case 2:PR(*p++);break;
case 3: PR(*--p));
}
}
程序运行结果为:9 9 11
4.阅读下面程序,写出运行结果。
#include
#define PR(x,y)printf(“%s=\t%d\n”,x,y) x^y&~z=1
void main( ) x&y&z=0
{ int x=03,y=02,z=01; !x|x=1
PR(“x|y&z”,(x|y&z);PR(“x^y&~z”,x^y&~z); -x|x=-1
PR(“x&y&z”,x&y&z);x=1;y=-1;
PR(“!x|x”,!x|x);PR(“~x|x”,~x|x);
}
5.设下面的程序经编译连接后生成的目标程序名为:ABC.EXE,写出输入以下命令行后的输出:ABC FILE1 FTLE2↙(其中的↙表示回车)
#include “stdio.h ”
void main(int argc, char *argv[])
{ int i;
printf(“%d\n ”,argc);
for(i=0;i printf(“\n ”); } 程序输出:3 ABC FILE1 FILE2 6.读程序,写功能。 #include void main(int argc,char*argv[]) { FILE *f1,*f2; char ch; if(argc<3) {printf(“Parameter missing!\n ”);exit(0);} if(((f1=fopen(argv[1], “r ”))= =NULL||(f2=fopen(argv[2], “w ”))= =NULL {printf(“Can not open file!\n ”);exit(0);} while(!feof(f1)) fputc(fgetc(f1),f2); fclose(f1); fclose(f2); } 该程序的功能是:在用命令行的形式运行本程序时,必须在程序名后加二个参数,这二个参数分别表示磁盘上的二个文件名。程序运行后,能把第一个文件的内容拷贝到第二个文件。如果命令行缺少参数或文件打不开,程序终止运行并显示出错情况。 四、程序设计题 1.三角形的面积为))()((c s b s a s s area ---= 其中s=0.5(a+b+c), a 、b 、c 为三角形的三边。定义两个带参的宏,一个用来求s ,另一个用来求area 。写程序,在程序中用宏来求三角形的周长和面积。 #include #include #define S(a,b,c) 0.5*(a+b+c) #define AREA(a,b,c) sqrt(S(a,b,c)*(S(a,b,c)-a)*S(a,b,c)-b)*S(a,b,c)-c) void main( ) { float a,b,c; printf(“输入三角形的三条边长:a,b,c\n ”); scanf(“%f,%f,%f ”,&a,&b,&c); if((a+b>c)&&(b+c>a)&&(c+a>b)) { printf(“周长=%f\n ”,2*S(a,b,c)); printf(“面积=%f\n ”,AREA(a,b,c)); } else printf(“a,b,c 的长度不能构成三角形\n ”); } 2.设计一个复制文本文件的程序,源文件名和目标文件名随程序执行时输入。 #include void main(int argc, char*argv[]) { FILE *f1,*f2; char ch; if(argc<3) {printf(“Error! Useage:program-name source_file_name object_file_name\n”); exit(0);} if((f1=fopen(argv[1], “r”))= =NULL) {printf(“Can not open source file!\n”);exit(0);} if((f2=fopen(argv[2], “w”))= =NULL) {printf(“Can not open object file!\n”exit(0);) while (!feof(f1)) fput (fgect(f1),(f2)); fclose(f1);fclose(f2); } 3.设计一个程序,将随程序执行时输入的两个整数的和、差、积、整除商、模运算的结果输出#include #include void main(int argc, char*argv[]) { int a,b; if(argc<3) {printf(“Parameter missing!\n”); exit(0);} a=atoi(argv[1]); b=atoi(argv[2]); //在stdlib.h中有库函数atoi,把字符串转换成整数 printf(“%5d+%5d=%5d\n”,a,b,a+b); printf(“%5d-%5d=%5d\n”,a,b,a-b); printf(“%5d*%5d=%5d\n”,a,b,a*b); printf(“%5d/%5d=%5d\n”,a,b,a/b); printf(“%5d%%%5d=%5d\n”,a,b,a%d); } 4.设计一个程序,能将随程序执行时输入的任意个整数求和。 #include #include void main(int argc,char*argv[]) { int I,sum=0; for(I=1;1 printf(“和=%d\n”,sum); } 5.设计一个比较字符串的程序,两个字符串随程序执行时输入,输出其中大的字符串。 #include #include void main(int argc, char*argv[]) { if (argc<3) { printf(“Parameter missing!\n”); exit(0);} if(strcmp(argv[1],argv[2]>0) puts(argv[1]); else puts(argv[2]); } 第九章编译预处理 9.1 选择题 【题9.1】以下叙述中不正确的是。 A)预处理命令行都必须以#号开始 B)在程序中凡是以#号开始的语句行都是预处理命令行 C)C程序在执行过程中对预处理命令行进行处理 D)以下是正确的宏定义 #define IBM_PC 【题9.2】以下叙述中正确的是。 A)在程序的一行上可以出现多个有效的预处理命令行 B)使用带参的宏时,参数的类型应与宏定义时的一致 C)宏替换不占用运行时间,只占编译时间 D)在以下定义中C R是称为“宏名”的标识符 #define C R 045 【题9.3】请读程序: #define ADD(x) x+x main() { int m=1,n=2,k=3; int sum=ADD(m+n)*k; printf(“sum=%d”,sum); } 上面程序的运行结果是。 A)sum=9 B)sum=10 C)sum=12 D)sum=18 【题9.4】以下程序的运行结果是。 #define MIN(x,y) (x)<(y)?(x):(y) main() { int i=10,j=15,k; k=10*MIN(i,j); printf(“%d\n”,k); } A)10 B)15 C)100 D)150 【题9.5】在宏定义#define PI 3.14159中,用宏名PI代替一个。 A)常量B)单精度数C)双精度数D)字符串 【题9.6】以下程序的运行结果是。 #include 函数与编译预处理的实验操作 实验目的:了解函数的定义,掌握函数的调用和参数的传递及预编译命令实验要求:熟练掌握函数的调用及参数的传递 实验内容:1.在VC++下输入以下函数 #include } return r; } void output(int x,int n) { printf(“%6d”,x); if(n%5==0) printf(“\n”); } void main() { int m,n=0; for(m=2;m<=50;m++) if(prime(m)) { n++; output(m,n); } } #include 第九章编译预处理 一、单选题 1.以下对宏替换的叙述不正确的是 A)宏替换只是字符的替换B)宏替换不占运行时间 C)宏名无类型,其参数也无类型 D)带参的宏替换在替换时,先求出实参表达式的值,然后代入形参运算求值2.宏定义#define PI 3.14中的宏名PI代替 A)一个单精度实数)B)一个双精度实数 C)一个字符串 D)不确定类型的数 3.有以下宏定义 #define k 2 #define X(k) ((k+1)*k) 当C程序中的语句y = 2 * (K + X(5));被执行后, A)y中的值不确定 B)y中的值为65 C)语句报错 D)y中的值为34 4.以下程序的输出结果是 #define MIN(x, y) (x) < (y) ? (x) : (y) main() { int i , j, k; i = 10; j = 15; k = 10 * MIN(i, j); printf(“%d\n”, k); } A)15 B)100 C)10 D)150 5.以下程序中的for循环执行的次数是 #define N 2 #define M N + 1 #define NUM (M + 1) * M / 2 main() { int i; for(i = 1; i <= NUM; i++); pritnf(“%d\n”, i ); } A)5 B)6 C)8 D)9 6.以下程序的输出结果是 #include “stdio.h” #define FUDGF(y) 2.84 + y #define PR(a) printf(“%d”, (int) ( a ) ) #define PRINT1(a) PR(a); putchar(‘\n’) main() { int x = 2; PRINTF1(FUDGF(5) * X); } A)11 B)12 C)13 D)15 7.以下程序的输出结果是 #define FMT “%d,” main() 实验五函数与编译预处理 一、实验目的及要求 1.掌握函数定义的方法; 2.掌握函数实参与形参的对应关系以及“值传递”的方式; 3.掌握函数的嵌调用和递归调用的方法; 4.掌握全局变量和局部变量动态变量、静态变量的概念和使用方法。 5.学习对多文件程序的编译和运行。 二、实验学时 4学时 三、实验任务 1.阅读c60101.c程序,通过调试该程序,熟悉函数的调用方法及单步跟踪键F7和F8 的不同。 #include 第九章编译预处理 课题:第九章编译预处理 教学目的:1、了解预处理的概念及特点 2、掌握有参宏与无参宏的定义及使用,领会文件包含的使用及效果 教学重点:教学难点:掌握宏的使用,文件包含有参宏与无参宏的使用 步骤一复习引导 ANSI C标准规定可以在C源程序中加入一些“预处理命令”,以改进程序设计环境,提高编程效率。 这些预处理命令是由ANSI C统一规定的,但它不是C语言本身的组成部分,不能直接对它们进行编译。必须在对程序进行通常的编译之前,先对程序中这些特殊的命令进行“预处理”,即根据预处理命令对程序作相应的处理。经过预处理后程序不再包括预处理命令了,最后再由编译程序对预处理后的源程序进行通常的编译处理,得到可供执行的目标代码。 步骤二讲授新课 C语言与其他高级语言的一个重要区别是可以使用预处理命令和具有预处理的功能。C 提供的预处理功能主要有以下三种:宏定义、文件包含、条件编译。 分别用宏定义命令、文件包含命令、条件编译命令来实现。为了与一般C语句相区别,这些命令以符号“ #” 开头。 §9.1宏定义 宏:代表一个字符串的标识符。 宏名:被定义为“宏”的标识符。 宏代换(展开):在编译预处理时,对程序中所有出现的“宏名”,用宏定义中的字符串去代换的过程。 一、不带参数的宏定义 一般形式:#define 标识符字符串 #define PI 3.1415926 main() { float l, s, r, v; printf( “input radius:” ); scanf( “%f”, &r ); l = 2.0*PI*r; s = PI*r*r; v = 3.0/4*PI*r*r*r; printf(“%10.4f,%10.4f,%10.4\n”, l, s, v); } 实验六函数与编译预处理 实验六函数与编译预处理 1. void main() { float a,b,c; scanf("%f%f",&a,&b); c=add(a,b); printf("sum is %f\n",c); } float add(float x,float y) { float z; z=x+y; return(z); } //错误的地方,(1)没有包含头文件 t=x;x=y;y=t; printf("x=%d,y=%d\n",x,y); } //错误的地方,(1)没有包含头文件 第9章预处理命令 宏定义不是C语句,所以不能在行尾加分号。如果加了分号则会连分号一起进行臵换。 可以用#undef命令终止宏定义的作用域。 对程序中用“”括起来的内容(即字符串内的字符),即使与宏名相同,也不进行臵换。宏定义只做字符替换,不分配内存空间。 宏名不是变量,不分配存储空间,也不能对其进行赋值。 在宏展开时,预处理程序仅对宏名作简单的字符串替换,不作任何检查。 在进行宏定义时,可以引用已定义的宏名 无参宏定义的一般格式: #define 标识符字符串 将这个标识符(名字)称为“宏名”,在用预编译时将宏名替换成字符串的过程称为“宏展开”。#define是宏定义命令。 带参宏定义的一般格式: #define 宏名(形参表)字符串 带参宏的调用和宏展开: 调用格式:宏名(实参表); 宏展开(又称为宏替换)的方法:用宏调用提供的实参直接臵换宏定义中相应的形参,非形参字符保持不变。 定义有参宏时,宏名与左圆括号之间不能留有空格。否则,C编译系统会将空格以后的所有字符均作为替代字符串,而将该宏视为无参宏。 有参宏的展开,只是将实参作为字符串,简单地臵换形参字符串,而不做任何语法检查。 为了避免出错,可以在所有形参外,甚至整个字符串外,均加上一对圆括号。 如: #define S(r) 3.14*(r)*(r) 则:area=S(a+b); 展开后为: area=3.14*(a+b)*(a+b); 调用有参函数时,是先求出实参的值,然后再复制一份给形参。而展开有参宏时,只是将实参简单地臵换形参。函数调用是在程序运行时处理的,为形参分配临时的内存单元;而宏展开则是在编译前进行的,在展开时不分配内存单元,不进行值的传递,也没有“返回值”的概念。调用函数只可得到一个返回值,而用宏可以设法得到几个结果。 在有参函数中,形参都是有类型的,所以要求实参的类型与其一致;而在有参宏中,形参和宏名都没有类型,只是一个简单的符号代表,因此,宏定义时,字符串可以是任何类型的数据。 使用宏次数多时,宏展开后源程序变长,因为每展开一次都是程序增长,而函数调用不会使源程序变长。 宏替换不占用运行时间,只占编译时间。而函数调用则占用运行时间(分配单元、保留现场、值传递、返回)。 在程序中如果有带实参的宏,则按#define命令行中指定的字符串从左到右进行臵换。如果字符串中包含宏中的形参,则将程序语句中相应的实参(可以是常量、变量或表达式)代替形参。如果宏定义中的字符串中的字符不是参数字符,则保留。 实验六函数与编译预处理(参考答案)[实验任务一]: 程序跟踪调试实例6-1:error6_1.c参考答案 程序跟踪调试实例6-2:error6_2.c参考答案 程序跟踪调试实例6-3:error6_3.c参考答案 [实验任务二]: 程序填空实例6-1:blank6_1.c参考答案 程序填空实例6-2:print1.c参考答案 程序填空实例6-3:reverse.c参考答案 [实验任务三]: 编程实例6-1:primefun.c参考答案(第一种方法) 编程实例6-1:primefun.c参考答案(第二种方法) 编程实例6-1:primefun.c参考答案(第三种方法) 编程实例6-2:printnum.c参考答案 编程实例6-3:printa.c参考答案 编程实例6-4:power.c参考答案(第一种方法) 编程实例6-4:power.c参考答案(第二种方法) 编程实例6-5:Taile.c参考答案 编程实例6-6:value.c参考答案 编程实例6-7:LeRangDe.c参考答案 编程实例6-8:multifac.c参考答案 [实验任务四]: 程序1参考答案: #include 函数和编译预处理(第五章) 一、单项选择题 1.关于函数,以下正确的描述是( B) A. 函数的定义可以嵌套,但函数的调用不可以嵌套 B. 函数的定义不可以嵌套,但函数的调用可以嵌套 C. 函数的定义可以嵌套,函数的调用也可以嵌套 D. 函数的定义和函数的调用都不可以嵌套 2.关键字inline用于定义内联函数,定义时,是将该关键字( D ) A. 取代定义函数的类型标识符 B. 取代被定义的函数名 C. 加在类型标识符之后 D. 加在类型标识符之前 3.以下不正确的描述为( B ) A. 在函数之外定义的变量称为外部变量,外部变量是全局变量。 B. 在函数之内说明的外部变量是局部变量,仅在本函数中有效。 C. 在函数之外说明的静态变量也是全局变量,其作用域是文件作用域。 D. 文件作用的域范围是一个程序文件,但必须符合“定义在前,使用在后”的规则。4.以下正确的描述为( C ) A. 每个C++程序必须在开头用预处理命令#include 1.以下叙述中正确的是()。 A) 在C语言中,预处理命令行都以"#"开头 B) 预处理命令行必须位于C源程序的起始位置 C) #include 一、选择题 1、函数调用语句int fun( ) { return 50,60; },则函数调用后返回值为()。 A、50 B、60 C、50,60 D、编译错 2、设有函数定义调用语句“f((e1,e2),(e3,e4,e5));”,则实参个数是()。 A、2 B、3 C、4 D、5 3、若用下列程序 f(char a) { float b=5; b+=a/b; return b; } 则函数返回值的类型是()。 A、int B、char C、void D、float 4、若定义函数 int f(int x) { x++; return x; } 执行以下语句: int a=5; f(a)+f(a); 则a的值是()。 A、5 B、6 C、7 D、8 5、下列程序的运行结果是()。 fun1(int a, int b) { return fun2(a++, --b); } fun2(int a, int b) { return a/b; } void main( ) { int x=5, y=6; cout< 实验六函数与编译预处理(4学时) 实验前必须做的操作 ...... .........—— ..新建文件夹: 首先在各自对应的计算机ncre(k:)盘上对应座位号文件夹内新建一个文件夹,文件夹的名字为“班级+学号的后两位+姓名”,如座位号为K02,航海1111班、学号后两位是02的、姓名为“张强”的同学,则其对应的文件夹名字是:航海111102张强。然后在刚才建好的文件夹里面再建立一个文件夹,文件夹为“实验6”。 【实验目的】 1、掌握自定义函数的一般结构及定义函数的方法; 2、掌握函数的形式参数、实际参数、函数返回值等重要概念; 3、掌握函数实参与形参间的“值传递”方式; 4、掌握函数声明、函数调用的一般方法; 5、掌握模块化程序设计思想,会采用C语言中函数进行模块化程序设计; 6、掌握全局变量和局部变量作用域以及全局变量和局部变量的使用方法; 7、掌握函数的嵌套调用的程序的执行过程,会使用嵌套调用设计程序; 8、掌握使用函数递归调用的程序的执行过程,会使用递归程序解决实际问题; 9、理解宏的概念,掌握宏定义。了解文件包含的概念,掌握其用法; 10、学习对多文件程序的编译和运行; 11、熟练掌握VC程序调试方法,包括断点的设置和取消,以及单步执行跟踪进入函数和跳出函数的方法。【实验内容】 [实验任务一]:断点的设置和取消、单步执行跟踪进入函数和跳出函数方法练习 程序跟踪调试实例6-1:调试示例(请仔细按以下各步骤进行操作): 从键盘输入一个正整数n,计算n! 的值,要求定义和调用函数fact(n),计算n!。 Input n: 10 10! = 3628800 说明:实验五中我们使用了程序运行到光标位置调试程序,本次实验需要掌握设置断点,以及单步调试进入函数和跳出函数的方法。 【操作步骤】: (1)输入源程序,并以error6_1.c文件名最终保存在实验6文件夹里,编译程序,出现警告信息: 双击该警告信息,箭头指向“f=fact(n);”这一行,警告信息指出函数“fact”没有定义,而函数“fact”实际上已经定义了,这是为什么呢?因为函数在调用之前,必须先声明。在主调函数的变量定义前面加上函数声明“long fact(int m);”后,重新编译,连接,都正确。 注意: 如果将error6_1.c文件改为error6_1.cpp (即改为C++源程序文件) 可见VC++系统对.c文件和.cpp文件在进行编译时,对语法的要求不完全一样,这一点希望同学们注意。此处错误修改的方法与上面相同。 (2)调试开始,设置2个断点(断点的作用:程序执行到断点处暂停,使用户可以观察当前的变量或其它表达式的值,然后继续运行),先把光标定位到要设置断点的位置,然后单击编译工具条上的(Inert / Remove Breakpoint (F9)),断点就设置好了(如图6.1所示)。如果要取消断点,只要把光标放到要取消的断点处,单击,这个断点就取消了。 国家二级C语言机试(编译预处理和指针)模拟试卷7 (总分:56.00,做题时间:90分钟) 一、选择题(总题数:28,分数:56.00) 1.有以下程序:#include<stdio.h>void main() void fun(char*c) {char s[81];{while(*c) gets(s);fun(s);puts(s); {if(*c>='a'&&*c<='z')*c=*c-('a'-'A'); } c++: }} 当执行程序时从键盘上输入Hello Beijing<回车>,则程序的输出结果是 (分数:2.00) A.HELLO BEIJING √ B.Hello Beijing C.hello Beijing D.hELLO Beijing 解析:解析:子函数fun的功能是把小写字母转换成大写字母,所以程序的输出结果为选项A)。 2.有以下程序#include<stdio.h>void f(int*p,int*q) void f(int*p,int*q);{ main() p==p+1;*q=*q+1; { int m=1,n=2,*r=&m; } f(r,&n);printf("%d,%d",m,n); }程序运行后的输出结果是 (分数:2.00) A.2,3 B.1,3 √ C.1,4 D.1,2 解析:解析:本题考查函数的调用与指针。fun()函数的作用是:使指针p指向原来所指变量的下一个变量,使q指针指向的值加1。主函数中,指针r指向m,调用fun()函数的结果是,使r指向地址位于m后面的变量,使位丁n的地址上的变量(就是n)的值加1,因此,结果为1,3。 3.有以下程序 #include<stdio.h> main() void fun(int*a,int*b) { int x=3,y=5,*p=&x,*q=&y;{ int*c;fun(p,q);printf("%d,%d,",*p,*q);c=a;a=b;b=c;} fun(&x,&y);printf("%d,%d\n",*p,*q);}程序运行后的输出结果是 (分数:2.00) A.3,5,5,3 B.3,5,3,5 √ C.5,3,3,5 D.5,3,5,3 解析:解析:本题考查函数的调用与指针。p和q分别为指向x和y的指针,函数fun()的两个形参均为指针型,主要功能为交换两个指针的指向,当调用结束以后,该操作不能返回主函数。而主函数中,fun(p,q)、fun(&x,&y)的实参均为x与y的地址,因此,两者结果相同,并且两者指针指向的值不能变化。 4.有下列程序:void f(int b[]) {int I;for(i=2;i<6;i++)b[i]*=2;} main() {int a[10]={1,2,3,4,5,6,7,8,9,10},i;f(a);for(i=0;i<10,i++)printf("%d,",a[i]);}程序运行后的输出结果是 (分数:2.00) A.1,2,3,4,5,6,7,8,9,10, B.1,2,3,4,10,12,14,16,9,10, C.1,2,6,8,10,12,7,8,9,10,√ D.1,2,6,8,10,12,14,16,9,10, 解析:解析:函数void f(int b[])的功能是对数组b[]中第2个到第5个元素的值逐个扩大2倍。所以在main()函数中,f(a)语句的作用是对数组a[10]中从a[2]到a[5]的各个数字乘以2,因而数组a[10]的元素就变成了{1,2,6,8,10,12,7,8,9,10}。 5.有以下程序 #include<stdio.h> int fun(char s[]) main() {int n==0; {char s[10]={'6','1','*','4','*','9','*','0','*'};while(*s<='9'&&*s>='0') printf("%d\n",fun(s));{n=10*n+*s 第九章编译预处理与带参数的主函数 一、单项选择题 1.C程序中,以#号带头的行是预编译(A)。 A.命令 B.语句 C.函数 D.字符串 2.下列正确的预编译命令是(B)。 A.define PI 3.14159 B.#define p(a,b) strcpy(a,b) C. #include stdio.h D. # define PI3.14159 3.下列命令或语句中,正确的是(C)。 A.#define MYNAME= “ABC” B.#include stdio.h C. for(i=0;i<10;i++); D.struct int stu{int name}; 4.下列命令或语句中,正确的是(A)。 A.#define PI 3.14159 B. include “stdio.h” C.for(i=0,i<10,i++)a++ D.static struct {int i;}b={2}; 5.下列命令或语句中,错误的是(B)。 A. #define PI 3.14159 B.#include 第九章预处理 A部分(本、专科必做) 一、选择题 以下不正确的叙述是(D) A、宏替换不占用运行时间。 B、宏名无类型。 C、宏替换只是字符替换。 D、宏名必须用大写字母表示。 C语言的编译系统对宏命令的处理(D) A、在程序运行时进行的。 B、在程序连接时进行。 C、和C程序中的其它语句同时进行编译的。 D、在对源程序中其它语句正式编译之前进行的。 3、以下程序的输出结果是(C)。 A、15 B、100 C、10 D、150 #define MIN(x,y) (x)<(y)?(x):(y) void main() { int I,j,k; i=10;j=15;k=10*MIN(i,j); printf(“%d\n”,k); } 4、以下叙述中正确的是(D) 用#include包含的文件的后缀必须是“.h”。 若一些源程序中包含某个头文件;当该文件有错时,只需对该头文件进行修改,包含此头文件的所有源程序不必重新进行编译。 宏命令行可以看作是一行C语句。 预处理是在编译之前进行的。 5、以下叙述中正确的是(C) A、源程序中所有的行都参加编译。 B、宏定义常量与const定义常量是一样的。 C、宏定义可以嵌套定义,即在宏定义中的字符串可以引用另一个宏定义的标识符。 D、以上都不正确。 二、填空题 以下程序中for 循环执行的次数是 6 。 #define N 2 #define M N+1 #define NUM (M+1)*M/2 void main() { int i; for(i=1;i<=NUM;i++); printf(“%d\n”,i); } 2、以下程序的输出结果是x=93 。 #define A 3 #define B(a) ((A+1)*a) 实验3 函数和编译预处理 实验目的 1.掌握函数的定义和调用的方法。2.学会使用递归方法进行程序设计。3.掌握变量的作用域与存储类别。4.学会使用函数重载解决实际问题。5.学会使用宏 实验内容 1.阅读并运行程序,写出运行结果。 (1)#include 第九章习题答案 一、单项选择题 1.A 2.B 3.C 4.D 5.B 6.C 7.A 8.D 9.D 10.C 11.B 12.C 13.D 14.C 二、填充题 1.编译处理编译预处理 2.非静态存储类型变量和外部函数 3.7 4.printf(“%d\n”,m); 5.fopen(“a.txt”,”rw”); 6.x[i]>=’A’&&x[i]<=’Z’ 7.“ i=%d\n” 8.(1) #define MAX(a,b,c) (2) #define MIN(a,b) (a=’0’&& c<=’9’) (4) #define isupper( c) (c>=’A’&& c<=’Z’) (5) #define islower( c) (c>=’a’ && c<=’z’) 三、程序分析题 1.运行结果: -3 2.运行结果: 7,47 3.运行结果:50 25 4.运行结果:x=9, y=5 5.运行结果:9 9 11 6.输出结果: x|y&z=3 x^y&~z=1 x&y&z=0 !x|x=1 ~x|x=-1 四、程序设计题 1.解: #include 编译预处理
函数与编译预处理的实验操作
第九章 编译预处理
实验五 函数与编译预处理(题目)
C语言程序设计教案 第九章 编译预处理
实验六 函数与编译预处理
第9章 预处理命令
实验6 函数与编译预处理(参考答案)
函数和编译预处理
C二级 第9章 编译预处理和动态存储分配
5--函数和编译预处理
实验6 函数与编译预处理
国家二级C语言机试(编译预处理和指针)模拟试卷7
第九章编译预处理与带参数的主函数
第九章 预处理
实验3 函数和编译预处理
第九章改 预处理命令习题答案