C 程序设计教程2_第1页
C 程序设计教程2_第2页
C 程序设计教程2_第3页
C 程序设计教程2_第4页
C 程序设计教程2_第5页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

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

文档简介

C++程序设计教程(第二版)第二章

基本编程语句

Chapter2

BasicProgrammingStatements计算机与信息工程学院

徐素锦4/18/20231第二章基本编程语句说明语句(DeclarativeStatements)条件语句(ConditionStatements)循环语句(LoopStatements)循环设计(LoopDesigns)输入输出语句(Input/OutputStatements)转移语句(MoveStatements)再做循环设计(MoreLoopDesigns)4/18/202322.1说明语句(DeclarativeStatements)编程是要完成计算的,要计算就会有数据(整数、小数、字符串或更复杂的数据)的进出,这个过程中需要把数据保存到某个存储空间中,因此要对存储空间进行说明。C++用名称来代表存储空间。两类名称:变量/常量:由C++内部数据类型定义;对象/常对象:由外部(自定义)数据类型定义。4/18/20233要使用名称来存放数据,必须先说明名称说明语句分为定义语句和声明语句:定义语句:在说明名称的同时,还给名称分配了存储空间声明语句:只是说明了名称,并没有给名称分配存储空间,还必须通过定义语句分配空间。(在复杂的程序结构中为了说明一个名称可以在各处共享,而又要避免多处定义造成的空间冲突)4/18/20234定义变量的目的:创建一个所需大小的实体空间给变量名;说明变量的表示范围;说明变量可以进行的运算等。变量定义

4/18/20235变量定义

变量由变量名、数据类型和值三部分组成,是可寻址的,也就是说,能够通过内存地址读写变量的数值。因此,对于每个变量来说,都有两个值与其相关联:(1)变量的数值;(2)变量的地址。…………1243078124307912430801243081124308212430831243084124308512430861243087124308812430891243090内存空间内存地址存储单元(1Byte)例:inta=12;12变量a的地址变量a的数值4/18/20236变量定义格式:例如:

inta;doubled=3.5;staticinta2=12;注意:变量必须先定义后使用!变量的定义会引起内存的分配,因此每个变量只能被定义一次,多次定义将导致编译错误。[<存储类型>]<数据类型><变量名>[=<初始值>];4/18/20237变量名的命名规则

①由数字、字母和下划线组成;②必须以字母或下划线开头;③对字母大小写敏感(即区分大小写字母);④C++的关键字不能用作变量名;⑤在同一作用域内是唯一的。例如,下面的变量定义将导致编译错误:char89_name;//变量名不能以数字开头boolis-loan;//中划线不能出现在变量名中,

//字符间的连接应该采用下划线intclass;//class是关键字,不能用做变量名4/18/20238变量的初始化

C++支持下面4种形式的变量初始化:(1)显式赋值,在定义变量时,通过赋值运算符“=”为变量提供初始值。例如:

intbuffer=1024;//变量buffer被初始化为1024(2)隐式赋值,在定义变量时,通过括号“(

)”提供初始值。例如:

intbuffer(1024);//变量buffer被初始化为1024(3)每一种内嵌的数据类型都支持一个构造函数,能够将变量初始化为0。例如:

intbuffer=int();//变量buffer被初始化为0(4)类对象是通过构造函数来提供初始化的。4/18/20239格式:

变量=表达式;

说明:

①”=”是赋值运算符;

②赋值运算符左边只能是变量,不能为常量或函数调用;

③赋值运算符右边的表达式可以是常量、变量、函数调用或者它们的组合。

例:f_Val=3;

x=x+1;

k=i*j;

a2=a1+area(35.6)+2.1;

变量的赋值4/18/202310例:求球体表面积-

f0201.cpp,#include<iostream>usingnamespacestd;intmain(){

doubleradius;//变量定义,没有初始化

cout<<“Pleaseinputradius:“;

cin>>radius;

doubleresult=radius*radius*3.14*4;

cout<<“Theresultis“<<result<<“\n“;}4/18/202311函数(过程)说明:函数:把相关的程序语句放在一起,完成特定的功能,并给这些语句起一个名字。求解中需要通过函数调用来实施求解时,便要对函数的性质进行说明,说明其返回类型,参数类型,参数个数。4/18/202312

函数说明分函数声明和函数定义两种:

函数声明是说明函数的名字,函数的返回类型,以及函数的参数和参数个数.

格式:

<返回类型><函数名>(<参数表>);

例如:

doublearea(doublera);

intadd(inta,intb);

stringcatch(string,char);4/18/202313

函数定义是在函数声明的基础上,对整个实现过程进行详细定义.

格式:

<返回类型><函数名>(<参数表>)

{

<若干条语句>

return函数的返回值;

}

例如:

doublearea(double

ra){

doubles=ra*ra*3.14;

returns;

}4/18/202314函数调用:就是使用函数名字;以便完成相应的功能。使用名字前必须清楚名字的性质,所以必须先对函数进行声明,后调用!运行程序时,会涉及到被调用函数的执行,所以凡是被调用的函数都必须有函数定义,不管该定义在程序的什么位置.4/18/202315例如:

#include<iostream>

usingnamespacestd;

doublesphere();//声明

intmain(){

doubleresult=sphere();//调用

cout<<“area:“<<result<<“\n”;

}

doublesphere(){//定义

cout<<“Pleaseinputradius:“;

doubler;cin>>r;

returnr*r*3.14;

}4/18/2023162.2

条件语句(ConditionStatements

)一、if语句的两种形态:

if(条件表达式)

语句;例:

if(a>b)

cout<<a<<endl;条件语句否是4/18/202317②

if(条件表达式)

语句1;

else

语句2;例:if(a>=b)

cout<<a<<endl;else

cout<<b<<endl;条件语句1否是语句24/18/202318说明:1.括号必须要。2.If条件后面的语句若不止一条,要用花括号包成语句块。3.一个变量,一个定义语句或赋值语句都可以作为if语句的条件4.当条件表达式的值为0时表示假,非0时表示真例如:if(s)cout<<“hello”;if(inta=b)

cout<<a<<endl;a=a+6;//error4/18/202319若分支“语句”之一是if语句,就是if语句嵌套。例如,输入两个整数,比较两个数的大小。

#include<iostream>usingnamespacestd;

intmain(){

int

x,y;

cout<<"Enterxandy:";

cin>>x>>y; if(x!=y) if(x>y)

cout<<"x>y"<<endl; else

cout<<"x<y"<<endl; else

cout<<"x=y"<<endl; }二.if语句的嵌套4/18/202320注意:if嵌套中的二义性问题例:intx=-20;if(x>=0) if(x<50)

cout<<“ok\n”;else

cout<<“notok\n”;

解释一:intx=-20;if(x>=0){ if(x<50)

cout<<“ok\n”;else

cout<<“notok\n”;}解释二:intx=-20;if(x>=0){ if(x<50)

cout<<“ok\n”;}else

cout<<“notok\n”;4/18/202321if…else语句成对的规则是:“就近原则”;C++规定:else总是和离它最近的还没有配对的可见的if匹配。

4/18/202322例:

if(条件1)

if(条件2)

{ if(条件3) 语句1;

}

else

语句2;

注:else会和第2个if匹配,第3个if对else不可见。4/18/202323条件运算符:

?:

条件表达式:

表达式1?表达式2:表达式3

运算规则:如果表达式1为“真”,整个表达式的值取表达式2的值,否则取表达式3的值。相当于:三.条件表达式if(表达式1)

表达式2;else

表达式3;4/18/202324例:①if(x>0&&x<50)cout<<“ok\n”;elsecout<<“notok\n”;可以表示为:(x>0&&x<50)?cout<<“OK\n”:cout<<“NotOk\n”;或者:cout<<(x>0&&x<50?“ok\n”:“notok\n”);cout<<(x>0&&x<50?“”:“not”)<<“ok\n”;

//必须有括号!4/18/202325②对于

if(x) a=327981; else b=327981;

可表示为:

x?a=327981:b=327981;

如果a和b为同类型,则还可以:

(x?a:b)=327981;//作左值,括号不能省

y=(x?a:b);//此处的圆括号可以去掉

