第6章 编译预处理
- 格式:ppt
- 大小:214.50 KB
- 文档页数:14
C语言程序设计第1章概论1.1 C语言有哪些主要特点?其主要用途是什么?1.2 程序设计语言的主要构成要素有哪些?1.3 程序设计语言的实现都有哪些方法?1.4 程序设计语言按照实现方法可分为哪几种类型?1.5 为什么要学习程序设计语言?1.6 将C语言和你所掌握的高级语言做一比较。
1.7 C程序的主要构成单位是什么?1.8 C语言的保留字和特定字有何区别?1.9 下面哪些是合法的C语言一般标识符?std-sex, Std-num, 2.13, _2.13, name, int, Int, var-num, yes_or_no, select, File_name, _DATA, define, a+c, new, ok?1.10 C程序从编辑到执行要经过哪些步骤?1.11 C函数主要由哪几部分构成?复合语句在C语言中是用什么标界的?又称为什么?1.12 填空。
1 . 一个C程序是由若干个函数构成的,其中必须有一个函数。
2 . 一个C语句最少应包含一个。
1.13 单项选择。
1. C语言程序的基本单位是( )。
(1) 子程序 (2) 程序 (3) 过程 (4) 函数2. 合法的C语言标识符是( )。
(1) _a1 (2) a+b (3) 3abc (4) AB,CD答案:1.1C语言主要用于编写系统软件,其主要特点如下:①语言简洁,紧凑,使用灵活②运算符丰富③具有数据类型构造和流控结构能力④语言生成的代码质量高⑤可移植性好⑥语言语法限制不严格,程序设计自由度大1.2程序设计语言的主要构成要素有:①数据。
②运算(操作)③控制结构④存储答理⑤固运算环境。
1.3 程序设计语言的实现方法主要有:1. 翻译或编译。
2. 软件模拟(软件解释)。
1.4 程序设计语言的按照实现方法有编译型和解释型两种。
1.5略 1.6 略1.7 C程序的主要构成单位是函数。
1.8 C程序的保留字和特定字的区别是,保留字不能用来表示用户自定义的对象,而特定字却不受此限(尽管不提倡这样做)。
c语言第8章-编译预处理及位运算习题答案编译预处理习题一.单项选择题1.在宏定义#define A 3.897678中,宏名A代替一个()。
A)单精度数 B)双精度数 C)常量 D)字符串2.以下叙述中正确的是A)预处理命令行必须位于源文件的开头 B)在源文件的一行上可以有多条预处理命令C)宏名必须用大写字母表示D)宏替换不占用程序的运行时间3.C语言的编译系统对宏命令的处理()。
A)在程序运行时进行的B)在程序连接时进行的C)和C程序中的其它语句同时进行的D)在对源程序中其它语句正式编译之前进行的4.在文件包含预处理语句的中,被包含文件名用“< >”括起时,寻找被包含文件的方式是()。
A)直接按系统设定的标准方式搜索目录B)先在源程序所在目录搜索,再按系统设定的标准方式搜索C)仅仅在源程序所在目录搜索D)仅仅搜索当前目录5.以下说法中正确的是A)#define和printf都是C语句 B)#define是C语句,而printf不是C)printf是C语句,但#define不是D)#define和printf都不是C 语句6.#define A 3.897678#include <stdio.h>main( ){ printf(“A=%f ”,A);}程序运行结果为()。
A) 3.897678=3.897678 B) 3.897678=A C) A=3.897678 D)无结果7.有宏定义:#define LI(a,b) a*b#define LJ(a,b) (a)*(b)在后面的程序中有宏引用:x=LI(3+2,5+8);y=LJ(3+2,5+8);则x、y的值是()。
A) x=65,y=65 B) x=21,y=65 C) x=65,y=21 D)x=21,y=218.有以下程序# define f(x) (x*x)main(){ int i1, i2;i1=f(8)/f(4) ; i2=f(4+4)/f(2+2) ;printf("%d, %d\n",i1,i2);}程序运行后的输出结果是A)64, 28 B)4, 4 C)4, 3D)64, 649.以下程序的输出结果是#define M(x,y,z) x*y+zmain(){ int a=1,b=2, c=3;printf(“%d\n”, M(a+b,b+c, c+a));}A) 19 B) 17 C) 15 D) 1210.有以下程序#define N 5#define M1 N*3#define M2 N*2main(){ int i;i=M1+M2; printf(“%d\n”,i);}程序编译后运行的输出结果是:A) 10 B) 20 C) 25 D) 3011.有如下程序#define N 2#define M N+1#define NUM 2*M+1#main(){ int i;for(i=1;i<=NUM;i++)printf(“%d\n”,i);}该程序中的for循环执行的次数是A) 5 B) 6C) 7 D) 812.位运算是对运算对象按二进制位进行操作的运算,运算的对象是____数据,以___的形式参与运算。
1(实现简单的加法)#include <stdio.h> // 这是编译预处理命令int main( ) // 定义主函数{ // 函数开始int a,b,sum; // 本行是程序的声明部分,定义a、b、sum为整型变量a = 123; // 对变量a赋值b = 456; // 对变量b赋值sum = a + b; // 进行a+b 的运算,并把结果存放在变量sum 中printf("sum is %d\n",sum); // 输出结果return 0; // 使函数返回值为0} // 函数结束2(两个数比大小输出大值)#include <stdio.h>int main( ) // 定义主函数{ // 主函数体开始int max(int x,int y); // 对被调用函数max的声明int a,b,c; // 定义变量a,b,cscanf("%d,%d",&a,&b); // 输入变量a和b的值c = max(a,b); // 调用max函数,将得到的值赋给cprintf("max=%d\n",c); // 输出c的值return 0; // 返回函数值为0}int max(int x,int y) //定义max函数,函数值为整型, 形式参数x和y为整型{int z; // max函数中的声明部分,定义本函数中用到的变量z为整型if (x > y) z = x;else z = y;return(z); //将z的值返回,通过max带回到调用函数的位置}3(算1-1/2+1/3-1/4........+1/99-1/100)#include <stdio.h>int main( ){int sign=1;double deno=2.0,sum=1.0,term; // 定义deno,sum,term为双精度变量while (deno<=100){sign=-sign;term=sign/deno;sum=sum+term;deno=deno+1;}printf("%f\n",sum);return 0;}4#include <stdio.h>int main ( ){char c1,c2;c1='A'; // 将字符'A'的ASCII代码放到c1变量中c2=c1+32; // 得到字符'a'的ASCII代码,放在c2变量中printf("%c\n",c2); // 输出c2的值,是一个字符printf("%d\n",c2); // 输出c2的值,是字符'a'的ASCII代码return 0;}5(方程求根)#include <stdio.h>#include <math.h> // 程序中要调用求平方根函数sqrt int main ( ){double a,b,c,disc,x1,x2,p,q; // disc是判别式sqrt(b*b-4ac)scanf("%lf%lf%lf",&a,&b,&c); // 输入实型变量的值要用格式声明"%f" disc=b*b-4*a*c;if (disc<0) printf("This equation hav't real roots\n");else{ p=-b/(2.0*a);q=sqrt(disc)/(2.0*a);x1=p+q;x2=p-q; // 求出方程的两个根printf("x1=%7.2f\nx2=%7.2f\n",x1,x2); // 输出方程的两个根}return 0;}6(输出BOY)#include <stdio.h>int main ( ){char a='B',b='O',c='Y'; // 定义3个字符变量,并初始化putchar(a); // 向显示器输出字符Bputchar(b); // 向显示器输出字符Oputchar(c); // 向显示器输出字符Yputchar ('\n'); // 向显示器输出一个换行符return 0;}7#include <stdio.h>int main ( ){ char a,b,c; // 定义字符变量a,b,ca=getchar(); // 从键盘输入一个字符,送给字符变量ab=getchar(); // 从键盘输入一个字符,送给字符变量bc=getchar(); // 从键盘输入一个字符,送给字符变量cputchar(a); // 将变量a的值输出putchar(b); // 将变量a的值输出putchar(c); // 将变量a的值输出putchar('\n'); // 换行return 0;}8 (同5,不同写法)#include <stdio.h>#include <math.h> // 程序中要调用求平方根函数sqrtint main ( ){double a,b,c,disc,x1,x2,p,q; // disc是判别式sqrt(b*b-4ac)scanf("%lf%lf%lf",&a,&b,&c); // 输入双精度浮点型变量的值要用格式声明"%lf"disc=b*b-4*a*c;if (disc<0) printf("This equation hav't real roots\n");else{ p=-b/(2.0*a);q=sqrt(disc)/(2.0*a);x1=p+q;x2=p-q; // 求出方程的两个根printf("real roots:\nx1=%10.6f\nx2=%10.6f\n",x1,x2); // 输出方程的两个根}return 0;}9(实现三个数从小到大排列)#include <stdio.h>int main(){float a,b,c,t;scanf("%f,%f,%f",&a,&b,&c);if(a>b){t=a;a=b;b=t;} // 实现a和b的互换if(a>c){t=a;a=c;c=t;} // 实现a和c的互换if(b>c){t=b;b=c;c=t;} // 实现b和c的互换printf("%5.2f,%5.2f,%5.2f\n",a,b,c);return 0;}10(swich 语句应用)#include <stdio.h>int main(){char grade;scanf("%c",&grade);printf("Your score:");switch(grade){ default: printf("data error!\n");break;case 'A': printf("85~100\n");break;case 'B': printf("70~84\n");break;case 'C': printf("60~69\n");break;case 'D': printf("<60\n");break;}return 0;}11(break swich复合语句)#include <stdio.h>int main(){void action1(int,int),action2(int,int);char ch;int a=15,b=23;ch=getchar();switch(ch){case 'a':case 'A': action1(a,b);break;case 'b':case 'B': action2(a,b);break;default: putchar('\a');}return 0;}void action1(int x,int y){printf("x+y=%d\n",x+y);}void action2(int x,int y){printf("x*y=%d\n",x*y);}12(判断闰年)#include <stdio.h>int main(){int year,leap;scanf("%d",&year);if (year%4==0){if(year%100==0){if(year%400==0)leap=1;elseleap=0;}elseleap=1;}elseleap=0;if (leap)printf("%d is ",year);elseprintf("%d is not ",year); printf("a leap year.\n");return 0;13(同上)#include <stdio.h>int main(){int year,leap;printf("enter year:");scanf("%d",&year);if((year%4==0 && year%100!=0) || (year%400==0)) leap=1;elseleap=0;if (leap)printf("%d is ",year);elseprintf("%d is not ",year);printf("a leap year.\n");return 0;}14(同上)#include <stdio.h>#include <stdbool.h>int main(){int year;bool leap;scanf("%d",&year);if (year%4==0){if(year%100==0){if(year%400==0)leap=true;elseleap=false;}elseleap=true;}elseleap=false;if (leap==true)printf("%d is ",year);elseprintf("%d is not ",year);printf("a leap year.\n");return 0;}15(求根,并且要先判断是否有根)#include <stdio.h>#include <math.h>int main(){double a,b,c,disc,x1,x2,realpart,imagpart;scanf("%lf,%lf,%lf",&a,&b,&c);printf("The equation ");if(fabs(a)<=1e-6)printf("is not a quadratic\n");else{disc=b*b-4*a*c;if(fabs(disc)<=1e-6)printf("has two equal roots:%8.4f\n",-b/(2*a));elseif(disc>1e-6){x1=(-b+sqrt(disc))/(2*a);x2=(-b-sqrt(disc))/(2*a);printf("has distinct real roots:%8.4f and %8.4f\n",x1,x2);}else{realpart=-b/(2*a);imagpart=sqrt(-disc)/(2*a);printf(" has complex roots:\n");printf("%8.4f+%8.4fi\n",realpart,imagpart);printf("%8.4f-%8.4fi\n",realpart,imagpart);}}return 0;}16(折扣问题)#include <stdio.h>int main(){int c,s;float p,w,d,f;printf("please enter price,weight,discount:"); // 提示输入的数据scanf("%f,%f,%d",&p,&w,&s); // 输入单价、重量、距离if(s>=3000) c=12; // 3000km以上为同一折扣else c=s/250; // 3000km以下各段折扣不同,c的值不相同switch(c){case 0: d=0; break; // c=0,代表250km以下,折扣d=0 case 1: d=2; break; // c=1,代表250到500km以下,折扣d=2%case 2:case 3: d=5; break; // c=2和3,代表500到1000km 以下,折扣d=5%case 4:case 5:case 6:case 7: d=8; break; // c=4-7,代表1000到2000km以下,折扣d=8%case 8:case 9:case 10:case 11: d=10; break; // c=8-11,代表2000到3000km以下,折扣d=10%case 12: d=15; break; // c12,代表3000km以上,折扣d=15%}f = p * w * s * (1 - d / 100); // 计算总运费printf("freight=%10.2f\n",f); // 输出总运费,取两位小数return 0;}5——6章1(1,2两题注意直道型和当型的区别)#include <stdio.h>int main(){int i=1,sum=0; // 定义变量i的初值为1,sum的初值为0while (i<=100) // 当i>100,条件表达式i<=100的值为假,不执行循环体{ // 循环体开始sum=sum+i; // 第一次累加后,sum的值为1i++; // 加完后,i的值加1,为下次累加作准备} // 循环体结束printf("sum=%d\n",sum); // 输出1+2+3…+100的累加和return 0;}2#include <stdio.h>int main(){int i=1,sum=0;do{sum=sum+i;i++;}while(i<=100);printf("%d\n",sum);return 0;}3#include <stdio.h>#define SUM 100000int main(){float amount,aver,total;int i;for (i=1,total=0;i<=1000;i++){printf("please enter amount:");scanf("%f",&amount);total= total+amount;if (total>=SUM) break;}aver=total/i;printf("num=%d\naver=%10.2f\n",i,aver);return 0;}4(continue的用法输出100-200所有不被3整除的数)#include <stdio.h>int main(){int n;for (n=100;n<=200;n++){if (n%3==0)continue;printf("%d ",n);}printf("\n");return 0;}5#include <stdio.h>int main(){int i,j,n=0;for (i=1;i<=4;i++)for (j=1;j<=5;j++,n++){ if(n%5==0)printf("\n"); //控制在输出5个数据后换行if (i==3 && j==1) break; //遇到第3行第1列,终止内循环printf("%d\t",i*j);}printf("\n");return 0;}6(用π/4=1-1/3+1/5-1/7+.......+1/n²求π的近似值,直到发现某项的绝对值小于10的六次方)#include <stdio.h>#include<math.h>int main(){int sign=1; // sign用来表示数值的符号double pi=0.0,n=1.0,term=1.0; // pi代表π,n代表分母,term代表当前项的值while(fabs(term)>=1e-8) // 检查当前项term的绝对值是否大于或等于10的(-6)次方{pi=pi+term; // 把当前项term累加到pi中n=n+2; // n+2是下一项的分母sign=-sign; // sign代表符号,下一项的符号与上一项符号相反term=sign/n; // 求出下一项的值term}pi=pi*4; // 多项式的和pi乘以4,才是π的近似值printf("pi=%10.8f\n",pi); // 输出π的近似值}7#include <stdio.h>int main(){int f1=1,f2=1,f3;int i;printf("%12d\n%12d\n",f1,f2);for(i=1; i<=38; i++){f3=f1+f2;printf("%12d\n",f3);f1=f2;f2=f3;}}8(兔子问题)#include <stdio.h>int main(){int f1=1,f2=1;int i;for(i=1; i<=20; i++) // 每个循环中输出2个月的数据,故循环20次即可{printf("%12d %12d ",f1,f2); // 输出己知的两个月的兔子数if(i%2==0) printf("\n");f1=f1+f2; // 计算出下一个月的兔子数,并存放在f1中f2=f2+f1; // 计算出下两个月的兔子数,并存放在f2中}return 0;}9 注:9 10 两题为判断输入的数是否为素数#include <stdio.h>int main(){int n,i;printf("please enter a integer number,n=?");scanf("%d",&n);for (i=2;i<=n-1;i++)if(n%i==0) break;if(i<n) printf("%d is not a prime number.\n",n);else printf("%d is a prime number.\n",n);return 0;}10#include <stdio.h>#include <math.h>int main(){int n,i,k;printf("please enter a integer number:n=?");scanf("%d",&n);k=sqrt(n);for (i=2;i<=k;i++)if(n%i==0) break;if(i<=k) printf("%d is not a prime number.\n",n);else printf("%d is a prime number.\n",n);}11(此为输出100-200的所有素数)# include <stdio.h># include <math.h>int main(){int n,k,i,m=0;for(n=101;n<=200;n=n+2) // n从100变化到200,对每个n进行判定{ k=sqrt(n);for (i=2;i<=k;i++)if (n%i==0) break; // 如果n被i整除,终止内循环,此时i<k+1if (i>=k+1) // 若j>=k+1,表示n未被整除{printf("%d ",n); // 应确定n是素数m=m+1; // m用来控制换行,一行内输出10个录素数}if(m%10==0) printf("\n"); // m累计到10的倍数,换行}printf ("\n");return 0;}12#include <stdio.h>int main(){char c;c=getchar();while(c!='\n'){if((c>='a' && c<='z') || (c>='A' && c<='Z')){ if(c>='W' && c<='Z' || c>='w' && c<='z') c=c-22;else c=c+4;}printf("%c",c);c=getchar();}printf("\n");return 0;}13(将10个元素的数组依次赋值并且输出各元素的值)#include <stdio.h>int main(){int i,a[10];for (i=0; i<=9;i++)a[i]=i;for(i=9;i>=0; i--)printf("%d ",a[i]);printf("\n");return 0;}14(具有20个元素的数组,前两个元素为1 ,1 以后每个元素的大小为前两个元素大小之和,输出该数组)#include <stdio.h>int main(){int i;int f[20]={1,1};for(i=2;i<20;i++)f[i]=f[i-2]+f[i-1];for(i=0;i<20;i++){if(i%5==0) printf("\n");printf("%12d",f[i]);}printf("\n");return 0;}15.#include <stdio.h>int main(){int a[10];int i,j,t;printf("input 10 numbers :\n");for (i=0;i<10;i++)scanf("%d",&a[i]);printf("\n");for(j=0;j<9;j++) // 进行9次循环,实现9趟比较for(i=0;i<9-j;i++) // 在每一趟中进行9-j次比较if (a[i]>a[i+1]) // 相邻两个数比较{t=a[i];a[i]=a[i+1];a[i+1]=t;}printf("the sorted numbers :\n");for(i=0;i<10;i++)printf("%d ",a[i]);printf("\n");return 0;}16(保持数值不变,将2行3列的数组变成3行2列的数组)#include <stdio.h>int main(){int a[2][3]={{1,2,3},{4,5,6}};int b[3][2],i,j;printf("array a:\n");for (i=0;i<=1;i++){for (j=0;j<=2;j++){printf("%5d",a[i][j]);b[j][i]=a[i][j];}printf("\n");}printf("array b:\n");for (i=0;i<=2;i++){for(j=0;j<=1;j++)printf("%5d",b[i][j]);printf("\n");}return 0;}17(利用数组输出字符串)#include <stdio.h>int main(){char c[15]={'I',' ','a','m',' ','a',' ','s','t','u','d','e','n','t','.'};int i;for(i=0;i<15;i++)printf("%c",c[i]);printf("\n");return 0;}18#include<stdio.h>#include<string.h>int main ( ){char str[3][20]; // 定义二维字符数组char string[20]; // 定义一维字符数组,作为交换字符串时的临时字符数组int i;for (i=0;i<3;i++)gets (str[i]); // 读入3个字符串,分别给str[0],str[1],str[2]if (strcmp(str[0],str[1])>0) // 若str[0]大于str[1]strcpy(string,str[0]); // 把str[0]的字符串赋给字符数组stringelse // 若str[0]小于等于str[1]strcpy(string,str[1]); // 把str[1]的字符串赋给字符数组stringif (strcmp(str[2],string)>0) // 若str[2]大于stringstrcpy(string,str[2]); // 把str[2]的字符串赋给字符数组stringprintf("\nthe largest string is:\n%s\n",string); // 输出stringreturn 0;}第7章1 **************(输出How do you do!)**************#include <stdio.h>int main(){void printstar();void print_message();printstar();print_message();printstar();return 0;}void printstar(){printf("******************\n");}void print_message(){printf(" How do you do!\n");}2(输入两个数输出较大值)#include <stdio.h>int main(){ int max(int x,int y);int a,b,c;printf("please enter two integer numbers:");scanf("%d,%d",&a,&b);c=max(a,b);printf("max is %d\n",c);}int max(int x,int y) // 定义max函数{int z; // 定义临时变量z=x>y?x:y; // 把x和y中大者赋给zreturn(z); // 把z作为max函数的伦值带回main函数}3(3与4都为建立个函数可以比较四个数大小并且输出最大值)#include <stdio.h>int main(){ int max4(int a,int b,int c,int d); // 对max4的函数声明int a,b,c,d,max;printf("Please enter 4 interger numbers:"); // 提示输入4个数scanf("%d %d %d %d",&a,&b,&c,&d); // 输入4个数max=max4(a,b,c,d); // 调用max4函数,得到4个数中的最大者printf("max=%d \n",max); // 输出4个数中的最大者return 0;}int max4(int a,int b,int c,int d) // 定义max4函数{int max2(int a,int b); // 对max2的函数声明int m;m=max2(a,b); // 调用max2函数,得到a和b两个数中的大者,放在m中m=max2(m,c); // 调用max2函数,得到a,b,c三个数中的大者,放在m中m=max2(m,d); // 调用max2函数,得到a,b,c,d四个数中的大者,放在m中return(m); // 把m作为函数值带回main函数}int max2(int a,int b) // 定义max2函数{if(a>=b)return a; // 若a>=b,将a为函数返回值elsereturn b; // 若a<b,将b为函数返回值}4#include <stdio.h>void main(){ int max4(int a,int b,int c,int d);int a,b,c,d,max;printf("Please enter 4 interger numbers:");scanf("%d %d %d %d",&a,&b,&c,&d);max=max4(a,b,c,d);printf("max=%d \n",max);}int max4(int a,int b,int c,int d){int max2(int a,int b);int m;m=max2(max2(max2(a,b),c),d); /* 仔细分析此行*/return(m);}int max2(int a,int b){return(a>b?a:b);}5#include <stdio.h>int main(){ int age(int n);printf("NO.5,age:%d\n",age(5)); //输出第5人的年龄return 0;}int age(int n) //定义递归函数{int c;if(n==1) // 如果n等于1c=10; // 年龄为10else // 如果n不等于1c=age(n-1)+2; // 年龄是前一人的年龄加2(如第4人年龄是第3人年龄加2)return(c); // 返回年龄}6(建立个Fac函数使得输入任意数N 输出Y=n*(n-1)*..........*2*1)#include <stdio.h>int main(){ int fac(int n);int n;int y;printf("input an integer number:");scanf("%d",&n);y=fac(n);printf("%lld!=%d\n",n,y);return 0;}int fac(int n){int f;if(n<0)printf("n<0,data error!");else if(n==0||n==1)f=1;else f=fac(n-1)*n;return(f);}7(构造具有10个元素的数组,输出数组的平均值)#include <stdio.h>int main(){ float average(float array[10]); // 函数声明float score[10],aver;int i;printf("input 10 scores:\n");for(i=0;i<10;i++)scanf("%f",&score[i]);printf("\n");aver=average(score); // 调用average函数printf("average score is %5.2f\n",aver);return 0;}float average(float array[10]) // 定义average函数{int i;float aver,sum=array[0];for(i=1;i<10;i++)sum=sum+array[i]; // 累加学生成绩aver=sum/10;return(aver);}8#include <stdio.h>int main(){ int max_value(int array[][4]);int a[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}};printf("Max value is %d\n",max_value(a));return 0;}int max_value(int array[][4]){int i,j,max;max=array[0][0];for(i=0;i<3;i++)for(j=0;j<4;j++)if(array[i][j]>max)max=array[i][j];return (max);}9。
预编译处理【学习目标】◇理解编译预处理的概念。
◇了解宏定义的概念,掌握简单宏定义和带参数的宏定义的格式和使用方法。
◇了解文件包含的概念,掌握文件包含的格式和使用方法。
能在程序中合理使用#include预处理指令◇了解条件编译的概念,掌握条件编译的三种格式及其使用方法。
能在程序中合理使用#define, #if, #ifndef, #else, #undef, #elif等指令。
【重点和难点】重点:编译预处理的概念,简单的宏定义与文件包含指令的用法。
难点:带参宏定义,条件编译指令,会用条件指令解决文件的重复包含问题。
【学习方法指导】本章的内容比较简单,严格说来,它也不算是C++语言的组成部分。
但是,一般说来,任何程序都离不开预编译指令。
特别是文件包含指令和条件编译指令,应把它们搞清楚。
虽然可以用宏定义的方法定义常数,但推荐使用const语句定义常量。
在编程中,如果我们能恰当地运用条件编译,就可以提高程序运行的效率。
【知识点】宏定义;宏替换;简单的宏定义;带参数的宏定义;文件包含;条件编译第一节宏定义我们用C++进行编程的时候,可以在源程序中包括一些编译命令,以告诉编译器对源程序如何进行编译。
这些命令包括:宏定义、文件包含和条件编译,由于这些命令是在程序编译的时候被执行的,也就是说,在源程序编译以前,先处理这些编译命令,所以,我们也把它们称之为编译预处理,本章将对这方面的内容加以介绍。
实际上,编译预处理命令不能算是C++语言的一部分,但它扩展了C++程序设计的能力,合理地使用编译预处理功能,可以使得编写的程序便于阅读、修改、移植和调试。
预处理命令共同的语法规则如下:◇所有的预处理命令在程序中都是以"#"来引导如"#include "stdio.h""。
◇每一条预处理命令必须单独占用一行,如"#include "stdio.h" #include <stdlib.h>" 是不允许的。
C程序设计复习要点第一章概述1.C程序的构成与结构特点2.C程序上机调试过程与流程第二章数据类型、运算量与表达式1.数据类型的种类(基本数据类型和构造数据类型)2.常量的数据类型及其表示(表示方法、存储字节数与表数范围)——整、实、字符、字符串和转义字符3.变量的命名、定义方法与赋初值4.各种表达式及其运算规则——优先级、结合性、类型自动转换与强制转换●算术运算符、表达式及其构造(注意“/”和“%”特殊性)●自增、自减运算符及其简单表达式运算●赋值运算符及其表达式(注意复合赋值运算符的运算方法)●逗号运算符及其表达式第三章流程控制1.赋值语句的一般形式、赋值过程及赋值规则(注意左右数据类型的一致或兼容)2.输入和输出函数的格式、功能及用法(只要求常用的格式控制符d, f, c, s),提醒注意:●格式输出中域宽和小数位数的控制●格式输入与输出中普通字符的原样输入和输出问题●熟悉并区别以下函数:putchar()、printf()、puts();getchar()、scanf()、gets()3.关系运算符及其表达式、逻辑运算符及其表达式和条件运算符及其表达式的运算规则(优先级、结合性)4.关系表达式与逻辑表达式的构造(根据已知条件写表达式)5.if语句的三种形式:if …语句、if …else …语句、if 语句的嵌套●if 语句的格式与用法:简单if、嵌套if、并列if●逻辑关系与执行过程●嵌套规则(重点掌握if …else …if …else …if …else)6.switch语句的格式与用法7.*熟练使用if和switch语句阅读和编写较为简单的选择结构程序8.三种循环语句:while() …、do …while()、for()的格式、执行过程及其用法●循环变量初始化、循环条件构造、循环体所要实现的任务和控制变量修改注意循环期间与结束时循环控制变量的取值问题9.结合例题理解和区别break与continue语句的作用及其用法10.本章涉及的主要算法:累加(计数)、累乘、递推、穷举、判素数、求最大公约与最小公倍等11.*熟练使用三种循环语句并结合以上算法阅读和编写较为简单的循环结构及其嵌套程序第四章复杂数据类型1.一维、二维数组的定义、初始化及其引用方法(数据输入、输出、存储与处理)2.字符数组的定义、初始化及其引用(字符串输入、输出、存储与处理)3.常用字符串处理函数:gets()、puts()、strlen()、strcmp()、strcpy()4.数组涉及的主要算法:排序、极值、逆序、回文和字符串的连接、复制、求长度等5.*熟练使用数组并结合以上算法阅读和编写较为简单的程序6.指针的概念:指针、指针变量、指针运算(*、&、++、--、+、-)7.变量、数组和字符串指针的定义、指向与引用(仅限于一维数组)8.了解指针数组与二级指针的概念和定义9.*能够阅读并理解使用指针进行数据处理的相关程序(极值、逆序、回文和字符串的连接、复制、求长度等)10.结构体与共用体的概念、定义与引用(仅限概念)第五章结构化程序设计与应用1.熟悉程序的三种基本结构:顺序、选择和循环2.*通过其中部分例题掌握选择、循环语句的使用以及循环和数组涉及的主要算法第六章函数与编译预处理1.掌握函数的定义、声明和调用方法及参数传递方式2.*结合相关例题掌握一般函数和递归函数的定义与使用3.熟悉局部变量与全局变量的定义及作用范围,了解各种静态与动态变量的定义、作用范围与生存期4.了解内部函数与外部函数的定义及调用规则5.掌握宏定义与宏展开(重点掌握带参数宏的定义与展开)6.了解文件包含的作用及其使用场合第七章文件1.了解文件的概念2.熟悉文件打开、关闭及各种与文件读写有关函数的格式与用法特别提醒:以上带*部分主要涉及程序阅读、程序填空和编写程序,其余部分主要以选择和概念填空题出现3ae bc C语言程序设计参考题型说明:★本题仅反映考试的题型,作为考前复习参考。