Собираем всё вместе
Часть раздела Логика и управление потоком путешествия по GO на Coddy — урок 25 из 68.
Задание
ЛегкоЗавершите создание вашей системы управления запасами, разработав комплексную основную программу, которая объединяет все функциональные возможности, созданные в предыдущих уроках. Эта финальная задача объединяет инициализацию инвентаря, проверку остатков, добавление товаров, обновление запасов и генерацию отчетов в полноценный интерфейс командной строки с навигацией через меню.
Вы получите три входных параметра:
- Строку, содержащую начальные данные инвентаря в формате
"product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3"(например,"Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8") - Строку, содержащую последовательность операций меню в формате
"operation1,operation2,operation3", где операциями могут быть"check","add","update","report"или"exit"(например,"check,add,update,report,exit") - Строку, содержащую параметры операций в формате
"param1|param2|param3", где каждый параметр соответствует операции на той же позиции (например,"Mouse|Monitor:299.99:10|Laptop:5|full,10")
Ваша задача:
- Использовать ту же структуру
Productиз предыдущих уроков с полямиPrice(float64) иQuantity(int) - Разобрать первый входной параметр и инициализировать карту (map) инвентаря существующими данными о продуктах
- Вывести сообщение о запуске системы:
"=== INVENTORY MANAGEMENT SYSTEM ===""System initialized with [number_of_products] products""Starting interactive session..."
- Разобрать второй входной параметр, чтобы получить последовательность выполняемых операций
- Разобрать третий входной параметр, чтобы получить параметры для каждой операции
- Для каждой операции в последовательности вывести заголовок операции и выполнить соответствующее действие:
- Для
"check": Вывести"--- STOCK CHECK ---"и проверить наличие указанного продукта - Для
"add": Вывести"--- ADD ITEM ---"и добавить указанный продукт - Для
"update": Вывести"--- UPDATE STOCK ---"и обновить количество указанного продукта - Для
"report": Вывести"--- GENERATE REPORT ---"и создать указанный отчет - Для
"exit": Вывести"--- SYSTEM EXIT ---"и показать информацию о выходе
- Для
- Реализовать функцию
checkStock, которая возвращает количество и ошибку, как в предыдущих уроках - Реализовать функцию
addNewItem, которая добавляет продукты и возвращает ошибку, как в предыдущих уроках - Реализовать функцию
updateStock, которая обновляет количество и возвращает ошибку, как в предыдущих уроках - Реализовать функцию
generateReport, которая создает отчеты, как в предыдущих уроках - Для операции
"check":- Использовать параметр как название продукта для проверки
- Вывести:
"Checking stock for: [product_name]" - Если найден:
"Stock level: [quantity] units" - Если не найден:
"Product not found in inventory"
- Для операции
"add":- Разобрать параметр в формате
"product_name:price:quantity" - Вывести:
"Adding new product: [product_name]" - В случае успеха:
"Product added successfully" - В случае ошибки:
"Failed to add product: [error_message]"
- Разобрать параметр в формате
- Для операции
"update":- Разобрать параметр в формате
"product_name:change" - Вывести:
"Updating stock for: [product_name]" - Если успешно и изменение положительное:
"Added [change] units. New stock: [new_quantity]" - Если успешно и изменение отрицательное:
"Removed [absolute_change] units. New stock: [new_quantity]" - В случае ошибки:
"Update failed: [error_message]"
- Разобрать параметр в формате
- Для операции
"report":- Разобрать параметр в формате
"report_type,threshold" - Вывести:
"Generating [report_type] report with threshold [threshold]" - Сгенерировать и вывести полный отчет, как в предыдущих уроках
- Разобрать параметр в формате
- Для операции
"exit":- Вывести итоговую статистику инвентаря:
"Final inventory status:""Total products: [total_products]""Total items: [total_items]""Total value: $[total_value]"
- Вывести:
"Session completed successfully" - Вывести:
"Thank you for using the Inventory Management System"
- Вывести итоговую статистику инвентаря:
- После каждой операции (кроме exit) выводить:
"Operation completed. Continuing to next operation..."
Используйте пакет strings для разделения входных строк, пакет strconv для преобразования строк в числа, пакет errors для обработки ошибок, пакет fmt для форматированного вывода и пакет sort для сортировки по алфавиту. Форматируйте все цены и значения до 2 знаков после запятой. Эта задача демонстрирует, как создать полноценную интерактивную систему, объединяющую несколько функциональных компонентов в единый пользовательский интерфейс с правильной обработкой ошибок и управлением состоянием.
Попробуйте сами
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Task struct {
Name string
Completed bool
}
func removeTask(tasks []Task, index int) []Task {
return append(tasks[:index], tasks[index+1:]...)
}
func main() {
// Read input using bufio.Scanner to handle spaces properly
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
_ = scanner.Text() // Read but don't use the number of tasks
scanner.Scan()
taskData := scanner.Text()
scanner.Scan()
indexStr := scanner.Text()
// Parse task data
taskEntries := strings.Split(taskData, ",")
var tasks []Task
for _, entry := range taskEntries {
parts := strings.Split(entry, ":")
if len(parts) >= 2 {
name := parts[0]
status := parts[1] == "true"
tasks = append(tasks, Task{Name: name, Completed: status})
}
}
// Convert index string to integer
index, _ := strconv.Atoi(indexStr)
// Store the name of the task to be removed
removedTaskName := tasks[index].Name
// Remove the task
tasks = removeTask(tasks, index)
// Display remaining tasks
completedCount := 0
for _, task := range tasks {
if task.Completed {
fmt.Printf("[x] %s\n", task.Name)
completedCount++
} else {
fmt.Printf("[ ] %s\n", task.Name)
}
}
// Print confirmation message
fmt.Printf("Task '%s' removed successfully!\n", removedTaskName)
// Print summary
totalCount := len(tasks)
incompleteCount := totalCount - completedCount
fmt.Printf("Total: %d tasks (%d completed, %d remaining)\n", totalCount, completedCount, incompleteCount)
}Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Switch с использованием `fallthrough`Выход из вложенных цикловПродолжение конкретного циклаОператор `goto`Итоги: Продвинутое управление циклами4Проект: Простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели по значениюПолучатели по указателюВыбор типа получателяМетоды против функцийИтоги: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведение