Преобразование типов данных: Напишите программу 4

Сообщения
1 471
Реакции
271
Сайт
tehadm.ru
Для решения данной задачи вам понадобится пакет strconv, возможно использовать пакеты strings или encoding/csv, или даже bufio - вы не ограничены в выборе способа решения задачи. В решениях мы поделимся своими способами решения этой задачи, предлагаем вам сделать то же самое.

В привычных нам редакторах электронных таблиц присутствует удобное представление числа с разделителем разрядов в виде пробела, кроме того в России целая часть от дробной отделяется запятой. Набор таких чисел был экспортирован в формат CSV, где в качестве разделителя используется символ ";".

На стандартный ввод вы получаете 2 таких вещественных числа, в качестве результата требуется вывести частное от деления первого числа на второе с точностью до четырех знаков после "запятой" (на самом деле после точки, результат не требуется приводить к исходному формату).

P.S. небольшое отступление, связанное с чтением из стандартного ввода. Кто-то захочет использовать для этого пакет bufio.Reader. Это вполне допустимый вариант, но если вы резонно обрабатываете ошибку метода ReadString('\n'), то получаете ошибку EOF, а точнее (io.EOF - End Of File). На самом деле это не ошибка, а состояние, означающее, что файл (а os.Stdin является файлом) прочитан до конца. Чтобы ошибка была обработана правильно, вы можете поступить так:
C-подобный:
if err != nil && err != io.EOF {
...
}

Sample Input:
1 149,6088607594936;1 179,0666666666666

Sample Output:
0.9750
 
C-подобный:
package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
    "strings"
)

func main() {
    reader := bufio.NewReader(os.Stdin)

    input, _ := reader.ReadString('\n')
    parts := strings.Split(input, ";")

    num1 := strings.Replace(parts[0], " ", "", -1)
    num2 := strings.Replace(parts[1], " ", "", -1)

    num1 = strings.Replace(num1, ",", ".", -1)
    num2 = strings.Replace(num2, ",", ".", -1)

    num1Float, _ := strconv.ParseFloat(num1, 64)
    num2Float, _ := strconv.ParseFloat(num2, 64)

    result := num1Float / num2Float

    fmt.Printf("%.4f\n", result)
}
 
C-подобный:
package main
import (
    "fmt"
    "bufio"
    "os"
    "io"
    "strings"
    "strconv"
)

func main() {
    nums, err := bufio.NewReader(os.Stdin).ReadString('\n')
    if err != nil && err != io.EOF {
        panic(err)
    }
    removeSpace(&nums)
    changeToDot(&nums)
    num1, num2 := cutNums(nums)
    
    fmt.Printf("%.4f", divideFloats(convertStringToFloat(num1), convertStringToFloat(num2)))
}

func cutNums(nums string) (string, string) {
    return nums[:strings.Index(nums, ";")], nums[strings.Index(nums, ";")+1:]
}

func removeSpace(num *string) {
    *num = strings.Replace(*num, " ", "", -1)
}

func changeToDot(num *string) {
    *num = strings.Replace(*num, ",", ".", -1)
}

func divideFloats(num1, num2 float64) float64 {
    return num1/num2
}

func convertStringToFloat(num string) float64 {
    convertedNum, err := strconv.ParseFloat(num, 64)
    if err != nil {
        panic(err)
    }
    return convertedNum
}
 
Назад
Верх Низ