Menu
Coddy logo textTech

Итоги: Понимание указателей

Часть раздела Основы путешествия по GO на Coddy — урок 66 из 109.

challenge icon

Задание

Средне

В этом испытании вы создадите простую систему управления запасами для небольшого магазина. Вы будете использовать указатели для обновления количества товаров, расчета стоимости и отслеживания изменений.

Завершите три функции ниже:

  1. updateQuantity(quantity *int, change int) (int, bool)
    Измените значение по адресу quantity, добавив change (отрицательное значение для продаж, положительное для пополнения запасов).
    Если результат окажется меньше 0, установите *quantity равным 0.
    Верните новое количество и логическое значение, которое равно true, если товара теперь нет в наличии (*quantity == 0).
  2. calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64
    Рассчитайте totalValue как float64(quantity) * price.
    Если totalValue больше, чем *highestValue, обновите *highestValue и установите *mostValuableItem в значение itemName, используя указатели.
    Верните totalValue.
  3. displayInventory(apples, oranges, bananas *int, applePrice, orangePrice, bananaPrice float64)
    Выведите название каждого товара, количество (разыменованное из его указателя) и рассчитанную стоимость с помощью fmt.Printf.
    Формат: Apples: 10 (Value: $5.00) — используйте %.2f для цен.

Ожидаемый вывод для начального инвентаря:

Initial Inventory:
Apples: 10 (Value: $5.00)
Oranges: 15 (Value: $10.50)
Bananas: 8 (Value: $2.40)
Total inventory value: $17.90
Most valuable item: Oranges

Совет: Используйте *quantity для чтения или записи значения, на которое указывает указатель. Например, *quantity += change напрямую изменяет исходную переменную.

Попробуйте сами

package main

import "fmt"

// updateQuantity обновляет количество товара и возвращает новое количество
// и информацию о том, закончился ли товар (количество = 0)
func updateQuantity(quantity *int, change int) (int, bool) {
    // TODO: Обновить значение по указателю количества и вернуть новое значение и статус отсутствия на складе
    return 0, false
}

// calculateValue вычисляет общую стоимость товара на основе количества и цены
// Функция также обновляет mostValuableItem, если этот товар дороже
func calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64 {
    // TODO: Вычислить общую стоимость, обновить mostValuableItem при необходимости и вернуть общую стоимость
    return 0.0
}

// displayInventory выводит сведения об инвентаре
// Используются указатели, чтобы функция могла отображать данные в реальном времени
func displayInventory(apples, oranges, bananas *int, applePrice, orangePrice, bananaPrice float64) {
    fmt.Printf("Apples: %d (Value: $%.2f)\n", *apples, float64(*apples) * applePrice)
    fmt.Printf("Oranges: %d (Value: $%.2f)\n", *oranges, float64(*oranges) * orangePrice)
    fmt.Printf("Bananas: %d (Value: $%.2f)\n", *bananas, float64(*bananas) * bananaPrice)
}

func main() {
    // Инициализация инвентаря
    apples := 10
    oranges := 15
    bananas := 8
    
    // Цены
    applePrice := 0.5  // $0.50 за шт.
    orangePrice := 0.7 // $0.70 за шт.
    bananaPrice := 0.3 // $0.30 за шт.
    
    // Отслеживание самого дорогого товара
    var mostValuableItem string
    var highestValue float64
    
    // Отображение начального инвентаря
    fmt.Println("Initial Inventory:")
    displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
    
    // Вычисление начальной стоимости и поиск самого дорогого товара
    appleValue := calculateValue("Apples", apples, applePrice, &mostValuableItem, &highestValue)
    orangeValue := calculateValue("Oranges", oranges, orangePrice, &mostValuableItem, &highestValue)
    bananaValue := calculateValue("Bananas", bananas, bananaPrice, &mostValuableItem, &highestValue)
    
    fmt.Printf("Total inventory value: $%.2f\n", appleValue+orangeValue+bananaValue)
    fmt.Printf("Most valuable item: %s\n\n", mostValuableItem)
    
    // Симуляция продаж
    fmt.Println("Processing sales...")
    _, applesOutOfStock := updateQuantity(&apples, -4) // Продать 4 яблока
    _, orangesOutOfStock := updateQuantity(&oranges, -8) // Продать 8 апельсинов
    _, bananasOutOfStock := updateQuantity(&bananas, -10) // Попытка продать 10 бананов (больше, чем есть)
    
    // Проверка, закончились ли товары
    if applesOutOfStock {
        fmt.Println("Apples are out of stock!")
    }
    if orangesOutOfStock {
        fmt.Println("Oranges are out of stock!")
    }
    if bananasOutOfStock {
        fmt.Println("Bananas are out of stock!")
    }
    
    // Отображение обновленного инвентаря
    fmt.Println("\nUpdated Inventory:")
    displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
    
    // Сброс отслеживания самого дорогого товара для перерасчета
    mostValuableItem = ""
    highestValue = 0
    
    // Пересчет стоимости
    appleValue = calculateValue("Apples", apples, applePrice, &mostValuableItem, &highestValue)
    orangeValue = calculateValue("Oranges", oranges, orangePrice, &mostValuableItem, &highestValue)
    bananaValue = calculateValue("Bananas", bananas, bananaPrice, &mostValuableItem, &highestValue)
    
    fmt.Printf("Total inventory value: $%.2f\n", appleValue+orangeValue+bananaValue)
    fmt.Printf("Most valuable item: %s\n\n", mostValuableItem)
    
    // Пополнение запасов
    fmt.Println("Restocking...")
    updateQuantity(&apples, 5)  // Добавить 5 яблок
    updateQuantity(&oranges, 10) // Добавить 10 апельсинов
    updateQuantity(&bananas, 12) // Добавить 12 бананов
    
    // Отображение финального инвентаря
    fmt.Println("\nFinal Inventory:")
    displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
    
    // Сброс отслеживания самого дорогого товара для финального расчета
    mostValuableItem = ""
    highestValue = 0
    
    // Финальный расчет стоимости
    appleValue = calculateValue("Apples", apples, applePrice, &mostValuableItem, &highestValue)
    orangeValue = calculateValue("Oranges", oranges, orangePrice, &mostValuableItem, &highestValue)
    bananaValue = calculateValue("Bananas", bananas, bananaPrice, &mostValuableItem, &highestValue)
    
    fmt.Printf("Total inventory value: $%.2f\n", appleValue+orangeValue+bananaValue)
    fmt.Printf("Most valuable item: %s\n", mostValuableItem)
}

Все уроки раздела Основы