C++03第三章-基本控制结构_第1页
C++03第三章-基本控制结构_第2页
C++03第三章-基本控制结构_第3页
C++03第三章-基本控制结构_第4页
C++03第三章-基本控制结构_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章 根本控制结构

if语句

switch语句

while语句

do-while语句

for语句循环不变式§3.1程序的根本控制结构

3.1.1C++语言的简单语句单语句:以分号“;”结束inta; 变量定义语句a=3*2; 表达式语句function(“example”); 函数调用语句空语句:只有一个分号“;”复合语句(块语句)用花括号{}括起来的假设干条语句〔可以是单语句、空语句、其他块语句〕块语句在语法上等价于一个单语句,所以在单语句可用的地方我们也可以使用块语句。块语句中每一个语句都以分号“;”结束,块语句本身那么以右花括号“}”结束if〔a>b〕{

intt=a;

a=b;

b=t;

}3.1.1C++语言的简单语句单入口/单出口控制结构

实现单入口/单出口程序只需三种根本的控制结构顺序结构选择结构当条件p(条件表达式)成立,那么执行一个分支,否那么执行另一个分支多路分支循环结构实现反复执行某一局部的操作循环结构三要素:循环条件p循环体A循环变量:在每次循环中都必须有语句修改此变量的值,以使循环条件表达式的值可能改变,从而跳出循环pANY3.1.3结构化程序设计工具

程序框图结构化程序设计图形工具N_S图PAD图Jackson结构图Warnier图PDL〔ProgramDesignLanguage)§3.2选择结构

3.2.1if语句 if(条件表达式)子语句;if语句的有效范围是单个语句,如果子语句有多个语句,那么必须用{}括起来,成为一个复合语句 if(条件表达式) 子语句1;

else 子语句2;[例3.2.1]输入24小时制的时间,转换并输出12小时制的时间并注明是上午还是下午〔上午用A.M表示,下午用P.M表示〕#include<iostream.h>main(){ inthour; charnoon='A'; cout<<"Enterthehourplease:"; cin>>hour;

if(hour>12){ hour=hour-12; noon='P'; } cout<<"Thehouris"<<hour<<noon<<".M.\n";}*如果去掉花括号if(hour>12)hour=hour-12;noon='P';“noon=‘P’;”不是if的子语句,而是主流程if语句的下一个顺序语句程序2: 程序3:#include<iostream.h>voidmain(){

floatx;

cout<<"Enterthehourplease:";

cin>>x;

if(x>12){

cout<<"P.M:";

x=x-12;

}

else cout<<"A.M:";

cout<<x<<‘\n’;}(改进)#include<iostream.h>voidmain(){

floatx;

cout<<"Enterthehourplease:";cin>>x;

if〔x<=12〕cout<<"A.M:";

else{ cout<<"P.M:"; x=x-12;}

cout<<x<<‘\n’;}//注意书写层次结构[例3.2.2]一个具有输入合法性检测的程序,要求用户输入的工龄在0~47之间,如果超出此范围那么提示输入错误,否那么才接受用户输入。用户输入错误时,程序用转义字符输出一声响铃main(){ intstanding; //用户输入的工龄

floatstanding_salary;//根据用户输入工龄计算出来的工龄工资

cout<<"Yourstandinginthefactory:"; cin>>standing; if((standing>=0)&&(standing<=47)){ standing_salary=standing*1.5; cout<<"Inputaccepted.Yourstandingsalaryis" <<standing_salary<<"\n"; }else{ standing_salary=0; cout<<"Invalidinput.\x07\n"; }}嵌套if语句if(表达式1)

if(表达式2) 子语句1;

else 子语句2; else 子语句3;if(表达式1) 子语句1;

elseif(表达式2) 子语句2; …… elseif(表达式n) 子语句n; else 子语句n+1;[例3.2.3]从键盘上输入3个数A,B,C,求出三数中最大者并输出。#include<iostream.h>voidmain(){ intA,B,C,max; cout<<"EnterA,B,C,Please:"; cin>>A>>B>>C; max=A; if(B>max)max=B;//求出A、B中的较//大值,记录在max中,然后再比较C与max if(C>max)max=C; cout<<"MAX(A,B,C):"<<max<<‘\n’;}采用嵌套if语句来实现if(A>B){ if(A>C) cout<<"Maximumis"<<A;

else cout<<"Maximumis"<<C; }else{ if(B>C) cout<<"Maximumis"<<B;

else cout<<"Maximumis"<<C;}垂悬else问题if(p1)if(p2)a=1;elsea=2;这样的语句会引起二义性,else子句不知道应该与哪个if语句配对。C++语言中是就近配对:

if(p1){ 注意if与else的配

if(p2)a=1; 对关系,else总是

elsea=2; 与它上面的最近的

} if配对注意问题if语句中的表达式,一般为逻辑表达式或关系表达式else子句不能单独使用,必须与if配套使用if以及else语句后面都只含一个内嵌的操作语句,有效范围都只有一个语句,假设需含多个操作,那么须用{}括起来。例:if(a+b>c){ cout<<“a+b>c”; c=a+b; }elsecout<<“a+b<=c”;程序//程序:AVERAGE.CPP//功能:求数、理、化三科平均成绩的总评,演示if语句嵌套的缩进格式#include<iostream.h>voidmain(){ intmath,phys,chem; intaverage; floatscholarship; cout<<"Enterscoresofmath.,phys.,andchem.:"; cin>>math>>phys>>chem; average=(math+phys+chem)/3.0+0.5;//why? if(average>=90){ cout<<"Excellent.\n"; scholarship=120.00; }elseif(average>=80){ cout<<"Good.\n"; scholarship=85.00; 程序

}elseif(average>=70){ cout<<"Average.\n"; scholarship=55.00;

}elseif(average>=60){ cout<<"Pass.\n"; scholarship=45.50; }else{ cout<<"Fail.\n"; scholarship=0.00; } cout<<"Yourscholarshipis<<scholarship<<".\n";}条件表达式短路求值if〔〔members!=0)&&(income/members>800.00))…=>if〔members!=0){if(income/members>800.00))…}expression1&&expression2//expression1为0,expression2不做expression1||expression2//expression1非0,expression2不做3.2.2switch语句

多分支选择语句

switch语句的一般形式如下:

switch(表达式){ case常量表达式1: 语句序列1; break; case常量表达式2: 语句序列2; break; … case常量表达式n: 语句序列n; break; default: 语句序列n+1; break; }说明表达式可为任何类型。Switch在入口时判断表达式与哪个常量表达式匹配。假设表达式的值与某个case后面的常量相等,那么执行与该case后面相应的语句;假设与所有列出的常量都不相等,那么执行default后面的语句。case后只能是常量表达式,不能是变量表达式,其值只能是整型、字符型、枚举型,不能是其他类型。每个常量表达式的值都不相同。case局部与default局部出现次序不影响执行结果。每局部不限单个语句,可写多个语句,不用加{}。break;语句用于执行完一个分支后跳出此switch语句例3.2.6#include<iostream.h>

main(){ intchoice; //用户输入的选择

cout<<"1.Apple\n";//给出选择菜单

cout<<"2.Pear\n"; cout<<"3.Banana\n"; cout<<"4.Orange\n"; cout<<"Enteryourchoice(1-4):"; cin>>choice; //用户输入选择

switch(choice){ //对用户的选择分别作处理

case1: cout<<"Yourchoiceisapple.\n";

case2: cout<<"Yourchoiceispear.\n";

case3: cout<<"Yourchoiceisbanana.\n";

case4: cout<<"Yourchoiceisorange.\n";

default:cout<<"Youdidnotmakeachoice.\n";

}}break;

break;

break;

break;

break;例3.2.7//程序:ORDERS.CPP//功能:旅行社订票折扣率计算#include<iostream.h>voidmain(){intorders,fragment;floatdiscount;cout<<"Inputticketordersplease:";cin>>orders;fragment=orders/10;switch(fragment){case0:discount=0.10;break;case1:discount=0.15;break;case2:discount=0.30;break;default:discount=0.45;break;}cout<<"Thediscountis"<<discount*100<<"%.\n";}§3.3循环结构

