PTA8(python)

函数题和编程题

代码有的很累赘,我到现在还没弄明白构造函数,get和set怎么用,还有@classmethod 这类的,类方法不能用我就把这个加上,然后能用了……,还有一些题,是我就是想不出来,然后copy了别的博主,还没写转载出处……。

6-1 用类来计算圆面积 (10 分)

请定义一个Circle类,具体要求为:

(1)每个Circle类对象可以存储圆心和半径信息;

(2)具有设置圆心和半径的方法SetCenter和SetRadius;

(3)具有输出圆信息的方法PrintInfo;

(4)具有计算圆面积的方法GetArea。

定义Circle类后,执行下面代码可以输出圆的圆心、半径和面积(见代码中的注释说明)。

函数接口定义:
在这里描述函数接口。例如:
定义Circle 类,类中有两个成员 圆心与半径
SerCenter(x,y) #设置圆心坐标方法
SetRadius® #设置半径方法
PrintInfo()#输入 圆的相关信息
GetArea() # 计算圆面积
其中输入圆的相关信息包括圆心的坐标x,y 及半径,格式样例如 : x=3.00,y=5.00,r=2.00 。x,y 为圆心坐标,r为圆半径。计算圆面积 时PI取值为3.14。

裁判测试程序样例:
在这里给出函数被调用进行测试的例子。例如:

/* 你的代码将被嵌在这里 */

if name==‘main’:
c=Circle() #创建Circle类对象c
x=eval(input()) #输入圆心的x坐标
y=eval(input()) #输入圆心的y坐标
r=eval(input()) #输入半径
c.SetCenter(x,y) #设置圆心
c.SetRadius® #设置半径
c.PrintInfo() #输出圆的圆心和半径信息(均保留2位小数)
print(’%.2f’%c.GetArea()) #输出圆的面积(保留2位小数)
输入样例:
在这里给出一组输入。例如:

3
5
2
输出样例:
在这里给出相应的输出。例如:

x=3.00,y=5.00,r=2.00
12.56

import math
class Circle:
    def __init__(self):
        self.x = None
        self.y = None
        self.r = None

    def SetCenter(self, x, y):
        self.x = x
        self.y = y

    def SetRadius(self, r):
        self.r = r

    def GetArea(self):
        area = 3.14 * (self.r ** 2)
        return area

    def PrintInfo(self):
        print('x={:.2f},y={:.2f},r={:.2f}'.format(self.x, self.y, self.r))

6-2 统计商品总价 (20 分)

消费者购买超市 n 件商品,输入商品名和价格,输出购买的商品信息,并输出应付的总价。

要求:定义Goods类及其成员变量和方法。

(1)定义Goods类:成员变量有 name, price

(2)定义Goods类的带两个参数的构造方法。

(3)定义Goods类的toString()方法,getPrice()方法。

类定义 :
在这里描述类定义 。例如:
class Goods:
定义类中有两个属性 name,price ,定义一个带有两个参数的构造 方法。

再定义toString()方法用来设置输出格式,getPrice()方法用来获得价格。

裁判测试程序样例:
在这里给出函数被调用进行测试的例子。例如:

/* 请在这里填写答案 */

good1 = []
n = int(input())
for i in range(n):
name,price = input().split()
good1.append(Goods(name,eval(price)))

totalprice = 0
for good in good1:
totalprice += good.getPrice()
print(good.toString())

print(“总价是: {}”.format(totalprice))
输入样例:
在这里给出一组输入。例如:

5
book 5.5
pencil 1.2
pen 8.0
ruler 2.5
eraser 1.0
输出样例:
在这里给出相应的输出。例如:

book,5.5
pencil,1.2
pen,8.0
ruler,2.5
eraser,1.0
总价是: 18.2

class Goods:
    def __init__(self, name, price):
        self.__name = name
        self.__price = price

    def get_name(self):
        return self.__name

    def set_name(self, name):
        self.__name = name

    def get_price(self):
        return self.__price

    def set_price(self, price):
        self.__price = price

    def getPrice(self):
        return self.__price

    def toString(self):
        return '{},{}'.format(self.__name,self.__price)

