正文
循环 与 分支语句 和 字符函数库cctype 文件简单处理
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
循环
- for循环
- while循环
- do while循环
通常,入口条件循环比出口条件循环好,因为循环开始前对条件进行检查
c++11基于范围的for循环
对数组(或容器类,如:vector和array)的每个元素执行相同操作
- int a[5]={1,3,4,5,6};
for (int i :a)
cout<<i<<endl; //////
不断循环把依次打印出来
- int a[5]={1,3,4,5,6};
for (int & i :a)
{ i=i+5;
cout<<i<<endl;
} //////
修改数组的值,符号&表明i是一个引用变量
- for (int i :{1,3,4,5,6})
cout<<i<<endl;
设计循环时的指导规则
- 指定循环终止条件
- 在首次测试前初始化条件
- 在条件再次测试前更新条件
- 语句块是由花括号,而不是缩进定义的
延时循环
- ANSI和c++库中存在clock函数返回程序开始执行后所用的系统时间,单位不一定是秒
- 添加头文件#include<ctime>
- CLOCKS_PER_SEC,该常量等于每秒钟包含的系统时间,所以系统时间除于这个值等于秒数
- ctime把clock_t作为clock()返回类型的别名,这意味着可以把变量声明为clock_k类型
c++设置类型别名的方式
- 使用预处理器: #define aliasname typename
- 当声明多个一系列别名时不能使用
- 能处理define处理不了的复杂别名,与define相比,typedif是更好的选择,有时也是唯一的选择
- 注意,typedif不是创建新类型,而是在已有的类型建立一个新名称
数据输入
- 使用原始的cin进行输入
- cin读取char值时与读取其他基本类型一样,忽略了空格和换行符,所以输入的空格没有显示也没有包括在计数内
- 用cin输入时被缓冲,意味着当用户按下回车才发给程序,当缓存区还有数据时,会赋予下一条cin语句
- int n;cin>>n;如果输入的类型不匹配时将出现4种情况
- n的值不变
- 不匹配的输入将留在输入队列的缓冲区中
- cin中一个错误的标记被设置 (当错误被标记时,可以使用cin.clear()重置标记,同时也清除文件尾的eof)
- 对cin方法的调用返回false或0
- cin.get(ch)读取输入中的下一个字符(即使是空格),并将其赋给变量ch
- 在c语言中要修改变量的值,必须将变量的地址传递给函数,但在c++中只要将参数声明为引用即可,头文件iostream将cin.get(ch)的参数声明为引用类型
- cin.get()函数接受不同数量参数的原因是 函数重载
- 用clear()函数 重置cin以接收新的输入
- 用cin.get()读取行尾之前的所有输入,也就是 删除错误输入
- 提示用户重新输入
文件尾检测:EOF
- windo命令提示符模式下在任意位置按下Ctr+z和Enter
- 检测到EOF后cin将两位(eofbit和failbit)都设置为1;通过成员函数cin.eof()和cin.fail()来查看eofbit是否被设置,返回true和false
- cin.clear()可以用来重置输入流,即清空缓冲区,
逻辑运算细节
- !运算符高于所有关系运算符和算术运算符
- 逻辑 | | 运算符高于&&运算符
- C语言用逻辑运算符的另一种表达方式需要包含头文件iso646.h,c++不需要使用头文件,即&& and,|| or,! not
字符函数库cctype
函数名称
|
返回值
|
isalnum()
|
如果参数是数字或字母,则返回true
|
isalpha()
|
如果参数是字母,则返回true
|
islower()
|
如果是小写字母,则返回true
|
isupper()
|
如果是大写字母,则返回true
|
isdigit()
|
如果是数字(0-9),则返回true
|
isctrl()
|
如果是控制字符,则返回ture
|
isgraph()
|
如果是空格以外的打印字符,则返回true
|
ispunct()
|
如果是标点符号该字符返回true
|
isprint()
|
如果参数是打印字符(包括字符),则返回true
|
isspace()
|
如果参数是标准空白字符,包括空格换行回车制表符,则返回true
|
isxdigit()
|
如果参数是16进制数字,则返回true
|
toupper()
|
如果是小写字母则返回大写字母,否则返回原参数
|
tolower()
|
如果是大写字母则返回小写字母,否则返回原参数
|
条件运算符(?:)
- c++种唯一一个需要3个操作数的运算符
- 表达式1 ? 表达式2 :表达式3 //当表达式1为true时,则执行表达式2,为false时则执行表达式3
- 而且可以在条件表达式中嵌套另一个表达式(一个被谴责的任务,隐藏代码)
switch语句:
switch(integer-expreession)
{
case label 1 : statement(s)
case label 2 : statement(s)
……
default : statement(s)
}
- integer-expreession必须是结果为整数的表达式
- 标签必须是一个整数常量表达式,如:int,char,也可以是枚举量
- 如果integer-expreession找不到匹配的标签,则执行default标签
- 为了应对不按指令办事的用户,最好用字符输入
- 要让程序执行一组特定语句后停止,必须使用break
- switch语句中将int值和枚举量标签进行比较时,将枚举提升为int,在while循环测试条件中,也会将枚举量提升为int类型
- 当选项多余3个时,最好用switch分支语句
break:当循环遇到break,则跳出循环
continue:跳过循环体下面的语句,开始新一轮的循环
简单文件操作
- 写入到文本文件
-
必须 包含头文件fstream
- 必须指明名称空间std,可以使用using或std::
- 头文件ftream定义一个处理输出的 ofstream类
- 需要 创建多个ofstream变量(对象) ,要遵守变量的命名规则
- 将 ofstream对象与文件关联起来 ,可以使用open()方法
- 使用完应使用close()将其关闭
- 可以像使用cout那样使用ofstream的对象,如<<,endl以及各种cout格式化函数
- 方法open()接受一个字面字符串做参数,或存在数组的字符串。
- 将在当前目录新建文件,open参数将会是文件名,如果文件名存在则 默认清空 再打开
- 如果没有使用close(),系统将在程序正常终止时关闭
- 必须包含头文件fstream
- 必须指明名称空间std,可以使用using或std::
- 头文件ftream定义一个处理输入的ifstream类
-
- 需要创建多个ifstream变量(对象),要遵守变量的命名规则
- 将ifstream对象与文件关联起来,可以使用open()方法
- 使用完应使用close()将其关闭
- 可以像使用cin那样使用ifstream的对象,cin适用的操作和方法都适用ifstream的对象,如>>
- 可以使用ifstream对象和get()方法读取一个字符,使用getline()方法读取一行字符
- 可以结合ifstream和eof()、fail()等方法判断输入是否成功
- 当ifstream的对象被作为测试条件时,最后一个读取操作成功时转化成true,否则false
- 检查文件是否成功打开 可以使用方法is_open(),成功返回true
- 读取文件时不应该超过EOF
- 最后读取数据遇到EOF,eof()返回true
- 最后数据出现类型不匹配时,fail()将返回ture
- 当文件受损,或硬件故障时,bad()将返回true
- 当没有出现任何错误时,good()将返回true
附录
- 通常cout显示bool值之前把他们转化成int,但cout.self(ios::boolalpha)函数调用设置了一个标记,该标记命令cout显示true和false,而不是1和0
- 头文件 cstdlib 定义下,exit(EXIT_FAILURE)实现程序终止
- window文本文件的每行都以回车字符和换行符结尾,通常c++读取文件时将这两个字符转换为换行符并在写入文件时执行相反的转换。
- 布尔函数is_int() 使用 climits 文件中定义的两个字符常量(INT_MAX和INT_MIN)来确定参数是否位于适当的范围,非常适合作为条件