C++基础学习之循环分支结构(3)

这里只提一些之前我没怎么用过的一些特性:

类型别名

将byte作为char的别名:

typedef typeName aliasName;
typedef char byte;

基于范围的for循环(C++11)

基于范围的for循环简化了常见的循环任务,对数组(或容器类,如vector和array)的每个元素执行相同的操作。(类似与python中的for i in range(x))

double prices[5] = {4.99, 10.99, 6.87, 7.99, 8.49};
for (double x : prices)
	cout << x << std::endl;

其中,x最初表示数组prices的第一个元素。显示第一个元素后,不断执行循环,而x依次表示数组的其它元素。因此,上述代码显示全部5个元素,每个元素占据一行。总之,该循环显示数组中的每个值。
要修改数组的元素,需要使用不同的循环变量语法:

for (double &x : prices)
	x = x * 0.80;

符号&表明x是一个引用变量,这猴子那个声明让接下来的代码能够修改数组的内容,而第一种语法不能。
还可以结合使用基于范围的for循环和初始化列表:

for (int x : {3, 5, 2, 8, 6})
	cout << x << " ";
cout << '\n';

这种循环主要用于各种模板容器类。

循环和文本输入

cin对象支持3种不同模式的单字符输入,其用户接口各不相同。

使用原始的cin进行输入

#include 
int main()
{
	using namespace std;
	char ch;
	int count = 0;
	cout << "Enter characters; enter # to quit:\n";
	cin << ch;
	while(ch != '#')
	{
		cout << ch;
		++count;
		cin >> ch;
	}
	cout << endl << count << "characters read\n";
	return 0;
}

程序执行:

Enter characters; enter # to quit:
see ken run#really fast
seekenrun
9 characters read

程序中省略了空格,原因在于cin读取char值时,将忽略空格和换行符。因此输入中的空格没有被回显,也没有被包括在计数内。
而且发送给cin的输入被缓冲。也就是说只有在用户按下回车键后,他输入的内容才会被发送给程序。这就是在运行该程序时,可以在#后面输入字符的原因。按下回车键后,整个字符序列将被发送给程序,但程序在遇到#字符后将结束对输入的处理。

使用cin.get(char)

通常,逐个字符读取输入的程序需要检查每个字符,包括空格,制表符和换行符。cin.get(char)可以完成这个功能。
因此上面的程序可以用cin.get(ch)代替cin >> ch,这样就可以保留空格。这个函数和c语言的getchar函数可能有些不同,cin.get(ch)中的参数没有用&ch,这是由于C++中iostream将cin.get(ch)的参数声明为引用类型,因此该函数可以修改其参数的值。

关于一点函数重载的问题

其实cin.get(char)还有其它形式,cin.get(name, ArSize),这样做不对啊,一样的函数参数怎么能不一样呢,数目和类型都不一样。这是由于进行了函数重载,函数重载允许创建多个同名函数,条件是它们的参数列表不同。编译器会自动找到参数复合的函数去调用。

字符函数库cctype的一些应用

// cctype.cpp -- using the cctype.h library
#include 
#include 
int main()
{
	using namespace std;
	cout << "Enter text for analysis, and type @ to terminate input.\n"
	char ch;
	int whitespace = 0;
	int digits = 0;
	int chars = 0;
	int punct = 0;
	int others = 0;
	cin.get(ch);
	while (ch != '@')
	{
		if(isalpha(ch))
			chars++;
		else if(isspace(ch))
			whitespace++;
		else if(isdigit(ch))
			digits++;
		else if(ispunct(ch))
			punct++;
		else
			others++;
		cin.get(ch);
	}
	cout << chars << " letters, "
		 << whitespace << " whitespace, "
		 << digits << " digits, "
		 << punct << "punctuations, "
		 << others << "others.\n";
	return 0;
}

使用cctype库要更加有效方便一些。下面是对其中的一些常用函数的总结:

函数名称 返回值
isalnum() 如果参数是字母或数字,该函数返回ture
isalpha() 如果参数是字母,该函数返回true
iscntrl() 如果参数是控制字符,该函数返回true
isdigit() 如果参数是数字(0~9),该函数返回true
isgraph() 如果参数是除空格之外的打印字符,该函数返回true
islower() 如果参数是小写字母,该函数返回ture
isprint() 如果参数是打印字符(包括空格),该函数返回true
ispunct() 如果参数是标点符号,该函数返回true
isspace() 如果参数是标准空白字符,如空格,进纸,换行符,回车,水平制表符或垂直制表符,该函数返回true
isupper() 如果参数是大写字母,该函数返回true
isxdigit() 如果参数是十六进制数字,即0~9,a~f,或A~F,该函数返回true
tolower() 如果参数是大写字符,则返回其小写,否则返回该参数
toupper() 如果参数是小写字符,则返回其大写,否则返回该函数

写入到文本文件

首先包含头文件fstream
需要声明一个ofstream对象并命名:

ofstream outFile;

然后关联文件进行操作:

outFile.open("fish.txt");
double wt = 125.8;
outFile << wt << endl;
outFile.close();

从文本文件读取

ifstream inFile;
inFile.open("bowling.txt");
double wt;
inFile >> wt;
inFile.close();

你可能感兴趣的:(C++学习)