1、统计在输入中,每个值连续出现了多少次?
#include <iostream>
// 程序设计:键盘获取一组不定长输入,求每个值连续性地输入了多少次?
int main()
{
int Val, CurVal;
if (std::cin >> CurVal) {
// 如果确实得到了输入
int cnt = 1;// 连续输入的次数初始化
while (std::cin >> Val) {
if (CurVal == Val)
cnt++;
else {
std::cout << CurVal << " occupys :" << cnt << " times." << std::endl;
cnt = 1;// 准备记录下一次的输入次数
}
CurVal = Val;
}
std::cout << CurVal << " occupys :" << cnt << " times." << std::endl;
// 输出最后一组连续输入的元素的出现次数
}
return 0;
}
这个程序的优点:
第一:用一个if语句,来检测是否有输入,保证了一定有数据才处理
第二:把第一个输入当作当前输入,每次下次输入的时候,都用另一个Val变量接住,然后比对,比对完之后交替更新当前变量CurVal,这种用两个变量交替进行输入和检测工作的思想很不错
这种不定长输入,是输入到文件尾的,想提前中断的话:Ctrl + Z(win系统),在Mac系统是Ctrl + D
2、研究输入输出的返回值
众所周知,函数才会有返回值。在c++的IO流输入输出里,我们使用的是istream、ostream的库里面的类:std::cin、std::cout;类是没有返回值的,那么上述代码的:while(std::cin >> Val){}是什么意思呢?这个输入语句怎么能放到while里面去判断作为循环的条件呢?莫非它是bool类型的返回值?我们试着写这么一句代码:bool p = std::cin >> a;
获得报错如下:
查看这个std::cin的源码:
从这里可以看到,我们真正产生返回值的不是std::cin这个类,因为类是不会产生返回值的!而是这个运算符:>> ,我们知道,二目运算符相当于一个二元参数的函数。这个运算符的左侧以一个istream的类作为左操作数(即函数第一个参数),右操作数是一个被操作的对象,在命令框里写入的内容,会写到右操作数的对象上去。下面这段话来自《C++primer》
但是至于如何把二目运算符改写成二元参数的函数,这个我目前还不会 还请懂的高手指教!
从C++到C语言,我们知道C语言的输入输出是用函数来实现的:scanf & printf;那函数自然有返回值,我们来看看它的返回值是如何呢?
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <iostream>
int main()
{
int Val;
bool p = scanf("%d", &Val);
bool q = printf("%d", Val);
std::cout << std::endl;
std::cout << p << ' ' << q << std::endl;
p = ~scanf("%d", &Val);
q = ~printf("%d", Val);
std::cout << std::endl;
std::cout << p << ' ' << q << std::endl;
std::cout << EOF << std::endl;
return 0;
}
输出结果:EOF = -1,C风格的输入输出返回值都是1(表示未到文件尾并且成功输入/输出)
3、文件重定向
在Windows10系统下使用cmd命令重定向:"程序编译后的.exe可执行文件" <input.txt >out.txt
文件重定向的好处:
前几天的一个oj测试用例,数据量非常庞大!如果我在控制台用拷贝的方式进行输入输出,那么是不可能拷贝完全的!因为最后一大部分数据会被吞掉,输不进控制台。那怎么办呢?我们就采用《重定向》的方法,去把输入文件放入一个txt文件中,然后建立一个输出文件(空的txt文件)。然后用上述重定向的命令,去输出查看我们的输出结果!
另外,关于重定向,《C++primer》上面也有一段解释: