【无标题】

# 1.编写一个学生类Student,定义3个属性name、age和id,分别表示学生的姓名、年龄和学号。
# 第一个学生的学号为1,以后每生成一个学生对象,学号增加1。初始化学生对象时,需要提供姓名和年龄。
# 每个学生对象生成以后需要调用自定义的info()方法输出姓名、年龄和学号。

class Student:
_student_id_counter = 1 # 定义一个类级别的静态变量用于存储当前学号

def __init__(self, name: str, age: int):
self.name = name
self.age = age
self.id = self._generate_next_id() # 初始化学号

@classmethod
def _generate_next_id(cls): #类方法
next_id = cls._student_id_counter
cls._student_id_counter += 1 # 每创建一个学生对象,学号增加1
return next_id

def info(self):
print(f"Name: {self.name}, Age: {self.age}, ID: {self.id}")

# 示例:创建两个学生对象并调用info()方法
student1 = Student("肖翱翔", 18)
student1.info()

student2 = Student("肖翱飞", 20)
student2.info()

print("人工智能")
print("第一组")
print("肖翱翔")

# 2. 创建类MyMath,计算圆的周长、面积和球的表面积、体积,结果保留两位小数。提示:要引入math包。例如,请输入半径:5
# 圆的周长:31.42
# 圆的面积:78.54
# 球的表面积:314.16
# 附加功能(可选):非法数值判断
# 若输入的是非数字,则输出:请输入数字!
# 若输入的是负数,则输出:请输入正数!

import math

class MyMath:
    def __init__(self, radius):     #类的构造函数
        self.radius = radius

    def calculate_circle_circumference(self):
        return round(2 * math.pi * self.radius, 2)

    def calculate_circle_area(self):
        return round(math.pi * self.radius ** 2, 2)

    def calculate_sphere_surface_area(self):
        return round(4 * math.pi * self.radius ** 2, 2)

    def calculate_sphere_volume(self):
        return round((4/3) * math.pi * self.radius ** 3, 2)

# Input validation
radius_input = input("请输入半径:")

if not radius_input.isdigit():
    print("请输入数字!")
elif float(radius_input) < 0:
    print("请输入正数!")
else:
    radius = float(radius_input)
    math_obj = MyMath(radius)

    print(f"圆的周长:{math_obj.calculate_circle_circumference()}")
    print(f"圆的面积:{math_obj.calculate_circle_area()}")
    print(f"球的表面积:{math_obj.calculate_sphere_surface_area()}")
    print(f"球的体积:{math_obj.calculate_sphere_volume()}")
    print("人工智能")
    print("第一组")
    print("肖翱翔")

# 3. 实现一个名为“Rectangle”的表示矩形的类,该类包含两个实例属性width和height,分别表示矩形的宽和高,都是可读写的property,并且在写操作时检查是否为正值。
# 同时,还有一个名为area()的方法,是一个只读的property,该方法返回矩形的面积。

class Rectangle:
def __init__(self, width, height): #构造函数
self._width = width #实例属性
self._height = height #实例属性

#使用@property装饰器进行封装
@property
def width(self):
return self._width

@width.setter
def width(self, value):
if value > 0:
self._width = value
else:
print("宽度必须为正值!")

@property
def height(self):
return self._height

@height.setter
def height(self, value):
if value > 0:
self._height = value
else:
print("高度必须为正值!")

@property
def area(self):
return self._width * self._height

# 测试
rectangle = Rectangle(5, 10)
print(rectangle.width) # 输出: 5
print(rectangle.height) # 输出: 10
print(rectangle.area) # 输出: 50

rectangle.width = 8
rectangle.height = 12
print(rectangle.area) # 输出: 96

rectangle.width = -3 # 输出: 宽度必须为正值!
rectangle.height = -5 # 输出: 高度必须为正值!
print("人工智能")
print("第一组")
print("肖翱翔")

# 4.自定义类模拟三维向量及其运算。
# 包括向量的加法、减法以及向量与标量的乘法和除法,并查看向量长度。
# 例如, a=(x1,y1,z1), b=(x2,y2,z2)
# a+b=(x1+x2,y1+y2,z1+z2), a-b=(x1-x2,y1-y2,z1-z2)
# n=10, a*n=(x1*n,y1*n,z1*n), a/n=(x1/n,y1/n,z1/n)
# a.length=(x1**2+y1**2+z1**2)**0.5

