第二部分 – 复合语句:分支与循环
第二部分 复合语句:分支与循环一、for循环
·组成
for(初始化语句;测试表达式;更新表达式)
语句
C++把整个for看作一条语句,for后可以跟上一条语句或用花括号扩起的代码块
如:
for(i=0;i<=5;i++) cout<
for(i=0;i<=5;i++){cout<<”i=”;cout<
·for循环的执行过程
(1)设置循环变量的初始值
(2)进行测试,检测循环是否应当继续执行
(3)执行循环语句
(4)更新循环变量
·控制部分后面的语句叫做循环体。
·测试表达式决定了循环体是否被执行。其通常为关系表达式,如果值为true则程序将继续执行循环体
·for是入口条件循环。在每轮循环前会计算测试表达式的值
·更新表达式在每轮循环结束时执行。
二、表达式
▲·任何值或任何有效值和运算符的组合都是表达式,每个表达式都有值。赋值表达式的值定义为左侧成员的值。如m=20值为20.所以可以把几个等于号连用,如a=b=c=0
·<和>的优先级比<<小,在使用cout时注意
·关系运算符的意义:<小于,>大于,==等于,>=大于等于,<=小于等于,!=不等于
关系表达式为的值为bool类型
·cout.setf(ios_base::boolalpha);用于设置cout在显示bool值时使用true或false,而不是0或1.
·为判定表达式x=100的值,C++进行了赋值操作。当判定表达式的值的操作改变了内存中数据的值时,则该表达式有副作用(side effcet)
·任何表达式加上分号成为语句,反过来就不对了。表达式加上分号成为表达式语句
·返回语句、声明语句和for、while、do-while等语句都不是表达式语句,其没有值。
如int total其不是表达式,没有值。判断语句是否为表达式看是否有值
·可以在for循环的初始化部分声明变量。该变量会在离开for后消失。for循环的第一个语句可以是表达式语句,也可以是声明语句。
·更新表达式的更新的量有时也叫做步长
▲▲·递增(++)和递减(–)运算符:每次增减1
用法:前缀 ++变量 –变量 先修改再使用变量的值(此时已修改)
后缀 变量— 变量++ 先使用变量的值再修改变量
警告:在编写程序时,请严格遵守标准,否则程序会出现难以预知的错误。不能在同一条语句上运用多次递增递减运算符,如x=(++n)+(n++)会在不同的系统上生成不同的结果。
·副作用和顺序点
副作用:计算表达式时对某一些东西进行了修改
顺序点:程序执行过程的一个点,任何完整表达式后都有一个顺序点,在进入下一步前将确保对所有副作用都进行了评估。即在执行下一条语句前,赋值、递增、递减运算符执行的所有修改都必须完成。
完整表达式:不是另一个更大的表达式的子表达式
y=(4+x++)+(6+x++);
以上语句中4+x++不是完整表达式,其后没有顺序点,所以其所有的修改无法进行保证
则x不一定加1,所以该表达式会产生未定义行为。
Note:在部分计算机教育中,有一个经典问题:i=1,则表达式n=(i++)+(++i)值为多少,这是与上面的问题相似,在上面已经明确指明此会导致不同编译器输出不同的结果。所以无论如何都不能写这样的程序。且在C++和C标准中已经明确指出此为未定义行为!!
*对于用户定义的类型,若定义了递增递减运算符,则前缀格式的效率更高
·递增递减与指针
前缀格式与解除引用的优先级相同,从右向左结合;后缀格式比前缀格式优先级高,从左向右结合。*++pt表示先将++应用于pt后再应用*,++*pt意味着先取得pt指向的值,然后递增,*pt++先应用++再应用*。
#include<iostream>
using namespace std;
int main()
{
cout<<“——循环结构递增与解除引用测试——\n“;
int arr[10]={1,2,3,4,5,6,7,8,9,10};
int *pt=&arr[0];
cout<<“*pt=”<<(*pt)<<endl
<<“*++pt=”<<(*++pt)<<endl
<<“*pt++=”<<(*pt++)<<endl;
return 0;
}
——循环结构递增与解除引用测试——
*pt=1
*++pt=2
*pt++=2
·组合赋值运算符:L为左操作数,R为右操作数
+= 将L+R赋给L -= 将L-R赋给L *= 将L*R赋给L
/= 将L/R赋给L %= 将L%R赋给L
三、复合语句(语句块)
复合语句(代码块)由一对花括号和它包含的语句组成,被视作一条语句。
在代码块中定义的变量只在其中有效。若外部定义了同名变量,则先隐藏,在代码块执行完毕后代码块中的变量消失,外部的变量重新出现。
#include<iostream>
using namespace std;
int main()
{
int x=100;
cout<<“x_out=”<<x<<endl;
{
int x=114514;
cout<<“x_in=”<<x<<endl;
}
cout<<“x_out=”<<x<<endl;
return 0;
}
x_out=100
x_in=114514
x_out=100
▲·逗号运算符:表达式的值为右侧(第二部分)的值。
a=(114,514);
该表达式值为514.
·bool值提升为int:只有0(false)和1(true)两种情况
▲▲·C风格字符的比较
注意:用引号引起的字符串常量也是其地址,word==”mate”比较的是它们地址是否一致
▲▲▲▲▲cstring文件中的strcmp()函数:接受两个char*
如果两个字符串相同,则返回0
以下为对其的解释的2个版本:
①如果第一个字符串按字母排序排在第二个字符串后面,strcmp()返回正数值。(也说按系统排列顺序)在ASCII码中,大写编码都比小写小,大写字母排在前面。
②strcmp()函数是根据ACSII码的值来依次比较 str1 和 str2 的每一个字符直到出现不到的字符,或者到达字符串末尾;strcmp()函数首先将s1字符串的第一个字符值减去s2第一个字符,若差值为零则继续比较下去;若差值不为零,则返回差值。
如:”Zoo”比”aviary”排在前面,”Physics”与”physics”不一样
检测相等或排列顺序
以下表达式为true的条件:
①str1与str2相等 strcmp(str1,str2)==0
②str1与str2不相等 strcmp(str1,str2)!=0
strcmp(str1,str2)
③str1在str2的前面(此时str1
//str1中的字符比str2的字符数值小
④str1在str2的后面(此时str1>str2) strcmp(str1,str2)>0
//str1中的字符比str2的字符数值小
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char a[]=“Everything”;
char b[]=“Every”;
cout.setf(ios_base::boolalpha);
cout<<“strcmp(a,b)==0 “<<(strcmp(a,b)==0)<<endl;
cout<<“strcmp(a,b)>0 “<<(strcmp(a,b)>0)<<endl;
char c[]=“Anything”;
char d[]=“anything”;
cout<<“strcmp(c,d)==0 “<<(strcmp(c,d)==0)<<endl;
cout<<“strcmp(c,d)>0 “<<(strcmp(c,d)>0)<<endl;
cout<<“strcmp(a,c)>0 “<<(strcmp(a,c)>0)<<endl;
return 0;
}
strcmp(a,b)==0 false
strcmp(a,b)>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 <iostream>
#include <ctime> // describes clock() function, clock_t type
int main()
{
using namespace std;
cout << “Enter the delay time, in seconds: “;
float secs;
cin >> secs;
clock_t delay = secs * CLOCKS_PER_SEC; // convert to clock ticks
cout << “starting\a\n“;
clock_t start = clock();
while (clock() – start < delay ) // wait until time elapses
; // note the semicolon
cout << “done \a\n“;
// cin.get();
// cin.get();
return 0;
}
Enter the delay time, in seconds: 2
starting
Done
——————————–
Process exited after 3.258 seconds with return value 0, 3564 KB mem used.
Press ANY key to exit…
Note:上面的斜体加横线是输入的字符,较浅的区块为调试器输出的信息。输入用了1秒多
clock()函数返回程序开始执行后所用的系统时间,返回clock_t类型
CLOCKS_PER_SEC常量是每秒钟包含的系统时间单位数,将系统时间除以该值得到秒数。
即 系统时间/每秒钟系统时间单位数(CLOCKS_PER_SEC)=秒数
所以 秒数*CLOCKS_PER_SEC=系统时间,为以上的实现
类型别名:关键字typedef:格式: typedef 类型名 类型的别名;
此时可以用声明的别名来替代原来的类型名使用。如 typedef char* B_pointer;
使用#define时,若声明了一系列变量,则在文本替换时会出现一些问题:
#define QWORDptr long long*
QWORDptr a,b;
等价于
long long* a,b;
此时a为long long*,b为long long
五、do-while循环
do-while循环是出口条件循环。循环体先执行再判定测试表达式。当测试表达式为假时,退出循环。语法:
do
循环体
while(测试表达式);
注意不要漏了语句后的分号
六、基于范围的for循环(C++11)
示例:
double prices[5] = {4.99, 10.99, 6.87, 7.99, 8.49};
for (double x : prices)
cout << x << std::endl;
该循环显示数组中的每一个值(从prices[0]到prices[4])
能够结合使用初始化列表
for (int x : {3, 5, 2, 8, 6})
cout << x << " ";
cout << ‘\n’;
七、循环和文本输入
1.使用原始的cin
(1)传统停止输入方法:使用哨兵字符,将其作为停止标记.
(2)cin在读取char值时忽略空格和换行符。输入的空格不能回显
(3)cin的输入被缓冲,按下回车键后才会发送内容。
#include<iostream>
using namespace std;
int main()
{
char ch=0;
int total=0;
while(ch!=‘$’)
{
cin>>ch;
total++;
cout<<ch;
}
return 0;
}
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<iostream>
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<5;i++)
{
for(int j=0;j<5;j++)
{
cout<<marks[i][j]<<” \t“;
}
cout<<endl;
}
return 0;
}
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循环:算法中常见,有内外层循环。可用于输入、打印高维数组。
示例#1:输入二维数组:
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
cin>>arr[i][j];
示例#2:计算1+(1+2)+(1+2+3)+(1+2+3+4)+……+(1+2+3+……+20)+5
#include<iostream>
using namespace std;
int main()
{
int total=0;
for(int i=1;i<=20;i++)
{
for(int j=1;j<=i;j++)
{
total+=j;
}
}
total+=5;
cout<<total;
return 0;
}
输出:1545______
九、
if语句、if-else语句、if-else if-else结构
1.if语句
·语法:
if(测试表达式)
语句
如果测试条件为true,则程序执行语句,如果测试条件为false,程序跳过语句。
测试条件会强制转换为bool值。
整个if语句通常被视为1条语句
1.
if-else语句
·语法:
if(测试表达式)
语句1
else
语句2
如果测试条件为true,程序执行语句1,如果测试条件为false执行语句2。整个if-else语句被视作一条语句。
注:在处理字符时,ch++的值仍是char,ch+1却是int
注意:中间如有多条语句,记得使用括号。单独出现else会被认为是错误。
2. 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中说法为左边的子表达式先于右边的子表达式)回顾:分号和逗号也是顺序点。
2. and(&&)
用&&将两个表达式连接起来时,仅当原来的两个表达式都为true得到的表达式才为true.&&的优先级低于关系运算符,且&&也是顺序点。首先判定左侧。
3. 用&&设置取值范围:例:1
注意:1
4. not(!)
!运算符将它后面的表达式的真值取反。即当expression为true,则!expression为false,
当expression为false,则!expression为true.
5. 三种运算符的运算优先级从小到大排列分别为!、&&、||
or、and优先级都低于关系运算符,!的优先级高于任何关系和算术运算符。
note:这些规定与离散数学中的部分规定相似,逻辑运算符优先级参照了命题联结词。
部分示例:
x>5&&x<10判断x是否在5~10之间,!(x>5)判断是否x<=5,!x>5判断!x是否大于5.
age>30 && age<45 || weight>300判断age>30 && age<45或者weight>300是否成立。
6. 其他表达方式:&&可用and替换,||可用or替换,!可用not替换。and、or、not都是C++保留字,在C语言中要引入iso646.h(C语言中不是保留字)
十一、字符函数库CCTYPE
程序示例:右侧是程序输入输出,红框是输入
![]()

