Menu
CoddyTech

Ôn tập: Máy tính hình dạng

Thuộc phần Lập trình hướng đối tượng trong hành trình Swift của Coddy. Bài học 36 trên 57.

challenge icon

Thử thách

Khó

Hãy xây dựng một chương trình tính toán hình học kết hợp tính đa hình và kiểu tổng quát. Giao thức Shape yêu cầu có name, area() và perimeter() (cả hai đều có kiểu Double). Hãy triển khai Rect, Circle (π là 3.14) và Triangle (ba cạnh, tính diện tích theo công thức Heron với sqrt từ Foundation). Viết một hàm tổng quát largest<T>(_ items: [T], by key: (T) -> Double) -> T?. Hoàn thiện report(_:), hàm này trả về một dòng cho mỗi hình với hai chữ số thập phân (rect: area 12.00, perimeter 14.00), sau đó là largest area: circle và largest perimeter: rect, cả hai đều được tìm bằng largest.

Code được cung cấp sẽ đọc các dòng rect,3,4, circle,2 hoặc tri,3,4,5, tạo [any Shape] và in ra từng dòng được trả về.

Code của bạn nằm trong các tệp Shape.swift, Rect.swift, Circle.swift, Triangle.swift và Functions.swift. main.swift chứa code đầu vào/đầu ra được cung cấp và bạn không thể chỉnh sửa tệp này.

Tự làm thử

import Foundation

// Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
var input: [String] = []
while let line = readLine() { input.append(line) }
var shapes: [any Shape] = []
for line in input {
    let p = line.split(separator: ",").map(String.init)
    let v = p.dropFirst().map { Double($0)! }
    switch p[0] {
    case "rect": shapes.append(Rect(w: v[0], h: v[1]))
    case "circle": shapes.append(Circle(r: v[0]))
    default: shapes.append(Triangle(a: v[0], b: v[1], c: v[2]))
    }
}
for line in report(shapes) { print(line) }

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Playground Swift