6-3 定义商品类、特殊方法 (30 分)

定义一个商品类。创建对象并按指定格式输出它。 商品类要求:

(1)成员变量:商品编号、商品名称、商品单价。

(2)定义构造方法,要求带三个参数,参数值用于给成员变量赋值。

(3)重写__str__()方法,将对象转换为字符串,格式:商品编号,商品名称,商品单价

输入商品的信息,每个属性值之间用1个空格分隔。

输出格式,商品的每个属性值之间用逗号分隔。

函数接口定义:
在这里描述函数接口。例如:
class Goods:
裁判测试程序样例:
在这里给出函数被调用进行测试的例子。例如:

/* 请在这里填写答案 */

id,name,price = input().split()
good1 = Goods(id,name,float(price))
print(good1)
输入样例:
在这里给出一组输入。例如:

ryb002 香皂 8.9
输出样例:
在这里给出相应的输出。例如:

ryb002,香皂,8.9

class Goods:
    def __init__(self, id, name, price):
        self.__id = id
        self.__name = name
        self.__price = price

    def get_id(self):
        return self.__id

    def set_id(self, id):
        self.__id = id

    def get_name(self):
        return self.__name

    def set_name(self, name):
        self.__name = name

    def get_price(self):
        return self.__price

    def set_price(self, price):
        self.__price = price

    def __str__(self):
        return '{},{},{}'.format(self.__id,self.__name,self.__price)

6-4 学生成绩管理 (30 分)

定义学生类Student:

(1) 定义构造函数,有学号、姓名、三门课成绩,并在此构造函数中计算三门课的平均分。

(2) 重写方法 _ lt _ (),根据平均成绩排序降序,平均成绩相同,按第一门课成绩降序。

(3) 重写方法_ str _(),设置输出格式,输出数据顺序 : 学号 姓名 第一门课成绩 第二门课成绩 平均成绩,每个数据之间用空格分隔,最后一个数据没有空格。平均成绩保留2位小数。

从键盘输入n 个学生的信息,将这n个学生按平均成绩降序排列,当平均成绩相同时,按第一门课成绩降序。输出排序后的学生信息,每行一个学生信息。

函数接口定义:
在这里描述类的定义。例如:
class Student:
裁判测试程序样例:
在这里给出函数被调用进行测试的例子。例如:

/* 请在这里填写答案 */

n = int(input())
student = []
for i in range(n):
ls = input().split()
student.append(Student(ls[0],ls[1],eval(ls[2]),eval(ls[3]),eval(ls[4])))

student.sort()
for st in student:
print(st)

输入样例:
在这里给出一组输入。数据之间用空格分隔。例如:

6
20200101 王刚 72 83 82
20200102 李小明 88 92 78
20200103 王小红 98 72 89
20200104 陈来北 87 95 78
20200105 刘亚 89 91 78
20200106 刘力 90 90 78
输出样例:
在这里给出相应的输出。例如:

20200104 陈来北 87 95 78 86.67
20200103 王小红 98 72 89 86.33
20200106 刘力 90 90 78 86.00
20200105 刘亚 89 91 78 86.00
20200102 李小明 88 92 78 86.00
20200101 王刚 72 83 82 79.00

class Student:
    def __init__(self,number,name,sc1,sc2,sc3):
        self.__number = number
        self.__name = name
        self.__sc1 = sc1
        self.__sc2 = sc2
        self.__sc3 = sc3
        self.ava = (self.__sc2 + self.__sc1 + self.__sc3) / 3

    def get_number(self):
        return self.__number

    def set_number(self, number):
        self.__number = number

    def get_name(self):
        return self.__name

    def set_name(self, name):
        self.__name = name

    def get_sc1(self):
        return self.__sc1

    def set_sc1(self, sc1):
        self.__sc1 = sc1

    def get_sc2(self):
        return self.__sc2

    def set_sc2(self, sc2):
        self.__sc2 = sc2

    def get_sc3(self):
        return self.__sc3

    def set_sc3(self, sc3):
        self.__sc3 = sc3

    def __lt__(self, other):
        if self.ava == other.ava:
            return self.__sc1 > other.__sc1
        return self.ava > other.ava

    def __str__(self):
        return '{} {} {} {} {} {:.2f}'.format(self.__number, self.__name, self.__sc1, self.__sc2, self.__sc3, self.ava)