y=x?a:b;4/18/202326intx,a,b;x=a=b=1;x?a:b=2;cout<<“a=”<<a<<endl<<“b=”<<b<<endl;③下面两个程序块分别输出什么结果?intx,a,b;x=a=b=1;(x?a:b)=2;cout<<“a=”<<a<<endl<<“b=”<<b<<endl;if(x)a;elseb=2;if(x)a=2;elseb=2;结果:a=1b=1结果:a=2b=14/18/202327一般形式:

switch(表达式){case常量表达式1:语句1;break;case常量表达式2:语句2;break;//… case常量表达式n:语句n;break; default:语句n+1;

}四、switch语句(多分支选择语句)4/18/202328例如:根据成绩等级输出百分制分数段。char

grade;cin>>grade;switch(grade)

{case’A’:cout<<“90~100\n”;break;

case’B’:cout<<“80~89\n”;break;

case’C’:cout<<“70~79\n”;break;

case’D’:cout<<“60~69\n";break;

case’E’:cout<<“0~60\n”;break;

default:cout<<“error!\n”;

}4/18/202329说明:1.switch括号中的表达式只能是整型、字符型或枚举型;且case后面的常量表达式的类型必须与其匹配eg:floatf=1.6;

switch(f){……}

//error:f是浮点型2.case值是语句标号,每个case常量表达式的值必须互不相同3.break的作用是跳出switch语句,4.在每个分支都带有break的情况下,case的次序不影响执行结果4/18/2023305.多个case可以共用一组执行语句例如:

case’A’:case’B’:case’C’:case’D’:cout<<“>60\n";break;

但是不能将值用逗号隔开,即

case‘A’,’B’,’C’,’D’:cout<<“>60\n”;break;6.default语句是可选的7.switch语句可以嵌套使用,“就近原则”4/18/202331

switch(整数表达式){casevalue1:

语句1;break;casevalue2:

语句2;break;…default:

语句n;}等价于:

if(整数表达式==value1)

语句1;elseif(整数表达式==value2)

语句2;…else

语句n;}switch语句和if语句相互弥补:注意:若测试一个整形变量取几个不同的值,用switch语句比较好;如果是范围测试或是实型数的比较判断,用if语句比较好4/18/202332一、for循环语句一般形式:

for(表达式1;表达式2;表达式3){若干语句;}

可理解为:

for(循环变量赋初值;循环条件;循环变量修正)

{

若干语句;

}循环前先求解每次执行完循环体后求解非0时执行循环体2.3循环语句(LoopStatements

)4/18/202333条件判断循环体语句假真状态修正循环初始状态结束开始例1:for(inti=1;i<=10;i++)

cout<<”hello.\n”;循环初始状态条件判断状态修正循环体语句4/18/202334i<=10Cout<<“hello.\n”假真i++;i=1;结束开始例1:for(inti=1;i<=10;i++)

cout<<”hello.\n”;循环初始状态条件判断状态修正循环体语句4/18/202335例1:for(inti=1;i<=10;i++)

cout<<”hello.\n”;循环初始状态条件判断状态修正循环体语句例2:

intsum=0;

for(inti=1;i<=100;i++){sum=sum+i;}

cout<<sum<<endl;i<=10Cout<<“hello.\n”假真i++;i=1;结束开始4/18/202336例1:for(inti=1;i<=10;i++)

cout<<”hello.\n”;循环初始状态条件判断状态修正循环体语句例2:

intsum=0;

for(inti=1;i<=100;i++){sum=sum+i;}

cout<<sum<<endl;i<=100sum+=i;假真i++;i=1;sum=0;cout<<sum<<endl;4/18/202337对于for(表达式1;表达式2;表达式3)语句

说明:(1)表达式1可以省略。此时应在for语句之前给循环变量赋初值。若省略表达式1,其后的分号不能省略。例如,求和运算:

intsum=0,i=1; for(;

i<101;i++)//分号不能省略

sum+=i;

//赋值缩写4/18/202338(2)表达式2可以省略。这时候,需要在循环体中有跳出循环的控制语句。 例如,求和运算:

for(i=1;;i++){//分号不能省略

sum+=i; if(i>=100)break; }

等价于:

for(i=1;1;i++){ sum+=i; if(i>=100)break;

}//此处break表示退出循环。4/18/202339(3)表达式3可以省略。但此时程序员应另外让循环变量递进变化,以保证循环能正常结束。

