第6章 编译预处理

合集下载

C语言程序设计(1-6章)

C语言程序设计(1-6章)

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程序的保留字和特定字的区别是,保留字不能用来表示用户自定义的对象,而特定字却不受此限(尽管不提倡这样做)。

人工智能导论课件第6章第4-5节

人工智能导论课件第6章第4-5节
• 机械装置往往会有数百个零件,非常复杂。这将需要专业的领域知识来诊断和 维修机械。决策表(DT)是一种紧凑、快速、准确的求解问题的方法(见第7 章中的CarBuyer示例)。
6.5.2 振动故障诊断的专家系统
• VIBEX专家系统结合了决策表分析(DTA)和DT,决策表分析是通过已知案 例来构建的,而DT是为了做出分类,使用归纳式知识获取过程来构建。 VIBEX DT与机器学习技术相结合,比起ⅤIBEX(VIBration Expert)TBL方 法在处理振动原因和发生概率较高的案例时,其诊断更有效率。人类专家合作 构建DTA,这最终得到了由系统知识库组成的规则集。然后,人们使用贝叶斯 算法计算出规则的确定性因子。
6.5.2 振动故障诊断的专家系统
• 专家系统的重要作用之一是用于故障诊断。在昂贵、高速、关键机械运转的情 况下,故障的早期准确检测非常重要。在机械运转的情况下,异常情况的常见 指标是旋转机械的振动。检测到故障后,维护工程师能够识别症状信息,解释 各种错误信息和指示,并提出正确的诊断。换句话说,识别可能导致故障的组 件以及组件失败的原因。
人工智能导论
Introduction to artificial intelligence
• (1)规划——在这个阶段,根据所有可能的原子构型的集合中和质谱推导出 的约束一致的原子构型集合,还原出答案。应用约束,选择必须出现在最终结 构中的分子片段,剔除不能出现的分子片段。
• (2)生成——使用名为CONGEN的程序来生成可能的结构。“它的基础是组 合算法(具有数学证明的完整性以及非冗余生成性)。组合算法可以产生所有 在拓扑上合法的候选结构。通过使用‘规划’过程提供的约束进行裁剪,引导 生成合理的集合(即满足约束条件的集合),而不是巨大的合法集合。”

VC 复习提要和重点

VC  复习提要和重点
二维数组常用算法:求最大、最小值;常用于矩阵运算,如判断二维数组的是否对 称,求矩阵的转置、求外围元素之和、对角线之和等。(要注意找规律) 3、字符数组与字符串。字符数组可整体输入和输出。 1)注意下列两种初始化的差别: char s1[ ]=“abc”; char s2[ ]={ ‘a’, ‘b’, ‘c’ }; 2)为字符数组赋值时,不能大于所定义的数组大小 字符数组常用算法:大小写字母转换;将字符串按逆序存放;统计单词个数等。 4、字符串处理函数的功能。 #include <string.h> strcpy strlen strcat strcmp
2、根据变量所占用内存的方式,变量分为 4 种类型:自动类型(auto)、静态类型(static)、
寄存器类型(register)以及外部类型(extern)。
例: #include <iostream.h>
void f (void)
{ static i“i=“<<i<<‘\n’;
#define 符号常量 表达式 如:#define PI 3.1415926
方法二:常量说明符 const 如:const int buf=512;
(三)变量的作用域和存储类型
1、作用域有 5 类:块作用域、文件作用域、函数作用域、函数原型作用域以及类的作用域。
注意:作用域运算符“::”仅用于全局标识符。
C++中编译预处理包括:宏定义、文件包含和条件编译。 特点:以#开头标识;每一条预处理指令各占一行,不是以分号结束
1、 文件包含
格式:# include “文件名” 或 # include <文件名>
2、宏定义。(只作简单替换)

c语言第8章-编译预处理及位运算习题答案doc资料

c语言第8章-编译预处理及位运算习题答案doc资料

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.位运算是对运算对象按二进制位进行操作的运算,运算的对象是____数据,以___的形式参与运算。

C语言1-7章复习程序

C语言1-7章复习程序

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。

C语言程序设计教程(电子教案)

C语言程序设计教程(电子教案)
实用文档
学习目标
对C语言有一个概括的了解, 能够编写包含键盘输入、计算和 显示输出等操作的简单C程序。
4
主要内容
• C语言的产生与特点 • 简单C程序的组成 • C语言应用程序开发的基本步骤
5
1.1 C语言的产生及特点
C语言是为了编写系统程序而在1968年开始 研发的计算机高级语言
C语言表达能力强,使用灵活,程序结构清 晰,紧凑,可移植性好
指针 类型
17
基本数据类型说明符
整型:int long
字符型:char 实型:float
double long double
18
2.2 常 量
常量∶在程序运行过程中,其值不能被改 变的量。
一. 不同数制整型常量的表示
例如: 12 :十进制数 12
012 :八进制数 12(等于十进 制数10,用前导符0表示八进制数常量)
计算x+y+z,并将结 8果赋给变量sum
显示变量 sum的值
主函数 main()
一般C程序的组成
【例1-2】采用模块结构,改写例1-1的程序。 add(int x,int y,int z )
{ return(x+y+z);
}
函数add()
调用函数 add()
main() { int x,y,z; printf("Please Input Three Integers:\n "); scanf("%d,%d,%d ",&x,&y,&z);
4. 用‘\’ ’表示字符’ ,‘\”’表示字符”, ‘\\ ’表示字符\ 。
5. 用双引号括起来的字符序列表示字符串常量,其 中最后一个字符是字符串结束符‘\0’,不显式 地表示出来。如:“English” 。

预编译处理

预编译处理

预编译处理【学习目标】◇理解编译预处理的概念。

◇了解宏定义的概念,掌握简单宏定义和带参数的宏定义的格式和使用方法。

◇了解文件包含的概念,掌握文件包含的格式和使用方法。

能在程序中合理使用#include预处理指令◇了解条件编译的概念,掌握条件编译的三种格式及其使用方法。

能在程序中合理使用#define, #if, #ifndef, #else, #undef, #elif等指令。

【重点和难点】重点:编译预处理的概念,简单的宏定义与文件包含指令的用法。

难点:带参宏定义,条件编译指令,会用条件指令解决文件的重复包含问题。

【学习方法指导】本章的内容比较简单,严格说来,它也不算是C++语言的组成部分。

但是,一般说来,任何程序都离不开预编译指令。

特别是文件包含指令和条件编译指令,应把它们搞清楚。

虽然可以用宏定义的方法定义常数,但推荐使用const语句定义常量。

在编程中,如果我们能恰当地运用条件编译,就可以提高程序运行的效率。

【知识点】宏定义;宏替换;简单的宏定义;带参数的宏定义;文件包含;条件编译第一节宏定义我们用C++进行编程的时候,可以在源程序中包括一些编译命令,以告诉编译器对源程序如何进行编译。

这些命令包括:宏定义、文件包含和条件编译,由于这些命令是在程序编译的时候被执行的,也就是说,在源程序编译以前,先处理这些编译命令,所以,我们也把它们称之为编译预处理,本章将对这方面的内容加以介绍。

实际上,编译预处理命令不能算是C++语言的一部分,但它扩展了C++程序设计的能力,合理地使用编译预处理功能,可以使得编写的程序便于阅读、修改、移植和调试。

预处理命令共同的语法规则如下:◇所有的预处理命令在程序中都是以"#"来引导如"#include "stdio.h""。

◇每一条预处理命令必须单独占用一行,如"#include "stdio.h" #include <stdlib.h>" 是不允许的。

C程序设计复习资料(含答案)

C程序设计复习资料(含答案)

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语言程序设计参考题型说明:★本题仅反映考试的题型,作为考前复习参考。

C语言程序设计教程 第6章

C语言程序设计教程 第6章
2017/8/21 11
模块设计的原则
模块独立
规模适当
层次分明
2017/8/21
功能专一
12
独立性原则表现在模块完成独立的功能 , 和其它模块间的关系简单 , 各模块可以单独调 试。修改某一模块 , 不会造成整个程序的混乱。
每个模块有特定功能
每个模块完成一个相对独立的特定子功能。在对任务逐步 分解时,要注意对问题的综合。例如, 一些模块的相似的 子任务,可以把它们综合起来考虑,找出它们的共性,把它 们做成一个完成特定任务的单独模块。
返回值
另外请注意这样的判断,如写成‘ 最好只使用局部变量,这样将方便调试。 如果不需返回则可 调用函数时输入参数的格式要与之相同 return 0; A‟<capital<„Z‟是不行 注意不要与已有库函数重名 的 2017/8/21
24
“函数”的主要知识点
函数的定义 函数的参数和返回值 函数的调用 嵌套和递归 变量的作用域
2017/8/21
18
例6.2 设计算法:找出a,b两数中的较大者,并输出
分析: 这个问题分三个步骤: • 输入两个数; • 找出其中的大数; • 输出大数。
2017/8/21
19
开始
输入a,b
0 a<b 非0 交换a,b 输出a
结束
2017/8/21
图6.3 找出a,b两数中的较大者算法流程图
2017/8/21
34
函数返回值
函数返回值通过return语句获得 函数返回值的类型就是函数的类型 return y; 将变量y的值返回给调用者 return y+3; 将表达式的值返回给调用者
2017/8/21 35
return 的数据类型与函数的类型矛盾时,自动 将数据转换成函数的类型

C语言 函数 预处理

C语言 函数 预处理

例6-1 文件包含预处理语句的使用
mymath.h的内容如下: # define ADD(x,y) (x+y) # define MUL(x,y) ((x)*(y)) # define PI 3.1415926 # define G 2.718 test.c内容如下: # include “mymath.h” main ( ) { int a=6,b=9; printf(“a+b=%d\n”,ADD(a,b)); printf(“a*b=%d\n”,MUL(a,b)); }
(5)使用宏次数多时,宏展开后源程序长,因为每 展开一次都使程序增长;而函数调用不使程序变长。 (6)宏替换不占用运行时间,而函数调用则占用运 6 行时间(分配内存单元、保护现场、值传递、执行 函数、返回函数值等)。
6.3 条件编译 .
在很多情况下,为了增强程序的可移植 性,C语言源程序中包含了各种版本的程序段, 但在某种情况下,只希望对一部分内容进行 编译,即为其指定编译的条件,此时称为条 件编译。
例6-3 带参数的宏定义 #define POWER(x) ((x)*(x)) main() { int y; scanf(“%d”,&y); printf(“y=%d, y*y=%d\n”,y, POWER(y)); }
从上述例题中可以看出,带参数的宏定义与函 数的使用非常相似,但二者是不同的。两者的区别 有如下几点: (1)函数调用时先求出实参的值,然后代入形参。 而带参数的宏定义只是进行简单的字符替换。 (2)函数调用是在程序运行时处理的,并分配临时 的内存单元。而宏展开则是在编译预处理时进行的, 在展开时并不分配内存单元,不进行值的传递,也 没有“返回值”。
第6章 编译预处理 章

《高级语言程序设计》课程教学大纲

《高级语言程序设计》课程教学大纲

《高级语言程序设计》课程教学大纲56学时 3.5学分一、课程的性质、目的及任务《高级语言程序设计》是计算机科学与技术、电子信息科学与技术和信息安全专业的一门专业基础课,目的是主要培养运用C++语言进行程序设计的能力。

本课程一方面讲述C++语言的基本特性,包括指针、数组、函数、类、对象、派生类、继承、流类库等内容,另一方面系统地介绍面向对象程序设计的基本概念、分析方法、设计方法和编程方法。

具体的教学任务为:1.准确描述问题、分析问题,以及运用计算思维解决问题的能力。

2.正确理解和使用C++语言的基本数据结构和语法,掌握面向对象程序设计的基本思想和方法,进行正确、完善的程序设计的能力。

3.使用C++语言集成开发环境完成面向对象程序的编写、调试的任务。

二、适用专业计算机科学与技术专业、电子科学与技术专业、信息安全专业三、先修课程信息技术概论四、课程的基本要求掌握选择、循环等c++的基本语句;掌握数组、指针等数据类型;掌握函数、对象、文件等程序的组成成分;掌握面向对象程序设计的基本思想,能独立分析问题并编程实现;掌握Visual c++ 6.0程序设计环境的基本用法,能进行程序的编写、调试和运行。

五、课程的教学内容第1章C++基础[知识点]面向对象编程特点、程序设计环境[重难点]1.教学重点C++程序的编写和实现2.教学难点(1)面向对象编程特点(2)C++上机实践[教学内容](1)程序设计语言的发展:讲解机器语言到高级语言的特点(2)面向对象编程:讲解程序设计的范式(过程型、面向对象型)(3)C++的特点:高级语言(4)C++程序的构成和书写形式:程序结构、书写规范(5)C++程序设计和实现:程序设计各阶段的任务(6)程序设计环境:程序设计的实例[教学要求](1)对面向对象概念只作概念性的描述,无需深入讲解(2)以实例讲解C++程序特点和程序设计环境第2章基本数据类型与运算符[知识点]数据类型、运算符[重难点]1.教学重点C++的运算符2.教学难点表达式的书写与计算[教学内容](1)C++的数据类型(2)常量与变量(3)C++的运算符[教学要求]要求学生熟练掌握运算符及其优先级第3章程序控制[知识点]结构化程序设计、结构控制语句[重难点]1.教学重点(1)C++的输入与输出(2)关系运算和逻辑运算(3)选择结构和if语句(4)条件运算符和条件表达式(5)多分支选择结构和switch语句(6)循环结构和循环语句(7)循环的嵌套2.教学难点(1)多分支选择结构和switch语句(2)循环的嵌套[教学内容](1)C++程序和语句(2)C++的输入与输出(3)关系运算和逻辑运算(4)选择结构和if语句(5)条件运算符和条件表达式(6)多分支选择结构和switch语句(7)循环结构和循环语句(8)循环的嵌套(9)break语句和continue语句[教学要求](1)要求学生掌握程序设计环境的使用方法,能独立进行程序设计。

C语言程序设计》基本知识点

C语言程序设计》基本知识点

C语言程序设计》基本知识点C语言程序设计》教学基本知识点第一章C语言基本知识1.C源程序的框架尽管各个C源程序的功能千变万化,但框架是不变的,主要有:编译预处理、主函数()、函数n()等,主函数的位置不一定在最前面,可以在程序的中部或后面,主函数的名字固定为main。

2.C语言源程序的书写规则:1)C源程序是由一个主函数和若干个其它函数组成的。

2)函数名后必须有小括号,函数体放在大括号内。