import math

class Vector3D:
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z

    def __add__(self, other):
        return Vector3D(self.x + other.x, self.y + other.y, self.z + other.z)

    def __sub__(self, other):
        return Vector3D(self.x - other.x, self.y - other.y, self.z - other.z)

    def __mul__(self, scalar):
        return Vector3D(self.x * scalar, self.y * scalar, self.z * scalar)

    def __truediv__(self, scalar):
        return Vector3D(self.x / scalar, self.y / scalar, self.z / scalar)

    @property
    def length(self):
        return math.sqrt(self.x**2 + self.y**2 + self.z**2)

# 测试
a = Vector3D(1, 2, 3)
b = Vector3D(4, 5, 6)

print(f"a + b = ({a.x + b.x}, {a.y + b.y}, {a.z + b.z})")
print(f"a - b = ({a.x - b.x}, {a.y - b.y}, {a.z - b.z})")
print(f"a * 10 = ({a.x * 10}, {a.y * 10}, {a.z * 10})")
print(f"a / 2 = ({a.x / 2}, {a.y / 2}, {a.z / 2})")
print(f"Length of a: {a.length}")
print(f"Length of b: {b.length}")
print("人工智能")
print("第一组")
print("肖翱翔")

# 5.设计一个摆放家具实例,要求:
# (1)房子(House) 有户型、总面积和家具名称列表(新房子没有任何的家具);
# (2)家具(HouseItem)有名字和占地面积,其中席梦思(bed) 占地4平米、衣柜(chest)占地2平米、餐桌(table)占地1.5平米;
# (3)将以上三件家具添加到房子中;
# (4)打印房子时,要求输出:户型、总面积、剩余面积、家具名称列表。

class HouseItem:
    def __init__(self, name, area):
        self.name = name
        self.area = area

class House:
    def __init__(self, house_type, total_area):
        self.house_type = house_type
        self.total_area = total_area
        self.furniture = []

    def add_furniture(self, item):
        if self.total_area >= item.area:
            self.furniture.append(item)
            self.total_area -= item.area
            print(f"{item.name} added to the house.")
        else:
            print(f"Not enough space to add {item.name} in the house.")

    def __str__(self):
        furniture_names = [item.name for item in self.furniture]
        return f"House Type: {self.house_type}, Total Area: {self.total_area} sqm, Remaining Area: {self.total_area} sqm, Furniture: {', '.join(furniture_names)}"

bed = HouseItem("Bed", 4)
chest = HouseItem("Chest", 2)
table = HouseItem("Table", 1.5)

my_house = House("2 Bedroom Apartment", 100)
my_house.add_furniture(bed)
my_house.add_furniture(chest)
my_house.add_furniture(table)

print(my_house)
print("人工智能")
print("第一组")
print("肖翱翔")

6. 继承 Python内置的字符串类str,根据给定整数(正数代表左移,负数代表右移)实现字符串的左右循环移动。

例如,a = MoveableStr("abcde")

      print(a.move(3))  # 输出deabc

      print(a.move(-3))  # 输出cdeab

class MoveableStr(str):
      def __new__(cls, value):
            # 注意:str.__new__ 负责创建新的字符串实例
            # 我们需要调用 super().__new__ 来确保正确创建
            return super().__new__(cls, value)
      def move(self, shift):
            # 确保 shift 是整数
            if not isinstance(shift, int):
                  raise ValueError("Shift must be an integer.")
                  # 计算实际移动的位数(取模长度确保循环)
            length = len(self)
            if length == 0:
                  return self  # 空字符串不移动
            # 计算实际移动的位数,并处理负数(右移)的情况
            shift %= length
            if shift < 0:
                  shift += length  # 将负数转换为正数,实现循环左移
            # 使用切片操作来生成移动后的字符串
            return self[-shift:] + self[:-shift]

      # 使用示例
