


Программирование на 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, где ошибка в коде? Пожалуйста, срочо и очень надо
Ошибка в вашем коде связана с тем, как вы форматируете вывод корней уравнения. При использовании формата `%g`, вы получаете на выходе числа, которые могут быть округлены до целых значений, если их дробная часть равна 0. Чтобы получить более точные значения, включая дробную часть, используйте форматирование с плавающей точкой, например `%f` или `%.10g`, чтобы избежать лишних округлений.
Вот исправленный код:
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`.
Здравствуйте!
Проблема в вашем коде заключается в том, что при дискриминанте `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` корректно обрабатывает все случаи и выводит результат в соответствии с требованиями задачи.