第八章编译预处理
实践教学:
属性:实训
时间:学时。
实践教学内容:
实验目的:掌握宏定义的形式(带参数的宏定义、不带参数的宏定义);掌握文件包含的形式和应用;了解条件编译的定义形式和应用。
实验内容和步骤:
1、编程,通过用带参的宏定义从3个数中找出最大值。主
函数完成数据输入、宏调用及数据输出。存入ex8_1.c
文件,并编译、调试、运行。
#include
#define MAX(x,y) (x)>(y)?(x):(y)//注意括号的使用!
main()
{
int n1,n2,n3,m;
printf("Please print:");
scanf("%d%d%d",&n1,&n2,&n3);
m=MAX(n1,MAX(n2,n3));
printf("The max is %d\n",m);
}
2、编一个头文件,将经常使用的数学函数、字符处理函数
及圆周率等符号常量事先定义好。以便以后调用。存入
headfile.h文件,存盘。
//圆周率
#define PI 3.1415926
//求x的n次方
double power(double x,int n)
{
int i;
double powers=1;
for(i=0;i if(n==0)powers=1; else powers*=x; return powers; } //字符串长度的计数 int strlen(char *a) { int i; while(a[i]!='\0') i++; return i; } 调用例举: #include int strlen(char *a) { int i=0; while(a[i]!='\0') i++; return i; } main() { char a[50]; printf("Input one string:\n"); gets(a); printf("The length of the string:%d\n",strlen(a)); } 字符串的连接: #include #include main() { char a[50],b[50]; int m,n,i,j; printf("Input two strings:\n"); gets(a); gets(b); m=strlen(a); n=strlen(b); for(i=m,j=0;j<=n+1;i++,j++) a[i]=b[j]; printf("The result is:\n"); puts(a); } 3、编一个程序,接收一行字符,根据具体需要设置编译条件, 使之能将所有的字母全改为大写字母。存入ex8_2.c文件, 并编译、调试、运行。 #include #define LETTER 1 main() { int i=0; char str[300],c; gets(str); //输入一个字符串 while((c=str[i])!='\0') { i++; //保证循环的继续! if(LETTER) //如果条件为真,则小写变大写 if(c>='a' && c<='z') c-=32; printf("%c",c); } printf("\n"); } 现在先定义LETTER为1,这样在预处理条件编译命令时,由于LETTER为真(非零),则对第一个if语句进行编译,运行时使小写字母变大写。如果将程序第一行改为: #define LETTER 0,则对第一个if语句进行编译后,运行时不曾发生改变。 当然,不用条件编译命令而直接用if语句也能达到要求,用条件编译命令有什么好处呢?的确,此问题完全可以不用条件编译处理,但那样做目标程序长(因为所有语句都编译),而采用条件编译,可以减少被编译的语句,从而减少目标的长度。当条件编译段比较多时,目标程序长度可以大大减少。 设备及生均耗材要求:计算机机房 实践考核办法:检查学生程序结构和执行情况,并给出评分。