第二部分 - 复合语句:分支与循环

第二部分 **复合语句:分支与循环******

一、for循环

·组成

for(初始化语句;测试表达式;更新表达式)

语句

C++把整个for看作一条语句,for后可以跟上一条语句或用花括号扩起的代码块

如:

for(i=0;i(1)设置循环变量的初始值

(2)进行测试,检测循环是否应当继续执行

(3)执行循环语句

(4)更新循环变量

·控制部分后面的语句叫做循环体。

·测试表达式决定了循环体是否被执行。其通常为关系表达式,如果值为true则程序将继续执行循环体

·for是入口条件循环。在每轮循环前会计算测试表达式的值

·更新表达式在每轮循环结束时执行。

二、表达式

▲·任何值或任何有效值和运算符的组合都是表达式,每个表达式都有值。赋值表达式的值定义为左侧成员的值。如m=20值为20.所以可以把几个等于号连用,如a=b=c=0

·的优先级比大于,==等于,>=大于等于,******

using namespace std;****

int main**()******

{****

cout********

using namespace std;****

int main**()******

{****

**int** x**=**100**;******

cout**str2)strcmp(str1,str2)>0

//str1中的字符比str2的字符数值小

#include********

#include********

using namespace std;****

int main**()******

{****

**char** a**[]=****"Everything"****;******

**char** b**[]=****"Every"****;******

cout**.**setf**(**ios_base**::**boolalpha**);******

cout**0   "******0**)0   "******0**)0   "******0**)0   true

strcmp(c,d)==0 false

strcmp(c,d)>0 false

strcmp(a,c)>0 true

·比较string字符串:至少有一个操作数为string

string重载了所有关系运算符

四、while循环

·while循环只有测试条件和循环体:

while (测试条件)

循环体

首先,出现先计算测试条件,如果为true执行循环体。执行完循环体后,程序返回测试条件,若条件为true,继续执行,直到为false退出

·while为入口条件循环****

·for循环可以省略括号中的表达式,只需要两个分号,此时括号中有空表达式(语句)。省略测试表达式测试结果为true.

即for(;;) body 和while(true) body 都是死循环。

·实用实例 编写延时循环

头文件:ctime(c语言中为time.h)

//* waiting.cpp – using clock() in a time-delay loop**

#include ********

#include **** // describes clock() function, clock_t type**

int main**()******

{****

**using** **namespace** **std****;******

cout **>** secs**;******

clock_t delay **=** secs ***** CLOCKS_PER_SEC**;**  *//* *convert* *to* *clock* *ticks***

cout **七、循环和文本输入

1.使用原始的cin

(1)传统停止输入方法:使用哨兵字符,将其作为停止标记.

(2)cin在读取char值时忽略空格和换行符。输入的空格不能回显

(3)cin的输入被缓冲,按下回车键后才会发送内容。

#include********

using namespace std;****

int main**()******

{****

**char** ch**=**0**;******

**int** total**=**0**;******

**while****(**ch**!=**'$'**)******

**{******

    cin**>>**ch**;******

    total**++;******

    cout**What can I do for you?$*********

WhatcanIdoforyou?$

2.补救

(1)cin.get(ch);读取输入中的下一个字符,包括空格、制表符、换行符。其返回istream&类型的cin(是cin对象的引用,可以继续调用cin的方法)。

注:cin所属的istream类包含了成员get(ch),其子类都有这个方法。

(2)C++中可以有多个同名函数,是函数重载

(3)文件尾条件****

①制造文件尾:Ctrl+Z (^Z)

②C++在检测到EOF(END OF FILE,即文件尾),cin将两位(eofbit和failbit)设为1.

cin.eof()检测到eofbit被设为1,cin.eof()返回true,否则返回false.

cin.fail()如果eofbit或failbit设为1,则fail()成员返回true

两个函数报告最近读取的结果

cin.clear()重置输入

③istream对象在需要bool值的地方可以转为bool值(调用转换函数)。若最后一次读取成功,返回true,失败返回false。其比两个成员函数更通用。

④不接受任何参数的cin.get()成员函数返回输入中的下一个字符。该函数到达EOF时返回符号常量EOF,其值被定义为-1.

⑤cout.put(ch)显示一个字符

八、嵌套循环和二维数组

1.二维数组

·定义:每个元素本身就是数组的数组

·声明方法:元素类型 二维数组名[元素个数][元素个数];

*

如:int example[2][8];表示example包含两个元素,是两个数组,每个数组中又有8个int

#include********

using namespace std;****

int main**()******

{****

**int** marks**[**5**][**5**]=******

**{******

    **{**100**,**99**,**100**,**90**,**99**},******

    **{**120**,**119**,**117**,**101**,**118**},******

    **{**140**,**135**,**145**,**147**,**150**},******

    **{**0**,**0**,**1**,**2**,**3**},******

    **{**28**,**28**,**30**,**35**,**37**}******

**};******

**for****(****int** i**=**0**;**i**>**arr**[**i**][**j**];**

示例#2:计算1+(1+2)+(1+2+3)+(1+2+3+4)+……+(1+2+3+……+20)+5

#include********

using namespace std;****

int main**()******

{****

**int** total**=**0**;******

**for****(****int** i**=**1**;**i**1. ![](/images/CPP提纲第2版20410.png)if-else语句

·语法:

if(测试表达式)

语句1

else

语句2

如果测试条件为true,程序执行语句1,如果测试条件为false执行语句2。整个if-else语句被视作一条语句。

注:在处理字符时,ch++的值仍是char,ch+1却是int

注意:中间如有多条语句,记得使用括号。单独出现else会被认为是错误。****

  1. if-else if-else结构(if-else语句嵌套)

由if-else扩展而来。如

if (ch == ‘A’)

a_grade++; // alternative # 1

else

if (ch == ‘B’) // alternative # 2

b_grade++; // subalternative # 2a

else

soso++; // subalternative # 2b

如果ch不是’A’,则判断ch是不是’B’,如果不是执行最后的else.

由于C++格式自由,

else可以直接接if。

该结构的常用形式和逻辑如下:

if(条件0)

语句0

else if(条件1)

语句1

……

else if(条件n)

语句n

else

语句n+1

最后一个else可以没有。

十、▲逻辑表达式

·三种逻辑运算符:或or(||)、且and(&&)、非not(!)

  1. or(||)

用||将两个表达式连接在一起时,整个表达式的值为真当且仅当其中有一个表达式为真。

关系运算符的优先级比||高。

||是一个顺序点。先修改左侧的值再判定右侧的值。(C++11中说法为左边的子表达式先于右边的子表达式)回顾:分号和逗号也是顺序点。

  1. and(&&)

用&&将两个表达式连接起来时,仅当原来的两个表达式都为true得到的表达式才为true.&&的优先级低于关系运算符,且&&也是顺序点。首先判定左侧。

  1. 用&&设置取值范围:例:14. not(!)

!运算符将它后面的表达式的真值取反。即当expression为true,则!expression为false,

当expression为false,则!expression为true.

  1. 三种运算符的运算优先级从小到大排列分别为!、&&、||

or、and优先级都低于关系运算符,!的优先级高于任何关系和算术运算符。

note:这些规定与离散数学中的部分规定相似,逻辑运算符优先级参照了命题联结词。

部分示例:

x>5&&x5)判断是否x5判断!x是否大于5.

age>30 && age300判断age>30 && age300是否成立。

  1. 其他表达方式:&&可用and替换,||可用or替换,!可用not替换。and、or、not都是C++保留字,在C语言中要引入iso646.h(C语言中不是保留字)

十一、字符函数库CCTYPE

程序示例:右侧是程序输入输出,红框是输入

#include********

#include****

using namespace std;****

int main**()******

{****

**char** ch**;******

**int** order**=**0**;******

**while****(**cin**.**get**(**ch**))******

**{******

    order**++;******

    cout**1. break语句结束循环
  1. continue语句用于循环当中,跳过循环体余下的代码,开始新一轮循环。

~3.goto语句:跳转到指定标签。即goto 标签名;

标签的用法: 标签名: 语句

note:大部分情况下很少用goto,有些人认为这破坏程序的可读性。只有在一次性跳出多重循环时使用。

  1. break和continue示例:

// jump.cpp – using continue and break

#include

const int ArSize = 80;

int main()

{

using namespace std;

char line[ArSize];

int spaces = 0;

cout Let’s do lunch today. You can pay! *****

Complete line:

Let’s do lunch today. You can pay!

Line through first period:

Let’s do lunch today.

3 spaces

Done.

十五、复合语句应用举例:读取数字的循环

·输入数字发生类型不匹配时会出现的情况:

①变量的值保持不变

②不匹配的输入被留在输入队列中

③cin对象中的一个错误标记被设置

④对cin方法的调用返回false

十六、简单文件输入输出

  1. 使用cin输入时,程序把输入视作一系列字节,每个字节都被解释为字符编码。

  2. 输入都是字符数据,cin负责将其转换为其他类型,以达到提供输入的结果。

①使用char数据:将输入队列中的第一个字符读取,

②使用int类型:不断读取,直到非数字字符,

③使用double类型:不断读取,直到遇到第一个不属于浮点数的字符

④常规cin输入char数组:不断读取,直到空白字符

⑤cin.getline()输入char数组:不断读取,直到空白字符

  1. 输出时,操作相反。浮点数可能转为e表示法

  2. 输入一开始为文本,控制台输入为文本文件。

  3. 文本文件:每个字节都存储了一个字符编码的文件****

  4. 不是所有的文件都是文本,数据库、电子表格(excel)以数值格式存储数据。

  5. 字处理文件(word)中除了文本信息,可能还有其他信息。

  6. 控制台I/O(cmd是控制台)仅适用于文本文件。源代码文件属于文本文件。

·写入文本文件(类比cout)

工具 cout 文件输出
头文件 iostream,定义了一个用于处理输出的ostream类。cout是一个ostream对象(变量) ·引入fstream

·需声明ofstream(由ostream派生而来)对象。方式:ofstream 文件输出流对象名; |
| 名称空间 | std | std |
| 使用 | 使用运算符> | 需要将ifstream对象与文件关联起来,使用的是open()方法,该方法接受一个C风格字符串作为参数。使用完文件后使用方法close()方法关闭。可以像cin那样使用运算符>>,可以使用一切cin能用的方法,包括eof()、将其作为测试条件。 |

示例:ifstream fin;fin>>girlname>>keywords;

检测文件是否成功被打开:使用is_open()方法。成功打开返回true,失败返回false.

·函数exit()的原型是在头文件cstdlib中定义的。exit(返回值)终止程序。cstdlib中的EXIT_FAILURE表示程序失败的返回值。

·good()方法也可以检测文件是否打开[包括eof和文件是否正常输入]。但是检测的问题没有is_open()广。

note:Windows文本文件每行都以回车字符和换行符结尾,通常会在读取时进行转换。部分文本编辑器不在最后一行末尾加上换行符。

·程序读取文件不超过EOF(文件尾)。最后一次读取数据遇到EOF,方法eof()返回true.最后一次读取数据发生内存类型不匹配的情况,方法fail()返回true(有EOF时该方法也返回true).最后一次读取出现意外的问题时,方法bad()返回true。good()方法在没有任何错误时返回true。

·★实用方法:用good()预防输入意外:在循环前(执行循环测试前)放置输入语句,在下次执行循环测试之前放置另一条输入语句。

// standard file-reading loop design

inFile >> value; // get first value

while (inFile.good()) // while input good and not at EOF

{

// loop body goes here

inFile >> value; // get next value

}

或者如下:

while (inFile >> value) // read and test for success

{

// loop body goes here

// omit end-of-loop input

}

第二部分总结****

  1. for循环的格式

for(初始化语句;测试表达式;更新表达式)

语句

特别地,for(;;)用于编写死循环

  1. while循环的格式

while (测试条件)

循环体

特别地,while(true)或while(1)用于编写死循环

  1. do-while循环

do

循环体

while(测试表达式);

注意不要漏了语句后的分号

  1. 基于范围的for循环(C++11):示例:

for(int x:{3,5,2,8,6})cout5. 表达式的定义:任何值或任何有效值和运算符的组合,特点:每个表达式都有值。

  1. 赋值表达式的值定义为左侧成员的值.应用:几个等号连用.

  2. cout.setf(ios_base::boolalpha);用于设置cout在显示bool值时使用true或false,默认情况下bool值显示为数字。

8.当判定表达式的值的操作改变了内存中数据的值时,则该表达式有副作用(side effcet)

9.表达式语句的定义:任何表达式加上分号成为**表达式语句,**反过来就不对了。

10.判断语句是否为表达式看是否有值,返回语句、声明语句和for、while、do-while等语句都不是表达式语句,因为其没有值。

11.在for循环的初始化部分声明的变量会在离开for后消失。for循环的第一个语句可以是表达式语句,也可以是声明语句。

12.顺序点:程序执行过程的一个点,任何完整表达式后都有一个顺序点,在进入下一步前将确保对所有副作用都进行了评估。即在执行下一条语句前,赋值、递增、递减运算符执行的所有修改都必须完成。

13.完整表达式:不是另一个更大的表达式的子表达式

14.递增递减与指针:前缀格式与解除引用的优先级相同,后缀格式比前缀格式优先级高

15.复合语句(代码块)由一对花括号和它包含的语句组成,被视作一条语句。

16.逗号运算符:表达式的值为右侧(第二部分)的值。

17.字符串的比较和cstring常用函数的总结:

strcpy(目标,源字符串)复制字符串,

strcat(目标,源字符串)附加一个字符串到另一个字符串末尾。

strncat()、strncpy()前两个参数同上,第三个参数指出最大复制多少字符****

检测相等或排列顺序:strcmp()****

如果两个字符串相同,则返回0****

如果第一个字符串按字母排序排在第二个字符串后面,strcmp()返回正数值。****

以下表达式为true的条件:(可以从按字母排序、按ASCII码排序理解)****

①str1与str2相等strcmp(str1,str2)==0

②str1与str2不相等strcmp(str1,str2)!=0

strcmp(str1,str2)****

③str1在str2的前面(此时str1str2)strcmp(str1,str2)>0

//str1中的字符比str2的字符数值小****

strchr()的用法:****

strchr(字符串,字符);****

返回指定字符在字符串中第一次出现的地址。若没有该字符,返回NULL****

  1. ctime的用法:见正文

  2. cin的用法(二)

在检测到EOF(END OF FILE,即文件尾)后,cin将两位(eofbit和failbit)设为1.

方法 说明
cin.eof() 检测到eofbit被设为1,cin.eof()返回true,否则返回false.
cin.fail() 如果eofbit或failbit设为1,则fail()成员返回true
两个函数报告最近读取的结果
cin.clear() 重置输入
istream::operator bool() 转为bool值.若最后一次读取成功,返回true,失败返回false。其比两个成员函数更通用。
cin.get() 返回输入中的下一个字符.到达EOF时返回符号常量EOF(-1)
cout.put(char ch) 显示一个字符
  1. cctype:见正文

  2. if语句

if(测试表达式)

语句

22.if-else语句

if(测试表达式)

语句1

else

语句2

23.if-else if-else结构(if-else嵌套)

if(条件0)

语句0

else if(条件1)

语句1

……

else if(条件n)

语句n

else

语句n+1

最后一个else可以没有。

  1. switch语句结构

switch(integer-expression)

{

case label1:statement(s)

case label2:statement(s)

…

default:statement(s)

}

25.break语句结束循环

continue语句用于循环当中,跳过循环体余下的代码,开始新一轮循环。

  1. 文件输入输出:见正文。