字符串切割
fn main() {
let input = "12 34 25 67";
let words: Vec<&str> = input.trim().split_whitespace().collect();
println!("fisrt is {}",words[0]);
for (i, word) in words.iter().enumerate() {
println!("input index {} is {}" ,i ,word);
}
}
- split_whitespace().collect();通过空格切割字符串,然后转换为Vec<&str>
- Vec可以理解为一个按顺序存储元素的表,之后再详细讲解,这里只要记住就行
- words[0],取第一个元素,编程里的顺序是从0开始的。
- (i, word)这个是元组,enumerate()集合里元素的特别表现形式,包含Vec序号和Vec元素值。
代码运行结果如下:
fisrt is 12
input index 0 is 12
input index 1 is 34
input index 2 is 25
input index 3 is 67
随机数
在Rust中,生成随机数通常涉及使用rand
crate。这是一个广泛使用的、社区维护的库,用于生成随机数。首先,你需要在Cargo.toml
文件中添加rand
依赖项,然后你可以在你的代码中使用它来生成随机数。
以下是如何在Rust程序中使用rand
crate生成随机数的步骤:
- 在
Cargo.toml
中添加rand
依赖项:
[dependencies]
rand = "0.8"
- 在你的 Rust 代码中导入
rand
模块并使用它来生成随机数:
use rand::Rng; // 导入Rng trait,它提供了生成随机数的方法
fn main() {
let mut rng = rand::thread_rng(); // 获取一个随机数生成器
let number: u32 = rng.gen(); // 生成一个随机u32数字
println!("Random number: {}", number);
let number_between_1_and_100: u32 = rng.gen_range(1..=100); // 生成一个1到100之间的随机u32数字
println!("Random number between 1 and 100: {}", number_between_1_and_100);
}
在这个例子中,rand::thread_rng()
函数提供了一个随机数生成器,它是线程局部的,意味着它是安全的并发使用。gen()
方法用于生成一个随机u32
数字。gen_range()
方法允许你指定一个范围,生成该范围内的随机数。
字符串的遍历
在Rust中,无论是String
还是&str
(字符串切片),都可以使用相同的方法来遍历字符和字节。这里是如何对这两种类型进行遍历的示例:
遍历String
中的字符:
fn main() {
let mut s = String::from("hello world");
// 遍历字符串中的字符
for c in s.chars() {
println!("{}", c);
}
}
遍历&str
(字符串切片)中的字符:
fn main() {
let s: &str = "hello world";
// 遍历字符串切片中的字符
for c in s.chars() {
println!("{}", c);
}
}
循环 练习题
-
打印1到10的整数:
使用for
循环打印从1到10的整数。 -
计算阶乘:
用户输入一个正整数,计算其阶乘。使用for
循环进行累乘。 -
偶数和奇数:
使用for
循环遍历1到20的整数,对于每个数,判断它是偶数还是奇数,并打印出来。 -
生成斐波那契数列:
编写一个程序,使用for
循环生成并打印前20个斐波那契数。 -
逆序打印字符串:
用户输入一个字符串,使用for
循环逆序打印出它的每个字符。 -
寻找最大值:
使用for
循环遍历一系列用户输入的整数,并找到最大值。 -
简单的猜数字游戏:
编写一个程序,程序随机生成一个1到100之间的整数,用户有10次机会猜测这个数。对于每次猜测,程序会告诉用户猜的数是太高、太低还是正确。使用while
循环实现。 -
九九乘法表:
使用嵌套的for
循环打印九九乘法表。 -
质数检测器:
用户输入一个树,判断它是否是质数。使用for
循环和break
语句进行优化。 -
生成100以内的素数列表:
使用for
循环和while
循环生成并打印100以内的所有质数。
习题答案
use std::io;
use rand::Rng;
fn main() {
let number: i32 = get_number_from_input("选择要查看的题目,从1到10:");
match number {
1 => practice_loop_statement_01(),
2 => practice_loop_statement_02(),
3 => practice_loop_statement_03(),
4 => practice_loop_statement_04(),
5 => practice_loop_statement_05(),
6 => practice_loop_statement_06(),
7 => practice_loop_statement_07(),
8 => practice_loop_statement_08(),
9 => practice_loop_statement_09(),
10 => practice_loop_statement_10(),
_ => println!("未知的题目"),
}
}
/*
1打印1到10的整数:
使用 for 循环打印从1到10的整数。
*/
fn practice_loop_statement_01(){
println!("1到10的整数。");
for i in 1..=10{
println!("{}",i);
}
}
// 用户输入一个正整数,计算其阶乘。使用 `for` 循环进行累乘。
fn practice_loop_statement_02(){
let number: i32 = get_number_from_input("请输入一个正整数,我将计算阶乘");
if number > 0{
let mut result = 1;
for i in 1..=number {
result*=i;
}
println!("1*2*3*...{} = {}",number,result );
}else {
println!("非法输入");
}
}
//使用 for 循环遍历1到20的整数,对于每个数,判断它是偶数还是奇数,并打印出来。
fn practice_loop_statement_03(){
for i in 1..=20 {
if i%2==1{
println!("{}是奇数", i);
}else{
println!("{}是偶数", i);
}
}
}
//编写一个程序,使用 for 循环生成并打印前20个斐波那契数。
fn practice_loop_statement_04(){
let mut first = 1;
let mut second = 1;
println!("{}", first);
println!("{}", second);
let mut temp ;
for _i in 3..=20 {
temp = first + second;
first = second;
second = temp;
println!("{}",second );
}
}
//接受一个字符串,并使用 for 循环逆序打印出它的每个字符。
fn practice_loop_statement_05(){
let str: String = get_input_str("请输入一个串字符");
let trimed = str.trim();
let mut index:usize = trimed.len() -1;
loop {
println!("{}", &trimed[index..index+1]);
if index == 0{
break;
}
index -=1;
}
}
//从一系列用户输入的整数,并找到最大值。
fn practice_loop_statement_06(){
println!("请连续输入一系列的整数,用空格隔开");
let input = get_input_str("格式如:`12 23 34`");
let words: Vec<&str> = input.trim().split_whitespace().collect();
let mut max = words[0].parse::<i32>().expect("不是整数");
for word in words.iter(){
let num = word.parse::<i32>().expect("不是整数");
if num > max {
max = num;
}
}
println!("最大值是 {}", max);
}
//编写一个程序,程序随机生成一个1到100之间的整数,用户有10次机会猜测这个数。
//对于每次猜测,程序会告诉用户猜的数是太高、太低还是正确。
fn practice_loop_statement_07(){
let mut rng = rand::thread_rng(); // 获取一个随机数生成器
let rand_num: u32 = rng.gen_range(1..=100);
for _i in 1..=10{
let str = get_input_str("请输入一个1-100之间的整数");
let number = str.trim().parse::<u32>().expect("不是正整数");
if number <1 || number >100{
println!("不是1-100之间,结束游戏");
break;
}
if rand_num > number{
println!("小了");
}else if rand_num < number{
println!("大了");
}else {
println!("恭喜,猜中了");
break;
}
}
}
//使用嵌套的 for 循环打印九九乘法表。
fn practice_loop_statement_08(){
let mut result = String::new();
for i in 1..=9 {
for j in 1..=9 {
if j > i{
continue;
}
result += &format!("{} * {} = {} ", j,i,i*j);
}
result += "\n";
}
println!("{}",result );
}
//用户输入一个正整数,并判断它是否是质数。
fn practice_loop_statement_09(){
let number: i32 = get_number_from_input("请输入一个正整数");
if number<=0 {
println!("不是正整数");
return;
}
for i in 2..number{
if number % i == 0{
println!("不是质数");
return;
}
}
println!("是质数");
}
// 100以内所有的质数
fn practice_loop_statement_10 (){
for i in 2..100 {
let mut is_prime =true;
for j in 2..i{
if i % j == 0{
is_prime = false;
break ;
}
}
if is_prime {
println!("{}是质数",i);
}
}
}