6-5 设计一个股票类(高教社,《Python编程基础及应用》习题9-6) (4 分)

设计一个名为Stock的类来表示一个公司的股票,包括以下内容:
1)股票代码、股票名称、前一天股票价格、当天股票价格4个私有属性;
2)构造方法,需初始化代码、名称、前一天价格和当天价格等属性;
3)返回股票名字的get方法;
4)返回股票代码的get方法;
5)获取和设置股票前一天价格的get和set方法;
6)获取和设置股票当前价格的get和set方法;
7)名为getChangePercent()方法,返回前日收市价至当前价格的变化百分比;
8). 包括文档字符串,其内容为:“Stock Information Class”

说明:各方法的名称及参数要求请参见测试程序。

类接口定义:
class Stock

裁判测试程序样例:
sCode = input() #输入代码
sName = input() #输入名称
priceYesterday = float(input()) #输入昨日价格
priceToday = float(input()) #输入今日价格
s = Stock(sCode,sName,priceYesterday,priceToday)
print(“代码:”,s.getCode())
print(“名称:”,s.getName())
print(“昨日价格:%.2f\n今天价格:%.2f” % (s.getPriceYesterday(),s.getPriceToday()))
s.setPriceYesterday(50.25)
print(“修正昨日价格为:%.2f” % 50.25)
print(“价格变化百分比:%.2f%%” % (s.getChangePercent()*100))
print(Stock.doc)
输入样例:
601318
中国平安
63.21
64.39
输出样例:
代码: 601318
名称: 中国平安
昨日价格:63.21
今天价格:64.39
修正昨日价格为:50.25
价格变化百分比:28.14%
Stock Information Class

class Stock:
    """Stock Information Class"""
    #我一开始不知道Stock.__doc__该怎么弄,原来不是方法
    def __init__(self, sCode, sName, priceYesterday, priceToday):
        self.__scode = sCode
        self.__sname = sName
        self.__priceyesterday = priceYesterday
        self.__pricetoday = priceToday


    def getCode(self):
        return self.__scode

    def set_scode(self,scode):
        self.__scode = scode

    def getName(self):
        return self.__sname

    def set_sname(self, sname):
        self.__sname = sname

    def getPriceYesterday(self):
        return self.__priceyesterday

    def set_priceyesterday(self, priceyesterday):
        self.__priceyesterday = priceyesterday

    def getPriceToday(self):
        return self.__pricetoday

    def set_pricetoday(self, pricetoday):
        self.__pricetoday = pricetoday
    def setPriceYesterday(self,newy):
        self.__priceyesterday = newy

    def getChangePercent(self):
        return (self.__pricetoday - self.__priceyesterday) / self.__priceyesterday

6-6 学生-人 子类与父类 (30 分)

定义一个人类

(1)定义构造函数:包括属性:姓名、性别、年龄;

(2) 定义方法eating():显示 某某吃饭中;

(3) 定义方法sleeping():显示 某某睡觉中;

(4) 定义方法working():显示 某某工作中。

根据人类,派生一个学生类,增加属性:学校、学号;重写方法working():显示 学校学号为XXXX的某某学习中。

类定义:
在这里描述类的定义。例如:
class Person:
class Student(Person):
裁判测试程序样例:
在这里给出函数被调用进行测试的例子。例如:

/* 请在这里填写答案 */

name,sex,age = input().split()
person1 = Person(name,sex,int(age))
person1.working()
person1.sleeping()
person1.eating()
name,sex,age,school,id = input().split()
st1 = Student(name,sex,int(age),school,id)
st1.working()
st1.eating()
输入样例:
在这里给出一组输入。例如:

