C++学习 第五,六章

本文详细介绍了C++中的循环结构,包括for、while、do while循环,以及循环控制语句如break和continue。同时讲解了C++11的范围for循环和嵌套循环,以及如何处理用户输入和文件I/O。此外,还涵盖了条件分支语句、逻辑运算符、字符函数库cctype和三目运算符等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.for循环

int limit;
int i;
//for循环的实现方式 通常C++会在for和括号之间加一个空格 而省略函数名和括号的空格
for (i = limit; i; i--)
	cout << "i = " << i << "\n" << endl;

//cout.setf()用法
cout.setf(ios::boolalpha) 
//表示设置一个标记,使布尔类型的量用字母显示而非0或者1

//C++中的一种新式的for句法规则
for(int i = 0; i<4 ;i++)
	cout << i;
//这种表达方法的好处是在循环结束只会变量i就会消失

2.递增递减运算符

a++ //意味着使用a的当前值计算表达式 然后将a的值加1
++a //意味着先将a的值加1 然后再计算表达式
--a  //同上
a--  //同上
*++pt //表示pt先进行自增,然后使用解除引用运算符
++*pt //表示先取得pt指向的值,然后将其进行自增
(*pt)++//表示先取得pt的值进行运算,然后将其自增
*pt++ //由于++的优先级更高 所以先进行地址自增 然后进行解除引用

3.逗号运算符(for循环代码块)
语句块允许把两条或者更多条语句放到按C++句法只能放一条语句的地方,逗号表达式也能完成同样的任务。其次,逗号表达式最常见的用途是将两个或更多的表达式放入for语句中,不够C++还为这个运算符提供了另外两个特性:首先它确保先计算第一个表达式,其次它规定逗号运算符的结果是第二个表达式的结果。

//代码片和逗号运算符
#include<iostream>
#include<string>
int main()
{
	using namespace std;
	cout << "Enter a word :" ;
	string word;
	cin >> word;
	char temp;
	int i,j;
	for(j = 0,i = word.size() - 1; j < i; --i,++j) //逗号运算符
	{
		temp = word[i];
		word[i] = word[j];
		word[j] = temp;
	} //代码块
	cout << word << "\nDone" <<endl;
	return 0;
}
//逗号运算符的结果
i = 20 , j = i *2
//这个表达式的结果是40

2.while循环

//while循环 和C中的while循环类似
#include<iostream>
#include<string>
using namespace std;
int main()
{
	string str1;
	cin >> str1;
	int i = 0;
	while(str1[i])
	{
		cout << str1[i] << " " << int(str1[i]) << endl;
		i++;
	}
	return 0;
}

3.while循环和for循环的三个差别

  1. 在for循环中省略测试条件时,将认为条件为true
  2. 在for循环中,可使用初始化语句声明一个局部变量,但是while不可以
  3. 如果循环体中有continue语句,情况将稍有不同

4.延时函数(C++的ctime库)
CLOCKS_PER_SEC :系统时间转换为秒数的参数
系统时间单位数/CLOCKS_PER_SEC = 秒数
秒数 * CLOCKS_PER_SEC = 系统时间数

//利用ctime库延时指定时间
#include<iostream>
#include<ctime>
using namespace std;
int main()
{
	float secs;
	cin >> secs;
	clock_t delay;
	delay = secs * CLOCKS_PER_SEC;
	clock_t start = clock();
	while(clock() - delay < start);
	cout << "Time's Up!" << endl;
	return 0;
}

注意:clcok()函数返回的类型是clock_t类型的变量,如果要与其进行算数运算,我们要定义的变量类型也应该是clock_t类型的。
5.类型别名

  1. 使用#define来定义类型别名
  2. 使用typedef来定义类型别名
//方法一
#define BYTE char
//这样预编译器会在编译的时候把所有的BYTE替换为char
//BYTE也就成了char的别名

//方法二
typedef char byte;
//这种方式是通过typedef关键字来创建别名
//这种方式要比预定义方式要高级
//因为预定义方式在给指针做别名的时候可能会出错
//typedef并不会有这种问题,所以typedef是更好的选择

//例子
typedef char* char_point;
char_point pa,pb; //pa,pb都是char类型的指针

#define float_point float*
float_point pa,pb; //pa是float类型指针,pb是普通变量

6.do while循环
do while循环和for循环,while循环的区别在于,do while循环是出口条件循环,而for循环和while循环都是入口条件循环。
出口条件循环的使用一般是在需要预先获得用户输入,然后再进行判断的时候。比如根据输入判断成绩是否合格,或者是猜你最喜欢的数字。

