Menos Teoria, Mais Rust
Rust é famosa por sua velocidade, segurança e prevenção de bugs. Mas por onde começar? O livro oficial é ótimo, mas às vezes queremos apenas ir direto ao ponto.
É por isso que este livro existe.
Ele foi criado para ser sua ponte entre a teoria complexa e o código funcional, facilitando sua introdução à linguagem qualquer que seja seu nível. A abordagem é direta: menos teoria, mais prática.
O que você encontrará aqui:
- Inúmeros exemplos;
- Perguntas rápidas de fixação (3 a 5 minutos);
- Projetos para por a mão na massa;
- Links com material complementar.
Vamos começar a programar?
Prefácio
“A beleza que vive no ato de compartilhar algo com os outros.” Monja Coen
Introdução ao Rust
Rust foi criado por Graydon Hoare na Mozilla Research em 2010. A primeira versão estável, 1.0, foi lançada em 2015, marcando o início de sua popularidade e adoção mais ampla na indústria.
Rust é uma linguagem de código aberto (open-source) e compilada, o que significa que é traduzida diretamente para código de máquina. Isso a torna extremamente rápida, sem a necessidade de um interpretador como Python ou JavaScript. Ela se posiciona como uma alternativa a linguagens como C e C++, que são conhecidas por sua performance, mas também são mais suscetíveis a erros de memória, como null pointers (ponteiros nulos) ou data races (condições de corrida de dados).
A grande inovação do Rust é o Ownership Model (Modelo de Posse), um sistema que garante a segurança de memória em tempo de compilação. Isso significa que o compilador do Rust verifica se o seu código está livre de erros de memória antes mesmo de ser executado. O compilador se torna um “guardião” da memória, e se ele não aprovar o seu código, ele simplesmente não compila. Essa abordagem elimina toda uma classe de bugs que são comuns em outras linguagens.
Começando
Olá, seja bem-vindo!
Este projeto foi criado não apenas para ajudá-lo a aprender a linguagem, mas também como um material de consulta. A longo prazo, este conteúdo será expandido continuamente, até se tornar algo mais completo e abordar de forma simples diversos tópicos complexos que ainda carecem de documentação, principalmente em português.
Espero de coração que você consiga aprender junto comigo e que este material lhe seja tão útil quanto tem sido para mim. Aproveite bem o que foi construído até aqui e continue acompanhando, pois novos conteúdos serão adicionados regularmente.
Bons estudos!
Rust Playground
O Rust Playground é a maneira mais rápida de começar a experimentar com Rust. É um ambiente online onde você pode:
- Escrever e rodar código Rust diretamente no seu navegador;
- Testar pequenos exemplos e conceitos;
- Compartilhar código com outros desenvolvedores;
- Verificar como o compilador se comporta em diferentes edições do Rust.
Acesse: https://play.rust-lang.org
Instalar
O rustup é o instalador oficial e gerenciador de versões do Rust. Ele permite instalar e atualizar o compilador, o Cargo e outras ferramentas do ecossistema com facilidade.
Para instalar no macOS, Linux ou em outros sistemas operacionais tipo Unix, execute o seguinte em seu terminal e siga as instruções na tela:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Certifique-se de visitar o site oficial do Rust para melhor entender o processo de instalação e outras ferramentas:
https://www.rust-lang.org/tools/install
Se você estiver no Windows, procure por “Outros Métodos de Instalação”:
https://forge.rust-lang.org/infra/other-installation-methods.html
Versão
Se você deseja ver a versão do Rust:
rustc --version
Se você deseja ver a versão do Cargo:
cargo --version
Para visualizar informações completas sobre o ambiente Rust instalado, incluindo toolchains ativos e componentes, utilize:
rustup show
Desinstalar
Se em algum momento você quiser desinstalar o Rust, execute:
rustup self uninstall
Atenção: Isso removerá o rust, cargo e todas as ferramentas instaladas via
rustupdo seu sistema.
Editores e IDEs
A seguir, alguns editores e IDEs recomendados para desenvolvimento em Rust.
Zed
Um editor de código moderno e extremamente rápido, desenvolvido pelos criadores do Atom, focado em desempenho e colaboração em tempo real.
https://zed.dev/
RustRover: IDE Rust da JetBrains
É a IDE dedicada da JetBrains para Rust, oferecendo recursos avançados de desenvolvimento, como depuração inteligente, refactoring (refatoração) e análise de código.
https://www.jetbrains.com/rust/
VS Code: com a extensão rust-analyzer
É uma combinação popular e leve para o desenvolvimento em Rust, oferecendo autocomplete (autocompletar), verificação de erros em tempo real e integração com as ferramentas do ecossistema Rust.
https://code.visualstudio.com/
https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer
Helix
Editor de texto modal moderno inspirado em Vim/Kakoune, com suporte nativo a LSP (Language Server Protocol) e destaque de sintaxe, oferecendo uma experiência de edição rápida e eficiente sem a necessidade de configuração inicial.
https://helix-editor.com/
Config: languages.toml
O arquivo de configuração deve ser colocado em ~/.config/helix/languages.toml.
[[language]]
name = "rust"
auto-format = true
roots = [
"Cargo.toml",
"Cargo.lock"
]
[language.auto-pairs]
'(' = ')'
'{' = '}'
'[' = ']'
'"' = '"'
'`' = '`'
[language-server.rust-analyzer]
command = "rust-analyzer"
[language-server.rust-analyzer.config]
inlayHints.bindingModeHints.enable = false
inlayHints.closingBraceHints.minLines = 10
inlayHints.closureReturnTypeHints.enable = "with_block"
inlayHints.discriminantHints.enable = "fieldless"
inlayHints.lifetimeElisionHints.enable = "skip_trivial"
inlayHints.typeHints.hideClosureInitialization = false
Neovim: com plugins específicos para Rust
Evolução moderna do Vim com suporte nativo a LSP, interface assíncrona e extensibilidade via Lua, sendo altamente customizável e ideal para desenvolvedores que buscam um editor modal poderoso e eficiente.
https://neovim.io/
Config:
Entre os plugins mais recomendados para Rust no Neovim estão o rustaceanvim (integração completa com rust-analyzer) e o crates.nvim (gerenciamento de dependências do Cargo diretamente no editor).
Nota: O guia externo abaixo pode ficar desatualizado com o tempo. Prefira consultar a documentação oficial dos plugins para configurações mais recentes.
https://rsdlt.github.io/posts/rust-nvim-ide-guide-walkthrough-development-debug/
Conceitos Comuns de Programação
Este capítulo foi desenvolvido para apresentar os conceitos fundamentais da linguagem de programação Rust. No entanto, os tópicos abordados aqui também estão presentes em outras linguagens de programação. Se esta é a primeira vez que você se depara com esses conceitos, espero que você possa entender cada ponto claramente, pois isso forma a base essencial para o que virá nos próximos capítulos.
No final, você encontrará alguns exercícios práticos, permitindo que você verifique se perdeu algum conceito durante seus estudos. Mas não se preocupe, as perguntas são objetivas e incluem as respostas.
Comentários
Comentários são usados para documentar seu código, tornando-o mais compreensível para você e outros desenvolvedores. Eles são ignorados pelo compilador, o que significa que não afetam como seu programa é executado, apenas a sua legibilidade.
//
#![allow(unused)]
fn main() {
// Este é um comentário de linha única.
}
/* */
#![allow(unused)]
fn main() {
/*
...
Este é um comentário de múltiplas linhas.
...
*/
}
///
#![allow(unused)]
fn main() {
/// Comentários de documentação (doc comments):
/// - Geram documentação automaticamente: cargo doc;
/// - São compatíveis com markdown;
/// - Documentam o item seguinte: função, módulo, struct, etc.
}
Execute
cargo doc --openpara gerar e abrir a documentação do seu projeto no navegador.
//!
#![allow(unused)]
fn main() {
//! Comentário de documentação interno (inner doc comment):
//! - Documenta módulos/crates: lib.rs;
//! - Colocado no início dos arquivos.
}
/* // /**/ */
#![allow(unused)]
fn main() {
/* Comentários aninhados (nested comments):
// Rust permite comentários dentro do bloco de comentário.
/* ... */
*/
}
A macro print! e suas variações são usadas para depuração, informar o usuário e gerar saída formatada.
print!
#![allow(unused)]
fn main() {
// imprime o texto sem quebra de linha
print!("Olá,");
print!("mundo!");
print!("...");
}
println!
#![allow(unused)]
fn main() {
// imprime o texto com quebra de linha
println!("Olá,");
println!("mundo!");
println!("...");
}
eprint!
#![allow(unused)]
fn main() {
// imprime o texto de erro sem quebra de linha
eprint!("ERRO:");
eprint!("Falha ao carregar arquivo!");
}
eprintln!
#![allow(unused)]
fn main() {
// imprime o texto de erro com quebra de linha
eprintln!("ERRO:");
eprintln!("Falha ao carregar arquivo!");
}
Em terminais Unix, você pode redirecionar a saída padrão com
>e a saída de erro com2>:cargo run > saida.txt 2> erros.txt
Caracteres de Escape
São aqueles que começam com \ e são usados para representar caracteres especiais que não podemos (ou não devemos) digitar literalmente no código, como quebras de linha, tabulações, aspas dentro de strings, etc.
\n
#![allow(unused)]
fn main() {
// quebra de linha
println!("Qual é o seu nome?\nMeu nome é Alice!");
}
\'
#![allow(unused)]
fn main() {
// aspas simples
println!("Qual é o seu nome?\'Meu nome é Alice!\'");
}
\"
#![allow(unused)]
fn main() {
// aspas duplas
println!("Qual é o seu nome?\"Meu nome é Alice!\"");
}
\\
#![allow(unused)]
fn main() {
// barra invertida
println!("Qual é o seu nome?\\Meu nome é Alice!\\");
}
\t
#![allow(unused)]
fn main() {
// tabulação horizontal (tab)
println!("Qual é o seu nome?\tMeu nome é\tAlice!");
}
r
#![allow(unused)]
fn main() {
// raw string: trata a barra invertida literalmente, sem processar sequências de escape
println!(r"C:\Users\Alice\Documents");
}
r#...#
#![allow(unused)]
fn main() {
// raw strings (string literal/sem processamento de escape)
println!(r#"
Qual é o seu nome?
Meu nome é "Alice!"
"#);
}
\x
#![allow(unused)]
fn main() {
// caractere ASCII de 7 bits - 0x00 e 0x7F
println!("\x53\x6E\x6F\x6F\x70\x79\x21");
}
\u{...}
#![allow(unused)]
fn main() {
// unicode (permite usar emojis ou caracteres especiais)
println!("(\u{25D5}\u{2323}\u{25D5})");
}
\r
#![allow(unused)]
fn main() {
// move o cursor de volta para o início da linha sem avançar para a próxima
print!("Carregando ...\r");
}
Comumente usado para animações de terminal:
\ro efeito pode variar conforme o terminal ou sistema operacional.
Variáveis
Variáveis são espaços nomeados na memória que podem armazenar um valor.
#![allow(unused)]
fn main() {
let nome = "Maria";
println!("Qual é o seu nome: {}", nome);
}
#![allow(unused)]
fn main() {
let idade = 29;
println!("Qual sua idade? {}", idade);
}
#![allow(unused)]
fn main() {
let nome = "Maria";
let idade = 29;
println!("{} tem {} anos", nome, idade);
}
Saiba mais sobre variáveis.
Mutabilidade
Uma vez que o valor de uma variável é definido, você não pode alterá-lo posteriormente. No entanto, usar mut após let torna a variável criada mutável.
let mut
#![allow(unused)]
fn main() {
let mut nome = "Miguel";
println!("Qual é o seu nome: {}", nome);
nome = "Sophia";
println!("Qual é o seu nome: {}", nome);
}
#![allow(unused)]
fn main() {
let mut idade: u8 = 87;
println!("Qual sua idade? {}", idade);
idade = 49;
println!("Qual sua idade? {}", idade);
}
Constante
A constante é um identificador com valor fixo e imutável, avaliado em tempo de compilação. Por convenção, o nome de constantes em Rust é escrito em SCREAMING_SNAKE_CASE.
const PI: f32 = 3.14159;
fn main () {
println!("{:.2}", PI);
}
const ERROR_404: &str = "Erro 404";
fn main () {
println!("{}", ERROR_404);
}
O tópico de tipos de dados será abordado em detalhes no próximo capítulo.
Formatação
A macro format! em Rust é usada para melhorar a formatação da saída de dados, utilizando {} como placeholders (espaços reservados) que serão preenchidos com a informação.
{}
#![allow(unused)]
fn main() {
let nome = "Rafael";
let idade = 12;
println!("Oi, eu sou {}, tenho {} anos", nome, idade);
}
#![allow(unused)]
fn main() {
let nome = "Manuela";
let idade = 37;
println!("Oi, eu sou {nome}, tenho {idade} anos");
}
format!
Sempre retorna uma String com o conteúdo formatado.
#![allow(unused)]
fn main() {
let nome = "Arthur";
let idade = 69;
let texto = format!("Oi, eu sou {}, tenho {} anos", nome, idade);
println!("{}", texto);
}
#![allow(unused)]
fn main() {
let nome = "Charlie Brown";
let idade = 8;
let texto = format!("Eu sou o {nome}, tenho {idade} anos");
println!("{}", texto);
}
Para mais informações: std::fmt
Formatação para Debugging
Em Rust, {:?} e {:#?} são especificadores de formato que utilizam o trait Debug para exibir a representação interna de valores. São especialmente úteis para depuração e inspeção durante o desenvolvimento.
{:?}
#![allow(unused)]
fn main() {
// saída compacta
let pessoa: (&str, u8, f32) = ("Laura", 19, 1.77);
println!("{:?}", pessoa);
}
{:#?}
#![allow(unused)]
fn main() {
// saída mais legível
let pessoa: (&str, u8, f32) = ("Pedro", 90, 1.90);
println!("{:#?}", pessoa);
}
{var:?} ou {var:#?}
#![allow(unused)]
fn main() {
let pessoa: (&str, u8, f32) = ("Violet", 28, 1.58);
println!("{pessoa:?}");
}
#![allow(unused)]
fn main() {
let pessoa: (&str, u8, f32) = ("Violet", 28, 1.58);
println!("{pessoa:#?}");
}
Shadowing (Sombreamento)
Você pode declarar uma nova variável com o mesmo nome de uma variável existente, mas a variável anterior é ocultada (shadowed) pela nova.
#![allow(unused)]
fn main() {
let comida = "Pizza";
println!("{}", comida);
let comida = "Biscoitos";
println!("{}", comida);
let comida = "Sorvete";
println!("{}", comida);
}
#![allow(unused)]
fn main() {
let animal = "Cachorro";
println!("{}", animal);
let animal = "Pássaro";
println!("{}", animal);
let animal = "Gato";
println!("{}", animal);
}
#![allow(unused)]
fn main() {
let numero: i8 = 80;
println!("{}", numero);
let numero: f32 = 2.;
println!("{}", numero);
}
Escopo
Envolver um código entre chaves {} cria um novo escopo (bloco de código) que limita a visibilidade das variáveis definidas dentro dele, logo não pode ser acessada fora daquele bloco.
#![allow(unused)]
fn main() {
let nome = "Aurora";
println!("{}", nome);
{
let nome = "Ravi";
println!("{}", nome);
}
println!("{}", nome);
}
#![allow(unused)]
fn main() {
let numero = 40;
println!("{}", numero);
{
let numero = 0;
println!("{}", numero);
}
println!("{}", numero);
}
Questões - Conceitos Comuns de Programação
01 - Como você escreveria um comentário de linha única em Rust?
Resposta
fn main() {
// Este é um comentário de linha única
}
02 - Qual é a sintaxe para comentários de bloco em Rust?
Resposta
fn main() {
/*
Este é um comentário de
bloco que abrange várias
linhas.
*/
}
03 - Você pode aninhar comentários de bloco em Rust? Dê um exemplo.
Resposta
fn main() {
/*
Início do comentário externo
/* Este é um comentário de bloco aninhado */
Fim do comentário externo
*/
}
04 - Qual macro você usaria para imprimir texto na mesma linha, sem adicionar uma quebra de linha no final?
Resposta
fn main() {
print!("Imprimir sem adicionar uma nova linha no final!");
}
05 - Qual macro você usaria para imprimir texto e adicionar automaticamente uma quebra de linha no final?
Resposta
fn main() {
println!("Imprimir e adicionar nova linha no final!");
}
06 - Escreva um código que imprima “Hello” e “World” na mesma linha usando a macro print!.
Resposta
fn main() {
print!("Hello, ");
print!("World");
}
07 - Como você insere uma quebra de linha explícita dentro de uma string que está sendo impressa com println!?
Resposta
fn main() {
println!("Primeira linha\nSegunda linha");
}
08 - Que outras sequências de escape você pode usar em strings Rust? Dê exemplos de pelo menos 3.
Resposta
fn main() {
println!("Barra invertida: \\");
println!("Olá \"mundo\"");
println!(r"C:\Usuários\Snoopy\Documentos\");
}
09 - Como você declara uma variável chamada score e atribui a ela o valor 100?
Resposta
fn main() {
let score = 100;
println!("Score: {}", score);
}
10 - Escreva uma linha de código que declare uma variável cidade com o valor Recife e a imprima na tela.
Resposta
fn main() {
let cidade = "Recife";
println!("Cidade: {}", cidade);
}
11 - O que acontece se você tentar usar uma variável antes de declará-la em Rust?
Resposta
fn main() {
// Isto causaria um erro de tempo de compilação:
println!("{}", x);
let x = 5;
}
12 - Você pode declarar uma variável sem inicializá-la em Rust? Se sim, mostre como usá-la com segurança.
Resposta
fn main() {
let x: i32;
x = 42;
println!("x = {}", x);
}
13 - Declare uma variável mutável chamada contador inicializada com 0. Em seguida, escreva o código para alterar o valor para 5 e imprima.
Resposta
fn main() {
let mut contador = 0;
println!("Contador = {}", contador);
contador = 5;
println!("Contador = {}", contador);
}
14 - O que acontece se você tentar modificar uma variável imutável em Rust?
Resposta
fn main() {
let x = 1;
x = 2;
println!("x = {}", x);
}
15 - Como você declara uma constante chamada MAX_SPEED com o valor “9000” do tipo i32?
Resposta
const MAX_SPEED: i32 = 9000;
fn main() {
println!("Max Speed: {}", MAX_SPEED);
}
16 - É possível alterar o valor de uma constante após sua declaração?
Resposta
const MAX_SPEED: i32 = 100;
fn main() {
MAX_SPEED = 200; // erro: cannot assign to this expression
}
Não. Constantes são sempre imutáveis — a palavra-chave mut não pode ser usada com const de forma alguma. Qualquer tentativa de reatribuição resulta em erro de compilação.
17 - Quais são as principais diferenças entre constantes e variáveis imutáveis em Rust?
Resposta
const CONSTANTE_GLOBAL: i32 = 100;
fn main() {
let variavel_imutavel = 200;
println!("Constante: {}, Variável: {}", CONSTANTE_GLOBAL, variavel_imutavel);
// Constantes:
// - Sempre imutáveis: 'mut' não é permitido de forma alguma (nem como tentativa);
// - Tipo explícito obrigatório (ex: : i32);
// - Avaliadas em tempo de compilação;
// - Podem ser declaradas em escopo global (fora de funções).
// Variáveis Imutáveis (let):
// - Podem ser tornadas mutáveis com 'mut';
// - O tipo pode ser inferido;
// - Locais ao seu escopo;
// - Podem ser definidas como o resultado de qualquer expressão.
}
18 - Como você usaria a macro format! para criar a string “O valor é: 42” a partir do número 42?
Resposta
fn main() {
let numero = 42;
let numero_formatado = format!("O valor é: {}", numero);
println!("{}", numero_formatado);
}
19 - Como você pode formatar o número “7” para que ele seja exibido como “0007” usando format!?
Resposta
fn main() {
let numero = 7;
let numero_formatado = format!("{:04}", numero);
println!("{}", numero_formatado);
}
20 - Como você formataria um número de ponto flutuante para mostrar exatamente 2 casas decimais?
Resposta
fn main() {
let pi = 3.14159265359;
println!("Pi: {:.2}", pi);
let pi_formatado = format!("{:.2}", pi);
println!("Pi: {}", pi_formatado);
}
21 - Demonstre como usar argumentos posicionais em format strings.
Resposta
fn main() {
let nome = "Snoopy";
let idade = 8;
let cidade = "Califórnia";
// Argumentos posicionais
println!("{0} tem {1} anos e mora na {2}", nome, idade, cidade);
// Argumentos nomeados
println!("{nome} tem {idade} anos e mora na {cidade}");
// Misturado
println!("{} tem {idade} anos e mora na {cidade}", nome);
}
22 - O que é shadowing em Rust? Explique com um exemplo de código e qual seria a saída.
Resposta
fn main() {
let x = 5;
println!("Primeiro x: {}", x);
let x = x + 1;
println!("Segundo x: {}", x);
let x = x * 2;
println!("Terceiro x: {}", x);
let x = "Olá";
println!("Quarto x: {}", x);
}
23 - Qual será a saída do seguinte código?
fn main () {
let x = 5;
let x = x + 1;
{
let x = x * 2;
println!("O valor interno de x é: {}", x);
}
println!("O valor externo de x é: {}", x);
}
Resposta
fn main() {
let x = 5;
let x = x + 1; // x = 6
{
let x = x * 2; // x = 12
println!("O valor interno de x é: {}", x); // Saida: 12
}
println!("O valor externo de x é: {}", x); // Saida: 6
}
24 - Qual será a saída do seguinte código? Explique por quê.
fn main () {
let a = 10;
{
let b = 20;
println!("Dentro do bloco: a = {}, b = {}", a, b);
}
println!("Fora do bloco: b = {}", b);
}
Resposta
fn main() {
let a = 10;
{
let b = 20;
println!("Dentro do bloco: a = {}, b = {}", a, b);
// Saida: Dentro do bloco: a = 10, b = 20
}
// println!("Fora do bloco: b = {}", b);
// Erro: b não está no escopo
}
Tipos de Dados
Este capítulo explora os tipos de dados fundamentais disponíveis no Rust, cobrindo os blocos de construção essenciais que você usará para armazenar e manipular informações em seus programas. Compreender esses tipos de dados é crucial para escrever código Rust eficiente, pois cada tipo possui características específicas, requisitos de memória e casos de uso.
Uma das principais forças do Rust é o seu sistema de tipagem estática, o que significa que o compilador sabe o tipo exato de cada variável em tempo de compilação, proporcionando benefícios tanto em segurança quanto em desempenho. Assim como nos capítulos anteriores, exercícios práticos são fornecidos no final para reforçar sua compreensão e garantir que você esteja pronto para prosseguir com confiança.
u: inteiros não-assinados
São tipos de dados que só podem armazenar números inteiros positivos ou zero.
u8
#![allow(unused)]
fn main() {
// u8 = 0 a 255
let inteiro: u8 = 16;
println!("{}", inteiro);
}
u16
#![allow(unused)]
fn main() {
// u16 = 0 a 65_535
let inteiro: u16 = 32;
println!("{}", inteiro);
}
u32
#![allow(unused)]
fn main() {
// u32 = 0 a 4_294_967_295
let inteiro: u32 = 64;
println!("{}", inteiro);
}
u64
#![allow(unused)]
fn main() {
// u64 = 0 a 18_446_744_073_709_551_615
let inteiro: u64 = 128;
println!("{}", inteiro);
}
u128
#![allow(unused)]
fn main() {
// u128 = 0 a ...
let inteiro: u128 = 256;
println!("{}", inteiro);
}
i: inteiros assinados
São tipos de dados que só podem armazenar números inteiros positivos, negativos ou zero.
i8
#![allow(unused)]
fn main() {
// i8 = -128 a 127
let inteiro: i8 = -16;
println!("{}", inteiro);
}
i16
#![allow(unused)]
fn main() {
// i16 = -32_768 a 32_767
let inteiro: i16 = -32;
println!("{}", inteiro);
}
i32
#![allow(unused)]
fn main() {
// i32 = -2_147_483_648 a 2_147_483_647
let inteiro: i32 = -64;
println!("{}", inteiro);
}
i64
#![allow(unused)]
fn main() {
// i64 = -9_223_372_036_854_775_808 a 9_223_372_036_854_775_807
let inteiro: i64 = -128;
println!("{}", inteiro);
}
i128
#![allow(unused)]
fn main() {
// i128 = ... a ...
let inteiro: i128 = -256;
println!("{}", inteiro);
}
f32 e f64: ponto flutuante
São tipos de dados que só podem armazenar números que possuem uma parte fracionária ou números reais, positivos, negativos ou zero.
f32
#![allow(unused)]
fn main() {
// f32 = -3.4e+38 a +3.4e+38
let flutuante: f32 = 64.;
println!("{}", flutuante);
}
f64
#![allow(unused)]
fn main() {
// f64 = -1.8e+308 to +1.8e+308
let flutuante: f64 = 128.;
println!("{}", flutuante);
}
bool: booleano
Representa apenas dois tipos de valores: true (verdadeiro) ou false (falso).
true
#![allow(unused)]
fn main() {
let booleano: bool = true;
println!("1 + 1 = 2? {}", booleano);
}
false
#![allow(unused)]
fn main() {
let booleano: bool = false;
println!("1 + 1 = 2? {}", booleano);
}
char: caractere
Usado para representar um único caractere e requer o uso de aspas simples (por exemplo, ‘a’).
#![allow(unused)]
fn main() {
let caractere: char = 'a';
println!("{}", caractere);
}
#![allow(unused)]
fn main() {
let simbolo: char = '⭐';
println!("{}", simbolo);
}
String e &str
Sequência de caracteres UTF-8 que pode formar uma palavra ou frase, incluindo letras, números, símbolos ou qualquer outro tipo de caractere especial.
String
#![allow(unused)]
fn main() {
let frase: String = String::from("Um pouco de Rust para hoje!");
println!("{}", frase);
}
&str
#![allow(unused)]
fn main() {
let frase: &str = "Chega de Rust por hoje!";
println!("{}", frase);
}
O tópico String e &str será abordado melhor em um capítulo posterior.
Tuplas
Combinam múltiplos valores de tipos diferentes em uma única estrutura de dados composta com um tamanho fixo.
inferência de tipos
#![allow(unused)]
fn main() {
let tipos_dados = ("a", 1);
println!("{:?}", tipos_dados);
}
#![allow(unused)]
fn main() {
let tipos_dados = ('b', 2.);
println!("{:?}", tipos_dados);
}
inferência com atribuição explícita
#![allow(unused)]
fn main() {
let tipos_dados: (&str, u8) = ("c", 3);
println!("{:?}", tipos_dados);
}
#![allow(unused)]
fn main() {
let tipos_dados: (String, bool) = (String::from("d"), true);
println!("{:?}", tipos_dados);
}
Desestruturação com tipos explícitos
#![allow(unused)]
fn main() {
let (texto, numero): (&str, i8);
(texto, numero) = ("e", 44);
println!("{}, {}", texto, numero);
}
#![allow(unused)]
fn main() {
let (texto, numero): (String, f64);
(texto, numero) = (String::from("f"), 128.5);
println!("{}, {}", texto, numero);
}
Desestruturação simples
#![allow(unused)]
fn main() {
let (letra, ativo): (char, bool) = ('e', false);
let saida = (letra, ativo);
println!("{:?}", saida);
}
#![allow(unused)]
fn main() {
let pessoa = ("Gregorio", 64, 1.82);
let (nome, idade, altura) = pessoa;
println!("{}, {}, {}", nome, idade, altura);
}
Modificando Tuplas
Ao alterar valores de tupla, você precisa especificar o índice do elemento que deseja modificar. Os índices da tupla começam em 0 e correspondem à posição de cada elemento.
#![allow(unused)]
fn main() {
// 0 1 2
let mut perfil = ("Alice", 25, 1.70);
println!("Nome: {:?}", perfil.0);
println!("Idade: {:?}", perfil.1);
println!("Altura: {:?}\n", perfil.2);
perfil.1 = 40;
perfil.2 = 1.55;
println!("Nome: {:?}", perfil.0);
println!("Idade: {:?}", perfil.1);
println!("Altura: {:?}", perfil.2);
}
#![allow(unused)]
fn main() {
let mut perfil = ("Julio", 90, 1.98);
println!("{:#?}", perfil);
perfil.0 = "Moana";
perfil.1 = 58;
perfil.2 = 1.62;
println!("{:#?}", perfil);
}
Array
Uma sequência de elementos de tamanho fixo onde todos os itens devem ser do mesmo tipo de dado.
#![allow(unused)]
fn main() {
let lista = ["Batata", "Cebola", "Alho", "Cenoura"];
println!("{:?}", lista);
}
#![allow(unused)]
fn main() {
let lista: [f32; 4] = [0.2, 0.4, 0.6, 0.8];
println!("{:?}", lista);
}
#![allow(unused)]
fn main() {
let lista: [&str; 4];
lista = ["Canadá", "Japão", "Brasil", "Egito"];
println!("{:?}", lista);
}
#![allow(unused)]
fn main() {
let [a, b, c]: [char; 3] = ['1', '2', '3'];
let lista = [a, b, c];
println!("{:?}", lista);
}
#![allow(unused)]
fn main() {
let lista: [String; 3] = [String::from("A1"), String::from("B2"), String::from("C3")];
let [a, b, c] = lista;
println!("{:?}, {:?}, {:?}", a, b, c);
}
Modificando Arrays
Ao alterar valores de array, você precisa especificar o índice do elemento que deseja modificar. Os índices do array começam em 0 e correspondem à posição de cada elemento:
#![allow(unused)]
fn main() {
// 0 1 2 3 4
let mut scores = [40, 50, 60, 70, 80];
println!("Score [0]: {}", scores[0]);
println!("Score [1]: {}", scores[1]);
println!("Score [2]: {}\n", scores[2]);
scores[0] = 10;
scores[1] = 20;
scores[2] = 30;
println!("Score [0]: {}", scores[0]);
println!("Score [1]: {}", scores[1]);
println!("Score [2]: {}", scores[2]);
}
#![allow(unused)]
fn main() {
let mut numero: [i32; 5] = [1, 2, 3, 4, 5];
println!("{:#?}", numero);
numero[0] = 10;
numero[2] = 30;
numero[4] = 50;
println!("{:#?}", numero);
}
#![allow(unused)]
fn main() {
let mut nomes: [&str; 3] = ["Cecília", "Maite", "Helena"];
println!("{:#?}", nomes);
nomes[0] = "Gael";
nomes[1] = "Theo";
nomes[2] = "Rafael";
println!("{:#?}", nomes);
}
Questões - Estruturas de Dados
01 - Declare uma variável com nome positivo do tipo u32 com o valor 100. Declare outra variável com nome negativo do tipo i32 com o valor -100. Imprima ambas. Agora, tente atribuir -5 à variável positivo. O que acontece ao tentar compilar e por quê?
Resposta
fn main() {
let positivo: u32 = 100;
println!("{:?}", positivo);
let negativo: i32 = -100;
println!("{:?}", negativo);
// Erro:
// let positivo: u32 = -5;
}
02 - Escreva código Rust para declarar uma variável max_u8 do tipo u8 e atribua a ela o maior valor possível para esse tipo. Imprima esse valor e em seguida, no seu código, tente atribuir max_u8 + 1 a uma nova variável u8. O que acontece durante a execução?
Resposta
fn main() {
let max_u8: u8 = u8::MAX;
println!("{:?}", max_u8);
// erro: causaria um overflow (estouro)
// let max_u8: u8 = u8::MAX + 1;
// println!("{:?}", max_u8);
}
03 - Declare uma variável chamada populacao do tipo u64 e atribua a ela o valor “7_800_000_000”. Em seguida, imprima o valor da variável formatada.
Resposta
fn main() {
let populacao: u64 = 7_800_000_000;
println!("População: {populacao:?}");
}
04 - Você precisa armazenar a contagem de visualizações de vídeos, que pode chegar a bilhões, mas nunca será negativo. Escolha o tipo não assinado mais apropriado (u32 ou u64). Declare uma variável video_views com este tipo, atribua “2500000000” a ela e imprima.
Resposta
fn main() {
let video_views: u64 = 2_500_000_000;
println!("{:?}", video_views);
}
05 - Declare duas variáveis, min_val_i8 e max_val_i8, ambas do tipo i8. Atribua a elas, respectivamente, o menor e o maior valor possível para o tipo i8. Imprima ambos os valores.
Resposta
fn main() {
let min_val_i8: i8 = i8::MIN;
println!("{:?}", min_val_i8);
let max_val_i8: i8 = i8::MAX;
println!("{:?}", max_val_i8);
}
06 - Tente declarar uma variável valor_a do tipo u8 com 10 e valor_b do tipo u8 com -10. O que acontece com valor_b durante a compilação?
Resposta
fn main() {
let valor_a: u8 = 10;
println!("{:?}", valor_a);
let valor_b: u8 = -10;
println!("{:?}", valor_b);
}
07 - Em um sistema embarcado com memória limitada, você precisa armazenar uma leitura de sensor que varia de -10.0 a +10.0 com duas casas decimais de precisão. Declare uma variável leitura_do_sensor usando f32 e atribua 7.89.
Resposta
fn main() {
let leitura_do_sensor: f32 = 7.89;
println!("{:?}", leitura_do_sensor);
}
08 - Declare um caractere ASCII char_ascii = ‘Z’; e um caractere unicode char_unicode = ‘Ω’;. Use std::mem::size_of_val(&char_ascii) e std::mem::size_of_val(&char_unicode) para imprimir o tamanho em bytes de cada um. O que você observa?
Resposta
fn main() {
let char_ascii: char = 'Z';
println!("{:?}", char_ascii);
let char_unicode: char = 'Ω';
println!("{:?}", char_unicode);
println!("{:?}", std::mem::size_of_val(&char_ascii));
println!("{:?}", std::mem::size_of_val(&char_unicode));
}
09 - Tente declarar uma variável char com mais de um caractere, por exemplo: let letra: char = ‘ab’;. O que acontece ao tentar compilar?
Resposta
fn main() {
// erro: deve ter apenas um caractere
let letra: char = 'ab';
println!("{:?}", letra);
}
10 - Declare uma variável arquivo_carregado e atribua true. Declare apresenta_erro e atribua false. Imprima ambas e em seguida, tente atribuir o inteiro 1 a uma variável booleana. O que o compilador Rust diz?
Resposta
fn main() {
let arquivo_carregado: bool = true;
println!("{:?}", arquivo_carregado);
let apresenta_erro: bool = false;
println!("{:?}", apresenta_erro);
// Tipos incompatíveis, esperava-se `bool`, encontrado inteiro
// let valor: bool = 1;
// println!("{:?}", valor);
}
11 - Crie uma tupla registro que contenha um nome (&str), uma idade (u8), e uma nota de aprovação (f32). Exemplo: (“Maria”, 22, 7.5). Imprima a tupla inteira.
Resposta
fn main() {
let registro: (&str, u8, f32) = ("Maria", 22, 7.5);
println!("{:#?}", registro);
}
12 - Crie uma tupla chamada server_response que contenha um código de status HTTP (u16) e uma mensagem de resposta (&str), como (404, “Not Found”). Imprima a tupla.
Resposta
fn main() {
let server_response: (u16, &str) = (404, "Not Found");
println!("{:?}", server_response);
}
13 - Dada a tupla let produto_info = (“Laptop XPTO”, 1250.99, 15); (nome, preço, quantidade em estoque), acesse e imprima o preço e a quantidade usando a indexação de tupla (ex: product_info.1).
Resposta
fn main() {
let produto_info: (&str, f32, u16) = ("Laptop XPTO", 1.250_000, 15);
println!(
"Produto: {} \nQuantidade em Estoque: {}",
produto_info.0, produto_info.2
);
}
14 - Dada a tupla let color_rgb = (255, 128, 0);, desestruture-a nas variáveis red, green e blue. Imprima cada variável separadamente.
Resposta
fn main() {
let color_rgb: (u8, u8, u8) = (255, 128, 0);
let (red, green, blue) = color_rgb;
println!("Red: {} \nGreen: {} \nBlue: {}", red, green, blue);
}
15 - Declare uma tupla api_result com um booleano indicando sucesso, um u64 para um ID e uma string para uma mensagem. Ex: (true, 1234567890, String::from(“Successful operation”)). Imprima usando {:#?}.
Resposta
fn main() {
let api_result: (bool, u64, String) = (true, 1234567890, String::from("Successful operation"));
println!("{:#?}", api_result);
}
16 - Declare uma tupla let config = (“localhost”, 8080);. Tente modificar o segundo elemento para 8081 (ex: config.1 = 8081;). O que acontece ao compilar? Agora, redeclare-a como let mut config = (“localhost”, 8080); e tente a mesma modificação.
Resposta
fn main() {
// erro:
// let config: (&str, u16) = ("localhost", 8080);
// config.1 = 8081;
let mut config: (&str, u16) = ("localhost", 8080);
println!("{:?}", config);
config.1 = 8081;
println!("{:?}", config);
}
17 - Declare uma tupla mutável player_status para armazenar nome (&str), score (i32) e vidas (u8). Inicialize com (“Hero”, 0, 3). Em seguida, modifique a pontuação para 1500 e as vidas para 2. Imprima a tupla atualizada.
Resposta
fn main () {
let mut player_status: (&str, i32, u8) = ("Hero", 0, 3);
println!("Name: {}\nScore: {}\nVidas: {}\n", player_status.0, player_status.1, player_status.2);
player_status.1 = 1500;
player_status.2 = 2;
println!("Name: {}\nScore: {}\nVidas: {}", player_status.0, player_status.1, player_status.2);
}
18 - Crie uma tupla mutável let mut point = (10.0, 20.0);. Modifique o primeiro elemento para 15.5 e o segundo para 25.0 usando a sintaxe de acesso por índice. Imprima a tupla.
Resposta
fn main() {
let mut point: (f32, f32) = (10., 20.);
println!("{:#?}", point);
point.0 = 15.5;
point.1 = 25.;
println!("{:#?}", point);
}
19 - Crie uma tupla mutável file_details contendo nome do arquivo (String), tamanho (u64) e se é editável (bool). Inicialize-a. Em seguida, modifique o nome do arquivo (anexando “_v2” ao nome original) e mude o status de editável. Imprima a tupla.
Resposta
fn main () {
let file_details: (String, u64, bool) = (String::from("test.txt"), 127, true);
println!("{:#?}", file_details);
let mut file_details_v2 = file_details;
file_details_v2.0 = String::from("teste_v2.txt");
file_details_v2.2 = false;
println!("{:#?}", file_details_v2);
}
20 - Declare um array meses contendo os nomes dos três primeiros meses do ano como string slices. Imprima o nome do segundo mês (lembre-se da indexação baseada em zero).
Resposta
fn main () {
let meses: [&str; 3] = ["Janeiro", "Fevereiro", "Março"];
println!("{:#?}\n", meses);
println!("{:#?}", meses[1])
}
21 - Declare um array numeros de 6 elementos do tipo u32. Inicialize-o com os valores [1, 2, 4, 8, 16, 32]. Imprima o último elemento do array usando indexação.
Resposta
fn main () {
let numeros: [u32; 6] = [1, 2, 4, 8, 16, 32];
println!("{numeros:#?}\n");
let numeros: [u32; 6] = [1, 2, 4, 8, 16, 32];
println!("{:#?}", numeros[5]);
}
22 - Declare um array let scores = [100, 90, 80];. Tente modificar o segundo elemento para 95. O que acontece? Agora, declare-o como mut, faça a modificação e imprima.
Resposta
fn main () {
let scores = [100, 90, 80];
println!("{:?}", scores);
// scores[1] = 95;
// println!("{:?}", scores);
let mut scores = [10, 30, 60];
println!("{:?}", scores);
scores[1] = 0;
println!("{:?}", scores);
}
23 - Declare um array mutável contador de 4 elementos do tipo u16, inicializado com [10, 25, 5, 30]. Modifique a contagem do primeiro item para 12 e do terceiro para 8. Imprima o array atualizado.
Resposta
fn main () {
let mut contador: [u16; 4] = [10, 25, 5, 30];
contador[0] = 12;
contador[2] = 8;
println!("{:?}", contador);
}
24 - Crie um array mutável servicos_ativos: [bool; 3] inicializado como [true, false, true]. Modifique o segundo serviço para true e o último para false. Imprima o array.
Resposta
fn main () {
let mut servicos_ativos:[bool; 3] = [true, false, true];
println!("{:?}", servicos_ativos);
servicos_ativos[1] = true;
servicos_ativos[2] = false;
println!("{:?}", servicos_ativos);
}
Operadores
Este capítulo se aprofunda nos diversos operadores disponíveis em Rust, que são ferramentas essenciais para realizar operações em dados e controlar o fluxo do programa. Os operadores permitem manipular valores, fazer comparações e executar operações lógicas que formam o núcleo de qualquer lógica de programação.
Dominar esses operadores é fundamental para escrever um código Rust expressivo e eficiente. Eles servem como os blocos de construção para operações e algoritmos mais complexos que você desenvolverá à medida que avança.
Operadores Aritméticos
Usados para cálculos matemáticos básicos.
+
#![allow(unused)]
fn main() {
let adi = 1 + 1;
println!("Adição = {:?}", adi);
}
-
#![allow(unused)]
fn main() {
let sub = 2 - 2;
println!("Subtração = {:?}", sub);
}
*
#![allow(unused)]
fn main() {
let mul = 3 * 3;
println!("Multiplicação = {:?}", mul);
}
/
#![allow(unused)]
fn main() {
let div = 4 / 4;
println!("Divisão = {:?}", div);
}
%
#![allow(unused)]
fn main() {
let rest = 5 % 5;
println!("Resto Divisão = {:?}", rest);
}
Operadores de Atribuição
Usados para atribuir valores a variáveis.
+=
#![allow(unused)]
fn main() {
let mut num: u8 = 10;
num += 1;
println!("10 += 1 = {}", num);
}
-=
#![allow(unused)]
fn main() {
let mut num: u8 = 10;
num -= 1;
println!("10 -= 1 = {}", num);
}
*=
#![allow(unused)]
fn main() {
let mut num: u8 = 10;
num *= 2;
println!("10 *= 2 = {}", num);
}
/=
#![allow(unused)]
fn main() {
let mut num: u8 = 20;
num /= 3;
println!("20 /= 3 = {}", num);
}
%=
#![allow(unused)]
fn main() {
let mut num: u8 = 6;
num %= 4;
println!("6 %= 4 = {}", num);
}
Precedência
A ordem na qual as operações são realizadas em uma expressão, sendo a ordem de prioridade: (), *, /, %, + e -
()
#![allow(unused)]
fn main() {
let preced: [i8; 2] = [5, 3];
println!("{:?}", preced[0] + preced[1] * preced[1]);
// ()
println!("{:?}", (preced[0] + preced[1]) * preced[1]);
}
*, / e %
#![allow(unused)]
fn main() {
let preced: [i8; 2] = [5, 3];
println!("{:?}", preced[0] * preced[1] / preced[1] % preced[1]);
}
+ e -
#![allow(unused)]
fn main() {
let preced: [i8; 2] = [5, 3];
println!("{:?}", preced[0] + preced[1] - preced[0] + preced[0] * preced[0]);
}
Comparação
O ato de verificar se dois ou mais itens são iguais, diferentes ou ordenados em relação um ao outro.
== (igual a)
#![allow(unused)]
fn main() {
let a = 1;
let b = 1;
println!("{}", a == b);
}
#![allow(unused)]
fn main() {
let a = 2;
let b = 3;
println!("{}", a == b);
}
!= (diferente de)
#![allow(unused)]
fn main() {
let a = 1;
let b = 1;
println!("{}", a != b);
}
#![allow(unused)]
fn main() {
let a = 2;
let b = 3;
println!("{}", a != b);
}
> (maior que)
#![allow(unused)]
fn main() {
let a = 1;
let b = 1;
println!("{}", a > b);
}
#![allow(unused)]
fn main() {
let a = 2;
let b = 3;
println!("{}", a > b);
}
< (menor que)
#![allow(unused)]
fn main() {
let a = 1;
let b = 1;
println!("{}", a < b);
}
#![allow(unused)]
fn main() {
let a = 2;
let b = 3;
println!("{}", a < b);
}
>= (maior ou igual)
#![allow(unused)]
fn main() {
let a = 1;
let b = 1;
println!("{}", a >= b);
}
#![allow(unused)]
fn main() {
let a = 2;
let b = 3;
println!("{}", a >= b);
}
<= (menor ou igual)
#![allow(unused)]
fn main() {
let a = 1;
let b = 1;
println!("{}", a <= b);
}
#![allow(unused)]
fn main() {
let a = 2;
let b = 3;
println!("{}", a <= b);
}
Lógicos
Relacionados a operações que combinam ou modificam valores booleanos (verdadeiro/falso) para produzir um único resultado booleano.
AND (E) - Somente verdadeiro quando ambos são verdadeiros
#![allow(unused)]
fn main() {
// AND = &&
println!("Verdadeiro && Verdadeiro = {}", true && true);
println!("Verdadeiro && Falso = {}", true && false);
println!("Falso && Verdadeiro = {}", false && true);
println!("Falso && Falso = {}", false && false);
}
OR (OU) - Verdadeiro quando pelo menos um é verdadeiro
#![allow(unused)]
fn main() {
// OR = ||
println!("Verdadeiro || Verdadeiro = {}", true || true);
println!("Verdadeiro || Falso = {}", true || false);
println!("Falso || Verdadeiro = {}", false || true);
println!("Falso || Falso = {}", false || false);
}
NOT (NÃO) - Sempre inverte o valor
#![allow(unused)]
fn main() {
// NOT = !
println!("!Verdadeiro = {}", !true);
println!("!Falso = {}", !false);
}
Você entenderá melhor seu uso quando estiver estudando estruturas de controle.
String e &str
A concatenação de String e &str é o processo de unir sequências de caracteres. Em Rust, você pode usar o operador + ou a macro format!() para concatenar strings.
string
#![allow(unused)]
fn main() {
let conc_texto_a: String = String::from("Sense");
let conc_texto_b: String = String::from(" Life");
println!("{}", conc_texto_a + &conc_texto_b);
}
&str
#![allow(unused)]
fn main() {
let conc_texto_a: &str = "Calvin";
let conc_texto_b: &str = " e Haroldo";
println!("{}", conc_texto_a.to_owned() + conc_texto_b);
}
string + &str
#![allow(unused)]
fn main() {
let parte_a: &str = "ão";
let parte_b: String = String::from("Lampi");
println!("{}", parte_b + parte_a);
}
#![allow(unused)]
fn main() {
let parte_a: &str = "O Menino";
let parte_b: String = String::from("Maluquinho");
println!("{}", parte_a.to_owned() + " " + &parte_b);
}
#![allow(unused)]
fn main() {
let parte_a: String = String::from("Rei de");
let parte_b: &str = "Lata";
let resultado: String = parte_a + " " + parte_b;
println!("{}", resultado);
}
Tuplas
Armazenam múltiplos itens de dados de tipos diferentes em uma estrutura de tamanho fixo.
tupla
#![allow(unused)]
fn main() {
let tup: (u8, u8) = (1, 4);
println!("{:?}", tup.0 + tup.1);
}
#![allow(unused)]
fn main() {
let tup: (u8, u8);
tup = (3, 8);
println!("{:?}", tup.0 + tup.1);
}
tupla + tupla
#![allow(unused)]
fn main() {
let tup: ((u8, u8),(u8, u8)) = ((2, 4),(6, 16));
println!("{:?}", tup.0.0 + tup.0.1);
println!("{:?}", tup.1.0 + tup.1.1);
println!("{:?}", tup.0.0 + tup.1.0);
println!("{:?}", tup.0.1 + tup.1.1);
}
#![allow(unused)]
fn main() {
let tup_01: (u8, u8) = (1, 4);
let tup_02: (u8, u8) = (14, 9);
let result = tup_01.0 + tup_01.1 + tup_02.0 + tup_02.1;
println!("{:?}", result);
}
Array
Uma lista de itens de dados que são todos do mesmo tipo e têm um tamanho fixo.
array
#![allow(unused)]
fn main() {
let arr: [u8; 2] = [1, 4];
println!("{:?}", arr[0] + arr[1]);
}
#![allow(unused)]
fn main() {
let arr: [u8; 2];
arr = [3, 8];
println!("{:?}", arr[0] + arr[1]);
}
array + array
#![allow(unused)]
fn main() {
let arr: [[u8; 2]; 2] = [[2, 4], [6, 16]];
println!("{:?}", arr[0][0] + arr[0][1]);
println!("{:?}", arr[1][0] + arr[1][1]);
println!("{:?}", arr[0][0] + arr[1][0]);
println!("{:?}", arr[0][1] + arr[1][1]);
}
#![allow(unused)]
fn main() {
let arr_01: [u8; 2] = [1, 4];
let arr_02: [u8; 2] = [14, 9];
let result = arr_01[0] + arr_01[1] + arr_02[0] + arr_02[1];
println!("{:?}", result);
}
Questões - Operadores
01 - Escreva um programa que declare duas variáveis inteiras, a com o valor 15 e b com o valor 7, e imprima a soma delas.
Resposta
fn main() {
let a: u8 = 15;
let b: u8 = 7;
println!("{:?}", a + b);
}
02 - Crie um código que subtraia o valor 3 de uma variável chamada total que é inicialmente igual a 10, e exiba o resultado.
Resposta
fn main() {
let total = 10;
let sub = total - 3;
println!("{:?}", sub);
let mut total = 10;
total -= 3;
println!("{:?}", total);
}
03 - Desenvolva um programa que multiplique duas variáveis, x igual a 6 e y igual a 8, e mostre o produto.
Resposta
fn main() {
let x: u8 = 6;
let y: u8 = 8;
let result: u8 = x * y;
println!("{:?}", result);
}
04 - Implemente um código que divida o número 20 por 5 e imprima o quociente.
Resposta
fn main() {
let result = 20 / 5;
println!("{}", result);
}
05 - Escreva um programa que calcule o resto da divisão de 23 por 4 e imprima o resultado.
Resposta
fn main() {
let mut resto: u8 = 23;
resto %= 4;
println!("{:?}", resto);
}
06 - Declare duas variáveis num1 = 12 e num2 = 5 e imprima o resultado da soma delas diretamente dentro da macro println!.
Resposta
fn main() {
let num1: u8 = 12;
let num2: u8 = 5;
println!("{:?}", num1 + num2);
}
07 - Crie uma variável imutável chamada valor que seja a soma de 9 e 2, e imprima seu valor.
Resposta
fn main() {
let valor: u8 = 9 + 2;
println!("{:?}", valor);
}
08 - Declare uma variável mutável chamada contador com um valor inicial de 5. Incremente-a em 3 usando o operador de atribuição de adição (+=) e imprima o novo valor.
Resposta
fn main() {
let mut contador: u8 = 5;
contador += 3;
println!("{:?}", contador);
}
09 - Crie uma variável mutável score inicializada com 20. Decremente-a em 5 usando o operador de atribuição de subtração (-=) e exiba o valor final.
Resposta
fn main() {
let mut score: u8 = 20;
score -= 5;
println!("{:?}", score);
}
10 - Declare uma variável mutável numero com o valor 2. Multiplique-a por 4 usando o operador de atribuição de multiplicação (*=) e imprima o resultado.
Resposta
fn main() {
let mut numero: u8 = 2;
numero *= 4;
println!("{:?}", numero);
}
11 - Inicialize uma variável mutável size com 30. Divida-a por 6 usando o operador de atribuição de divisão (/=) e mostre o valor resultante.
Resposta
fn main() {
let mut size: u8 = 30;
size /= 6;
println!("{:?}", size);
}
12 - Declare uma variável mutável numero com o valor 17. Calcule o resto da divisão por 5 usando o operador de atribuição de resto (%=) e imprima o valor.
Resposta
fn main() {
let mut numero: u8 = 17;
numero %= 5;
println!("{:?}", numero);
}
13 - Declare duas variáveis do tipo &str, part1 com Hello, e part2 com Rust!. Concatene-as e imprima o resultado.
Resposta
fn main() {
let part1: &str = "Hello, ";
let part2: &str = "Rust!";
println!("{}{}", part1, part2);
}
14 - Crie duas variáveis do tipo string, s1 = “Linguagem “ e s2 = “Rust.”. Concatene-as e imprima a string resultante.
Resposta
fn main() {
let s1: String = String::from("Linguagem ");
let s2: String = String::from("Rust.");
println!("{:?}", s1 + &s2);
}
15 - Declare uma variável do tipo &str chamada numero com o valor “Numero: “. Crie uma variável do tipo string chamada numero_str com o valor “42”. Concatene-as e imprima o resultado.
Resposta
fn main() {
let numero: &str = "Numero: ";
let numero_str: String = String::from("42");
println!("{:?}", numero.to_owned() + &numero_str);
}
16 - Declare uma tupla com dois i32. Inicialize-a com os valores (5, -2). Imprima a multiplicação desses dois valores.
Resposta
fn main() {
let tup: (i32, i32) = (5, -2);
println!("{:?}", tup.0 * tup.1);
}
17 - Crie uma tupla aninhada: ((1, 2), (3, 4)). Some o primeiro elemento da primeira tupla ao segundo elemento da segunda tupla e imprima o resultado.
Resposta
fn main() {
let tup: ((u8, u8), (u8, u8)) = ((1, 2), (3, 4));
println!("{:?}", tup.0 .0 + tup.1 .1);
}
18 - Declare duas tuplas, t1 com (2, 5) e t2 com (8, 1). Some todos os elementos das duas tuplas e imprima o total.
Resposta
fn main() {
let t1: (u8, u8) = (2, 5);
let t2: (u8, u8) = (8, 1);
println!("{:?}", t1.0 + t1.1 + t2.0 + t2.1);
}
19 - Declare um array = [i32; 5] com os valores [1, 3, 5, 7, 9]. Imprima a soma do primeiro e último elementos.
Resposta
fn main() {
let arr: [i32; 5] = [1, 3, 5, 7, 9];
println!("{:?} + {:?} = {:?}", arr[0], arr[4], arr[0] + arr[4]);
}
20 - Crie um array de [u16; 3]. Inicialize-o com os valores [10, 20, 30]. Imprima o produto de todos os elementos.
Resposta
fn main() {
let arr: [u16; 3];
arr = [10, 20, 30];
println!("{:?}", arr[0] * arr[1] * arr[2]);
}
21 - Declare um array multidimensional 2x2 com inteiros. Multiplique todos os elementos e imprima o resultado.
Resposta
fn main() {
let arr: [[i8; 2]; 2];
arr = [[2, 2], [4, 4]];
println!("{:?}", arr[0][0] * arr[0][1] * arr[1][0] * arr[1][1]);
}
22 - Declare uma variável x com valor 1. Crie um bloco interno onde você declare uma variável y com valor 2. Dentro do bloco, imprima a soma de x e y. Fora do bloco, tente imprimir y (o que acontecerá?).
Resposta
fn main() {
let x: u8 = 1;
{
let y: u8 = 2;
println!("{:?}", x + y);
}
println!("{:?}", x);
// println!("{:?}", y); // Erro: `y` fora do escopo
}
23 - Declare uma variável level1 com valor 10. Abra um novo bloco e declare uma variável level2 com valor 20. Dentro deste bloco, crie outro bloco e declare level3 com valor 30. Imprima a soma de level1, level2 e level3 dentro do bloco mais interno.
Resposta
fn main() {
let level1: u8 = 10;
{
let level2: u8 = 20;
{
let level3: u8 = 30;
println!("{:?}", level1 + level2 + level3);
}
println!("{:?}", level2);
}
println!("{:?}", level1);
}
24 - Declare uma variável principal com valor 100. Crie um bloco onde você declare uma variável com o mesmo nome e atribua o valor 50.0. Imprima o valor da variável dentro do bloco e fora do bloco.
Resposta
fn main() {
let principal: u8 = 100;
println!("{:?}", principal);
{
let principal: f32 = 50.;
println!("{:?}", principal);
}
println!("{:?}", principal);
}
25 - Usando os valores de um array var = [2, 3], escreva um código que calcule e imprima o resultado de (var[0] + var[1]) * var[1].
Resposta
fn main() {
let var: [u8; 2] = [2, 3];
println!("{:?}", (var[0] + var[1]) * var[1]);
}
26 - Ainda com a variável var = [2, 3], calcule e imprima var[0] * var[1] / var[1] % var[1].
Resposta
fn main() {
let var: [u8; 2] = [2, 3];
println!("{:?}", var[0] * var[1] / var[1] % var[1]);
}
27 - Calcule e imprima var[0] + var[1] − var[0] + var[0] * var[0]. (Usando var com [2, 3]).
Resposta
fn main() {
let var: [u8; 2] = [2, 3];
println!("{:?}", var[0] + var[1] - var[0] + var[0] * var[0]);
}
28 - Calcule e imprima ((var[0] + var[1]) − (var[0] + var[0]) * var[0]). (Usando var com [2, 3]).
Resposta
fn main() {
let var: [i8; 2] = [2, 3];
println!("{:?}", (var[0] + var[1]) - (var[0] + var[0]) * var[0]);
}
29 - Declare duas variáveis inteiras, num1 com valor 10 e num2 com valor 10. Escreva um código que imprima se num1 é igual a num2 (==).
Resposta
fn main() {
let num1: i8 = 10;
let num2: i8 = 10;
println!("Num1 = Num2? {:?} ", num1 == num2);
}
30 - Declare duas variáveis de ponto flutuante, f1 com 3.14 e f2 com 2.71. Escreva um código que imprima se f1 é diferente de f2 (!=).
Resposta
fn main() {
let f1: f32 = 3.14;
let f2: f32 = 2.71;
println!("f1 != f2? {}", f1 != f2);
}
31 - Declare duas variáveis inteiras, idade_a com 25 e idade_b com 30. Escreva um código que imprima se idade_a é maior que idade_b (>).
Resposta
fn main() {
let idade_a: u8 = 25;
let idade_b: u8 = 30;
println!("Idade A > Idade B? {}", idade_a > idade_b);
}
32 - Declare duas variáveis inteiras, point1 com 5 e point2 com 8. Escreva um código que imprima se point1 é menor que point2 (<).
Resposta
fn main() {
let point1: u8 = 5;
let point2: u8 = 8;
println!("Point1 < Point2? {}", point1 < point2);
}
33 - Declare duas variáveis inteiras, nota_a com 7 e nota_b com 7. Escreva um código que imprima se nota_a é maior ou igual a nota_b (>=).
Resposta
fn main() {
let nota_a: u8 = 7;
let nota_b: u8 = 7;
println!("Nota A >= Nota B? {}", nota_a >= nota_b);
}
34 - Declare duas variáveis float, altura_a com 1.70 e altura_b com 1.65. Escreva um código que imprima se altura_a é menor ou igual a altura_b (<=).
Resposta
fn main() {
let altura_a: f32 = 1.70;
let altura_b: f32 = 1.65;
println!("Altura A <= Altura B? {}", altura_a <= altura_b);
}
35 - Declare uma variável temp_a com 22.5 e temp_b com 20.0. Verifique se temp_a é maior que temp_b (>) e imprima.
Resposta
fn main() {
let temp_a: f32 = 22.5;
let temp_b: f32 = 20.;
println!("Temperatura A > Temperatura B? {}", temp_a > temp_b);
}
36 - Declare uma variável count_a com 100 e count_b com 99. Verifique se count_a é menor que count_b (<) e imprima.
Resposta
fn main() {
let count_a: u8 = 100;
let count_b: u8 = 99;
println!("Count A < Count B? {}", count_a < count_b);
}
37 - Declare duas variáveis u8, val_a com 8 e val_b com 3. Calcule a soma, subtraia 1 do resultado, e imprima.
Resposta
fn main() {
let val_a: u8 = 8;
let val_b: u8 = 3;
println!("{:?}", (val_a + val_b) - 1);
}
38 - Declare um array [i32; 3] = [2, 4, 6]. Divida cada elemento por 2 (usando atribuição de divisão se aplicável) e imprima o array resultante.
Resposta
fn main() {
let mut arr: [i32; 3] = [2, 4, 6];
arr[0] /= 2;
arr[1] /= 2;
arr[2] /= 2;
println!("{:#?}", arr);
}
39 - Declare uma tupla (f64, f64) = (2.5, 3.5). Some os elementos e imprima o resultado formatado com duas casas decimais.
Resposta
fn main() {
let tup: (f64, f64) = (2.5, 3.5);
let result: f64 = tup.0 + tup.1;
println!("{:.2}", result);
}
40 - Declare uma variável mensagem do tipo &str com “Start”. Anexe a ela a String “ -> End“. Imprima o valor final de mensagem.
Resposta
fn main() {
//&str
let mensagem: &str = "Start";
println!("{}", mensagem.to_owned() + " -> End");
}
fn main() {
// string
let mut mensagem: String = String::from("Start");
mensagem += " -> End";
println!("{}", mensagem);
}
String e &str
Este capítulo aborda os tipos de string no Rust para manipulação de texto. Você aprenderá sobre literais de string (&str) e slices imutáveis, além de strings de propriedade (String) para criação dinâmica, incluindo métodos como push e push_str.
Cada seção inclui perguntas de prática para reforçar sua compreensão desses construtos essenciais de manipulação de texto.
Strings
Strings são sequências de caracteres UTF-8 que podem formar uma palavra ou frase, incluindo letras, números, símbolos ou qualquer outro tipo de caractere especial.
new()
#![allow(unused)]
fn main() {
// cria uma string vazia
let cria_string: String = String::new();
println!("{}", cria_string);
}
from()
#![allow(unused)]
fn main() {
// cria uma string a partir de um literal de string (&str)
let cria_string: String = String::from("Grande texto!");
println!("{}", cria_string);
}
to_string()
#![allow(unused)]
fn main() {
// converte um literal de string (&str) em uma string
let cria_string: String = "Mais um grande texto!".to_string();
println!("{}", cria_string);
}
mut
#![allow(unused)]
fn main() {
let mut cria_string: String = String::from("Quase um grande texto!");
println!("{}", cria_string);
cria_string = "Último grande texto!".to_string();
println!("{}", cria_string);
}
&str
Também conhecido como string slice ou fatia de string, representa uma referência imutável a uma sequência de texto UTF-8. É usado como string sem a necessidade de alocar memória no heap.
&str
#![allow(unused)]
fn main() {
let cria_str: &str = "Pequeno texto!";
println!("{}", cria_str);
}
#![allow(unused)]
fn main() {
let cria_str = "Outro pequeno texto!";
println!("{}", cria_str);
}
Métodos - Parte 1
Usados para manipular e modificar o conteúdo de texto.
push()
#![allow(unused)]
fn main() {
// adiciona um caractere
let mut text = String::from("Hello");
text.push(',');
text.push(' ');
text.push('w');
text.push('o');
text.push('r');
text.push('l');
text.push('d');
text.push('!');
println!("{:?}", text);
}
push_str()
#![allow(unused)]
fn main() {
// adiciona uma fatia de string
let mut text = String::from("Hello");
text.push_str(", world!");
println!("{:?}", text);
}
slice()
#![allow(unused)]
fn main() {
// retorna só uma parte da string
// 0 1 2 3 4 5 6 7 8 9 10 11 12
// H e l l o , w o r l d !
let cria_str = "Hello, world!!";
let slice_str = &cria_str[0..3];
println!("{}", slice_str);
}
pop()
#![allow(unused)]
fn main() {
// remove o último caractere
let mut text = String::from("Hello, world!");
let _text_last = text.pop();
let _text_last = text.pop();
let text_last = text.pop();
println!("{:?}", text_last);
println!("{:?}", text);
}
insert()
#![allow(unused)]
fn main() {
// insere caracteres em uma posição especifica
// 0 1 2 3 4 5 6
// H e l l o ,
let mut text = String::from("Hello,");
text.insert(6, ' ');
text.insert(7, 'w');
text.insert(8, 'o');
text.insert(9, 'r');
text.insert(10, 'l');
text.insert(11, 'd');
text.insert(12, '!');
println!("{:?}", text);
}
remove()
#![allow(unused)]
fn main() {
// remove caracteres em uma posição especifica
// 0 1 2 3 4 5 6 7 8 9 10 11 12
// H e l l o , w o r l d !
let mut text: String = String::from("Hello, world!");
let _text_letter = text.remove(11);
let _text_letter = text.remove(10);
let _text_letter = text.remove(9);
println!("{}", text);
}
len()
#![allow(unused)]
fn main() {
// retorna o comprimento da string em bytes
// 0 1 2 3 4 5 6 7 8 9 10 11 12
// H e l l o , w o r l d !
let text: String = String::from("Hello, world!");
let number = text.len();
println!("{}", number);
}
clear()
#![allow(unused)]
fn main() {
// remove todo o conteúdo
let mut text: String = String::from("Hello, world!");
text.clear();
println!("{}", text);
}
truncate()
#![allow(unused)]
fn main() {
// corta a string em um índice específico
// 0 1 2 3 4 5 6 7 8 9 10 11 12
// H e l l o , w o r l d !
let mut text: String = String::from("Hello, world");
text.truncate(5);
println!("{}", text);
}
Métodos - Parte 2
Usados para manipulação e modificação de conteúdo de texto.
is_empty()
#![allow(unused)]
fn main() {
// verifica se a string está vazia
let text = "Hello, world!";
println!("{}", text.is_empty());
}
contains()
#![allow(unused)]
fn main() {
// verifica se contém substring
let text = "Hello, world!";
println!("{}", text.contains("ello"));
}
starts_with() / ends_with()
#![allow(unused)]
fn main() {
// verifica se a string começa/termina com a substring fornecida
let text = "Hello, world!";
println!("{}", text.starts_with("He"));
println!("{}", text.ends_with("d!"));
}
find()
#![allow(unused)]
fn main() {
// encontra posição(índice) de substring
let text = "Hello, world!";
println!("{:?}", text.find("H"));
}
to_uppercase() / to_lowercase()
#![allow(unused)]
fn main() {
// conversão para maiúsculas/minúsculas
let text = "Hello, world!";
println!("{:?}", text.to_uppercase());
println!("{:?}", text.to_lowercase());
}
trim()
#![allow(unused)]
fn main() {
// remove espaços das extremidades
let text = " Hello, world! ";
println!("{:?}", text.trim());
}
replace()
#![allow(unused)]
fn main() {
// substitui todas as ocorrências
let text = "Hello, world!";
println!("{:?}", text.replace("word", "Snoopy"));
}
replacen()
#![allow(unused)]
fn main() {
// substitui apenas N ocorrências
let text = "Hello, world!";
println!("{:?}", text.replacen("o", "a", 1));
}
Entrada de Dados
Refere-se à entrada de dados, ou seja, à sua captura, validação e processamento.
std::io
// importa o módulo io
use std::io;
fn main () {
println!("Entrada de texto:");
let mut input:String = String::new();
io::stdin().read_line(&mut input).expect("Erro de entrada de dados!");
// io::stdin().read_line(&mut input).unwrap();
}
- unwrap() - Se ocorrer um erro, o programa trava com um panic;
- expect() - Se ocorrer um erro, ele trava, mas com a sua mensagem personalizada.
char
use std::io;
fn main() {
println!("Entrada do caractere:");
let mut input = String::new();
io::stdin()
.read_line(&mut input)
.expect("Erro de entrada de dados!");
// trim() remove espaços em branco, chars() itera sobre caracteres, next() pega o primeiro
let ch: char = input.trim().chars().next().unwrap();
println!("{}", ch);
}
match
use std::io;
fn main() {
let mut input = String::new();
io::stdin().read_line(&mut input).unwrap();
match input.trim().parse::<u8>() {
Ok(input) => input,
Err(_) => {
println!("Erro!");
return;
}
};
}
use std::io;
fn main () {
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Erro de entrada de dados!");
let ch: u8 = match input.trim().parse() {
Ok(n) => n,
Err(_) => {
println!("Erro de entrada!");
return;
}
};
}
Questões - String and &str
01 - Escreva um código que crie uma string vazia e a imprima.
Resposta
fn main() {
let cria_string: String = String::new();
println!("{}", cria_string);
}
02 - Crie uma string a partir do literal de string “Pequeno, texto!”.
Resposta
fn main() {
let literal_string: String = String::from("Pequeno, texto!");
println!("{}", literal_string);
}
03 - Declare uma variável que contenha &str com o valor “Aprendendo Rust”.
Resposta
fn main() {
let texto: &str = "Aprendendo Rust";
println!("{}", texto);
}
04 - Dada uma string, escreva o código para obter um &str que represente toda a string.
Resposta
fn main() {
let entrada_string: String = String::from("Aprendendo Rust!");
let entrada_str: &str = &entrada_string;
println!("{}", entrada_str);
}
fn main() {
let entrada_string: String = String::from("Aprendendo Rust!");
let entrada_str: &str = entrada_string.as_str();
println!("{}", entrada_str);
}
05 - Escreva um código que receba um texto em string e o converta para &str e, em seguida, o imprima na tela.
Resposta
use std::io;
fn main() {
println!("Entre com texto:");
let mut entrada_string: String = String::new();
io::stdin()
.read_line(&mut entrada_string)
.expect("Erro de entrada de dados!");
let texto_string: &str = entrada_string.as_str();
println!("\nTexto convertido para &str: {}", texto_string.trim());
}
06 - Converta um string = 123 em um inteiro.
Resposta
fn main() {
let text: &str = "123";
let num: u8 = text.parse().expect("Erro ao converter dados!");
println!("{}", num);
}
fn main() {
let text: &str = "123";
let num = match text.parse::<u8>() {
Ok(num) => num,
Err(_) => {
println!("Erro ao converter dados!");
return;
}
};
println!("{}", num);
}
07 - Use o método .to_string() ou String::from() para criar uma nova string concatenando um &str e uma string existente.
Resposta
use std::io;
fn main() {
println!("Entre com texto:");
let mut entrada_texto: String = String::new();
io::stdin()
.read_line(&mut entrada_texto)
.expect("Erro de entrada de dados!");
let texto_a: &str = &entrada_texto.as_str().trim();
let texto_b: String = String::from(" + string!");
println!("{}", texto_a.to_string() + &texto_b);
}
08 - Crie uma string mutável e anexe um &str a ela usando o método push_str().
Resposta
fn main() {
let mut string_mutavel: String = String::from("Pequeno, ");
string_mutavel.push_str("texto!");
println!("{}", string_mutavel);
}
09 - Adicione um único caractere (char) ao final de uma string mutável.
Resposta
fn main() {
let mut unico_char: String = String::from("Pequeno, texto");
let caractere: char = '!';
unico_char.push(caractere);
println!("{}", unico_char);
}
10 - Combine um &str, uma string e um número em uma nova string usando a macro format!.
Resposta
fn main() {
let var_str: &str = "1";
let var_string: String = String::from("2");
let var_u8: u8 = 3;
// a macro format! cria uma nova string
let result = format!("{}{}{}", var_str, var_string, var_u8);
println!("{}", result);
}
11 - Crie uma nova string removendo todos os espaços em branco de uma string.
Resposta
use std::io;
fn main() {
println!("Entre com texto:");
let mut entrada_texto: String = String::new();
io::stdin().read_line(&mut entrada_texto).err();
let remove_espaco = entrada_texto.replace(" ", "");
println!("\nSem espaços = {}", remove_espaco.trim());
}
12 - Substitua todas as ocorrências da substring erro por sucesso em um &str, criando uma nova string.
Resposta
use std::io;
fn main() {
println!("Entre com texto:");
let mut entrada_texto: String = String::new();
io::stdin().read_line(&mut entrada_texto).err();
let novo_texto = entrada_texto.replace("erro", "sucesso");
println!("{}", novo_texto);
}
13 - Substitua apenas a primeira ocorrência de antes por depois em um &str, criando uma nova string.
Resposta
use std::io;
fn main() {
println!("Entre com uma frase:");
let mut entrada_frase: String = String::new();
io::stdin().read_line(&mut entrada_frase).err();
let frase = entrada_frase.replacen("antes", "depois", 1);
println!("{}", frase);
}
14 - Verifique se um &str contém a substring Rust.
Resposta
use std::io;
fn main() {
println!("Entre com uma frase:");
let mut entrada_texto: String = String::new();
io::stdin().read_line(&mut entrada_texto).err();
if entrada_texto.contains("Rust") {
println!("\n{} - contém 'Rust'", entrada_texto.trim());
} else {
println!("\n{} - não contém 'Rust'", entrada_texto.trim());
}
}
15 - Verifique se um nome de arquivo em uma string termina com o sufixo .rs
Resposta
use std::io;
fn main() {
println!("Entre com o nome do arquivo:");
let mut entrada_texto: String = String::new();
io::stdin().read_line(&mut entrada_texto).err();
if entrada_texto.trim().ends_with(".rs") {
println!("\n{} - termina com '.rs'", entrada_texto.trim());
} else {
println!("\n{} - não termina com '.rs'", entrada_texto.trim());
}
}
16 - Verifique se um &str começa com o prefixo https://.
Resposta
use std::io;
fn main() {
println!("Entre com link:");
let mut entrada_link: String = String::new();
io::stdin().read_line(&mut entrada_link).err();
if entrada_link.starts_with("https://") {
println!("\n{} - começa com 'https://'", entrada_link.trim());
} else {
println!("\n{} - não começa com 'https://'", entrada_link.trim());
}
}
17 - Crie um código que receba uma string e retorne uma fatia contendo apenas a primeira palavra. Assuma que as palavras são separadas por espaços.
Resposta
use std::io;
fn main() {
println!("Entre com uma frase:");
let mut entrada_frase: String = String::new();
io::stdin().read_line(&mut entrada_frase).err();
let frase = entrada_frase.split_whitespace().next();
println!("{}", frase.unwrap());
}
18 - Encontre o índice de byte inicial da primeira ocorrência da substring rust.
Resposta
use std::io;
fn main() {
println!("Entre com a frase:");
let mut entrada_frase: String = String::new();
io::stdin().read_line(&mut entrada_frase).err();
if let Some(indice) = entrada_frase.find("rust") {
println!("\nÍndice de bytes: {}", indice);
} else {
println!("\nNão tem: rust");
}
}
19 - Escreva uma função que aceite uma string e retorne seu primeiro caractere como um char.
Resposta
use std::io;
fn main() {
println!("Entre com a palavra:");
let mut entrada_palavra: String = String::new();
io::stdin().read_line(&mut entrada_palavra).err();
let primeira_letra: char = entrada_palavra.trim_start().chars().next().unwrap_or(' ');
println!("Primeira letra = {}", primeira_letra);
}
20 - Escreva um código que conte o número de caracteres (char) em um &str, não o número de bytes.
Resposta
use std::io;
fn main() {
println!("Entre com uma palavra:");
let mut entrada_palavra: String = String::new();
io::stdin().read_line(&mut entrada_palavra).err();
let palavra = entrada_palavra.trim().replace(" ", "");
println!("{}", palavra);
println!("{:?}", palavra.chars().count());
}
21 - Escreva um código que receba um &mut string e substitua todos os caracteres a minúsculos por A maiúsculos, modificando a string original.
Resposta
use std::io;
fn main() {
println!("Entre com uma frase:");
let mut entrada_frase: String = String::new();
io::stdin().read_line(&mut entrada_frase).err();
let frase = entrada_frase.trim().replace("a", "A");
println!("{}", frase);
}
22 - Escreva um código que remova o último caractere de uma string.
Resposta
use std::io;
fn main() {
println!("Entre com texto:");
let mut entrada_palavra: String = String::new();
io::stdin()
.read_line(&mut entrada_palavra)
.expect("Erro de entrada de dados!");
let mut palavra: String = entrada_palavra.trim_end().to_string();
palavra.pop();
println!("{}", palavra);
}
23 - Use o método .clear() para limpar uma string sem desalocar sua capacidade de memória.
Resposta
fn main() {
let mut var_string: String = String::with_capacity(50);
var_string.push_str("Pequeno, grande texto!");
println!("String = {}", var_string);
println!("Capacidade = {}", var_string.capacity());
println!("Tamanho = {}", var_string.len());
println!("");
var_string.clear();
println!("String = {}", var_string);
println!("Capacidade = {}", var_string.capacity());
println!("Tamanho = {}", var_string.len());
}
24 - Escreva um código que receba uma frase e a converta inteiramente para maiúsculas usando o método to_uppercase().
Resposta
use std::io;
fn main() {
println!("Entre com uma frase:");
let mut entrada_frase: String = String::new();
io::stdin().read_line(&mut entrada_frase).err();
let maiuscula = entrada_frase.trim().to_uppercase();
println!("{}", maiuscula);
}
Controle de Fluxo
Este capítulo aborda as estruturas de fluxo de controle do Rust, começaremos com as declarações condicionais: if, else, else-if, depois abordaremos sobre loops, while e for para iterar sobre coleções. Por fim abordaremos sobre match, recurso de pattern matching que lida com condições complexas com precisão e segurança.
Cada seção inclui perguntas práticas para reforçar sua compreensão sobre os assuntos, como essa parte é um pouco mais complexa estarei separando as questões.
If
A declaração if funciona de forma simples: se uma condição for atendida, execute o código.
if 1 + 1 for igual a 2, print "É igual a dois!"
#![allow(unused)]
fn main() {
let num_1 = 1;
let num_2 = 1;
if num_1 + num_2 == 2 {
println!("É igual a dois!");
};
}
if
#![allow(unused)]
fn main() {
let num: u8 = 2;
if num > 1 {
println!("Num > 1!");
};
}
if expression
#![allow(unused)]
fn main() {
let valor: u8 = 8;
let result = if valor > 1 && valor % 2 == 0 {
println!("Valor = {:?} é par", valor);
};
}
Else
Agora que entendemos como o if funciona, o else é o complemento.
Se 1 + 1 for igual a 2, imprima "Igual a dois!"; senão, imprima "Diferente de dois!".
#![allow(unused)]
fn main() {
let num_1 = 1;
let num_2 = 2;
if num_1 + num_2 == 2 {
println!("Igual a dois!");
}
else {
println!("Diferente de dois!");
}
}
if e else
#![allow(unused)]
fn main() {
let num: u8 = 5;
if num >= 6 {
println!("Num > ou = 6!");
} else {
println!("Num < ou = 5!");
};
}
expression
#![allow(unused)]
fn main() {
let valor = 51;
let resultado = if valor > 50 { "Maior que 50"} else { "Menor que 50" };
println!("{}", resultado);
}
#![allow(unused)]
fn main() {
let temperatura: u8 = 24;
let valor: String = if temperatura >= 20 || temperatura <= 30 {
String::from("Temperatura >= 20 ou <= 30!")
} else {
String::from("Temperatura < 20 ou > 30!")
};
println!("Temperatura: {}", temperatura);
println!("{}", valor);
}
Else if
Baseando-se em if e else, o else if permite que você verifique múltiplas condições em sequência.
Pense nisso como: se a primeira condição for verdadeira, faça isto; senão se a segunda condição for verdadeira, faça aquilo; senão, faça outra coisa.
#![allow(unused)]
fn main() {
let score = 8;
if score >= 9 {
println!("Excelente!");
}
else if score >= 7 {
println!("Bom!");
}
else {
println!("Esforce-se mais!");
}
}
if, else if e else
#![allow(unused)]
fn main() {
let temp: i8 = 30;
if temp < 0 {
println!("Temperatura < 0°C");
} else if temp >= 0 && temp < 10 {
println!("Temperatura >= 0°C e < 10°C");
} else if temp >= 10 && temp < 20 {
println!("Temperatura >= 10°C e < 20°C");
} else if temp >= 20 && temp < 30 {
println!("Temperatura >= 20°C e < 30°C");
} else {
println!("Temperatura >= 30°C!");
};
}
Questões - If e Else
01 - Escreva um programa que solicite ao usuário um número inteiro e determine se ele é par ou ímpar.
Resposta
use std::io;
fn main() {
println!("Digite um número inteiro:");
let mut entrada_texto: String = String::new();
io::stdin()
.read_line(&mut entrada_texto)
.expect("Erro na leitura do valor digitado!");
let numero: i32 = match entrada_texto.trim().parse() {
Ok(val) => val,
Err(_) => {
println!("Erro ao converter o dado para número!");
return;
}
};
if numero % 2 == 0 {
println!("Número {} é Par!", numero);
} else {
println!("Número {} é Ímpar!", numero);
}
}
02 - Crie um programa que leia um número e imprima se ele é positivo, negativo ou zero.
Resposta
use std::io;
fn main() {
println!("Digite um número: ");
let mut entrada_num: String = String::new();
io::stdin()
.read_line(&mut entrada_num)
.expect("Erro na leitura do valor digitado!");
let numero: i8 = match entrada_num.trim().parse() {
Ok(val) => val,
Err(_) => {
println!("Erro ao converter o dado para número!");
return;
}
};
if numero > 0 {
println!("O número {} é Positivo.", numero);
} else if numero < 0 {
println!("O número {} é Negativo.", numero);
} else {
println!("O número é Zero.");
}
}
03 - Desenvolva um programa que receba dois números e mostre qual deles é o maior.
Resposta
use std::io;
fn main() {
println!("Digite o primeiro número (A):");
let mut entrada_num_a: String = String::new();
io::stdin()
.read_line(&mut entrada_num_a)
.expect("Erro na leitura de A!");
println!("Digite o segundo número (B):");
let mut entrada_num_b: String = String::new();
io::stdin()
.read_line(&mut entrada_num_b)
.expect("Erro na leitura de B!");
let num_a: i8 = match entrada_num_a.trim().parse() {
Ok(val) => val,
Err(_) => {
println!("Erro ao converter número A!");
return;
}
};
let num_b: i8 = match entrada_num_b.trim().parse() {
Ok(val) => val,
Err(_) => {
println!("Erro ao converter número B!");
return;
}
};
if num_a > num_b {
println!("O Número A ({}) é o maior.", num_a);
} else if num_a < num_b {
println!("O Número B ({}) é o maior.", num_b);
} else {
println!("Os números são iguais ({}).", num_a);
}
}
04 - Crie um programa que receba 3 notas de um aluno (de 0 a 10) e, em seguida, calcule a média das notas e informe:
| Média | Classificação |
|---|---|
| >= 7 | aprovado |
| < 5 | reprovado |
| >= 5 e < 7 | em recuperação |
Resposta
use std::io;
fn main() {
println!("Digite sua nota para o Teste A (0-10):");
let mut entrada_teste_a: String = String::new();
io::stdin()
.read_line(&mut entrada_teste_a)
.expect("Erro ao digitar a primeira nota!");
println!("Digite a nota para o Teste B (0-10):");
let mut entrada_teste_b: String = String::new();
io::stdin()
.read_line(&mut entrada_teste_b)
.expect("Erro ao digitar a segunda nota!");
println!("Digite a nota para o Teste C (0-10):");
let mut entrada_teste_c: String = String::new();
io::stdin()
.read_line(&mut entrada_teste_c)
.expect("Erro ao digitar o terceiro teste!");
let teste_a: f32 = match entrada_teste_a.trim().parse() {
Ok(val) => val,
Err(_) => {
println!("Erro ao converter: Teste A!");
return;
}
};
let teste_b: f32 = match entrada_teste_b.trim().parse() {
Ok(val) => val,
Err(_) => {
println!("Erro ao converter: Teste B!");
return;
}
};
let teste_c: f32 = match entrada_teste_c.trim().parse() {
Ok(val) => val,
Err(_) => {
println!("Erro ao converter: Teste C!");
return;
}
};
let media: f32 = (teste_a + teste_b + teste_c) / 3.0;
println!("Sua média é: {:.2}", media);
if media < 5.0 {
println!("Situação: Reprovado!");
} else if media >= 5.0 && media < 7.0 {
println!("Situação: Recuperação!");
} else {
println!("Situação: Aprovado!");
}
}
05 - Escreva um programa que leia a idade de uma pessoa e determine se ela pode votar (16 anos ou mais).
Resposta
use std::io;
fn main() {
println!("Digite sua idade:");
let mut entrada_idade: String = String::new();
io::stdin()
.read_line(&mut entrada_idade)
.expect("Erro na entrada!");
let idade: u8 = match entrada_idade.trim().parse() {
Ok(val) => val,
Err(_) => {
println!("Erro ao converter idade!");
return;
}
};
if idade >= 18 && idade <= 59 {
println!("Idade: {}\nVocê é obrigado(a) a votar!", idade);
} else if (idade >= 16 && idade < 18) || idade >= 60 {
println!("Idade: {}\nSeu voto é opcional!", idade);
} else {
println!("Idade: {}\nVocê não pode votar!", idade);
}
}
06 - Desenvolva um programa que solicite três números e determine qual deles é o maior.
Resposta
use std::io;
fn main() {
//
println!("Digite o número A: ");
let mut entrada_a: String = String::new();
io::stdin()
.read_line(&mut entrada_a)
.expect("Erro na entrada!");
//
println!("Digite o número B: ");
let mut entrada_b: String = String::new();
io::stdin()
.read_line(&mut entrada_b)
.expect("Erro na entrada!");
//
println!("Digite o número C: ");
let mut entrada_c: String = String::new();
io::stdin()
.read_line(&mut entrada_c)
.expect("Erro na entrada!");
//
let num_a: i8 = match entrada_a.trim().parse() {
Ok(val) => val,
Err(_) => {
println!("Erro ao converter número A!");
return;
}
};
let num_b: i8 = match entrada_b.trim().parse() {
Ok(val) => val,
Err(_) => {
println!("Erro ao converter número B!");
return;
}
};
let num_c: i8 = match entrada_c.trim().parse() {
Ok(val) => val,
Err(_) => {
println!("Erro ao converter número C!");
return;
}
};
//
if num_a == num_b && num_b == num_c {
println!("A = B = C = {}", num_a);
} else if num_a == num_b && num_a > num_c {
println!("A = B = {} > C = {}", num_a, num_c);
} else if num_a == num_b && num_a < num_c {
println!("C = {} > A = B = {}", num_c, num_a);
} else if num_a == num_c && num_a > num_b {
println!("A = C = {} > B = {}", num_a, num_b);
} else if num_a == num_c && num_a < num_b {
println!("B = {} > A = C = {}", num_b, num_a);
} else if num_b == num_c && num_b > num_a {
println!("B = C = {} > A = {}", num_b, num_a);
} else if num_b == num_c && num_b < num_a {
println!("A = {} > B = C = {}", num_a, num_b);
} else if num_a > num_b && num_a > num_c {
println!("A = {}", num_a);
} else if num_b > num_a && num_b > num_c {
println!("B = {}", num_b);
} else {
println!("C = {}", num_c);
}
}
07 - Crie um programa que converta uma pontuação numérica (0 a 100) em uma nota literal, seguindo estas regras:
| Conceito | Notas |
|---|---|
| A | 90 - 100 |
| B | 80 - 89 |
| C | 70 - 79 |
| D | 60 - 69 |
| F | 0 - 59 |
Resposta
use std::io;
fn main() {
println!("Digite a pontuação (0 - 100):");
let mut entrada_pontuacao: String = String::new();
io::stdin()
.read_line(&mut entrada_pontuacao)
.expect("Erro na entrada!");
let pontuacao: u8 = match entrada_pontuacao.trim().parse() {
Ok(val) => val,
Err(_) => {
println!("Erro ao converter pontuação!");
return;
}
};
if pontuacao <= 59 {
println!("Nota: F");
} else if pontuacao <= 69 {
println!("Nota: D");
} else if pontuacao <= 79 {
println!("Nota: C");
} else if pontuacao <= 89 {
println!("Nota: B");
} else if pontuacao <= 100 {
println!("Nota: A");
}
}
08 - Escreva um programa que receba os comprimentos dos três lados de um triângulo e determine se ele é equilátero (todos os lados iguais), isósceles (dois lados iguais) ou escaleno (todos os lados diferentes).
Resposta
use std::io;
fn main() {
// lado_a
println!("Digite o tamanho do Lado A:");
let mut entrada_a: String = String::new();
io::stdin()
.read_line(&mut entrada_a)
.expect("Erro na entrada A!");
// lado_b
println!("Digite o tamanho do Lado B:");
let mut entrada_b: String = String::new();
io::stdin()
.read_line(&mut entrada_b)
.expect("Erro na entrada B!");
// lado_c
println!("Digite o tamanho do Lado C:");
let mut entrada_c: String = String::new();
io::stdin()
.read_line(&mut entrada_c)
.expect("Erro na entrada C!");
let lado_a: f32 = match entrada_a.trim().parse() {
Ok(val) => val,
Err(_) => {
println!("Erro ao converter lado A!");
return;
}
};
let lado_b: f32 = match entrada_b.trim().parse() {
Ok(val) => val,
Err(_) => {
println!("Erro ao converter lado B!");
return;
}
};
let lado_c: f32 = match entrada_c.trim().parse() {
Ok(val) => val,
Err(_) => {
println!("Erro ao converter lado C!");
return;
}
};
if lado_a == lado_b && lado_b == lado_c {
println!("O triângulo é Equilátero (todos os lados iguais).");
} else if lado_a == lado_b || lado_b == lado_c || lado_a == lado_c {
println!("O triângulo é Isósceles (dois lados iguais).");
} else {
println!("O triângulo é Escaleno (todos os lados diferentes).");
}
}
09 - Crie um programa que receba um número de 1 a 7 e imprima o dia da semana correspondente (1 para Domingo, 2 para Segunda, etc.), indicando também se é “Dia útil” ou “Fim de semana”.
Resposta
use std::io;
fn main() {
println!("Digite um número para o dia da semana:");
let mut entrada_dia: String = String::new();
io::stdin()
.read_line(&mut entrada_dia)
.expect("Erro na entrada!");
let dia: u8 = match entrada_dia.trim().parse() {
Ok(val) => val,
Err(_) => {
println!("Erro ao converter dia!");
return;
}
};
if dia == 1 || dia == 7 {
if dia == 1 {
println!("Domingo - Fim de semana!");
} else {
println!("Sábado - Fim de semana!");
}
} else if dia == 2 {
println!("Segunda-feira - Dia útil!");
} else if dia == 3 {
println!("Terça-feira - Dia útil!");
} else if dia == 4 {
println!("Quarta-feira - Dia útil!");
} else if dia == 5 {
println!("Quinta-feira - Dia útil!");
} else if dia == 6 {
println!("Sexta-feira - Dia útil!");
} else {
println!("Erro!");
}
}
10 - Escreva um programa que leia a idade de uma pessoa e a classifique nas seguintes categorias:
| Classificação | Idade |
|---|---|
| Criança | 0 - 12 anos |
| Adolescente | 13 - 17 anos |
| Adulto | 18 - 59 anos |
| Idoso | + 60 anos |
Resposta
use std::io;
fn main() {
println!("Digite sua idade:");
let mut entrada_idade: String = String::new();
io::stdin()
.read_line(&mut entrada_idade)
.expect("Erro na entrada!");
let idade: u8 = match entrada_idade.trim().parse() {
Ok(val) => val,
Err(_) => {
println!("Erro ao converter idade!");
return;
}
};
if idade >= 1 && idade <= 12 {
println!("Classificação: Criança!");
} else if idade >= 13 && idade <= 17 {
println!("Classificação: Adolescente!");
} else if idade >= 18 && idade <= 59 {
println!("Classificação: Adulto!");
} else if idade >= 60 {
println!("Classificação: Idoso!");
} else {
println!("Idade inválida!");
}
}
11 - Crie um programa que funcione como uma calculadora. Ele deve receber dois números e um operador (+, -, *, /). O programa deve realizar a operação correspondente e mostrar o resultado. Além disso, trate a divisão por zero.
Resposta
use std::io;
fn main() {
println!("Digite o primeiro número:");
let mut entrada_primeiro_num: String = String::new();
io::stdin()
.read_line(&mut entrada_primeiro_num)
.expect("Erro ao receber o primeiro número!");
println!("Digite o segundo número:");
let mut entrada_segundo_num: String = String::new();
io::stdin()
.read_line(&mut entrada_segundo_num)
.expect("Erro ao receber o segundo número!");
println!("Insira o operador (+, -, *, /):");
let mut entrada_operador: String = String::new();
io::stdin()
.read_line(&mut entrada_operador)
.expect("Erro ao receber o operador matemático!");
let primeiro_numero: f32 = match entrada_primeiro_num.trim().parse() {
Ok(val) => val,
Err(_) => {
println!("Erro ao converter o primeiro número!");
return;
}
};
let segundo_numero: f32 = match entrada_segundo_num.trim().parse() {
Ok(val) => val,
Err(_) => {
println!("Erro ao converter o segundo número!");
return;
}
};
let operador: char = match entrada_operador.trim().parse() {
Ok(val) => val,
Err(_) => {
println!("Erro ao converter o operador!");
return;
}
};
if operador == '+' {
println!("Resultado: {} {} {} = {}", primeiro_numero, operador, segundo_numero, primeiro_numero + segundo_numero);
} else if operador == '-' {
println!("Resultado: {} {} {} = {}", primeiro_numero, operador, segundo_numero, primeiro_numero - segundo_numero);
} else if operador == '*' {
println!("Resultado: {} {} {} = {}", primeiro_numero, operador, segundo_numero, primeiro_numero * segundo_numero);
} else if operador == '/' {
if segundo_numero == 0.0 {
println!("[Erro] Divisão por zero não é permitida.");
} else {
println!("Resultado: {} {} {} = {}", primeiro_numero, operador, segundo_numero, primeiro_numero / segundo_numero);
}
} else {
println!("[Erro] Operador matemático não reconhecido!");
}
}
12 - Desenvolva um programa que calcule um desconto com base no valor da compra:
- Compras abaixo de R$ 100: sem desconto;
- Compras de R$ 100 a R$ 500: 10% de desconto;
- Compras acima de R$ 500: 20% de desconto.
Resposta
use std::io;
fn main() {
println!("Digite o valor total da compra:");
let mut entrada_valor: String = String::new();
io::stdin()
.read_line(&mut entrada_valor)
.expect("Erro ao receber o valor!");
let valor_compra: f32 = match entrada_valor.trim().parse() {
Ok(val) => val,
Err(_) => {
println!("Erro ao converter valor!");
return;
}
};
if valor_compra < 100.0 {
println!("Valor: R$ {:.2} - Sem desconto!", valor_compra);
} else if valor_compra >= 100.0 && valor_compra <= 500.0 {
let valor_desconto: f32 = valor_compra * 0.10; // 10%
let novo_valor: f32 = valor_compra - valor_desconto;
println!("Valor: R$ {:.2} - Desconto de 10% (R$ {:.2})\nNovo valor: R$ {:.2}", valor_compra, valor_desconto, novo_valor);
} else if valor_compra > 500.0 {
let valor_desconto: f32 = valor_compra * 0.20; // 20%
let novo_valor: f32 = valor_compra - valor_desconto;
println!("Valor: R$ {:.2} - Desconto de 20% (R$ {:.2})\nNovo valor: R$ {:.2}", valor_compra, valor_desconto, novo_valor);
} else {
println!("Valor inválido!");
}
}
13 - Escreva um programa que calcule o IMC (Índice de Massa Corporal) de uma pessoa (peso / altura²) e classifique o resultado:
| IMC | Classificação |
|---|---|
| Abaixo de 18.5 | Abaixo do peso |
| 18.5 - 24.9 | Peso normal |
| 25.0 - 29.9 | Sobrepeso |
| + 30.0 | Obesidade |
Resposta
use std::io;
const MSG_ERRO_ENTRADA: &str = "Erro na leitura de dados!";
const MSG_ERRO_CONVERSAO: &str = "Erro ao converter valor para número!";
fn main() {
println!("Digite o Peso (em kg):");
let mut entrada_peso: String = String::new();
io::stdin().read_line(&mut entrada_peso).expect(MSG_ERRO_ENTRADA);
let peso: f32 = match entrada_peso.trim().parse() {
Ok(val) => val,
Err(_) => {
println!("{}", MSG_ERRO_CONVERSAO);
return;
}
};
println!("Digite a Altura (em metros):");
let mut entrada_altura: String = String::new();
io::stdin().read_line(&mut entrada_altura).expect(MSG_ERRO_ENTRADA);
let altura: f32 = match entrada_altura.trim().parse() {
Ok(val) => val,
Err(_) => {
println!("{}", MSG_ERRO_CONVERSAO);
return;
}
};
let imc: f32 = peso / (altura * altura);
println!("Seu IMC é: {:.2}", imc);
if imc <= 18.5 {
println!("Classificação: Abaixo do Peso!");
} else if imc <= 24.9 {
println!("Classificação: Peso Normal!");
} else if imc <= 29.9 {
println!("Classificação: Sobrepeso!");
} else if imc >= 30.0 {
println!("Classificação: Obesidade!");
} else {
println!("Erro ao calcular IMC ou faixa inválida!");
}
}
14 - Crie um programa que solicite um nome de usuário e uma senha. Se o nome de usuário for “admin” e a senha for “1234”, exiba “Acesso concedido”. Caso contrário, exiba “Acesso negado”.
Resposta
use std::io;
const USERNAME_CORRETO: &str = "admin";
const PASSWORD_CORRETA: &str = "1234";
fn main() {
println!("Digite o Nome de Usuário:");
let mut entrada_usuario: String = String::new();
io::stdin()
.read_line(&mut entrada_usuario)
.expect("Erro na leitura!");
let nome_usuario: &str = entrada_usuario.trim();
println!("Digite a Senha:");
let mut entrada_senha: String = String::new();
io::stdin()
.read_line(&mut entrada_senha)
.expect("Erro na leitura!");
let senha: &str = entrada_senha.trim();
if nome_usuario == USERNAME_CORRETO && senha == PASSWORD_CORRETA {
println!("Acesso Concedido! Bem-vindo(a), {}!", nome_usuario);
} else {
println!("Acesso Negado! Verifique seu usuário e senha.");
}
}
15 - Crie o jogo “Pedra, Papel, Tesoura.” Peça as escolhas de dois jogadores e determine o vencedor com base nas regras clássicas.
Resposta
use std::io;
use std::time::{SystemTime, UNIX_EPOCH};
fn main() {
//
println!("--- Início ---");
println!("Jogador 1");
println!("Computador");
println!("");
println!("-- Selecionar --");
println!(" Jogador 1 ");
println!("");
println!("[1] Pedra");
println!("[2] Papel");
println!("[3] Tesoura");
println!("");
println!("1 | 2 | 3");
//
let mut entrada_jogador: String = String::new();
io::stdin()
.read_line(&mut entrada_jogador)
.expect("Erro na entrada de dados!");
let mut jogador: &str = entrada_jogador.trim();
//
if jogador == "1" {
jogador = "Pedra";
} else if jogador == "2" {
jogador = "Papel";
} else {
jogador = "Tesoura";
}
//
println!("");
println!("-- Selecionar --");
println!(" Jogador 2 ");
println!("");
println!("-- Sorteando --");
println!("[1] Pedra");
println!("[2] Papel");
println!("[3] Tesoura");
println!("");
//
let nanos = SystemTime::now()
.duration_since(UNIX_EPOCH)
.expect("Erro")
.as_nanos();
let nano_computador = (nanos % 3 + 1) as u8;
let computador: &str;
if nano_computador == 1 {
computador = "Pedra";
} else if nano_computador == 2 {
computador = "Papel";
} else {
computador = "Tesoura";
}
//
if jogador == computador {
println!("Jogador 1: {} e Computador: {}", jogador, computador);
println!("O jogo é um empate!");
} else if jogador == "Pedra" {
if computador == "Papel" {
println!("Jogador 1: {} e Computador: {}", jogador, computador);
println!("Jogador 1: Você Perdeu!");
}
if computador == "Tesoura" {
println!("Jogador 1: {} e Computador: {}", jogador, computador);
println!("Jogador 1: Você Venceu!");
}
} else if jogador == "Papel" {
if computador == "Pedra" {
println!("Jogador 1: {} e Computador: {}", jogador, computador);
println!("Jogador 1: Você Venceu!");
}
if computador == "Tesoura" {
println!("Jogador 1: {} e Computador: {}", jogador, computador);
println!("Jogador 1: Você Perdeu!");
}
} else {
if computador == "Pedra" {
println!("Jogador 1: {} e Computador: {}", jogador, computador);
println!("Jogador 1: Você Perdeu!");
}
if computador == "Papel" {
println!("Jogador 1: {} e Computador: {}", jogador, computador);
println!("Jogador 1: Você Venceu!");
}
}
}
Loop
Para repetições infinitas que continuam até serem explicitamente paradas com break.
Acesse: Loop sem break
loop + break
#![allow(unused)]
fn main() {
loop {
println!("Hello, world!");
break;
}
}
loop + if
#![allow(unused)]
fn main() {
let mut count = 0;
loop {
println!("Contagem: {}", count);
count += 1;
if count == 5 {
break;
}
}
println!("Fim do Loop!");
}
loop + break + continue
#![allow(unused)]
fn main() {
let mut count = 0;
let max_valor = 7;
loop {
count += 1;
if count % 2 == 0 {
continue;
}
println!("Ímpar = {}", count);
if count >= max_valor {
break;
}
println!("---")
}
}
Questões - Loop
01 - Crie um programa que use um loop para contar de 1 a 5. Para cada número, imprima o valor do contador. O loop deve parar quando o contador chegar a 6.
Resposta
fn main() {
let mut contador: u8 = 0;
loop {
contador += 1;
println!("Contagem = {}", contador);
if contador >= 5 {
break;
}
}
}
02 - Defina uma constante LIMITE com o valor 100. Use um loop para somar números a uma variável mutável sum começando de 1. Pare o loop quando o valor de sum exceder LIMIT e imprima o valor final de sum.
Resposta
const LIMITE: u8 = 100;
fn main() {
let mut soma_atual: u8 = 1;
loop {
println!("{}", soma_atual);
if soma_atual >= LIMITE {
break;
}
soma_atual += soma_atual;
}
}
03 - Escreva um loop que imprima repetidamente a mensagem “Estou preso em um loop!”. Use uma variável contadora e uma declaração if para interromper (break) o loop após a 3ª iteração.
Resposta
fn main() {
let mut contador: u8 = 0;
loop {
contador += 1;
if contador >= 4 {
break;
}
println!("Estou preso em um loop!");
}
}
04 - Use um loop para iterar de 1 a 10. Dentro do loop, verifique se o número atual é par ou ímpar usando o operador de módulo (%). Imprima o resultado formatado, como “O número 3 é ímpar.” O loop deve parar após o número 10.
Resposta
fn main() {
let mut contador: u8 = 0;
loop {
contador += 1;
if contador % 2 == 0 {
println!("O número {} é par.", contador);
} else {
println!("O número {} é ímpar.", contador);
}
if contador >= 10 {
break;
}
}
}
05 - Inicialize uma variável mutável do tipo f32 com 0.0. Em um loop, adicione 0.5 a essa variável em cada iteração. Imprima o valor em cada passo e pare o loop quando o valor for maior ou igual a 5.0.
Resposta
fn main() {
let mut contador: f32 = 0.0;
loop {
contador += 0.5;
println!("{}", contador);
if contador >= 5.0 {
break;
}
}
}
06 - Crie um jogo baseado em turnos entre jogador e monstro:
HP: 100
Ataque: 10
Defesa: 10
- Ataque do Jogador e Ataque do Monstro: Dano duplo para ambos
- Ataque do Jogador e Defesa do Monstro: Jogador recebe metade do dano e monstro não recebe dano
- Defesa do Jogador e Ataque do Monstro: Jogador não recebe dano e monstro recebe metade do dano
- Defesa do Jogador e Defesa do Monstro: Ambos bloqueiam
Usando apenas loop, if/else/else if e rand (SystemTime, UNIX_EPOCH)
Resposta
use std::io;
use std::time::{SystemTime, UNIX_EPOCH};
const DANO: i8 = 10;
fn main() {
let mut vida_jogador: i8 = 100;
let mut vida_monstro: i8 = 100;
let mut rodada = 0;
println!("--- Início do Jogo ---");
println!("Jogador vs Monstro");
println!("");
loop {
rodada += 1;
println!("---- Estatísticas ----");
println!(
"Jogador:\n HP: {}\n Dano: 10\n Defesa: 10\n",
vida_jogador
);
println!(
"Monstro:\n HP: {}\n Dano: 10\n Defesa: 10\n",
vida_monstro
);
println!("--- Jogador ---");
println!("[1] Atacar!\n[2] Defender\n");
let mut entrada_selecao_jogador: String = String::new();
io::stdin()
.read_line(&mut entrada_selecao_jogador)
.expect("Erro ao inserir dados!");
let selecao_jogador: i8 = entrada_selecao_jogador
.trim()
.parse()
.expect("Erro ao converter dados!");
let entrada_selecao_monstro = SystemTime::now()
.duration_since(UNIX_EPOCH)
.expect("Erro de tempo!")
.as_nanos();
let selecao_monstro = (entrada_selecao_monstro % 2 + 1) as i8;
if selecao_jogador == 1 && selecao_monstro == 1 {
vida_jogador = vida_jogador - (DANO * 2);
vida_monstro = vida_monstro - (DANO * 2);
println!("---- Rodada {} ----", rodada);
println!("Jogador: Atacar\nMonstro: Atacar\n");
println!("*** DANO DUPLO! ***\n");
} else if selecao_jogador == 1 && selecao_monstro == 2 {
vida_jogador = vida_jogador - (DANO / 2);
println!("---- Rodada {} ----", rodada);
println!("Jogador: Atacar\nMonstro: Defender\n");
println!("*** JOGADOR BLOQUEADO! ***\n");
} else if selecao_jogador == 2 && selecao_monstro == 1 {
vida_monstro = vida_monstro - (DANO / 2);
println!("---- Rodada {} ----", rodada);
println!("Jogador: Defender\nMonstro: Atacar\n");
println!("*** MONSTRO BLOQUEADO! ***\n");
} else if selecao_jogador == 2 && selecao_monstro == 2 {
vida_jogador = vida_jogador - (DANO * 2);
vida_monstro = vida_monstro - (DANO * 2);
println!("---- Rodada {} ----", rodada);
println!("Jogador: Defender\nMonstro: Defender\n");
println!("*** BLOQUEIO DUPLO! ***\n");
}
if vida_jogador <= 0 {
println!("---- Estatísticas Finais ----");
println!(
"Jogador:\n HP: {}\n Dano: 10\n Defesa: 10\n",
vida_jogador
);
println!(
"Monstro:\n HP: {}\n Dano: 10\n Defesa: 10\n",
vida_monstro
);
println!("--- Jogador ---\n*** VOCÊ PERDEU! ***");
break;
}
if vida_monstro <= 0 {
println!("---- Estatísticas Finais ----");
println!(
"Jogador:\n HP: {}\n Dano: 10\n Defesa: 10\n",
vida_jogador
);
println!(
"Monstro:\n HP: {}\n Dano: 10\n Defesa: 10\n",
vida_monstro
);
println!("--- Jogador ---\n*** VOCÊ VENCEU! ***");
break;
}
}
}
07 - Crie um contador que comece de 1 e avance. Dentro de um loop, verifique as seguintes condições:
- Se o número for divisível por 3 e 5, imprima “FizzBuzz”;
- Se for divisível apenas por 3, imprima “Fizz”;
- Se for divisível apenas por 5, imprima “Buzz”;
- Caso contrário, imprima o número;
- Pare o loop quando o contador chegar a 100.
Resposta
fn main() {
println!("Contando de 1 .. 100!");
let mut contador: u8 = 0;
loop {
contador += 1;
if contador % 3 == 0 && contador % 5 == 0 {
println!("FizzBuzz");
} else if contador % 3 == 0 {
println!("Fizz");
} else if contador % 5 == 0 {
println!("Buzz");
} else {
println!("{}", contador);
}
if contador >= 100 {
break;
}
}
}
08 - Comece com capital = 1000.0 e a meta = 2000.0. A cada ano (iteração do loop), o capital aumenta em 7% (capital *= 1.07;). O loop deve contar quantos anos leva para o capital atingir ou exceder a meta. Quando a meta for atingida, o loop deve parar, retornando o número de anos. Imprima o resultado.
Resposta
fn main() {
let mut capital: f32 = 1000.0;
let mut ano: u8 = 0;
loop {
capital *= 1.07;
ano += 1;
println!("Capital = {} e Ano = {}", capital, ano);
if capital >= 2000.0 {
println!("Capital final = {}", capital);
println!("Anos necessários = {}", ano);
break;
}
}
}
09 - Crie um loop que comece com o caractere ‘a’ e imprima cada caractere até ‘f’. Use uma variável mutável do tipo char e incremente-a. Para incrementar, você pode converter o char para u8, adicionar 1 e converter de volta para char. Pare quando o caractere for maior que ‘f’.
Resposta
fn main() {
let mut caractere_atual: char = 'a';
println!("-- Início --");
loop {
println!("Caractere: {}", caractere_atual);
let valor_inicial_char = caractere_atual as u8;
let proximo_valor_char = valor_inicial_char + 1;
caractere_atual = proximo_valor_char as char;
if caractere_atual > 'f' {
break;
}
}
}
10 - Declare uma tupla mutável let mut data = (0, false);. Crie um loop que incremente o primeiro elemento da tupla em 1 a cada iteração. Quando o primeiro elemento atingir o valor 5, altere o segundo elemento para true e pare o loop. Imprima a tupla final fora do loop.
Resposta
fn main() {
let mut estado: (u8, bool) = (0, false);
loop {
println!("{:?}", estado);
estado.0 += 1;
if estado.0 > 5 {
estado.1 = true;
println!("{:?}", estado);
break;
}
}
}
11 - Crie uma tupla chamada person com os valores (Person, 0, 0.0). Em seguida, altere seus dados 3 vezes usando um loop, solicitando ao usuário o nome, idade e altura, e imprima os valores.
Resposta
use std::io;
fn main() {
let mut pessoa: (String, u8, f32) = ("Pessoa".to_string(), 0, 0.0);
println!("{:#?}", pessoa);
let mut quantidade: u8 = 0;
loop {
println!("Qual é o seu nome?");
let mut entrada_nome: String = String::new();
io::stdin()
.read_line(&mut entrada_nome)
.expect("Erro ao inserir dados!");
let nome: String = entrada_nome.trim().to_string();
println!("Qual é a sua idade?");
let mut entrada_idade: String = String::new();
io::stdin()
.read_line(&mut entrada_idade)
.expect("Erro ao inserir dados!");
let idade: u8 = entrada_idade.trim().parse().expect("Erro ao converter dados!");
println!("Qual é a sua altura?");
let mut entrada_altura: String = String::new();
io::stdin()
.read_line(&mut entrada_altura)
.expect("Erro ao inserir dados!");
let altura: f32 = entrada_altura.trim().parse().expect("Erro ao converter dados!");
quantidade += 1;
pessoa = (nome, idade, altura);
println!("{:#?}", pessoa);
if quantidade >= 3 {
break;
}
}
}
12 - Use um loop para exibir os elementos do seguinte array: [u8; 5] = [10, 20, 30, 40, 50]
Resposta
fn main() {
let array_inicial: [u8; 5] = [10, 20, 30, 40, 50];
let mut indice = 0;
loop {
if indice >= array_inicial.len() {
break;
}
println!("{}", array_inicial[indice]);
indice += 1;
}
}
13 - Use um loop para exibir os elementos na ordem inversa do seguinte array: [u8; 5] = [1, 2, 3, 4, 5]
Resposta
fn main() {
let array_inicial: [u8; 5] = [1, 2, 3, 4, 5];
let mut indice = array_inicial.len() - 1;
loop {
if indice <= 0 {
println!("{}", array_inicial[indice]);
break;
}
println!("{}", array_inicial[indice]);
indice -= 1;
}
}
14 - Você poderia criar um código para imprimir os quatro arrays a seguir: [u8; 2] = [1, 2];, [f32; 3] = [2.5, 7.3, 9.2];, [char; 4] = [‘A’, ‘B’, ‘C’, ‘D’]; e [&str; 5] = [“Ana”, “Bruno”, “Carla”, “Daniel”, “Elza”];
Resposta
fn main() {
let array_int_inicial: [u8; 2] = [1, 2];
let array_float_inicial: [f32; 3] = [2.5, 7.3, 9.2];
let array_char_inicial: [char; 4] = ['A', 'B', 'C', 'D'];
let array_str_inicial: [&str; 5] = ["Ana", "Bruno", "Carla", "Daniel", "Elza"];
let mut indice = 0;
loop {
if indice >= array_int_inicial.len() {
break;
}
println!("{}", array_int_inicial[indice]);
indice += 1;
}
println!("");
indice = 0;
loop {
if indice >= array_float_inicial.len() {
break;
}
println!("{}", array_float_inicial[indice]);
indice += 1;
}
println!("");
indice = 0;
loop {
if indice >= array_char_inicial.len() {
break;
}
println!("{}", array_char_inicial[indice]);
indice += 1;
}
println!("");
indice = 0;
loop {
if indice >= array_str_inicial.len() {
break;
}
println!("{}", array_str_inicial[indice]);
indice += 1;
}
}
15 - Crie um código que some os dados em um array usando um loop; aqui está o array: [u8; 4] = [1, 2, 4, 5]
Resposta
fn main() {
let array_inicial: [u8; 4] = [1, 2, 4, 5];
let mut indice = 0;
let mut soma = 0;
loop {
if indice >= array_inicial.len() {
break;
}
println!("Valor = {:?}", array_inicial[indice]);
soma = soma + array_inicial[indice];
indice += 1;
}
println!("Soma = {}", soma);
}
16 - Declare um array mutável de 5 posições do tipo i32, inicializado com zeros: let mut my_array = [0; 5];. Use um loop e uma variável de índice para preencher o array com os valores [10, 20, 30, 40, 50]. O loop deve parar quando o array estiver completo. Imprima o array final.
Resposta
fn main() {
let mut array_preencher: [i32; 5] = [0; 5];
let mut indice = 0;
loop {
if indice >= array_preencher.len() {
break;
}
array_preencher[indice] = (indice as i32 + 1) * 10;
indice += 1;
}
println!("Array = {:?}", array_preencher);
}
17 - Calcule o fatorial de 5 usando um loop. Você precisará de duas variáveis mutáveis: uma para o contador (de 1 a 5) e outra para armazenar o resultado do fatorial. Imprima o resultado final.
Resposta
fn main() {
let mut contador: u8 = 1;
let mut fatorial: u8 = 1;
loop {
println!("Fatorial Parcial = {}", fatorial);
fatorial *= contador;
contador += 1;
if contador > 5 {
break;
}
}
println!("Resultado do Fatorial = {}", fatorial);
}
18 - Comece com uma variável number igual a 123. Em um loop, divida o número por 2 e imprima o resultado da divisão e o resto (%). Continue o loop até que o número seja menor que 1.
Resposta
fn main() {
let mut numero: f32 = 123.0;
loop {
let divisao = numero / 2.0;
let resto = numero % 2.0;
numero = divisao;
println!("123 / 2 = {:.2}\n123 % 2 = {:.2}\n", divisao, resto);
if numero < 1.0 {
break;
}
}
}
19 - Dentro de um loop, calcule e imprima o resultado da expressão 5 + counter * 2, onde counter é uma variável que começa em 0 e é incrementada em cada iteração. Use parênteses para alterar a precedência e calcule (5 + counter) * 2 em uma segunda impressão. Pare o loop quando o contador chegar a 5.
Resposta
fn main() {
let mut contador: u8 = 0;
loop {
println!(
"Contador = {} | 5 + contador * 2 = {}",
contador,
5 + contador * 2
);
println!(
"Contador = {} | (5 + contador) * 2 = {}",
contador,
(5 + contador) * 2
);
contador += 1;
if contador > 5 {
break;
}
}
}
20 - Defina uma constante NUMERO_SECRETO: u8 = 42;. Crie um loop que simule tentativas de adivinhação. Uma variável de tentativa deve ser incrementada em cada iteração. Use if/else if/else para imprimir “Muito Baixo”, “Muito Alto” ou “Você acertou!” quando a tentativa for igual ao NUMERO_SECRETO. Pare o loop (break) quando você adivinhar corretamente.
Resposta
use std::io;
const NUMERO_SECRETO: u8 = 42;
fn main() {
println!("------- Início -------");
println!("Jogador 1 VS Computador");
println!("");
println!("---------------------");
println!("Você tem 3 tentativas!");
let mut tentativas: u8 = 0;
loop {
println!("\nInsira um número:");
let mut entrada_numero: String = String::new();
io::stdin()
.read_line(&mut entrada_numero)
.expect("Erro ao inserir dados!");
let numero_jogador: u8 = entrada_numero
.trim()
.parse()
.expect("Erro ao converter dados!");
if numero_jogador > NUMERO_SECRETO {
println!("Muito Alto!");
} else if numero_jogador < NUMERO_SECRETO {
println!("Muito Baixo!");
} else {
println!("\nVocê Venceu!");
break;
}
tentativas += 1;
if tentativas == 1 {
println!("Você tem 2 tentativas restantes!");
} else if tentativas == 2 {
println!("Você tem 1 tentativa restante!");
} else if tentativas == 3 {
println!("VOCÊ PERDEU!");
break;
}
}
}
21 - Faça uma contagem regressiva de 10 a 1. Use um loop e a macro format! para imprimir mensagens como:“Contagem Regressiva: 10”, “Contagem Regressiva: 9”, etc. Quando o contador chegar a 0, imprima “Lançamento!” e pare o loop.
Resposta
fn main() {
println!("-- Início --");
let mut contador: i8 = 10;
loop {
println!("Contagem Regressiva: {}", contador);
contador -= 1;
if contador < 1 {
println!("Lançamento!");
break;
}
}
}
22 - Declare um array mutável de 10 posições ([0; 10]). Use um loop com um contador para preenchê-lo. Se o índice do array for par, preencha-o com o próprio valor do índice. Se for ímpar, preencha-o com o dobro do valor do índice. Pare o loop quando o array estiver completo.
Resposta
fn main() {
let mut array_preencher: [i8; 10] = [0; 10];
let mut indice = 0;
loop {
if indice >= array_preencher.len() {
break;
}
if indice % 2 == 0 {
array_preencher[indice] = indice as i8;
} else {
array_preencher[indice] = indice as i8 * 2;
}
println!("Array = {:?}", array_preencher);
indice += 1;
}
}
While
Repete um bloco de código enquanto uma condição permanecer verdadeira. Verifica a condição antes de cada iteração.
while
#![allow(unused)]
fn main() {
let mut count = 0;
while count <= 5 {
println!("Valor = {}", count);
count += 1;
}
}
while + continue
#![allow(unused)]
fn main() {
let mut count = 0;
let max_value = 4;
while count <= max_value {
count += 1;
if count % 2 == 0 {
println!("Valor = {} é par!", count);
continue;
}
println!("---");
}
}
Questões - While
01 - Escreva um programa em Rust que use um loop while para imprimir os números de 1 a 5, um por linha.
Resposta
fn main() {
let mut contador: u8 = 1;
while contador <= 5 {
println!("Contador = {}", contador);
contador += 1;
}
}
02 - Usando um loop while, crie um programa que imprima uma contagem regressiva de 10 a 1 e, em seguida, a mensagem “Launch!” (Lançar!).
Resposta
fn main() {
let mut contador: u8 = 10;
while contador >= 1 {
println!("{}", contador);
contador -= 1;
if contador < 1 {
println!("Lançamento!");
}
}
}
03 - Escreva um programa que calcule a soma de todos os números inteiros de 1 a 100, usando um loop while. Imprima o resultado final.
Resposta
fn main() {
let mut soma: u16 = 0;
let mut contador: u8 = 1;
while contador <= 100 {
soma += contador as u16;
contador += 1;
}
println!("Soma = {}", soma);
}
04 - Crie um loop while que seja intencionalmente infinito, mas use a palavra-chave break para sair do loop quando um contador atingir o valor 7. Imprima o valor do contador em cada iteração antes de verificar a condição de saída.
Resposta
fn main() {
let mut contador: u8 = 0;
loop {
contador += 1;
println!("Contador = {}", contador);
if contador >= 7 {
break;
}
}
}
05 - Verifique se um determinado número (por exemplo, num = 32) é uma potência de 2 usando um loop while. Imprima true (verdadeiro) ou false (falso).
Resposta
use std::io;
fn main() {
println!("Insira um número:");
let mut entrada_numero: String = String::new();
io::stdin()
.read_line(&mut entrada_numero)
.expect("Erro de entrada de dados!");
let mut numero: u16 = entrada_numero.trim().parse().expect("Erro na conversão de dados!");
if numero == 1 {
println!("{}", true);
} else {
while numero % 2 == 0 {
numero /= 2;
}
if numero == 1 {
println!("{}", true);
} else {
println!("{}", false);
}
}
}
06 - Escreva um programa com um loop while que itere de 0 a 10. Se o número atual for ímpar, use continue para pular a impressão desse número. Imprima apenas os números pares.
Resposta
fn main() {
let mut contador: u8 = 0;
while contador <= 10 {
if contador % 2 != 0 {
contador += 1;
continue;
}
println!("Número par: {}", contador);
contador += 1;
}
}
07 - Escreva um programa que peça ao usuário para inserir um número maior que 10. Use um loop while para continuar pedindo a entrada até que um número válido seja fornecido.
Resposta
use std::io;
fn main() {
let mut condicao: u8 = 0;
while condicao <= 10 {
println!("Insira um número:");
let mut entrada_numero: String = String::new();
io::stdin()
.read_line(&mut entrada_numero)
.expect("Erro de entrada de dados!");
let numero: u8 = entrada_numero.trim().parse().expect("Erro na conversão de dados!");
println!("");
condicao = numero;
if condicao <= 10 {
println!("Número <= 10.");
println!("Tente novamente!\n");
} else {
println!("Número > 10!");
}
}
}
08 - Calcule o fatorial de um número (por exemplo, 5!) usando um loop while. Imprima o resultado.
Resposta
use std::io;
fn main() {
println!("Insira um número:");
let mut entrada_numero: String = String::new();
io::stdin()
.read_line(&mut entrada_numero)
.expect("Erro de entrada de dados!!");
let numero: u16 = entrada_numero.trim().parse().expect("Erro na conversão de dados!");
if numero == 0 {
println!("Fatorial: 0 = 1");
} else {
let mut fatorial: u16 = 1;
let mut i: u16 = 1;
while i <= numero {
fatorial *= i;
i += 1;
}
println!("Fatorial: {} = {}", numero, fatorial);
}
}
09 - Dado um número inteiro (por exemplo, 12345), use um loop while para imprimi-lo ao contrário (ou seja, 54321). Dica: use os operadores % (módulo) e / (divisão).
Resposta
use std::io;
fn main() {
println!("Insira um número:");
let mut entrada_numero: String = String::new();
io::stdin()
.read_line(&mut entrada_numero)
.expect("Erro na entrada de dados!");
let mut numero: u16 = entrada_numero.trim().parse().expect("Erro na conversão de dados!");
let numero_salvo = numero;
let mut numero_invertido: u16 = 0;
if numero == 0 {
numero_invertido = numero;
} else {
while numero > 0 {
let digito = numero % 10;
numero_invertido = (numero_invertido * 10) + digito;
numero /= 10;
}
}
println!("Número original: {}", numero_salvo);
println!("Número invertido: {}", numero_invertido);
}
10 - Escreva um programa que conte o número de dígitos em um número inteiro positivo usando um loop while. Por exemplo, 12345 tem 5 dígitos.
Resposta
use std::io;
fn main() {
println!("Insira um número:");
let mut entrada_numero: String = String::new();
io::stdin()
.read_line(&mut entrada_numero)
.expect("Erro na entrada de dados!");
let mut numero: u16 = entrada_numero.trim().parse().expect("Erro na conversão de dados!");
let numero_salvo: u16 = numero;
let mut contagem: u8 = 0;
if numero == 0 {
contagem = 1;
} else {
while numero > 0 {
numero /= 10;
contagem += 1;
}
}
println!("Contagem de dígitos de {} = {}", numero_salvo, contagem);
}
11 - Imprima os quadrados dos números de 1 a 7 usando um loop while.
Resposta
fn main() {
let mut contador: u16 = 1;
while contador <= 7 {
let quadrado: u16 = contador * contador;
println!("Quadrado: {} = {}", contador, quadrado);
contador += 1;
}
}
12 - Dado um número let mut num = 64;, use um loop while para dividi-lo repetidamente por 2 até que o resultado seja menor ou igual a 1. Imprima cada resultado da divisão.
Resposta
fn main() {
let mut numero: u8 = 64;
while numero > 1 {
numero /= 2;
println!("Resultado = {}", numero);
}
}
13 - Encontre e imprima o primeiro número par maior que 50 usando um loop while.
Resposta
fn main() {
let mut numero: u8 = 51;
while numero % 2 > 0 {
numero += 1;
}
println!("Resultado = {}", numero);
}
14 - Crie um número secreto (por exemplo, secreto = 42). Peça ao usuário para adivinhar o número. Use um loop while para continuar o jogo até que o usuário adivinhe corretamente. Dê dicas (“muito alto”, “muito baixo”). (Requer std::io para entrada do usuário).
Resposta
use std::io;
fn main() {
let mut numero: u8 = 0;
let numero_secreto: u8 = 42;
while numero != numero_secreto {
println!("Insira um número:");
let mut entrada_numero: String = String::new();
io::stdin()
.read_line(&mut entrada_numero)
.expect("Erro na entrada de dados!");
numero = entrada_numero
.trim()
.parse()
.expect("Erro na conversão do número!");
if numero > numero_secreto {
println!("Muito Alto!!!");
} else if numero < numero_secreto {
println!("Muito Baixo!!!");
} else {
println!("VOCÊ VENCEU!");
break;
}
}
}
15 - Peça um número ao usuário e, usando um loop while, imprima os primeiros 5 múltiplos desse número.
Resposta
use std::io;
fn main() {
println!("Insira um número:");
let mut entrada_numero: String = String::new();
io::stdin()
.read_line(&mut entrada_numero)
.expect("Erro na entrada de dados!");
let numero_base: u8 = entrada_numero.trim().parse().expect("Erro na conversão de dados!");
let mut contador: u8 = 0;
let mut resultado: u8;
println!();
while contador < 5 {
contador += 1;
resultado = contador * numero_base;
println!("{}", resultado);
}
}
16 - Use loops while aninhados para imprimir um quadrado 3x3 de asteriscos.
Resposta
use std::io;
fn main() {
println!("Insira o número de linhas:");
let mut entrada_linha: String = String::new();
io::stdin()
.read_line(&mut entrada_linha)
.expect("Erro na entrada de dados!");
println!("Insira o número de colunas:");
let mut entrada_coluna: String = String::new();
io::stdin()
.read_line(&mut entrada_coluna)
.expect("Erro na entrada de dados!");
let num_linhas: u8 = entrada_linha.trim().parse().expect("Erro na conversão de dados!");
let num_colunas: u8 = entrada_coluna.trim().parse().expect("Erro na conversão de dados!");
let simbolo: String = String::from("*");
let mut contador_linha: u8 = 0;
while contador_linha < num_linhas {
let mut contador_coluna: u8 = 0;
while contador_coluna < num_colunas {
print!("{}", simbolo);
contador_coluna += 1;
}
println!();
contador_linha += 1;
}
}
17 - Escreva um programa em Rust que solicite ao usuário a inserção de um número inteiro positivo. Em seguida, encontre e exiba os primeiros cinco divisores desse número. Se menos de cinco divisores forem encontrados, o programa deve informar que “Os primeiros 5 números múltiplos não foram encontrados!”.
Resposta
use std::io;
fn main() {
println!("Insira um número:");
let mut entrada_numero: String = String::new();
io::stdin()
.read_line(&mut entrada_numero)
.expect("Erro na entrada de dados!");
let numero_base: u8 = entrada_numero.trim().parse().expect("Erro na conversão de dados!");
let mut candidato_divisor: u8 = 0;
let mut divisores_encontrados: u8 = 0;
while divisores_encontrados < 5 {
candidato_divisor += 1;
if candidato_divisor == 0 {
continue;
}
if numero_base % candidato_divisor == 0 {
divisores_encontrados += 1;
println!("{} % {} = 0", numero_base, candidato_divisor);
}
if candidato_divisor > numero_base && divisores_encontrados < 5 {
println!("Os primeiros 5 múltiplos não foram encontrados!");
break;
}
}
}
For
Itera sobre coleções, intervalos (ranges), ou qualquer iterável, sendo mais seguro que indexação manual, lida com limites automaticamente.
for
#![allow(unused)]
fn main() {
for element in collection {
}
}
0..4
#![allow(unused)]
fn main() {
for i in 0..5 {
println!("{}", i);
}
}
0..=5
#![allow(unused)]
fn main() {
for i in 0..=5 {
println!("{}", i);
}
}
.rev = 4..3..2..1..
#![allow(unused)]
fn main() {
for i in (0..5).rev() {
println!("{}", i);
}
}
#![allow(unused)]
fn main() {
// 5 - 0
for i in (0..=5).rev() {
println!("{}", i);
}
}
for + &str
#![allow(unused)]
fn main() {
let name: &str = "Rust";
for i in name.chars() {
println!("{}", i);
}
}
for + array
#![allow(unused)]
fn main() {
let arr = ["Maçã", "Banana", "Laranja", "Goiaba"];
for i in arr {
println!("{}", i)
}
}
for + array bidimensional
#![allow(unused)]
fn main() {
let arr: [[i32; 3]; 3] = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];
for i in arr {
for j in i {
print!("{}", j);
}
println!();
}
}
Questões - for
01 - Escreva um programa que imprime os números de 1 a 10 usando um laço for.
Resposta
fn main() {
for i in 1..=10 {
println!("{}", i);
}
}
02 - Crie um programa que calcula a soma dos números de 1 a 100 usando um laço for.
Resposta
fn main() {
let mut soma: u16 = 0;
for i in 1..=100 {
soma += i;
println!("{}", i);
println!("{}", soma);
println!();
}
println!("{}", soma);
}
03 - Desenvolva um programa que imprime todos os números pares de 0 a 20 usando um laço for.
Resposta
fn main() {
for i in 0..=20 {
if i % 2 == 0 {
println!("{}", i);
}
}
}
04 - Escreva um programa que imprime todos os números em binário até o número solicitado inserido.
Resposta
use std::io;
fn main() {
println!("Insira um número:");
let mut entrada_numero: String = String::new();
io::stdin().read_line(&mut entrada_numero).err();
let numero_limite: i16 = entrada_numero.trim().parse().expect("");
println!("");
for i in 0..=numero_limite {
println!("Número: {:02} = {:b}", i, i);
}
}
05 - Desenvolva um programa que gera todas as combinações possíveis de dois dígitos (00 a 99) usando laços for aninhados.
Resposta
fn main() {
for i in 0..=100 {
println!("{:02}", i);
}
}
fn main() {
for i in 0..=100 {
if i < 10 {
println!("0{}", i)
} else {
println!("{}", i);
}
}
}
06 - Escreva um programa que imprime a multiplicação de um número fornecido pelo usuário (de 1 a 10) usando um laço for.
Resposta
use std::io;
fn main() {
println!("Insira um número:");
let mut entrada_numero: String = String::new();
io::stdin()
.read_line(&mut entrada_numero)
.expect("Erro na entrada de dados!");
let numero_base: i16 = entrada_numero.trim().parse().expect("Erro na conversão de dados!");
println!();
for i in 1..=10 {
let resultado: i16 = numero_base * i;
println!("{} x {} = {}", numero_base, i, resultado);
}
}
07 - Crie um programa que inverte uma string fornecida pelo usuário usando um laço for.
Resposta
use std::io;
fn main() {
println!("Insira um texto:");
let mut entrada_texto: String = String::new();
io::stdin()
.read_line(&mut entrada_texto)
.expect("Erro na entrada de dados!");
let texto_original: String = entrada_texto.trim().to_string();
let mut texto_invertido = String::new();
for i in texto_original.chars().rev() {
texto_invertido.push(i);
println!("{}", texto_invertido);
}
println!("\n{}", texto_invertido);
}
08 - Crie um programa que calcula a soma dos dígitos de um inteiro usando um laço for.
Resposta
use std::io;
fn main() {
println!("Insira um número:");
let mut entrada_numero: String = String::new();
io::stdin().read_line(&mut entrada_numero).err();
let mut soma_resultado: i16 = 0;
for i in entrada_numero.trim().chars() {
let digito_convertido: i16 = i.to_string().parse().expect("Erro na conversão de dados!");
soma_resultado += digito_convertido;
}
println!("{}", soma_resultado);
}
09 - Desenvolva um programa que conta quantas vogais (a, e, i, o, u) estão em uma string usando um laço for.
Resposta
use std::io;
fn main() {
println!("Insira um texto:");
let mut entrada_texto: String = String::new();
io::stdin()
.read_line(&mut entrada_texto)
.expect("Erro na entrada de dados!");
let texto_minusculo: String = entrada_texto.trim().to_lowercase().to_string();
let mut qtd_vogais: u8 = 0;
for i in texto_minusculo.chars() {
if i == 'a' || i == 'e' || i == 'i' || i == 'o' || i == 'u' {
qtd_vogais += 1;
}
}
println!("Qtd. = {}", qtd_vogais);
}
10 - Escreva um programa que encontra o maior número em uma lista de números usando um laço for. Lista = [17, 43, 5, 54, 93]
Resposta
fn main() {
let array: [u8; 5] = [17, 43, 5, 54, 93];
let mut maior_numero: u8 = 0;
for (_i, j) in array.iter().enumerate() {
if *j > maior_numero {
maior_numero = *j;
}
}
println!("{}", maior_numero);
}
11 - Crie um programa que encontra o menor número em uma lista de números usando um laço for. Lista = [63, 36, 57, 7, 82]
Resposta
fn main() {
let array: [u8; 5] = [63, 36, 57, 7, 82];
let mut menor_numero: u8 = array[1];
for (_i, j) in array.iter().enumerate() {
if *j < menor_numero {
menor_numero = *j;
}
}
println!("{}", menor_numero);
}
12 - Desenvolva um programa que calcula o fatorial de um inteiro positivo fornecido pelo usuário usando um laço for.
Resposta
use std::io;
fn main() {
println!("Insira um número:");
let mut entrada_numero: String = String::new();
io::stdin()
.read_line(&mut entrada_numero)
.expect("Erro na entrada de dados!");
let numero_limite: u8 = entrada_numero.trim().parse().expect("Erro na conversão de dados!");
let mut fatorial: u8 = 1;
for i in 1..=numero_limite {
fatorial *= i;
println!("Fatorial Parcial = {}", fatorial);
}
}
13 - Escreva um programa que imprime os elementos de uma lista em ordem inversa usando um laço for. Lista = [1, 2, 3, 4, 5];
Resposta
fn main() {
let arr: [u8; 5] = [1, 2, 3, 4, 5];
for i in arr.iter().rev() {
println!("{:#?}", i);
}
}
14 - Crie um programa que verifica se uma palavra é um palíndromo (lê-se da mesma forma de frente para trás e de trás para frente) usando um laço for.
Resposta
use std::io;
fn main() {
println!("Insira uma palavra:");
let mut entrada_palavra: String = String::new();
io::stdin()
.read_line(&mut entrada_palavra)
.expect("Erro na entrada de dados!");
let palavra_original: String = entrada_palavra.trim().to_lowercase().to_string();
let mut palavra_invertida: String = String::new();
for i in palavra_original.chars().rev() {
palavra_invertida.push(i);
}
if palavra_original == palavra_invertida {
println!("A palavra {} é um palíndromo!", palavra_original)
} else {
println!("A palavra {} não é um palíndromo!", palavra_original);
}
}
15 - Escreva um programa que conta quantas vezes um caractere específico aparece em uma string usando um laço for.
Resposta
use std::io;
fn main() {
println!("Insira uma palavra:");
let mut entrada_palavra: String = String::new();
io::stdin()
.read_line(&mut entrada_palavra)
.expect("Erro na entrada de dados!");
let palavra_base: String = entrada_palavra.trim().to_lowercase().to_string();
println!("\nInsira o caractere de busca: ");
let mut entrada_caractere: String = String::new();
io::stdin()
.read_line(&mut entrada_caractere)
.expect("Erro na entrada de dados!");
let caractere_busca: char = entrada_caractere.trim().parse().expect("Erro na entrada de dados!");
let mut contagem: u8 = 0;
for i in palavra_base.chars() {
if i == caractere_busca {
contagem += 1;
}
}
if contagem >= 1 {
println!("\nA letra '{}' se repete '{}' vezes!", caractere_busca, contagem);
} else {
println!("\nA letra '{}' não se repete.", caractere_busca);
}
}
16 - Crie um programa que calcula o produto de todos os números em uma lista usando um laço for.
Resposta
fn main() {
let arr: [u8; 5] = [1, 2, 3, 4, 5];
let mut mult: u8 = 1;
for i in arr.iter() {
mult *= i;
println!("Stage {:?} = {:?}", i, mult);
}
}
17 - Escreva um programa que recebe 5 valores inteiros, inseridos pelo usuário, usando um array e for.
Resposta
use std::io;
fn main() {
let mut array_entrada: [i8; 5] = [0; 5];
for i in 0..array_entrada.len() {
println!("\nInsira o número para a posição {}:", i);
let mut entrada_numero: String = String::new();
io::stdin().read_line(&mut entrada_numero).expect("Erro ao ler dados!");
array_entrada[i] = entrada_numero.trim().parse().expect("Erro na conversão de dados!");
}
println!("\nArray preenchido: {:?}", array_entrada);
}
18 - Desenvolva um programa que encontra a média de uma lista de números usando um laço for.
Resposta
use std::io;
fn main() {
let mut array_numeros: [i8; 10] = [0; 10];
let mut soma: u8 = 0;
for i in 0..array_numeros.len() {
println!("Insira o número:");
let mut entrada_numero: String = String::new();
io::stdin()
.read_line(&mut entrada_numero)
.expect("Erro na entrada de dados!");
array_numeros[i] = entrada_numero.trim().parse().expect("Erro na conversão de dados!");
soma += array_numeros[i] as u8;
}
soma /= 10;
println!("Média = {}", soma);
}
19 - Desenvolva um programa que conta o número de números negativos em uma lista usando um laço for.
Resposta
use std::io;
fn main() {
println!("Insira 5 números:");
let mut array_entrada: [i8; 5] = [0; 5];
let mut contagem: u8 = 0;
for i in 0..array_entrada.len() {
let mut entrada_numero: String = String::new();
io::stdin()
.read_line(&mut entrada_numero)
.expect("Erro na entrada de dados!");
array_entrada[i] = entrada_numero.trim().parse().expect("Erro na conversão de dados!");
if array_entrada[i] < 0 {
contagem += 1;
}
}
println!("Contagem de números negativos = {}", contagem);
}
20 - Escreva um código que recebe 5 números inseridos pelo usuário e os adiciona a uma tupla vazia, verifica se há números pares e, se sim, os adiciona a outra lista vazia.
Resposta
use std::io;
fn main() {
println!("Insira 5 números:");
let mut array_entrada: [i8; 5] = [0; 5];
let mut array_pares: [i8; 5] = [0; 5];
for i in 0..array_entrada.len() {
let mut entrada_numero: String = String::new();
io::stdin()
.read_line(&mut entrada_numero)
.expect("Erro na entrada de dados!");
array_entrada[i] = entrada_numero.trim().parse().expect("Erro na conversão de dados!");
if array_entrada[i] % 2 == 0 {
array_pares[i] = array_entrada[i];
}
}
println!("\nArray de pares (ímpares são 0): {:?}", array_pares);
}
21 - Escreva um programa que recebe o nome e a idade de um usuário e os armazena em uma tupla usando for.
Resposta
use std::io;
fn main() {
println!("Insira o número de usuários que deseja adicionar:");
let mut entrada_contagem: String = String::new();
io::stdin().read_line(&mut entrada_contagem).expect("Erro ao ler a contagem!");
let quantidade: u8 = entrada_contagem.trim().parse().expect("Erro na conversão de dados!");
let mut dados_usuario: (String, u8);
for _i in 0..quantidade {
println!("\nInsira o nome:");
let mut entrada_nome: String = String::new();
io::stdin().read_line(&mut entrada_nome).expect("Erro ao ler o nome!");
let nome = entrada_nome;
println!("\nInsira a idade:");
let mut entrada_idade: String = String::new();
io::stdin().read_line(&mut entrada_idade).expect("Erro ao ler a idade!");
let idade: u8 = entrada_idade.trim().parse().expect("Erro na conversão de dados!");
dados_usuario = (nome, idade);
println!("\nNome:{} Idade:{}", dados_usuario.0, dados_usuario.1);
}
}
Match
Compara um valor contra diferentes padrões (patterns) e executa o código correspondente ao primeiro padrão que corresponde. É como um switch mais poderoso e mais seguro.
Ele garante que todos os casos possíveis são cobertos, prevenindo erros comuns. Diferente do switch tradicional, ele não precisa de break e sempre retorna um valor.
#![allow(unused)]
fn main() {
let a = 3;
match a {
1 => println!("1"),
2 => println!("2"),
3 => println!("3"),
_ => println!("Nenhuma!"),
};
}
range
#![allow(unused)]
fn main() {
let idade = 63;
let categoria = match idade {
0..=11 => "Criança",
12..=17 => "Adolescente",
18..=64 => "Adulto",
_ => "Idoso",
};
println!("{}", categoria);
}
println!()
#![allow(unused)]
fn main() {
let letra = 'g';
println!("{:?}", match letra {
'A'..='Z' => "A ... Z",
'a'..='z' => "a ... z",
_ => "Outro",
});
}
operation
#![allow(unused)]
fn main() {
let numero = 20;
let result = match numero {
1 | 3 | 5 | 7 | 9 => "Ímpar",
2 | 4 | 6 | 8 | 10 => "Par",
_=> "Nenhum!",
};
println!("{}", result);
}
equal
#![allow(unused)]
fn main() {
let even = (2, -2);
let result = match even {
(x, y) if x == y => "x é igual a y",
(x, _) if x % 2 == 0 => "o valor x é par",
_=> "Nenhuma!",
};
println!("{:?}", result);
}
Questões - Match
01 - Escreva um programa que recebe um caractere e indica se é uma vogal (a, e, i, o, u) ou uma consoante. Use match para validar.
Resposta
use std::io;
fn main() {
println!("Insira um caractere (a-z):");
let mut entrada: String = String::new();
io::stdin()
.read_line(&mut entrada)
.expect("Erro na leitura da entrada!");
let caractere = entrada.trim();
match caractere {
"a" | "e" | "i" | "o" | "u" => println!("O caractere '{}' é uma vogal!", caractere),
"" => println!("Nenhum caractere foi inserido!"),
_ => println!("O caractere '{}' é uma consoante!", caractere),
};
}
02 - Crie um programa que recebe uma nota (0 a 10) e a converte para um conceito.
| Conceito | Notas |
|---|---|
| A | 9 - 10 |
| B | 7 - 8 |
| C | 5 - 6 |
| D | 3 - 4 |
| E | 1 - 2 |
| F | 0 |
Resposta
use std::io;
fn main() {
println!("Insira sua nota (0 a 10):");
let mut entrada: String = String::new();
io::stdin()
.read_line(&mut entrada)
.expect("Erro na leitura da entrada!");
let nota: u8 = match entrada.trim().parse() {
Ok(valor) => valor,
Err(_) => {
println!("Erro: O dado inserido não é um número válido!");
return;
}
};
match nota {
9 | 10 => println!("Sua nota é: '{}' = 'A'", nota),
7 | 8 => println!("Sua nota é: '{}' = 'B'", nota),
5 | 6 => println!("Sua nota é: '{}' = 'C'", nota),
3 | 4 => println!("Sua nota é: '{}' = 'D'", nota),
1 | 2 => println!("Sua nota é: '{}' = 'E'", nota),
0 => println!("Sua nota é: '{}' = 'F'", nota),
_ => println!("A nota '{}' fornecida não é válida (fora do intervalo 0-10)!", nota),
};
}
03 - Insira uma idade e classifique-a como:
| Idade | Classificação |
|---|---|
| 0 - 12 | Criança |
| 13 - 17 | Adolescente |
| 18 - 59 | Adulto |
| +60 | Idoso |
Resposta
use std::io;
fn main() {
println!("Insira sua idade:");
let mut entrada: String = String::new();
io::stdin()
.read_line(&mut entrada)
.expect("Erro na leitura da entrada!");
let idade: u8 = match entrada.trim().parse() {
Ok(valor) => valor,
Err(_) => {
println!("Erro: O dado inserido não é um número válido!");
return;
}
};
match idade {
0..=12 => println!("Criança!"),
13..=17 => println!("Adolescente!"),
18..=59 => println!("Adulto!"),
60..=120 => println!("Idoso!"),
_ => println!("Idade fora do limite de análise!"),
};
}
04 - Receba nome de usuário e senha. Use o pareamento de tuplas (tuple matching) para validar:
| Entrada | Resultado |
|---|---|
| (“admin”, “1234”) | Admin logado |
| (“user”, “pass”) | User logado |
| _ | Invalid credentials |
Resposta
use std::io;
fn main() {
println!("Insira usuário:");
let mut login = String::new();
io::stdin()
.read_line(&mut login)
.expect("Erro na inserção de dados!");
println!("Insira senha:");
let mut password = String::new();
io::stdin()
.read_line(&mut password)
.expect("Erro na inserção de dados!");
let data: (&str, &str) = (login.trim(), password.trim());
match data {
("admin", "1234") => println!("\nAdmin logado!"),
("user", "pass") => println!("\nUsuário logado!"),
_ => println!("\nCredenciais inválidas!"),
};
}
05 - Receba uma temperatura em Celsius e a classifique:
| Faixa | Classificação |
|---|---|
| Abaixo - 0 | Congelante |
| 0 - 15 | Frio |
| 16 - 25 | Agradável |
| 26 - 35 | Quente |
| Acima - 35 | Muito Quente |
Resposta
use std::io;
fn main() {
println!("Insira a temperatura:");
let mut entrada: String = String::new();
io::stdin()
.read_line(&mut entrada)
.expect("Erro na inserção de dados!");
let temperatura: f32 = match entrada.trim().parse() {
Ok(valor) => valor,
Err(_) => {
println!("Erro na conversão de dados!");
return;
}
};
match temperatura {
f32::MIN..=-1.0 => println!("Congelante"),
0.0..=15.0 => println!("Frio"),
16.0..=25.0 => println!("Agradável"),
26.0..=35.0 => println!("Quente"),
_ => println!("Muito Quente"),
};
}
06 - Receba um número de 1 a 7 e imprima o dia da semana correspondente.
| Número | Dia da Semana |
|---|---|
| 1 | Domingo |
| 2 | Segunda-feira |
| 3 | Terça-feira |
| 4 | Quarta-feira |
| 5 | Quinta-feira |
| 6 | Sexta-feira |
| 7 | Sábado |
Resposta
use std::io;
fn main() {
println!("Insira o número");
let mut entrada: String = String::new();
io::stdin()
.read_line(&mut entrada)
.expect("Erro na inserção de dados!");
let numero: u8 = match entrada.trim().parse() {
Ok(valor) => valor,
Err(_) => {
println!("Erro na conversão de dados!");
return;
}
};
match numero {
1 => println!("Domingo"),
2 => println!("Segunda-feira"),
3 => println!("Terça-feira"),
4 => println!("Quarta-feira"),
5 => println!("Quinta-feira"),
6 => println!("Sexta-feira"),
7 => println!("Sábado"),
_ => println!("Insira um valor válido!"),
}
}
07 - Receba o número do mês (1-12) e retorne:
- Nome do mês
- Quantos dias ele tem (considere Fevereiro com 28)
Resposta
use std::io;
fn main() {
println!("Insira o número");
let mut entrada: String = String::new();
io::stdin()
.read_line(&mut entrada)
.expect("Erro na inserção de dados!");
let numero:u8 = match entrada.trim().parse() {
Ok(valor) => valor,
Err(_) => {
println!("Erro na conversão de dados!");
return;
}
};
match numero {
1 => println!("Janeiro - 31 Dias"),
2 => println!("Fevereiro - 28 Dias"),
3 => println!("Março - 31 Dias"),
4 => println!("Abril - 30 Dias"),
5 => println!("Maio - 31 Dias"),
6 => println!("Junho - 30 Dias"),
7 => println!("Julho - 31 Dias"),
8 => println!("Agosto - 31 Dias"),
9 => println!("Setembro - 30 Dias"),
10 => println!("Outubro - 31 Dias"),
11 => println!("Novembro - 30 Dias"),
12 => println!("Dezembro - 31 Dias"),
_ => println!("Insira um valor válido!"),
}
}
08 - Receba um caractere e classifique-o usando match:
| Tipo | Faixa |
|---|---|
| 0 - 9 | Dígito |
| a - z | Letra |
| A - Z | Letra |
| ‘ ’ | Espaço |
| _ | Símbolo Especial |
Resposta
use std::io;
fn main() {
println!("Insira um caractere:");
let mut input = String::new();
io::stdin()
.read_line(&mut input)
.expect("Erro na inserção de dados!");
let ch: char = input.chars().next().unwrap();
match ch {
'0'..='9' => println!("Número: 0-9!"),
'a'..='z' | 'A'..='Z' => println!("Letra: aA - zZ!"),
' ' => println!("Espaço!"),
_ => println!("Símbolo especial!"),
}
}
09 - Receba coordenadas (x, y) e indique em qual quadrante elas estão:
| Coordenada | Quadrante |
|---|---|
| (0, 0) | Origem |
| (positivo, positivo) | Quadrante I |
| (negativo, positivo) | Quadrante II |
| (negativo, negativo) | Quadrante III |
| (positivo, negativo) | Quadrante IV |
Resposta
use std::io;
fn main() {
println!("Insira a coordenada (x):");
let mut entrada_x = String::new();
io::stdin()
.read_line(&mut entrada_x)
.expect("Erro na inserção de dados!");
let coordenada_x: i16 = match entrada_x.trim().parse() {
Ok(valor) => valor,
Err(_) => {
println!("Erro na conversão de dados!");
return;
}
};
println!("Insira a coordenada (y):");
let mut entrada_y = String::new();
io::stdin()
.read_line(&mut entrada_y)
.expect("Erro na inserção de dados!");
let coordenada_y: i16 = match entrada_y.trim().parse() {
Ok(valor) => valor,
Err(_) => {
println!("Erro na conversão de dados!");
return;
}
};
match (coordenada_x, coordenada_y) {
(0, 0) => println!("Origem"),
(x, y) if x > 0 && y > 0 => println!("Quadrante I"),
(x, y) if x < 0 && y > 0 => println!("Quadrante II"),
(x, y) if x < 0 && y < 0 => println!("Quadrante III"),
(x, y) if x > 0 && y < 0 => println!("Quadrante IV"),
_ => println!("Sobre o eixo!"),
};
}
10 - Receba a quantidade de itens comprados e o tipo de cliente (‘N’ = Normal, ‘V’ = VIP):
- Use match com tuplas (tipo, quantidade)
- VIP: 20% de desconto sempre
- Normal: 10% se comprar 10+ itens, 5% se 5-9 itens, sem desconto se menos
Resposta
use std::{io, u8};
fn main() {
println!("Insira o tipo (V ou N):");
let mut entrada_tipo: String = String::new();
io::stdin()
.read_line(&mut entrada_tipo)
.expect("Erro na inserção de dados!");
let tipo: char = entrada_tipo.chars().next().unwrap();
println!("Insira a quantidade:");
let mut entrada_quantidade: String = String::new();
io::stdin()
.read_line(&mut entrada_quantidade)
.expect("Erro na inserção de dados!");
let quantidade: u8 = match entrada_quantidade.trim().parse() {
Ok(valor) => valor,
Err(_) => {
println!("Erro na conversão de dados!");
return;
}
};
match (tipo, quantidade) {
('V' | 'v', u8::MIN..=u8::MAX) => println!("20% de desconto sempre!"),
('N' | 'n', 10..=u8::MAX) => println!("10% de desconto!"),
('N' | 'n', 5..=9) => println!("5% de desconto!"),
_ => println!("Sem desconto!"),
};
}
11 - Crie uma calculadora que recebe dois números e um operador (+, -, *, /) e retorna o resultado usando match para o operador.
Resposta
use std::io;
fn main() {
println!("Insira o número (A):");
let mut entrada_a: String = String::new();
io::stdin()
.read_line(&mut entrada_a)
.expect("Erro na inserção de dados!");
let numero_a: f32 = match entrada_a.trim().parse() {
Ok(valor) => valor,
Err(_) => {
println!("Erro na conversão de dados!");
return;
}
};
println!("Insira o número (B):");
let mut entrada_b: String = String::new();
io::stdin()
.read_line(&mut entrada_b)
.expect("Erro na inserção de dados!");
let numero_b: f32 = match entrada_b.trim().parse() {
Ok(valor) => valor,
Err(_) => {
println!("Erro na conversão de dados!");
return;
}
};
println!("Insira o operador: +, -, *, /");
let mut entrada_operador: String = String::new();
io::stdin()
.read_line(&mut entrada_operador)
.expect("Erro na inserção de dados!");
let operador: char = entrada_operador.trim().chars().next().unwrap();
let _resultado = match operador {
'+' => println!("\n{} + {} = {}", numero_a, numero_b, numero_a + numero_b),
'-' => println!("\n{} - {} = {}", numero_a, numero_b, numero_a - numero_b),
'*' => println!("\n{} * {} = {}", numero_a, numero_b, numero_a * numero_b),
'/' => println!("\n{} / {} = {}", numero_a, numero_b, numero_a / numero_b),
_ => println!("\nErro de cálculo!"),
};
}
12 - Receba as escolhas de dois jogadores (1 = Pedra, 2 = Papel, 3 = Tesoura) e determine o vencedor usando pareamento de tuplas (tuple matching): match(jogador1, jogador2) { … }
Resposta
use std::io;
fn main() {
println!("-- Início do Jogo --");
println!("");
println!("Selecione:");
println!("[1] Pedra");
println!("[2] Papel");
println!("[3] Tesoura");
println!("");
println!("Jogador 1:");
let mut entrada_jogador1: String = String::new();
io::stdin()
.read_line(&mut entrada_jogador1)
.expect("Erro na inserção de dados!");
let escolha_jogador1: u8 = match entrada_jogador1.trim().parse() {
Ok(valor) => valor,
Err(_) => {
println!("Erro na conversão de dados!");
return;
}
};
println!("\nJogador 2:");
let mut entrada_jogador2: String = String::new();
io::stdin()
.read_line(&mut entrada_jogador2)
.expect("Erro na inserção de dados!");
let escolha_jogador2: u8 = match entrada_jogador2.trim().parse() {
Ok(valor) => valor,
Err(_) => {
println!("Erro na conversão de dados!");
return;
}
};
let _resultado = match (escolha_jogador1, escolha_jogador2) {
(1, 1) => println!("Jogo empatado!"),
(1, 2) => println!("Jogador 2 - Vence!"),
(1, 3) => println!("Jogador 1 - Vence!"),
(2, 1) => println!("Jogador 1 - Vence!"),
(2, 2) => println!("Jogo empatado!"),
(2, 3) => println!("Jogador 2 - Vence!"),
(3, 1) => println!("Jogador 2 - Vence!"),
(3, 2) => println!("Jogador 1 - Vence!"),
(3, 3) => println!("Jogo empatado!"),
_ => println!("Erro ao processar jogo!"),
};
}