C++ PrimerPlus 复习 第六章 分支语句和逻辑运算符

第一章 命令编译链接文件 make文件

第二章 进入c++

第三章 处理数据

第四章 复合类型 (上)

第四章 复合类型 (下)

第五章 循环和关系表达式

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

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

  • if语句;
  • 逻辑运算符——&&、||和!;
  • cctype字符函数库;
  • 条件运算符——?:;
  • switch语句;
  • continue和break语句;
  • goto语句
  • 读取数字的循环;
  • 基本文件输入/输出。
  • 问题区
  • 条件运算符与if else语句有什么区别?
  • 怎么通过文本文件完成I/O操作?

简单过过,再熟悉不过

题目
条件运算符与if else语句有什么区别?
怎么通过文本文件完成I/O操作?

if语句;

if 的三种结构
if结构

if (test-condition)
 statement

if else结构

if (test-condition)
 statement1
else
 statement2

if else if else结构

if (test-condition)
 statement1
if else(test_condition2)
 statement2
else
 statement3

简单过过

逻辑运算符——&&、||和!;

就是与(and),或(or),非(not),在代码中可以直接用and,or,not代替
注意一下运算符优先级,实在记不了就()写到尾。而且啊,明明写()更容易读代码

cctype字符函数库;

就相当于一个工具库,懂有什么功能就行,要用在搜索也可以
分类总结:

  1. C++继承了C语言的字符函数库,位于头文件cctype中,用于简化字符相关的操作,例如判断字符是否为字母、数字、标点符号等。
  2. cctype库中的函数返回int类型的值,通常可以将它们视为bool类型,因为非零值被视为true,0被视为false
  3. 使用cctype库中的函数比使用AND和OR运算符更方便和通用。

问题与答案:

  1. 什么是cctype库,它的作用是什么?
    • cctype库是C++继承自C语言的字符函数库,它包含了一系列函数
    • 用于判断字符的属性,如是否为字母、数字、标点符号等。它的作用是简化字符相关操作,使其更容易和通用。
  2. 能判断什么?
    • 可以根据以下属性来判断字符的类型:
      • 是否为字母数字(字母或数字):isalnum()
      • 是否为字母:isalpha()
      • 是否为控制字符:iscntrl()
      • 是否为数字:isdigit()
      • 是否为除空格之外的打印字符:isgraph()
      • 是否为小写字母:islower()
      • 是否为打印字符(包括空格):isprint()
      • 是否为标点符号:ispunct()
      • 是否为空白字符:isspace()
      • 是否为大写字母:isupper()
      • 是否为十六进制数字:isxdigit()
      • 将字符转换为小写:tolower()
      • 将字符转换为大写:toupper()

条件运算符——?:;

怎么说,简简单单啦
总结:

  1. C++中有一个称为条件运算符(?:)的运算符,它是唯一需要3个操作数的运算符。
  2. 条件运算符的通用格式为:expression1 ? expression2 : expression3
  3. 如果expression1为true,则整个条件表达式的值为expression2的值;否则,整个表达式的值为expression3的值。

问题与答案:

  1. 条件运算符与if else语句有什么区别?
    • 条件运算符生成一个表达式,因此是一个值,可以将其赋给变量或将其嵌套在更大的表达式中,使代码更简洁。而if else语句用于执行代码块,不生成一个值。区别在于条件运算符适用于简单关系和简单表达式,而if else语句更适用于复杂的条件控制流程。
  2. 如何使用条件运算符来确定两个整数中的较大值?
    • int c = a > b ? a : b;

switch语句;

不也是分支吗,多一点点细节而已;

重要概念:

  1. switch语句的结构

    • switch语句的一般格式是:
      switch (integer-expression)
      {
          case label1: statement(s)
          case label2: statement(s)
          // ...
          default: statement(s)
      }
      
    • 这个结构允许根据integer-expression的值选择不同的执行路径。
  2. switch语句的工作原理

    • 当程序执行到switch语句时,它会根据integer-expression的值跳转到相应的case标签。
    • 如果没有匹配的case标签,程序会执行default标签下的语句(如果存在)。
    • 如果在case标签中没有break语句,程序将继续执行后续的case标签中的语句。
  3. break语句的作用

    • break语句用于终止switch语句的执行,使程序跳出switch块并继续执行switch后面的语句。
    • 如果不使用break语句,程序会执行匹配的case标签及其后续的所有语句。

问题和答案

  1. switch语句与if-else语句相比有什么优势?

    • switch语句适用于在多个选项之间进行选择,特别是当选项是整数或字符时。它可以使代码更清晰和易读,而不需要嵌套if-else语句。
  2. 为什么要使用break语句?

    • 使用break语句可以确保在找到匹配的case后立即退出switch块,避免执行后续的case标签。这有助于控制程序的流程。
      可以将枚举用于标签

