sdut-python-实验六-面向对象编程
7-1 sdut-oop-2 Shift Dot(类和对象)
分数 10
作者 周雪芹
单位 山东理工大学
给出平面直角坐标系中的一点,并顺序给出n个向量,求该点根据给定的n个向量位移后的位置。
设计点类Point,内含:
(1)整型属性x和y,表示点的横坐标和纵坐标;
(2)带参构造方法,便于使用初始值构造该类对象;
(3)点移动的方法move(x1,y1),其 中x1和y1表示移动的向量,该方法返回移动后的新的点对象;
(4)展示点对象的字符串方法toString(),以“(横坐标,纵坐标)”的形式。
输入格式:
多组输入。
第一行是三个整数x,y,n,表示点的坐标(x,y),和向量的个数n。
接下来n行,每行两个数xi,yi,表示第i个向量。
题目中所有数据不会超出整型范围。
输出格式:
对于每组输入,输出一行,形式为:"(x,y)",表示点的最终点位置的横坐标和纵坐标。
输入样例:
0 0 1
2 3
0 0 2
1 2
2 3
输出样例:
(2,3)
(3,5)
实现代码:
while True: try: x,y,n=map(int,input().split()) for i in range(n): a,b=map(int,input().split()) x+=a y+=b print(f"({x},{y})") except: break7-3 sdut-谁是最强的女汉子
分数 10
作者 周雪芹
单位 山东理工大学
众所周知,一年一度的女汉子大赛又来啦。由于最近女汉子比较流行,所以参加女汉子比赛的人数变得很多很多。所以赛事组找来了你,让你写一个程序找出谁是最强的女汉子。
大家都知道,越是不漂亮的女生就越容易成为女汉子(漂亮的怎么会成为汉子?),而越是力量大的女生也越成为女汉子(毕竟女汉子还是比较有力量的)。
所以,就给女汉子两个属性,一个是漂亮值x,一个是力量值y。当然x的值越大,就代表这个女生就越漂亮。现在想让你求出来最不漂亮的女生有多少个,她们的力量和是多少。
输入格式:
先输入一个T,代表有T个人(T<10000)。
接下来T行,每行有两个数字x,y,分别代表这个女汉子的漂亮值和力量值(x,y<2*109) 。中间有1个空格分隔。
输出格式:
输出一行,有两个数字,分别代表最强的女汉子的数量,和她们的力量和。中间用1个空格分隔。
输入样例:
5
1 1
2 2
1 4
2 10
10 100
输出样例:
2 5
实现代码:
n=int(input()) cnt=99 sum=0 aa=0 while n: n-=1 x,y=map(int,input().split()) if x<cnt: cnt=x sum=1 aa=y elif x==cnt: sum+=1 aa+=y print(sum,aa)7-4 sdut-oop-5 计算长方体和四棱锥的表面积和体积(类的继承)
分数 10
作者 周雪芹
单位 山东理工大学
计算如下立体图形的表面积和体积。
从图中观察,可抽取长方体和四棱锥两种立体图形的共同属性到父类Rect中:长度:l 宽度:h 高度:z。
编程要求:
(1)在父类Rect中,定义求底面周长的方法length( )和底面积的方法area( )。
(2)定义父类Rect的子类立方体类Cubic,计算立方体的表面积和体积。其中表面积area( )重写父类的方法。
(3)定义父类Rect的子类四棱锥类Pyramid,计算四棱锥的表面积和体积。其中表面积area( )重写父类的方法。
(4)在主程序中,输入立体图形的长(l)、宽(h)、高(z)数据,分别输出长方体的表面积、体积、四棱锥的表面积和体积。
提示:
(1)四棱锥体积公式:V=31Sh,S——底面积 h——高
(2)在Java中,利用Math.sqrt(a)方法可以求得a的平方根(方法的参数及返回结果均为double数据类型)
(3)在Python中,利用math模块的sqrt(a)方法,求得a的平方根。
输入格式:
输入多行数值型数据(double);
每行三个数值,分别表示l、h、z,数值之间用空格分隔。
若输入数据中有0或负数,则不表示任何图形,表面积和体积均为0。
输出格式:
行数与输入相对应,数值为长方体表面积 长方体体积 四棱锥表面积 四棱锥体积(中间有一个空格作为间隔,数值保留两位小数)。
输入样例:
1 2 3
0 2 3
-1 2 3
3 4 5
输出样例:
22.00 6.00 11.25 2.00
0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00
94.00 60.00 49.04 20.00
实现代码:
from math import sqrt while True: try: l,h,z=map(float,input().split()) if l<=0 or h<=0 or z<=0: print("0.00 0.00 0.00 0.00") else: s1=(l*h+h*z+l*z)*2 v1=l*h*z s2=(l*h+l*sqrt(z**2+(h/2)**2)+h*sqrt(z**2+(l/2)**2)) v2=v1/3 print(f"{s1:.2f} {v1:.2f} {s2:.2f} {v2:.2f}") except: break7-5 sdut-oop-6 计算各种图形的周长(多态)
分数 10
作者 周雪芹
单位 山东理工大学
定义接口或类 Shape,定义求周长的方法length()。
定义如下类,实现接口Shape或父类Shape的方法。
(1)三角形类Triangle (2)长方形类Rectangle (3)圆形类Circle等。
定义测试类ShapeTest,用Shape接口(或类)定义变量shape,用其指向不同类形的对象,输出各种图形的周长。并为其他的Shape接口实现类提供良好的扩展性。
提示: 计算圆周长时PI取3.14。
输入格式:
输入多组数值型数据(Python类型float,Java类型double);
一行中若有1个数,表示圆的半径;
一行中若有2个数(中间用空格间隔),表示长方形的长度、宽度。
一行中若有3个数(中间用空格间隔),表示三角形的三边的长度。(需要判断三个边长是否能构成三角形)
若输入数据中有0或负数,则不表示任何图形,周长为0。
输出格式:
行数与输入相对应,数值为根据每行输入数据求得的图形的周长。
输入样例:
在这里给出一组输入。例如:
1
2 3
4 5 6
2
-2
-2 -3
输出样例:
在这里给出相应的输出。例如:
6.28
10.00
15.00
12.56
0.00
0.00
实现代码:
while True: try: numbers=[float(num) for num in input().split()] if len(numbers)==1: if numbers[0]<=0: print("0.00") else: print(f"{numbers[0]*2*3.14:.2f}") elif len(numbers)==2: if numbers[0]<=0 or numbers[1]<=0: print("0.00") else: print(f"{(numbers[0]+numbers[1])* 2:.2f}") elif len(numbers)==3: if numbers[0]<=0 or numbers[1]<=0 or numbers[2]<=0: print("0.00") elif numbers[0]+numbers[1]<=numbers[2] or numbers[2]+numbers[1]<=numbers[0] or numbers[0]+numbers[2]<=numbers[1]: print("0.00") else: print(f"{(numbers[0]+numbers[1]+numbers[2]):.2f}") except: break7-6 sdut-oop-9 计算长方形的周长和面积(类和对象)
分数 10
作者 周雪芹
单位 山东理工大学
设计一个长方形类Rect,计算长方形的周长与面积。
成员变量:整型、私有的数据成员length(长)、width(宽);
构造方法如下:
(1)Rect(int length) —— 1个整数表示正方形的边长
(2)Rect(int length, int width)——2个整数分别表示长方形长和宽
成员方法:包含求面积和周长。(可适当添加其他方法)
要求:编写主函数,对Rect类进行测试,输出每个长方形的长、宽、周长和面积。
输入格式:
输入多组数据;
一行中若有1个整数,表示正方形的边长;
一行中若有2个整数(中间用空格间隔),表示长方形的长度、宽度。
若输入数据中有负数,则不表示任何图形,长、宽均为0。
输出格式:
每行测试数据对应一行输出,格式为:
长度 宽度 周长 面积(数据之间有1个空格分隔)
输入样例:
在这里给出一组输入。例如:
1
2 3
4 5
2
-2
-2 -3
输出样例:
在这里给出相应的输出。例如:
1 1 4 1
2 3 10 6
4 5 18 20
2 2 8 4
0 0 0 0
0 0 0 0
实现代码:
while True: try: n=[int(num) for num in input().split()] if len(n)==1: if n[0]<=0: print("0 0 0 0") else: print(f"{n[0]} {n[0]} {4*n[0]} {n[0]*n[0]}") else: if n[0]<=0 or n[1]<=0: print("0 0 0 0") else: print(f"{n[0]} {n[1]} {(n[0]+n[1])*2} {n[0]*n[1]}") except: break7-7 sdut-oop-7 答答租车系统(类的继承与多态 面向对象综合练习)
分数 10
作者 周雪芹
单位 山东理工大学
各位面向对象的小伙伴们,在学习了面向对象的核心概念——类的封装、继承、多态之后,答答租车系统开始营运了。
请你充分利用面向对象思想,为公司解决智能租车问题,根据客户选定的车型和租车天数,来计算租车费用,最大载客人数,最大载载重量。
公司现有三种车型(客车、皮卡车、货车),每种车都有名称和租金的属性;其中:客车只能载人,货车只能载货,皮卡车是客货两用车,即可以载人,也可以载货。
下面是答答租车公司的可用车型、容量及价目表:
要求:根据客户输入的所租车型的序号及天数,计算所能乘载的总人数、货物总数量及租车费用总金额。
输入格式:
首行是一个整数:代表要不要租车 1——要租车(程序继续),0——不租车(程序结束);
第二行是一个整数,代表要租车的数量N;
接下来是N行数据,每行2个整数m和n,其中:m表示要租车的编号,n表示租用该车型的天数。
输出格式:
若成功租车,则输出一行数据,数据间有一个空格,含义为:
载客总人数 载货总重量(保留2位小数) 租车金额(整数)
若不租车,则输出:
0 0.00 0(含义同上)
输入样例:
1
2
1 1
2 2
输出样例:
在这里给出相应的输出。例如:
15 0.00 1600
实现代码:
n=int(input()) s1=0 s2=0 s3=0 if n==0: print("0 0.00 0") else: x=int(input()) while x: x-=1 a,b=map(int,input().split()) if a==1: s1+=5*b s3+=800*b elif a==2: s1 += 5 * b s3 += 400 * b elif a==3: s1 += 5 * b s3 += 800 * b elif a==4: s1 += 51 * b s3 += 1300 * b elif a==5: s1 += 55 * b s3 += 1500 * b elif a==6: s1 += 5 * b s2+=0.45*b s3 += 500 * b elif a==7: s1 += 5 * b s2+=2*b s3 += 450 * b elif a==8: s2+=3*b s3 += 200 * b elif a==9: s2+=25*b s3 += 1500 * b elif a==10: s2+=35*b s3 += 2000 * b print(f"{s1} {s2:.2f} {s3}")