C++Primer【1-16】 输入流作为判断条件与循环(while/for)和if语句的配合使用

1.for和while循环的优缺点【P13 练习1.14】

①for循环:循环变量的初始化和修改都在语句头部分,形式较简洁,且特别用于循环次数已知的情况下;

②while循环:循环控制变量的初始化一般在while语句之前,而修改则一般在函数体中,形式上不如for简洁,较适用于循环次数不易预知的情况(用某一条件来控制循环)。

:功能上是等价的,两者可以互换,即:for循环也可用于循环次数不易预知的情况下。(可参考2.)    


2.分别用while和for循环读取数量不定的输入数据[P13 &练习1.16]

①while循环实现

#include
int main()
{
	int sum=0,value=0;
	while(std::cin>>value)
		sum+=value;
	std::cout<<"Sum is"<<sum<<std::endl;
	return 0;
}

  • while循环中实际上检测的是istream(流)。当使用一个istream对象作为条件时,其效果是检测流的状态。如果流是有效的,即流未遇到错误,那么检测成功。否则,当遇到:①文件结束符(end-of-file),或②遇到一个无效的输入时(例如在这里,读入的值不是一个int型数据),istream对象的状态就会变为无效。处于无效状态的istream对象会是条件变为假。
  • while循环会一直执行直到遇到文件结束(或输入错误),while循环体使用复合赋值运算 符将当前值加到sum上。一旦条件失败,while循环将会结束。
  • 当从键盘向当前程序输入数据时,对于如何指出文件结束,不同操作系统有不同的约定。Windows:Ctrl+Z 再按Enter键;
               UNIX\Mac OS X:Ctrl+D

运行结果如下图:
输入流程为:1 空格 2 空格 3 空格 4 空格 5 Ctrl+Z Enter
输入流程为:1 空格 2 空格 3 空格 4 空格 5空格 Ctrl+Z Enter


输入流程为:1 空格 2 空格 3 空格 4 空格 5 空格 f Enter
在这里插入图片描述
程序运行过程为:待12345f都被输入到istream中后,按下Enter表示一个流就形成了。然后while循环对流从头至尾单个检验,若遇到非int型数据或者文件结束,while循环体就结束循环,否则继续执行循环体。


②for循环实现

#include
int main()
{
	int sum=0;
	for(int value=0;std::cin>>value;)//注意分号不可少
		sum+=value;
	std::cout<<"Sum is"<<sum<<std::endl;
	return 0;
}



3.结合if语句的使用[P15 1.4.4]

统计在一串输入中每个值连续出现了多少次。

#include

int main()
{
	//currVal是当前正在统计的数;将从流中读入的新值存入val
	int currVal=0,val=0;

	//读取第一个数到currVal中,并确保了确实有数据可以处理
	if(std::cin>>currVal)
	{
		int count=1;              //保存当前正在统计的数出现的次数,初始值为1
		while (std::cin>>val)     //读取第一个数后面的数
		{
			if(val==currVal)      //如果值相同
				count++;
			else                  //否则,打印前一个值出现的次数
			{
				std::cout<<currVal<<"出现的次数为:"<<count<<std::endl;
				currVal=val;      //记住新值
				count=1;          //重置计数器
			}
		}
		//记住打印输入流中最后一个值出现的次数。因为前一个数出现次数的显示是在识别了后一个数才进行的,
		//但是最后一个值的后面可能是①文件结束符②其他类型的数据。这两种可能都不会进入while循环中,
		//故不能打印最后一个值出现的次数。
		std::cout<<currVal<<"出现的次数为:"<<count<<std::endl;
	}
	return 0;
}

对于三种不同的输入运行结果如下:
①输入流程为:1 1 1 1 2 2 2 3 3 4Ctrl+Z Enter
在这里插入图片描述
②输入流程为:1 1 1 1 2 2 2 3 3 4 e Enter
在这里插入图片描述

③输入流程为:1 1 1 1 2 2 2 3 3 4 Enter
在这里插入图片描述

此种输入方式未能输出最后一个值出现的次数,是因为流末尾的4被读入while循环后,进入了else分支,显示了它前一个数3出现的次数。显示完之后,程序又回到了while(std::cin>>val)处,但此时流已经被读取完了,但是又没有遇到文件结束符或者错误类型的符号,所以程序就堵塞在这里了。一直等到下一个流的输入或者等到文件结束符或者错误类型的符号。

4.输入流作为判断条件使用的总结

①作为判断条件的是整个流,所以是先形成流,再判断。(当进行一串输入并按下Enter后才形成一段流)
②然后判断语句对流从头至尾根据值类型是否和定义类型相符进行判断,若相符则为真,否则为假。
③每进行一次cin>>val(val为某个已定义的变量),流内的数据就减少一个(从头至尾)。
④当最后一个数被cin>>val后,若最后一个数后面为文件结束符或者其他类型数据,cin>>val就为假;但是若最后一个数后面不是这两种情况,而是等待输入状态,此时则不能判断其真假。

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