C++大学基础教程 第3章 过程化语句 北京邮电大学电信工程学院 计算机技术中心 用计算机解决实际问题,首 先要分析问题,设计合适的 算法,然后编程实现算法。 第3章 过程化语句 3.1 算法的基本控制结构 3.2 if选择语句 3.3 switch选择语句 3.4 循环语句 3.5 循环嵌套 3.6 应用举例 3.1 算法的基本控制结构 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -5- 3.1 算法的基本控制结构 算法 1、计算机执行的操作 2、这些操作的顺序 伪码 采用类似计算机语言的分句格式,以自然 语言描述算法。 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -6- 3.1 算法的基本控制结构 流程图 开始/结束 执 行 判 断 联 系 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -7- 3.1 算法的基本控制结构 程序的三种基本控制结构 (1)顺序结构 (2)选择结构 (3)循环结构 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -8- 3.1 算法的基本控制结构 流程控制语句 选择语句 : if..else、 switch 循环语句 : while、 for 、 do..while 转向语句 : break、 continue 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -9- 3.2 if选择语句 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -10- 3.2 if选择语句 if_else 1、没有 else分支 2、双分支 3、多分支 4、 if 语句的嵌套 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -11- 3.2 if选择语句 1、没有else分支 例如:比较x和y的大小,如果x大则输出x的值 if (表达式) 语句; if ( x>y ) cout<<x<<endl; 3.2 if选择语句 2、双分支 例如:比较x,y的大小,将较大的数输出 if (表达式) 语句1; else 语句2; if ( x>y ) cout<<x<<endl; else cout<<y<<endl; 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -13- 例子 任意输入一个4位整数的年份,判断 该年是否是润年? 是指年份能被 4整除的那些年,但不包 括能被 100整除而不能被 400整除的年 #include <iostream> using namespace std; void main() { int year; cin>>year; if ((year % 4==0) && !((year %100 == 0) && (year % 400!=0))) cout<<"润年 "<<endl; else cout<<"不是润年 "<<endl; } 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -15- 3.2 if选择语句 3、多分支 if (表达式 1) 语句 1; else if (表达式 2) 语句 2; else if (表达式 3) 语句 3; … else 语句 n; 例子:输出学生的成绩 #include <iostream> using namespace std; void main() { int x; cin>>x; if(x>=90) cout<<“优秀 ”<<endl; else if(x>=80) cout<<“良好 ”<<endl; else if(x>=60) cout<<“合格 ”<<endl; else cout<<“不及格 ”<<endl; } 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -18- 3.2 if选择语句 if (表达式 1) if (表达式 2) 语句 1 else 语句 2 else if (表达式 3) 语句 3 else 语句 4 4、 if 语句的嵌套 例子:输出a,b,c中较大的数 #include <iostream> using namespace std; void main(){ int a,b,c; cin>>a>>b>>c; if (a>b) { if (a>c) cout<<a<<endl; else cout<<c<<endl; } else { if (b>c) cout<<b<<endl; else cout<<c<<endl; } } cout<< (a>b?(a>c?a:c):(b>c?b:c ) ); 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -21- 3.2 if选择语句 注意:二义性 int x=-1; if (x>0) if (x<50) cout<<“x is <50”endl; else cout<<“x is <=0”<<endl; if和 else的对应关系, else总是与离它 最近的 if匹配。 { } 3.3 switch选择语句 3.3 switch选择语句 switch (表达式 ) { case 常量表达式 1: 语句 1 break; case 常量表达式 2: 语句 2 break; ┇ case 常量表达式 n: 语句 n break; default:语句 n+1 } 跳出 switch语句 例子:输出学生的成绩 int x; cin>>x; switch(x/10) { case 10: case 9:cout<<“优秀 ”<<endl; break; case 8: cout<<“良好 ”<<endl; break; case 7: case 6: cout<<“合格 ”<<endl; break; default: cout<<“不及格 ”<<endl; } 3.4 循环语句 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -27- 3.4 循环语句 三种基本语法 1、 while 语句 2、 do…while 语句 3、 for 语句 #include <iostream> #include <iomanip> using namespace std; void main(){ cout<<setfill('*') <<setw(2)<<'\n' <<setw(3)<<'\n' <<setw(4)<<'\n' <<setw(5)<<'\n' <<setw(6)<<'\n' <<setw(7)<<'\n' <<setw(8)<<'\n'; } * ** *** **** ***** ****** ******* #include <iostream> #include <iomanip> using namespace std; void main(){ int i=2; cout<<setfill('*'); while(i<=8) { cout<<setw(i)<<'\n'; i++; } } * ** *** **** ***** ****** ******* 循环控制 条件 循环体 循环变量 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -30- 3.4 循环语句 主要包括3个部分: 1、 循环控制条件: 判断循环操作是否进行的条件; 2、 循环体: 重复进行的操作; 3、 循环控制变量: 记录循环体执行的次数,或控制循环的结束 条件。 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -31- 3.4 循环语句 while循环语句 while(表达式) 循环体语句; 例1:编程循环输出 1-9这 9个数字? 运行结果 : 1 2 3 4 5 6 7 8 9 循环结束 #include <iostream> using namespace std; void main() { int i=1; while (i<9) { cout<<i<<endl; i++; } cout<<“循环结束 ”<<endl; } 例2:编程计算1+2+3+ ….+10的值 #include <iostream> using namespace std; void main() { int sum=0, i=0; whil(i<=10) { sum+=i; i++; } cout<<sum<<endl; } 55 例3:打印可视字符 #include<iostream> using namespace std; void main() { unsigned char ch=32; while(ch<128) { cout<<(int)ch<<'\t'<<ch<<'\t'; ch++; } } 例4:编程计算 的值 #include <iostream> using namespace std; void main() { int k=1,sum=0,n; cout<<"input n(n>0):"; cin>>n; while(k<=n) { sum=sum+k*k; k++; } if(n>0) cout<<sum/n<<endl; else cout<<"n不能 <=0"<<endl; } 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -36- 3.4 循环语句 do..while循环语句 do { 循环体语句; } while(表达式 ); #include <iostream> #include <iomanip> using namespace std; void main() { int i=2; cout<<setfill('*'); while(i<=8) { cout<<setw(i)<<'\n'; i++; } } * ** *** **** ***** ****** ******* do { cout<<setw(i)<<'\n'; i++; } while(i<=8); 例子:编程计算 的值 #include <iostream> using namespace std; void main() { int k=1,sum=0,n; cout<<"input n(n>0):"; cin>>n; while(k<=n) { sum=sum+k*k; k++; } if(n>0) cout<<sum/n<<endl; else cout<<"n不能 <=0"<<endl; } do sum=sum+k*k; k++; }while(k<=n); 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -39- 3.4 循环语句 for循环语句 循环结构 1、表达式1 ? 循环变量初始化; 2、表达式2 ? 循环控制条件; 3、表达式3 ? 循环变量的变化; for (表达式 1; 表达式 2; 表达式 3) 循环体; 例1: 编程循环输出 1-9这 9个数字? #include <iostream> using namespace std; void main() { for (int i=1;i<10;i++) cout<<i<<endl; cout<<“循环结束 ”<<endl; } 运行结果 : 1 2 3 4 5 6 7 8 9 循环结束 例 2:编程计算 1+2+3+….+10的值 #include <iostream.> using namespce std; void main() { int sum=0; for (int i=1;i<=10;i++) sum+=i; cout<<sum<<endl; } 运行结果: 55 例3 * ** *** **** ***** ****** ******* #include <iostream> #include <iomanip> using namespace std; void main(){ cout<<setfill('*'); } for(int i=2;i<=8;i++) cout<<setw(i)<<'\n'; 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -43- 3.4 循环语句 ——for语句 1、<表达式1>可以省略 for(int i=1 ; i<=9 ; i++) 循环体; int i=1; for( ; i<=9 ; i++) 循环体; 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -44- 3.4 循环语句 ——for语句 2、<表达式2>可以省略 for(int i=1; i<=9; i++) 循环体; for(int i=1; ; i++) { if (i<=9) 循环体; else break; //跳转语句,用来跳出循环 } 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -45- 3.4 循环语句 ——for语句 3、<表达式3>可以省略 for(int i=1; i<=9; i++) 循环体; for(int i=1; i<=9; ) { 循环体; i++; } 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -46- 3.4 循环语句 ——for语句 3、<表达式1> <表达式3>同时省略 for(int i=1; i<=9; i++) 循环体; int i=1; for(; i<=9; ) { 循环体; i++; } 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -47- 3.4 循环语句 ——for语句 5、极端情况,可实现无限循环 for( ; ; ) { 循环体; } 例4:判断输出结果? 分析: i j k 0 10 0 1 9 9 2 8 25 3 7 46 4 6 70 5 5 跳出 #include <iostream> using namespace std; void main(){ for(int i=0,j=10,k=0; i<j; i++,j--) k+=i*j; cout<<k<<endl; } 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -49- 3.4 循环语句 1、 for: 最适合循环次数固定,循环规律非常明显程 序。 2、 while: 使用最多最频繁的循环结构,具有普适性。 3、 do_while: 最适合至少循环一次的循环结构。 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -50- 3.4.4 转向语句 1、 break语句 2、 continue语句 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -51- 3.4.4 转向语句 ——break 用途: 常用在 while、 do-while、 for和 switch语句 中,用来跳出循环或 switch语句。 例1:判断输出结果? #include <iostream> using namespace std; void main(){ int sum=0; for (int i=1;i<10;i++) { if (i % 3==0) break; sum+=i; } cout<<sum<<endl; } 分析 i sum 1 1 2 3 3 跳出 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -53- 3.4.4 转向语句 ——continue 用途 用于循环语句中,结束本次循环,进行下 一次循环;即跳过循环体中尚未执行的部分。 分析 i sum 1 1 2 3 3 3 47 512 612 719 827 927 10 跳出 例1:判断输出结果? #include <iostream> using namespace std; void main(){ int sum=0; for (int i=1;i<10;i++) { if (i % 3==0) continue; sum+=i; } cout<<sum<<endl; } 3.5 循环嵌套 3.5 循环嵌套 编程输出国际象棋棋盘 #include <iostream> using namespace std; void main() { for (int i=0;i<8;i++) { for (int j=0;j<8;j++) { if ((i+j)%2==0) cout<<"■ "; else cout<<" "; } cout<<"\n"; } } ■■■■ ■■■■ ■■■■ ■■■■ ■■■■ ■■■■ ■■■■ ■■■■ 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -57- 思考 题目: 使用 For循环输出如下图形: * ** *** **** ***** ****** ******* #include <iostream> using namespace std; void main() { for (int i=1;i<=7;i++) { for (int j=7; j>i; j--) cout<<' '; for (j=1; j<=i; j++) cout<<'*'; cout<<endl; } } 3.6 应用举例 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -60- 3.6 应用举例1 任意输入一个整数,判断是否是素数? 问题:什么是素数? #include <iostream> using namespace std; void main(){ int n,i; cin>>n; for (i=2;i<n;i++) if (n%i==0) break; if (i<n) cout<<n<<"不是素数! \n"; else cout<<n<<"是素数 \n"; } 改进:输出2-100之间的素数 #include <iostream> #include <cmath> using namespace std; void main() { for(int k=2;k<100;k++) { int n=sqrt(k); for (int i=2;i<=n;i++) if (k%i==0) break; if (i>n) cout<<k<<'\t'; } } 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -63- 3.6 应用举例2 题目 任意输入一个整数,按位翻转输出。例如 输入124,输出421。 #include <iostream> using namespace std; void main(){ int i, n, result=0; cout<<"请输入任意一个整数: "; cin>>n; cout<<"按位翻转的结果为: "; while (n!=0){ i =n % 10; result=result*10+i; n /= 10; } cout<<result<<endl; } 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -65- 3.6 应用举例3 题目 一球从100米高度落下,每次落地后反弹回原高度 的一半,再落下。编程求解它在第n次落地时,共经过 多少米? #include <iostream> using namespace std; void main() { double height=100; double sum=height; for (int i=1;i<10;i++) { sum+=height; height/=2; } cout<<sum<<endl; } 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -67- 3.6 应用举例4 题目 若一头小母牛,从出生起第四个年头开始 每年开始生一头小母牛,按此规律,第n年时 有多少头母牛? f(1)=1; f(2)=1; f(3)=1; f(n)=f(n-1)+f(n-3); #include <iostream> using namespace std; void main() { int n; long a=1, b=1, c=1, temp; cout <<"please input a value:\n"; cin >>n; for(int i=4; i<=n; i++) { temp=a+c; a=b; b=c; c=temp; } cout << c <<endl; } 总结 三种基本结构:顺序、选择和循环 流程图和伪码,帮助我们设计算法、完善算 法,增强算法的可读性