第 6 章 分支语句和逻辑运算符
6.1 if 语句
语句格式:
if (test-expression)
statement;
6.1.1 if else 语句
语句格式:
if (test-condition)
statement1;
else
statement2;
接下来,从C++ Primer Plus 上摘录了一段利用 if-else 进行加密的程序,个人觉得很意思。
// if-else.cpp
#include <iostream>
int main()
{
using namespace std;
char ch;
cout << "Type, and I shall repeat. \n";
cin.get(ch); // 获取第一个字符
// 停止字符标志 .
while(ch != '.')
{
// 若 获取的字符为换行符,则将换行符输出
if (ch == '\n')
cout << ch;
//若 获取的字符是非换行符,则将字符的ASCII码 +1 后输出,即 a -> b
else
cout << ++ch;
cin.get(ch); // 获取下一个字符
}
cout << "\nPlease excuse the slight confusion.\n";
return 0;
}
6.1.2 if-else-if-else 语句
6.2 逻辑表达式
OR:|| 或逻辑运算符;
AND:&& 与逻辑运算符,可以用其设置范围;
if(age > 17 && age < 40)
NOT:!非逻辑运算符。
6.3 字符函数库 cctype
包含确定字符是否为大写字母,数字,标点符号等函数的头文件。
如果 ch 是一个字母,则 isalpha(ch) 函数返回一个非零值,否则返回0。
如果 ch 是一个标点符号,则 ispumct(ch) 将返回true,否则返回0。
(这些函数的返回类型为 int ,而不是 bool,但通常 bool 转换让我们能够将它们视为 bool 类型。)
函数名称 | 返回值 |
---|---|
isalnum() | 如果参数是字母数字,即字母or数字,返回true |
isalpha() | 如果参数是字母,返回true |
iscntrl() | 如果参数是控制字符,返回true |
isdigit() | 如果参数是数字(0-9),返回true |
isgraph() | 如果参数是除空格之外的打印字符,则函数返回true |
islower() | 如果参数是小写字母,返回true |
isprint() | 如果参数是打印字符(包括空格),返回true |
ispunct() | 如果参数是标点符号,返回true |
isspace() | 如果参数是标准空白字符,如空格、进纸、换行符、回车、水平制表或者垂直制表符,返回true |
isupper() | 如果参数是大写字母,返回true |
isxdigit() | 如果参数是十六进制数字,即0-9、a-f 或 A-F,返回true |
tolower() | 如果参数是大写字符,则返回其小写,否则返回该参数 |
toupper() | 如果参数是小写字符,则返回其大写,否则返回其参数 |
6.4 ?:条件运算符
expression1 ? expression2 :expression3;
如果 expression1 为 true,返回 expression2 的值,否则返回 expression3 的值。
6.4.1 ?: or if-else
从可读性来说,条件运算符最适合于简单关系和简单表达式的值,当代码变得更复杂时,使用 if-else 语句来表达可能更为清晰。
6.5 switch 语句
switch(inteer-expression)
{
case label1: statement1; break;
case label2: statement2; break;
......
default: statement;
}
6.5.1 将枚举用作 switch 语句的标签
// cin 无法识别枚举类型,当 switch 语句将 int 值
// 和枚举量标签进行比较时,将枚举提升为 int
#include <iostream>
enum {red, orange, yellow, green, blue, violet, indigo}; // 枚举量
int main()
{
using namespace std;
cout << "Enter color code (0-6):";
int code;
cin >> code;
while(code >= red && code <= indigo)
{
switch(code)
{
case red: cout << "Her lips were red.\n"; break;
case orange:
......
case indigo: ... break;
}
cout << "Enter color code (0-6):";
cin >> code;
}
cout << "Bye\n";
return 0;
}
6.5.2 switch 和 if-else 语句
switch 语句中的每一个 case 标签必须是一个单独的值,且为整数,因此 switch 无法处理浮点测试,另外 case 标签值必须是常量。
因此如果涉及取值范围,浮点测试或两个变量的比较,则应该用 if else 语句。若选项超过两个,switch 语句更好,效率高。
6.6 break 和 continue 语句区别
while(cin.get(ch))
{
statement1;
if(ch == '\n')
continue; // -> while(cin.get(ch))
statement2;
}
statement3;
while(cin.get(ch))
{
statement1;
if(ch == '\n')
break; // -> statement3
statement2;
}
statement3;
// break & continue 的运用
const int Arsize = 80;
int main()
{
using namespace std;
char line[Arsize];
int space = 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];
if(line[i] == '.')
break; // 判断是否为一句话,若是,则跳出循环
if(line[i] != ' ')
continue; // 判断是不是空格,若是,则执行space++,继续循环
space++;
}
cout << "\n" << space << "spaces\n";
cout << "Done\n";
return 0;
}
6.7 读取数字和循环
假设要编写一个将一系列数字读入到数组中的程序,并允许用户在数字填满之前结束输入,一中方法是使用 cin :
int n;
cin >> n;
如果用户输入一个单词,而不是一个数字,则为类型不匹配的情况,则有4种结果:
// n的值保持不变
// 不匹配的输入将保留在输入列队中
// cin对象中的一个错误标记被设置
// 对cin方法的调用将返回false
返回false意味着可以用非数字输入来结束读取数字的循环,非数字输入设置错误标记意味着必须重置该标记,程序才能继续读取输入。clear() 方法重置输入标记,同时也重置文件末尾。输入错误和EOF都将导致cin 返回 false。
重置方式如下:
int golf[Max];
......
while(!(cin >> golf[i])) // 判断输入是否为数字
{
cin.clear(); // 1 重置 cin 以接受新的输入
while(cin.get() != '\n') // 2 删除输入错误
continue;
cout << "请输入数字:\n"; // 3 提示用户再次输入
}
6.8 简单文件输入/输出
6.8.1 文本IO和文本文件
6.8.2 写入到文本文件中