一、知识积累
1、自动类型转换
#include<iostream>
using anmespace std;
int main(){
int a=1,b=2;
/*int指的是数据类型中的整型变量,
用来定义整数,为等号左边的变量赋予整数;*/
double c,d;
/*double指的是双精度实型变量,
实型即实数,包含整数和分数,
所以可以用来定义带有小数点的数,
这种带有小数点的数也称为浮点数;
精度指的是可以显示的有效数字,
一般来说单精度是六位有效数字,
双精度是15位有效数字;*/
c=a+b;
/*这里的等于号不是数学意义上的相等,
而是一个指令,也可以看成是一个动作,
将等于号右边的数值赋给等于号左边的变量名;
可以观察到,等于号左边的c是浮点数,而右边的a和b是整数,
但赋值时,右边的整数会被自动转化为浮点数,再赋给左边;*/
d=a/c;
/*由于在这里,等号两边分别有d和c这两个浮点数,所以不会发生自动类型转换;
cout<<c<<" "<<d<<endl;
return 0;
}//若是浮点数被转换为整数,则会直接把小数点连同后面的小数都去掉。
2、数据类型
#include<iostream>
using namespace std;
int main(){
char ans1,ans2;//char可以表示字符,尤其可以用它来输出ASCII表里的单个字符;
int a,b,c;//int是最常见的整数类型了,既可以是正整数也可以是负整数,不过值会比较小;
signed int d,e,f;//signed是带符号的意思,也就是负号;
unsigned int g;//这个在signed前加了个un,是相反的意思,所以只能表示正整数;
long long int h,i,j;//顾名思义,能表示较大的正整数;
unsigned long long k;//从上面也大概能知道了;
float water;//float本就有浮在水面的意思,这里指的是浮点数,也就是带小数点的数;
double hh,mm;//double有翻倍的意思,它也是可以表示浮点数,而且能表示的范围比较大;
a='M'-'A'+1;//ASCII表里的数字和字符可以相互转换,只看是定义的char还是int;
ans1='A'+18-1;//记住几个常识,A是第65个字符,A和a相差32,前31个字符表示不出来;
cout<<a<<" "<<as1<<endl;
return 0;
}
3、强制类型转换
double l;
cout<<(int)l<<endl;//cout语句里,既可以是(int)l,也可以是int(l);
l=(double)m;
cout<<l<<endl;//赋值语句,只能在赋值号右边转换;
printf("%d",int(m));//C语言的输出语句,可以在里面转换,在外边转不了;
4、四舍五入
double ans;
cout<<int(ans+0.5)<<endl;
/*将浮点数转换为整数时,
会无情地将小数点后面一串都抛弃掉,所以这里加个0.5,
举个例子,这个数是1.4的话,四舍五入为1,加了0.5成了1.9,结果依旧是1;
这个数要是1.9,那若不加0.5,四舍五入就是1,明显错了,所以加上0.5,四舍五入为2,正确。*/
#include<cmath>
double ans;
cout<<round(ans)<<endl;
/*这里用到了数学函数里的四舍五入,用round()函数就可以了*/
5、典例:数字反转
法一:C++数字型做法
#include<iostream>
using namespace std;
int main(){
int a,b,c,d,w;
double m;
cin>>m;
w=m*10;
a=w/1000;
b=w/100%10;
c=w/10%10;
d=w%10;
cout<<d<<"."<<c<<b<<a<<endl;
return 0;
}
法二:C++字符型做法
#include<iostream>
using namespace std;
int main(){
char a,b,c,dot,d;
cin>>a>>b>>c>>dot>>d;
cout<<d<<dot<<c<<b<<a<<endl;
return 0;
}
法三:C语言字符型做法
#include<cstdio>
using namespace std;
int main(){
char a,b,c,d;
scanf("%c%c%c.%c",&a,&b,&c,&d);
/*在这里我们可以看到占位符%c,相当于一个可以放char型数据的位置,此外,还有如下类型:
%d是整数的占位符,%f是浮点数的,既可以做输出也可以做输入,但%lf只能做输入浮点数的占位符;
%nf也是浮点数的,但这里不再默认保留六位小数,而是保留n位小数;
%nd和%0nd也是整数的占位符,n表示数字需要是n位,如果数字不到n位,则用空格或0补到n位;
%l64d是long long类型整数的占位符;*/
printf("%c.%c%c%c",d,c,b,a);
return 0;
}
6、保留小数
#include<iostream>
#include<cstdio>
#include<iomanip>
using namespace std;
int main(){
double PI=3.1415926;
printf("%f",PI);
cout<<fixed<<setprecision(5);
cout<<"保留五位小数 PI="<<PI<<endl;
cout<<setiosflags(ios::fixed)<<setprecision(4);
cout<<"保留四位小数 PI="<<pi<<endl;
cout.setf(ios::fixed);
cout<<setprecision(3);
cout<<"保留三位小数 PI="<<PI<<endl;
return 0;
}
7、拓展知识
在保留小数的代码中,我们用到了新的头文件 #include<iomanip>,在这里面,iomanip是输入输出操纵器的意思,用这个头文件,就可以在代码里写一些对输出进行特殊操作的函数,具体如下
控 制 符 | 作 用 |
dec | 设置整数为十进制 |
hex | 设置整数为十六进制 |
oct | 设置整数为八进制 |
setbase(n) | 设置整数为n进制(n=8,10,16) |
setfill(c) | 设置字符填充,c可以是字符常量或字符变量 |
setprecision(n) | 设置浮点数的有效数字为n位 |
setw(n) | 设置字符宽度为n位 |
setiosflags(ios::fixed) | 设置浮点数以固定的小数位数显示 |
setiosflags(ios::scientific) | 设置浮点数以科学计数法表示 |
setiosflags(ios::left) | 设置输出左对齐 |
setiosflags(ios::right) | 设置输出右对齐 |
setiosflags(ios::skipws) | 忽略字符前端空格 |
setiosflags(ios::uppercase) | 科学计数法十六进制用X,十进制用E |
setiosflags(ios::showpos) | 输出正数时输出“+”号 |
setiosflags(ios::showpoint) | 强制显示小数点 |
resetiosflags() | 终止已经设置的输出格式状态,括号应指定内容 |
二、习题答案
习题2-1
(1)
#include<iostream>
using namespace std;
int main(){
double n1,n2,t1,t2,r1,r2;
cin>>n1>>t1>>r1>>n2>>t2;
r2=n1/t1/r1*n2*t2;
cout<<r2<<endl;
return 0;
}
(2)
#include<iostream>
using namespace std;
int main(){
int he,cha;
cin>>he>>cha;
cout<<((he-cha)/2)*((he-cha)/2+4)<<endl;
return 0;
}
(3)
#include<iostream>
using namespace std;
int main(){
double he,beishu,r1,r2;
cin>>he>>beishu;
r2=he/(1.0+beishu);
r1=beishu*r2;
cout<<r1<<" "<<r2<<endl;
return 0;
}
(4)
#include<iostream>
using namespace std;
int main(){
int a,b,c,d,student,apple;
cin>>a>>b>>c>>d;
student=-1*(d*(-1)-(-1*b)*(-1))/(a*(-1)-c*(-1));
apple=(a*d-c*(-1*b))/(a*(-1)-c*(-1));
cout<<student<<" "<<apple<<endl;
return 0;
}
(5)
#include<iostream>
using namespace std;
int main(){
int v1,v2,t1,t2;
cin>>v1>>v2>>t1;
t2=v2*t1/(v1-v2);
cout<<t2<<endl;
return 0;
}
(6)
#include<iostream>
using namespace std;
int main(){
int a,b,c,d,n1,n2;
cin>>a>>b>>c>>d;
n1=(c*b-d*1)/(1*b-a*1);
n2=(1*d-a*c)/(1*b-a*1);
cout<<n1<<" "<<n2<<endl;
return 0;
}
(7)
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main(){
double p1,p2,m,t,m1,m2;
cin>>p1>>p2>>m>>t;
m1=m*pow(1+p1,t);
m2=m*(1+p2*t);
cout<<fixed<<setprecision(2);
cout<<m1<<" "<<m2<<endl;
return 0;
}
习题2-2
求三角形面积。一个三角形的三边长分别是a、b、c,那么它的面积是多少?输入a、b、c这三个数字,计算三角形的面积,四舍五入精确到一位小数。
#include<iostream>
#include<iomanip>
#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<<fixed<<setprecision(1);
cout<<s<<endl;
return 0;
}
习题2-3
(1)
#include<cstdio>
using namespace std;
int main(){
int v_a=5,v_yao=8,distance=100;
double delta,ans;
delta=v_yao-v_a;
ans=distance/delta;
printf("%.4f",ans);
return 0;
}
(2)
#include<cstdio>
using namespace std;
int main(){
int ans1;
char ans2;
ans1='M'-'A'+1;
ans2='A'+18-1;
printf("%d\n%c",ans1,ans2);
return 0;
}
(3)
#include<cstdio>
#include<cmath>
#define PI 3.141593
using namespace std;
int main(){
int r1=4,r2=10;
double v,l;
v=4.0/3*PI*(r1*r1*r1+r2*r2*r2);
l=pow(v,1.0/3);
l=int(l+0.5);
printf("%d",int(l));
//这是一个好地方,用C风格最后输出转换类型的话,可以在printf语句里转。
return 0;
}
(4)
#include<cstdio>
#include<cmath>
using namespace std;
int main(){
double a=1,b=-100,c=2400;
double delta,ans;
delta=pow(b,2)-4*a*c;
ans=(-b+sqrt(delta))/(2*a);
ans=110-int(ans+0.5);
printf("%d",int(ans));//教训!
return 0;
}
(5)
#include<cstdio>
using namespace std;
int main(){
int t,n;
scanf("%d %d",&t,&n);
printf("%d",t*n);
return 0;
}
(6)
#include<cstdio>
using namespace std;
int main(){
char ch,ans;
scanf("%c",&ch);
ans=ch-'a'+'A';
printf("%c",ans);
return 0;
}
(7)
#include<cstdio>
using namespace std;
int main(){
double p;
int q,a,b,c,d;
scanf("%lf",&p);
q=int(p*10);
a=q/1e3;
b=q/100%10;
c=q/10%10;
d=q%10;
printf("%d.%d%d%d",d,c,b,a);
return 0;
}
(8)
#include<cstdio>
using namespace std;
int main(){
char a,b,c,d;
scanf("%c%c%c.%c",&a,&b,&c,&d);
printf("%c.%c%c%c",d,c,b,a);
return 0;
}
习题2-4
#include<cstdio>
using namespace std;
int main(){
float a=0.1;
printf("%.10f",int(2-a*a*100));
return 0;
}
习题2-5
小玉买文具。班主任给小玉一个任务,到文具店里买尽量多的签字笔。已知一支签字笔的价格是1元9角,而班主任给小玉的钱是a元b角,小玉想知道,她最多能买多少支签字笔呢?
#include<iostream>
using namespace std;
int main(){
int a,b,n1,n2,ans;
cin>>a>>b;
n1=1*10+9;
n2=a*10+b;
ans=n2/n1;
cout<<ans<<endl;
return 0;
}
习题2-6
Apples Prologue。八尾勇喜欢吃苹果。她现在有m个苹果,吃完一个苹果需要花费t min,吃完一个后立即开始吃下一个。现在时间过去了s min,请问她还有几个完整的苹果?
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main(){
int m,t,s,ans;
double Max;
cin>>m>>t>>s;
Max=max(m*t-s,0);
cout<<ceil(1.0*Max/t)<<endl;
return 0;
}
拓展知识
头文件 #include<algorithm>
max(a,b) | 取整数a和整数b中的最大值,注意不能用于浮点数 |
min(a,b) | 取整数a和整数b中的最小值 |
swap(a,b) | 交换整数a和整数b的值 |
习题2-7
对角线。对于一个有N个顶点的凸多边形,它的任何三条对角线都不会交于一点。请求出这个多边形内部对角线交点的个数。
#include<iostream>
using namespace std;
int main(){
unsigned long long n;
cin>>n;
cout<<n*(n-1)/2*(n-2)/3*(n-3)/4<<endl;
return 0;
}