3)C程序必须用小写字母书写。

4)每句的末尾加分号。

5)可以一行多句。

6)可以一句多行。

7)可以在程序的任何位置加注释。

3.语句种类语句是程序的基本成分,程序的执行就是通过一条条语句的执行而得以实现的,根据表现形式及功能的不同,C语言的基本语句可以分为五大类。

1)流程控制语句流程控制语句的功能是控制程序的走向,程序的流程有三种基本结构:顺序结构、分支结构和循环结构,任何复杂的程序都可以由这三种基本结构复合而成。

其中后两种结构要用特定的流程控制语句实现。

2)表达式语句表达式语句的形式是:表达式。

即表达式后跟一分号“;”,分号是语句结束符,是一个语句必不可少的成分。

表达式和表达式语句的区别在于表达式代表的是一个数值,而表达式语句则代表一种动作。

最常见的表达式语句是赋值语句。

3)函数挪用语句函数挪用语句实践上也是一种表达式语句,形式为:在一次函数挪用的小括号后面加上一个分号。

(4)空语句空语句的形式就是一个分号,它不代表任何动作,常常作为一个意义迁移转变点利用。

5)复合语句复合语句从形式上看是多个语句的组合,但在语法意义上它只相当于一个语句,在任何单一语句存在的地方都可以是复合语句。

