授课老师:龚涛 信息科学与技术学院 2018年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第3章 预处理和语句 预处理功能 语句 选择语句 循环语句 转向语句 东华大学信息科学与技术学院 龚涛
第3章 预处理和语句 3.1 预处理功能 C++语言程序是由若干个文件组成的,文件又是由若干个函数组成的,而函数便是由若干个语句组成。每条语句实现一个操作,若干个语句实现一种功能。 C++语句的预处理功能是指C++语言源程序中可以包含使用的各种编译命令,而这些编译命令由于它们是在程序被正常编译之前执行的,故称为预处理命令(或指令)。这些命令所实现的功能称为预处理功能。 预处理命令是编译命令,它不是语句,不要用分号结束。 文件包含命令 条件编译命令 宏定义命令 东华大学信息科学与技术学院 龚涛
3.1 预处理功能 3.1.1 文件包含命令 文件包含命令格式如下: #include <文件名> 或者 3.1 预处理功能 3.1.1 文件包含命令 文件包含命令格式如下: #include <文件名> 或者 #include "文件名" 文件名以尖括号(<>)括起是指那些由系统提供的并放在指定子目录中的头文件;文件名以双括号("")括起是指那些由用户自己定义的放在当前目录或其他目录下的头文件或其他源文件。 一条文件包含命令只能包含一个文件。若想包含多个文件,则必须用多条文件包含命令。 在被包含的文件中还可以使用文件包含命令,文件包含命令可以嵌套使用。 包含不宜太多。 东华大学信息科学与技术学院 龚涛
3.1 预处理功能 3.1.2 条件编译命令 条件编译命令是用来定义某些编译内容要在满足一定条件下才参与编译,否则将不参与编译。因此,利用条件编译命令可以使同一个源程序在不同的编译条件下产生不同的目标代码。 利用条件编译可在调试程序时增加一些调试语句,以达到跟踪的目的。当程序调试好后,重新编译时,再让调试语句不参与编译。 (1) 格式一 #ifdef <标识符> <程序段1> #else <程序段2> #endif 东华大学信息科学与技术学院 龚涛
3.1 预处理功能 3.1.2 条件编译命令 (2) 格式二 #ifndef <标识符> <程序段1> #else 3.1 预处理功能 3.1.2 条件编译命令 (2) 格式二 #ifndef <标识符> <程序段1> #else <程序段2> #endif (3) 格式二 #if <产量表达式1> #elif <产量表达式2> <程序段3> 东华大学信息科学与技术学院 龚涛
宏定义命令用来将一个标识符定义为一个字符串。该标识符被称为宏名,被定义的字符串称为替换文本。 3.1 预处理功能 3.1.3 宏定义命令 宏定义命令用来将一个标识符定义为一个字符串。该标识符被称为宏名,被定义的字符串称为替换文本。 (1) 简单的宏定义 #define <宏名> <字符串> 一个标识符被宏定义后,该标识符便是一个宏名。在程序中出现的是宏名。在该程序被编译时,先将宏名用被定义的字符串替换,这称为宏替换,替换后才进行编译。宏替换是简单的代换。 东华大学信息科学与技术学院 龚涛
3.1 预处理功能 3.1.3 宏定义命令 使用简单的宏定义可以定义符号常量,但在C++语言中,常用const来定义符号常量。两种方法是有区别的,其主要区别有: ① const将产生一个具有类型的符号,用#define命令仅产生文本替换,而不管内容是否正确。 ② 使用const可以定义一个局部常量,使其作用域局限在一个函数体内。而用#define定义的常量,尽管在某个函数体内,但它的作用域是从定义时开始,直到使用#undef取消其定义时为止;如果不取消其定义,则直到整个文件结束。 ③ 使用const定义常量是一个说明语句,以分号结束;而用#define定义常量是一个预处理命令,不能用分号结束。 东华大学信息科学与技术学院 龚涛
#define <宏名>(<参数表>) <宏体> 3.1 预处理功能 3.1.3 宏定义命令 (2) 带参数的宏定义 #define <宏名>(<参数表>) <宏体> <参数表>中可以有一个参数,也可以有多个参数,多个参数用逗号分隔。在替换时,<宏体>中与参数表中相同的标识符的字符序列将被程序中引用这个宏定义时提供的与该标识符对应的字符序列所替换。 在宏定义时出现的参数称为形参,在程序中引用宏定义时出现的参数称为实参。在宏替换时,将用实参来替换<宏体>中所出现的形参。 东华大学信息科学与技术学院 龚涛
3.1 预处理功能 3.1.3 宏定义命令 例3.5 分析下列程序的输出结果。 #include <iostream.h> void main() { int b(5); #define b 2 #define f(x) b*(x) int y(3); cout<<f(y+1)<<endl; #undef b #define b 3 } 程序中出现了#define和#undef预处理命令。在宏定义中,有简单的,也有带参数的。在宏定义#define f(x) b*(x)中,如果对b的宏定义没有取消,那么b是符号常量b,而不是变量b,因为预处理命令在编译之前执行。 pause 东华大学信息科学与技术学院 龚涛
C++语言提供了丰富的语句,这些语句足以组成结构化程序设计所需要的3种基本控制结构:连续结构、选择结构和循环结构。 第3章 预处理和语句 3.2 语句 C++语言提供了丰富的语句,这些语句足以组成结构化程序设计所需要的3种基本控制结构:连续结构、选择结构和循环结构。 C++语言所提供的语句包括如下几种: 表达式语句和空语句; 复合语句; 选择语句; 循环语句; 转向语句。 东华大学信息科学与技术学院 龚涛
C++语言中任何一个表达式加上分号(“;”)便是表达式语句。空语句是指只有一个分号的语句。 3.2 语句 3.2.1 表达式语句和空语句 C++语言中任何一个表达式加上分号(“;”)便是表达式语句。空语句是指只有一个分号的语句。 a=3*b; x=a|b&c; y=x<=5; a=3, b=5, a+b; !a&&b||c; f(a,b); y=fun(&a,&b); 东华大学信息科学与技术学院 龚涛
复合语句常用来作为if语句的if体、else体,或者作为循环语句的循环体等。 3.2 语句 3.2.2 复合语句和空语句 复合语句是由两条或两条以上的语句组成,并由一对花括号({ })括起来的语句。复合语句在语法上相当于一条语句,复合语句又称为块语句。复合语句可以嵌套,即复合语句中还可以包含复合语句。含有一条或多条说明语句的复合语句称为分程序,也称为块结构。 复合语句常用来作为if语句的if体、else体,或者作为循环语句的循环体等。 东华大学信息科学与技术学院 龚涛
选择语句是C++语言程序经常使用的语句,可用它构成选择结构。 选择语句有两种: 一种是条件语句,即if语句; 第3章 预处理和语句 3.3 选择语句 选择语句是C++语言程序经常使用的语句,可用它构成选择结构。 选择语句有两种: 一种是条件语句,即if语句; 另一种是开关语句,即switch语句。 它们都可以用来实现多路分支。这种语句具有一定的判断能力,它可以根据给定的条件来决定执行哪些语句,不执行哪些语句。 东华大学信息科学与技术学院 龚涛
if(<条件1>) <语句1> else if(<条件2>) <语句2> 3.3 选择语句 3.3.1 条件语句 条件语句具有如下格式: if(<条件1>) <语句1> else if(<条件2>) <语句2> else if(<条件3>) <语句3> … else if(<条件n>) <语句n> else <语句n+1> 其中,if, else if, else是关键字。 if (<条件>) <语句> 东华大学信息科学与技术学院 龚涛
3.3 选择语句 3.3.1 条件语句 例3.6 比较两个数的大小。 #include <iostream.h> 3.3 选择语句 3.3.1 条件语句 例3.6 比较两个数的大小。 #include <iostream.h> void main() { int x,y; cout<<"Input x,y:"; cin>>x>>y; if(x!=y) if(x>y) cout<<"x>y"<<endl; else cout<<"x<y\n"; cout<<"x=y\n"; } 东华大学信息科学与技术学院 龚涛
3.3 选择语句 3.3.1 条件语句 例3.7 分析下列程序的输出结果。 #include <iostream.h> void main() { int a,b; a=b=5; if(a==1) if(b==5) a+=b; cout<<a<<endl; } else a-=b; cout<<a+b<<endl; 该程序中出现了if语句的嵌套,这里只有一个else,它显然应该属于距它最近的if,即属于if(b==5)的else。 东华大学信息科学与技术学院 龚涛
3.3 选择语句 3.3.2 开关语句 开关语句具有如下格式: switch(<整型表达式>) { 3.3 选择语句 3.3.2 开关语句 开关语句具有如下格式: switch(<整型表达式>) { case <整常型表达式1>: <语句序列1> case <整常型表达式2>: <语句序列2> … case <整常型表达式n>: <语句序列n> default: <语句序列n+1> }; 其中,先计算switch后面括号内的表达式的值,然后,将该值与花括号内case后面的<整常型表达式>的值进行比较。 东华大学信息科学与技术学院 龚涛
3.3 选择语句 3.3.2 开关语句 case '5': case '6': case '7': case '8': case '9': ++ndigit[c-'0']; break; default: ++nother; } cin>>c; cout<<"digiter="; for(i=0;i<10;i++) cout<<ndigit[i]<<' '; cout<<"\nother="<<nother<<endl; 例3.9 编程统计从键盘上输入的数字中每种数字的个数和其他字符的个数,并以字符‘$’作为输入结束符。 #include <iostream.h> void main() { char c; int nother(0),ndigit[10]; for(int i=0;i<10;i++) ndigit[i]=0; cin>>c; while(c!='$') switch(c) case '0': case '1': case '2': case '3': case '4': * 东华大学信息科学与技术学院 龚涛
第3章 预处理和语句 3.4 循环语句 C++语言中提供了3种循环语句:一种是while循环语句,一种是do-while循环语句,另一种是for循环语句。它们的共同特点是根据循环条件来判断是否执行循环体。 3.4.1 while循环语句 该语句格式如下: while (<条件>) <语句> 其中,该条件给出了一个表达式,通过计算该表达式,可决定是否执行循环体。当表达式的值为非零时,执行循环体;否则退出该循环,即执行该循环后边的语句。 东华大学信息科学与技术学院 龚涛
3.4 循环语句 3.4.1 while循环语句 例3.11 编程求出自然数1~10之和。 3.4 循环语句 3.4.1 while循环语句 例3.11 编程求出自然数1~10之和。 #include <iostream.h> void main() { int i(1),sum(0); while(i<=10) sum+=i; i++; } cout<<"sum="<<sum<<endl; 东华大学信息科学与技术学院 龚涛
3.4 循环语句 3.4.2 do-while循环语句 该循环语句具有如下格式: do <语句> 3.4 循环语句 3.4.2 do-while循环语句 该循环语句具有如下格式: do <语句> while (<条件>); 该循环语句的功能如下: 先执行一次<语句>(即循环体),然后计算<条件>所给出的表达式值。如果其值为非零,则再次执行循环体,直到其值为零才退出该循环,并执行该循环后边的语句。 do-while循环与while循环的区别在于do-while循环至少执行一次循环体,而while循环可能一次也不执行循环体。 东华大学信息科学与技术学院 龚涛
3.4 循环语句 3.4.2 do-while循环语句 例3.12 用do-while循环编程求出自然数1~10之和。 3.4 循环语句 3.4.2 do-while循环语句 例3.12 用do-while循环编程求出自然数1~10之和。 #include <iostream.h> void main() { int i(1),sum(0); do sum+=i++; } while(i<=10); cout<<"sum="<<sum<<endl; } 东华大学信息科学与技术学院 龚涛
for (d1;d2;d3) <语句> 3.4 循环语句 3.4.3 for循环语句 该循环语句具有如下格式: for (d1;d2;d3) <语句> d1表达式用来表示给循环变量初始化;d2表达式用来表示循环是否结束的条件,若该表达式值为非零,则执行循环体,否则退出循环;d3表达式用来作为循环变量的增、减量。 在for循环中,d1表达式只计算一次,可以放在for循环前面;d3表达式每执行完循环体后计算一次,可放在循环体中,因此for循环格式可以与while循环互换。 东华大学信息科学与技术学院 龚涛
所谓多重循环是指在循环体内还有循环语句,这又称为循环的嵌套。 3.4 循环语句 3.4.4 多重循环 所谓多重循环是指在循环体内还有循环语句,这又称为循环的嵌套。 C++语言中提出的上述3种循环不仅可以自身嵌套,而且可以相互嵌套。嵌套时应该注意的是要在一个循环体内包含另一个完整的循环结构。 do-while循环的自身嵌套 for循环内嵌套while循环 while循环内嵌套for循环,for循环又自身嵌套 while循环内嵌套do-while循环 for循环内嵌套while循环和do-while循环 东华大学信息科学与技术学院 龚涛
3.4 循环语句 3.4.4 多重循环 例3.15 分析下列程序的输出结果。 #include <iostream.h> 3.4 循环语句 3.4.4 多重循环 例3.15 分析下列程序的输出结果。 #include <iostream.h> void main() { int i(1),a(0); for(;i<=5;i++) do{ i++; a++; } while(i<3); } cout<<a<<","<<i<<endl; 东华大学信息科学与技术学院 龚涛
3.4 循环语句 3.4.4 多重循环 例3.16 编程求出50~100之内的素数。 #include <iostream.h> 3.4 循环语句 3.4.4 多重循环 例3.16 编程求出50~100之内的素数。 #include <iostream.h> #include <math.h> #define MIN 51 #define MAX 100 void main() { int i,j,k,n(0); for(i=MIN;i<=MAX;i+=2) k=(int)sqrt(double(i)); for(j=2;j<=k;j++) if(i%j==0) break; if(j>=k+1) if(n%6==0) cout<<endl; n++; cout<<" "<<i; } cout<<endl; * 东华大学信息科学与技术学院 龚涛
goto语句:goto <语句标号>; break语句:break; 用于退出开关语句;用于退出该重循环。 第3章 预处理和语句 3.5 转向语句 C++语言中提供了goto、break和continue等转向语句。其中,goto是非结构化控制语句,而break和continue是半结构化控制语句,它们会改变语句的执行顺序,因此,应在程序中尽量少用。 goto语句:goto <语句标号>; break语句:break; 用于退出开关语句;用于退出该重循环。 continue语句:continue; 该语句只在循环体中用来结束该次循环。 东华大学信息科学与技术学院 龚涛
3.5 转向语句 3.5.1 goto语句 例3.18 编程程序,从一个已知的二维数组中查找出第一次出现负数的数组元素。 3.5 转向语句 3.5.1 goto语句 例3.18 编程程序,从一个已知的二维数组中查找出第一次出现负数的数组元素。 #include <iostream.h> void main() { int j,num[2][3]; cout<<"Input 6 digiters:"; for(int i=0;i<2;i++) for(j=0;j<3;j++) cin>>num[i][j]; for(i=0;i<2;i++) if(num[i][j]<0) goto found; cout<<"not found!\n"; goto end; found: cout<<"num["<<i<<"]["<<j<<"]"<<num[i][j]<<endl; end: ; } 东华大学信息科学与技术学院 龚涛
3.5 转向语句 3.5.1 goto语句 例3.18 不用goto语句编程从已知的二维数组中查找出第一次出现负数的数组元素。 3.5 转向语句 3.5.1 goto语句 例3.18 不用goto语句编程从已知的二维数组中查找出第一次出现负数的数组元素。 #include <iostream.h> void main() { int j,num[2][3], flag=0; cout<<"Input 6 digiters:"; for(int i=0;i<2;i++) for(j=0;j<3;j++) cin>>num[i][j]; for(i=0;i<2&&flag==0;i++) for(j=0;j<3&&flag==0;j++) if(num[i][j]<0) flag=1; cout<<"num["<<i<<"]["<<j<<"]"<<num[i][j]<<endl; } if(flag==0) cout<<"not found!\n"; 东华大学信息科学与技术学院 龚涛
3.5 转向语句 3.5.2 break语句 例3.19 编程将从键盘上输入的若干个正数求和,遇到负数则终止程序,并且输入的数不超过10个。 3.5 转向语句 3.5.2 break语句 例3.19 编程将从键盘上输入的若干个正数求和,遇到负数则终止程序,并且输入的数不超过10个。 #include <iostream.h> #define M 10 void main() { int num, sum(0); cout<<"Input number:"; for(int i=0;i<M;i++) cin>>num; if(num<0) break; sum+=num; } cout<<"sum="<<sum<<endl; 东华大学信息科学与技术学院 龚涛
3.5 转向语句 3.5.3 continue语句 例3.20 编程计算从键盘上输入的10个数中的所有整数之和,对负数不进行计算,并显示求和结果。 #include <iostream.h> #define M 10 void main() { int num, sum(0); cout<<"Input number:"; for(int i=0;i<M;i++) cin>>num; if(num<0) continue; sum+=num; } cout<<"sum="<<sum<<endl; * 东华大学信息科学与技术学院 龚涛
答疑联系信息 办公室电话:021-67792312 手机:18201798064 QQ:5763698 E-mail:taogong@dhu.edu.cn 办公室地址:2号学院楼518室 东华大学信息科学与技术学院 龚涛