Download presentation
Presentation is loading. Please wait.
1
第三章 程序的流程控制 胡昊 南京大学计算机系软件所
2
重要内容
3
简单的C++程序 //This is a C++ program #include <iostream>
using namespace std; int main() { double x,y; cout<<“Enter two numbers:”; cin>>x>>y; double z=x+y; cout<<x<<‘+’<<y<<‘=‘<<z<<endl; return 0; }
4
C++语言的语句分类
5
表达式语句:计算级数a, 2a, 3a,…的前n项的和
公式 #include <iostream> using namespace std; int main() { int n; double a, sum; cout<<“a= “; cin>>a; cout<<“n=“; cin>>n; sum=a*(1+n)*n/2; cout<<“sum=“<<sum<<endl; return 0; }
6
另一个例子 输入一个数,输出该数的平方,立方以及平方根。
<cmath>, x, square, cube, square_root
7
复合语句 例子: { int a, b; cin>>a>>b; int max; if (a>=b)
max=a; else max=b; cout<<max<<endl; }
8
If语句的含义 False或0 true或非0 true或非0 表达式 表达式 语句 语句 语句 False或0
9
If语句示例 输入三个整数,输出最大者 #include <iostream> using namespace std;
int main() { int a, b, c, max; cout<<“请输入三个整数:”<<endl; cin>>a>>b>>c; if(a>b) max=a; else max=b; if(c>max) max=c; cout<<“最大者为:”<<max<<endl; return 0; }
10
求一元二次方程 的实根 解:一元二次方程根的计算公式为: 实根的要求是:
11
求一元二次方程 的实根 作业:用if else改写上面程序段
求一元二次方程 的实根 #include <iostream> #include <cmath> using namespace std; int main() { double a, b, c, root1, root2, t; cout<<“请输入一元二次方程的系数(a, b, c):”<<endl; cin>>a>>b>>c; ………… cout<<“方程的根为:”<<root1<<“和”<<root2<<endl; return 0; } if (a==0) { cout<<“不是一个一元二次方程”<<endl; return -1; } t=b*b-4*a*c; if(t<0) { cout<<“方程没有实根”<<endl; return -1; } if(t==0) root1=root2=-b/(2*a); else { root1=(-b+sqrt(t))/(2*a); root2=(-b-sqrt(t))/(2*a); } 作业:用if else改写上面程序段
12
作业: 书p47页三角形判断的例子,并且将等腰直角三角形的程序段落补足。
13
比较两个时刻的先后次序 #include <iostream> using namespace std; int main() { int h1, m1, s1, h2, m2, S2; cout<<“请输入第一个时刻(时、分、秒):”; cin>>h1>>m1>>s1; cout<<“请输入第二个时刻(时、分、秒):”; cin>>h2>>m2>>s2; ………… return 0; }
14
比较两个时刻的先后次序 if (h2>h1) r=1; else if (h2<h1) r=-1; else if (m2>m1) //h1==h2 r=1; else if (m2<m1) r=-1; else if (s2>s1) //h1==h2 && m2==m1 r=1; else if (s2<s1) r=-1; else //h1==h2 && m1==m2 && s1==s2 r=0; if (r==1) cout<<“第一个时刻在前。”; else if (r==-1) cout<<“第二个时刻在前。”; else cout<<“两个时刻相同”; int t1, t2; t1=s1+m1*60+h1*3600; t2=s2+m2*60+h2*3600; if(t1<t2) cout<<“第一个时刻在前。”; else if(t1>t2) cout<<“第二个时刻在前。”; else cout<<“两个时刻相同”;
15
if-else配对问题 例: y= -1 (x<0) 0 (x=0) 1 (x>0)
main( ) { int x, y; cin>>x; ………… cout<<“x=”<<x<<“, y=”<<y<<endl; } 例: 算法二: 输入x 若x<0, y=-1 否则 若x=0, y=0 若x>0, y=1 输出y 算法一: 输入x 若x<0, y=-1 若x=0, y=0 若x>0, y=1 输出y
16
if-else配对问题-哪个对? 程序1: if(x<0) y=-1; else if (x==0) y=0; else y=1;
程序2: if(x>=0) if (x>0) y=1; else y=0; else y=-1; 程序3: y=-1; if (x!=0) if(x>0) y=1; else y=0; 程序4: y=0; if (x>=0) if(x>0) y=1; else y=-1;
17
if-else配对问题-程序1 x<0 y=-1 Y x=0 N y=1 N y=0 Y
18
if-else配对问题-程序2 x>=0 Y x>0 y=-1 N y=1 Y y=0 N
19
if-else配对问题-程序3 y=-1 N x!=0 Y x>0 y=1 Y y=0 N
20
if-else配对问题-程序4 y=0 N x>=0 Y x>0 y=1 Y y=-1 N
21
例 3‑8从键盘输入一个星期的某一天(0:星期天;1:星期一;...),然后输出其对应的英语单词
#include <iostream> using namespace std; int main() { int day; cin >> day; switch (day) { case 0: cout << "Sunday"; break; case 1: cout << "Monday"; break; case 2: cout << "Tuesday"; break; case 3: cout << "Wednesday"; break; case 4: cout << "Thursday"; break; case 5: cout << "Friday"; break; case 6: cout << "Saturday"; break; default: cout << "Input error"; } cout << endl; return 0;
22
例:编程统计从键盘上输入的数字中每种数字的个数和其他字符的个数,并以字符‘$’作为输入结束符。
#include <iostream> using namespace std; void main() { char c; int nother(0), ndigit[10]; for(int i=0; i<10; i++) ndigit[i]=0; cin>>c; …… for(i=0; i<10; i++) cout<< ndigit[i]<<’ ‘; cout<<”\nother=”<<nother<<endl; } while(c!=’$’) { switch( c ) case ‘0’: case ‘1’: case ‘2’: case ‘3’: case ‘4’: case ‘5’: case ‘6’: case ‘7’: case ‘8’: case ‘9’: ++ndigit[c—‘0’]; break; default: ++nother; } cin>>c;
23
三种循环语句的比较 下面将用三种循环语句来解决同一个问题:求 n! 1、用while语句 #include <iostream>
using namespace std; int main() { int n; cin >> n; int i=2,f=1; //循环初始化 while (i <= n) //循环条件 { f *= i; i++; //下一次循环准备 } cout << "factorial of " << n << " = " << f << endl; return 0;
24
2、用do-while语句 #include <iostream> using namespace std;
int main() { int n; cin >> n; int i=1,f=1; //循环初始化 do { f *= i; i++; //下一次循环的准备 } while (i <= n); //循环条件 cout << "factorial of " << n << " = " << f << endl; return 0; }
25
3、用for语句 #include <iostream> using namespace std; int main()
{ int n,i,f; cin >> n; for (i=2,f=1 //循环初始化 ; i<=n //循环条件 i++) //下一次循环准备 f *= i; //循环体 cout << "factorial of " << n << " = " << f << endl; return 0; }
26
循环程序设计实例(一):求第n个费波那契(Fibonacci)数。
#include <iostream> using namespace std; int main() { int n; cin >> n; int fib_1=0; //用于记住前一个Fibonacci数 int fib_2=1; //用于记住新的Fibonacci数 for (int i=3; i<=n; i++) { int temp=fib_1+fib_2; //计算新的Fibonacci数 fib_1 = fib_2; //记住前一个Fibonacci数 fib_2 = temp; //记住新的Fibonacci数 } cout << "第" << n << "个费波那契数是:" << fib_2 << endl; return 0;
27
循环程序设计实例(二):编程求出小于n的所有素数(质数)。
#include <iostream> using namespace std; int main() { int n,count=0; cout << "请输入一个正整数:" cin >> n; //从键盘输入一个正整数 for (int i=2; i<n; i++) //循环:分别判断2、3、...、n-1是否为素数 { int j=2; while (j < i && i%j != 0) //循环:分别判断i是否能被2 ~ i-1整除 j++; if (j == i) //i是素数 { cout << i << ","; count++; if (count%6 == 0) cout << endl; //控制每一行输出6个素数。 } cout << endl; return 0;
28
作业:将该程序实现成函数isPrime的实现方式
循环程序设计实例(三):编程求出小于等于n的所有素数(质数)用break语句。 #include <iostream> #include <cmath> using namespace std; int main() { int n, i, j, k ; cin>>n; if(n<=2) cout<<“no prime number under ”<<n<<endl; else { for (i=2; i<n; i++) k=sqrt(i); for(int j=2; j<=k; j++) if(i%j==0) break; if(j>=k+1) cout<<i<<“is a prime number”<<endl; cout<<i<<“is not a prime number”<<endl; } return 0; 作业:将该程序实现成函数isPrime的实现方式
29
Continue的用法 #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;
31
#include的例子-无模块 int x=1; //全局变量 double y=2.0; //全局变量 int f() //全局函数 {
int m; //局部变量 …… m+=x; //语句 return m; } void g() //全局函数 double z; //局部变量 z=y+10; //语句 int main() //全局函数 { double r; //局部变量 …… r=x+y*f(); //语句 g(); //语句 }
32
#include的例子-模块 //file1.h extern int x;//全局变量x的声明
extern double y;//全局变量y的声明 int f();//全局函数f的声明 //file1.cpp int x=1;//全局变量x的定义 double y=2.0;//全局变量y的定义 int f()//全局函数f的定义 { int m;//局部变量m的定义 …… m+=x; //语句 return m; } //file2.h void g();//全局函数g的声明 //file2.cpp #include “file1.h”//把文件file1.h中的内容包含进来 void g()//全局函数g的定义 { double z;//局部变量z的定义 …… z=y+10;//语句 } //main.cpp #include “file1.h”//把文件file1.h中的内容包含进来 #include “file2.h”//把文件file2.h中的内容包含进来 int main() //全局函数main的定义 double r;//局部变量r的定义 r=x+y*f();//语句 g();//语句
33
条件编译的例子 #include <iostream> using namespace std; #define A -10
void main( ) { #if A>0 cout <<”a>0”<<endl; #elif A<0 cout<<”a<0”<<endl; #else cout<<”a= =0”<<endl; #endif }
34
条件编译的作用-防止重复包含 #ifndef MYHEAD_H //main.cpp #define MYHEAD_H
#endif //main.cpp #include “myfile1.h” #include “myfile2.h” void main() { ….. } //myfile1.h #include “myhead.h” ……. //myfile2.h
35
条件编译的作用-调试开关 #define DEBUG 1 …… #if DEBUG = = 1
cout<<”OK!”<<endl; #endif cout<<a<<”\t”<<b<<endl;
36
条件编译的作用-多环境编程 #ifdef UNIX …….. //适合于UNIX环境的代码 #else …….. //适合于其他环境的代码
…….. //适合于其他环境的代码 #endif …….. //适合于任何环境的代码 #if defined(WINDOWS) defined(<宏名>) …….. //适合于WINDOWS环境的代码 #elif defined(UNIX) …….. //适合于UNIX环境的代码 #elif defined(MAC_OS) …….. //适合于MAC_OS环境的代码 #esle …….. //适合于其他环境的代码 #endif
Similar presentations