//猜数字--简单的do while循环
#include<iostream>
using namespace std;
int main()
{
	int num;
	do
	{
		cin >> num;
	}
	while(num != 8);
	cout << "Right!" << endl;
	return 0;
}

7.C++11的范围for循环
基于范围的for循环一般用于简化数组或容器类每个元素执行相同命令的操作。
下面介绍基本的句法:

//将列表的内容显示再屏幕上
for(int x : {3,5,7,6,9})
	cout << x << " ";
cout << endl;

for(double &x : prices)
	x = x *0.80;
//符号& 表明x是一个引用变量,只有这种方式 x才能对prices中的值进行修改

8.循环和文本输入
1.使用原始的cin进行输入
使用这种方式进行输入会导致,cin将忽略换行符以及空格,更为复杂的是,发送给cin的内容会被缓冲,只有用户按下回车键的时候,内容才会被发送给程序,这也导致了即使遇到了哨兵字符,用户仍可以继续输入的原因。

#include<iostream>
using namespace std;
int main()
{
	int count = 0;
	char cr;
	cin >> cr;
	while(cr != '#')
	{
		count++;
		cout << cr << " ";
		cin >> cr;
	}
	cout << count << endl;
}

2.逐个字符读取输入,一般来说不应该忽略换行符和空格以及制表符,而上面原始的cin并不能满足要求,,istream类中有一个成员函数cin.get(ch)能满足我们的要求,【cin.get()是老朋友了,之前我们再读取整行的时候介绍过它】,在没有参数(或者只有一个参数)的时候,它会读取一个字符,无论他是什么字符,使用它来替换上个程序的cin >> ch 会得到比刚才好的效果。

#include<iostream>
using namespace std;
int main()
{
	int count = 0;
	char cr;
	cin.get(cr);
	while(cr != '#')
	{
		count++;
		cout << cr << " ";
		cin.get(cr);
	}
	cout << count << endl;
}

9.嵌套循环和二维数组

//二维数组的创建方式
int maxtemps[4][5];
//这表示maxtemps是一个拥有四个元素的数组
//每个元素是一个拥有五个元素的数组
//也就是可以看作数组由四行组成,每行有五个值
//打印二维数组所有内容
int maxtemps[4][5];
for(int i = 0; i<4; i++)
	for(int j = 0; j<5; j++)
		cout << maxtemps[i][j] << endl;

//初始化二维数组
int maxtemps[4][5] = {
						{1, 2, 3, 4, 5},
						{6, 7, 8, 9, 10},
						{11, 12, 13, 14, 15},
						{16, 17, 18, 19, 20}
					};
//字符串指针数组
const int Cities = 5;
const char* cities[Cities] = 
{
	"Beijing",
	"Shanghai",
	"Tianjin",
	"Shenzhen",
	"Fushun"
};
//这是一个char型的指针数组,这样每一个元素都是字符串的地址,字符串代表的是地址。

//string类型
//如果希望字符串可修改 需要去掉const常量限定符 
const string cities[Cities] = 
{
	"Beijing",
	"Shanghai",
	"Tianjin",
	"Shenzhen",
	"Fushun"
};

//char型数组类型 
//一个五个元素的字节数组
//每个字节数组是一个由五个字节数组组成的数组
const char cities[Cities][50] = 
{
	"Beijing",
	"Shanghai",
	"Tianjin",
	"Shenzhen",
	"Fushun"
};

10.条件分支语句

int num = 7;
//if语句
if (num == 7)
	cout << "Yeah!" << endl;
	
//if-else语句
if (num == 7)
	cout << "Yeah!" << endl;
else
	cout << "Oh NO!" << endl;

//if-else if-else语句
if (num == 7)
	cout << "Yeah!" << endl;
else if (num == 6)
	cout << "Close!" << endl;
else
	cout << "Oh NO!" << endl;

11.逻辑运算符

名称符号另一种表达形式
&& (优先级高于或)and
||()or
!(优先级最高)not

12.字符函数库 cctype
这些函数的原型是在头文件cctype中定义的