注意复合语句中最后一个语句末尾的分号不能少。

复合语句右大括号后面没有分号。

4.运算符用来表示数据各种操作的符号称为运算符。

运算符实际上代表了一种类型数据的运算规则。

不同的运算符具有不同的运算规则,其操作的数据类型必须符合该运算符的要求,运算结果的数据类型也是固定的。

数字图像处理技术的应用第6章 图像编码

数字图像处理技术的应用第6章 图像编码

6.2 图像压缩概述
2、平均码字长度:
Assume:
kis第k个码字Ck的长度二进制代码的位数出现的概率pk
码字平均长度R:
M
R= k pk bit
R1
3、编码效率:
H 100%
R
6.2 图像压缩概述
4、冗余度:
r 1 r 可压缩的余地越小
6.2 图像压缩概述
1)数据冗余:将图像信息的描述方式改变之后,压缩 掉这些冗余。
2)主观视觉冗余:忽略一些视觉不太明显的微小差异, 可以进行所谓的“有损”压缩。
6.2 图像压缩概述
图像数字化关键是编码 compression code:在满足一定图像质量前提下,能获得减少数
据量的编码
一.Compression code及分类 研究处理的对象: 数据的物理容量
图像序列(x、y、t)50~200倍
6.2 图像压缩概述
3、从图像的光谱特征出发: 单色image coding; color image coding; 多光谱image coding。
4、从图像的灰度层次上: 多灰度编码; 二值图像code
5、从处理图像的维数出发;
行内coding; 帧内coding; 帧间code。
图像一大特点是数据量大,为其存贮、传输带来困难,需压缩。
eg:电话线传输速率一般为56Kbits/s(波特率) 一幅彩色图像512×512×24bit = 6M bits大小。传一幅图像需2分钟左右。 实时传送:512×512×24bits×25帧/秒=150Mbits/S 如压缩20倍,传一幅图6秒左右,可以接受,实用。 实时,要专用信道(卫星、微波网、专线网等技术)。 另外,大量资料需存贮遥感、故宫、医学CT、MR。

第6章 C++程序的结构

第6章 C++程序的结构
4
教学辅导网站202.114.36.118
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
// p6_1_p1.cpp
1 /*************************** 2 * p6_1_p.cpp * 3 * 主程序 * 4 ***************************/ 5 #include <iostream> 6 using namespace std; 7 extern void p1dispG(); 8 extern void p2dispG(); 9 extern void p2dispg(); 10 int G=0,g=0; 11 void main() 12 { 13 p1dispG(); 运行结果: 14 G=11 in p1p2dispG(); 15 G=22 in p2p2dispg(); 16 g=222 in p2cout<<"in p G="<<G<<endl; 17 cout<<"in in p G=22 p g="<<g<<endl; 18 } in p g=222
教学辅导网站202.114.36.118
变量的存储类型
auto存储类
属于一时性存储,其存储空间可以被若 干变量多次覆盖使用。
register存储类
存放在通用寄存器中。
extern存储类
在所有函数和程序段中都可引用。
static存储类
在内存中是以固定地址存放的,在整个 程序运行期间都有效。
块作用域
作 用 域 与 可 见 性

第6章-程序结构

第6章-程序结构


一 、<iostream>和<iostream.h>格式不一样 前者 没有后缀,实际上,在你的编译器include文件夹里面可以 看到,二者是两个文件,打开文件就会发现,里面的代码是 不一样的。 后缀为.h的头文件c++标准已经明确提出不支 持了,早些的实现将标准库功能定义在全局空间里,声明在 带.h后缀的头文件里。c++标准为了和C区别开,也为了正 确使用命名空间,规定头文件不使用后缀.h。 因 此,当使 用<iostream.h>时,相当于在c中调用库函数,使用的是全 局命名空间,也就是早期的c++实现;当使用< iostream> 的时候,该头文件没有定义全局命名空间,必须使用 namespace std;这样才能正确使用cout。
静态函数有两个效果:1、它允许其他源文件建立并使用同名的函数, 而不相互冲突,在大的编程项目中是一个优势。2、声明为静态的函数不能 被其他源文件所调用,因为得不到它的名字。
【 6.3 作用域】
作用域是标识符在程序中有效地范围,标识符的引入与声明有关,作用 于开始于标识符的声明处。 C++有四种作用域的范围: 1、局部作用域 2、函数作用域 3、函数原型作用域 4、文件作用域
本章介绍C++的程序结构。所有的C++程序都是由一个或多个函数构成的。 一个C++程序可以由一个或多个包含若干函数定义的源文件组成。C++编 译器和链接器把构成一个程序的若干源文件有机地联络在一起,最终产生 可执行程序。
一般具有应用价值的程序由多个源文件组成。其中只有一个源文件具有 main( )函数,其他的文件不能含有主函数。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1-12
习题
• • 1.什么是预编译,何时需要预编译? .什么是预编译,何时需要预编译? 2.编写一个标准宏 . 编写一个标准宏MIN,这个宏输入两个参数并返回 , 较小的一个,注意参数在调用时可能是表达式的情况。 较小的一个,注意参数在调用时可能是表达式的情况。 3.编写一个C++程序,在程序中定义一个不带参数的 .编写一个 程序, 程序 宏PI,使其完成求给定半径的圆的周长和面积。 ,使其完成求给定半径的圆的周长和面积。