刘大力 男 34
李宏达 男 21 北京农业大学 20181200212
输出样例:
在这里给出相应的输出。例如:

刘大力工作中
刘大力睡觉中
刘大力吃饭中
北京农业大学学号为20181200212的李宏达学习中
李宏达吃饭中

class Person:
    def __init__(self,name,sex,age):
        self.name = name
        self.sex = sex
        self.age = age

    def eating(self):
        print('{}吃饭中'.format(self.name))

    def sleeping(self):
        print('{}睡觉中'.format(self.name))

    def working(self):
        print('{}工作中'.format(self.name))


class Student(Person):
    def __init__(self,name,sex,age,school,number):
        self.name = name
        self.sex = sex
        self.age = age
        self.school = school
        self.number = number

    def working(self):
        print('{}学号为{}的{}学习中'.format(self.school,self.number,self.name))

6-7 设计Shape基类及Circle, Rectangle继承类(高教社,《Python编程基础及应用》习题9-7) (5 分)

设计一个基类Shape,包括:

名为sName的属性(图形名称);
构造函数应对sName属性进行初始化。
设计Shape的继承类Rectangle, 包括:

长,宽两个属性;
构造函数调用Shape的构造函数,并初始化长,宽两个属性;
getArea()成员函数计算并返回矩形面积。
设计Shape的继承类Circle,包括:

半径属性;
构造函数调用Shape的构造函数,并初始化半径属性;
getArea()成员函数计算并返回圆形面积。
注意:请注意阅读测试样例程序以理解题目对类的接口的要求。

类接口定义:
class Shape:

class Rectangle(Shape):

class Circle(Shape):

裁判测试程序样例:
s1 = Shape(“shape0”)
s = input() #矩形名称
w = float(input()) #矩形宽度
h = float(input()) #矩形高度
r1 = Rectangle(s,w,h)
s = input() #圆的名称
r = float(input()) #圆的半径
c1 = Circle(s,r)

print(s1.sName)
print(“矩形%s面积: %.2f” % (r1.sName,r1.getArea()))
print(“圆形%s面积: %.2f” % (c1.sName,c1.getArea()))
输入样例:
Jupyter
12.1
9.9
Moon
3.3
输出样例:
shape0
矩形Jupyter面积: 119.79
圆形Moon面积: 34.21

import math
class Shape:
    def __init__(self,sName):
        self.sName = sName
        self.__width = None
        self.__height = None
        self.__r = None


class Rectangle(Shape):
    def __init__(self,sName,width,height):
        self.sName = sName
        self.width = width
        self.height = height

    def getArea(self):
        return self.width * self.height


class Circle(Shape):
    def __init__(self,sName,r):
        self.sName = sName
        self.r = r


    def getArea(self):
        return self.r ** 2 * math.pi

6-8 定义并实现Book类及其__del__函数(高教社,《Python编程基础及应用》习题9-4) (3 分)

图书馆里有很多的书, 请定义一个名为Book的类。该类的属性包括书名(字符串),书号(字符串),单价(浮点数);该类的构造函数接受书名,书号及单价三个参数并参成对象初始化;该类的del()函数则向终端打印如下信息:
Book destroyed-书名,书号,单价
注意:单价保留两位小数。

类接口定义:
class Book:

裁判测试程序样例:
sName = input() #输入书名
sNo = input() #输入书号
fPrice = float(input()) #输入单价
b = Book(sName,sNo,fPrice)
b = None #触发b对象的__del__方法的执行
输入样例:
Python编程基础及应用
888-999
43.678
输出样例:
Book destroyed-Python编程基础及应用,888-999,43.68

class Book:
    def __init__(self,sName,sNo,fPrice):
        self.sName = sName
        self.sNo = sNo
        self.fPrice = fPrice

    def __del__(self):
        print('Book destroyed-{},{},{:.2f}'.format(self.sName,self.sNo,self.fPrice))

7-1 猴子选大王 (20 分)

一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?

