Итоги: Понимание указателей
Часть раздела Основы путешествия по 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`Итоги — Принятие решенийПотренируйтесь самостоятельно: Онлайн-компилятор Go