C++PrimerPlus6-06-分支语句和逻辑运算符

第6章 分支语句和逻辑运算符

  • if语句
  • if else语句
  • 逻辑运算符——&&、||和!
  • cctype字符函数库
  • 条件运算符?:
  • switch语句
  • continue和break语句
  • 读取数字的循环
  • 基本文件输入/输出

6.1 if语句

6.1.1 if else语句

6.1.2 格式化if else语句

6.1.3 if else if else结构

6.2 逻辑表达式

6.2.1 逻辑OR运算符:||

6.2.2 逻辑AND运算符:&&

6.2.3 用&&来设置取值范围

6.2.4 逻辑NOT运算符:!

6.2.5 逻辑运算符细节

C++逻辑OR和逻辑AND运算符的优先级都低于关系运算符。

6.2.6 其他表示方式

6.3 字符函数库cctype

确定字符是否为大写字母、数字、标点符号的工作,cctype。

  • isalpha():是否是字母,是则返回非0值,否则返回0
  • ispunct():标点符号(逗号、句号)
  • isspace():空白(换行符、空格、制表符)
  • isdigit():数字
  • …:其他的还有字母或数字、控制字符、除空格之外的打印字符、小写字母、包括空格的打印字符、大写字母、十六进制数字、转大写、转小写等

6.4 ?:运算符

6.5 switch语句

switch (integer-expression)
{
    case label1: statement(s)
    case label2: statement(s)
    ...
    default: statement(s)
}

6.5.1 将枚举量用作标签

6.5.2 switch和if else

switch的case标签是单独的值,必须是整数(包括char, enum),无法处理浮点,而且是常量。

6.6 break和continue语句

6.7 读取数字的循环

如下只能输入数字:

double fish[5]
int i = 0;
while (cin << fish[i]) {} // 输入的不是数字时,不再循环

如下只能输入数字,并消除错误输入:

int golf[5]
while (!(cin >> golf[i]))
{
  cin.clear(); // reset input
  while (cin.get() != '\n')
    continue; // get rid of bad input 消除不良输入
  cout << "Please enter a number: ";
}

6.8 简单文件输入/输出

6.8.1 文本I/O和文本文件

本章讨论的文件IO相当于控制台IO,仅适用于文本文件,不包含描述格式、字体等的信息。
不管目标数据类型是什么,cin输入一开始都是字符数据——文本数据,然后cin对象负责将文本转换为其他类型。

char ch;
int nl
double x;
char word[50];

// 假设输入了:
// 38.5 19.2
cin >> ch; // 第一个字符3,输入和目标变量都是字符,不需要转换。然后处理下一个字符
cin >> n; // cin不断读取,直到遇到非数字字符。遇到小数点,存了38
cin >> x; // cin不断读取,直到遇到第一个不属于浮点数的字符。遇到空格,存了38.5
cin >> word; // cin不断读取,直到遇到空白字符。遇到空格,存了"38.5"
cin.getline(word, 50); // cin不断读取,直到遇到换行符,所有字符都存到了word中

6.8.2 写入到文本文件中

文件输出(写入文件)的套路:

  • 包含头文件fstream
  • 声明ofstream变量(对象)
  • 使用名称空间std
  • 将ofstream对象与文件关联起来,例如使用Open()
  • 使用完文件后,用close()将其关闭
  • 可结合使用ofstream对象和运算符<<来输出各种类型数据
ofstream outFile; // create object for output
outFile.open("carinfo.txt");

// 做点什么
double wt = 125.8;
outFile << wt; // 写入一个double
char line[81] = "Objects are closer than they appear.";
outFile << line << endl; // 写入一行字符串

outFile.close();

如果open的文件已存在,默认将其长度截短为零,原来的内容将丢失。

6.8.3 读取文本文件

文件输入(读取文件)的套路:

  • 包含头文件fstream
  • 声明ifstream变量(对象)
  • 使用名称空间std
  • 将ifstream对象与文件关联起来,例如使用Open()
  • 使用完文件后,用close()将其关闭
  • 运算符>>
  • 用get()读取一个字符,用getline()读取一行字符
  • 用eof() fail()来判断输入是否成功
ifstream fin;
fin.open("bowling.txt");

double wt;
fin >> wt; // 从文件中读取一个double
char line[81];
fin.getline(line, 81); // 从文件中读取一行

打开不存在的文件会错误,用is_open()检查文件是否成功打开:

inFile.open("wtf.txt");
if (!inFile.is_open())
{
  exit(EXIT_FAILURE); // 头文件cstdlib
}
  • 检查文件是否被成功打开很重要。
  • 设计文件读取循环,eof, good

使用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)
{
  // loop body
}

6.9 总结

  • if, if else, switch
  • && || ! ?:
  • cctype分析字符输入
  • ofstream写文件,ifstream读文件

6.10 复习题

6.11 编程练习

1

2 略
3 如果将res使用C风格字符串char res[20],他不能直接赋值(res = “word”),ide会报错“必须是可修改的左值”。这是因为res是数组名,是地址。解决方法是使用strcpy()。

4 略
5 略
6 略
7 不用cin.clear()应该也可以。

8 略
9 略

999.Ref

  1. C中关于“表达式必须是可修改的左值错误”的解决方式:https://blog.csdn.net/qq_18671205/article/details/90109541

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 cdd@ahucd.cn

×

喜欢就点赞,疼爱就打赏

B站 cdd的庇护之地 github itch