我们学习过的cin、cout,一般情况下,用来输入、输出数据已经足够了。但这种方法电脑的运行效率比较低,尤其是数据量达到10万个以上时会非常明显,很容易就会超时。为了能够更快输入、输出较多的数据,需要使用格式化输入(scanf)和输出函数(printf)。
格式化输入(scanf)和输出函数(printf)的格式如下:
scanf(格式控制符,地址列表)
printf(格式控制符,输出列表)
例如:输入一个整数并将这个数输出。
scanf("%d",&a);
printf("%d",a);
说明:
(1)使用scanf 和printf,需要调用头文件<cstdio>。
(2)“%d”叫做格式控制符,格式控制符代表了输入或输出的“格式说明”,%d表示输入的数据是整数。scanf和printf的使用方法是一样的,只不过前者比后者在变量前多了个“&”号,这些变量跟前面的格式控制符是一一顺序对应的。
一些常用格式控制符说明见下表:
程序改进:
#include<bits/stdc++.h>
using namespace std;
int n,r,a,s;
int main()
{
cin>>n>>r;
for (int i=1; i<=n; i++)
{
scanf("%d",&a);//cin>>a;
if (a<=r) s++;
}
cout<<s;
return 0;
}
小松鼠非常喜欢吃松果,这天它摘了n个松果回家,然后称出每个松果的重量。现在它想知道这些松果的总重量和平均重量,聪明的你能帮帮它吗?
【输入格式】
第一行输入一个整数n(n≤100000),表示松果的个数;
第二行输入n个松果的各自的重量(有可能是小数)。
【输出格式】
第一行是总重量;
第二行是平均重量,两数均保留两位小数。
【输入样例】
5
98 98.5 100 99.8 99
【输出样例】
495.30
99.06
参考程序:
#include<cstdio>
using namespace std;
int n; double a,s=0,pj;
int main()
{
scanf("%d",&n);
for (int i=0; i<n; i++)
{
scanf("%lf",&a);
s=s+a;
}
pj=s/n;
printf("%.2lf\n%.2lf",s,pj);
return 0;
}
说明:
1.通常用到小数的情况,我们会将这类数据定义为实数型变量,通常有float和double。例如定义实数变量a:float a;或者double a;
2.数据类型float是单精度浮点数,double叫做双精度浮点数,比float更加精确,它对应的格式控制符是%lf,注意是字母l,而不是数字1!
3.%.2lf表示保留2位小数输出,\n表示换行。
域宽
在c++里我们可以通过格式控制符去控制域宽,域宽是指数据的宽度,如整数427的宽度是3。如果指定的域宽大于数据的原宽度,则程序会在数据前面补充相应的空格,比原宽度小或者不指定的则按原宽度输出。
例如427的宽度是3,而指定域宽是5,则输出的就会自动前面补充2个空格:□□427(用□表示空格);指定域宽是2,则按原宽输出427。
格式:printf("%5d",a) (指定域宽是5,a是整数)
printf("%6.3lf",b) (指定域宽是6,b保留3位小数)