Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+2

Программирование на Go (ПОЖАЛУЙСТА ПОМОГИТЕ)

Условие задачи:
Для этого напишите функцию SqRoots(), в которой с клавиатуры через пробел вводятся три вещественных числа, при этом первое число гарантированно не равно нулю. Функция должна вывести на экран через пробел по возрастанию корни уравнения (один или два), или два числа 0, если корней нет.

Функция ничего не должна возвращать.


Код:
package main

import (
"fmt"
"math"
)

func SqRoots() {
var a, b, c float64
fmt.Scanln(&a, &b, &c)
d := b * b - 4 * a * c
if d < 0.0 {
fmt.Println("0 0")
} else if sd := math.Sqrt(d); a > 0.0 {
fmt.Printf("%g %g\n", (-b - sd) / (2.0 * a), (-b + sd) / (2.0 * a))
} else {
fmt.Printf("%g %g\n", (-b + sd) / (2.0 * a), (-b - sd) / (2.0 * a))
}
}


Ошибка:
При вводе чисел 1 4 4.0 вместо ожидаемого ответа -2.000 выводится -2 -2, где ошибка в коде? Пожалуйста, срочо и очень надо

По дате
По рейтингу
Аватар пользователя
Новичок
9мес

Ошибка в вашем коде связана с тем, как вы форматируете вывод корней уравнения. При использовании формата `%g`, вы получаете на выходе числа, которые могут быть округлены до целых значений, если их дробная часть равна 0. Чтобы получить более точные значения, включая дробную часть, используйте форматирование с плавающей точкой, например `%f` или `%.10g`, чтобы избежать лишних округлений.

Вот исправленный код:

12345678910111213141516171819202122232425262728
 package main   
 
import (   
    "fmt"   
    "math"   
)   
 
func SqRoots() {   
    var a, b, c float64   
    fmt.Scanln(&a, &b, &c) 
    d := b*b - 4*a*c 
    if d < 0.0 { 
        fmt.Println("0 0") 
    } else { 
        sd := math.Sqrt(d) 
        x1 := (-b - sd) / (2.0 * a) 
        x2 := (-b + sd) / (2.0 * a) 
         
        // Выводим корни по возрастанию 
        if x1 > x2 { 
            x1, x2 = x2, x1 
        } 
         
        // Используем %.10g для более точного вывода 
        fmt.Printf("%.10g %.10g\n", x1, x2) 
    } 
} 
 



Основные изменения:
1. Я использовал формат `%.10g`, чтобы вывод был более точным и не округлялся до целых чисел.
2. Добавил проверку на сортировку корней по возрастанию, чтобы всегда выводить сначала меньший корень.

Теперь, при вводе `1 4 4`, вывод будет корректным: `-2 -2`.

Аватар пользователя
Просветленный
9мес

Здравствуйте!

Проблема в вашем коде заключается в том, что при дискриминанте `d = 0` уравнение имеет один корень, но ваш код выводит его дважды. В примере с вводом `1 4 4.0` дискриминант равен нулю, и единственный корень равен `-2`. Однако ваш код выводит `-2 -2`, что не соответствует ожидаемому результату `-2.000`.

Чтобы исправить это, необходимо отдельно обработать случай, когда дискриминант равен нулю, и выводить только один корень. Вот как можно изменить вашу функцию `SqRoots`:

```go
package main

import (
"fmt"
"math"
)

func SqRoots() {
var a, b, c float64
fmt.Scanln(&a, &b, &c)
d := b*b - 4*a*c

if d < 0.0 {
fmt.Println("0 0")
} else if d == 0.0 {
x := -b / (2.0 * a)
fmt.Printf("%.3f\n", x)
} else {
sd := math.Sqrt(d)
var x1, x2 float64
if a > 0.0 {
x1 = (-b - sd) / (2.0 * a)
x2 = (-b + sd) / (2.0 * a)
} else {
x1 = (-b + sd) / (2.0 * a)
x2 = (-b - sd) / (2.0 * a)
}
fmt.Printf("%.3f %.3f\n", x1, x2)
}
}

func main() {
SqRoots()
}
```

**Что изменилось:**

1. **Отдельная обработка `d == 0`:**
- Добавлено условие `else if d == 0.0`, которое вычисляет единственный корень и выводит его с тремя знаками после запятой.

2. **Форматирование вывода:**
- Используется форматирование `%.3f` для вывода корней с точностью до трех знаков после запятой, как, вероятно, требуется по условию задачи.

3. **Основная функция `main`:**
- Добавлена функция `main`, чтобы код был самодостаточным и исполняемым.

**Пример работы:**

Для ввода:
```
1 4 4.0
```
Вывод будет:
```
-2.000
```

А для ввода с двумя различными корнями, например:
```
1 -3 2
```
Вывод будет:
```
1.000 2.000
```

И для случая отсутствия корней:
```
1 0 1
```
Вывод будет:
```
0 0
```

Таким образом, функция `SqRoots` корректно обрабатывает все случаи и выводит результат в соответствии с требованиями задачи.