第二部分 复合语句:分支与循环
第二部分 - 复合语句:分支与循环
第二部分 **复合语句:分支与循环******
一、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. if-else语句
·语法:
if(测试表达式)
语句1
else
语句2
如果测试条件为true,程序执行语句1,如果测试条件为false执行语句2。整个if-else语句被视作一条语句。
注:在处理字符时,ch++的值仍是char,ch+1却是int
注意:中间如有多条语句,记得使用括号。单独出现else会被认为是错误。****
- 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(!)
or(||)
用||将两个表达式连接在一起时,整个表达式的值为真当且仅当其中有一个表达式为真。
关系运算符的优先级比||高。
||是一个顺序点。先修改左侧的值再判定右侧的值。(C++11中说法为左边的子表达式先于右边的子表达式)回顾:分号和逗号也是顺序点。
- and(&&)
用&&将两个表达式连接起来时,仅当原来的两个表达式都为true得到的表达式才为true.&&的优先级低于关系运算符,且&&也是顺序点。首先判定左侧。
- 用&&设置取值范围:例:14. not(!)
!运算符将它后面的表达式的真值取反。即当expression为true,则!expression为false,
当expression为false,则!expression为true.
- 三种运算符的运算优先级从小到大排列分别为!、&&、||
or、and优先级都低于关系运算符,!的优先级高于任何关系和算术运算符。
note:这些规定与离散数学中的部分规定相似,逻辑运算符优先级参照了命题联结词。
部分示例:
x>5&&x5)判断是否x5判断!x是否大于5.
age>30 && age300判断age>30 && age300是否成立。
- 其他表达方式:&&可用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语句结束循环
- continue语句用于循环当中,跳过循环体余下的代码,开始新一轮循环。
~3.goto语句:跳转到指定标签。即goto 标签名;
标签的用法: 标签名: 语句
note:大部分情况下很少用goto,有些人认为这破坏程序的可读性。只有在一次性跳出多重循环时使用。
- 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
十六、简单文件输入输出
使用cin输入时,程序把输入视作一系列字节,每个字节都被解释为字符编码。
输入都是字符数据,cin负责将其转换为其他类型,以达到提供输入的结果。
①使用char数据:将输入队列中的第一个字符读取,
②使用int类型:不断读取,直到非数字字符,
③使用double类型:不断读取,直到遇到第一个不属于浮点数的字符
④常规cin输入char数组:不断读取,直到空白字符
⑤cin.getline()输入char数组:不断读取,直到空白字符
输出时,操作相反。浮点数可能转为e表示法
输入一开始为文本,控制台输入为文本文件。
文本文件:每个字节都存储了一个字符编码的文件****
不是所有的文件都是文本,数据库、电子表格(excel)以数值格式存储数据。
字处理文件(word)中除了文本信息,可能还有其他信息。
控制台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
}
第二部分总结****
- for循环的格式
for(初始化语句;测试表达式;更新表达式)
语句
特别地,for(;;)用于编写死循环
- while循环的格式
while (测试条件)
循环体
特别地,while(true)或while(1)用于编写死循环
- do-while循环
do
循环体
while(测试表达式);
注意不要漏了语句后的分号
- 基于范围的for循环(C++11):示例:
for(int x:{3,5,2,8,6})cout5. 表达式的定义:任何值或任何有效值和运算符的组合,特点:每个表达式都有值。
赋值表达式的值定义为左侧成员的值.应用:几个等号连用.
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****
ctime的用法:见正文
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) | 显示一个字符 |
cctype:见正文
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可以没有。
- switch语句结构
switch(integer-expression)
{
case label1:statement(s)
case label2:statement(s)
…
default:statement(s)
}
25.break语句结束循环
continue语句用于循环当中,跳过循环体余下的代码,开始新一轮循环。
- 文件输入输出:见正文。