c++ printf控制位数_5、cin语句、scanf语句、printf语句
哇,这次搞了2个小半天才敲完代码。。好累哦
示例2.19:
从键盘上输入一个三位数,然后将它反向输出。例如输入673,输出376。
吐槽: 从键盘输入,C++不大会,Python中是用input,那我先试试不键盘输入的吧~
//practice 2.19
运行结果:
278
这里有个劣势,就是每次输入都要在代码中去改,不方便,键盘输入应该怎样做呢,看一下示例:
//exam 2.19
运行结果:
在弹出的框框中输入 372,回车会出现273
1、cin语句
定义格式:
cin是C++的输入语句,与count语句一样,C++的输入是用“流”的方式实现的。
一般格式:
cin>>变量1>>变量2>>变量3>>......>>变量n;
与cout类似,一个cin语句可以分成若干行,如:
cin>>a>>b>>c>>d;
也可以写成:
cin>>a;
cin>>b;
cin>>c;
cin>>d;
使用:
示例2.20:
依据5组输入数据和运行结果分析cin数据读入方式:
在Dev-C++ 运行的时候,出现了2个小状况,双引号打成了单引号,然后修改后,我运行发现弹出的框框中还是没出现“输入”的字眼,小姐姐说,修改完代码后要先编译再运行,记住啦~
在另一台win上敲了代码,不好复制,那就直接贴图了:
运行结果:
输入:
1234 56.78
输出:
1
2
34
56.78
为什么第一次输入1234 56.78 会出现这样的结果呢,c1和c2是char类型,只接受1个键盘字符,所以分别是1和2;a是整型,那就是剩下的34分配给了a;b是浮点型,那就是最后的56.78了。
输入:
1 2 3 4 56.78
输出:
1
2
34
56.78
这次输入的时候加了空格,但刚刚好,都符合对应的长度,和第一次的结果就是一样的了。
输入:
12
34
56.78
输出:
1
2
34
56.78
虽然加了换行,但是12两个字符还是被拆开分给c1和c2了。
输入:
1234 56.78 45 67 78
输出:
1
2
34
56.78
虽然这次输入的更长了,但结果是没变的,因为数量超出变量个数了,多余的就被自动忽略了。
输入:
a b c d
输出:
a
b
0
0
这里就产生差异了,我的编译器,后面是0和0,书上给出的是这样:
对此,书中给出的解释是:后两字符存入到整型和实型变量中,输出意想不到的结果。不同编译器输出不同的结果。
以上探索可以得出以下结论:
示例2.21:
某城市间公路用A~Z单字符来标识路段,输入某路程的路程和汽车平均速度,每公升汽油可以维持的公里数,以及每公升汽油价格,求汽车经过该路程所花费的时间和费用。
#include <iostream>
using namespace std;
int main()
{
char guidepost;
double d,s,k,cost,time,l.totalcost;
cin>>guidepost;
cin>>d>>s>>k>>cost;
time=d/s;
l=d/k;
totalcost=l*cost;
cout<<guidepost<<endl;
cout<<"time="<<time<<endl;
cout<<"totalcost="<<totalcost<<endl;
return 0;
}
输入:
H
600 110 8 5.3
输出:
H
time=5.45455
totalcost=397.5
作业:
1、将输入的华氏温度转换为摄氏温度
#include <iostream>
using namespace std;
int main()
{
double ft,ct;
cin>>ft;
ct=(ft-32)*5/9;
cout<<ft<<"华氏度="<<ct<<"摄氏度"<<endl;
return 0;
}
输入:
32
输出:
32华氏度=0摄氏度
2、输入三角形三边长a、b、c(保证能构成三角形),输出三角形面积。
做错了:
#include <iostream>
#include<cmath>
using namespace std;
int main()
{
double a,b,c,p,S;
cin>>a,b,c;
p=(a+b+c)/2;
S=sqrt(p*(p-a)*(p-b)*(p-c));
cout<<"三角形面积="<<S<<endl;
return 0;
}
输入:
3 4 5
输出:
三角形面积=nan
为什么错了呢,也没报错也可以运行,但就是结果不对。
检查发现,cin后面每次输入都要加>>,改一下吧:
#include <iostream>
#include<cmath>
using namespace std;
int main()
{
double a,b,c,p,S;
cin>>a>>b>>c;
p=(a+b+c)/2;
S=sqrt(p*(p-a)*(p-b)*(p-c));
cout<<"三角形面积="<<S<<endl;
return 0;
}
输入:
3 4 5
输出:
三角形面积=6
3、
#include <iostream>
#include<cmath>
using namespace std;
int main()
{
int x,y,z;
cin>>x;
z=1000*x+x;
y=z/7/11/13;
cout<<"商是"<<y<<endl;
return 0;
}
输入:
458
输出:
商是458
从数学角度蛮好理解的,得到的六位数,其实就是1001倍的x,后来的连续除以7、11、13,7*11*13结果就是1001,原来的x乘1001再除以1001,那就是它本身。
2、scanf语句、printf语句
scanf语句和printf语句是C语言中的输入输出语句,在C++语言环境中也可以使用;
在对于大数据的输入输出,scanf语句和printf语句比C++的输入流输出流cin和cout效率高,速度快。
scanf和printf中的f是“格式”format之意,其意义是:按指定的格式输入输出值。
scanf和printf是标准库函数,对于不同数据类型变量和数据的输入与输出,有严格对应的配对方式,使用前需要在头文件使用:
#include<cstdio>
2.1 printf
调用形式:
printf("格式控制字符串",输出列表)
其中格式控制字符串用于指定输出形式,可由格式字符和非格式字符串两种组成。
格式字符串是以%开头的字符串,在%后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位等。
小木说常见常用的是这些:
d lld f lf llf c s dllu (无符号的)
示例2.22:
阅读下列程序和程序进行结果,说一说“%d”格式控制字符串和输出列表的表达方式。
//exam2.22
#include <cstdio>
using namespace std;
int main()
{
printf("%d%d%dn",9/8,4*(6+3x)%5,(4*6+3)%5);
printf("%d %d %dn",9/8,4*(6+3)%5,(4*6+3)%5);
printf("9/8=%d 4*(6+3)%5=%d 4*(6+3)%5=%dn", 9/8, 4*(6+3)%5,(4*6+3)%5);
printf("%d %d %dn",41%(6),41%(-6),(-41)%6);
return 0;
}
输出:
112
1 1 2
9/8=1 4(6+3)%5=1 4(6+3)%5=2
5 5 -5
能很好的理解,%d就是按照十进制整型输出;
格式的话如果有空格,后面输出也有空格。
示例2.23:
阅读下列程序和程序进行结果,说一说“%f”格式控制字符串和输出列表的表达方式。
//exam2.23
#include <cstdio>
using namespace std;
int main()
{
printf("9/8=%d 9.0/8=%f 9/8.0=%f 9.0/8.0=%f n",9/8,9.0/8, 9/8.0,9.0/8.0);
printf("10.0/6.0=%fn",10.0/6.0);
printf("10.0/6.0=%.3fn", 10.0/6.0);
printf("10.0/6.0=%9.3fn",10.0/6.0);
return 0;
}
运行结果:
9/8=1 9.0/8=1.125000 9/8.0=1.125000 9.0/8.0=1.125000
10.0/6.0=1.666667
10.0/6.0=1.667
10.0/6.0= 1.667
%f就是以小数形式输出,
%.3f 就是保留小数点后3位,
%9.3f 就神奇了,是一共要保留小数点后3位的同时,保留整体9位,那就需要前面空着。很疑惑为什么有这种操作,姐姐说,有时候需要最后一位对齐,那就需要这样做。
示例2.24:
阅读下列程序和程序进行结果,说一说“%c”格式控制字符串和输出列表的表达方式。
//exam2.24
#include <cstdio>
using namespace std;
int main()
{
int a=88,b=89;
printf("%d %dn",a,b);
printf("%d,%dn", a,b);
printf("%c,%cn", a,b);
printf("a=%d,b=%d",a,b);
return 0;
}
运行结果:
88 89
88,89
X,Y
a=88,b=89
%c就是输出单个字符88对应X,89对应Y
2.2 scanf格式输入函数
scanf 函数调用的一般形式为:
scanf("格式控制字符串",地址表列);
其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串。地址表列中给出各变量的地址。
地址是由地址运算符“&”后跟变量名组成的。
eg: &a、&b分别表示变量a和变量b的地址。
示例2.25:
阅读下列程序和程序进行结果,说一说“%d”格式控制字符串和输出列表的表达方式。
//exam2.25
#include <cstdio>
using namespace std;
int main()
{
int a,b,c;
printf("input a,b,cn");
scanf("%d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}
运行结果:
示例2.26:
阅读下列程序和程序进行结果,理解不同“格式控制字符串”、输入列表变量和输入方式的关系。
//exam2.26
#include <cstdio>
using namespace std;
int main()
{
int a;
double b;
char c;
scanf("%c%d,%lf",&c,&a,&b);
printf("结果是:n");
printf("%c %d %.2lf",c,a,b);
return 0;
}
输入:
x 5,34.5
结果是:
x 5 34.5
第一次抄代码的时候错了,原因是第11行那是lf,我写成了数字1。。。
实验:
(1)输入x 5 34.5,程序运行结果是什么?
结果是
x 5 0.00 (因为第9行中间有个逗号输入的时候没有逗号,那后面的就读取不到)
(2)输入
x
5
34.5
结果是什么呢?
这个有些神奇,我打完数字5 每次按回车都会直接出结果
x 5 0.00
还是逗号的问题,这点在自己写程序的时候一定要注意,一一对应。注意细节~
示例2.27:
阅读下列程序和程序进行结果,分析“*”格式符的作用。
//exam2.27
#include <cstdio>
using namespace std;
int main()
{
int a,b;
scanf("%d%*d%d",&a,&b);
printf("a=%d,b=%dn",a,b);
return 0;
}
输入:
1 2 3
输出:
a=1,b=3
书上写 * 对应输入量不赋给一个变量 ,实际上我改了代码 %d%*d%*d,发现带*的后面都是随机的,不是我们赋值的。
小木带我调试了下代码,
#include <cstdio>
using namespace std;
int main()
{
int a,b,c;
//scanf("%c",&a);
a=88;
printf("a=%dn",a);
printf("a=%cn",a);
return 0;
}
运行结果:
a=88
a=X
这其实就像一个寄存器,不管你最开始是int还是char,后面printf想要它是啥,那就可以是啥。C语言真是好神奇也好灵活呀~
作业:
1、阅读下列程序,给出结果:
#include <cstdio>
using namespace std;
int main()
{
int a=202;
double b=2323.34345;
printf("a=%dn",a);
printf("2*a=%dn",2*a);
printf("a=%2dn",a);
printf("%3lfn",b);
printf("%20.2lfn",b);
printf("%-20.2lfn",b);
printf("%.2lfn",b);
return 0;
}
猜测下结果啊~
会输出: 202 404 20 2323.34345 (前面好多位)2323.34 ?不知道 2323.34
猜测第9行%2d 会只留202的前两位,其实没有,实际上是多的话就多了,改成%4d看了下就是空格202了。
第10行就厉害了,补充了一个0,原因:double默认输出6 位小数。
实际结果:
在姐姐和小木的帮助下,试着修改运行观察: