【洛谷】洛谷深基学习记录 第二章 顺序结构程序设计

本文介绍C++中的自动类型转换、强制类型转换及数据处理技巧,包括四舍五入、数字反转、保留小数的方法,并通过多个习题加深理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、知识积累

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值