#include<iostream>
#include<cctype>
using namespace std;
int main()
{
char ch;
int order=0;
while(cin.get(ch))
{
order++;
cout<<“char#”<<order<<endl;
if(isalnum(ch))cout<<“是数字字母”<<endl;
if(isalpha(ch))cout<<“是字母”<<endl;
if(isdigit(ch))cout<<“是数字”<<endl;
if(iscntrl(ch))cout<<“是控制字符”<<endl;
if(islower(ch))cout<<“小写字母”<<endl;
if(isupper(ch))cout<<“大写字母”<<endl;
if(isxdigit(ch))cout<<“是十六进制数字”<<endl;
}
return 0;
}



十二、?:运算符:?:被称作条件运算符,是唯一需要三个操作数的运算符(三目运算符)
通用格式:
条件? 表达式1:表达式2
当条件为真时,整个表达式的值为表达式1;条件为假时,整个表达式的值为表达式2。
该运算符常嵌套进其他语句,可以用来简化if else
十三、switch语句
switch(integer-expression)
{
case label1:statement(s)
case label2:statement(s)
…
default:statement(s)
}
执行switch语句时,程序跳转到integer-expression的值标记的那一行。
注意:①integer-expression必须是一个结果为整数值的表达式。
②每个标签(case后的就是标签)必须是int或char常量(如128或’W’)或是枚举量。如果其不与任何标签匹配,跳转到default处。
③default标签是可选的,若没有匹配的标签和default标签,程序跳转到switch语句的下一条语句。
④case标签只是行标签,不是选项之间的界限。跳转到某一处标签后会执行完下面的所有语句。程序并不会直接在下一个case标签停下⑤使用break语句可以结束switch语句的执行。
note:程序的跳转只是程序跳到了某一位置的语句,然后继续依次执行语句,并不会无缘无故停下。

