第六章 分支语句和逻辑运算符
- if语句;
- 逻辑运算符------&&、||和!;
- cctype字符函数库;
- 条件运算符------?:;
- switch语句;
- continue和break语句;
- goto语句
- 读取数字的循环;
- 基本文件输入/输出。
- 问题区
- [条件运算符与if else语句有什么区别?](#条件运算符与if else语句有什么区别?)
- 怎么通过文本文件完成I/O操作?
简单过过,再熟悉不过
题目
条件运算符与if else语句有什么区别?
怎么通过文本文件完成I/O操作?
if语句;
if 的三种结构
if结构
cpp
if (test-condition)
statement
if else结构
cpp
if (test-condition)
statement1
else
statement2
if else if else结构
cpp
if (test-condition)
statement1
if else(test_condition2)
statement2
else
statement3
简单过过
逻辑运算符------&&、||和!;
就是与(and),或(or),非(not)
,在代码中可以直接用and,or,not代替
注意一下运算符优先级,实在记不了就()写到尾。而且啊,明明写()更容易读代码
cctype字符函数库;
就相当于一个工具库,懂有什么功能就行,要用在搜索也可以
分类总结:
- C++继承了C语言的字符函数库,位于头文件
cctype
中,用于简化字符相关的操作,例如判断字符是否为字母、数字、标点符号等。 cctype
库中的函数返回int
类型的值,通常可以将它们视为bool
类型,因为非零值被视为true
,0被视为false
。- 使用
cctype
库中的函数比使用AND和OR运算符更方便和通用。
问题与答案:
- 什么是
cctype
库,它的作用是什么?cctype
库是C++继承自C语言的字符函数库,它包含了一系列函数- 用于判断字符的属性,如是否为字母、数字、标点符号等。它的作用是简化字符相关操作,使其更容易和通用。
- 能判断什么?
- 可以根据以下属性来判断字符的类型:
- 是否为字母数字(字母或数字):
isalnum()
- 是否为字母:
isalpha()
- 是否为控制字符:
iscntrl()
- 是否为数字:
isdigit()
- 是否为除空格之外的打印字符:
isgraph()
- 是否为小写字母:
islower()
- 是否为打印字符(包括空格):
isprint()
- 是否为标点符号:
ispunct()
- 是否为空白字符:
isspace()
- 是否为大写字母:
isupper()
- 是否为十六进制数字:
isxdigit()
- 将字符转换为小写:
tolower()
- 将字符转换为大写:
toupper()
- 是否为字母数字(字母或数字):
- 可以根据以下属性来判断字符的类型:
条件运算符------?:;
怎么说,简简单单啦
总结:
- C++中有一个称为条件运算符(?:)的运算符,它是唯一需要3个操作数的运算符。
- 条件运算符的通用格式为:
expression1 ? expression2 : expression3
。 - 如果
expression1
为true,则整个条件表达式的值为expression2
的值;否则,整个表达式的值为expression3
的值。
问题与答案:
- 条件运算符与if else语句有什么区别?
- 条件运算符生成一个表达式,因此是一个值,可以将其赋给变量或将其嵌套在更大的表达式中,使代码更简洁。而if else语句用于执行代码块,不生成一个值。区别在于条件运算符适用于简单关系和简单表达式,而if else语句更适用于复杂的条件控制流程。
- 如何使用条件运算符来确定两个整数中的较大值?
- int c = a > b ? a : b;
switch语句;
不也是分支吗,多一点点细节而已;
重要概念:
-
switch语句的结构:
-
switch语句的一般格式是:
cppswitch (integer-expression) { case label1: statement(s) case label2: statement(s) // ... default: statement(s) }
-
这个结构允许根据
integer-expression
的值选择不同的执行路径。
-
-
switch语句的工作原理:
- 当程序执行到switch语句时,它会根据
integer-expression
的值跳转到相应的case标签。 - 如果没有匹配的case标签,程序会执行default标签下的语句(如果存在)。
- 如果在case标签中没有break语句,程序将继续执行后续的case标签中的语句。
- 当程序执行到switch语句时,它会根据
-
break语句的作用:
- break语句用于终止switch语句的执行,使程序跳出switch块并继续执行switch后面的语句。
- 如果不使用break语句,程序会执行匹配的case标签及其后续的所有语句。
问题和答案:
-
switch语句与if-else语句相比有什么优势?
- switch语句适用于在多个选项之间进行选择,特别是当选项是整数或字符时。它可以使代码更清晰和易读,而不需要嵌套if-else语句。
-
为什么要使用break语句?
- 使用break语句可以确保在找到匹配的case后立即退出switch块,避免执行后续的case标签。这有助于控制程序的流程。
可以将枚举用于标签
- 使用break语句可以确保在找到匹配的case后立即退出switch块,避免执行后续的case标签。这有助于控制程序的流程。
提示:
如果既可以使用if else语句,也可以使用switch语句,则当选项不少于3个时,应使用switch语句。
continue和break语句;
还能说什么,太简单了,看图就行
goto语句
goto语句:
cpp
char ch;
cin >> ch;
if (ch == 'P')
goto paris;
cout << ...
...
paris: cout << "You've just arrived at Paris.\n";
goto语句允许程序跳转到代码中的标签位置。
在示例中提到了goto paris;,这将使程序跳转到标签paris:处执行代码。
为什么要避免使用goto语句?
使用goto语句会导致代码变得难以理解和维护,因为它允许在代码中跳转到不同的位置,使控制流难以跟踪。
结构化控制语句(如循环和条件语句)提供了更清晰的控制流。
读取数字的循环;
重要概念和可能的问题的总结:
-
cin和输入错误处理:
- 在C++中,可以使用
cin
来读取用户输入,并进行相应的处理。如果用户输入不匹配所期望的类型,cin
会将错误标志设置为failbit
,不匹配的输入将被留在输入队列中;并且进一步的输入将被忽略。
- 在C++中,可以使用
-
清除错误状态:
- 当用户输入不匹配的内容时,需要使用
cin.clear()
来重置cin
的错误状态,以便继续接受输入。这通常是在处理输入错误时的一部分。
- 当用户输入不匹配的内容时,需要使用
-
删除错误输入:
- 使用
cin.get()
来删除输入缓冲区中的错误输入。这样可以确保下一次输入不受之前的错误输入的影响。
- 使用
可能的问题和答案:
-
为什么需要在读取输入之前重置
cin
的错误状态?- 当
cin
的错误状态被设置为failbit
时,它将拒绝进一步的输入。因此,需要使用cin.clear()
来重置错误状态,以便继续读取输入。
- 当
-
为什么要使用内部的
while
循环来删除错误输入?- 内部的
while
循环用于清除输入缓冲区中的错误输入,以确保不会对后续输入产生干扰。这是一种处理输入错误的一般方法。
- 内部的
cpp
while (cin.get() != '\n')
continue; // get rid of bad input
- 如何确定循环何时终止?
- 在示例中,循环在达到最大输入次数时终止。这是通过在循环中维护一个计数器并检查它的值来实现的。还可以使用其他条件来终止循环,例如用户输入特定的终止字符。
基本文件输入/输出。
基本概念:
-
文本I/O和文本文件:
- 文本I/O指的是将数据作为文本(字符编码)进行输入和输出。在C++中,
cin
和cout
等标准流用于文本I/O。文本文件是存储文本数据的文件,其中每个字节都包含字符编码。
- 文本I/O指的是将数据作为文本(字符编码)进行输入和输出。在C++中,
-
数据类型与文本输入:
- 不同的数据类型处理文本输入时,
cin
的行为不同。char
接收字符编码,int
和double
接收数字并将其转换为适当的数据类型,char
数组接收字符编码并存储为字符串。
- 不同的数据类型处理文本输入时,
-
字符数组和
cin.getline()
:- 使用字符数组时,
cin
会将字符编码存储在数组中。使用cin.getline()
时,cin
会读取直到遇到换行符,并将整行文本存储在数组中,以字符串形式。
- 使用字符数组时,
-
文本文件 vs. 二进制文件:
- 文本文件包含字符编码,适合存储文本数据,易于人类阅读。二进制文件存储数据的二进制表示,用于存储非文本数据,如图像、音频等。
-
文本编辑器和源代码文件:
- 文本编辑器用于创建和编辑文本文件,例如代码文件。源代码文件本质上是文本文件,可以使用文本编辑器来查看和编辑。
问题和答案:
-
为什么不同数据类型处理文本输入时,
cin
的行为不同?- 不同数据类型的变量需要不同的数据表示。
cin
会根据变量的数据类型执行适当的转换,将输入文本转换为相应的数据类型。
- 不同数据类型的变量需要不同的数据表示。
-
什么是字符编码?
- 字符编码是将字符映射到数字的规则。常见的字符编码包括ASCII和UTF-8,它们将字符映射到整数值。
-
什么是二进制文件?
- 二进制文件存储数据的二进制表示形式,而不是字符编码。它们通常用于存储非文本数据,如图像、音频和可执行程序。
-
如何创建和编辑文本文件?
- 可以使用文本编辑器(如记事本、vi、emacs等)来创建和编辑文本文件。也可以使用源代码编辑器来编辑源代码文件,因为源代码文件也是文本文件。
-
文本文件和二进制文件有什么区别?
- 文本文件包含字符编码,易于人类阅读,用于存储文本数据。二进制文件包含数据的原始二进制表示,通常用于存储非文本数据。
前面第五章我们说过可以通过重定向 来将文本文件输入
关于文本文件输入的总结:
-
头文件和命名空间:
- 首先,必须包含头文件
<fstream>
来进行文件输入操作。 - 使用命名空间
std
来引用文件输入相关的元素。
- 首先,必须包含头文件
-
创建 ifstream 对象:
- 声明一个
ifstream
对象,用于进行文件输入。您可以选择一个合适的名称,只需遵守 C++ 的命名规则。
- 声明一个
cpp
ifstream inFile; // inFile an ifstream object
ifstream fin; // fin an ifstream object
- 关联文件 :
- 使用
open()
方法将ifstream
对象与特定文件关联。该方法接受文件名作为参数,可以是字符串常量或存储在字符数组中的文件名。
- 使用
cpp
inFile.open("bowling.txt"); // inFile used to read bowling.txt file
char filename[50];
cin >> filename; // user specifies a name
fin.open(filename); // fin used to read specified file
- 读取文件数据 :
- 使用
>>
运算符将各种类型的数据从文件中读取到程序中,就像使用cin
一样。 - 使用
getline()
方法可以读取一行字符。 - 使用
eof()
和fail()
方法来检查输入是否成功。
- 使用
cpp
double wt;
inFile >> wt; // read a number from bowling.txt
char line[81];
fin.getline(line, 81); // read a line of text
-
检查文件是否打开成功:
- 使用
is_open()
方法来检查文件是否成功打开。如果文件无法打开,可以采取适当的措施,如退出程序。
- 使用
-
正确设计输入循环:
- 在进行文件输入循环时,确保正确检查循环终止的条件。使用
good()
方法来判断是否继续读取文件。
- 在进行文件输入循环时,确保正确检查循环终止的条件。使用
问题和答案:
-
为什么需要包含
<fstream>
头文件?<fstream>
头文件包含了用于文件输入操作的相关类和函数的定义,因此必须包含它才能使用文件输入功能。
-
如何创建和命名
ifstream
对象?- 创建
ifstream
对象与创建其他类型的对象类似。您可以为对象选择一个合适的名称,只需遵守 C++ 的命名规则即可。
- 创建
-
如何将
ifstream
对象与文件关联?- 使用
open()
方法,该方法接受文件名作为参数,将ifstream
对象与指定的文件建立关联。
- 使用
-
如何从文件中读取数据?
- 使用
>>
运算符,将数据从文件中读取到程序中。数据的类型可以是各种基本数据类型,如整数、浮点数等。
- 使用
-
如何检查文件是否成功打开?
- 在实际应用中,建议使用
is_open()
方法来检查文件是否成功打开。可以使用条件语句来处理可能的打开错误。
- 在实际应用中,建议使用
cpp
inFile.open("bowling.txt");
if (!inFile.is_open())
{
exit(EXIT_FAILURE);
}
-
如何正确设计输入循环?
- 使用
good()
方法来检查是否继续读取文件。这可确保在读取输入之前先进行检查,并避免不必要的问题。
- 使用
-
如何处理文件中的不同数据类型?
- 程序必须确保文件中的数据类型与程序中的变量类型匹配。如果不匹配,可能会导致输入失败或数据错误。
关于文件输出的总结:
-
头文件和命名空间:
- 首先,需要包含头文件
<fstream>
来进行文件输入/输出操作。 - 使用命名空间
std
来引用文件输出相关的元素。
- 首先,需要包含头文件
-
创建 ofstream 对象:
- 声明一个
ofstream
对象,用于进行文件输出。可以根据需要命名对象,但必须遵循命名规则。
- 声明一个
cpp
ofstream outFile; // outFile an ofstream object
ofstream fout; // fout an ofstream object
- 关联文件 :
- 使用
open()
方法将ofstream
对象与特定文件关联。 - 该方法接受一个文件名作为参数,可以是字符串常量或存储在字符数组中的文件名。
- 使用
cpp
outFile.open("fish.txt"); // outFile used to write to the fish.txt file
char filename[50];
cin >> filename; // user specifies a name
fout.open(filename); // fout used to read specified file
- 输出到文件 :
- 可以使用
ofstream
对象与<<
运算符将各种类型的数据输出到文件,就像使用cout
输出到屏幕一样。
- 可以使用
cpp
double wt = 125.8;
outFile << wt; // write a number to fish.txt
char line[81] = "Objects are closer than they appear.";
fout << line << endl; // write a line of text
- 关闭文件 :
- 使用
close()
方法关闭文件,以确保在程序完成后正确关闭文件。
- 使用
cpp
outFile.close();
可能的问题和答案:
-
为什么需要包含
<fstream>
头文件?<fstream>
头文件包含了用于文件输入/输出操作的相关类和函数的定义,因此必须包含它才能使用文件输出功能。
-
如何创建和命名
ofstream
对象?- 创建
ofstream
对象与创建其他类型的对象类似。您可以为对象选择一个合适的名称,只需遵守 C++ 的命名规则即可。
- 创建
-
如何将
ofstream
对象与文件关联?- 使用
open()
方法,该方法接受文件名作为参数,将ofstream
对象与指定的文件建立关联。
- 使用
-
如何在文件中写入数据?
- 使用
<<
运算符,将数据输出到已关联的文件中。数据的类型可以是各种基本数据类型,以及字符串等。
- 使用
-
为什么需要关闭文件?
- 关闭文件是为了确保数据在文件中正确保存,并释放相关资源。如果不关闭文件,可能会导致文件损坏或数据丢失。
-
如果文件已经存在,会发生什么?
- 默认情况下,如果文件已经存在,使用
open()
方法将首先截断文件,即清空文件内容,然后重新写入数据。这是为了确保文件不包含任何旧数据。但这种行为可以修改,根据需要添加或追加数据而不截断文件。
- 默认情况下,如果文件已经存在,使用
-
如何检查文件打开是否成功?
- 在实际应用中,建议检查
open()
方法是否成功打开文件。可以使用条件语句来检查open()
的返回值,以处理可能的错误情况。
- 在实际应用中,建议检查
问题区
条件运算符与if else语句有什么区别?
- 条件运算符生成一个表达式,因此是一个值,可以将其赋给变量或将其嵌套在更大的表达式中,使代码更简洁。而if else语句用于执行代码块,不生成一个值。区别在于条件运算符适用于简单关系和简单表达式,而if else语句更适用于复杂的条件控制流程。
怎么通过文本文件完成I/O操作?
<fstream>
来进行文件输入/输出操作。