#include<iostream>
#include<cctype>
int main()
{
	using namespace std;
	cout << "Enter text for analysis ,and type @" 
			" to terminate input" << endl;
	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)) //cctype中的函数 判断是否为字母
			chars++;
		else if(ispunct(ch)) //判断是否为标点符号
			punct++;
		else if(isdigit(ch)) //判断是否为数字
			digits++;
		else if(isspace(ch)) //是否为空格
			whitespace++;
		else
			others++;
		cin.get(ch)
	} 
	cout << "alpha num\t" << chars << endl;
	cout << "punct num\t" << punct << endl;
	cout << "digits num\t" << digits << endl;
	cout << "whitespace num\t" << whitespace << endl;
	cout << "others num\t" << others << endl;
	return 0;
}
函数名称作用
isalnum()如果是字母或者数字,返回true
isalpha()如果是字母,返回true
isdigit()如果是数字,返回true
iscntrl()如果是控制字符,返回true
isgraph()如果是除了空格外的打印字符,返回true
islower()如果是小写字母,返回true
isprint()如果是打印字符,返回true
isspace()如果是标准空白字符(空格 进纸 换行 回车 水平制表符 垂直制表符),返回true
issupper()如果是大写字母,返回true
isxdigit()如果是十六进制数字,返回true
tolower()如果大写字母,返回其小写,否则返回该参数
tosupper()如果小写字母,返回其大写,否则返回该参数

13.三目运算符 ?:

// 表达式1?表达式2:表达式3
//表达式1为真 执行2 否则执行3
//等价于
/*
if 表达式1
	表达式2
else
	表达式3
*/

14.switch语句
适用于大型列表的选择,比如菜单,功能选择。
注意:switch中的表达式必须是整数值表达式,case中的表达式,必须是整数常量表达式,一般来说case中的值一般是整数,字符,或者枚举类型。

#include<iostream>
using namespace std;
int main()
{
	int num;
	cin >> num;
	//switch作为分支选择,会以此执行case语句
	//如果本case语句成立,则本case语句后的所有语句都会被执行
	//除了default,但是加上break可以跳出
	switch (num)
	{
		case 1 : cout << 'apple';
				 break;
		case 2 : cout << 'banana';
				 break;
		case 3 : cout << 'pear';
				 break;
		default: cout << "Nothing"
	}
	return 0;
}
//switch 与 枚举类型
#include<iostream>
using namespace std;
//枚举类型 在没有特殊声明的时候,按顺序为0~6
emum {red,orange,yellow,green,blue,violet,indigo};
int main()
{
	cout << "Enter color code(0-6): ";
	int code;
	cin >> code;
	while (code >= red && code <= indigo)
	{
		switch (code)
		{
			case red : cout << "red" <<endl; break;
			case orange: cout << "orange" <<endl; break;
			case yellow: cout << "yellow" <<endl; break;
			case green: cout << "green" <<endl; break;
			case blue : cout << "blue" <<endl; break;
			case violet: cout << "violet" <<endl; break;
			case indigo : cout << "indigo" <<endl; break;			
		}
	cout << "Enter color code(0-6): ";
	cin >> code;
	}
	return 0;
}

15.break 和 continue
break:直接跳出循环或者选择
continue:跳过剩余语句,开始新一轮循环
16.读取数字的循环

  • 注意:如果逻辑与表达式左侧的表达式已经为false,则系统不会再计算右侧的表达式,而是直接返回false.
  • 注意:当程序发现输入内容和要求内容不匹配的时候,cin返回的cin对象在作为表达式的时候,会转换为布尔型的false。而且不会执行写入操作,只有返回结果是true的时候才会写入。
  • 注意:当写入内容不满足程序要求的时候,cin对象的错误标记会被设置,如果不清除掉这个设置的话,系统不会再执行任何读入操作,而这个标志需要通过cin.clear()来重置。
//读取高尔夫的成绩,并且计算总分,要求高尔夫的成绩一定是数字
#include<iostream>
using namespace std;
int main()
{
	const int MAX = 5;
	int golf[MAX];
	cout << "Please enter your golf scores : " << endl;
	for(int i = 0; i < MAX; i++)
	{
		cout << "Golf score #" << i+1 << ":" ;
		while(!(cin >> golf[i]))
		{
			cin.clear();
			while(cin.get() != '\n')
				continue;
			cout<<"\nPlease enter a number: ";
		}
	}
	int total = 0;
	for(int j = 0; j < MAX; j++)
	{
		total += golf[j];
	}
	return 0;	
}

17.简单文件输入输出
文本IO:在使用cin进行输入的时候,程序将输入视为一系列字节,其中每个字节都被解释为字符的编码,无论目标数据类型是什么,输入一开始都是字符数据—文本数据。然后通过cin对象将文本数据转化为目标类型。
输入内容为 37.5 85.2
目标类型为字符型的时候:

char ch;
cin >> ch;
//此时,输入行中第一个字符被赋值给ch,第一个字符为3
//则他的字符编码(二进制)被存放在ch变量之中
//注意这里存储的不是3,而是3的字符编码
//由于目标格式和原格式相同所以不需要进行任何转换

目标类型为int型的时候:

int ch;
cin >> ch;
//此时,cin会不断读取,知道遇见第一个不是数字的字符
//也就是遇到了.的时候停止,它读取了3和7
//cin会进行计算,计算得出对应字符编码的是数值37
//因此将37的二进制编码复制到ch之中

目标类型为double型的时候:

double ch;
cin >> ch;
//此时,cin会不断读取,直到遇到第一个不属于浮点数的字符。
//也就是说它会读取3,7,'.',5,遇到空格的时候停下
//然后cin会进行计算,得出这四个字符对应的是37.5的浮点数
//因此将37.5的二进制编码复制给ch

目标类型为字符数组的时候:

char ch[50];
cin  >> ch;
//此时,cin会不断读取,直到遇到第一个空白字符。
//也就是说他会读取3,7,'.',5,遇到空格的时候停下
//然后cin会将这四个字符的字节编码存储到数组中

18.写入到文本文件中
文件输出的基本要求

  • 必须包含头文件 fstream
  • 头文件fstream定义了一个用于处理输出的ofstream类
  • 需要声明一个或多个ofstream变量,并以自己喜欢的方式对其命名,条件是遵守常用的命名规则
  • 必须指明命名空间std
  • 需要将ofstream对象和文件关联起来,方法之一就是使用open()方法
  • 使用过文件之后需要将文件通过close()方法关闭
  • 可结合使用ofstream对象和运算符<<来输出各种类型数据
//必须自己声明ofstream对象
ofstream fout;
//使用时需要将其与文件关联
fout.open("fish.txt");

//使用方式
//将一个double类型变量写入到文件中
double wt = 25.52;
fout << wt << endl;
//将一个字符数组写入到文件中
char word[50] = "Edge is a silly browser!!!";
fout << word << endl;

注意:iostream中帮我们预先声明了cout,而fstream并没有,所以我们需要自己命名一个ofstream变量,然后使用它。幸运的是,cout和我们的fout并没有区别,以至于大多数cout的方法在fout中也可以使用。
19.读取文本文件

  • 必须包含头文件 fstream
  • 头文件fstream定义了一个用于处理输出的ifstream类
  • 需要声明一个或多个ofstream变量,并以自己喜欢的方式对其命名,条件是遵守常用的命名规则
  • 必须指明命名空间std
  • 需要将ofstream对象和文件关联起来,方法之一就是使用open()方法
  • 使用过文件之后需要将文件通过close()方法关闭
  • 可结合使用ifstream对象和运算符>>来输出各种类型数据
  • 可以使用ifstream对象和get()来读取一个字符,getline()方法来读取一行字符
  • 可以结合使用eof() fail()方法来判断读取是否成功
  • ifstream对象本身被用作测试条件的时候,如果最后一个读取操作成功,他将被转换为布尔值true,否则被转换为false
//声明 与 文件关联
ifstream fin;
fin.open("fish.txt");
//使用方式
double wt;
fin >> wt;
char word[50];
fin.getline(word,50);

//检查文件是否打开 is_open()
fin.open("fish.txt");
if(!fin.is_open())
{
	//EXIT_FAILURE为参数值,用于同系统通信,exit()用于终止程序
	exit(EXIT_FAILURE)
}
//一个从文件中读取成绩并计算平均值的程序
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main()
{
	//定义一个ifstream变量
	ifstream fin;
	//定义一个存储文件名的变量
	string fileName;
	//用户输入文件名
	cin.getline(fileName,80);
	//关联文件
	fin.open(fileName);
	//判断文件是否打开
	if (!fin.is_open())
	{
		cout << "Could not open the file!!" << endl;
		exit(EXIT_FAILURE);
	}
	//定义存储平均值的变量
	double score = 0.0;
	double i;
	int count = 0;
	//fin >> i 作为布尔类型 来代替fin.good()
	while (fin >> i)
	{
		count++;
		score += i;
	}
	//判断错误类型
	if(fin.eof())
	{
		cout << "EOF!" << endl;
	}
	else if(fin.fail())
	{
		cout << "FAIL!" << endl;
	}
	else
		count << "UNKNOWN!" << endl;
	if (count == 0)
	{
		cout << "NOBODY!" << endl;
	}
	else
	{
		cout << score/count << endl;
	}
	fin.close()
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值