rust-by-practice/solutions/flow-control.md

224 lines
3.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

1.
```rust
fn main() {
let n = 5;
if n < 0 {
println!("{} is negative", n);
} else if n > 0 {
println!("{} is positive", n);
} else {
println!("{} is zero", n);
}
}
```
2.
```rust
fn main() {
let n = 5;
let big_n =
if n < 10 && n > -10 {
println!(", and is a small number, increase ten-fold");
10 * n
} else {
println!(", and is a big number, halve the number");
n / 2
};
println!("{} -> {}", n, big_n);
}
```
3.
```rust
fn main() {
for n in 1..100 {
if n == 100 {
panic!("NEVER LET THIS RUN")
}
}
}
```
4.
```rust
fn main() {
let names = [String::from("liming"), String::from("hanmeimei")];
for name in &names {
// do something with name...
}
println!("{:?}", names);
let numbers = [1, 2, 3];
// the elements in numbers are Copyso there is no move here
for n in numbers {
// do something with name...
}
println!("{:?}", numbers);
}
```
5.
```rust
fn main() {
let a = [4, 3, 2, 1];
// iterate the indexing and value in 'a'
for (i, v) in a.iter().enumerate() {
println!("The {}th element is {}", i + 1, v);
}
}
```
6.
```rust
fn main() {
// A counter variable
let mut n = 1;
// Loop while the condition is true
while n < 10 {
if n % 15 == 0 {
println!("fizzbuzz");
} else if n % 3 == 0 {
println!("fizz");
} else if n % 5 == 0 {
println!("buzz");
} else {
println!("{}", n);
}
n += 1;
}
println!("n reached {}, soloop is over", n);
}
```
7.
```rust
fn main() {
let mut n = 0;
for i in 0..=100 {
if n == 66 {
break;
}
n += 1;
}
assert_eq!(n, 66);
}
```
8.
```rust
fn main() {
let mut n = 0;
for i in 0..=100 {
if n != 66 {
n += 1;
continue;
}
break;
}
assert_eq!(n, 66);
}
```
9.
```rust
fn main() {
let mut count = 0u32;
println!("Let's count until infinity!");
// Infinite loop
loop {
count += 1;
if count == 3 {
println!("three");
// Skip the rest of this iteration
continue;
}
println!("{}", count);
if count == 5 {
println!("OK, that's enough");
break;
}
}
assert_eq!(count, 5);
}
```
10.
```rust
fn main() {
let mut counter = 0;
let result = loop {
counter += 1;
if counter == 10 {
break counter * 2;
}
};
assert_eq!(result, 20);
}
```
11.
```rust
fn main() {
let mut count = 0;
'outer: loop {
'inner1: loop {
if count >= 20 {
// This would break only the inner1 loop
break 'inner1; // `break` is also ok
}
count += 2;
}
count += 5;
'inner2: loop {
if count >= 30 {
// This breaks the outer loop
break 'outer;
}
// This will continue the outer loop
continue 'outer;
}
}
assert!(count == 30)
}
```