《C++primer》学习:第一章(笔记及程序设计练习)

《C++primer》第一章:

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》上面也有一段解释:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44274276/article/details/105277148