第六章 分支语句和逻辑运算符
- if语句;
- 逻辑运算符------&&、||和!;
- cctype字符函数库;
- 条件运算符------?:;
- switch语句;
- continue和break语句;
- goto语句
- 读取数字的循环;
- 基本文件输入/输出。
- 问题区
- [条件运算符与if else语句有什么区别?](#条件运算符与if else语句有什么区别?)
- 怎么通过文本文件完成I/O操作?
简单过过,再熟悉不过
题目
条件运算符与if else语句有什么区别?
怎么通过文本文件完成I/O操作?
if语句;
if 的三种结构
if结构
            
            
              cpp
              
              
            
          
          if (test-condition)
 statementif else结构
            
            
              cpp
              
              
            
          
          if (test-condition)
 statement1
else
 statement2if 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> 来进行文件输入/输出操作。