PAT乙级程序设计——知识储备(cin,cout,scanf,printf)

1,239 阅读5分钟

在刷题的时候,用cin/cout有时候会出现TLE,也就是超时的情况,但是换成scanf/printf的时候就会AC通过。那么是否cout cin就比scanf和printf慢呢。

比较

  1. 在C语言中是用printf函数进行输出,用scanf函数进行输入的。c++保留了c语言的这个用法。而cin 和 cout就是属于c++的内置对象。
  2. cin cout是类对象,scanf printf是函数。作为函数,就是定义一个函数,然后把出现%的地方取代。但是cin cout作为类对象重载了运算符<<>>

why cin cout比scanf printf慢?

  1. 因为cin 和 cout在做类型判断的时候是由编译器完成的,用户不需要管输入或输出的类型,编译器会帮你找云算子规则,所以我们这里的编译速度就会下降。由于不需要做类型判断,所以我们在输入输出时候的自由度更高,可以自己定义。而scanf和printf将类别判断交给了执行过程,而不是在编译期间完成,所以速度会相对较快。
  2. cin cout预设必须和stdin stdout同步,必须做额外的运算。这里我们可以吧stdio关掉。但是stdio关掉之后scanf和printf就不能用了。 ios_base::sync_with_stdio(false);
  3. endl和flush使用:cout缓冲区。cout用了一个类似优化的设计,叫作缓冲区(由作业系统实作),所有的输出都会先进到缓冲区里,直到缓冲区满了才会清空缓冲区并把字串输出到stdout之类的输出串流,难怪没有跟stdout同步会出错。而当一般人写程式的时候,输出当然希望程式会把东西印到萤幕上,但是如果缓冲区还没满,我们就看不到结果了!怎么办呢? cout有一个物件叫作flush(用法跟endl一样),做的事情就是强迫清空缓冲区,并输出到串流。其实endl就是<<’\n’<。所以我们最后在写换行符的时候可以用\n来代替endl,速度可以快十几秒左右哦~。

cin 和 cout

  1. 内置对象。 cin和cout是c++编程语言中的标准输入输出流对象,是iostream类的对象,而且是内置对象,而不是关键字。cin和cout分别是ostream和istream类的对象,它们是由标准库的开发者提前创建好的,可以直接拿来使用。这种在C++中提前创建好的对象称之为内置对象。输入和输出不是c++本身定义的,而是在编译系统中提供的I/O库中定义的。
  2. 运算符。 使用cout进行输出时要使用<<运算符,使用cin进行输入时要紧跟>>运算符,这两个运算符可以自行分析所处理的数据类型,用户不必通知计算机按何种类型输入输出,因此无需像使用scanf和printf那样给出格式控制字符串。本来<<运算符和>运算符>是左移和右移运算符,C++在这里对这两个运算符分别进行了重载,使其能够用于不同数据的输入和输出,但输入输出的对象只能是C++内置的数据类型和标准库中所包含的类型(例如 string complex ofstream ifstream)
  3. endl表示换行符,也可以用\n代替。
  4. cin在读取数据的时候是从缓冲区读取数据的。当键盘这个终端输入数据的时候,通过回车键\r将字符串送入缓冲区。

头文件引入#include <iostream>

基本操作

cout基本格式

cout<< 表达式1 << 表达式2 << …… << 表达式n ;
cout<< 表达式 << endl;
cout<< 表达式1
    << 表达式2;
cout<< a+b+c;

cin基本格式

cin >> 变量1 >> 变量2 >> …… >> 变量n ; 
cin >>a
    >>b
    >>c;

注意:不能将空格字符和回车换行作为字符输入给字符变量,他们将被跳过。如果想将空格字符或回车换行符输入给字符变量,可以用getline()函数。

使用控制字符

有时候我们需要输出一些特殊要求的结果,比如保留两位小数,数据向左对齐或向右对齐等。c++提供了输入输出流中使用的控制符。

头文件#include <iomanip> 下图是<iomanip>所包含的所有成员函数。 YHV_9503)VNG_AM6II)W1SU.png setprecision()。这个函数中prcision是精确度的意思,setprecision就是设置精确度的意思。使用 setprecision(n 可控制输出流显示浮点数的数字个数 C++ 默认的流输出数值有效位是 6 setprecision(n)就是输出 n 个数,会有四舍五入。
setiosflags(ios::fixed|ios::showpoint)setprecision(n)与setiosflags(ios::fixed)合用,可以控制小数点右边的数字个数。 setprecision( ) 的精度为 0 的时候,有 showpoint ,结果就会显示小数点,没 showpoint, 就不显示小数点。

举例: 输出双精度数。
double a=123.456789012345;对a赋初值
(1) cout<<a;输出: 123.456
(2) cout<<setprecision(9)<<a;输出: 123.456789
(3) cout<<setprecision(6);恢复默认格式(精度为6)
(4) cout<< setiosflags(ios∷fixed);输出: 123.456789
(5) cout<<setiosflags(ios∷fixed)<<setprecision(8)<<a;输出: 123.45678901
(6) cout<<setiosflags(ios∷scientific)<<a;输出: 1.234568e+02
(7) cout<<setiosflags(ios∷scientific)<<setprecision(4)<<a; 输出: 1.2346e02

下面是整数输出的例子:
int b=123456;对b赋初值
(1) cout<<b;输出: 123456
(2) cout<<hex<<b; 输出: 1e240
(3) cout<<setiosflags(ios∷uppercase)<<b;输出: 1E240
(4) cout<<setw(10)<<b<<','<<b; 输出:  123456,123456
(5) cout<<setfill('*')<<setw(10)<<b;输出: **** 123456
(6) cout<<setiosflags(ios∷showpos)<<b;输出: +123456

如果在多个cout语句中使用相同的setw(n),并使用setiosflags(ios∷right),可以实现各行数据右对齐,如果指定相同的精度,可以实现上下小数点对齐。

// setw example
#include <iostream>     // std::cout, std::endl
#include <iomanip>      // std::setw

int main () {
  std::cout << std::setw(10);
  std::cout << 77 << std::endl;
  return 0;
}

Output:

        77

这里显示不清,实际上有10个字符,且右对齐,这里默认右对齐。

有关cin的一些函数

  1. cin.get()

![NT@J]J88$67(`S9~17B6WXE.png](p1-juejin.byteimg.com/tos-cn-i-k3…)

  1. cin.getline() 获得字符串的一整行输入包括空格等。

scanf和printf

在C语言中是用printf函数进行输出,用scanf函数进行输入的。c++保留了c语言的这个用法。本质上scanf和printf是一个定义函数。

printf用法

函数原型

int printf(const char *format[,argument]);

函数参数

format:由格式说明和普通字符构成。格式说明定义argument的显示格式,以“%”开头,后接格式字符。格式字符前还可以有其他修饰符,表述输出的宽度、精度等。

format样式如下:

%[flags][width][.precision][length]格式字符

1.格式字符

aa.png

2.flags:对齐方式

yoyo.png

3.width:宽度

![3HKLKH}BMWZ$W]{PB)UP8]1.png](p1-juejin.byteimg.com/tos-cn-i-k3…)

4.precision:精度

2GON(2WWOU_WVB{%G@FB{T9.png

#include <stdio.h>
using namespace std;

int main()
{
	printf("%d\n",123);//123
	printf("%f\n",13.14);//13.140000
	printf("%c\n",'X');//X
	printf("%s\n","Hello, world!");//Hello, world!
	printf("%.3f\n",3.1415926);//3.142
	printf("%+d\n",521);//+521
	return 0;
}

scanf用法

函数原型

int scanf(const char *format[,argument]);

函数参数

format:由格式说明、空白字符与非空白字符构成。格式说明指示了argument的输入格式,以“%”开头,后接格式字符。格式字符前还可以有其他修饰符。

format样式如下:

%[*][width][modifiers]格式字符

1.格式字符

JU~P5QX@%LP9QIS3J`}CL0P.png

2.修饰符说明

KN07%_KKO5ZQUG@)ONZQH.png

#include <stdio.h>
using namespace std;

int main()
{
	int a,b,c;
	char x;
	scanf("%d",&a);
	scanf("%d%d",&b,&c);
	scanf("%c",&x);
	return 0;
}

这是一次对c++中基本输入输出功能一次比较全面的比较和总结,希望对做PAT以及其他程序设计比如ACM的小伙伴们有所帮助。