diff --git a/1-converter/main.go b/1-converter/main.go index 06a255c..fea6f0e 100644 --- a/1-converter/main.go +++ b/1-converter/main.go @@ -5,10 +5,15 @@ import ( "strings" ) -const USD_TO_RUB float64 = 83.74 -const USD_TO_EUR float64 = 1.137 +type currencyMap = map[string]float64 func main() { + var currencyMap = currencyMap{ + "USD": 82.17, + "EUR": 93.45, + "RUB": 1.0, + } + for { currencies := "USD EUR RUB" currentCurrency := "" @@ -39,7 +44,7 @@ func main() { break } - result := convert(value, currentCurrency, targetCurrency) + result := convert(value, currentCurrency, targetCurrency, currencyMap) fmt.Printf("%.2f %s = %.2f %s\n\n", value, currentCurrency, result, targetCurrency) return } @@ -57,27 +62,7 @@ func scanValue(message string) (value float64) { return value } -func convert(value float64, from string, to string) float64 { - var usdValue float64 - switch from { - case "USD": - usdValue = value - case "RUB": - usdValue = value / USD_TO_RUB - case "EUR": - usdValue = value / USD_TO_EUR - default: - return 0 - } - - switch to { - case "USD": - return usdValue - case "RUB": - return usdValue * USD_TO_RUB - case "EUR": - return usdValue * USD_TO_EUR - default: - return 0 - } +func convert(value float64, from string, to string, currencies currencyMap) float64 { + rubles := value * currencies[from] + return rubles / currencies[to] } diff --git a/2-calc/go.mod b/2-calc/go.mod new file mode 100644 index 0000000..bbe1e61 --- /dev/null +++ b/2-calc/go.mod @@ -0,0 +1,3 @@ +module calc + +go 1.23.0 diff --git a/2-calc/main.go b/2-calc/main.go new file mode 100644 index 0000000..c8d29c5 --- /dev/null +++ b/2-calc/main.go @@ -0,0 +1,91 @@ +package main + +import ( + "fmt" + "slices" + "strconv" + "strings" +) + +func main() { + operations := []string{"AVG", "SUM", "MED"} + for { + operation := scanInput("Введите операцию (AVG - среднее, SUM - сумма, MED - медиана): ") + if !slices.Contains(operations, operation) { + fmt.Println("Неверная операция, попробуйте снова") + continue + } + + numbers := scanNumbers("Введите числа через запятую: ") + if len(numbers) == 0 { + fmt.Println("Ни одно число не было введено") + continue + } + + result := calc(operation, numbers) + fmt.Printf("Результат: %v\n\n", result) + } +} + +func scanInput(message string) string { + fmt.Println(message) + var input string + fmt.Scanln(&input) + return input +} + +func scanNumbers(message string) []int { + fmt.Println(message) + var input string + fmt.Scanln(&input) + + parts := strings.Split(input, ",") + var numbers []int + for _, p := range parts { + num, err := strconv.Atoi(strings.TrimSpace(p)) + if err != nil { + fmt.Printf("Некорректное значение: %q\n", p) + continue + } + numbers = append(numbers, num) + } + return numbers +} + +func calc(operation string, numbers []int) int { + switch operation { + case "AVG": + return calcAvg(numbers) + case "SUM": + return calcSum(numbers) + case "MED": + return calcMed(numbers) + default: + return 0 + } +} + +func calcAvg(numbers []int) int { + sum := 0 + for _, n := range numbers { + sum += n + } + return sum / len(numbers) +} + +func calcSum(numbers []int) int { + sum := 0 + for _, n := range numbers { + sum += n + } + return sum +} + +func calcMed(numbers []int) int { + slices.Sort(numbers) + mid := len(numbers) / 2 + if len(numbers)%2 == 0 { + return (numbers[mid-1] + numbers[mid]) / 2 + } + return numbers[mid] +}