3.3.1while语句while(循环条件表达式)循环体语句;当表达式的值为T(非零)时,循环条件成立,执行循环体语句。while语句的作用范围只到while后第一个分号〔单语句〕。假设循环体有多个语句那么需用{}括起来。在循环体中应有使循环趋向于结束的语句循环变量初始化需在while语句前完成例:给定一个正整数n,求出平方值不超过n的最大正整数并输出。

程序流程图如右:源程序:#include<iostream.h>

main(){ intn; //用户给定的正整数

intmax; //所求的最大整数

cout<<"Enteranumber:"; //用户给定一个自然数

cin>>n; //判断用户输入是否合法

if(n<=0)cout<<"Inputerror!\n"; else{//利用循环求出平方大于n的最小整数

max=1;

while(max*max<=n) max=max+1; //输出结果

cout<<"Themaximumintegeris:"<<max-1<<"\n"; }}例#include<iostream.h>Voidmain(){ intchoice=1; //用户输入的选择

while(choice!=0){ cout<<"1.Apple\n";//给出选择菜单

cout<<"2.Pear\n"; cout<<"3.Banana\n"; cout<<"4.Orange\n"; cout<<"0.Exit\n";cout<<"Enteryourchoice(0-4):"; cin>>choice; //用户输入选择

switch(choice){ //对用户的选择分别作处理

case0:break; case1: cout<<"Yourchoiceisapple.\n";break; case2: cout<<"Yourchoiceispear.\n";break; case3: cout<<"Yourchoiceisbanana.\n";break; case4: cout<<"Yourchoiceisorange.\n";break; default: cout<<"Yourchoiceisinvalid.\n";break; } } cout<<"Thankyouforyourchoice.\n";}3.3.2do-while语句do 循环体语句;while(循环条件表达式p);先执行一次循环体语句,然后判别表达式,当为T时,返回执行循环体语句,直到表达式为F,结束循环while语句和do-while语句根本等价,只有当表达式一开始就为假时,两种语句结果不一样i=20;sum=0; i=20;sum=0;while(i<=10){ do{ sum+=i; sum+=i; i++; i++;} }while(i<=10);结果sum=0 结果sum=203.3.2do-while语句//程序:SQRT.CPP//功能:利用牛顿法求一个正数的平方根#include<iostream.h>voidmain(){ constfloatEPS=1e-5; floatnum,root,pre; cout<<"Enteranumber:"; cin>>num; if(num<0)cout<<"Inputeroor!\n"; else{ root=1; do{ pre=root; root=(num/root+root)/2; }while((pre-root>EPS)||(root-pre>EPS)); cout<<"Therootof"<<num<<"is"<<root<<endl; }}3.3.3for语句for(表达式1;表达式2;表达式3) 循环体语句;执行过程:求解表达式1求解表达式2,

假设其值为T,执行循环体语句,跳到第3)步;

假设为F,结束循环,跳到第4)步求解表达式3,然后跳到第2)步循环结束,执行for语句的下一条语句适用于循环次数的循环表达式1:循环变量赋初值表达式2:循环条件表达式3:循环变量增量〔计数表达式〕for语句中的三个表达式中任一个或全部均可省略,但分号必须保存sum=0;

for(i=1;i<=100;i++)

sum+=i;sum=0;

i=1;

for(;i<=100;i++)

sum+=i;sum=0;

for(i=1;;i++){

if(i>100)break;

sum+=i;

}sum=0;

for(i=1;i<=100;){

sum+=i;

i++;

}sum=0;i=1;

for(;i<=100;)

{ sum+=i;

i++;

}sum=0;

i=1;

for(;;)

{ if(i>100)break;

sum+=i;

i++;

}for(sum=0,i=1;i<=100;i++)

sum+=i;

while(i<=100)

while(1)程序//程序:ALPHABET.CPP//功能:正反向打印字母表。#include<iostream.h>voidmain(){charch;for(ch='A';ch<='Z';ch++)cout<<ch;cout<<endl;for(ch='Z';ch>='A';ch--)cout<<ch;cout<<endl;}程序//程序:TEMPTAB.CPP//功能:打印摄氏温度与华氏温度对照表#include<iostream.h>voidmain(){ constintmax=10; constintmin=-5; intcel; floatfah; //输出对照表栏目

cout<<"Celsius"<<"\x09"<<"Fahrenheit"<<endl; for(cel=max;cel>=min;cel--){ fah=cel*1.8+32; cout<<cel<<"\x09"<<fah<<endl; }}3.3.4循环的嵌套三种循环可以相互替代一个循环体内又包含另一个完整的循环结构--循环的嵌套各种循环可以相互嵌套3.3.4循环的嵌套//程序:MULTITAB.CPP//功能:打印乘法口诀表#include<iostream.h>voidmain(){ inti,j; for(i=1;i<=9;i++){ for(j=1;j<=i;j++) cout<<i<<'*'<<j<<'='<<i*j<<''; cout<<endl; }}程序3.3.6公鸡5元1只,母鸡3元1只,小鸡1元3只,花了100元钱买100只鸡,问公鸡、母鸡、小鸡各多少只?cock公鸡的个数;hen母鸡的个数;chicken小鸡的个数;得方程:

cock+hen+chicken=100 5*cock+3*hen+chicken/3=100#include<iostream.h>voidmain(){ intcock,hen,chicken; for(cock=0;cock<=100/5;cock++) for(hen=0;hen<=100/3;hen++){ chicken=100-cock-hen; if((chicken%3==0)&& ((5*cock+3*hen+chicken/3)==100)) cout<<“cock=”<<cock<< “\then=”<<hen<< “\tchicken=”<<chicken<<endl; }}运行结果:cock=0hen=25chicken=75cock=4hen=18chicken=78cock=8hen=11chicken=81cock=12hen=4chicken=8420333.3.5设计正确的循环循环不变式一个或者多个表达式用于保证循环的正确性在循环前成立

在每次执行循环体后仍成立

在循环结束后也成立3.4转向语句转向语句一般形式功能描述例子

break语句

break;1.用于switch语句,使流程跳出switch结构,继续执行下一个语句2.用于循环语句(while,do-while,for)3.除此之外,不能用于其他任何语句

for(…){…

if(…)break;…}a=1;continue语句

continue;结束本次循环,即跳过循环体中下面尚未执行的语句,而接着进行下一次循环的判断。

for(…){…

if(…)continue;…}a=1;return语句

return表达式;结束被调用函数,转向主调函数原处的下一条语句,将表达式结果送回主调函数[例3.4.1](break的用法)

键盘输入m和n〔10<m<n≤32000〕,求出m~n间所有素数且按每行8个数形式输出#include<iomanip.h>#include<iostream.h>#include<math.h>voidmain(){ intm,n,x,k,i,j; j=0; //j计算输出个数 do{ cout<<"\nEnterm,n〔10<m<n<320000〕:"; cin>>m>>n; }while((m<=10)||(m>=n)||(n>=32000)); cout<<"\n*******************\n";

for(x=m;x<=n;x++){//对m~n的数判别 k=sqrt(x); for(i=2;i<=k;i++) if(x%i==0)break;//余下不必再做 if(i>=k+1){//不是用break跳出的,找到一个素数 if(j%8==0)cout<<endl;//每行8个数 cout<<setw(8)<<x; j=j+1; }//以每行8个数的形式输出,每个数占8个字符的位置 } cout<<"\n**********************\n";}

[例3.4.2](continue的用法)

在键盘上输入假设干个正数,累加求和,最后输出累加和以及平均值。问题分析:事先不知道要输入多少个数,但知道输入数是正数,我们可边输入边统计其个数,假设发现输入的是0或负数时,输入结束。当输入数是大于0时那么累加并累计数的个数。源程序如下:#include<iostream.h>voidmain(){ doublesum,num;intn; sum=0.0;n=0;num=1.0;//设置初值

while(num>0){ cout<<"\nEnternum(Nega

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论