C++(学习笔记)分支语句和逻辑运算符


前言

  本人在阅读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。
cctype

三、? : 运算符

  ?:运算符常被用来代替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文件内容可以参考下图(注意文件最后一个字符是换行):
    scores.txt
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语句、读取数字的循环和简单文件的输入输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值