美文网首页C++
C++plus6th 第6章_分支和逻辑运算符

C++plus6th 第6章_分支和逻辑运算符

作者: Leon_Geo | 来源:发表于2021-03-21 10:54 被阅读0次

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

    1. 关于cin类用在测试语句中

    • 判等语句:为了能够防止程序员将==错误的写成赋值符=,可以将判等表达式写成value == varible的形式。

    • cin作为输入类可以用到测试表达式中,例如int num; while (cin >> num),其返回值为istream类,该类作为测试条件时自动转换为boolz值(如果正确输入返回真,错误输入返回假,且标记错误后停止输入,并把错误的输入值留在输入缓存队列中),即如果输入的是数字,则表达式cin >> num返回true,如果输入的是字母等其它非数字,则返回false,且置位错误标志,停止输入。此时需要利用cin.clear()函数重置以重新接受新的输入,且在再次输入前,还需要删除输入队列中的错误字符。测试表达式也可以写成连续输入的形式,例如cin >> num1 >> num2

    <pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="c++" cid="n8" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 0px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> int num;
    while (!(cin >> num)) //当输入的是非数字时,cin返回false
    {
    cin.clear(); //重置cin
    while (cin.get() != '\n')
    continue; //删除输入队列中的错误输入
    cout << "please enter a number:" //提示重新输入
    }</pre>

    2.关于逻辑运算符

    • ||或运算符的计算顺序是从左至右的,如果左边的表达式为真,则计算结束,整个表达式取真;若左边的表达式为假,才在产生完所有副作用后计算右边的表达式。

    • &&或运算符的计算顺序也是从左至右的,如果左边的表达式为假,则计算结束,整个表达式取假;若左边的表达式为真,才在产生完所有副作用后计算右边的表达式。

    • 逻辑非!的优先级高于其它逻辑和算术运算符;算术运算符高于&&||运算符;逻辑与&&高于逻辑或||运算符。但为了便于阅读代码,最好还是用括号加以确定。C++确保程序从左至右进行逻辑运算,并在能肯定结果后立刻停止。

    • 标识符and、or、not都是C++的保留字,但不是C的保留字,所以在C中使用它们前需要包含头文件iso646.h

    3.关于字符函数库cctype

    C++通过包含头文件cctype可以继承C语言中的与字符相关的函数软件包:

    字符函数

    4. 输入到文件

    使用文件输出的主要步骤:

    • 包含头文件:#include <fstream>,其定义了一个用于处理输入的ofstream类。

    • 声明std命名空间;使用编译指令using或前缀std::。

    • 声明一个或多个ofstream对象,并对其命名。

    • 将该ofstream对象同一个文件名关联起来,方法之一就是用open()方法。

    • 就像使用cout那样使用该ofstream对象(如结合<<、endl、setf()、precision()等),但在使用完毕后要用close()方法将其关闭。

    虽然头文件iostream提供了一个预先定义好的名为cout的ostream对象,但我们在操作文件时必须声明自己的ofstream对象,并为其命名,将其同文件关联起来。此后便可以像使用cout那样使用它,所有可用于cout的操作和方法都可用于它。

    <pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="c++" cid="n37" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 0px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> #include <iostream>

    include <fstream>

    int main()
    {
    using namespace std;

    ofstream outFile;
    outFile.open("my.txt"); // 若文件存在,则打开并将其长度截断为0,否则创建它。
    outFile << "hello world!\n" << endl;
    outFile.close();

    char yourfilename[50];
    int i = 10;
    ofstream fout;
    cin >> yourfilename;
    fout.open(yourfilename);
    fout << i;
    fout.close();

    return 0;
    }</pre>

    5. 使用文件输出

    • 必须包含头文件fstream,其定义了一个用于处理输入的ifstream类。

    • 需要申明一个或多个ifstream变量(对象),并以自己喜欢的方式对其进行命名。

    • 必须指明名称空间std。

    • 需要将ifstream变量与文件关联起来。方法之一就是使用open()方法 。

    • 使用is_open方法检查文件是否成功打开,经常会出现“指定的文件不存在、文件目录不正确、访问被拒绝、文件名输入错误、省略了文件扩展名“等错误。

    • 使用完文件后,必须使用close()方法将其关闭。

    • 可以结合使用ifstream变量和运算符>>来读取各种类型的数据。

    • 可以结合使用ifstream变量和get()方法来读取一个字符,和getline()方法读取一行字符串。

    • 结合使用ifstream变量和eof()、fail()等方法来判断输入是否成功。

    • ifstream变量本身被用作测试条件时,如果最后一个读取操作成功,它将被转换为布尔值true,否则被转换为false。

    虽然头文件iostream提供了一个预先定义好的名为cin的istream对象,但我们在操作文件时必须声明自己的ifstream对象,并为其命名,将其同文件关联起来。此后便可以像使用cin那样使用它。所有可用于cin的操作和方法都可用于它。

    <pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="c++" cid="n62" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 0px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> ifstream fin;
    fin.open("bowling.txt");
    或者
    char filename[50];
    cin >> filename;
    fin.open(filename);

    if (!fin.is_open()) // if fail to open, then exit.
    {
    exit(EXIT_FALLURE); // must include "cstdlib",which contan "exit()".
    }

    char line[81];
    fin.getline(line, 81); //read a line of text from fin
    或者
    double wt;

    fin >> wt; //Get the first value from fin which is "bowling.txt"
    while (fin.good())
    {
    ...
    fin >> wt; //Get the next value
    }
    或者
    while (fin >> wt) //测试表达式的结果为fin,其再需要一个bool值的情况下,
    { //fin的结果为fin.good(),即返回true或false.
    ...
    }

    if (fin.eof())
    cout << "End of file reached.\n";
    else if(fin.fail())
    cout << "Input terminated by data mismatch.\n";
    else
    cout << "Input terminated for unknown reason.\n";

    fin.close();
    return 0;</pre>

    如果你的编译器不支持is_open()方法,那么可以使用老的good()方法来替代它。但good()方法在检查可能存在的问题方面没有is_open()那么广泛。

    • 方法eof()在遇到文件尾EOF时将返回true;
    • 方法fail()在遇到文件尾EOF或读取的类型与左值不匹配时返回true;
    • 方法bad()在遇到文件受损或硬件故障时返回True;
    • 方法good()在没有发生任何问题时返回true.

    因此,由于good()在没有任何问题时返回真,所以一般先使用good()判断读取成功否。因为eof()只能判断是否到达EOF,而fail()可以检查EOF和类型不匹配,因此如果good()返回假,那接着要判断是否到达文件尾,这样当执行到了fail()测试返回真,便可断定导致循环终止的原因是类型不匹配。同理,如果fail()返回假,那就是其它原因导致的循环终止。

    警告:Windows文本文件的每行都以回车加换行结尾;C++在读取文件时自动将这2个字符转换为换行符,并在写入Windows文件时执行相反的转换。有些文本编辑器(Metrowerks Code Warrior IDE),不会在最后一行末尾加上换行符。因此,建议大家在输完最后一行文本后,按下回车键再保存关闭。

    相关文章

      网友评论

        本文标题:C++plus6th 第6章_分支和逻辑运算符

        本文链接:https://www.haomeiwen.com/subject/qzsncltx.html