diff --git a/golang/.golangci.yml b/golang/.golangci.yml index e6ddb635..43e78698 100644 --- a/golang/.golangci.yml +++ b/golang/.golangci.yml @@ -37,7 +37,7 @@ linters: - containedctx # - deadcode - decorder - - depguard + # - depguard - dogsled - dupl - durationcheck diff --git a/golang/informatics2022.exe b/golang/informatics2022.exe new file mode 100644 index 00000000..4ad62ea5 Binary files /dev/null and b/golang/informatics2022.exe differ diff --git a/golang/lab4/lab4.go b/golang/lab4/lab4.go index 4829ad20..beb5cb3e 100644 --- a/golang/lab4/lab4.go +++ b/golang/lab4/lab4.go @@ -1,4 +1,4 @@ -package laba4 +package lab4 import ( "fmt" @@ -18,7 +18,7 @@ func CompleteTaskA(xMin, xMax, xDelta float64) []float64 { return result } -func CompleteTaskB(x []float64) []float64 { // Удалили лишний аргумент float64 +func CompleteTaskB(x []float64) []float64 { var result []float64 for _, i := range x { result = append(result, CalculateFunction(i)) @@ -26,7 +26,7 @@ func CompleteTaskB(x []float64) []float64 { // Удалили лишний ар return result } -func CompleteLaba4() { +func CompleteLab4() { var xMin float64 = 1.25 var xMax float64 = 3.25 var xDelta float64 = 0.4 @@ -34,6 +34,6 @@ func CompleteLaba4() { var resultA []float64 = CompleteTaskA(xMin, xMax, xDelta) fmt.Println(resultA) - var resultB []float64 = CompleteTaskB(x) // Удалили лишний аргумент x + var resultB []float64 = CompleteTaskB(x) fmt.Println(resultB) } diff --git a/golang/lab6/lab6.go b/golang/lab6/lab6.go new file mode 100644 index 00000000..1c83c497 --- /dev/null +++ b/golang/lab6/lab6.go @@ -0,0 +1,36 @@ +package lab6 + +import "fmt" + +type Person struct { + Name string + Age int + Height float64 +} + +func NewPerson(name string, age int, height float64) *Person { + p := new(Person) + p.Name = name + p.Age = age + p.Height = height + return p +} + +func (p *Person) SetAge(age int) { + p.Age = age +} + +func (p Person) GetAge() int { + return p.Age +} + +func (p Person) GetHeight() float64 { + return p.Height +} + +func CompleteLab6() { + dima := NewPerson("Дима", 20, 1.78) + dima.SetAge(20) + + fmt.Printf("Имя: %s\nВозраст: %d\nРост: %.2f\n", dima.Name, dima.GetAge(), dima.GetHeight()) +} diff --git a/golang/lab7/car.go b/golang/lab7/car.go new file mode 100644 index 00000000..c82ae61a --- /dev/null +++ b/golang/lab7/car.go @@ -0,0 +1,52 @@ +package lab7 + +import "errors" + +var ErrColor error = errors.New("invalid color") +var ErrMaxSpeed error = errors.New("the wrong maxSpeed value") + +type Color string + +const ( + Red Color = "красный" + Green Color = "зелённый" + White Color = "белый" + Black Color = "чёрный" +) + +type car struct { + product + color Color + maxSpeed float64 +} + +func (c *car) SetColor(color Color) error { + for _, standardColor := range []Color{Red, Green, White, Black} { + if color == standardColor { + c.color = color + return nil + } + } + return ErrColor +} + +func (c *car) SetSpeed(maxSpeed float64) error { + if maxSpeed < 0 || maxSpeed > 250 { + return ErrMaxSpeed + } + c.maxSpeed = maxSpeed + return nil +} + +func NewCar(id int, name string, price float64, color Color, maxSpeed float64) *car { + c := &car{ + product: newProduct(id, name, price), + } + if err := c.SetColor(color); err != nil { + return nil // Или обработка ошибки + } + if err := c.SetSpeed(maxSpeed); err != nil { + return nil // Или обработка ошибки + } + return c +} diff --git a/golang/lab7/food.go b/golang/lab7/food.go new file mode 100644 index 00000000..10b0328c --- /dev/null +++ b/golang/lab7/food.go @@ -0,0 +1,12 @@ +package lab7 + +type food struct { + product +} + +func NewFood(id int, name string, price float64) *food { + f := &food{ + product: newProduct(id, name, price), + } + return f +} diff --git a/golang/lab7/furniture.go b/golang/lab7/furniture.go new file mode 100644 index 00000000..1e9facb2 --- /dev/null +++ b/golang/lab7/furniture.go @@ -0,0 +1,39 @@ +package lab7 + +import "errors" + +var ErrMaterial error = errors.New("invalid material") + +type Material string + +const ( + Skin Material = "кожа" + Wood Material = "дерево" + Plywood Material = "Фанера" + Dsp Material = "дсп" +) + +type furniture struct { + product + material Material +} + +func (f *furniture) SetMaterial(material Material) error { + for _, standardMaterial := range []Material{Skin, Wood, Plywood, Dsp} { + if material == standardMaterial { + f.material = material + return nil + } + } + return ErrMaterial +} + +func NewFurniture(id int, name string, price float64, material Material) *furniture { + f := &furniture{ + product: newProduct(id, name, price), + } + if err := f.SetMaterial(material); err != nil { + return nil // Или обработка ошибки + } + return f +} diff --git a/golang/lab7/lab7.go b/golang/lab7/lab7.go new file mode 100644 index 00000000..02223851 --- /dev/null +++ b/golang/lab7/lab7.go @@ -0,0 +1,51 @@ +package lab7 + +import ( + "fmt" + "log" +) + +func CompleteLab7() { + var err error + + audi := NewCar(0, "ауди", 80000, Red, 240) + if audi == nil { + log.Fatal("Ошибка создания автомобиля") + } + + desk := NewFurniture(1, "офисный стол", 1200, Wood) + if desk == nil { + log.Fatal("Ошибка создания стола") + } + + chair := NewFurniture(2, "кресло", 300, Skin) + if chair == nil { + log.Fatal("Ошибка создания кресла") + } + + apple := NewFood(3, "огурец", 5) + + var ProductList []Product = []Product{ + audi, + desk, + chair, + apple, + } + + fmt.Printf("Общая стоимость товара до скидок: %.2f\n", GetTotalPrice(ProductList)) + for _, product := range ProductList { + if err = product.SetDiscount(10); err != nil { + log.Fatal(err) + } + } + fmt.Printf("Общая стоимость товара после скидок в 10 процентов: %.2f\n", GetTotalPrice(ProductList)) + + if err = audi.SetColor(White); err != nil { + log.Fatal(err) + } + if err = desk.SetMaterial(Plywood); err != nil { + log.Fatal(err) + } + + displayListProducts(ProductList) +} diff --git a/golang/lab7/product.go b/golang/lab7/product.go new file mode 100644 index 00000000..a2354d32 --- /dev/null +++ b/golang/lab7/product.go @@ -0,0 +1,43 @@ +package lab7 + +import "errors" + +var ErrPercentageValue error = errors.New("the wrong percentage value") + +type product struct { + id int + name string + price float64 + discount float64 +} + +func (p product) GetPrice() float64 { return p.price } + +func (p product) GetName() string { return p.name } + +func (p product) GetDiscount() float64 { return p.discount } + +func (p *product) SetDiscount(percent float64) error { + if percent < 1 || percent > 100 { + return ErrPercentageValue + } + p.discount = percent + + change := (p.price / 100) * percent + + if change > p.price { + p.price = 0 + return nil + } + p.price -= change + return nil +} + +func newProduct(id int, name string, price float64) product { + return product{ + id: id, + name: name, + price: price, + discount: 0, + } +} diff --git a/golang/lab7/productInterface.go b/golang/lab7/productInterface.go new file mode 100644 index 00000000..ce365dd3 --- /dev/null +++ b/golang/lab7/productInterface.go @@ -0,0 +1,28 @@ +package lab7 + +import "fmt" + +type Product interface { + SetDiscount(float64) error + GetDiscount() float64 + GetPrice() float64 + GetName() string +} + +func displayListProducts(PList []Product) { + fmt.Println("____список товаров_____") + for _, p := range PList { + fmt.Printf( + "________________________\nтовар \"%v\" стоит %v$ благодоря скидке в %v процентов\n", + p.GetName(), p.GetPrice(), p.GetDiscount()) + } +} + +func GetTotalPrice(ProductList []Product) float64 { + var totalPrice float64 + + for _, product := range ProductList { + totalPrice += product.GetPrice() + } + return totalPrice +} diff --git a/golang/main.go b/golang/main.go index b81eaba7..3f91a640 100644 --- a/golang/main.go +++ b/golang/main.go @@ -3,10 +3,17 @@ package main import ( "fmt" - laba4 "isuct.ru/informatics2022/lab4" + lab4 "isuct.ru/informatics2022/lab4" + lab6 "isuct.ru/informatics2022/lab6" + lab7 "isuct.ru/informatics2022/lab7" ) func main() { fmt.Println("Lopatin Dmitry Alekseevich") - laba4.CompleteLaba4() + fmt.Println("Лабороторная 4:") + lab4.CompleteLab4() + fmt.Println("Лабороторная 6:") + lab6.CompleteLab6() + fmt.Println("Лабороторная 7:") + lab7.CompleteLab7() }