Итоги: Понимание указателей
Часть раздела Основы путешествия по GO на Coddy — урок 66 из 109.
Задание
СреднеВ этом испытании вы создадите простую систему управления запасами для небольшого магазина. Вы будете использовать указатели для обновления количества товаров, расчета стоимости и отслеживания изменений.
Завершите три функции ниже:
-
updateQuantity(quantity *int, change int) (int, bool)
Измените значение по адресуquantity, добавивchange(отрицательное значение для продаж, положительное для пополнения запасов).
Если результат окажется меньше0, установите*quantityравным0.
Верните новое количество и логическое значение, которое равноtrue, если товара теперь нет в наличии (*quantity == 0). -
calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64
РассчитайтеtotalValueкакfloat64(quantity) * price.
ЕслиtotalValueбольше, чем*highestValue, обновите*highestValueи установите*mostValuableItemв значениеitemName, используя указатели.
ВернитеtotalValue. -
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)
}Все уроки раздела Основы
4Операторы сравнения и логические операторы
Операторы сравнения — Часть 1Операторы сравнения — Часть 2Логический оператор ANDЛогический оператор ORЛогический оператор NOTОсновы приоритета операторовИтоги: выполнение сравнений7Управляющие конструкции: Циклы
Что такое цикл `for`Цикл `for` — основыЦикл `for` — только условиеКлючевое слово `break`Ключевое слово `continue`Вложенные циклыИтоги — повторение действий2Переменные и базовые типы данных
Что такое переменнаяВывод типов с помощью `:=`Целые числа (int)Числа с плавающей точкойЛогический тип (Booleans)СтрокиНулевые значения (Zero Values)КонстантыПравила именованияИтоги: переменные и типы5Основы ввода-вывода
Форматированный выводСпецификаторы форматаВывод типовБазовый ввод данных пользователемИтоги: ввод и вывод8Функции
Понимание функцийОбъявление функцииВызов функцийПараметры функцииВозврат одного значенияВозврат нескольких значенийИменованные возвращаемые значенияОсновы области видимости функцийИтоги — создание переиспользуемого кода3Базовые операторы
Арифметические операторыОператор деленияОператор остатка от деленияОператор присваиванияКомбинированные операторы присваиванияИнкремент и декрементПовторение — Вычисления6Управление потоком: Условные конструкции
Оператор `if`Ключевое слово `else`Ключевое слово `else if`Затенение переменных в `if`Инициализация переменныхОператор `switch`Switch с выражениямиSwitch без выраженийКлючевое слово `fallthrough`Итоги — Принятие решений