Rust 解决一元二次方程

这个是 Rust 版本,还有个 C++ 版本

Github link
这里是源码和二进制,有 Windows | GNU/Linux | macOS 版本
macOS 版本只有一个 aarch64 版本,因为我没 x86 Mac


最终代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
fn main() {
let mut a = String::new();
let mut b = String::new();
let mut c = String::new();

println!("Please input a");
std::io::stdin().read_line(&mut a).expect("Failed to read line");
let a: f64 = a.trim().parse().expect("Please type a number!");
println!("Please input b");
std::io::stdin().read_line(&mut b).expect("Failed to read line");
let b: f64 = b.trim().parse().expect("Please type a number!");
println!("Please input c");
std::io::stdin().read_line(&mut c).expect("Failed to read line");
let c: f64 = c.trim().parse().expect("Please type a number!");
nya(a, b, c);
}
fn nya(a: f64, b: f64, c: f64) {
let delta = (b * b) - (4.0 * a * c);
if delta > 0.0 {
let x1 = ((-b) + f64::sqrt(delta)) / (2.0 * a);
let x2 = ((-b) - f64::sqrt(delta)) / (2.0 * a);
println!("Two results: x1 = {}; x2 = {}.", x1, x2);
}
if delta == 0.0 {
let x = (-b) / (2.0 * a);
println!("One result: x = {}.", x);
}
if delta < 0.0 {
println!("No result.");
}
}

细节

创建项目

1
2
3
4
$ cd ~/
$ mkdir test
$ cd test
$ cargo init

主函数部分

创建,然后没有返回值(

1
2
3
fn main() {

}

声明 a b c 变量

1
2
3
4
5
fn main() {
let mut a = String::new();
let mut b = String::new();
let mut c = String::new();
}

因为后续需要将String类型转换为浮点数,所以我们使用let mut确保系数是可变的变量。

然后获取输入呐~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
fn main() {
let mut a = String::new();
let mut b = String::new();
let mut c = String::new();

println!("Please input a");
std::io::stdin().read_line(&mut a).expect("Failed to read line");
let a: f64 = a.trim().parse().expect("Please type a number!");
println!("Please input b");
std::io::stdin().read_line(&mut b).expect("Failed to read line");
let b: f64 = b.trim().parse().expect("Please type a number!");
println!("Please input c");
std::io::stdin().read_line(&mut c).expect("Failed to read line");
let c: f64 = c.trim().parse().expect("Please type a number!");
}

Rust 的std::io::stdin提供了很好的工具。当获取的数据类型不匹配时,可以使用.expect输出日志以告知用户需要的数据类型。

重新声明常量时,不需要添加mut,毕竟这个值在赋值后不会改变。这种语法在 C++ 中不起作用,因为你不能重新定义一个量。但在 Rust 中可以被覆盖,前提是之前的声明必须表明该量是可变的(用let mut)


主运算函数部分

1
2
3
fn nya (a: f64, b: f64, c: f64) {

}

指定数据类型。现代机器用f64不会有问题

1
2
3
fn nya (a: f64, b: f64, c: f64) {
let delta = (b * b) - (4.0 * a * c);
}

delta声明为常量

这里出现的所有数字的格式都是*.0,这是因为 Rust 规定某一数据类型的量只能与相同数据类型的量进行操作,因为a b c都是floating-point类型,所以它们只能与类型常量一起执行操作。

逻辑判断部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
fn nya(a: f64, b: f64, c: f64) {
let delta = (b * b) - (4.0 * a * c);
if delta > 0.0 {
let x1 = ((-b) + f64::sqrt(delta)) / (2.0 * a);
let x2 = ((-b) - f64::sqrt(delta)) / (2.0 * a);
println!("Two results: x1 = {}; x2 = {}.", x1, x2);
}
if delta == 0.0 {
let x = (-b) / (2.0 * a);
println!("One result: x = {}.", x);
}
if delta < 0.0 {
println!("No result.");
}
}

主运算函数完成


合体!

1
2
3
4
5
6
7
8
fn main() {
//......
nya(a, b, c);
}

fn nya(a: f64, b: f64, c: f64) {
//......
}

调试

1
2
$ cargo build
$ cargo run

Rust 解决一元二次方程
https://acidec.github.io/2022/11/05/rust-quadratic-equation/
作者
acidec
发布于
2022年11月4日
许可协议