提示: 
如果既可以使用if else语句,也可以使用switch语句,则当选项不少于3个时,应使用switch语句。

continue和break语句;

还能说什么,太简单了,看图就行
C++ PrimerPlus 复习 第六章 分支语句和逻辑运算符_第1张图片

goto语句

goto语句:

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语句会导致代码变得难以理解和维护,因为它允许在代码中跳转到不同的位置,使控制流难以跟踪。
结构化控制语句(如循环和条件语句)提供了更清晰的控制流。

读取数字的循环;

重要概念和可能的问题的总结:

  1. cin和输入错误处理

    • 在C++中,可以使用cin来读取用户输入,并进行相应的处理。如果用户输入不匹配所期望的类型,cin会将错误标志设置为failbit,不匹配的输入将被留在输入队列中;并且进一步的输入将被忽略。
  2. 清除错误状态

    • 当用户输入不匹配的内容时,需要使用cin.clear()来重置cin的错误状态,以便继续接受输入。这通常是在处理输入错误时的一部分。
  3. 删除错误输入

    • 使用cin.get()来删除输入缓冲区中的错误输入。这样可以确保下一次输入不受之前的错误输入的影响。

可能的问题和答案

  1. 为什么需要在读取输入之前重置cin的错误状态?

    • cin的错误状态被设置为failbit时,它将拒绝进一步的输入。因此,需要使用cin.clear()来重置错误状态,以便继续读取输入。
  2. 为什么要使用内部的while循环来删除错误输入?

    • 内部的while循环用于清除输入缓冲区中的错误输入,以确保不会对后续输入产生干扰。这是一种处理输入错误的一般方法。
while (cin.get() != '\n')
        continue; // get rid of bad input
  1. 如何确定循环何时终止?
    • 在示例中,循环在达到最大输入次数时终止。这是通过在循环中维护一个计数器并检查它的值来实现的。还可以使用其他条件来终止循环,例如用户输入特定的终止字符。

基本文件输入/输出。

基本概念:

  1. 文本I/O和文本文件

    • 文本I/O指的是将数据作为文本(字符编码)进行输入和输出。在C++中,cincout等标准流用于文本I/O。文本文件是存储文本数据的文件,其中每个字节都包含字符编码。
  2. 数据类型与文本输入

    • 不同的数据类型处理文本输入时,cin的行为不同。char接收字符编码,intdouble接收数字并将其转换为适当的数据类型,char数组接收字符编码并存储为字符串。
  3. 字符数组和cin.getline()

    • 使用字符数组时,cin会将字符编码存储在数组中。使用cin.getline()时,cin会读取直到遇到换行符,并将整行文本存储在数组中,以字符串形式。
  4. 文本文件 vs. 二进制文件

    • 文本文件包含字符编码,适合存储文本数据,易于人类阅读。二进制文件存储数据的二进制表示,用于存储非文本数据,如图像、音频等。
  5. 文本编辑器和源代码文件

    • 文本编辑器用于创建和编辑文本文件,例如代码文件。源代码文件本质上是文本文件,可以使用文本编辑器来查看和编辑。

问题和答案

  1. 为什么不同数据类型处理文本输入时,cin的行为不同?

    • 不同数据类型的变量需要不同的数据表示。cin会根据变量的数据类型执行适当的转换,将输入文本转换为相应的数据类型。
  2. 什么是字符编码?

    • 字符编码是将字符映射到数字的规则。常见的字符编码包括ASCII和UTF-8,它们将字符映射到整数值。
  3. 什么是二进制文件?

    • 二进制文件存储数据的二进制表示形式,而不是字符编码。它们通常用于存储非文本数据,如图像、音频和可执行程序。
  4. 如何创建和编辑文本文件?

    • 可以使用文本编辑器(如记事本、vi、emacs等)来创建和编辑文本文件。也可以使用源代码编辑器来编辑源代码文件,因为源代码文件也是文本文件。
  5. 文本文件和二进制文件有什么区别?

    • 文本文件包含字符编码,易于人类阅读,用于存储文本数据。二进制文件包含数据的原始二进制表示,通常用于存储非文本数据。

前面第五章我们说过可以通过重定向来将文本文件输入
关于文本文件输入的总结

  1. 头文件和命名空间

    • 首先,必须包含头文件 来进行文件输入操作。
    • 使用命名空间 std 来引用文件输入相关的元素。
  2. 创建 ifstream 对象

    • 声明一个 ifstream 对象,用于进行文件输入。您可以选择一个合适的名称,只需遵守 C++ 的命名规则。
ifstream inFile;          // inFile an ifstream object
ifstream fin;             // fin an ifstream object
  1. 关联文件
    • 使用 open() 方法将 ifstream 对象与特定文件关联。该方法接受文件名作为参数,可以是字符串常量或存储在字符数组中的文件名。
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
  1. 读取文件数据
    • 使用 >> 运算符将各种类型的数据从文件中读取到程序中,就像使用 cin 一样。
    • 使用 getline() 方法可以读取一行字符。
    • 使用 eof()fail() 方法来检查输入是否成功。