例如,求和运算:

intsum=0,i; for(i=1;i<101;){//分号不能省略

sum+=i;

i++; }sum+=i++;4/18/202340(4)表达式1和表达式3都可以省略。

例如,求和运算:

intsum=0,i=1; for(;i<=100;)//分号不能省略

sum+=i++;(5)三个表达式都可以省略。

例如,求和运算:

intsum=0,i=1; for(;;

){//分号不能省略

sum+=i++; if(i>=100)break; }4/18/202341(6)在表达式1中定义的循环变量只在for语句中有效;循环体可以为空。例如,求和运算:for(inti=1,sum=0;i<101;sum+=i++);//i在for语句之后就不能再使用//循环体是空语句,分号不能省略4/18/202342二、while循环语句因为并不是所有循环都有明显的循环初始状态和状态修正的,所以,while循环是for循环的一种简洁形式.

如,同样的求和:intsum=0,i=1;while(i<=100)sum+=i++;cout<<sum<<endl;intsum=0,i=1;for(;i<=100;) sum+=i++;

cout<<sum<<endl;4/18/202343一般形式:while(表达式){循环体语句}

说明:

①先判断条件再执行;

②while后面的圆括号和圆括号中的表达式都必须有。表达式也可以是常量或常量表达式。 例:while(5){…//中间需要有跳出循环的控制语句

}

③循环体语句可以是复合语句,其中必须含有改变条件表达式值的语句。4/18/202344表达式循环体语句(包含状态修正)假真初始状态结束开始while(

表达式

){

循环体语句;//包含状态修正}注意:循环体被执行0次或n次4/18/202345例:求1加到100的和。#include<iotream.h>usingnamespacestd;voidmain(){

inti=1;//循环变量初始化

intsum=0

;while(i<=100

)//循环继续条件

{//循环体

sum=sum+i; ++i;//改变循环变量

}

cout<<"sum="<<sum<<endl;}4/18/202346一般形式:do{

循环体}while(条件表达式);其中必须含有改变条件表达式值的语句。执行顺序①先执行循环体语句;

②后判断条件,表达式为

true

时,继续执行循环体。注意:该语句后面的分号必须要有!三、do…while语句4/18/202347do{

循环体语句;//包含状态修正}while(

表达式

);表达式循环体语句(包含状态修正)假真初始状态结束开始注意:循环体被执行1次或n次4/18/202348while语句:先判断再执行表达式循环体语句(包含状态修正)假真初始状态结束开始表达式循环体语句(包含状态修正)假真初始状态结束开始dowhile语句:先执行再判断4/18/202349while语句条件判断循环体语句(包含状态修正)假真初始状态结束开始条件判断循环体语句(包含状态修正)假真初始状态结束开始dowhile语句条件判断循环体假真状态修正循环初始状态结束开始for语句4/18/2023502.4循环设计

(LoopDesigns

)(1)简单字符图形的双重循环

MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM4/18/202351分析方法:(1)该图形一共10行,每一行增加一个字符,所以,应循环10次,每次输出一行,其循环模式为:

for(inti=1;i<=10;++i){

输出第i行

换行

}(2)行数、M的个数和循环变量i的关系行iM个数

111输出第i行:

222for(intj=1;j<=i;j++)333cout<<“M”;444...1010

104/18/202352//f0204.cpp#include<iostream>usingnamespacestd;intmain(){

for(inti=1;i<=10;++i){

for(intj=1;j<=i;++j)cout<<"M";cout<<endl;

}}4/18/202353小节:

通过双循环输出简单字符图形的模式外循环:控制输出的行数

for(inti=1;i<=N;i++){

输出第i行;换行;

}内循环:控制每一行里具体字符的输出

for(intj=1;j<=第i行的长度;j++){

…//逐字符输出

}4/18/202354ASCII码表码值字符码值字符码值字符码值字符0~32控制字符或通讯专用字符(不可见)34“46.92\0NUL(空值)35#47/93]1SOH(文头)36$48~57‘0’~’9’94^4EOT(文尾)37%58:95_6ACK(确认)38&59;96`7BEL(响铃)39‘60<97~122‘a’~’z’8BS(退格)40(61=123{10LF(换行)41)62>124|12FF(换页)42*63?125}13CR(回车)43+64@126~32SP(空格)44,65~90‘A’~’Z’127DEL33!45-91[4/18/202355(2)