输入格式:
输入在一行中给一个正整数N(≤1000)。

输出格式:
在一行中输出当选猴王的编号。

输入样例:
11
输出样例:
7

n=int(input())
monkey=[]
timer=0
count=0
if(n>0 and n<=1000):
    for i in range(1,n+1):
        monkey.append(i)
    while(len(monkey)>1):
       timer+=1
       count+=1
       if(count>len(monkey)):
           count=1
       if(timer==3):
           timer=0
           monkey.pop(count-1)
           count-=1
    print(monkey[0])

7-2 有多少香蕉 (15 分)

以前有这么一个益智游戏,沙滩上有n个猴子和一堆香蕉,晚上有一只猴子偷偷起来把香蕉分成n份,自己拿走了一份,多出来一根,扔进了海里,然后去睡觉了,后面所有的猴子都进行了同样的操作,分成n份,扔掉一根,拿走一份。问最少需要多少香蕉才能让所有猴子都完成该操作。(最后一只猴子扔掉后可以拿走0个,也算是n份均分)给定一个整数m,表示猴子的个数,题目要求输出最初的香蕉数。题目保证有解。

输入格式:
第一行输入n,后面依次输入n个数m。

输出格式:
所有输出在一行内完成,行末不能有多余空格,最后无回车结尾

输入样例:
第一行的2表示有2个m输入。第二行第三行是输入数据

2
2
3
输出样例:
3 25

#我不确定对不对,pintia这个题有些问题。
    # 循环次数
n = int(input())
result = []
for i in range(n):
        # 猴子数量
    m = int(input())
        # 第几个猴子分配完毕后,每个猴子分到的香蕉数量
    level, current = m, 0
    while True:
            # 还原到上一个猴子分配完毕的情况
            # 此时current是分配后剩下的香蕉数量
        level, current = level - 1, m * current + 1
        if level == 0:
            result.append(current)
            break
        elif current % (m - 1) == 0:
                # 剩下的香蕉应能够均分给(m-1)个猴子
                # 此时current是每个猴子分到的数量
            current //= (m - 1)
        else:
                # 剩下的香蕉数量无法被均分给(m-1)个猴子
                # 证明还原前每一个猴子拥有的香蕉数量不正确
                # 需要回退到初始状态
            while level < m:
                level, current = level + 1, (current - 1) // m * (m - 1)
            current = current // (m - 1) + 1
print(" ".join(map(str, result)))

7-3 约瑟夫问题 (10 分)

任务描述
约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。
输入格式:
每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 < m,n <=300)。最后一行是:
0 0
输出格式:
对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号
输入样例:
6 2
12 4
8 3
0 0
输出样例:
5
1
7
题目来源
选自OpenJudge网站,在线网址:bailian.openjudge.cn/practice/2746/

import sys
some = sys.stdin.readlines()
for line in some:
    if line is None:
        sys.exit()
    else:
        num = line.split()
        n = int(num[0])
        m = int(num[1])
        if n == 0 and m ==0:
            break
        else:
            alist = []
            blist = []

            for i in range(1, n + 1):
                alist.append(i)

            s = 0
            for i in range(2, n + 1):
                s = (s + m) % i

            print(s + 1)

7-4 jmu-python-生日悖论 (15 分)

生日悖论,指如果一个房间里有23个或23个以上的人,那么至少有两个人的生日相同的概率要大于50%。尝试编程验证。

验证方法提示:使用从1到365的整数代表生日。测试n次,每次生成23个随机数,随机数的范围从1到365(包括365)。
然后查看有无重复的生日。
最后算出重复的比率。

输入格式:
随机数种子x 测试次数n

注意:需将x转换为整数型再进行设置。

输出格式:
rate=算出的比率,比率保留2位小数

输入样例:
3 1000
输出样例:
rate=0.54

import random
s = input()
x,n = s.split()
num = 0
a = []
random.seed(int(x))
for i in range(int(n)):
    for j in range(23):
        a.append(random.randint(1,365))
    if len(a) == len(set(a)):
        pass
    else:
        num+=1
    a = []