a = MoveableStr("abcde")
print(a.move(-3))  # 输出deabc
print(a.move(3))  # 输出cdeab
print("人工智能")
print("第一组")
print("肖翱翔")

# 7. 定义类Dimension(包含x、y坐标),类Circle和 Rectangle继承了Dimension的成员变量x和y,并重写继承的方法area()。

import math

class Dimension:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        # 注意:Dimension类通常不会定义area方法,因为它不包含计算面积所需的信息

class Circle(Dimension):
    def __init__(self, x, y, radius):
        super().__init__(x, y)  # 调用父类的构造函数
        self.radius = radius
    def area(self):
        return math.pi * (self.radius ** 2)

class Rectangle(Dimension):
    def __init__(self, x, y, width, height):
        super().__init__(x, y)  # 调用父类的构造函数
        self.width = width
        self.height = height
    def area(self):
        return self.width * self.height

    # 使用示例
circle = Circle(0, 0, 5)
print(circle.area())  # 输出圆的面积
rectangle = Rectangle(0, 0, 10, 5)
print(rectangle.area())  # 输出矩形的面积
print("人工智能")
print("第一组")
print("肖翱翔")

# 8. 请定义类Point(一个点包含x、y坐标),通过重写相应的魔方方法,使其支持如下运算符操作:
# (1)p1+p2,两个点的x、y坐标分别相加,返回一个新的 Point对象;
# (2)p1-p2,两个点的x、y坐标分别相减,返回一个新的 Point对象;
# (3)p*n,用点的x、y坐标分别乘以数值n,返回一个新的Point对象;
# (4)p/n,用点的x、y坐标分别除以数值n,返回一个新的Point对象。
# # 测试代码
# if __name__ == '__main__':
# a,b=Point(4,5),Point(2,3)
# print(a+b) # 输出结果为'Point(6,8)'
# print(a-b) # 输出结果为'Point(2,2)'
# print(a*2) # 输出结果为'Point(8,10)'
# print(a/2) # 输出结果为'Point(2.0,2.5)'

class Point:

    def __init__(self, x, y):

        self.x = x

        self.y = y

    def __repr__(self):

        # 提供一个友好的表示形式,用于print函数

        return f'Point({self.x},{self.y})'

    def __add__(self, other):

        # 实现加法运算,两个点的x、y坐标分别相加

        if not isinstance(other, Point):
            raise TypeError("Unsupported operand types for +: 'Point' and '{}'".format(type(other).__name__))

        return Point(self.x + other.x, self.y + other.y)

    def __sub__(self, other):

        # 实现减法运算,两个点的x、y坐标分别相减

        if not isinstance(other, Point):
            raise TypeError("Unsupported operand types for -: 'Point' and '{}'".format(type(other).__name__))

        return Point(self.x - other.x, self.y - other.y)

    def __mul__(self, scalar):

        # 实现乘法运算,点的x、y坐标分别乘以数值n

        if not isinstance(scalar, (int, float, complex)):
            raise TypeError("Unsupported operand types for *: 'Point' and '{}'".format(type(scalar).__name__))

        return Point(self.x * scalar, self.y * scalar)

    def __truediv__(self, scalar):

        # 实现除法运算,点的x、y坐标分别除以数值n

        if not isinstance(scalar, (int, float, complex)) or scalar == 0:
            raise ValueError("Cannot divide by zero")

        return Point(self.x / scalar, self.y / scalar)

    # 测试代码


if __name__ == '__main__':
    a, b = Point(4, 5), Point(2, 3)

    print(a + b)  # 输出结果为'Point(6,8)'

    print(a - b)  # 输出结果为'Point(2,2)'

    print(a * 2)  # 输出结果为'Point(8,10)'

    print(a / 2)  # 输出结果为'Point(2.0,2.5)'

    print("人工智能")
    print("第一组")
    print("肖翱翔")

# 9. 创建SchoolMem类,该类中包含三个数据成员:姓名、性别、年龄;

# 创建Student类,继承自SchoolMem类,添加额外三个数据成员:
# 班级、学号和数量统计;创建Teacher类,继承自SchoolMem类,添加额外三个数据成员:
# 学院、工号和数量统计。要求给每个类适当添加属性、成员方法和特殊方法(如构造方法),实现学生和教师信息的输出。
# 实现并测试这个类。(建议在父类和子类中使用同名函数以实现多态,如在SchoolMem类、Student类和Teacher类中分别实现printInfo方法输出对象的信息。)

class SchoolMem:
    count = 0  # 数量统计(类变量)

    def __init__(self, name, gender, age):
        self.name = name

        self.gender = gender

        self.age = age

        SchoolMem.count += 1  # 每当创建一个实例时,增加数量统计

    def printInfo(self):
        print(f"姓名: {self.name}, 性别: {self.gender}, 年龄: {self.age}")

    @staticmethod
    def getTotalMembers():
        return SchoolMem.count


class Student(SchoolMem):
    count = 0  # 学生数量统计(类变量)

    def __init__(self, name, gender, age, class_name, student_id):
        super().__init__(name, gender, age)  # 调用父类的构造方法

        self.class_name = class_name

        self.student_id = student_id

        Student.count += 1  # 每当创建一个学生实例时,增加学生数量统计

    def printInfo(self):
        print(f"学生信息:")

        super().printInfo()  # 调用父类的printInfo方法

        print(f"班级: {self.class_name}, 学号: {self.student_id}")

    @staticmethod
    def getTotalStudents():
        return Student.count


class Teacher(SchoolMem):
    count = 0  # 教师数量统计(类变量)

    def __init__(self, name, gender, age, department, teacher_id):
        super().__init__(name, gender, age)  # 调用父类的构造方法

        self.department = department

        self.teacher_id = teacher_id

        Teacher.count += 1  # 每当创建一个教师实例时,增加教师数量统计

    def printInfo(self):
        print(f"教师信息:")

        super().printInfo()  # 调用父类的printInfo方法

        print(f"学院: {self.department}, 工号: {self.teacher_id}")

    @staticmethod
    def getTotalTeachers():
        return Teacher.count

    # 测试代码


if __name__ == '__main__':
    # 创建学生和教师实例

    student1 = Student("张三", "男", 20, "人工智能", "2315015180")

    student2 = Student("李四", "女", 21, "计算机科学与技术", "2315015181")

    teacher1 = Teacher("王老师", "男", 35, "计算机与软件学院", "T001")

    teacher2 = Teacher("赵老师", "女", 30, "传媒学院", "T002")

    # 调用printInfo方法

    student1.printInfo()

    student2.printInfo()

    teacher1.printInfo()

    teacher2.printInfo()

    # 输出总数量

    print(f"总成员数: {SchoolMem.getTotalMembers()}")

    print(f"学生总数: {Student.getTotalStudents()}")

    print(f"教师总数: {Teacher.getTotalTeachers()}")
print("人工智能")
print("第一组")
print("肖翱翔")

# 10. 设计一个车类,属性:车的类型、车的速度,分别再建立两个子类:
# 小汽车类、电动汽车类去继承车类,为了实现汽车增加能源的方式,在父类中添加一个增加能源方法increased_energy(),
# 通过汽车对象不同分别实现小汽车类加 油、电动汽车充电的实现。

from abc import ABC, abstractmethod


class Car(ABC):

    def __init__(self, car_type, speed):
        self.type = car_type

        self.speed = speed

    @abstractmethod
    def increased_energy(self):
        """
        子类应该实现此方法以定义如何增加能源
        """
        pass

class GasolineCar(Car):

    def __init__(self, car_type, speed):
        super().__init__(car_type, speed)

    def increased_energy(self):
        print(f"为{self.type}小汽车加油")

class ElectricCar(Car):

    def __init__(self, car_type, speed):
        super().__init__(car_type, speed)

    def increased_energy(self):
        print(f"为{self.type}电动汽车充电")

    # 示例用法


gas_car = GasolineCar("红旗", 120)

gas_car.increased_energy()  # 输出: 为红旗小汽车加油

elec_car = ElectricCar("迈巴赫", 200)

elec_car.increased_energy()  # 输出: 迈巴赫电动汽车充电

print("人工智能")
print("第一组")
print("肖翱翔")

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值