素数判定素数(也叫质数)定义1:除了1和它本身外没有其他因子的自然数。定义2:只能被1和它本身整除的自然数。#include<iostream>usingnamespacestd;intmain(){cout<<"pleaseinputanumber:\n";intm;cin>>m;for(inti=2;i<m;++i)if(m%i==0){cout<<m<<"isn'taprime.\n";return1;}cout<<m<<"isaprime.\n";}4/18/202356(利用数学定律进行优化)假设m不是素数,则必有m=i×j

假定i≤j,则i2≤i×j=m≤j2

即i2≤m≤j2

即i≤√m≤j所以,m必定有一个不大于m平方根的因子,故判断m是否为素数,只要测试到m的平方根就可以了!

4/18/202357#include<iostream>#include<cmath>

//包含sqrt()usingnamespacestd;intmain(){

cout<<"pleaseinputanumber:\n";

intm;

cin>>m;doublesqrtm=sqrt(m*1.0);

//求平方根

for(inti=2;i<=sqrtm;++i)

if(m%i==0){

cout<<m<<"isn'taprime.\n";return1;}

cout<<m<<"isaprime.\n";}4/18/202358可以定义一个判断m是否为素数的函数:bool

isPrime(int

m){doublesqm=sqrt(m*1.0);

for(inti=2;i<=sqm;++i)

if(m%i==0)returnfalse;returntrue;}4/18/202359一、标准I/O流I/O控制流:输入或输出的字节序列(字符序列),在头文件iostream.h中定义。操作符:<<

向输出流“cout”中插入字符

cout:C++预定义的标准输出设备

>>

从输入流"cin"中抽取字符

cin

:C++预定义的标准输入设备

作用:<<:用操作符"<<"右边的内容输出到标准输出设备上

>>

:用从标准输入设备上所接收到的数据去更新操作符">>"右边的对象2.5输入输出语句

(Input/OutputStatements

)

4/18/202360cout<<"HernameisJone\n";cout<<"theidis";cout<<2;cout<<endl;cout<<"HernameisJone\n"<<"theidis"<<2<<endl;inti;floatf;longL;cin>>i>>f>>L;1

2.168

314159例:4/18/202361二、流状态通过流状态控制输出格式cout<<showpos<<12;//+12cout<<hex<<18<<”“<<showbase<<18;

//120x12cout<<hex<<255<<”“<<uppercase<<255;

//ffFFcout<<123.0<<”“<<showpoint<<123.0;

//123123.000cout<<(2>3)<<”“<<boolalpha<<(2>3);

//0falsecout<<fixed<<12345.678;//12345.678000cout<<scientific<<123456.678;

//1.234567e+054/18/202362取消流状态的操作为:

noshowpos,noshowbase,nouppercase,

noshowpoint,noboolalphafixed,scientific,和一般显示方式三者相互独立,取消的方法是:

cout.unsetf(ios::fixed);cout.unsetf(ios::scientific);dec,oct,hex相互独立;left,right相互独立;4/18/202363带参数的流状态:cout.width(int);//设置显示宽度cout.fill(char);//设置填充字符cout.precision(int);//设置有效位数或精度注意:width(n)为一次性操作,即第二次显示时将不再有效。默认width(0),表示仅显示数值。例如:cout.width(5);cout.fill(‘S’);cout<<23<<23;//输出:SSS23234/18/202364在头文件iomanip.h中定义了许多用于控制I/O流格式的控制符(对象)。可以直接将控制符插入流中。即:在头文件iomanip.h的支持下,还可以直接由<<操作。例:#include<iomanip>cout<<setw(6)<<setfill(‘$’)<<27<<27<<endl;//输出:$$$$27274/18/202365

I/O流的常用控制符

控制符

描述

dec

设基数为10hex设基数为16

oct

设基数为8

setfill(c)设填充字符为c

setprecision(n)设显示小数精度为n位

setw(n)设域宽为n个字符

setiosflags(ios::fixed)固定的浮点显示

