Menu
CoddyTech

Ôn tập: hành vi của struct

Thuộc phần Logic và luồng điều khiển trong hành trình GO của Coddy. Bài học 11 trên 68.

challenge icon

Thử thách

Dễ

Trong thử thách này, bạn sẽ luyện tập cách triển khai cả bộ nhận giá trị lẫn bộ nhận con trỏ bằng cách tạo một hệ thống quản lý hình chữ nhật đơn giản. Bạn sẽ tạo một struct Rectangle và định nghĩa hai kiểu phương thức khác nhau để minh họa khi nào nên dùng từng kiểu bộ nhận.

Bạn sẽ nhận được ba đầu vào:

  • Một chuỗi biểu thị chiều rộng của hình chữ nhật (ví dụ: "5.0")
  • Một chuỗi biểu thị chiều cao của hình chữ nhật (ví dụ: "3.0")
  • Một chuỗi biểu thị hệ số tỉ lệ (ví dụ: "2.0")

Nhiệm vụ của bạn là:

  1. Định nghĩa một struct Rectangle có hai trường: Width (float64) và Height (float64)
  2. Tạo một phương thức tên là area với bộ nhận giá trị, tính và trả về diện tích hình chữ nhật (chiều rộng × chiều cao)
  3. Tạo một phương thức tên là scale với bộ nhận con trỏ, nhân cả chiều rộng và chiều cao với hệ số tỉ lệ đã cho
  4. Phân tích cú pháp các đầu vào để tạo một instance Rectangle
  5. In diện tích ban đầu theo định dạng: "Initial area: [area]"
  6. Gọi phương thức scale với hệ số tỉ lệ
  7. In diện tích sau khi thay đổi tỉ lệ theo định dạng: "Scaled area: [area]"

Hiển thị diện tích dưới dạng số nguyên nếu giá trị là số nguyên (ví dụ: 15 thay vì 15.0), nhưng hiển thị phần thập phân khi cần (ví dụ: 15.5). Thử thách này minh họa nguyên tắc cốt lõi: dùng bộ nhận giá trị cho các phương thức chỉ đọc dữ liệu, chẳng hạn như tính diện tích, và dùng bộ nhận con trỏ cho các phương thức thay đổi struct ban đầu, chẳng hạn như thay đổi tỉ lệ kích thước.

Tự làm thử

package main

import (
	"fmt"
	"strconv"
)

// TODO: Định nghĩa struct Rectangle tại đây

// TODO: Triển khai phương thức area với bộ nhận giá trị tại đây

// TODO: Triển khai phương thức scale với bộ nhận con trỏ tại đây

func main() {
	// Đọc đầu vào
	var widthStr string
	var heightStr string
	var scaleStr string
	fmt.Scanln(&widthStr)
	fmt.Scanln(&heightStr)
	fmt.Scanln(&scaleStr)
	
	// Chuyển đầu vào sang float64
	width, _ := strconv.ParseFloat(widthStr, 64)
	height, _ := strconv.ParseFloat(heightStr, 64)
	scaleFactor, _ := strconv.ParseFloat(scaleStr, 64)
	
	// TODO: Tạo instance Rectangle và triển khai lời giải bên dưới
	
	// In ra diện tích ban đầu
	// fmt.Printf("Initial area: %.0f\n", initialArea) // Dùng định dạng này cho đầu ra
	
	// Thay đổi kích thước hình chữ nhật
	
	// In ra diện tích sau khi thay đổi kích thước
	// fmt.Printf("Scaled area: %.0f\n", scaledArea) // Dùng định dạng này cho đầu ra
}

Tất cả bài học trong Logic và luồng điều khiển

Tự luyện tập: Trình biên dịch Go online