430 likes | 626 Views
第三章 C++ 程序的流程控制. 流程控制与程序结构. 顺序结构:按先后顺序依次执行 条件分支结构: 由特定的条件决定执行哪个语句和程序结构 分单分支结构 (if) 、多分支结构 (switch) 循环结构 特定的条件决定某个语句重复执行次数的控制方式 分先判断后执行 (while,for) 、先执行后判断 (do…while) 三种结构特点:只有一个入口和一个出口. 三种基本的程序结构. —— 顺序结构:通过安排语句的排列顺序来决定程序流程的程序结构 ;. 语句1. 语句2. 三种基本的程序结构.
E N D
流程控制与程序结构 • 顺序结构:按先后顺序依次执行 • 条件分支结构: • 由特定的条件决定执行哪个语句和程序结构 • 分单分支结构(if)、多分支结构(switch) • 循环结构 • 特定的条件决定某个语句重复执行次数的控制方式 • 分先判断后执行(while,for)、先执行后判断(do…while) • 三种结构特点:只有一个入口和一个出口
三种基本的程序结构.. ——顺序结构:通过安排语句的排列顺序来决定程序流程的程序结构 ; 语句1 语句2
三种基本的程序结构.. ——条件分支结构:由特定的条件决定执行哪个语句的程序结构。 false 条件 true 语句2 语句1
三种基本的程序结构.. ——循环结构:由特定的条件决定某个语句重复执行的次数的程序结构。 循环条件 true 循环体 false
三种基本的程序结构 ——共同特点:每种结构只有一个入口和一个出口,可以相互嵌套。
条件分支结构 • if结构(两分支) • switch结构(多分支)
if 语句.. ——格式:if(条件) 语句1〖 else 语句2〗 false 条件 true 条件 true 语句2 语句1 false 语句1
if 语句.. ——条件通常是一个逻辑表达式 。若不是,则一切 0 值将被转换成 false,一切非 0 值将被转换成 true。 ——语句1和 语句2可以是基本语句,也可以是复合语句 ,但必须是语句。 →
if 语句.. • 错误的 if 语句示例(1): • if(x) cout<<"x is non-zero“else cout<<"x is zero"; 缺语句结束符;
if 语句 错误的 if 语句示例(2):if(x==100){ a=1; b=2;};else{ a=-1; b=-2;}; 多余的语句结束符(语法错误) 多余的语句结束符(逻辑错误)
if 语句的嵌套.. ——在格式if(条件) 语句1〖 else 语句2〗中,若 语句1和 语句2本身也是 if 语句,就构成嵌套的if语句 。 ——第一个 else 开始,“else”总与离它最近的“if”配对 。 →
if(n>0) 语句 if(a>b) z=a; 的含义? else z=b; if 语句的嵌套.. if(n>0){ if(a>b) z=a; else z=b; } if(n>0){ if(a>b) z=a; } else z=b; ?
if 语句的嵌套.. ——最好只在 else 后嵌套 if(n<=0) z=b; else if(a>b) z=a; n>0 的 相反条件 if(n>0){ if(a>b) z=a;} else z=b;
if结构 • 格式:if(条件)语句1[else 语句2] • 功能:条件成立执行语句1,否则执行else后的语句2 • 语句1、2可以是基本语句,也可以是复合语句 例:P53 • 条件不能是永真或永假条件,否则出现逻辑错误 • C++的写法: • if (ok) …… //如果ok为真,则…… • if (!ok)…… //如果ok为假,则……
if结构(if 语句的嵌套) • if(n>0)if(a>b) z=a;else z=b; • else总是与离它最近的if配对
例1:输入2个数,找出其中最大一个并显示出来 • 1: #include< iostream.h> • 2: • 3: void main( ) • 4: { • 5: int i, j; • 6: cout<<“请输入2个整数:”; • 7: cin>>i>>j; • 8: cout<<“2个数中最大的是”; • 9: if(i>j) • 10: cout<<i<<endl; • 11: else • 12: cout<<j<<endl; • 13: }
例2:输入3个数,找出其中最大一个并显示出来例2:输入3个数,找出其中最大一个并显示出来 • 1:#include<iostream.h> • 2: • 3:void main( ) • 4:{ • 5:int i,j,k,m; • 6:cout<<“请输入3个整数:”; • 7:cin>>i>>j>>k; • 8:cout<<“3个数中最大的是”; • 9:if (i<j)i=j; • 10:if(i<k)i=k; • 11:cout<<i<<endl; • 12:}
例2:输入3个数,找出其中最大一个并显示出来例2:输入3个数,找出其中最大一个并显示出来 #include<iostream.h> void main( ){int i,j,k; cout<<“请输入3个整数:”; cin>>i>>j>>k; cout<<“3个数中最大的是”; if(i>j){//若条件成立则j被排除,问题变成“从i和k中找出最大者” if(i=k) cout<<i<<endl; else cout<<k<<endl;} else{//若条件不成立则被i排除,问题变成“从j和k中找出最大者 if(j>=k) cout<<j<<endl; else cout<<k<<endl;} }
例3 输入3个数,然后按从大到小的顺序把它们显示出来 • 1:#include<iostrean.h> • 2: • 3:void main( ) • 4:{ • 5:int i,j,k,p; • 6:cout<<“请输入3个整数:”; • 7:cin>>i>>j>>k; • 8:if(i<j){p=i;i=j;j=p;} • 9:if(i<k){p=i;i=k;k=p} • 10:if(j<k){p=j;j=k;k=p;} • 11:cout<<endl<<i<<’’<<j<<’’<<k; • 12:}
if多分支结构 • if(条件1) 语句1 • else if (条件2) 语句2 • else if (条件3) 语句3 • …… • else if (条件n) 语句n • [else 语句n+1]
输入一个0~100分范围内的一个成绩,显示相应的等级输入一个0~100分范围内的一个成绩,显示相应的等级 • #include<iostream.h> • void main( ){ • float score; • cout<<“请输入成绩:”; • cin>>score; • if(score<0||score>100) cout<<“成绩必须在0~100分之间”; • else if (score<60) cout<<“不及格”<<endl; • else if (score<70) cout<<‘”及格”<<endl; • else if (score<80) cout<<“中”<<endl; • else if (score<90) cout<<“良”<<endl; • else cout<<“优”<<endl;}
switch语句和switch多分支结构 • 格式: • switch (整型表达式){ • case 整型常量表达式1:语句序列1 • case 整型常量表达式2:语句序列2 • …… • case 整型常量表达式k:语句序列k • [default: 语句序列k+1]} • 说明: • 整型表达式若不是整型,则它的值将被自动转换成整型 • 整型常量表达式不是整型则,将被自动转换成整型 • 语句序列可以是空的 • break语句作用是提前结束switch语句的执行,跳出switch结构
例:输入一个表示星期的数字,显示对应的英文单词例:输入一个表示星期的数字,显示对应的英文单词 • #include<iostream.h> • void main(){ • int weekday; • cout<<“今天星期几?”; • cin>>weekday; • switch(weekday){ • case 0 : cout<<“Sunday”<<endl;break; • case 1 : cout<<“Monday”<<endl;break; • case 2 : cout<<“Tuesday”<<endl;break; • case 3 : cout<<“Wednesday”<<endl;break; • case 4 : cout<<“Thursday”<<endl;break; • case 5 : cout<<“Friday”<<endl;break; • case 6 : cout<<“Saturday”<<endl;break; • default: cout:<<“表示星期几的数须在0~6之间”<<endl;break;} • }
循环结构 • 先判断后执行: • for循环 • while循环 • 先执行后判断 • do……while循环
for循环 步长 • 格式:for(初始化;条件;参数调整) 循环体 • 功能: • 说明: • 括号内决定了循环次数 • 条件:逻辑表达式 • 初始化,参数调整:具有副作用的表达式,其中后者能影响条件 • 循环体:基本语句、复合语句、空语句 • 先判断后执行,若条件不成立,循环体一次也不执行
for循环用法说明 • for( ;条件;) ……等同于while(条件) • for(…;;…)……循环条件为空即为永真条件,循环体中必须有break • 循环体为空可用于延时操作 • for(int I=0;I<5;I++) cout<<I<<endl; • for(int I=0;I<5;I++) cout<<’*’<<endl; for(int I=0;I<2;I++) {for(int j=0;j<3;j++)cout<<I+j<<endl;}
例:输入10个数,计算并显示它们的和 • #include<iostream.h> • void main(){ • double x,s=0; • cout<<“请输入10个数:”; • for(int I=0;I<10;I++){cin>>x; • s+=x;} • cout<<“合计:”<<s; • } 变量 存和
连续输入5个*(横向\纵向\斜向) • for(int I=0;I<5;I++)cout<<’*’; • for(int I=0;I<5;I++)cout<<’*’<<endl; • for(int I=0;I<5;I++) • {cout<<endl; • for(int j=0;j<I;j++)cout<<’ ’; • cout<<’*’;} for(int I=0;I<6;I++){ cout<<endl;int j; for(j=0;j<5-I;j++)cout<<’ ’; for(j=0;j<I+I+1;j++)cout<<’*’;}
int i; • for(i=1;i<10;i++)cout<<setw(3)<<i; • cout<<endl<<”---+-------------------------”; • for(i=1;i<10;i++){ • cout<<endl<<setw(2)<<i<<’|’; • for(int j=1;j<10;j++)cout<<setw(3)<<i*j;}
while循环 • 格式:while(循环条件)循环体 • 功能: • 例: • int x=5; • while(x>0){ • cout<<’*’; • x-=1;}
例题 • int I,s; • for(I=s=0;I<12;I++)s+=I; • while(--I>5)s+=I; • cout<<s;
例:求数列 的所有大于等于0.000001的数据项之和并显示之 • 利用通项公式 int n=1; double s=0.0,a; a=(2*n-1)/pow(2,n); while (a>=0.000001) {s=s+a; n=n+1; a=(2*n-1)/pow(2,n);} cout<<”和s=”<<s;
例:求数列 的所有大于等于0.000001的数据项之和并显示之 • 递推公式 int n=1,d=2; double s=0.0,a; while(a=double(n)/d>=0.000001) {s+=a;n+=2;d*=2;} cout<<”和s=”<<s;
#include<iostream.h> • double powi(double x,int n) • {double a=1; • while(n--) a*=x; • return a;} • void main( ) • {cout<<powi(5.0,3);}
do……while循环 • 格式:do 循环体 while (循环条件); • 功能: • 例: • int x=5; • do {cout<<’*’; • x-=1;} • while(x>0);
循环结构的特殊控制 • break :强制退出循环,执行循环语句的下一个诗句 • continue:提前结束本轮循环体的执行 • 例题:3.16 (P77)
其它流程控制 • goto语句 • 格式: • 标号:语句 • …… • goto 标号; • C++中唯一可先使用后说明 • return语句 • 格式: return [表达式]; • 无返回值的函数,可用return结束运行,若执行完语句还没有return,函数停止运行并返回调用处 • 有返回值的函数,须用return 表达式结束函数的运行,并把表达式的值返回调用处。
小结 • 顺序结构、条件分支结构、循环结构,三种结构可相互衔接和嵌套,构成任意复杂程序。 • 条件分支结构及if嵌套 • 循环结构 • 其它:continue、break、goto、return
#include<iostream.h> • void main(){ • int n=10,y=1; • while(n--){y++;++y} • cout<<"y*y="<<y*y<<endl;
void main() • { int s1=0,s2=0; • for(int i=0;i<10;i++) • if(i%2)s1+=i; • else s2+=i; • cout<<s1<<' '<<s2;}