Итоги: Понимание указателей
Часть раздела Основы путешествия по 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 обновляет количество товара и возвращает новое количество
// и закончился ли товар (quantity = 0)
func updateQuantity(quantity *int, change int) (int, bool) {
// TODO: Обновить указатель quantity и вернуть новое значение и статус отсутствия на складе
return 0, false
}
// calculateValue вычисляет общую стоимость товара на основе quantity и price
// It also updates the mostValuableItem if this item is more valuable
func calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64 {
// TODO: Calculate the total value, update mostValuableItem if needed, and return the total value
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 каждый
// Track the most valuable item
var mostValuableItem string
var highestValue float64
// Display initial inventory
fmt.Println("Initial Inventory:")
displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
// Calculate initial values and find most valuable item
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 бананов (больше, чем у нас есть)
// Check if any items are out of stock
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!")
}
// Display updated inventory
fmt.Println("\nUpdated Inventory:")
displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
// Reset most valuable tracking for recalculation
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 бананов
// Display final inventory
fmt.Println("\nFinal Inventory:")
displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
// Reset most valuable tracking for final calculation
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`Итоги — Принятие решенийПотренируйтесь самостоятельно: Онлайн-компилятор Go