print("rate={:.2f}".format(num/int(n)))

7-7 jmu-python-凯撒密码加密算法 (10 分)

编写一个凯撒密码加密程序,接收用户输入的文本和密钥k,对明文中的字母a-z和字母A-Z替换为其后第k个字母。

输入格式:
接收两行输入,第一行为待加密的明文,第二行为密钥k。

输出格式:
输出加密后的密文。

输入样例:
在这里给出一组输入。例如:

Hello World!
3
输出样例:
在这里给出相应的输出。例如:

Khoor Zruog!

lonst = input()
num = int(input())

for ele in lonst:
    if ele.isalpha():
        alpha = chr(ord(ele) + num)
        if alpha.isalpha():
            print(alpha,end='')
        else:
            print(chr(ord(ele) + num -26),end='')
    elif ele.isalpha() != 1:
        print(ele, end='')

7-12 统计单词数-应用 (15 分)

在需要统计若干段文字(英文)中的单词数量,并且还需统计每个单词出现的次数。 注1:单词之间以空格(1个或多个空格)为间隔。 注2:忽略空行或者空格行。

要求:

统计前,需要从文字中删除指定标点符号!.,😗?#和0至9的数字。 注意:所谓的删除,就是用1个空格替换掉相应字符。 统计单词时需要忽略单词的大小写。 单词个数为0时。只需显示“0”。

输入格式:
若干行英文,最后以%%%为结束。。

输出格式:
单词数量 出现次数排名前6的单词(次数按照降序排序,如果次数相同,则按照键值的字母升序排序)及出现次数。

输入样例:
在这里给出一组输入。例如:

Failure is probably The fortification in your pole!

It#is like a1 peek your wallet as the thief when You
are thinking how2 to. spend several hard-won lepta.

when yoU are? wondering whether new money it#has laid
background Because of: yOu5?, then at the6 heart of the
Tom say: Who is the best? No one dare to say yes.
most lax alert and! most low awareness and* left it
%%%
godsend failed it is
!!!
输出样例:
在这里给出相应的输出。例如:

52

the=5
is=3
it=3
you=3
and=2
are=2

words = ""
while True:
    a = input()
    if a == "%%%":
        break
    a = a.lower()
    for i in "!.,:*?#012345689":
        a = a.replace(i, ' ')
    words = words + " " + a
words = words.split()
s = {}
for i in words:
    if i in s:
        s[i] += 1
    else:
        s[i] = 1
s = list(s.items())
s.sort(key = lambda x:x[0])
s.sort(key = lambda x:x[1], reverse = True)
print(len(s))
for i in range(6):
    word,count = s[i]
    print("{}={}".format(word, count))

7-13 查单词所在页码 (20 分)

输入一组单词在字典中的页码。而后得出多个单词在字典中的页码分别是多少。

输入格式:
首先输入的是一组单词及其在字典中的页码。其中,第一行一个整数 N,表示字典中一共有多少单词(N≤20000)。接下来每两行表示一个单词,其中: 两行中的第 1 行是一个长度≤100 的字符串,表示这个单词,全部字母小写,单词不会重复。两行中的第 2 行是一个整数,表示这个单词在字典中的页码。

接下来输入的是要查询页码的单词。其中的第一行是一个整数 M,表示要查的单词数(M≤10000)。 接下来 M 行,每行一个字符串,表示要查的单词,保证在字典中存在。

输出格式:
M 行,每行一个整数,表示第 i 个单词在字典中的页数。

输入样例:
4
cungneh
19
wyd
17
aqkj
2
olckomm
15
4
wyd
aqkj
cungneh
olckomm
输出样例:
17
2
19
15

adic = {}
num = int(input())
alist = []
for i in range(0,num):
	ke = str(input())
	val = int(input())
	adic[ke] = val

cha = int(input())
for j in range(0,cha):
	ey = str(input())
	alist.append(ey)

for element in alist:
	if element in adic.keys():
		print(adic[element])
  • 8
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值