• •
1-9
条件编译
预处理程序除了提供上面介绍的宏定义和文件包含功能, 预处理程序除了提供上面介绍的宏定义和文件包含功能,其 还提供了条件编译的功能。 还提供了条件编译的功能。条件编译可以按不同的条件 去编译不同的程序部分, 去编译不同的程序部分,因而产生不同的目标代码文件 这对于程序的移植和调试是很有用的。 。这对于程序的移植和调试是很有用的。 #ifdef形式:如果标识符已被#define命令定义过,对程序 形式:如果标识符已被 命令定义过, 形式 命令定义过 进行编译, 进行编译。 段1进行编译,否则对程序段 进行编译。 进行编译 否则对程序段2进行编译 #ifndef形式 :如果标识符未被 形式 如果标识符未被#define命令定义过,则对程 命令定义过, 命令定义过 序段1进行编译 否则对程序段2进行编译 进行编译, 进行编译。 序段 进行编译,否则对程序段 进行编译。 #if形式 :如常量表达式的值为真(非0),则对程序段 进 形式 如常量表达式的值为真( ),则对程序段 ),则对程序段1进 行编译,否则对程序段2进行编译 进行编译。 行编译,否则对程序段 进行编译。

1-8
文件包含
• 文件包含是C++预处理程序的另一个重要功能。文件包 预处理程序的另一个重要功能。 文件包含是 预处理程序的另一个重要功能 含是指一个C++源程序中将另一个 源程序中将另一个C++源程序包含进来 含是指一个 源程序中将另一个 源程序包含进来 通过#include预处理指令实现。 预处理指令实现。 ,通过 预处理指令实现 C++中,#include被称为文件包含命令,其意义是把尖 中 被称为文件包含命令, 被称为文件包含命令 括号< 或引号“”内指定的文件包含到本程序来 或引号“”内指定的文件包含到本程序来, 括号 >或引号“”内指定的文件包含到本程序来,成 为本程序的一部分。 为本程序的一部分。被包含的文件通常是由系统提供的 其扩展名为.h。因此也称为头文件或首部文件。 ,其扩展名为 。因此也称为头文件或首部文件。 #include <iostream.h> #include "iostream.h"
1-4
宏定义
宏定义是由源程序中的宏定义命令完成的, 宏定义是由源程序中的宏定义命令完成的,宏代换是由预处 理程序自动完成的。 理程序自动完成的。在C++中,宏分为有参数和无参数两 中 种。 不带参数的宏也称为无参宏,其宏名后不带参数, 不带参数的宏也称为无参宏,其宏名后不带参数,定义的一 般形式为: 般形式为: #define 标识符 字符串 带参数的宏定义的一般形式为: 带参数的宏定义的一般形式为: #define 宏名 形参表 字符串 宏名(形参表 形参表)
第6章 编译预处理
杨章伟 e-mail:yang505412@
课程内容安排
• • • • • • •
预处理命令 宏 文件包含 条件编译 其他命令 小结 习题
1-2
预处理命令
• 简单来说,预处理就是对源文件进行编译前, 简单来说,预处理就是对源文件进行编译前,先对预处理部分 进行处理,然后对处理后的代码进行编译。这样做的好处是, 进行处理,然后对处理后的代码进行编译。这样做的好处是, 经过处理后的代码,将会变得很精短。 经过处理后的代码,将会变得很精短。为让用户更好地使用预 处理, 提供了丰富的预处理命令, 处理,C++提供了丰富的预处理命令,主要包括如下几种: 提供了丰富的预处理命令 主要包括如下几种: #define、/#error、#if、#else、#elif、#endif、#ifdef、 、 、 、 、 、 、 、 #ifndef、#undef、#line和#pragma。 、 、 和 。 由上述命令读者可以看出,每个预处理指令均带有符号“ 。 由上述命令读者可以看出,每个预处理指令均带有符号“#”。 简单来说,上面的这些预处理命令可以划分为文件包含、 简单来说,上面的这些预处理命令可以划分为文件包含、条件 编译、布局控制和宏替换4个大类 编译、布局控制和宏替换 个大类 。 :C++中,预处理程序中的 命令 中 预处理程序中的#error指令用于程序 指令用于程序 的调试,在编译中遇到#error指令就停止编译。 指令就停止编译。 的调试,在编译中遇到 指令就停止编译 #line命令 :#line命令用于控制行号,其一般在发布错误和 命令 命令用于控制行号, 命令用于控制行号 警告信息时使用。当用户在编译一段程序的时候, 警告信息时使用。当用户在编译一段程序的时候,如果 有错误发生, 有错误发生,编译器会在错误前面显示出错文件的名称 及文件中的第几行发生错误。指令#line可以实现这个功 及文件中的第几行发生错误。指令 可以实现这个功 也就是说, 能,也就是说,当出错时显示文件中的行数及希望显示 的文件名。 的文件名。
1-11
小结
本章主要介绍了C++中编译预处理的基本内容。结合C++中 中编译预处理的基本内容。结合 本章主要介绍了 中编译预处理的基本内容 中 使用较多的地方, 使用较多的地方,本章对宏及其相关应用做了详细讲解 依次介绍了宏的定义、调用、 ,依次介绍了宏的定义、调用、无参宏和带参宏的定义 调用,以及宏与函数的区别等,对于难点部分, 调用,以及宏与函数的区别等,对于难点部分,都安排 了具体示例方便读者理解。此外, 了具体示例方便读者理解。此外,本章还对包含文件处 命令、 理#include命令、条件编译相关命令等做了简要的介绍 命令 学习完本章,读者应对编译器编译C++源程序的过程有 。学习完本章,读者应对编译器编译 源程序的过程有 一定理解,并了解如何优化程序的部分方法。 一定理解,并了解如何优化程序的部分方法。

