文章目录
前言
本人在阅读C++ primer plus(第六版)的过程中做的笔记,写这篇文章既是为了分享,也是为了以后查阅。以下是本篇文章正式内容。
一、逻辑表达式
逻辑OR运算符||的优先级比关系运算符低,||运算符是个顺序点,也就是先修改左侧的值再对右侧的值进行判定。逻辑AND运算符&&的优先级也比关系运算符低,也是个顺序点,如果左侧的值是false,则不会对右侧的值进行判定。逻辑NOT运算符!的优先级比所有关系运算符和算术运算符都高,优先级:非>算术运算符>关系运算符>与>或>逻辑运算符。
在if语句中使用取值范围时不能这样使用:if (17 < age < 35); 编译器不会捕获这种错误,因为这是有效的C++语法。<运算符是从左到右结合的,原来的语句就相当于if ((17 < age) < 35),17 < age的值要么为0要么为1,不管怎样都比35小,所以表达式的结果总为1;
二、字符函数库cctype
C++从C语言中继承了一个与字符相关的、非常方便的函数包,它可以简化诸如确定字符是大写字母、数字、标点符号等工作。这些函数的原型是在头文件cctype中定义的,其返回类型是int而不是bool。
三、? : 运算符
?:运算符常被用来代替if else语句,是C++中唯一一个需要三个操作数的运算符。该运算符的通用格式如下:
expression1 ? expression2 : expression3;
int c = a > b ? a : b;
如果a>b,则把a的值赋给c,否则把b的值赋给c。
四、switch语句
switch语句的通用格式:
switch (integer-expression)
{
case label1 : statement(s)
case label2 : statement(s)
…
default : statement(s)
}
inter-expression必须是一个结果为整数的表达式,而且每个标签都必须是整数常量表达式,例如int、char常量或枚举量。
五、break语句和continue语句
break结束循环而跳到循环体后面的语句处执行,continue结束本轮循环而开始下一轮新的循环。
六、读取数字的循环
有下面的代码:
int n;
cin >> n;
当输入一个单词而不是数字时,发生这种类型不匹配的情况时,将会有4种情况:
(1)n的值不改变;
(2)不匹配的输入被保留在输入队列中;
(3)cin对象中的一个错误标记被设置;
(4)对cin方法的调用将返回false;
cin对象中的一个错误标记被设置意味着程序将不能再读取输入,必须重置该标记才能继续读取输入,clear()方法重置该标记,同时也重置文件尾。分析下面代码:
#include<iostream>
using namespace std;
const int Max = 5;
int main()
{
cout << "输入" << Max << "次高尔夫的成绩。\n";
float golf[Max];
for (int i = 0; i < Max; i++)
{
cout << "round #" << i + 1 << ":";
while (!(cin >> golf[i])) //当输入的不是数字时,测试结果为真
{
cin.clear(); //重置cin对象中的错误标记,使程序可以继续读取输入
while (cin.get() != '\n') //读取保留在输入队列中的错误输入,以将其清除
continue;
cout << "只能输入数字!\n";
cout << "round #" << i + 1 << ":";
}
}
float total = 0;
for (int i = 0; i < Max; i++)
{
total = total + golf[i];
}
float average = total / Max;
cout << Max << "次平均成绩为:" << average << endl;
return 0;
}
七、简单文件的输入输出
1.写入到文本文件中
- 必须包含头文件fstream;
- 头文件fstream定义了一个用于处理输出的ofstream类;
- 需要声明一个或多个ofstream对象;
- 必须指明名称空间std;
- 需要将ofstream对象与文件关联起来,方法之一是使用open()方法;
- 使用完文件后应使用方法close()将其关闭;
- 可结合使用ofstream对象和运算符<<来输出各种类型的数据。
ofstream对象的声明:
ofstream outFile;
ofstream fout;
将ofstream对象与特定文件关联起来:
outFile.open(“fish.txt”);
char filename[50];
cin >> filename;
fout.open(filename);
方法open()使用一个C风格字符串作为参数,这可以是一个字面字符串,也可以是一个存储在数组中的字符串。
ofstream对象的使用:
double wt = 125.8;
outFile << wt;
char line[81] = “Objects are closer than they appear.”;
fout << line << endl;
声明一个ofstream对象并将其与特定文件关联起来后,便可以像使用cout一样使用它。
使用文件输出的步骤如下:
(1)包含头文件fstream;
(2)创建一个ofstream对象;
(3)将ofstream对象与一个文件关联起来;
(4)就像使用cout一样使用ofstream对象。
如果在程序运行之前与outFile关联的文件(例如automobileInformation.txt)已经存在,则open()方法将会丢弃automobileInformation.txt中原有的内容,然后将新的内容输入到文件中。分析下面代码:
#include<iostream>
#include<fstream> //包含了ofstream类
#include<string>
using namespace std;
int main()
{
ofstream outFile; //创建ofstream类对象outFile,可以像使用cout那样使用outFile
outFile.open("automobileInformation.txt"); //将outFile对象与文本文件关联
string automobile;
int year;
double o_price, l_price;
cout << "Enter the make and model of automobile: ";
getline(cin, automobile);
cout << "Enter the model year: ";
cin >> year;
cout << "Enter the original price: ";
cin >> o_price;
l_price = o_price * 0.913;
outFile << fixed;
outFile.precision(2);
outFile.setf(ios_base::showpoint);
outFile << "The make and model of automobile: " << automobile << endl;
outFile << "The model year: " << year << endl;
outFile << "The last price: " << l_price << endl;
outFile.close();
return 0;
}
2.读取文本文件
- 必须包含头文件fstream;
- fstream定义了一个用于处理输入的ifstream类;
- 声明ifstream对象;
- 将ifstream对象与特定文件关联起来,方法之一是使用open()方法;
- 使用完文件后用close()方法将其关闭;
- 可结合使用ifstream对象和运算符>>来读取各种类型的数据;
- 可结合使用ifstream对象和eof()、fail()等方法来判断输入是否成功。
ifstream对象的声明:
ifstream inFile;
ifstream fin;
与特定文件关联:
inFile.open(“bowling.txt”);
char filename[50];
cin >> filename;
fin.open(filename);
open()方法接受一个C风格字符串作为参数,这可以是一个字面字符串也可以是存储在数组中的字符串。
double dw;
inFile >> dw;
char line[81];
fin.getline(line, 81);
将ifstream对象与文件关联起来后,便可以像使用cin那样使用ifstream对象(inFile或者fin)。
如果试图读取一个不存在的文本文件,则会导致读取失败。检查文件是否被成功代开的首选方法是is_open(),则可以像下面这样使用:
inFile.open(“bowling.txt”);
if (!is_open())
{
exit(EXIT_FAILURE);
}
函数exit()的原型是在头文件cstdlib中定义的,该头文件中还定义了一个与操作系统通信的参数值EXIT_FAILURE,函数exit()终止程序。如果编译器不支持is_open()方法,可以使用good()方法代替。
如果最后一次读取数据时遇到EOF,方法eof()返回true;如果最后一次读取数据时发生了类型不匹配的情况,方法fail()返回true(遇到EOF时方法fail()也会返回true);如果文件受损或硬盘故障,方法bad()返回true;如果没有发生任何错误,方法good()返回true。
另外需要注意的是,被读取的文件内容确保是以回车键结尾的。
分析下面代码,代码中scores.txt文件内容可以参考下图(注意文件最后一个字符是换行):
#include<iostream>
#include<fstream>
#include<cstdlib> //这个头文件包含了exit()函数原型和EXIT_FAILURE参数值用于和操作系统通信
using namespace std;
int main()
{
double score;
double average;
int count = 0;
double sum = 0.0;
ifstream inFile; //声明ifstream对象inFile
inFile.open("scores.txt"); //将inFile与文件关联,可以像使用cin那样使用inFile
if (!inFile.is_open()) //检查文件是否被正确打开
{
cout << "文件打开失败!\n";
exit(EXIT_FAILURE); //终止程序
}
inFile >> score;
while (inFile.good()) //如果读取数据时没有发生任何错误,good()方法返回true
{
count++;
sum = sum + score;
inFile >> score;
}
if (inFile.eof()) //最后一次读取时到达文件尾,eof()方法返回true
cout << "到达文件尾,读取成功\n";
else if (inFile.fail()) //最后一次读取时发生类型不匹配,fail()方法返回true
cout << "读取类型不匹配,读取失败\n";
else if (inFile.bad()) //文件受损或者硬盘故障,bad()方法返回true
cout << "文件受损或硬盘故障,读取失败\n";
else
cout << "未知原因,读取失败\n";
if (count == 0)
cout << "未读取到任何内容!\n";
else
{
cout << "count = " << count << endl;
cout << "sum = " << sum << endl;
average = sum / count;
cout << "average = " << average << endl;
}
inFile.close(); //关闭文件
return 0;
}
总结
以上就是本文的内容——逻辑表达式、字符函数库cctype、?:运算符、switch语句、break语句和continue语句、读取数字的循环和简单文件的输入输出。