常用用法:①多标签跳转到同一位置 ②常用“菜单”选定格式
switch(integer-expression)
{
case label1a:
case label1b:
statement(s)
case label2a:
case label2b:
case ……
statement(s)
….
}
switch(integer-expression)
{
case label1:
statement(s)
break;
case label2:
statement(s)
break;
…
default:
statement(s)
break;
}
·使用匿名枚举(用枚举定义常量):enum {枚举量0,枚举量1,……};
十四、break和continue语句
1. break语句结束循环
2. continue语句用于循环当中,跳过循环体余下的代码,开始新一轮循环。
~3.goto语句:跳转到指定标签。即goto 标签名;
标签的用法: 标签名: 语句
note:大部分情况下很少用goto,有些人认为这破坏程序的可读性。只有在一次性跳出多重循环时使用。
3. 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 << "Enter a line of text:\n";
cin.get(line, ArSize);
cout << "Complete line:\n" << line << endl;
cout << "Line through first period:\n";
for (int i = 0; line[i] != ‘\0’; i++)
{
cout << line[i]; // display character
if (line[i] == ‘.’) // quit if it’s a period
break;
if (line[i] != ‘ ‘) // skip rest of loop
continue;
spaces++;
}
cout << "\n" << spaces << " spaces\n";
cout << "Done.\n";
return 0;
}
Enter a line of text:
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数组:不断读取,直到空白字符
3. 输出时,操作相反。浮点数可能转为e表示法
4. 输入一开始为文本,控制台输入为文本文件。
5. 文本文件:每个字节都存储了一个字符编码的文件
6. 不是所有的文件都是文本,数据库、电子表格(excel)以数值格式存储数据。
7. 字处理文件(word)中除了文本信息,可能还有其他信息。
8. 控制台I/O(cmd是控制台)仅适用于文本文件。源代码文件属于文本文件。
·写入文本文件(类比cout)
工具 | cout | 文件输出 |
头文件 | iostream,定义了一个用于处理输出的ostream类。cout是一个ostream对象(变量) | ·引入fstream ·需声明ofstream(由ostream派生而来)对象。方式:ofstream 文件输出流对象名; |
名称空间 | std | std |
使用 | 使用运算符<< | 需要将ofstream对象与文件关联起来,使用的是open()方法。使用完文件后使用方法close()方法关闭。可以像cout那样使用运算符<< |
示例:ofstream fout;
fout<<"31 miss Cai"<
fout<<28<<"miss W"<<'\n'<<"fantastic "<<"sing well "<
关联文件时使用open()方法,该方法接受一个C风格字符串作为参数。
boy_which_is_handsome.open(“45_PERSONAL.txt”);
letter.open(“Mr.WuZhehao_to_Miss_Cai.txt”);
fout.close();
▲所有可用于cout的操作都可用于ofstream对象,包括setf()等格式化
在打开文件时,若文件不存在,方法open()新建文件。打开原有的文件时,截断该文件,将其长度变为0,丢弃原有的内容,再输出新的内容。
·读取文本文件(类比cin)
工具 | cin | 文件输出 |
头文件 | iostream,定义了一个用于处理输出的istream类。cin是一个istream对象(变量) | ·引入fstream ·需声明ifstream(由istream派生而来)对象。方式:ifstream 文件输出流对象名; |
名称空间 | 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(;;)用于编写死循环
2. while循环的格式
while (测试条件)
循环体
特别地,while(true)或while(1)用于编写死循环
3. do-while循环
do
循环体
while(测试表达式);
注意不要漏了语句后的分号
4. 基于范围的for循环(C++11):示例:
for(int x:{3,5,2,8,6}) cout<
5. 表达式的定义:任何值或任何有效值和运算符的组合,特点:每个表达式都有值。
6. 赋值表达式的值定义为左侧成员的值.应用:几个等号连用.
7. 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的前面(此时str1
//str1中的字符比str2的字符数值小
④str1在str2的后面(此时str1>str2) strcmp(str1,str2)>0
//str1中的字符比str2的字符数值小
strchr()的用法:
strchr(字符串,字符);
返回指定字符在字符串中第一次出现的地址。若没有该字符,返回NULL
18. ctime的用法:见正文
19. 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) | 显示一个字符 |
20. cctype:见正文
21. 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可以没有。
24. switch语句结构
switch(integer-expression)
{
case label1:statement(s)
case label2:statement(s)
…
default:statement(s)
}
25.break语句结束循环
continue语句用于循环当中,跳过循环体余下的代码,开始新一轮循环。
25. 文件输入输出:见正文。