double wt;
inFile >> wt;          // read a number from bowling.txt
char line[81];
fin.getline(line, 81); // read a line of text
  1. 检查文件是否打开成功

    • 使用 is_open() 方法来检查文件是否成功打开。如果文件无法打开,可以采取适当的措施,如退出程序。
  2. 正确设计输入循环

    • 在进行文件输入循环时,确保正确检查循环终止的条件。使用 good() 方法来判断是否继续读取文件。

问题和答案

  1. 为什么需要包含 头文件?

    • 头文件包含了用于文件输入操作的相关类和函数的定义,因此必须包含它才能使用文件输入功能。
  2. 如何创建和命名 ifstream 对象?

    • 创建 ifstream 对象与创建其他类型的对象类似。您可以为对象选择一个合适的名称,只需遵守 C++ 的命名规则即可。
  3. 如何将 ifstream 对象与文件关联?

    • 使用 open() 方法,该方法接受文件名作为参数,将 ifstream 对象与指定的文件建立关联。
  4. 如何从文件中读取数据?

    • 使用 >> 运算符,将数据从文件中读取到程序中。数据的类型可以是各种基本数据类型,如整数、浮点数等。
  5. 如何检查文件是否成功打开?

    • 在实际应用中,建议使用 is_open() 方法来检查文件是否成功打开。可以使用条件语句来处理可能的打开错误。
inFile.open("bowling.txt");
if (!inFile.is_open())
{
    exit(EXIT_FAILURE);
}
  1. 如何正确设计输入循环?

    • 使用 good() 方法来检查是否继续读取文件。这可确保在读取输入之前先进行检查,并避免不必要的问题。
  2. 如何处理文件中的不同数据类型?

    • 程序必须确保文件中的数据类型与程序中的变量类型匹配。如果不匹配,可能会导致输入失败或数据错误。

关于文件输出的总结

  1. 头文件和命名空间

    • 首先,需要包含头文件 来进行文件输入/输出操作。
    • 使用命名空间 std 来引用文件输出相关的元素。
  2. 创建 ofstream 对象

    • 声明一个 ofstream 对象,用于进行文件输出。可以根据需要命名对象,但必须遵循命名规则。
ofstream outFile;   // outFile an ofstream object
ofstream fout;      // fout an ofstream object
  1. 关联文件
    • 使用 open() 方法将 ofstream 对象与特定文件关联。
    • 该方法接受一个文件名作为参数,可以是字符串常量或存储在字符数组中的文件名。
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
  1. 输出到文件
    • 可以使用 ofstream 对象与 << 运算符将各种类型的数据输出到文件,就像使用 cout 输出到屏幕一样。
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
  1. 关闭文件
    • 使用 close() 方法关闭文件,以确保在程序完成后正确关闭文件。
outFile.close();

可能的问题和答案

  1. 为什么需要包含 头文件?

    • 头文件包含了用于文件输入/输出操作的相关类和函数的定义,因此必须包含它才能使用文件输出功能。
  2. 如何创建和命名 ofstream 对象?

    • 创建 ofstream 对象与创建其他类型的对象类似。您可以为对象选择一个合适的名称,只需遵守 C++ 的命名规则即可。
  3. 如何将 ofstream 对象与文件关联?

    • 使用 open() 方法,该方法接受文件名作为参数,将 ofstream 对象与指定的文件建立关联。
  4. 如何在文件中写入数据?

    • 使用 << 运算符,将数据输出到已关联的文件中。数据的类型可以是各种基本数据类型,以及字符串等。
  5. 为什么需要关闭文件?

    • 关闭文件是为了确保数据在文件中正确保存,并释放相关资源。如果不关闭文件,可能会导致文件损坏或数据丢失。
  6. 如果文件已经存在,会发生什么?

    • 默认情况下,如果文件已经存在,使用 open() 方法将首先截断文件,即清空文件内容,然后重新写入数据。这是为了确保文件不包含任何旧数据。但这种行为可以修改,根据需要添加或追加数据而不截断文件。
  7. 如何检查文件打开是否成功?

    • 在实际应用中,建议检查 open() 方法是否成功打开文件。可以使用条件语句来检查 open() 的返回值,以处理可能的错误情况。

问题区

条件运算符与if else语句有什么区别?

  • 条件运算符生成一个表达式,因此是一个值,可以将其赋给变量或将其嵌套在更大的表达式中,使代码更简洁。而if else语句用于执行代码块,不生成一个值。区别在于条件运算符适用于简单关系和简单表达式,而if else语句更适用于复杂的条件控制流程。

怎么通过文本文件完成I/O操作?

来进行文件输入/输出操作。

你可能感兴趣的:(C++,PrimerPlus复习精炼,c++,开发语言)