setiosflags(ios::scientific)指数表示

setiosflags(ios::left)左对齐

setiosflags(ios::right)右对齐

setiosflags(ios::skipws)忽略前导空白

setiosflags(ios::uppercase)16进制数大写输出4/18/202366例如;倒三角形字符图形(P41)的输出:方法1:#include<iostream.h>#include<iomanip.h>voidmain(){

for(intn=1;n<=10;n++)cout<<setfill('')<<setw(n)<<''<<setfill('M')<<setw(21-2*n)<<'M'<<endl;

}方法2:#include<iostream.h>voidmain(){for(intn=1;n<=10;n++)

cout<<string(n,‘’)+string(21-2*n,‘M’)+”\n”;}4/18/202367三、文件流的操作

文件流的输入/出操作与标准输入/出基本相同,只是需要以一定方式打开和关闭。文件打开的格式:

ifstreamfin(filename1,openmode=ios::in);

ofstream

fout(filename2,openmode=ios::out);注意:ifstream和ofstream是输入/输出文件流类,在fstream头文件中声明,使用时加#include<fstream>fin和fout是自定义的文件流名称,分别对应文件filename1和filename2

4/18/202368例f0211:#include<fstream>usingnamespacestd;intmain(){

ifstreammyin("a.txt");ofstreammyout("b.txt");for(stringstr;getline(myin,str);)myout<<str<<endl;}注意:当省略文件路径时,数据文件和程序应该保存在同一个目录下!4/18/202369输入/输出语句能返回操作状态(true/false)

,所以判断状态就可以确定文件是否正常读入,如getline(myIn,str)当读到文件尾或文件状态异常时,便返回false,以使循环结束。if(cin>>a)

cout<<a;cin>>a;if(cin)

cout<<a;cin>>acout<<a;否是cincout<<a;否是cin>>a;4/18/202370if(getline(myIn,str))

cout<<str;Flag=getline(myIn,str);if(Flag)

cout<<str;getline(myIn,str)cout<<str;否是Flagcout<<str;否是Flag=getline(myIn,str);4/18/202371for(stringstr

;

getline(myIn,str)

;)myOut<<str<<endl;getline(myIn,str)myOut<<str<<endl;假真(空)stringstr;结束开始条件判断循环体假真状态修正循环初始状态结束开始FlagmyOut<<str<<endl;假真stringstr;结束开始Flag=getline(myIn,str);4/18/202372例如:#include<iostream>usingnamespacestd;intmain(){for(inta;cin>>a;){cout<<a<<"";}}注意:在循环读入数据时,常常将读入操作放在循环的条件判断上!4/18/202373#include<fstream>intmain(){ifstreammyIn("a.txt");ofstreammyOut("b.txt");for(stringstr;getline(myIn,str);)myOut<<str<<endl;ifstreammyIn2("c.mp3",ios::in|ios::binary);ofstreammyOut2("d.mp3",ios::out|ios::binary);for(stringstr;getline(myIn2,str);)myOut2<<str<<endl;ifstreammyIn3("d:\\doc\\e.wmv",ios::binary);ofstreammyOut3("d:\\doc\\f.wmv",ios::binary);for(stringstr;getline(myIn3,str);)myOut3<<str<<endl;}4/18/202374例f0212:用筛法判断素数#include<iostream.h>#include<vector.h>#include<fstream.h>intmain(){vector<int>prime(10000,1);

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

if(prime[i])

for(intj=i;i*j<10000;j++)

prime[i*j]=0;

ifstream

in(“a.txt”);

for(inta;in>>a&&a>1&&a<10000;)

cout<<a<<“is“<<(prime[a]?””:”not”)<<“aprime.\n”;}把1~10000之间2~99的所有倍数全部筛掉in&&a>1

&&a<10000cout<<…;假真inta;in>>a;4/18/2023751.break语句 只用于switch、for、while、do-while等语句中。作用: ①中止switch语句的执行,并跳出switch语句 ②从最近的封闭循环体中跳出,结束当前循环。转而执行该循环之后的语句 2.6转移语句(MoveStatements

)

4/18/202376i<5假真i++;i=1;结束开始j<5cout<<…;假真++j;j=1;i*j>=5break;假真cout<<endl;#include<iostream.h>intmain(){