1-3

宏(macro)是程序设计语言中使用较为广泛的一个概念, )是程序设计语言中使用较为广泛的一个概念, 简单来说, 简单来说,宏是一种以相同的源语言执行预定义指令序 列的指令。 列的指令。在C++中,通过宏的使用,可以将一个表达式 中 通过宏的使用, 定义成宏,并在C++的源程序中随意调用。 的源程序中随意调用。 定义成宏,并在 的源程序中随意调用 在编译预处理时,对程序中所有出现的宏名,都用宏定义中 在编译预处理时,对程序中所有出现的宏名, 的字符串去代换,这称为宏代换或宏展开。 的字符串去代换,这称为宏代换或宏展开。

1-13
习题
4.下面程序段定义了两个宏,在主函数main()中使用了条 .下面程序段定义了两个宏,在主函数 中使用了条 件编译语句来控制程序的运行, 件编译语句来控制程序的运行,读者仔细理解并写出输 出结果。 出结果。
#include<iostream.h> #define CIR(r) r*r //带参数的宏定义 带参数的宏定义 #define TEST //定义宏 定义宏 void main() { int x=1; //定义并初始化变量 定义并初始化变量 int y=2; int z; z=CIR(x+y); //调用宏 调用宏 cout<<"CIR(x+y)= "<<z<<endl; //输出宏调用的结果 输出宏调用的结果 #ifdef TEST //条件编译语句 条件编译语句 cout<<"x= "<<x<<"\t"<<"y= "<<y<<endl; //输出结果 输出结果 #endif //结束条件编译 结束条件编译 cout<<"z= "<<z<<endl; //输出结果 输出结果 }
1-14
1-5
取消宏
• 由于宏定义的作用域是整个源程序, 由于宏定义的作用域是整个源程序 , 在一些应用中不需要 其覆盖整个程序,因此就需要终止其作用域, 其覆盖整个程序,因此就需要终止其作用域,C++中终止其 中终止其 作用域的命令为# 作用域的命令为 undef。如果要求宏定义只在一个函数中 。 起作用, 就可以在函数定义之前定义宏, 起作用 , 就可以在函数定义之前定义宏 , 在函数结束后结 束宏。 束宏。 宏嵌套 在宏定义中, 读者还需要注意的是, 宏定义允许嵌套, 在宏定义中 , 读者还需要注意的是 , 宏定义允许嵌套 , 即 在宏定义的字符串中可以使用已经定义的宏名, 在宏定义的字符串中可以使用已经定义的宏名 , 在宏展开 时由预处理程序层层代换。 时由预处理程序层层代换。

1-7
宏与函数的区别
• 由于宏也可以带参数, 由于宏也可以带参数,而且带参数的宏与带参数的函数 的写法和调用都很相似,但是其存在本质上的不同。 的写法和调用都很相似,但是其存在本质上的不同。前 面已经提到过, 面已经提到过,函数调用时要把实参表达式的值求出来 再赋予形参, 再赋予形参,而宏代换中对实参表达式不作计算直接地 代换。 代换。这导致了即使把同一表达式用函数处理与用宏处 两者的结果有可能是不同的。 理,两者的结果有可能是不同的。 【范例6-11】宏的定义和调用与函数的定义和调用的比 范例 】 较。该范例定义了一个带参宏和带参函数,其函数名为 该范例定义了一个带参宏和带参函数, SQ,形参为 ,函数体表达式为 ,形参为Y,函数体表达式为((y)*(y)),而宏定义也 , 定义字符串为((y)*(y)) 定义字符串为
相关文档
最新文档