inti,j;

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

for(j=1;j<5;++j){

if(i*j>=5) break;

cout<<i<<“*”<<j<<“”;

}

cout<<endl;//break跳到此处

}}例:输出相乘之积小于5的两个正整数的所有组合。1*11*21*31*42*12*23*14*14/18/2023772.continue语句用于循环语句中,结束本次循环,(即跳过循环体中尚未执行的语句),接着进行下一次是否执行循环的判定;注意:并不从循环体中跳出,除非已处于循环结束点例:for(;;){

for(;;){ //…

if(i==1) continue; //…

} a=1;}条件判断假真状态修正循环初始状态i==1……a=1;假真continue;4/18/202378例:把100~200之间不能被3整除的整数输出

for(intn=100;n<=200;n++){

if(n%3==0)continue;

cout<<n<<endl;}n<=200假真n++;n=100;n%3==0cout<<…;假真结束开始continue;100101103104106…4/18/202379continue与break的区别:

for(表达式1;表达式2;表达式3){

循环体语句;}4/18/2023803.goto

语句一般形式:goto

语句标号;作用:将程序控制转移到标号所标志的语句处.语句标号:标志符,命名规则与变量的命名规则相同;例:求1到100的和#include<iostream.h>voidmain(){

inti=1,sum=0;

loop: sum+=i; ++i;

if(i<101)

gotoloop;

cout<<"sum="<<sum;}4/18/202381#include<iostream.h>intmain(){

inta;

gotoInit;Forward:a=a+1;Print:

cout<<a<<endl;

gotoDown;Init:a=1;

gotoPrint;Down:if(a<100)

gotoForward;}#include<iostream.h>intmain(){

for(inta=1;a<101;a++)

cout<<a<<endl;}结果:1234…4/18/202382应该禁用goto语句(不符合结构化原则)C++中唯一比较适合使用goto的地方:当从多重循环深处跳到循环之外时,如果用break语句,将要用多次,这时候用goto就比较简单。

例:for(inti=1;i<100;i++){

for(intj=1;j<100;++j){

if(i*j==651)gotoEnd;//…}}End://…4/18/2023832.7再做循环设计(MoreLoopDesigns

)

一、逻辑判断类问题对于逻辑判断的问题,一般都要考虑全部的可能性,然后从这些可能性中按条件逐一排查,直到最后获得某个结论。两种模式:

①列出全部的可能性,去掉那些不满足要求的情况。

②列出全部的可能性,从中选择满足要求的情况。4/18/202384①列出全部的可能性,去掉那些不满足要求的情况。语句控制结构:

for(所有可能情况){//可为多重循环

if(条件1不满足)continue;

if(条件2不满足)continue;//…

if(条件n不满足)continue;

输出所要的结果

}4/18/202385②列出全部的可能性,从中选择满足要求的情况。语句控制结构:

for(所有可能情况){//可为多重循环

if(条件1满足&&条件2满足&&…&&条件n满足)

输出所要的结果

}4/18/202386例:百钱买百鸡问题:雄鸡7元1只,母鸡5元1只,小鸡1元3只。花100元钱,买100只鸡,如果雄鸡、母鸡和小鸡都必须有,则雄鸡、母鸡和小鸡应各买几只?分析:考虑全部的可能性时,先考虑雄鸡、母鸡和小鸡数的取值范围。由于各种鸡都必须有,所以雄鸡的最高耗用金额为100-5-1=94,取7的倍数,得91元,所以雄鸡的取值范围为1~13。同理,母鸡为1~18,小鸡为3~96;4/18/202387所以本问题的条件是:

1、雄鸡数+母鸡数+小鸡数=100;

cock+hen+chick-100==0

2、买雄鸡款+买母鸡款+买小鸡款=100;

7*cock+5*hen+chick/3-100==0

3、小鸡数为3的倍数;

chick%3==0反条件是:

1、cock+hen+chick-100!=0

2、7*cock+5*hen+chick/3-100!=0

3、chick%3!=04/18/202388#include<iostream.h>

intmain(){

for(intcock=1;cock<=13;++cock)

温馨提示

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

评论

0/150

提交评论