Prévia do material em texto
<p>DOMINANDO RUST:</p><p>100+ Exercícios Resolvidos e Comentados para</p><p>Acelerar seu Aprendizado</p><p>Ruhan Avila da Conceição</p><p>Prefácio</p><p>Seja bem-vindo a este livro onde são apresentados exercícios resolvidos e comentados de</p><p>Rust. Neste livro, você encontrará uma coleção de mais de 100 exercícios elaborados para</p><p>ajudá-lo a aprimorar suas habilidades de programação nessa poderosa linguagem.</p><p>Aprender a programar envolve não apenas a compreensão dos conceitos teóricos, mas</p><p>também a aplicação prática desses conceitos em situações reais. É exatamente isso que você</p><p>encontrará neste livro: uma ampla variedade de problemas que abrangem desde os fundamentos</p><p>básicos até desafios mais complexos.</p><p>Cada exercício é acompanhado de uma solução completa e detalhada, que não apenas</p><p>apresenta o código-fonte, mas também explica o raciocínio por trás da abordagem adotada. Esses</p><p>comentários comentam conceitos importantes, fornecem dicas valiosas e ajudam a entender</p><p>como a lógica de programação pode ser aplicada de maneira eficiente na resolução de problemas.</p><p>À medida que você avança pelos exercícios, será desafiado a lidar com questões de</p><p>manipulação de fórmulas matemáticas, strings, condicionais, laços de repetição, manipulação de</p><p>vetores, matrizes e muito mais.</p><p>O objetivo principal deste livro é fornecer um recurso prático e abrangente para</p><p>programadores em busca de aprimoramento. Seja você um iniciante em Rust procurando</p><p>consolidar seus conhecimentos, ou um programador experiente desejando aprofundar sua</p><p>expertise, esses exercícios servirão como um excelente guia de estudo e referência. Esse livro</p><p>também é indicado para professores que desejariam possuir um material rico de exercícios de</p><p>Lógica de Programação resolvidos para elaborar exercícios e questões aos seus alunos.</p><p>Em diversas questões, são apresentadas mais de uma solução para o mesmo problema</p><p>proposto, envolvendo estratégias e técnicas distintas.</p><p>Aproveite esta jornada de aprendizado e aventure-se pelos exercícios resolvidos e comentados</p><p>de Rust. Prepare-se para desafios estimulantes, soluções criativas e uma oportunidade única de</p><p>aprimorar suas habilidades de programação.</p><p>Este livro foi escrito utilizando ferramentas de inteligência artificial na elaboração do</p><p>conteúdo, porém todo material foi revisado e editado pelo autor, a fim de entregar um produto</p><p>final de alta qualidade.</p><p>Boa leitura, bons estudos e divirta-se explorando o mundo fascinante da programação em</p><p>Rust!</p><p>Ruhan Avila da Conceição.</p><p>Sumário</p><p>Introdução ao Rust</p><p>Introdução aos Exercícios</p><p>Fórmulas Matemáticas</p><p>Condicionais</p><p>Laços de Repetição</p><p>Vetores</p><p>Strings</p><p>Matrizes</p><p>Funções Recursivas</p><p>Exercícios Extras</p><p>Lista Completa de Exercícios</p><p>Conteúdo Adicional</p><p>Sobre o Autor</p><p>Introdução ao Rust</p><p>Rust é uma linguagem de programação moderna, de propósito geral e de baixo nível,</p><p>projetada para ser segura, concorrente e prática. Ela foi desenvolvida pela Mozilla Research e</p><p>lançada em 2010 como um projeto de código aberto. O objetivo principal do Rust é fornecer um</p><p>ambiente de programação que combine alta performance e controle de baixo nível com</p><p>segurança de memória e concorrência livre de erros.</p><p>Aqui estão algumas características e pontos-chave do Rust:</p><p>Segurança de memória</p><p>Uma das principais inovações do Rust é o conceito de "ownership", que permite ao</p><p>compilador garantir em tempo de compilação a ausência de erros de acesso à memória, como</p><p>null pointers, buffer overflows e data races. Essa abordagem elimina muitos dos problemas</p><p>comuns de segurança e estabilidade encontrados em outras linguagens de programação.</p><p>Concorrência</p><p>Rust fornece suporte nativo para programação concorrente e paralela, permitindo que você</p><p>crie aplicativos eficientes e seguros que aproveitem plenamente o poder dos sistemas multi-core.</p><p>Os conceitos de "ownership" e "lifetimes" ajudam a evitar problemas comuns de concorrência,</p><p>como race conditions.</p><p>Eficiência e desempenho</p><p>Rust é projetada para oferecer um desempenho semelhante ao de linguagens de baixo nível,</p><p>como C e C++, ao mesmo tempo em que fornece recursos modernos de alto nível. A linguagem</p><p>foi projetada para permitir o controle fino sobre o uso de recursos, como memória e CPU, sem</p><p>sacrificar a segurança.</p><p>Expressividade</p><p>Rust possui uma sintaxe concisa e expressiva, facilitando a escrita de código claro e legível.</p><p>Ela oferece recursos avançados, como closures, traits e padrões de casamento, que permitem</p><p>escrever código conciso e flexível.</p><p>Ecossistema forte</p><p>Rust possui um ecossistema em rápido crescimento, com uma comunidade ativa e bibliotecas</p><p>de alta qualidade disponíveis por meio do gerenciador de pacotes Cargo. Há uma variedade de</p><p>frameworks e ferramentas para desenvolvimento web, sistemas embarcados, desenvolvimento de</p><p>jogos e muito mais.</p><p>Rust tem ganhado popularidade entre desenvolvedores que buscam um equilíbrio entre alto</p><p>desempenho e segurança, especialmente para sistemas de software críticos e aplicativos de alto</p><p>rendimento. Sua combinação única de segurança, concorrência e eficiência faz dela uma</p><p>linguagem poderosa e promissora para uma variedade de casos de uso.</p><p>Aplicações</p><p>A linguagem Rust tem uma ampla gama de aplicações e é usada em diversos domínios de</p><p>desenvolvimento de software. Aqui estão algumas das principais áreas onde a linguagem Rust é</p><p>aplicada:</p><p>Desenvolvimento de sistemas operacionais</p><p>Devido à sua segurança de memória e controle de baixo nível, Rust é uma escolha popular</p><p>para o desenvolvimento de sistemas operacionais e kernels. Projetos como o Redox OS e o Tock</p><p>OS são exemplos de sistemas operacionais escritos em Rust.</p><p>Desenvolvimento de infraestrutura de rede</p><p>Rust é usado para desenvolver software de rede de alto desempenho, como servidores de</p><p>proxy, roteadores e balanceadores de carga. O projeto Cloudflare, por exemplo, utiliza Rust para</p><p>construir partes críticas de sua infraestrutura.</p><p>Desenvolvimento de sistemas embarcados</p><p>Devido à sua eficiência e controle de baixo nível, Rust é uma escolha popular para o</p><p>desenvolvimento de sistemas embarcados, como dispositivos IoT (Internet das Coisas),</p><p>microcontroladores e sistemas de tempo real. O framework Rust Embedded fornece suporte</p><p>específico para esse tipo de desenvolvimento.</p><p>Desenvolvimento de ferramentas de segurança</p><p>A segurança é uma prioridade no Rust, tornando-o uma escolha natural para o</p><p>desenvolvimento de ferramentas relacionadas à segurança, como análise estática de código,</p><p>ferramentas de verificação de segurança e criptografia.</p><p>Desenvolvimento Web e servidores</p><p>Rust é cada vez mais utilizado no desenvolvimento de aplicativos Web e servidores de alto</p><p>desempenho. Frameworks populares como Rocket, Actix e Warp permitem criar aplicações Web</p><p>robustas e escaláveis com Rust.</p><p>Desenvolvimento de jogos</p><p>Rust também é utilizado no desenvolvimento de jogos, seja para programação de baixo nível,</p><p>engines de jogos ou até mesmo para criação de jogos completos. A biblioteca Amethyst é um</p><p>exemplo de engine de jogos escrita em Rust.</p><p>Essas são apenas algumas das muitas aplicações da linguagem Rust. Sua combinação de</p><p>segurança, desempenho e controle de baixo nível a torna uma escolha versátil para uma</p><p>variedade de domínios de desenvolvimento de software.</p><p>Instalando o Setup</p><p>Para começar a programar em Rust, você precisa baixar algumas ferramentas essenciais. Aqui</p><p>estão os principais componentes que você precisará:</p><p>Rustup</p><p>Rustup é um gerenciador de versões do Rust que permite instalar e gerenciar facilmente</p><p>diferentes versões do compilador Rust. Ele também inclui o Cargo, que é o gerenciador de</p><p>pacotes e build system padrão do Rust.</p><p>Para sistemas Unix/Linux/macOS, você pode instalar o Rustup executando o seguinte</p><p>comando no terminal:</p><p>curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh</p><p>Para o Windows, você pode baixar o instalador do Rustup no site oficial: https://www.rust-</p><p>lang.org/tools/install</p><p>Editor de código-fonte</p><p>Recomendo utilizar o Visual Studio Code (VSCode), por ser um editor de código-fonte leve e</p><p>altamente popular e que possui excelente suporte para a linguagem Rust.</p><p>espaço em branco no início ou no final da string, e o método</p><p>parse() para fazer a conversão. Se a conversão falhar, o programa exibirá a mensagem "Entrada</p><p>inválida".</p><p>Repetimos os passos anteriores para solicitar e armazenar a segunda e terceira nota nas</p><p>variáveis nota2 e nota3.</p><p>Calculamos a média das notas somando as três notas e dividindo o resultado por 3.0.</p><p>Utilizando uma estrutura de controle if, else if e else, verificamos o resultado com base na</p><p>média:</p><p>- Se a média for maior ou igual a 7.0, exibimos a mensagem "Aprovado!".</p><p>- Se a média for menor que 4.0, exibimos a mensagem "Reprovado!".</p><p>- Caso contrário, exibimos a mensagem "Recuperação!".</p><p>O programa termina sua execução.</p><p>31. Faça um programa que solicite o nome de um dia da semana e exiba se é</p><p>um dia útil (segunda a sexta-feira) ou um dia de fim de semana (sábado e</p><p>domingo).</p><p>Importamos o módulo io do crate std, que nos permite interagir com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Usamos a função println!() para exibir a mensagem "Digite o nome de um dia da semana:" e,</p><p>em seguida, usamos a função io::stdin().read_line() para ler a entrada do usuário e armazená-la</p><p>na variável input_dia. A função expect() é usada para lidar com possíveis erros na leitura da</p><p>linha.</p><p>Utilizamos o método trim() para remover qualquer espaço em branco no início ou no final da</p><p>string e o método to_lowercase() para converter o nome do dia para letras minúsculas.</p><p>Utilizando uma estrutura de controle if, else if e else, verificamos se o dia é um dia útil ou um</p><p>dia de fim de semana:</p><p>Se o dia for "segunda", "terça", "quarta", "quinta" ou "sexta", exibimos a mensagem "É um</p><p>dia útil!".</p><p>Se o dia for "sábado" ou "domingo", exibimos a mensagem "É um dia de fim de semana!".</p><p>Caso contrário, exibimos a mensagem "Dia inválido!".</p><p>32. Escreva um programa que solicite a altura e o peso de uma pessoa e calcule</p><p>o seu índice de massa corporal (IMC), exibindo a categoria correspondente</p><p>(abaixo do peso, peso normal, sobrepeso, obesidade, obesidade grave).</p><p>Utilizamos os passos conforme os exercícios anteriores para realizar a leitura das variáveis</p><p>peso e altura.</p><p>Calculamos o IMC dividindo o peso pela altura ao quadrado.</p><p>Utilizando uma expressão if e else if, determinamos a categoria do IMC com base nos</p><p>seguintes valores:</p><p>- Se o IMC for menor que 18.5, a categoria é "Abaixo do peso".</p><p>- Se o IMC estiver entre 18.5 e 24.9, inclusive, a categoria é "Peso normal".</p><p>- Se o IMC estiver entre 25.0 e 29.9, inclusive, a categoria é "Sobrepeso".</p><p>- Se o IMC estiver entre 30.0 e 34.9, inclusive, a categoria é "Obesidade".</p><p>- Caso contrário, a categoria é "Obesidade grave".</p><p>Exibimos o resultado na tela utilizando a função println!(). O valor do IMC, formatado com</p><p>uma casa decimal, e a categoria são exibidos na mensagem.</p><p>33. Escreva um programa que solicite um número inteiro e verifique se é</p><p>divisível por 3 e por 5 ao mesmo tempo.</p><p>Utilizamos os passos conforme os exercícios anteriores para realizar a leitura da variável</p><p>input_numero.</p><p>Utilizando uma estrutura de controle if e else, verificamos se o número é divisível por 3 e por</p><p>5 ao mesmo tempo, verificando se o resto da divisão por 3 e por 5 é igual a zero.</p><p>Se a condição for verdadeira, exibimos a mensagem "O número é divisível por 3 e por 5 ao</p><p>mesmo tempo.". Caso contrário, exibimos a mensagem "O número não é divisível por 3 e por 5</p><p>ao mesmo tempo.".</p><p>O programa termina sua execução.</p><p>34. Crie um programa que solicite a idade de uma pessoa e exiba se ela é</p><p>criança (0-12 anos), adolescente (13-17 anos), adulto (18-59 anos) ou idoso (60</p><p>anos ou mais).</p><p>Utilizando uma expressão if e else if, verificamos a faixa etária com base na idade fornecida:</p><p>- Se a idade for menor ou igual a 12, a pessoa é uma criança.</p><p>- Se a idade estiver entre 13 e 17, inclusive, a pessoa é um adolescente.</p><p>- Se a idade estiver entre 18 e 59, inclusive, a pessoa é um adulto.</p><p>- Caso contrário, a pessoa é um idoso.</p><p>Exibimos o resultado na tela utilizando a função println!(). A faixa etária correspondente é</p><p>exibida na mensagem.</p><p>35. Faça um programa que solicite dois números e exiba se o primeiro é</p><p>divisível pelo segundo.</p><p>Utilizando uma estrutura de controle if e else, verificamos se o primeiro número é divisível</p><p>pelo segundo, verificando se o resto da divisão (%) é igual a zero.</p><p>Se a condição for verdadeira, exibimos a mensagem "O primeiro número é divisível pelo</p><p>segundo.". Caso contrário, exibimos a mensagem "O primeiro número não é divisível pelo</p><p>segundo.".</p><p>Laços de Repetição</p><p>Em Rust, existem três principais estruturas de controle de repetição: loop, while e for. Cada</p><p>uma delas é adequada para diferentes situações. Vamos ver como cada uma funciona:</p><p>loop</p><p>O laço loop cria um loop infinito, onde o bloco de código é repetido continuamente até que</p><p>seja interrompido explicitamente usando a instrução break. Exemplo:</p><p>while</p><p>O laço while executa um bloco de código repetidamente enquanto uma condição especificada</p><p>for verdadeira. Exemplo:</p><p>for</p><p>O laço for é usado para iterar sobre uma sequência, como um intervalo ou uma coleção,</p><p>executando um bloco de código para cada elemento. Exemplo:</p><p>Também é possível usar o for com um intervalo usando a sintaxe for variavel in inicio..fim,</p><p>onde inicio é o valor inicial e fim é o valor final (exclusivo). Por exemplo:</p><p>36. Escreva um programa que exiba os números de 1 a 10 utilizando um laço de</p><p>repetição</p><p>Utilizando while</p><p>Definimos a função main() como ponto de entrada do programa. Inicializamos a variável</p><p>numero com o valor 1, que será o primeiro número a ser exibido.</p><p>Utilizamos um laço de repetição while para repetir o bloco de código enquanto a condição</p><p>numero</p><p>divisão entre numero e 2. Se o resto for igual a 0, significa que o</p><p>número é par.</p><p>Se o número for par, utilizamos a função println!() para exibi-lo na tela.</p><p>O laço de repetição continua a executar até que todos os números de 1 a 100 sejam</p><p>verificados.</p><p>O programa termina sua execução após exibir todos os números pares de 1 a 100.</p><p>Solução 2</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Utilizamos um laço de repetição for com a função step_by() para percorrer os números de 2 a</p><p>100 com um passo de 2.</p><p>Na declaração (2..=100).step_by(2), a expressão 2..=100 define um intervalo inclusivo de 2 a</p><p>100. Em seguida, o método step_by(2) é usado para especificar que queremos que o passo seja de</p><p>2, ou seja, iremos pular de 2 em 2 durante as iterações.</p><p>A cada iteração, o número atual é exibido na tela usando a função println!().</p><p>O laço de repetição continua a executar até que todos os números pares de 1 a 100 sejam</p><p>exibidos.</p><p>O programa termina sua execução após exibir todos os números pares de 1 a 100.</p><p>Utilizando while</p><p>Definimos a função main() como ponto de entrada do programa. Inicializamos a variável</p><p>numero com o valor 2, que será o primeiro número par a ser exibido.</p><p>Utilizamos um laço de repetição while para repetir o bloco de código enquanto a condição</p><p>numero</p><p>utilizamos um segundo laço de repetição for aninhado para calcular e imprimir a</p><p>tabuada do número atual.</p><p>Na declaração for i in 1..=10, a expressão 1..=10 define um intervalo inclusivo de 1 a 10, ou</p><p>seja, o laço irá iterar pelos números de 1 a 10.</p><p>A cada iteração do segundo laço, multiplicamos o número atual pelo valor atual do laço i e</p><p>utilizamos a função println!() para imprimir a expressão "X x Y = Z", onde X é o número atual,</p><p>Y é o valor atual do segundo laço e Z é o resultado da multiplicação.</p><p>Após a tabuada de cada número, utilizamos a função println!() novamente para adicionar</p><p>uma linha em branco entre as tabuadas.</p><p>O programa termina sua execução após imprimir a tabuada de todos os números de 1 a 10.</p><p>42. Escreva um programa que solicite ao usuário um número N e exiba a soma</p><p>de todos os números de 1 a N.</p><p>Importamos o módulo io da biblioteca padrão para lidar com a entrada e saída. Definimos a</p><p>função main() como ponto de entrada do programa.</p><p>Utilizamos a função println!() para solicitar ao usuário um número.</p><p>Criamos uma variável input para armazenar a entrada do usuário.</p><p>Usamos a função read_line() para ler a entrada do usuário e armazená-la na variável input.</p><p>Utilizamos o método trim() para remover possíveis espaços em branco no início e no fim da</p><p>entrada.</p><p>Convertemos a entrada para o tipo u32 utilizando o método parse().</p><p>Criamos uma variável soma para armazenar a soma dos números de 1 a N.</p><p>Utilizamos um laço de repetição for para iterar pelos números de 1 a N.</p><p>Na declaração for numero in 1..=n, a expressão 1..=n define um intervalo inclusivo de 1 a N,</p><p>ou seja, o laço irá iterar pelos números de 1 a N.</p><p>A cada iteração, adicionamos o número atual à variável soma.</p><p>Após o laço de repetição, utilizamos a função println!() para exibir a mensagem "A soma dos</p><p>números de 1 a N é: " seguida do valor da soma.</p><p>O programa termina sua execução após exibir a soma dos números de 1 a N.</p><p>Utilizando while</p><p>Criamos uma variável soma para armazenar a soma dos números de 1 a N.</p><p>Criamos uma variável numero e inicializamos com 1 para representar o número atual.</p><p>Utilizamos um laço de repetição while para calcular a soma dos números de 1 a N.</p><p>Enquanto o número atual for menor ou igual a N, somamos o número à variável soma e</p><p>incrementamos o valor de numero em 1.</p><p>Após o laço de repetição, utilizamos a função println!() para exibir a mensagem "A soma dos</p><p>números de 1 a N é: " seguida do valor da soma.</p><p>O programa termina sua execução após exibir a soma dos números de 1 a N.</p><p>43. Faça um programa que calcule e exiba a soma dos números pares de 1 a 100</p><p>utilizando um laço de repetição.</p><p>Definimos a função main() como ponto de entrada do programa. Criamos uma variável soma</p><p>para armazenar a soma dos números pares.</p><p>Utilizamos um laço de repetição for para iterar pelos números de 1 a 100.</p><p>Na declaração for numero in 1..=100, a expressão 1..=100 define um intervalo inclusivo de 1</p><p>a 100, ou seja, o laço irá iterar pelos números de 1 a 100.</p><p>A cada iteração, verificamos se o número atual é par, fazendo o cálculo numero % 2 == 0. Se</p><p>o resto da divisão do número por 2 for igual a zero, significa que ele é par.</p><p>Se o número for par, adicionamos o número à variável soma.</p><p>Após o laço de repetição, utilizamos a função println!() para exibir a mensagem "A soma dos</p><p>números pares de 1 a 100 é: " seguida do valor da soma.</p><p>O programa termina sua execução após exibir a soma dos números pares de 1 a 100.</p><p>Utilizando step = 2</p><p>Utilizamos um laço de repetição for com o método step_by(2) para iterar pelos números de 2</p><p>a 100 com passo 2.</p><p>Na declaração (2..=100).step_by(2), o intervalo 2..=100 define um intervalo inclusivo de 2 a</p><p>100, e o método step_by(2) indica que o laço irá iterar com passo 2, ou seja, irá considerar</p><p>apenas os números pares.</p><p>A cada iteração, adicionamos o número atual à variável soma.</p><p>Após o laço de repetição, utilizamos a função println!() para exibir a mensagem "A soma dos</p><p>números pares de 1 a 100 (com passo 2) é: " seguida do valor da soma.</p><p>O programa termina sua execução após exibir a soma dos números pares de 1 a 100.</p><p>44. Escreva um programa que calcule e exiba o valor da potência de um</p><p>número informado pelo usuário elevado a um expoente também informado</p><p>pelo usuário, utilizando laços de repetição.</p><p>Importamos o módulo io da biblioteca padrão para lidar com a entrada e saída. Definimos a</p><p>função main() como ponto de entrada do programa.</p><p>Utilizamos a função println!() para solicitar ao usuário um número base.</p><p>Criamos uma variável input para armazenar a entrada do usuário.</p><p>Usamos a função read_line() para ler a entrada do usuário e armazená-la na variável input.</p><p>Utilizamos o método trim() para remover possíveis espaços em branco no início e no fim da</p><p>entrada.</p><p>Convertemos a entrada para o tipo u32 utilizando o método parse().</p><p>Solicitamos ao usuário um expoente da mesma forma que fizemos para o número base.</p><p>Criamos uma variável resultado para armazenar o resultado da potência.</p><p>Utilizamos um laço de repetição for para calcular a potência do número base elevado ao</p><p>expoente.</p><p>A cada iteração, multiplicamos o número base pelo valor atual do laço e atualizamos o valor</p><p>da variável resultado.</p><p>Após o laço de repetição, utilizamos a função println!() para exibir a mensagem "O resultado</p><p>de X elevado a Y é: " seguida do valor da potência.</p><p>O programa termina sua execução após exibir o resultado da potência.</p><p>45. Escreva um programa que solicite ao usuário um número N e diga se o</p><p>mesmo é primo ou não.</p><p>Lembre-se de que um número primo é aquele que é divisível apenas por 1 e por ele mesmo,</p><p>sem ter outros divisores.</p><p>Importamos o módulo io da biblioteca padrão para lidar com a entrada e saída. Definimos a</p><p>função main() como ponto de entrada do programa.</p><p>Utilizamos a função println!() para solicitar ao usuário um número.</p><p>Criamos uma variável input para armazenar a entrada do usuário.</p><p>Usamos a função read_line() para ler a entrada do usuário e armazená-la na variável input.</p><p>Utilizamos o método trim() para remover possíveis espaços em branco no início e no fim da</p><p>entrada.</p><p>Convertemos a entrada para o tipo u32 utilizando o método parse().</p><p>Criamos uma variável eh_primo para armazenar o resultado da verificação se o número é</p><p>primo.</p><p>Verificamos se o número é menor que 2. Se sim, não é primo e atualizamos a variável</p><p>eh_primo para false.</p><p>Caso contrário, utilizamos um laço de repetição for para verificar se o número é divisível por</p><p>algum número entre 2 e n-1.</p><p>Se encontrarmos um divisor, atualizamos a variável eh_primo para false e interrompemos o</p><p>laço utilizando a instrução break.</p><p>Após o laço de repetição, utilizamos a estrutura condicional if para exibir a mensagem</p><p>correspondente se o número é primo ou não.</p><p>O programa termina sua execução após exibir o resultado.</p><p>46. Escreva um programa que solicite ao usuário um número N e exiba todos os</p><p>números primos menores que N.</p><p>Definindo uma função para verificar se o número é primo</p><p>Importamos o módulo io da biblioteca padrão para lidar com a entrada e saída. Definimos a</p><p>função main() como ponto de entrada do programa.</p><p>Utilizamos a função println!() para solicitar ao usuário um número.</p><p>Criamos uma variável input para armazenar a entrada do usuário.</p><p>Usamos a função read_line() para ler a entrada do usuário e armazená-la na variável input.</p><p>Utilizamos o método trim() para remover possíveis espaços em branco no início e no fim da</p><p>entrada.</p><p>Convertemos a entrada para o tipo u32 utilizando o método parse().</p><p>Utilizamos um laço de repetição for para iterar pelos números de 2 até N-1.</p><p>A cada iteração, verificamos se o número atual é primo utilizando a função is_primo().</p><p>Se o número for primo, utilizamos a função println!() para exibi-lo.</p><p>A função is_primo() é definida abaixo da função main() e verifica se um número é primo.</p><p>Verificamos se o número é menor que 2. Se sim, não é primo e retornamos false.</p><p>Caso contrário, utilizamos um laço de repetição for para verificar se o número é divisível por</p><p>algum número entre 2 e a metade do número.</p><p>Se encontrarmos um divisor,</p><p>retornamos false.</p><p>Se não encontrarmos nenhum divisor, retornamos true.</p><p>O programa termina sua execução após exibir os números primos menores que N.</p><p>Sem definir uma função específica</p><p>Importamos o módulo io da biblioteca padrão para lidar com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Utilizamos a função println!() para solicitar ao usuário um número.</p><p>Criamos uma variável input para armazenar a entrada do usuário.</p><p>Usamos a função read_line() para ler a entrada do usuário e armazená-la na variável input.</p><p>Utilizamos o método trim() para remover possíveis espaços em branco no início e no fim da</p><p>entrada.</p><p>Convertemos a entrada para o tipo u32 utilizando o método parse().</p><p>Utilizamos um laço de repetição for para iterar pelos números de 2 até N-1.</p><p>A cada iteração, verificamos se o número atual é primo.</p><p>Criamos uma variável eh_primo e inicializamos como true.</p><p>Verificamos se o número é menor que 2. Se sim, não é primo e atualizamos eh_primo para</p><p>false.</p><p>Caso contrário, utilizamos um laço de repetição for para verificar se o número é divisível por</p><p>algum número entre 2 e a metade do número.</p><p>Se encontrarmos um divisor, atualizamos eh_primo para false e interrompemos o laço</p><p>utilizando a instrução break.</p><p>Após o laço de repetição, utilizamos a estrutura condicional if para exibir o número se ele for</p><p>primo.</p><p>O programa termina sua execução após exibir os números primos menores que N.</p><p>47. Crie um programa que exiba os primeiros N números primos, onde N é</p><p>informado pelo usuário, utilizando um laço de repetição.</p><p>Importamos o módulo io da biblioteca padrão para lidar com a entrada e saída. Definimos a</p><p>função main() como ponto de entrada do programa.</p><p>Utilizamos a função println!() para solicitar ao usuário um número N.</p><p>Criamos uma variável input para armazenar a entrada do usuário.</p><p>Usamos a função read_line() para ler a entrada do usuário e armazená-la na variável input.</p><p>Utilizamos o método trim() para remover possíveis espaços em branco no início e no fim da</p><p>entrada.</p><p>Convertemos a entrada para o tipo usize utilizando o método parse().</p><p>Utilizamos uma variável contador para contar o número de números primos encontrados e</p><p>uma variável numero para representar o número atual sendo verificado.</p><p>Utilizamos um laço de repetição while para encontrar e exibir os primeiros N números</p><p>primos.</p><p>Enquanto o contador for menor que N, verificamos se o número atual é primo.</p><p>Criamos uma variável eh_primo e inicializamos como true.</p><p>Verificamos se o número é menor que 2. Se sim, não é primo e atualizamos eh_primo para</p><p>false.</p><p>Caso contrário, utilizamos um laço de repetição for para verificar se o número é divisível por</p><p>algum número entre 2 e a raiz quadrada do número.</p><p>Se encontrarmos um divisor, atualizamos eh_primo para false e interrompemos o laço</p><p>utilizando a instrução break.</p><p>Após o laço de repetição, utilizamos a estrutura condicional if para exibir o número se ele for</p><p>primo.</p><p>Se o número for primo, exibimos-o na tela, incrementamos o contador e passamos para o</p><p>próximo número.</p><p>O programa termina sua execução após exibir os primeiros N números primos.</p><p>48. Crie um programa que exiba os primeiros N primeiros quadrados perfeitos,</p><p>onde N é informado pelo usuário, utilizando um laço de repetição.</p><p>Importamos o módulo io da biblioteca padrão para lidar com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Utilizamos a função println!() para solicitar ao usuário um número N.</p><p>Criamos uma variável input para armazenar a entrada do usuário.</p><p>Usamos a função read_line() para ler a entrada do usuário e armazená-la na variável input.</p><p>Utilizamos o método trim() para remover possíveis espaços em branco no início e no fim da</p><p>entrada.</p><p>Convertemos a entrada para o tipo usize utilizando o método parse().</p><p>Utilizamos uma variável contador para contar o número de quadrados perfeitos encontrados e</p><p>uma variável numero para representar o número atual sendo verificado.</p><p>Utilizamos um laço de repetição while para encontrar e exibir os primeiros N quadrados</p><p>perfeitos.</p><p>Enquanto o contador for menor que N, calculamos o quadrado do número atual utilizando a</p><p>multiplicação numero * numero.</p><p>Exibimos o quadrado perfeito na tela utilizando a função println!().</p><p>Incrementamos o contador e passamos para o próximo número.</p><p>O programa termina sua execução após exibir os primeiros N quadrados perfeitos.</p><p>49. Escreva um programa que solicite ao usuário dois números A e B e exiba</p><p>todos os números entre A e B.</p><p>Importamos o módulo io da biblioteca padrão para lidar com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Utilizamos a função println!() para solicitar ao usuário o número A.</p><p>Criamos uma variável input_a para armazenar a entrada do usuário.</p><p>Usamos a função read_line() para ler a entrada do usuário e armazená-la na variável input_a.</p><p>Utilizamos o método trim() para remover possíveis espaços em branco no início e no fim da</p><p>entrada.</p><p>Convertemos a entrada para o tipo i32 (inteiro de 32 bits) utilizando o método parse().</p><p>Repetimos os passos anteriores para solicitar o número B e armazená-lo na variável b.</p><p>Utilizamos a função println!() para exibir a mensagem "Números entre A e B:".</p><p>Verificamos se a é menor ou igual a b. Se for, utilizamos um laço for para exibir todos os</p><p>números entre a e b.</p><p>Caso contrário, a é maior que b, então utilizamos um laço for para exibir todos os números</p><p>entre b e a.</p><p>O programa termina sua execução após exibir todos os números entre A e B, independente da</p><p>ordem informada pelo usuário.</p><p>50. Escreva um programa que leia números do usuário até que seja digitado</p><p>um número negativo, e exiba a soma dos números positivos.</p><p>Importamos o módulo io da biblioteca padrão para lidar com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Criamos uma variável sum_positive para armazenar a soma dos números positivos.</p><p>Utilizamos um loop loop que continuará solicitando números ao usuário até que seja digitado</p><p>um número negativo.</p><p>Dentro do loop, solicitamos ao usuário que digite um número.</p><p>Utilizamos a função read_line() para ler a entrada do usuário e armazená-la na variável input.</p><p>Utilizamos a instrução match para tratar possíveis erros na conversão do número.</p><p>Se o número digitado for válido (conversão bem-sucedida), armazenamos o valor na variável</p><p>number.</p><p>Caso ocorra algum erro na conversão (por exemplo, entrada inválida), exibimos uma</p><p>mensagem de erro e continuamos o loop usando a instrução continue.</p><p>Verificamos se o número é negativo. Se for, encerramos o loop utilizando a instrução break.</p><p>Caso contrário, o número é positivo e adicionamos seu valor à variável sum_positive.</p><p>O loop continua até que um número negativo seja digitado.</p><p>Após o loop, exibimos a soma dos números positivos utilizando a função println!().</p><p>51. Faça um programa que solicite ao usuário um número e exiba a sequência</p><p>de Fibonacci até o número informado utilizando um laço de repetição.</p><p>Realizamos a leitura dos dados conforme exercícios anteriores.</p><p>Iniciamos a sequência de Fibonacci com a = 0 e b = 1.</p><p>Utilizamos um laço de repetição while para gerar a sequência de Fibonacci até que a seja</p><p>maior que o número informado pelo usuário.</p><p>Na primeira iteração do laço, exibimos o valor atual de a.</p><p>Calculamos o próximo número da sequência somando a e b e armazenamos em next.</p><p>Atualizamos a para o valor atual de b.</p><p>Atualizamos b para o valor calculado em next.</p><p>O laço continua gerando a sequência de Fibonacci até que a seja maior que o número</p><p>informado pelo usuário.</p><p>O programa exibe a sequência de Fibonacci até o número informado pelo usuário.</p><p>52. Escreva um programa que leia números do usuário até que seja digitado</p><p>zero, e exiba a média dos números digitados.</p><p>Importamos o módulo io da biblioteca padrão para lidar com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Criamos duas variáveis sum e count para armazenar, respectivamente, a soma dos números</p><p>digitados e a quantidade de números válidos digitados.</p><p>Utilizamos</p><p>um loop loop que continuará solicitando números ao usuário até que seja digitado</p><p>o número zero.</p><p>Dentro do loop, solicitamos ao usuário que digite um número.</p><p>Utilizamos a função read_line() para ler a entrada do usuário e armazená-la na variável input.</p><p>Utilizamos a instrução match para tratar possíveis erros na conversão do número.</p><p>Se o número digitado for válido (conversão bem-sucedida), armazenamos o valor na variável</p><p>number.</p><p>Caso ocorra algum erro na conversão (por exemplo, entrada inválida), exibimos uma</p><p>mensagem de erro e continuamos o loop usando a instrução continue.</p><p>Verificamos se o número é igual a zero. Se for, encerramos o loop utilizando a instrução</p><p>break.</p><p>Caso contrário, o número é diferente de zero, então adicionamos seu valor à variável sum e</p><p>incrementamos count para contar a quantidade de números válidos digitados.</p><p>O loop continua até que o número zero seja digitado.</p><p>Após o loop, verificamos se count é maior que zero para evitar divisão por zero.</p><p>Caso haja números válidos digitados, calculamos a média dos números utilizando a variável</p><p>sum como soma e count como quantidade de números.</p><p>Exibimos a média dos números digitados utilizando a função println!().</p><p>Caso não tenha sido digitado nenhum número válido (ou seja, count igual a zero), exibimos</p><p>uma mensagem informando que nenhum número válido foi digitado.</p><p>53. Escreva um programa que solicite ao usuário uma lista de números, até o</p><p>usuário digitar o número zero, e exiba o maior e o menor número da lista.</p><p>Importamos o módulo io da biblioteca padrão para lidar com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Criamos duas variáveis maior e menor para armazenar, respectivamente, o maior e o menor</p><p>número da lista digitada.</p><p>Inicializamos as variáveis maior com o menor valor possível (i32::MIN) e menor com o</p><p>maior valor possível (i32::MAX).</p><p>Utilizamos um loop loop que continuará solicitando números ao usuário até que seja digitado</p><p>o número zero.</p><p>Dentro do loop, solicitamos ao usuário que digite um número.</p><p>Utilizamos a função read_line() para ler a entrada do usuário e armazená-la na variável input.</p><p>Utilizamos a instrução match para tratar possíveis erros na conversão do número.</p><p>Se o número digitado for válido (conversão bem-sucedida), armazenamos o valor na variável</p><p>number.</p><p>Caso ocorra algum erro na conversão (por exemplo, entrada inválida), exibimos uma</p><p>mensagem de erro e continuamos o loop usando a instrução continue.</p><p>Verificamos se o número é igual a zero. Se for, encerramos o loop utilizando a instrução</p><p>break.</p><p>Caso contrário, o número é diferente de zero, então atualizamos as variáveis maior e menor</p><p>se necessário.</p><p>Se o número for maior que a variável maior, atualizamos maior com o valor do número.</p><p>Se o número for menor que a variável menor, atualizamos menor com o valor do número.</p><p>O loop continua até que o número zero seja digitado.</p><p>Após o loop, verificamos se os valores de maior e menor foram atualizados (ou seja,</p><p>diferentes dos valores iniciais).</p><p>Caso os valores tenham sido atualizados, exibimos o maior e o menor número utilizando a</p><p>função println!().</p><p>Caso não tenha sido digitado nenhum número válido (ou seja, maior e menor ainda possuem</p><p>os valores iniciais), exibimos uma mensagem informando que nenhum número válido foi</p><p>digitado.</p><p>54. Escreva um programa que solicite ao usuário uma frase e exiba a</p><p>quantidade de vogais na frase.</p><p>Importamos o módulo io da biblioteca padrão para lidar com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Utilizamos a função println!() para solicitar ao usuário que digite uma frase.</p><p>Criamos uma variável input para armazenar a entrada do usuário.</p><p>Usamos a função read_line() para ler a entrada do usuário e armazená-la na variável input.</p><p>Criamos uma variável vogais que contém todas as vogais em letras minúsculas e maiúsculas.</p><p>Criamos uma variável count_vogais para armazenar a quantidade de vogais na frase.</p><p>Utilizamos um loop for para iterar sobre os caracteres da frase, obtidos através do método</p><p>chars().</p><p>Para cada caractere, verificamos se ele está contido na string vogais utilizando o método</p><p>contains().</p><p>Se o caractere for uma vogal, incrementamos count_vogais em 1.</p><p>O loop continua até percorrer todos os caracteres da frase.</p><p>Após o loop, exibimos a quantidade de vogais na frase utilizando a função println!().</p><p>55. Escreva um programa que solicite ao usuário um número e exiba os seus</p><p>divisores.</p><p>Importamos o módulo io da biblioteca padrão para lidar com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Utilizamos a função println!() para solicitar ao usuário que digite um número.</p><p>Criamos uma variável input para armazenar a entrada do usuário.</p><p>Usamos a função read_line() para ler a entrada do usuário e armazená-la na variável input.</p><p>Utilizamos a instrução match para tratar possíveis erros na conversão do número.</p><p>Se o número digitado for válido (conversão bem-sucedida), armazenamos o valor na variável</p><p>number.</p><p>Caso ocorra algum erro na conversão (por exemplo, entrada inválida), exibimos uma</p><p>mensagem de erro e encerramos o programa usando a instrução return.</p><p>Utilizamos a função println!() para exibir a mensagem "Os divisores de N são:", onde N é o</p><p>número digitado pelo usuário.</p><p>Utilizamos um loop for para iterar de 1 até o número digitado pelo usuário (inclusive) com</p><p>1..=number.</p><p>Para cada valor divisor dentro do loop, verificamos se o número digitado é divisível por</p><p>divisor, ou seja, se number % divisor == 0.</p><p>Se a condição for verdadeira, então divisor é um divisor do número, e o exibimos usando a</p><p>função println!().</p><p>56. Faça um programa que determine o menor múltiplo comum (MMC) entre</p><p>dois números informados pelo usuário.</p><p>Primeiramente, importamos o módulo io da biblioteca padrão para lidar com a entrada e</p><p>saída.</p><p>Em seguida, definimos a função main() como ponto de entrada do programa.</p><p>Utilizamos a função println!() para exibir a mensagem "Digite o primeiro número:" e</p><p>solicitamos ao usuário que digite o primeiro número.</p><p>Criamos uma variável input1 do tipo String para armazenar a entrada do usuário referente ao</p><p>primeiro número.</p><p>Utilizamos a função read_line() para ler a entrada do usuário e armazená-la na variável</p><p>input1.</p><p>Utilizamos a instrução match para tratar possíveis erros na conversão do número digitado</p><p>pelo usuário para o tipo u32.</p><p>Se o número digitado for válido (conversão bem-sucedida), armazenamos o valor na variável</p><p>number1 do tipo u32.</p><p>Caso ocorra algum erro na conversão (por exemplo, entrada inválida), exibimos uma</p><p>mensagem de erro e encerramos o programa usando a instrução return.</p><p>Repetimos os passos anteriores para solicitar e obter o segundo número digitado pelo usuário,</p><p>armazenando-o na variável number2.</p><p>A partir desse ponto, começamos a calcular o MMC entre os dois números number1 e</p><p>number2.</p><p>Utilizamos a declaração de bloco {} para criar um escopo local e calcular o MMC dentro dele.</p><p>Dentro do bloco, inicializamos a variável result com o valor de number1. Essa variável</p><p>representa o resultado parcial do MMC.</p><p>Inicializamos também a variável multiple com o valor de number1. Essa variável é utilizada</p><p>para incrementar result e verificar se result é divisível por number2.</p><p>Utilizamos um loop while para incrementar a variável result pelo valor de multiple até que</p><p>result seja divisível por number2. Ou seja, enquanto a condição result % number2 != 0 for</p><p>verdadeira, o loop continua executando.</p><p>O loop incrementa o valor de result a cada iteração com o valor de multiple, simulando uma</p><p>multiplicação sucessiva de number1 até encontrar o menor múltiplo comum com number2.</p><p>Após sair do loop, o valor final de result será o MMC entre number1 e number2, e é</p><p>armazenado na variável mmc.</p><p>Utilizamos a função println!() para exibir a mensagem "O MMC entre N1 e N2 é: MMC",</p><p>onde N1 e N2 são os números digitados pelo usuário, e MMC é o resultado calculado.</p><p>57. Faça um programa que determine o máximo divisor comum (MDC) entre</p><p>dois números informados pelo usuário.</p><p>O programa</p><p>solicita ao usuário dois números, utilizando a mesma lógica explicada</p><p>anteriormente para validação das entradas.</p><p>Em seguida, os números digitados pelo usuário são armazenados nas variáveis number1 e</p><p>number2.</p><p>A partir desse ponto, o programa começa a calcular o MDC entre number1 e number2.</p><p>Utilizamos a variável num1 para armazenar o valor de number1 e num2 para armazenar o</p><p>valor de number2.</p><p>Utilizamos um loop while para calcular o MDC utilizando o algoritmo de Euclides. O loop</p><p>continua enquanto num2 for diferente de zero.</p><p>A cada iteração do loop, calculamos o resto da divisão entre num1 e num2, armazenando o</p><p>resultado em remainder.</p><p>Atribuímos o valor de num2 para num1 e o valor de remainder para num2, para</p><p>continuarmos a próxima iteração do loop utilizando os novos valores.</p><p>O loop repete esse processo até que num2 seja igual a zero.</p><p>Quando num2 for igual a zero, o MDC entre number1 e number2 estará armazenado em</p><p>num1.</p><p>Exibimos o resultado utilizando a função println!().</p><p>58. Faça um programa que calcule a série abaixo até o décimo elemento:</p><p>O programa começa solicitando ao usuário o valor de x, utilizando a mesma lógica explicada</p><p>anteriormente para validação da entrada.</p><p>O valor de x é armazenado na variável x, que é do tipo f64 (número de ponto flutuante de 64</p><p>bits).</p><p>Em seguida, inicializamos a variável result com 1.0 e a variável term (representando os</p><p>termos da série) também com 1.0.</p><p>Utilizamos um loop for para calcular a série de Taylor até o décimo elemento (n = 10).</p><p>Para cada valor de n de 1 a 10, multiplicamos o termo anterior (x / n) pelo valor de x e</p><p>dividimos pelo valor de n, atualizando o valor de term.</p><p>Em cada iteração, adicionamos o valor de term ao result.</p><p>Após o loop, o valor aproximado de ex estará armazenado em result.</p><p>Utilizamos a função println!() para exibir o resultado ao usuário.</p><p>59. Reescreva o código do exercício anterior até que a diferença entre os termos</p><p>seja inferior a 0,001.</p><p>Importamos o módulo io da biblioteca padrão para lidar com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Utilizamos a função println!() para exibir a mensagem "Digite o valor de x:" e solicitamos ao</p><p>usuário que digite o valor de x.</p><p>Criamos uma variável input do tipo String para armazenar a entrada do usuário referente ao</p><p>valor de x.</p><p>Usamos a função read_line() para ler a entrada do usuário e armazená-la na variável input.</p><p>Utilizamos a instrução match para tratar possíveis erros na conversão do número digitado</p><p>pelo usuário para o tipo f64 (número de ponto flutuante de 64 bits).</p><p>Se o número digitado for válido (conversão bem-sucedida), armazenamos o valor na variável</p><p>x.</p><p>Caso ocorra algum erro na conversão (por exemplo, entrada inválida), exibimos uma</p><p>mensagem de erro e encerramos o programa usando a instrução return.</p><p>Inicializamos as variáveis result, term e n. A variável result será utilizada para armazenar o</p><p>resultado da série de Taylor, term será utilizada para calcular os termos individuais da série, e n</p><p>será utilizada para contar o número de termos.</p><p>Utilizamos um loop while para calcular a série de Taylor até que a diferença entre os termos</p><p>seja inferior a 0,001.</p><p>Dentro do loop, multiplicamos o valor atual de term por x e dividimos pelo valor de n como</p><p>representado na série de Taylor. Isso atualiza o valor de term a cada iteração.</p><p>Adicionamos o valor de term ao result em cada iteração do loop, assim acumulando os</p><p>termos da série e obtendo uma aproximação para o valor de ex.</p><p>A cada iteração, incrementamos o valor de n para representar o próximo termo da série.</p><p>O loop continua até que a diferença entre os termos, dada pela função abs(), seja menor que</p><p>0,001. Isso é feito verificando a condição term.abs() > 0.001.</p><p>Após o loop, o valor aproximado de ex estará armazenado na variável result.</p><p>Utilizamos a função println!() para exibir o resultado da aproximação de ex ao usuário.</p><p>60. Faça um programa que calcule o valor de seno utilizando a série de Taylor</p><p>conforme equação abaixo o décimo termo:</p><p>Importamos o módulo io da biblioteca padrão para lidar com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Utilizamos a função println!() para exibir a mensagem "Digite o valor de x (em radianos):" e</p><p>solicitamos ao usuário que digite o valor de x em radianos.</p><p>Criamos uma variável input do tipo String para armazenar a entrada do usuário referente ao</p><p>valor de x.</p><p>Usamos a função read_line() para ler a entrada do usuário e armazená-la na variável input.</p><p>Utilizamos a instrução match para tratar possíveis erros na conversão do número digitado</p><p>pelo usuário para o tipo f64 (número de ponto flutuante de 64 bits).</p><p>Se o número digitado for válido (conversão bem-sucedida), armazenamos o valor na variável</p><p>x.</p><p>Caso ocorra algum erro na conversão (por exemplo, entrada inválida), exibimos uma</p><p>mensagem de erro e encerramos o programa usando a instrução return.</p><p>Inicializamos as variáveis result e term. A variável result será utilizada para armazenar o</p><p>resultado da série de Taylor e term será utilizada para calcular os termos individuais da série.</p><p>Utilizamos um loop for para calcular a série de Taylor até o décimo termo. Usamos n para</p><p>iterar de 1 até 10, considerando apenas os termos ímpares.</p><p>A cada iteração do loop, adicionamos o valor atual de term ao result, acumulando os termos</p><p>da série de Taylor.</p><p>Em seguida, atualizamos o valor de term multiplicando-o por -(x * x) e dividindo por ((n + 1)</p><p>* (n + 2)) para obter o próximo termo da série. Vale lembrar que somente os termos ímpares</p><p>contribuem para o cálculo do seno, os termos pares são sempre zero.</p><p>O loop continua até o décimo termo da série ser calculado.</p><p>Após o loop, o valor aproximado de sen(x) estará armazenado na variável result.</p><p>Utilizamos a função println!() para exibir o resultado da aproximação de sen(x) ao usuário.</p><p>Vetores</p><p>Em Rust, um vetor é uma coleção de elementos do mesmo tipo, com tamanho fixo durante</p><p>toda a sua vida útil. Os elementos do vetor são armazenados em uma sequência contígua na</p><p>memória, o que permite um acesso rápido e eficiente aos seus elementos. Para criar e trabalhar</p><p>com vetores em Rust, você precisa usar o tipo de dado Vec, onde T é o tipo dos elementos</p><p>do vetor. Aqui está como criar e manipular vetores em Rust:</p><p>Criando um vetor:</p><p>Adicionando elementos ao vetor:</p><p>Acessando elementos do vetor:</p><p>Tamanho e iteração do vetor:</p><p>Removendo elementos do vetor:</p><p>Lembre-se de que, se você precisar modificar o conteúdo do vetor, ele precisa ser declarado</p><p>como mut, para que as operações de modificação sejam permitidas. Caso contrário, o vetor será</p><p>imutável e você só poderá fazer leitura dos seus elementos.</p><p>61. Crie um programa que leia um vetor de números inteiros e exiba a soma de</p><p>todos os elementos.</p><p>Importamos o módulo io da biblioteca padrão para lidar com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Utilizamos a função println!() para exibir a mensagem "Digite a quantidade de números</p><p>(N):" e solicitamos ao usuário que digite a quantidade de números (N) que deseja informar.</p><p>Criamos uma variável n do tipo String para armazenar a entrada do usuário referente à</p><p>quantidade de números (N).</p><p>Usamos a função read_line() para ler a entrada do usuário e armazená-la na variável n.</p><p>Utilizamos o método trim() para remover espaços em branco extras no início e no final da</p><p>string.</p><p>Utilizamos o método parse() para converter a string n em um valor do tipo usize (número</p><p>inteiro sem sinal de 64 bits). Caso ocorra algum erro na conversão, uma mensagem de erro será</p><p>exibida.</p><p>O valor de n representará a quantidade de números que o usuário deseja informar.</p><p>Criamos um vetor vazio numbers: Vec que será usado para armazenar os números</p><p>inteiros informados pelo usuário.</p><p>Utilizamos um loop for i in 1..=n para iterar de 1 até o valor de n (inclusivo), permitindo que</p><p>o usuário digite os N números um por vez.</p><p>Em cada iteração do loop, utilizamos a função println!() para exibir a mensagem "Digite o {}º</p><p>número:", onde {}</p><p>será substituído pelo valor atual de i, representando a posição do número que o</p><p>usuário está digitando.</p><p>Criamos uma variável input do tipo String para armazenar a entrada do usuário referente ao</p><p>número.</p><p>Usamos a função read_line() novamente para ler a entrada do usuário e armazená-la na</p><p>variável input.</p><p>Utilizamos o método trim() para remover espaços em branco extras no início e no final da</p><p>string.</p><p>Utilizamos o método parse() para converter a string input em um valor do tipo i32 (número</p><p>inteiro de 32 bits). Caso ocorra algum erro na conversão, uma mensagem de erro será exibida.</p><p>O número digitado pelo usuário é armazenado na variável num.</p><p>Adicionamos o valor atual de num ao vetor numbers utilizando o método push().</p><p>O loop continuará até o usuário digitar todos os N números informados.</p><p>Após o loop, inicializamos a variável sum com o valor 0 para armazenar a soma dos</p><p>elementos do vetor.</p><p>Utilizamos um segundo loop for num in &numbers para percorrer cada elemento do vetor</p><p>numbers.</p><p>A cada iteração do segundo loop, adicionamos o valor atual de num à variável sum,</p><p>acumulando os elementos do vetor.</p><p>O segundo loop continuará até percorrer todos os elementos do vetor.</p><p>Após o segundo loop, o valor da variável sum será a soma de todos os elementos do vetor.</p><p>Utilizamos a função println!() para exibir a mensagem "A soma dos números é: " seguida do</p><p>valor da variável sum, que representa a soma de todos os números digitados pelo usuário.</p><p>Solução 2</p><p>Importamos o módulo io da biblioteca padrão para lidar com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Utilizamos a função println!() para exibir a mensagem "Digite os números separados por</p><p>espaço:" e solicitamos ao usuário que digite os números separados por espaço.</p><p>Criamos uma variável input do tipo String para armazenar a entrada do usuário referente aos</p><p>números.</p><p>Usamos a função read_line() para ler a entrada do usuário e armazená-la na variável input.</p><p>Utilizamos o método trim() para remover espaços em branco extras no início e no final da</p><p>string.</p><p>Usamos o método split_whitespace() para dividir a string em palavras (números) com base</p><p>nos espaços em branco.</p><p>Utilizamos o método map() em cada palavra (número) para convertê-la em um valor do tipo</p><p>i32 (número inteiro de 32 bits). Caso ocorra algum erro na conversão, uma mensagem de erro</p><p>será exibida.</p><p>Usamos o método collect() para coletar os números convertidos em um vetor de i32, que é</p><p>armazenado na variável numbers.</p><p>Utilizamos o método iter() no vetor numbers para criar um iterador que percorrerá os</p><p>elementos do vetor.</p><p>Usamos o método sum() no iterador para calcular a soma de todos os elementos do vetor e</p><p>armazenamos o resultado na variável sum.</p><p>Utilizamos a função println!() para exibir a mensagem "A soma dos números é: " seguida do</p><p>valor da variável sum, que representa a soma dos números digitados pelo usuário.</p><p>62. Faça um programa que leia um vetor de números inteiros e exiba o maior</p><p>elemento presente no vetor.</p><p>Importamos o módulo io da biblioteca padrão para lidar com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Utilizamos a função println!() para exibir a mensagem "Digite os números separados por</p><p>espaço:" e solicitamos ao usuário que digite os números separados por espaço.</p><p>Criamos uma variável input do tipo String para armazenar a entrada do usuário referente aos</p><p>números.</p><p>Usamos a função read_line() para ler a entrada do usuário e armazená-la na variável input.</p><p>Utilizamos o método trim() para remover espaços em branco extras no início e no final da</p><p>string.</p><p>Utilizamos o método split_whitespace() para dividir a string em palavras (números) com base</p><p>nos espaços em branco.</p><p>Utilizamos o método filter_map() para converter cada palavra (número) em um valor do tipo</p><p>i32 (número inteiro de 32 bits) e filtrar somente os números válidos (conversão bem-sucedida).</p><p>Utilizamos o método collect() para coletar os números válidos em um vetor numbers:</p><p>Vec.</p><p>Verificamos se o vetor numbers está vazio (ou seja, se nenhum número válido foi digitado).</p><p>Se estiver vazio, exibimos a mensagem "Nenhum número válido foi digitado."</p><p>Caso contrário, inicializamos a variável max_number com o primeiro elemento do vetor</p><p>numbers.</p><p>Utilizamos o primeiro laço for &num in &numbers para iterar sobre cada elemento do vetor</p><p>numbers.</p><p>Na iteração de cada elemento, verificamos se o número (num) é maior que o valor atual de</p><p>max_number. Se for, atualizamos o valor de max_number com o valor de num, armazenando</p><p>assim o maior número encontrado até o momento.</p><p>Ao final do primeiro laço, a variável max_number conterá o maior elemento presente no</p><p>vetor.</p><p>Utilizamos a função println!() para exibir a mensagem "O maior número é: " seguida do</p><p>valor da variável max_number, que representa o maior número presente no vetor.</p><p>63. Escreva um programa que leia um vetor de números inteiros e exiba a</p><p>média dos elementos.</p><p>Importamos o módulo io da biblioteca padrão para lidar com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Utilizamos a função println!() para exibir a mensagem "Digite os números separados por</p><p>espaço:" e solicitamos ao usuário que digite os números separados por espaço.</p><p>Criamos uma variável input do tipo String para armazenar a entrada do usuário referente aos</p><p>números.</p><p>Usamos a função read_line() para ler a entrada do usuário e armazená-la na variável input.</p><p>Utilizamos o método trim() para remover espaços em branco extras no início e no final da</p><p>string.</p><p>Utilizamos o método split_whitespace() para dividir a string em palavras (números) com base</p><p>nos espaços em branco.</p><p>Utilizamos o método filter_map() para converter cada palavra (número) em um valor do tipo</p><p>i32 (número inteiro de 32 bits) e filtrar somente os números válidos (conversão bem-sucedida).</p><p>Utilizamos o método collect() para coletar os números válidos em um vetor numbers:</p><p>Vec.</p><p>Verificamos se o vetor numbers está vazio (ou seja, se nenhum número válido foi digitado).</p><p>Se estiver vazio, exibimos a mensagem "Nenhum número válido foi digitado."</p><p>Caso contrário, utilizamos o método iter() no vetor numbers para criar um iterador que</p><p>percorrerá os elementos do vetor.</p><p>Utilizamos o método sum() no iterador para calcular a soma de todos os elementos do vetor e</p><p>armazenamos o resultado na variável sum.</p><p>Calculamos a média dos números dividindo a soma (sum) pelo número de elementos no vetor</p><p>(numbers.len()) e convertendo o resultado para o tipo f64 (número de ponto flutuante de 64</p><p>bits).</p><p>Utilizamos a função println!() para exibir a mensagem "A média dos números é: " seguida do</p><p>valor da variável average, que representa a média dos elementos do vetor.</p><p>64. Crie um programa que leia dois vetores de números inteiros com o mesmo</p><p>tamanho e exiba um novo vetor com a soma dos elementos correspondentes dos</p><p>dois vetores.</p><p>O programa inicia solicitando ao usuário que digite os números do primeiro vetor separados</p><p>por espaço.</p><p>A entrada do usuário é lida e armazenada na variável input1.</p><p>A variável input1 é processada para obter os números inteiros do primeiro vetor, que são</p><p>armazenados no vetor vec1.</p><p>O programa repete o mesmo processo para o segundo vetor, solicitando ao usuário que digite</p><p>os números separados por espaço e armazenando-os no vetor vec2.</p><p>O programa verifica se os vetores vec1 e vec2 têm o mesmo tamanho. Se os tamanhos forem</p><p>diferentes, exibe a mensagem de erro e retorna do programa.</p><p>Caso os vetores tenham o mesmo tamanho, é criado um novo vetor sum_vec vazio.</p><p>Utilizamos um laço for i in 0..vec1.len() para iterar sobre os índices dos vetores vec1 e vec2.</p><p>No laço, a soma dos elementos correspondentes vec1[i] + vec2[i] é calculada e adicionada ao</p><p>vetor sum_vec usando o método push().</p><p>Ao final do laço, o novo vetor sum_vec contém a soma dos elementos correspondentes de</p><p>vec1 e vec2.</p><p>Utilizamos a função println!() para exibir a mensagem "Novo vetor: " seguida do novo vetor</p><p>sum_vec que contém a soma dos elementos correspondentes de vec1 e vec2.</p><p>Utilizando a</p><p>função zip</p><p>Os passos iniciais são idênticos ao da solução anterior.</p><p>Caso os vetores tenham o mesmo tamanho, utilizamos o método iter() nos vetores vec1 e vec2</p><p>para criar dois iteradores que percorrerão os elementos dos vetores.</p><p>Utilizamos o método zip() para criar um iterador que agrupa os elementos correspondentes de</p><p>vec1 e vec2.</p><p>Utilizamos o método map() no iterador agrupado para somar os elementos correspondentes de</p><p>vec1 e vec2.</p><p>Utilizamos o método collect() para coletar os resultados da soma em um novo vetor sum_vec:</p><p>Vec.</p><p>65. Faça um programa que leia um vetor de números inteiros e verifique se ele</p><p>está em ordem crescente.</p><p>O programa inicia solicitando ao usuário que digite os números do vetor separados por</p><p>espaço.</p><p>A entrada do usuário é lida e armazenada na variável input.</p><p>A variável input é processada para obter o vetor de números inteiros vec.</p><p>Criamos uma variável is_in_ascending_order e a inicializamos como true. Essa variável será</p><p>usada para verificar se o vetor está em ordem crescente.</p><p>Utilizamos um laço for i in 1..vec.len() para iterar sobre os elementos do vetor, começando</p><p>pelo segundo elemento (i = 1).</p><p>Dentro do laço, verificamos se o elemento atual vec[i] é menor que o elemento anterior vec[i -</p><p>1].</p><p>Se encontrarmos algum elemento que seja menor que o elemento anterior, alteramos o valor</p><p>da variável is_in_ascending_order para false e saímos do laço utilizando a instrução break.</p><p>Ao final do laço, verificamos o valor da variável is_in_ascending_order. Se ela ainda for</p><p>true, isso significa que o vetor está em ordem crescente. Caso contrário, o vetor não está em</p><p>ordem crescente. Em ambos os casos, exibimos a mensagem apropriada.</p><p>66. Escreva um programa que leia um vetor de números inteiros e exiba os</p><p>elementos na ordem inversa.</p><p>O programa inicia solicitando ao usuário que digite os números do vetor separados por</p><p>espaço.</p><p>A entrada do usuário é lida e armazenada na variável input.</p><p>A variável input é processada para obter o vetor de números inteiros vec.</p><p>Utilizamos a função println!() para exibir a mensagem "O vetor na ordem inversa é:".</p><p>Criamos uma variável i do tipo isize (inteiro com sinal) e a inicializamos com o valor do</p><p>último índice do vetor vec.</p><p>Utilizamos um loop while com a condição i >= 0 para iterar enquanto o índice i for maior ou</p><p>igual a 0.</p><p>Dentro do loop, utilizamos o índice i para acessar os elementos do vetor vec e exibi-los na</p><p>ordem inversa utilizando a função println!().</p><p>Após exibir o elemento correspondente à posição i, decrementamos o valor de i em 1 para</p><p>passar para a próxima posição do vetor na ordem inversa.</p><p>Utilizando a função rev</p><p>O programa inicia solicitando ao usuário que digite os números do vetor separados por</p><p>espaço.</p><p>A entrada do usuário é lida e armazenada na variável input.</p><p>A variável input é processada para obter o vetor de números inteiros vec.</p><p>Utilizamos o método iter() para obter um iterador sobre os elementos do vetor vec.</p><p>Em seguida, utilizamos o método rev() para inverter a ordem dos elementos do iterador.</p><p>Por fim, utilizamos o método collect() para coletar os elementos invertidos em um novo vetor.</p><p>A notação ::> é utilizada para informar que queremos coletar os elementos em um</p><p>vetor de tipo genérico.</p><p>Utilizamos a função println!() para exibir o vetor vec na ordem inversa.</p><p>67. Crie um programa que leia um vetor de números inteiros e encontre o</p><p>segundo maior elemento presente no vetor.</p><p>O programa inicia solicitando ao usuário que digite os números do vetor separados por</p><p>espaço. A entrada do usuário é lida e armazenada na variável input. A variável input é</p><p>processada para obter o vetor de números inteiros vec.</p><p>Chamamos a função find_second_largest(&vec) para encontrar o segundo maior elemento no</p><p>vetor. Essa função retorna Some(value) se encontrar o segundo maior elemento ou None caso o</p><p>vetor não tenha pelo menos dois elementos.</p><p>Usamos um padrão match para tratar o resultado retornado pela função find_second_largest:</p><p>- Se second_largest for Some(value), significa que encontramos o segundo maior</p><p>elemento, então exibimos o valor.</p><p>- Se second_largest for None, significa que não há segundo maior elemento no vetor,</p><p>então exibimos uma mensagem informando isso.</p><p>A função find_second_largest recebe o vetor vec como parâmetro e retorna um Option,</p><p>que representa um valor opcional do tipo inteiro. Se encontrar o segundo maior elemento, retorna</p><p>Some(value), caso contrário, retorna None.</p><p>A função faz a busca pelo segundo maior elemento da seguinte forma:</p><p>- Se o vetor tiver menos de 2 elementos, não há segundo maior elemento, então retornamos</p><p>None.</p><p>- Inicializamos duas variáveis largest e second_largest com o menor valor possível de i32</p><p>(std::i32::MIN).</p><p>- Utilizamos um loop for para iterar sobre os elementos do vetor.</p><p>- Se encontrarmos um número maior que largest, atualizamos largest para esse número e</p><p>movemos o valor anterior de largest para second_largest.</p><p>- Caso o número seja maior que second_largest e diferente de largest, atualizamos o valor</p><p>de second_largest.</p><p>- No final do loop, retornamos Some(second_largest) que conterá o valor do segundo</p><p>maior elemento encontrado.</p><p>68. Faça um programa que leia um vetor de números inteiros e exiba quantas</p><p>vezes um número específico aparece no vetor.</p><p>O programa inicia solicitando ao usuário que digite os números do vetor separados por</p><p>espaço. A entrada do usuário é lida e armazenada na variável input. A variável input é</p><p>processada para obter o vetor de números inteiros vec.</p><p>O programa solicita ao usuário que digite o número que deseja procurar no vetor. A entrada</p><p>do usuário é lida e armazenada na variável num_to_find. Convertemos a string num_to_find</p><p>para um valor do tipo i32.</p><p>Utilizamos um loop for num in &vec para iterar sobre os elementos do vetor vec.</p><p>Verificamos se o elemento num é igual ao número digitado pelo usuário (num_to_find). Se a</p><p>condição for verdadeira, incrementamos a variável count.</p><p>Após o loop, exibimos a mensagem com o resultado obtido.</p><p>69. Escreva um programa que leia dois vetores de números inteiros com o</p><p>mesmo tamanho e exiba um novo vetor com os elementos resultantes da</p><p>multiplicação dos elementos correspondentes dos dois vetores.</p><p>Primeiro, o programa solicita que o usuário digite os elementos do primeiro vetor separados</p><p>por espaço e lê a entrada do usuário, armazenando-a na variável input1.</p><p>Em seguida, a variável input1 é processada para obter o primeiro vetor de números inteiros</p><p>vec1. O método split_whitespace() divide a string em palavras (números) separadas por espaços</p><p>em branco, e o método filter_map() converte cada palavra em um número inteiro (i32). O</p><p>método collect() coleta esses números em um vetor Vec.</p><p>O programa solicita ao usuário que digite os elementos do segundo vetor separados por</p><p>espaço e lê a entrada do usuário, armazenando-a na variável input2.</p><p>De forma semelhante aos passos anteriores, a variável input2 é processada para obter o</p><p>segundo vetor de números inteiros vec2.</p><p>Em seguida, o programa cria um novo vetor vazio result_vec, que será usado para armazenar</p><p>o resultado da multiplicação dos elementos correspondentes dos vetores vec1 e vec2.</p><p>Utilizando um loop for com a função zip, o programa itera simultaneamente sobre os</p><p>elementos de vec1 e vec2. A função zip combina os dois vetores em um iterador de pares,</p><p>permitindo acessar os elementos correspondentes.</p><p>Em cada iteração, num1 e num2 são os elementos correspondentes dos vetores vec1 e vec2,</p><p>respectivamente.</p><p>O programa multiplica num1 e num2 e adiciona o resultado ao vetor result_vec usando o</p><p>método push(). Ou seja, o primeiro elemento de result_vec será o resultado da multiplicação do</p><p>primeiro elemento de vec1 com o primeiro elemento de vec2, o segundo elemento de result_vec</p><p>será o resultado da multiplicação do segundo elemento de vec1 com o segundo elemento de vec2,</p><p>e assim por diante.</p><p>Após o loop, o vetor result_vec estará preenchido com os resultados das multiplicações dos</p><p>elementos</p><p>correspondentes dos vetores vec1 e vec2.</p><p>Por fim, o programa exibe o vetor resultante da multiplicação utilizando :?, que imprime o</p><p>vetor inteiro de forma formatada.</p><p>70. Crie um programa que leia um vetor de números inteiros e verifique se</p><p>todos os elementos são pares.</p><p>O programa inicia solicitando ao usuário que digite os números do vetor separados por</p><p>espaço. A entrada do usuário é lida e armazenada na variável input. A variável input é</p><p>processada para obter o vetor de números inteiros vec.</p><p>Criamos a variável all_even e a inicializamos com true. Essa variável será usada para indicar</p><p>se todos os elementos do vetor são pares ou não.</p><p>Utilizamos um laço for num in &vec para iterar sobre os elementos do vetor vec. Dentro do</p><p>laço, verificamos se o elemento num não é par, ou seja, se num % 2 != 0. Se essa condição for</p><p>verdadeira, significa que encontramos pelo menos um elemento ímpar no vetor.</p><p>Se encontrarmos um elemento ímpar, atribuímos false à variável all_even e saímos do laço</p><p>usando break.</p><p>Após o laço, verificamos o valor de all_even usando um if. Se for true, significa que todos os</p><p>elementos do vetor são pares, e exibimos a mensagem "Todos os elementos do vetor são pares.".</p><p>Caso contrário, exibimos a mensagem "Pelo menos um elemento do vetor não é par.".</p><p>Utilizando a função all</p><p>O programa inicia solicitando ao usuário que digite os números do vetor separados por</p><p>espaço. A entrada do usuário é lida e armazenada na variável input. A variável input é</p><p>processada para obter o vetor de números inteiros vec.</p><p>Utilizamos o método iter() para obter um iterador sobre os elementos do vetor vec.</p><p>Utilizamos o método all() em conjunto com um closure para verificar se todos os elementos do</p><p>vetor são pares. O closure |num| num % 2 == 0 verifica se o resto da divisão de cada número por</p><p>2 é igual a zero, o que indica que o número é par.</p><p>A variável all_even receberá true se todos os elementos do vetor forem pares, ou false caso</p><p>haja algum elemento ímpar.</p><p>Utilizamos um if para verificar o valor de all_even e exibir a mensagem correspondente. Se</p><p>todos os elementos do vetor forem pares, exibimos "Todos os elementos do vetor são pares.".</p><p>Caso contrário, exibimos "Pelo menos um elemento do vetor não é par.".</p><p>Strings</p><p>Em Rust, uma String é uma sequência de caracteres em formato de texto, que pode ser</p><p>modificada e é armazenada na memória em um formato dinâmico. Diferentemente de um slice</p><p>&str, que é uma referência imutável a uma sequência de caracteres, uma String permite que você</p><p>faça alterações no conteúdo dos caracteres.</p><p>Aqui estão algumas formas de criar e trabalhar com String em Rust:</p><p>Criando uma String vazia:</p><p>Você pode criar uma String vazia usando a função String::new():</p><p>Convertendo um &str em String:</p><p>Você pode converter um slice &str em uma String usando o método to_string():</p><p>Ou você pode usar a macro String::from():</p><p>Concatenando String:</p><p>Você pode usar o operador + ou o método push_str() para concatenar String:</p><p>Formatando String:</p><p>A macro format! permite criar uma String com formatação mais complexa:</p><p>Obtendo fatias de uma String:</p><p>Você pode obter fatias de uma String usando a notação de índice ou o método slice():</p><p>Lembre-se de que, assim como com qualquer tipo de dado em Rust, se você precisar</p><p>modificar o conteúdo da String, ela deve ser declarada como mut. Caso contrário, ela será</p><p>imutável e você só poderá fazer leitura dos seus caracteres.</p><p>71. Crie um programa que leia duas palavras e as concatene, exibindo a</p><p>palavra resultante.</p><p>O programa inicia solicitando ao usuário que digite a primeira palavra. A entrada do usuário é</p><p>lida e armazenada na variável input1.</p><p>Em seguida, o programa solicita ao usuário que digite a segunda palavra. A entrada do</p><p>usuário é lida e armazenada na variável input2.</p><p>Utilizando o operador +, as palavras são concatenadas, removendo os espaços em branco</p><p>antes e depois das palavras com input1.trim() e input2.trim().</p><p>O resultado da concatenação é armazenado na variável palavra_concatenada.</p><p>Por fim, o programa exibe a palavra resultante da concatenação utilizando a variável</p><p>palavra_concatenada.</p><p>Outra solução, utilizando format</p><p>72. Faça um programa que receba uma palavra e exiba cada letra</p><p>separadamente.</p><p>O programa inicia solicitando ao usuário que digite uma palavra. A entrada do usuário é lida e</p><p>armazenada na variável input.</p><p>A variável word recebe a palavra digitada pelo usuário após a remoção dos espaços em</p><p>branco no início e no final da string usando input.trim().</p><p>Utilizamos um laço for para iterar sobre cada letra da palavra. O método chars() é chamado</p><p>na variável word, convertendo-a em um iterador de caracteres.</p><p>Para cada iteração do laço, a variável letter receberá uma letra da palavra.</p><p>Dentro do laço, exibimos cada letra separadamente utilizando println!("{}", letter), onde {} é</p><p>substituído pela letra correspondente em cada iteração.</p><p>O laço percorrerá todas as letras da palavra, exibindo-as uma por uma em linhas separadas até</p><p>que não haja mais letras a serem exibidas.</p><p>Utilizando while</p><p>O programa inicia solicitando ao usuário que digite uma palavra. A entrada do usuário é lida e</p><p>armazenada na variável input.</p><p>A variável word recebe a palavra digitada pelo usuário após a remoção dos espaços em</p><p>branco no início e no final da string usando input.trim().</p><p>Criamos uma variável index e a inicializamos com zero. Essa variável será utilizada para</p><p>acessar cada letra da palavra por meio da posição no vetor de caracteres.</p><p>Utilizamos um laço while para iterar enquanto o valor de index for menor que o tamanho da</p><p>palavra, ou seja, enquanto ainda houver letras para percorrer.</p><p>Dentro do laço, utilizamos o método chars().nth(index) para obter a letra da palavra que está</p><p>na posição index. Esse método retorna um Option, pois pode ser que o índice seja</p><p>inválido, então utilizamos o match para tratar o resultado.</p><p>Se a letra for encontrada (Some(l)), a imprimimos usando println!("{}", l).</p><p>Caso não seja possível obter a letra (None), saímos do laço usando break.</p><p>A cada iteração, incrementamos o valor de index em 1 (index += 1), para avançar para a</p><p>próxima letra da palavra.</p><p>73. Crie um programa que receba uma frase e substitua todas as letras "a" por</p><p>"e".</p><p>Utilizando Replace</p><p>O programa inicia solicitando ao usuário que digite uma frase. A entrada do usuário é lida e</p><p>armazenada na variável input.</p><p>Utilizando o método replace(), substituímos todas as ocorrências da letra "a" por "e" na</p><p>string. O resultado é armazenado na variável frase_substituida.</p><p>Por fim, o programa exibe a frase com as letras "a" substituídas por "e" utilizando a variável</p><p>frase_substituida.</p><p>Utilizando Laço de Repetição</p><p>Primeiramente, o programa solicita ao usuário que digite uma frase através da mensagem:</p><p>"Digite uma frase:".</p><p>A entrada do usuário é lida e armazenada na variável input utilizando a função</p><p>io::stdin().read_line(&mut input).expect("Erro ao ler entrada.").</p><p>Criamos duas variáveis: frase_substituida, que será utilizada para armazenar a frase após a</p><p>substituição das letras "a" por "e", e chars, que é um iterador de caracteres criado a partir da</p><p>string input usando input.chars().</p><p>Utilizando o laço de repetição while let Some(c) = chars.next() { ... }, percorremos cada</p><p>caractere da frase um a um.</p><p>Dentro do laço, verificamos se o caractere atual (c) é igual a "a" ou "A" com o if c == 'a' || c</p><p>== 'A'. Isso é feito para tratar tanto letras minúsculas quanto maiúsculas.</p><p>Se o caractere atual for "a" ou "A", significa que devemos substituí-lo por "e", então</p><p>utilizamos o método push('e') para adicionar a letra "e" à variável frase_substituida.</p><p>Caso o caractere não seja "a" ou "A", não precisamos substituí-lo, então adicionamos o</p><p>próprio caractere à variável frase_substituida com push(c).</p><p>O laço continuará percorrendo a frase até que o iterador chars não tenha mais caracteres a</p><p>serem analisados.</p><p>Ao final do laço, a variável frase_substituida conterá a frase original com as letras "a"</p><p>substituídas por "e".</p><p>O programa exibe a frase com as letras "a" substituídas por</p><p>"e" utilizando a variável</p><p>frase_substituida.</p><p>74. Escreva um programa que receba um nome e verifique se o mesmo começa</p><p>com a letra "A".</p><p>O programa inicia solicitando ao usuário que digite um nome. A entrada do usuário é lida e</p><p>armazenada na variável input.</p><p>A variável nome recebe o nome digitado pelo usuário após a remoção dos espaços em branco</p><p>no início e no final da string usando input.trim().</p><p>Utilizamos o método chars().next() para obter o primeiro caractere do nome.</p><p>Comparamos se o resultado da primeira chamada ao chars().next() é igual a Some('A') ou</p><p>Some('a'). Essas duas comparações são feitas separadamente para tratar tanto letras maiúsculas</p><p>quanto minúsculas.</p><p>Se a comparação for verdadeira, significa que o nome começa com a letra 'A' (maiúscula ou</p><p>minúscula), então exibimos a mensagem "O nome começa com a letra 'A'".</p><p>Caso contrário, exibimos a mensagem "O nome não começa com a letra 'A'".</p><p>75. Faça um programa que leia uma palavra e verifique se a mesma é</p><p>palíndromo (se pode ser lida da mesma forma de trás para frente).</p><p>O programa inicia solicitando ao usuário que digite uma palavra. A entrada do usuário é lida e</p><p>armazenada na variável input.</p><p>A variável palavra recebe a palavra digitada pelo usuário após a remoção dos espaços em</p><p>branco no início e no final da string usando input.trim().</p><p>Criamos uma string vazia chamada reversed para armazenar a palavra invertida.</p><p>Utilizando um laço de repetição for c in palavra.chars().rev() { ... }, percorremos cada</p><p>caractere da palavra de forma invertida.</p><p>Dentro do laço, adicionamos cada caractere na string reversed usando o método push(c).</p><p>Após percorrer todos os caracteres, comparamos a palavra original (palavra.to_lowercase())</p><p>com a palavra invertida (reversed.to_lowercase()) após converter ambas para letras minúsculas</p><p>usando o método to_lowercase().</p><p>Se as duas palavras forem iguais, significa que a palavra é um palíndromo, e o programa</p><p>exibe a mensagem "A palavra é um palíndromo.".</p><p>Caso contrário, o programa exibe a mensagem "A palavra não é um palíndromo.".</p><p>Solução 2</p><p>O programa inicia solicitando ao usuário que digite uma palavra. A entrada do usuário é lida e</p><p>armazenada na variável input.</p><p>A variável palavra recebe a palavra digitada pelo usuário após a remoção dos espaços em</p><p>branco no início e no final da string usando input.trim().</p><p>A função is_palindromo(palavra: &str) -> bool é utilizada para verificar se a palavra é um</p><p>palíndromo. Ela retorna true se a palavra for um palíndromo e false caso contrário.</p><p>Dentro da função is_palindromo, criamos uma string reversed que contém a palavra invertida</p><p>usando o método chars().rev().collect().</p><p>Comparamos a palavra original (palavra.to_lowercase()) com a palavra invertida</p><p>(reversed.to_lowercase()) após converter ambas para letras minúsculas usando o método</p><p>to_lowercase().</p><p>Se as duas palavras forem iguais, significa que a palavra é um palíndromo, e a função retorna</p><p>true.</p><p>Caso contrário, a função retorna false.</p><p>No main, verificamos o resultado da função is_palindromo e exibimos a mensagem</p><p>adequada, indicando se a palavra é ou não um palíndromo.</p><p>76. Crie um programa que leia duas palavras e verifique se a segunda palavra é</p><p>um anagrama da primeira.</p><p>O programa inicia solicitando ao usuário que digite a primeira palavra. A entrada do usuário é</p><p>lida e armazenada na variável input1. Em seguida, o programa solicita ao usuário que digite a</p><p>segunda palavra. A entrada do usuário é lida e armazenada na variável input2.</p><p>As variáveis palavra1 e palavra2 recebem as palavras digitadas pelo usuário após a remoção</p><p>dos espaços em branco no início e no final das strings usando input1.trim() e input2.trim().</p><p>Criamos vetores palavra1_chars e palavra2_chars que contêm os caracteres das respectivas</p><p>palavras.</p><p>Utilizamos o método sort() para ordenar os caracteres em ambas as palavras.</p><p>Comparamos os vetores palavra1_chars e palavra2_chars. Se eles forem iguais, significa</p><p>que a segunda palavra é um anagrama da primeira, e exibimos a mensagem "A segunda palavra</p><p>é um anagrama da primeira.".</p><p>Caso contrário, exibimos a mensagem "A segunda palavra não é um anagrama da primeira.".</p><p>77. Escreva um programa que receba um nome completo e exiba somente o</p><p>primeiro nome.</p><p>O programa inicia solicitando ao usuário que digite o nome completo. A entrada do usuário é</p><p>lida e armazenada na variável input.</p><p>A variável nome_completo recebe o nome digitado pelo usuário após a remoção dos espaços</p><p>em branco no início e no final da string usando input.trim().</p><p>Utilizamos o método split_whitespace() para dividir a string em palavras, considerando os</p><p>espaços em branco como delimitadores.</p><p>Em seguida, usamos o método next() para obter a primeira palavra, ou seja, o primeiro nome.</p><p>Usando um match, verificamos se o resultado do next() é Some(nome), ou seja, se</p><p>encontramos um primeiro nome.</p><p>Se encontramos o primeiro nome, exibimos a mensagem "Primeiro nome: {}" com o valor do</p><p>primeiro nome.</p><p>Caso não seja encontrado nenhum nome (se o nome digitado for vazio), exibimos a</p><p>mensagem "Nenhum nome encontrado.".</p><p>78. Faça um programa que receba uma frase e exiba a quantidade de espaços</p><p>em branco presentes na mesma.</p><p>Utilizando Laço de Repetição</p><p>O programa inicia solicitando ao usuário que digite uma frase. A entrada do usuário é lida e</p><p>armazenada na variável input.</p><p>A variável frase recebe a frase digitada pelo usuário após a remoção dos espaços em branco</p><p>no início e no final da string usando input.trim().</p><p>Criamos uma variável qtd_espacos inicializada com zero para armazenar a quantidade de</p><p>espaços em branco na frase.</p><p>Utilizamos um laço de repetição for para percorrer cada caractere da string frase utilizando o</p><p>método chars().</p><p>Dentro do laço, verificamos se o caractere é um espaço em branco (representado pelo</p><p>caractere ' ').</p><p>Se o caractere for um espaço em branco, incrementamos a variável qtd_espacos em 1.</p><p>Após percorrer toda a frase, exibimos a quantidade de espaços em branco na frase usando a</p><p>função println!().</p><p>79. Crie um programa que leia uma palavra e exiba a quantidade de vogais</p><p>presentes na mesma.</p><p>O programa inicia solicitando ao usuário que digite uma palavra. A entrada do usuário é lida e</p><p>armazenada na variável input.</p><p>A variável palavra recebe a palavra digitada pelo usuário após a remoção dos espaços em</p><p>branco no início e no final da string usando input.trim().</p><p>Criamos um array vogais contendo as vogais do alfabeto.</p><p>Inicializamos a variável qtd_vogais com zero para armazenar a quantidade de vogais na</p><p>palavra.</p><p>Utilizamos um laço de repetição for para percorrer cada caractere da palavra utilizando o</p><p>método chars().</p><p>Dentro do laço, verificamos se o caractere é uma vogal, verificando se ele está contido no</p><p>array vogais usando o método contains().</p><p>Se o caractere for uma vogal, incrementamos a variável qtd_vogais em 1.</p><p>Após percorrer toda a palavra, exibimos a quantidade de vogais na palavra usando a função</p><p>println!().</p><p>80. Escreva um programa que receba um nome completo e exiba o sobrenome</p><p>(último nome) primeiro.</p><p>Primeiro, o programa solicita ao usuário que digite um nome completo utilizando println!</p><p>("Digite um nome completo:").</p><p>A entrada do usuário é lida e armazenada em uma variável chamada input utilizando</p><p>io::stdin().read_line(&mut input).expect("Erro ao ler entrada."). Essa função é usada para</p><p>capturar a entrada do usuário.</p><p>Em seguida, a variável nome_completo é criada para armazenar a string digitada pelo usuário</p><p>após a remoção dos espaços em branco no início e no final da string utilizando input.trim(). Isso</p><p>é feito para garantir que não haja espaços extras antes ou depois do nome.</p><p>O programa utiliza split_whitespace() na string nome_completo para separar as palavras com</p><p>base nos espaços em branco e cria um vetor chamado palavras para armazenar essas palavras.</p><p>Isso é feito através da linha let palavras: Vec =</p><p>nome_completo.split_whitespace().collect();.</p><p>Utilizando if let Some(ultimo_nome) = palavras.last() { ... }, o programa verifica se o vetor</p><p>palavras contém algum elemento (ou seja, se o</p><p>Embora seja opcional, o</p><p>VS Code é altamente recomendado para uma experiência de desenvolvimento mais agradável.</p><p>Baixe e instale o Visual Studio Code em: https://code.visualstudio.com/</p><p>Após instalar o Visual Studio Code, você deve adicionar a extensão "Rust" para aproveitar</p><p>recursos específicos da linguagem, como realce de sintaxe, sugestões de código e integração com</p><p>ferramentas como o Cargo.</p><p>Abra o Visual Studio Code, vá para a guia de extensões (ícone de quadrado à esquerda) e</p><p>pesquise por "Rust".</p><p>Selecione a extensão oficial "Rust" desenvolvida pela equipe do Rust.</p><p>Com essas ferramentas instaladas, você estará pronto para começar a programar em Rust. O</p><p>Rustup cuidará do gerenciamento das versões do compilador e do Cargo, enquanto o Visual</p><p>Studio Code com a extensão Rust fornecerá um ambiente de desenvolvimento amigável.</p><p>O que é o Cargo?</p><p>Cargo é o gerenciador de pacotes e build system padrão da linguagem de programação Rust.</p><p>Ele é uma ferramenta essencial no ecossistema Rust e desempenha um papel importante no</p><p>desenvolvimento de projetos em Rust.</p><p>Aqui estão algumas das principais funcionalidades e recursos do Cargo:</p><p>Gerenciamento de dependências</p><p>Cargo facilita o gerenciamento das dependências do seu projeto Rust. Com um simples</p><p>arquivo de configuração chamado Cargo.toml, você pode especificar as dependências do seu</p><p>projeto, incluindo a versão desejada. O Cargo é responsável por baixar e instalar</p><p>automaticamente as dependências necessárias.</p><p>Build system</p><p>O Cargo também atua como um sistema de build para o seu projeto Rust. Ele oferece</p><p>comandos para compilar o código-fonte, gerar artefatos binários e lidar com os detalhes de</p><p>construção do projeto, como vinculação de bibliotecas externas.</p><p>Compilação e testes</p><p>O Cargo facilita a compilação do seu código Rust. Ele gerencia automaticamente as</p><p>dependências, compila todos os arquivos do projeto e gera o executável ou biblioteca resultante.</p><p>Além disso, o Cargo fornece suporte para execução de testes unitários e de integração.</p><p>Gerenciamento de projetos</p><p>Com o Cargo, você pode criar, inicializar e gerenciar facilmente projetos Rust. Ele oferece</p><p>comandos para criar um novo projeto, adicionar novos arquivos, executar o projeto e muito mais.</p><p>Ele também gera automaticamente a estrutura inicial do projeto, incluindo arquivos de</p><p>configuração padrão.</p><p>Distribuição de pacotes</p><p>https://www.rust-lang.org/tools/install</p><p>https://code.visualstudio.com/</p><p>O Cargo é usado para empacotar e distribuir pacotes Rust. Com comandos simples, você pode</p><p>empacotar seu projeto Rust em um formato comum, que pode ser compartilhado e distribuído</p><p>para outros desenvolvedores ou usuários finais.</p><p>No geral, o Cargo simplifica significativamente o processo de desenvolvimento em Rust,</p><p>cuidando do gerenciamento de dependências, compilação, teste e distribuição de pacotes. Ele é</p><p>uma parte fundamental do ecossistema Rust e é amplamente utilizado por desenvolvedores Rust</p><p>em seus projetos.</p><p>Começando um projeto em Rust</p><p>Abra o terminal ou prompt de comando e navegue até o diretório onde deseja criar o seu</p><p>projeto Rust. Em seguida, execute o seguinte comando para criar um novo projeto usando o</p><p>Cargo:</p><p>cargo new nome_do_projeto</p><p>Isso criará um diretório chamado nome_do_projeto com uma estrutura de projeto inicial</p><p>contendo um arquivo main.rs e um arquivo Cargo.toml.</p><p>Abra o arquivo main.rs no VS Code. O código existente é um exemplo básico que imprime</p><p>"Olá, mundo!" no console. Você pode modificar esse código ou adicionar o seu próprio.</p><p>No terminal ou prompt de comando, navegue até o diretório do projeto que você criou usando</p><p>o Cargo e execute o seguinte comando:</p><p>cargo run</p><p>Isso compilará o código do seu projeto e o executará. Você verá a saída no console.</p><p>Se você deseja apenas compilar o código sem executá-lo, pode usar o comando cargo build.</p><p>Ele compilará o código e gerará o executável, mas não o executará automaticamente.</p><p>Essas são as etapas básicas para executar um arquivo em Rust usando o Cargo. O Cargo cuida</p><p>da compilação, gerenciamento de dependências e execução do projeto, tornando o processo de</p><p>execução de código em Rust mais fácil e conveniente.</p><p>Variáveis em Rust</p><p>Em Rust, as variáveis são declaradas usando a palavra-chave let. Rust é uma linguagem de</p><p>programação estaticamente tipada, o que significa que você precisa especificar o tipo da variável</p><p>no momento da declaração, a menos que o compilador possa inferir o tipo automaticamente.</p><p>Aqui estão alguns exemplos de como declarar variáveis em Rust:</p><p>Variáveis Imutáveis:</p><p>Variáveis Mutáveis:</p><p>Constantes:</p><p>É importante observar que, por padrão, as variáveis em Rust são imutáveis. Se você precisar</p><p>modificar o valor de uma variável, é necessário usar a palavra-chave mut para torná-la mutável.</p><p>Rust também possui suporte para "shadowing", que permite reutilizar o nome de uma variável</p><p>ao declarar uma nova variável com o mesmo nome. Nesse caso, a nova variável oculta a anterior,</p><p>mas pode ter um tipo diferente ou ser mutável.</p><p>Em resumo, em Rust, você pode declarar variáveis usando let, especificar o tipo</p><p>explicitamente ou deixar o compilador inferir o tipo. Variáveis podem ser mutáveis usando a</p><p>palavra-chave mut. Além disso, você pode usar constantes para valores imutáveis que são</p><p>conhecidos em tempo de compilação.</p><p>Tipos de Dados em Rust</p><p>Rust possui uma variedade de tipos de dados que podem ser usados para representar</p><p>diferentes valores e realizar operações específicas. Aqui estão alguns dos principais tipos de</p><p>dados em Rust:</p><p>Tipos numéricos</p><p>Em Rust, existem diversos tipos numéricos que podem ser utilizados para representar valores</p><p>inteiros e de ponto flutuante. Aqui estão os principais tipos numéricos em Rust:</p><p>Tipos Inteiros com sinal:</p><p>- i8: Inteiro de 8 bits com sinal.</p><p>- i16: Inteiro de 16 bits com sinal.</p><p>- i32: Inteiro de 32 bits com sinal.</p><p>- i64: Inteiro de 64 bits com sinal.</p><p>- i128: Inteiro de 128 bits com sinal.</p><p>- isize: Inteiro com tamanho dependente da arquitetura do sistema.</p><p>Tipos Inteiros sem sinal:</p><p>- u8: Inteiro de 8 bits sem sinal.</p><p>- u16: Inteiro de 16 bits sem sinal.</p><p>- u32: Inteiro de 32 bits sem sinal.</p><p>- u64: Inteiro de 64 bits sem sinal.</p><p>- u128: Inteiro de 128 bits sem sinal.</p><p>- usize: Inteiro sem tamanho dependente da arquitetura do sistema.</p><p>Tipos de Ponto Flutuante:</p><p>- f32: Ponto flutuante de precisão simples (32 bits).</p><p>- f64: Ponto flutuante de precisão dupla (64 bits). É o tipo padrão para valores de ponto</p><p>flutuante em Rust.</p><p>Por exemplo, você pode declarar uma variável do tipo i32 da seguinte forma:</p><p>No exemplo acima, declaramos a variável my_integer como um inteiro de 32 bits com sinal e</p><p>atribuímos o valor 42 a ela. Em seguida, usamos a macro println! para exibir o valor da variável.</p><p>Tipo booleano</p><p>- bool: representa valores booleanos true ou false.</p><p>Tipo caractere</p><p>- char: representa um único caractere Unicode.</p><p>Tipos compostos</p><p>Tuplas: Em Rust, uma tupla é uma estrutura de dados que pode conter um número fixo de</p><p>elementos, e cada elemento pode ter um tipo diferente. As tuplas são uma forma de agrupar</p><p>valores relacionados em uma única unidade e são úteis quando você precisa armazenar diferentes</p><p>tipos de dados juntos.</p><p>As tuplas são definidas usando parênteses () e separando os elementos com vírgulas.</p><p>Neste exemplo, criamos uma tupla com três elementos: um inteiro (i32), um número de ponto</p><p>flutuante (f64) e uma referência a uma string (&str).</p><p>Você pode acessar os elementos da tupla usando a notação de ponto . seguida do índice do</p><p>elemento (começando em zero).</p><p>Você pode usar o padrão de destructuring para extrair os elementos individuais da tupla.</p><p>Em alguns casos, Rust pode inferir automaticamente os tipos dos elementos da tupla com</p><p>base nos valores atribuídos.</p><p>As funções em Rust podem retornar tuplas, permitindo que você retorne múltiplos valores de</p><p>uma única função.</p><p>Em seguida, você pode desestruturar a tupla retornada para obter os valores individuais.</p><p>nome não é vazio). Se houver, o bloco dentro das</p><p>chaves {} é executado.</p><p>Caso exista algum elemento no vetor, a variável ultimo_nome recebe o valor do último</p><p>elemento do vetor palavras, que corresponde ao sobrenome. Se o vetor estiver vazio (ou seja, o</p><p>nome não foi digitado), o bloco de código dentro do if let não é executado.</p><p>Utilizando println!("O sobrenome é: {}", ultimo_nome);, o programa exibe o sobrenome</p><p>encontrado. Se o nome estiver vazio e não houver nenhum sobrenome, o programa exibe</p><p>"Nenhum sobrenome encontrado".</p><p>Matrizes</p><p>Em Rust, uma matriz é uma coleção de elementos de tamanho fixo, dispostos em linhas e</p><p>colunas. A matriz pode conter elementos do mesmo tipo e tem um tamanho definido em tempo</p><p>de compilação. Ao contrário dos vetores (Vec), o tamanho da matriz não pode ser alterado</p><p>após a sua criação.</p><p>Aqui estão algumas formas de criar e trabalhar com matrizes em Rust:</p><p>Criando uma matriz:</p><p>Você pode criar uma matriz usando a sintaxe [T; N], onde T é o tipo dos elementos e N é o</p><p>tamanho da matriz:</p><p>Acessando elementos da matriz:</p><p>Você pode acessar elementos da matriz usando a notação de índice (começando em zero) para</p><p>as linhas e colunas:</p><p>Percorrendo uma matriz:</p><p>Você pode usar loops for aninhados para percorrer os elementos da matriz:</p><p>Matrizes multidimensionais:</p><p>Rust suporta matrizes multidimensionais, onde cada dimensão tem um tamanho fixo:</p><p>Lembre-se de que, como uma matriz tem tamanho fixo em tempo de compilação, ela é mais</p><p>adequada para situações em que o tamanho é conhecido antecipadamente. Se você precisar de</p><p>uma coleção dinâmica de elementos, é melhor usar um vetor (Vec) em Rust.</p><p>81. Faça um programa que preencha uma matriz 3x3 com valores informados</p><p>pelo usuário e exiba a soma dos valores da diagonal principal.</p><p>Definimos uma constante N com valor 3, pois estamos trabalhando com uma matriz 3x3.</p><p>Criamos uma matriz 3x3 chamada matriz com elementos do tipo i32 (números inteiros) e</p><p>inicializamos todos os elementos com zero.</p><p>Utilizando dois laços de repetição for, percorremos a matriz para preenchê-la com os valores</p><p>informados pelo usuário.</p><p>O usuário é solicitado a digitar o valor para cada posição da matriz, e o valor digitado é</p><p>armazenado na matriz na posição correta.</p><p>Em seguida, criamos uma variável soma_diagonal_principal para armazenar a soma dos</p><p>valores da diagonal principal da matriz.</p><p>Utilizando um laço de repetição for, percorremos a diagonal principal da matriz, que são os</p><p>elementos em que a posição da linha é igual à posição da coluna, e somamos os valores na</p><p>variável soma_diagonal_principal.</p><p>Finalmente, exibimos a soma dos valores da diagonal principal utilizando println!().</p><p>82. Faça um programa que preencha uma matriz 4x4 com valores aleatórios e</p><p>exiba a matriz transposta.</p><p>Para preencher uma matriz 4x4 com valores aleatórios e exibir a matriz transposta em Rust,</p><p>precisaremos usar a biblioteca externa "rand" para gerar números aleatórios. Certifique-se de</p><p>adicionar "rand" como dependência em seu arquivo "Cargo.toml":</p><p>[dependencies]</p><p>rand = "0.8.4"</p><p>Definimos a constante N com valor 4, pois estamos trabalhando com uma matriz 4x4.</p><p>Criamos uma matriz 4x4 chamada matriz para armazenar os valores aleatórios e outra matriz</p><p>chamada matriz_transposta para armazenar a matriz transposta.</p><p>Utilizamos a biblioteca "rand" para gerar números aleatórios. Criamos uma instância de</p><p>rand::thread_rng() para gerar os números aleatórios e, em seguida, utilizamos</p><p>rng.gen_range(1..=100) para gerar um número aleatório entre 1 e 100.</p><p>Preenchemos a matriz matriz com valores aleatórios usando dois laços de repetição for.</p><p>Exibimos a matriz original utilizando outro par de laços de repetição for para percorrer a</p><p>matriz e print!() para formatar a saída.</p><p>Criamos a matriz transposta matriz_transposta, onde trocamos as posições de linha por</p><p>coluna da matriz original.</p><p>Exibimos a matriz transposta também utilizando laços de repetição e print!() para formatar a</p><p>saída.</p><p>Dessa forma, o programa preenche uma matriz 4x4 com valores aleatórios e exibe a matriz</p><p>transposta na saída.</p><p>83. Faça um programa que leia duas matrizes 2x2 e exiba a soma das duas</p><p>matrizes.</p><p>Primeiramente, definimos a constante N com valor 2, pois estamos trabalhando com matrizes</p><p>2x2.</p><p>Criamos duas matrizes 2x2 chamadas matriz1 e matriz2 para armazenar os valores lidos do</p><p>usuário. Essas matrizes são do tipo [[i32; N]; N], indicando que são matrizes de 2x2 com</p><p>elementos do tipo i32 (número inteiro de 32 bits).</p><p>Utilizamos dois laços de repetição for para ler os valores da primeira matriz (matriz1) e da</p><p>segunda matriz (matriz2) digitados pelo usuário. Para isso, percorremos as linhas (i) e colunas (j)</p><p>das matrizes, solicitando ao usuário que digite o valor da posição [i, j] e armazenando esse valor</p><p>nas respectivas posições das matrizes matriz1 e matriz2.</p><p>Em seguida, criamos uma terceira matriz 2x2 chamada soma_matrizes para armazenar a</p><p>soma das duas matrizes lidas anteriormente. Essa matriz também é do tipo [[i32; N]; N].</p><p>Utilizamos mais um par de laços de repetição for para somar os elementos das duas matrizes</p><p>(matriz1 e matriz2) e armazenar o resultado na matriz soma_matrizes. Para cada posição [i, j] da</p><p>matriz soma_matrizes, somamos os valores das posições correspondentes de matriz1 e matriz2.</p><p>Por fim, exibimos a matriz resultante (soma_matrizes) na saída do programa. Utilizamos</p><p>novamente um par de laços de repetição for para percorrer as linhas (i) e colunas (j) da matriz e a</p><p>função print!() para formatar a saída. Cada elemento da matriz é impresso com um espaço de 4</p><p>caracteres para que a matriz seja exibida de forma organizada.</p><p>Com esse programa, é possível ler duas matrizes 2x2 do usuário, somá-las elemento a</p><p>elemento e exibir a matriz resultante.</p><p>84. Faça um programa que preencha uma matriz 5x5 com números inteiros e</p><p>exiba o maior valor da matriz e a posição em que ele se encontra.</p><p>Definimos a constante N com valor 5, pois estamos trabalhando com uma matriz 5x5.</p><p>Criamos uma matriz 5x5 chamada matriz para armazenar os valores lidos do usuário. Essa</p><p>matriz é do tipo [[i32; N]; N], indicando que é uma matriz de 5x5 com elementos do tipo i32</p><p>(número inteiro de 32 bits).</p><p>Utilizamos dois laços de repetição for para ler os valores da matriz digitados pelo usuário. O</p><p>primeiro laço for i in 0..N percorre as linhas (i) da matriz, e o segundo laço for j in 0..N percorre</p><p>as colunas (j) da matriz. Dentro desses laços, solicitamos ao usuário que digite o valor da posição</p><p>[i, j] e armazenamos esse valor na matriz matriz[i][j].</p><p>Criamos duas variáveis, maior_valor e posicao_maior, para armazenar o maior valor</p><p>encontrado na matriz e a posição em que ele se encontra, respectivamente. Inicializamos</p><p>maior_valor com o primeiro elemento da matriz (matriz[0][0]) e posicao_maior com (0, 0)</p><p>indicando que o maior valor está inicialmente na posição [0, 0].</p><p>Utilizamos mais um par de laços de repetição for para percorrer todos os elementos da matriz</p><p>e encontrar o maior valor. O primeiro laço for i in 0..N percorre as linhas (i) da matriz, e o</p><p>segundo laço for j in 0..N percorre as colunas (j) da matriz. Dentro desses laços, comparamos o</p><p>valor do elemento atual (matriz[i][j]) com o valor armazenado em maior_valor. Se o valor do</p><p>elemento atual for maior que o valor armazenado em maior_valor, atualizamos as variáveis</p><p>maior_valor e posicao_maior com o novo valor e a posição correspondente.</p><p>Por fim, exibimos o maior valor encontrado e sua posição na saída do programa. Utilizamos a</p><p>função println!() para formatar a saída, mostrando o valor do elemento, a linha e a coluna onde</p><p>ele se encontra na matriz. Note que usamos .0 e .1 para acessar os elementos da tupla</p><p>posicao_maior, que armazena as coordenadas do maior valor encontrado.</p><p>Dessa forma, o programa lê uma matriz 5x5 do usuário, encontra o maior valor e exibe o</p><p>valor e a posição do elemento na matriz.</p><p>85. Faça um programa que leia uma matriz 3x3 e calcule a média dos valores</p><p>presentes nas posições pares (soma dos índices par) da matriz.</p><p>Definimos a constante</p><p>N com valor 3, pois estamos trabalhando com uma matriz 3x3.</p><p>Criamos uma matriz 3x3 chamada matriz para armazenar os valores lidos do usuário. Essa</p><p>matriz é do tipo [[i32; N]; N], indicando que é uma matriz de 3x3 com elementos do tipo i32</p><p>(número inteiro de 32 bits).</p><p>Utilizamos dois laços de repetição for para ler os valores da matriz digitados pelo usuário. O</p><p>primeiro laço for i in 0..N percorre as linhas (i) da matriz, e o segundo laço for j in 0..N percorre</p><p>as colunas (j) da matriz. Dentro desses laços, solicitamos ao usuário que digite o valor da posição</p><p>[i, j] e armazenamos esse valor na matriz matriz[i][j].</p><p>Criamos duas variáveis, soma_valores_pares e quantidade_valores_pares, para armazenar a</p><p>soma dos valores presentes nas posições pares da matriz e a quantidade de valores encontrados,</p><p>respectivamente. Inicializamos ambas as variáveis com zero.</p><p>Utilizamos mais um par de laços de repetição for para percorrer todos os elementos da matriz</p><p>e calcular a média dos valores presentes nas posições pares. Para verificar se a posição (i, j) é</p><p>par, verificamos se a soma de i e j é par através da expressão (i + j) % 2 == 0. Se for par,</p><p>incrementamos a soma de valores e a quantidade de valores pares.</p><p>Calculamos a média dos valores presentes nas posições pares, dividindo a soma dos valores</p><p>pares pelo número de valores pares encontrados. Utilizamos a conversão as f64 para garantir que</p><p>a divisão seja feita com números de ponto flutuante.</p><p>Por fim, exibimos a média dos valores presentes nas posições pares da matriz, formatando a</p><p>saída com duas casas decimais utilizando println!() e {:.2}.</p><p>86. Faça um programa que preencha uma matriz 4x4 com números aleatórios e</p><p>exiba a soma dos valores presentes em cada linha e em cada coluna.</p><p>Definimos a constante N com valor 4, pois estamos trabalhando com uma matriz 4x4.</p><p>Criamos uma matriz 4x4 chamada matriz para armazenar os valores aleatórios. Essa matriz é</p><p>do tipo [[i32; N]; N], indicando que é uma matriz de 4x4 com elementos do tipo i32 (número</p><p>inteiro de 32 bits).</p><p>Importamos a biblioteca rand::Rng para gerar números aleatórios.</p><p>Utilizamos dois laços de repetição for para preencher a matriz com números aleatórios. O</p><p>primeiro laço for i in 0..N percorre as linhas (i) da matriz, e o segundo laço for j in 0..N percorre</p><p>as colunas (j) da matriz. Dentro desses laços, utilizamos a função rng.gen_range() para gerar</p><p>números aleatórios entre 1 e 100 e armazenamos esses valores na matriz matriz[i][j].</p><p>Exibimos a matriz gerada utilizando dois laços de repetição for. O primeiro laço for i in 0..N</p><p>percorre as linhas (i) da matriz, e o segundo laço for j in 0..N percorre as colunas (j) da matriz.</p><p>Dentro desses laços, utilizamos print!("{: bool, que recebe</p><p>uma referência para a matriz como argumento e retorna um valor booleano indicando se a matriz</p><p>é diagonal ou não. Essa função percorre todos os elementos da matriz e verifica se os elementos</p><p>fora da diagonal principal (com índices de linha diferentes dos índices de coluna) são iguais a</p><p>zero. Caso encontre algum elemento diferente de zero fora da diagonal, retorna false, indicando</p><p>que a matriz não é diagonal. Caso contrário, retorna true, indicando que a matriz é diagonal.</p><p>No main, primeiro exibimos uma mensagem para o usuário pedindo que ele digite os</p><p>elementos da matriz.</p><p>Chamamos a função ler_matriz() para ler os elementos da matriz e armazená-los em uma</p><p>variável chamada matriz.</p><p>Em seguida, chamamos a função verificar_diagonal(&matriz) passando a matriz como</p><p>argumento e armazenamos o resultado em uma variável chamada diagonal.</p><p>Por fim, exibimos a mensagem indicando se a matriz é diagonal ou não, dependendo do valor</p><p>armazenado na variável diagonal. Se diagonal for true, a matriz é diagonal; caso contrário, a</p><p>matriz não é diagonal.</p><p>90. Faça um programa</p><p>que leia uma matriz m x n, indicando o local onde há</p><p>minas de um jogo de campo minado (sendo 0 para campo neutro, e 1 para</p><p>locais onde haveriam minas), e o programa deveria retornar uma matriz</p><p>indicando, para cada posição, o número de minas nas casas vizinhas.</p><p>Definimos uma função ler_matriz(m: usize, n: usize) -> Vec> que é responsável</p><p>por ler a matriz de tamanho m x n a partir da entrada do usuário. Utilizamos um loop aninhado</p><p>para percorrer todas as posições da matriz e armazenar os valores lidos pelo usuário.</p><p>Em seguida, criamos a função contar_minas_vizinhas(matriz: &Vec>, m: usize,</p><p>n: usize) -> Vec>, que recebe a matriz lida pelo usuário, bem como as dimensões m e</p><p>n da matriz, e retorna a matriz de contagem de minas vizinhas. Essa função percorre todas as</p><p>posições da matriz e, para cada posição, verifica suas posições vizinhas para contar o número de</p><p>minas ao redor. Utilizamos loops aninhados para percorrer as vizinhas de cada posição e verificar</p><p>se são válidas (não ultrapassam os limites da matriz) e se contêm uma mina. Caso seja</p><p>verdadeiro, incrementamos a contagem de minas na posição atual.</p><p>No main, primeiro pedimos ao usuário para digitar o tamanho da matriz (m n) e fazemos a</p><p>leitura desses valores.</p><p>Chamamos a função ler_matriz(m, n) para ler a matriz e armazenamos o resultado na variável</p><p>matriz.</p><p>Chamamos a função contar_minas_vizinhas(&matriz, m, n) passando a matriz lida pelo</p><p>usuário e armazenamos o resultado na variável matriz_contagem.</p><p>Por fim, exibimos a matriz de contagem de minas vizinhas, que mostra quantas minas há ao</p><p>redor de cada posição.</p><p>Funções Recursivas</p><p>Em Rust, as funções são blocos de código que podem ser definidos e chamados para executar</p><p>uma tarefa específica. Elas são uma parte essencial do desenvolvimento de programas em Rust e</p><p>permitem organizar o código em unidades reutilizáveis.</p><p>Aqui está a sintaxe básica para a definição e chamada de funções em Rust:</p><p>Definição de uma função:</p><p>Use a palavra-chave fn seguida do nome da função, parênteses () e um bloco de código</p><p>delimitado por chaves {}.</p><p>Chamada de uma função:</p><p>Para chamar uma função, use o nome da função seguido de parênteses () e os argumentos (se</p><p>houver) dentro dos parênteses.</p><p>Parâmetros e valores de retorno:</p><p>As funções podem ter parâmetros que permitem que você passe valores para dentro da função</p><p>para serem processados.</p><p>As funções podem ter um valor de retorno, que é opcional. Você especifica o tipo de retorno</p><p>da função usando -> TipoRetorno.</p><p>Funções com retorno múltiplo:</p><p>Em Rust, é possível retornar múltiplos valores usando uma tupla ou uma estrutura.</p><p>91. Escreva uma função recursiva para calcular o fatorial de um número.</p><p>Explicação da função:</p><p>A função fatorial recebe um número n como parâmetro e retorna o fatorial desse número.</p><p>Se n for igual a 0, o fatorial é 1, pois 0! = 1. Essa é a condição de parada da recursão.</p><p>Caso contrário, a função chama a si mesma com o argumento n - 1 e multiplica o resultado</p><p>por n. Isso acontece até que n seja reduzido a 0, quando a recursão para.</p><p>Exemplo de uso:</p><p>92. Implemente uma função recursiva para calcular a sequência de Fibonacci</p><p>até um determinado número.</p><p>A sequência de Fibonacci é uma sequência de números em que cada número é a soma dos</p><p>dois números anteriores. A função recursiva para calcular a sequência de Fibonacci até um</p><p>determinado número pode ser definida da seguinte forma:</p><p>A função fibonacci recebe um número n como parâmetro e retorna o valor do n-ésimo</p><p>elemento na sequência de Fibonacci.</p><p>Se n for igual a 0, retorna 0 (primeiro elemento da sequência).</p><p>Se n for igual a 1, retorna 1 (segundo elemento da sequência).</p><p>Caso contrário, a função chama a si mesma duas vezes, uma com o argumento n - 1 e outra</p><p>com o argumento n - 2, e retorna a soma dos dois resultados. Isso acontece até que n seja 0 ou 1,</p><p>quando a recursão para.</p><p>Exemplo de uso:</p><p>93. Crie uma função recursiva para verificar se um número é primo.</p><p>Para verificar se um número é primo de forma recursiva, podemos criar uma função que</p><p>realize a verificação de divisibilidade do número por todos os possíveis divisores menores ou</p><p>iguais à sua raiz quadrada.</p><p>Aqui está a implementação em Rust:</p><p>A função is_primo_recursivo é uma função auxiliar que verifica se um número é primo de</p><p>forma recursiva. Recebe dois parâmetros: numero é o número que queremos verificar se é primo,</p><p>e divisor é o valor que será decrementado a cada passo recursivo.</p><p>Se o divisor for menor ou igual a 1, a função retorna true, pois o número é primo.</p><p>Se o numero for divisível por divisor (ou seja, numero % divisor == 0), a função retorna</p><p>false, pois o número não é primo.</p><p>Caso contrário, a função chama a si mesma com o divisor decrementado em 1 e retorna o</p><p>resultado.</p><p>A função is_primo é a função principal que chama is_primo_recursivo. Ela verifica se o</p><p>número é menor ou igual a 1 (caso em que não é primo) e calcula a raiz quadrada do número,</p><p>que é o maior possível divisor a ser testado.</p><p>Em seguida, chama a função is_primo_recursivo com o número e a raiz quadrada como</p><p>parâmetros iniciais.</p><p>94. Desenvolva uma função recursiva para calcular a soma dos dígitos de um</p><p>número inteiro.</p><p>Para calcular a soma dos dígitos de um número inteiro de forma recursiva, podemos utilizar</p><p>uma função que vá extraindo o último dígito do número em cada chamada recursiva e somando-</p><p>o ao resultado acumulado.</p><p>Aqui está a implementação em Rust:</p><p>A função soma_digitos_recursiva é a função que calcula a soma dos dígitos de forma</p><p>recursiva. Recebe o parâmetro numero, que é o número inteiro cujos dígitos queremos somar.</p><p>Se o numero for igual a 0, a função retorna 0, pois não há dígitos a serem somados.</p><p>Caso contrário, a função obtém o último dígito do número utilizando o operador de resto (%</p><p>10), e soma esse dígito ao resultado da chamada recursiva com o número dividido por 10</p><p>(numero / 10). Isso remove o último dígito do número original, permitindo que a função</p><p>processe o próximo dígito na próxima chamada recursiva.</p><p>95. Escreva uma função recursiva para calcular a potência de um número</p><p>inteiro elevado a um expoente.</p><p>Para calcular a potência de um número inteiro elevado a um expoente de forma recursiva,</p><p>podemos utilizar uma função que realize a multiplicação do número por ele mesmo (aumentando</p><p>o expoente) até que o expoente atinja o valor desejado.</p><p>Aqui está a implementação em Rust:</p><p>A função potencia_recursiva é a função que calcula a potência de forma recursiva. Recebe</p><p>dois parâmetros: base é o número que será elevado ao expoente.</p><p>Se o expoente for igual a 0, a função retorna 1, pois qualquer número elevado a 0 é igual a 1.</p><p>Caso contrário, a função retorna a multiplicação da base pelo resultado da chamada recursiva</p><p>da função com a base e o expoente decrementado em 1. Isso aumenta o expoente em cada</p><p>chamada recursiva até que o valor desejado seja alcançado.</p><p>96. Implemente uma função recursiva para encontrar o máximo divisor comum</p><p>(MDC) de dois números.</p><p>Para encontrar o máximo divisor comum (MDC) de dois números de forma recursiva,</p><p>podemos utilizar o algoritmo de Euclides, que consiste em repetidamente aplicar a seguinte regra</p><p>até que o segundo número se torne igual a zero:</p><p>- Seja a o maior dos dois números e b o menor.</p><p>- O MDC de a e b é igual ao MDC de b e o resto da divisão de a por b.</p><p>Aqui está a implementação em Rust:</p><p>97. Crie uma função recursiva para inverter uma string.</p><p>Para inverter uma string de forma recursiva, podemos usar uma função que divida a string em</p><p>duas partes: o primeiro caractere e o restante da string. Em seguida, chamamos recursivamente a</p><p>função para o restante da string e, por fim, concatenamos o primeiro caractere no final do</p><p>resultado da chamada recursiva.</p><p>A função inverter_string_recursivo é a função que inverte a string de forma recursiva.</p><p>Recebe como parâmetro a string s.</p><p>Se a string estiver vazia (is_empty()), a função retorna uma nova string vazia (String::new()).</p><p>Caso contrário, a função pega o primeiro caractere da string (primeiro_caractere)</p><p>e o restante</p><p>da string (resto_da_string) usando a função chars() e o slicing de string &s[1..].</p><p>Em seguida, a função chama recursivamente inverter_string_recursivo passando</p><p>resto_da_string como argumento e concatena o primeiro_caractere invertido ao final do</p><p>resultado da chamada recursiva.</p><p>O processo de recursão continua até que a string esteja completamente invertida.</p><p>98. Desenvolva uma função recursiva para encontrar o menor valor em um</p><p>vetor.</p><p>A função menor_valor_recursivo é a função que encontra o menor valor em um vetor de</p><p>forma recursiva. Recebe como parâmetro o vetor vetor.</p><p>Se o vetor tiver apenas um elemento (vetor.len() == 1), a função retorna esse elemento como</p><p>o menor valor.</p><p>Caso contrário, a função pega o primeiro elemento do vetor (primeiro_elemento) e o restante</p><p>do vetor (resto_do_vetor) usando o slicing de vetor &vetor[1..].</p><p>Em seguida, a função chama recursivamente menor_valor_recursivo passando</p><p>resto_do_vetor como argumento e obtém o menor valor do restante do vetor</p><p>(menor_valor_do_resto).</p><p>Por fim, a função compara o primeiro_elemento com o menor_valor_do_resto e retorna o</p><p>menor valor entre os dois.</p><p>99. Escreva uma função recursiva para determinar se uma palavra é um</p><p>palíndromo.</p><p>Para determinar se uma palavra é um palíndromo de forma recursiva, podemos usar uma</p><p>função que divida a palavra em duas partes: o primeiro caractere e o restante da palavra. Em</p><p>seguida, chamamos recursivamente a função para o restante da palavra e, por fim, comparamos o</p><p>primeiro caractere com o último caractere do restante da palavra para verificar se eles são iguais.</p><p>Aqui está a implementação em Rust:</p><p>A função eh_palindromo_recursivo é a função que verifica se uma palavra é um palíndromo</p><p>de forma recursiva. Recebe como parâmetro a palavra palavra.</p><p>Se a palavra tiver um ou nenhum caractere (palavra.len() ) representando o resultado do jogo.</p><p>Primeiro, a função verifica se há um ganhador nas linhas, colunas e diagonais da matriz. Se</p><p>houver um ganhador, retorna o caractere 'X' ou 'O' correspondente.</p><p>Em seguida, a função verifica se o jogo ainda não terminou, ou seja, se há algum espaço vazio</p><p>na matriz. Se houver espaço vazio, retorna None.</p><p>Por fim, se não houver ganhador nem espaços vazios, significa que houve empate, e a função</p><p>retorna o caractere '-'.</p><p>Na função main, criamos um exemplo de jogo da velha e chamamos a função</p><p>verificar_ganhador para verificar o resultado. A saída exibirá o vencedor ou se houve empate ou</p><p>se o jogo ainda não terminou.</p><p>105. Palavras-primas: Escreva um algoritmo que verifique se uma palavra é</p><p>uma "palavra-prima". Uma palavra é considerada uma "palavra-prima" se a</p><p>soma dos valores das letras (em que 'a' = 1, 'b' = 2, etc.) é um número primo.</p><p>A função calcular_valor_letra recebe uma letra como parâmetro e retorna o valor</p><p>correspondente da letra. Por exemplo,</p><p>'a' retorna 1, 'b' retorna 2, e assim por diante.</p><p>A função eh_primo verifica se um número é primo. Se o número for menor ou igual a 1,</p><p>retorna falso. Caso contrário, itera de 2 até a metade do número e verifica se há algum divisor. Se</p><p>encontrar um divisor, retorna falso, caso contrário, retorna verdadeiro.</p><p>A função palavra_prima recebe uma palavra como parâmetro e calcula a soma dos valores</p><p>das letras utilizando a função calcular_valor_letra. Em seguida, verifica se essa soma é um</p><p>número primo utilizando a função eh_primo. Retorna verdadeiro se for primo e falso caso</p><p>contrário.</p><p>Na função main, criamos uma palavra de exemplo e chamamos a função palavra_prima para</p><p>verificar se é uma palavra-prima. A saída exibirá se a palavra é ou não uma palavra-prima.</p><p>106. Implemente um algoritmo que receba um número inteiro e gere a</p><p>sequência de Collatz para esse número. A sequência de Collatz é gerada</p><p>aplicando as seguintes regras: se o número é par, divida-o por 2; se o número é</p><p>ímpar, multiplique-o por 3 e some 1. Repita esse processo até chegar ao número</p><p>1.</p><p>A função collatz_sequence recebe um número inteiro n como parâmetro e gera a sequência</p><p>de Collatz para esse número, seguindo as regras descritas no enunciado.</p><p>Dentro da função collatz_sequence, utilizamos um laço while que continuará até que num</p><p>seja igual a 1, que é o ponto de parada da sequência de Collatz.</p><p>Em cada iteração do laço, imprimimos o valor atual de num (exceto na última iteração) e</p><p>aplicamos as regras de Collatz para obter o próximo valor de num.</p><p>Se num for par (ou seja, num % 2 == 0), dividimos por 2 (num /= 2), caso contrário,</p><p>multiplicamos por 3 e somamos 1 (num = num * 3 + 1).</p><p>Quando num finalmente atingir o valor 1, imprime-se "1" e o processo é concluído.</p><p>Na função main, solicitamos ao usuário que digite um número inteiro e lemos a entrada</p><p>fornecida.</p><p>Em seguida, tentamos converter a entrada para um número inteiro. Se for bem-sucedido,</p><p>chamamos a função collatz_sequence com o número fornecido. Caso contrário, exibimos uma</p><p>mensagem de erro se a entrada não for um número válido.</p><p>107. Faça um programa que solicite o CPF do usuário e então faça a validação</p><p>do mesmo.</p><p>A verificação de dígitos do CPF é feita por meio de cálculos matemáticos que envolvem os</p><p>dígitos do número. O CPF é composto por 11 dígitos, sendo os dois últimos os dígitos</p><p>verificadores. Esses dígitos têm a função de verificar se o número do CPF é válido.</p><p>Existem duas etapas na verificação dos dígitos do CPF: cálculo do primeiro dígito verificador</p><p>e cálculo do segundo dígito verificador.</p><p>Para calcular o primeiro dígito verificador, realiza-se o seguinte procedimento:</p><p>Multiplica-se cada dígito do CPF, do nono ao segundo dígito, pela sequência 10, 9, 8, 7, 6, 5,</p><p>4, 3, 2, respectivamente.</p><p>Soma-se os resultados obtidos no passo anterior.</p><p>Calcula-se o resto da divisão dessa soma por 11.</p><p>Se o resto for menor que 2, o primeiro dígito verificador é 0. Caso contrário, o primeiro dígito</p><p>verificador é 11 menos o resto.</p><p>Para calcular o segundo dígito verificador, realiza-se um procedimento semelhante, com a</p><p>diferença de que considera-se o primeiro dígito verificador no cálculo:</p><p>Multiplica-se cada dígito do CPF, do décimo ao segundo dígito, pela sequência 11, 10, 9, 8, 7,</p><p>6, 5, 4, 3, 2, respectivamente.</p><p>Soma-se os resultados obtidos no passo anterior, incluindo o produto do primeiro dígito</p><p>verificador pelo número 2.</p><p>Calcula-se o resto da divisão dessa soma por 11.</p><p>Se o resto for menor que 2, o segundo dígito verificador é 0. Caso contrário, o segundo dígito</p><p>verificador é 11 menos o resto.</p><p>Após obter os dígitos verificadores calculados, compara-se com os dígitos verificadores</p><p>fornecidos no CPF. Se os dígitos verificadores calculados forem iguais aos dígitos verificadores</p><p>fornecidos, o CPF é considerado válido</p><p>O programa solicita ao usuário que digite o seu CPF (apenas números) e lê a entrada.</p><p>Em seguida, removemos os possíveis espaços e quebras de linha no final da entrada usando</p><p>trim().</p><p>Verificamos se o tamanho da string após o trim() é igual a 11 (tamanho padrão do CPF) e se</p><p>todos os caracteres são dígitos numéricos usando cpf.chars().all(|c| c.is_digit(10)). Se a entrada</p><p>não atender a essas condições, o programa exibirá uma mensagem de CPF inválido e encerrará a</p><p>execução.</p><p>Convertemos os dígitos do CPF em um vetor de u32 chamado cpf_digits.</p><p>Chamamos a função validate_cpf para verificar se os dígitos verificadores são válidos.</p><p>Na função validate_cpf, calculamos o primeiro e o segundo dígito verificador utilizando o</p><p>algoritmo específico de validação do CPF.</p><p>Se os dígitos verificadores calculados forem iguais aos dígitos informados pelo usuário, a</p><p>função retorna true, indicando que o CPF é válido. Caso contrário, retorna false.</p><p>O programa exibirá a mensagem "CPF válido!" se o CPF for válido, ou "CPF inválido. Os</p><p>dígitos verificadores não correspondem." caso contrário.</p><p>Lista Completa de Exercícios</p><p>1. Escreva um programa que solicite ao usuário dois números e exiba a soma, subtração,</p><p>multiplicação e divisão entre eles.</p><p>2. Escreva um programa que calcule a média aritmética de dois números.</p><p>3. Crie um programa que calcule e exiba a média aritmética de três notas informadas pelo</p><p>usuário.</p><p>4. Escreva um programa que calcule a média geométrica entre três números informados pelo</p><p>usuário</p><p>5. Escreva um programa que calcule o IMC de um indivíduo, utilizando a fórmula IMC = peso /</p><p>altura²</p><p>6. Crie um programa que calcule e exiba o perímetro de um círculo, solicitando o raio ao usuário.</p><p>7. Escreva um programa que calcule a área de um círculo a partir do raio, utilizando a fórmula A</p><p>= πr²</p><p>8. Escreva um programa que calcule o delta de uma equação de segundo grau (Δ = b² - 4ac).</p><p>9. Escreva um programa que calcule o perímetro e a área de um retângulo, utilizando as fórmulas</p><p>P = 2(l + c) e A = lc, onde l é a largura e c é o comprimento</p><p>10. Escreva um programa que calcule o perímetro e a área de um triângulo, utilizando as</p><p>fórmulas P = a + b + c e A = (b * h) / 2, onde a, b e c são os lados do triângulo e h é a altura</p><p>relativa ao lado b.</p><p>11. Escreva um programa que calcule a velocidade média de um objeto, utilizando a fórmula v =</p><p>Δs/Δt, onde v é a velocidade média, Δs é a variação de espaço e Δt é a variação de tempo</p><p>12. Escreva um programa que calcule a energia cinética de um objeto em movimento, utilizando</p><p>a fórmula E = (mv²) / 2, onde E é a energia cinética, m é a massa do objeto e v é a velocidade.</p><p>13. Escreva um programa que calcule o trabalho realizado por uma força que atua sobre um</p><p>objeto, utilizando a fórmula T = F * d, onde T é o trabalho, F é a força aplicada e d é a distância</p><p>percorrida pelo objeto.</p><p>14. Escreva um programa que leia a posição x e y de dois pontos no plano cartesiano, e calcule a</p><p>distância entre ambos.</p><p>15. Crie um programa que solicite ao usuário o valor do raio de uma esfera e calcule e exiba o</p><p>seu volume.</p><p>16. Faça um programa que solicite a idade de uma pessoa e exiba se ela é maior de idade ou não.</p><p>17. Faça um programa que leia dois números e informe qual é o maior.</p><p>18. Escreva um programa que solicite três números ao usuário e exiba o maior deles.</p><p>19. Faça um programa que leia um número e informe se ele é par ou ímpar.</p><p>20. Faça um programa que leia um número e informe se ele é positivo, negativo ou zero.</p><p>21. Faça um programa que leia as notas de duas provas e informe se o aluno foi aprovado (nota</p><p>maior ou igual a 6) ou reprovado (nota menor que 6) em cada uma das provas.</p><p>22. Faça um programa que leia as notas de duas provas, calcule a média aritmética simples, e</p><p>informe se o aluno foi aprovado (média maior ou igual a 6) ou reprovado (média menor que 6).</p><p>23. Faça um programa que leia três números, e informe se a soma deles é divisível por 5 ou não.</p><p>24. Crie um programa que leia três números e verifique se a soma deles é positiva, negativa ou</p><p>igual a zero</p><p>25. Faça um programa que leia três números, e mostre eles na tela em ordem crescente.</p><p>26. Faça um programa que leia a idade de três pessoas e quantas delas é maior de idade (idade</p><p>maior ou</p><p>igual a 18).</p><p>27. Faça um programa que leia três números e informe se eles podem ser os lados de um</p><p>triângulo (a soma de dois lados deve ser sempre maior que o terceiro lado).</p><p>28. Faça um programa que leia o ano de nascimento de uma pessoa e informe se ela está apta a</p><p>votar (idade maior ou igual a 16 anos).</p><p>29. Faça um programa que leia a idade de uma pessoa e informe se ela não está apta a votar</p><p>(idade inferior a 16 anos), se está apta a votar, porém não é obrigada (16, 17 anos, ou idade igual</p><p>ou superior a 70 anos), ou se é obrigada (18 a 69 anos).</p><p>30. Faça um programa que leia três notas de um aluno e informe se ele foi aprovado (nota final</p><p>maior ou igual a 7), reprovado (nota final menor que 4) ou ficou de recuperação (nota final entre</p><p>4 e 7).</p><p>31. Faça um programa que solicite o nome de um dia da semana e exiba se é um dia útil</p><p>(segunda a sexta-feira) ou um dia de fim de semana (sábado e domingo).</p><p>32. Escreva um programa que solicite a altura e o peso de uma pessoa e calcule o seu índice de</p><p>massa corporal (IMC), exibindo a categoria correspondente (abaixo do peso, peso normal,</p><p>sobrepeso, obesidade, obesidade grave).</p><p>33. Escreva um programa que solicite um número inteiro e verifique se é divisível por 3 e por 5</p><p>ao mesmo tempo.</p><p>34. Crie um programa que solicite a idade de uma pessoa e exiba se ela é criança (0-12 anos),</p><p>adolescente (13-17 anos), adulto (18-59 anos) ou idoso (60 anos ou mais).</p><p>35. Faça um programa que solicite dois números e exiba se o primeiro é divisível pelo segundo.</p><p>36. Escreva um programa que exiba os números de 1 a 10 utilizando um laço de repetição</p><p>37. Escreva um programa que exiba todos os números de 1 a 100</p><p>38. Escreva um programa que exiba todos os números pares de 1 a 100.</p><p>39. Escreva um programa que exiba os números pares de 1 a 50 e os números ímpares de 51 a</p><p>100 utilizando um laço de repetição.</p><p>40. Crie um programa que solicite ao usuário um número e exiba a tabuada desse número</p><p>utilizando um laço de repetição.</p><p>41. Escreva um programa que imprima na tela a tabuada de todos os números de 1 a 10</p><p>42. Escreva um programa que solicite ao usuário um número N e exiba a soma de todos os</p><p>números de 1 a N.</p><p>43. Faça um programa que calcule e exiba a soma dos números pares de 1 a 100 utilizando um</p><p>laço de repetição.</p><p>44. Escreva um programa que calcule e exiba o valor da potência de um número informado pelo</p><p>usuário elevado a um expoente também informado pelo usuário, utilizando laços de repetição.</p><p>45. Escreva um programa que solicite ao usuário um número N e diga se o mesmo é primo ou</p><p>não.</p><p>46. Escreva um programa que solicite ao usuário um número N e exiba todos os números primos</p><p>menores que N.</p><p>47. Crie um programa que exiba os primeiros N números primos, onde N é informado pelo</p><p>usuário, utilizando um laço de repetição.</p><p>48. Crie um programa que exiba os primeiros N primeiros quadrados perfeitos, onde N é</p><p>informado pelo usuário, utilizando um laço de repetição.</p><p>49. Escreva um programa que solicite ao usuário dois números A e B e exiba todos os números</p><p>entre A e B.</p><p>50. Escreva um programa que leia números do usuário até que seja digitado um número</p><p>negativo, e exiba a soma dos números positivos.</p><p>51. Faça um programa que solicite ao usuário um número e exiba a sequência de Fibonacci até o</p><p>número informado utilizando um laço de repetição.</p><p>52. Escreva um programa que leia números do usuário até que seja digitado zero, e exiba a média</p><p>dos números digitados.</p><p>53. Escreva um programa que solicite ao usuário uma lista de números, até o usuário digitar o</p><p>número zero, e exiba o maior e o menor número da lista.</p><p>54. Escreva um programa que solicite ao usuário uma frase e exiba a quantidade de vogais na</p><p>frase.</p><p>55. Escreva um programa que solicite ao usuário um número e exiba os seus divisores.</p><p>56. Faça um programa que determine o menor múltiplo comum (MMC) entre dois números</p><p>informados pelo usuário.</p><p>57. Faça um programa que determine o máximo divisor comum (MDC) entre dois números</p><p>informados pelo usuário.</p><p>58. Faça um programa que calcule a série abaixo até o décimo elemento:</p><p>59. Reescreva o código do exercício anterior até que a diferença entre os termos seja inferior a</p><p>0,001.</p><p>60. Faça um programa que calcule o valor de seno utilizando a série de Taylor conforme equação</p><p>abaixo o décimo termo:</p><p>61. Crie um programa que leia um vetor de números inteiros e exiba a soma de todos os</p><p>elementos.</p><p>62. Faça um programa que leia um vetor de números inteiros e exiba o maior elemento presente</p><p>no vetor.</p><p>63. Escreva um programa que leia um vetor de números inteiros e exiba a média dos elementos.</p><p>64. Crie um programa que leia dois vetores de números inteiros com o mesmo tamanho e exiba</p><p>um novo vetor com a soma dos elementos correspondentes dos dois vetores.</p><p>65. Faça um programa que leia um vetor de números inteiros e verifique se ele está em ordem</p><p>crescente.</p><p>66. Escreva um programa que leia um vetor de números inteiros e exiba os elementos na ordem</p><p>inversa.</p><p>67. Crie um programa que leia um vetor de números inteiros e encontre o segundo maior</p><p>elemento presente no vetor.</p><p>68. Faça um programa que leia um vetor de números inteiros e exiba quantas vezes um número</p><p>específico aparece no vetor.</p><p>69. Escreva um programa que leia dois vetores de números inteiros com o mesmo tamanho e</p><p>exiba um novo vetor com os elementos resultantes da multiplicação dos elementos</p><p>correspondentes dos dois vetores.</p><p>70. Crie um programa que leia um vetor de números inteiros e verifique se todos os elementos</p><p>são pares.</p><p>71. Crie um programa que leia duas palavras e as concatene, exibindo a palavra resultante.</p><p>72. Faça um programa que receba uma palavra e exiba cada letra separadamente.</p><p>73. Crie um programa que receba uma frase e substitua todas as letras "a" por "e".</p><p>74. Escreva um programa que receba um nome e verifique se o mesmo começa com a letra "A".</p><p>75. Faça um programa que leia uma palavra e verifique se a mesma é palíndromo (se pode ser</p><p>lida da mesma forma de trás para frente).</p><p>76. Crie um programa que leia duas palavras e verifique se a segunda palavra é um anagrama da</p><p>primeira.</p><p>77. Escreva um programa que receba um nome completo e exiba somente o primeiro nome.</p><p>78. Faça um programa que receba uma frase e exiba a quantidade de espaços em branco</p><p>presentes na mesma.</p><p>79. Crie um programa que leia uma palavra e exiba a quantidade de vogais presentes na mesma.</p><p>80. Escreva um programa que receba um nome completo e exiba o sobrenome (último nome)</p><p>primeiro.</p><p>81. Faça um programa que preencha uma matriz 3x3 com valores informados pelo usuário e</p><p>exiba a soma dos valores da diagonal principal.</p><p>82. Faça um programa que preencha uma matriz 4x4 com valores aleatórios e exiba a matriz</p><p>transposta.</p><p>83. Faça um programa que leia duas matrizes 2x2 e exiba a soma das duas matrizes.</p><p>84. Faça um programa que preencha uma matriz 5x5 com números inteiros e exiba o maior valor</p><p>da matriz e a posição em que ele se encontra.</p><p>85. Faça um programa que leia uma matriz 3x3 e calcule a média dos valores presentes nas</p><p>posições pares (soma dos índices par) da matriz.</p><p>86. Faça um programa que preencha uma matriz 4x4 com números aleatórios e exiba a soma dos</p><p>valores presentes em cada linha e em cada coluna.</p><p>87. Faça um programa que leia uma matriz 3x3 e calcule o determinante da matriz.</p><p>88. Faça um programa que leia duas matrizes e dê como resposta a multiplicação entre elas. O</p><p>programa deverá observar se é possível ou não realizar a multiplicação entre as duas matrizes.</p><p>89. Faça um programa que leia uma matriz 4x4 e verifique se ela é uma matriz diagonal, isto é,</p><p>se todos os elementos fora da diagonal principal são iguais a zero.</p><p>90. Faça um programa que leia uma matriz m x n, indicando o local onde há minas de um jogo</p><p>de campo minado (sendo 0 para campo neutro, e 1 para locais onde haveriam minas), e o</p><p>programa deveria retornar uma matriz indicando, para cada posição, o número de minas nas</p><p>casas vizinhas.</p><p>91. Escreva uma função recursiva para calcular o fatorial de um número.</p><p>92. Implemente uma função recursiva para calcular a sequência de Fibonacci até um determinado</p><p>número.</p><p>93. Crie uma função recursiva para verificar se um número é primo.</p><p>94. Desenvolva uma função recursiva para calcular a soma dos dígitos de um número inteiro.</p><p>95. Escreva uma função recursiva para calcular a potência de um número inteiro elevado a um</p><p>expoente.</p><p>96. Implemente uma função recursiva para encontrar o máximo divisor comum (MDC) de dois</p><p>números.</p><p>97. Crie uma função recursiva para inverter uma string.</p><p>98. Desenvolva uma função recursiva para encontrar o menor valor em um vetor.</p><p>99. Escreva uma função recursiva para determinar se uma palavra é um palíndromo.</p><p>100. Implemente uma função recursiva para calcular a soma dos elementos de um vetor.</p><p>101. Escreva um programa que solicite ao usuário uma frase e exiba a frase de trás para frente</p><p>102. Faça o Algoritmo BubbleSort</p><p>103. Faça um algoritmo que resolva a Torre de Hanoi</p><p>104. Faça uma função que receba uma matriz 3x3 representando o jogo da velha, e verifique se</p><p>há um ganhador, se houve empate, ou se o jogo ainda não terminou.</p><p>105. Palavras-primas: Escreva um algoritmo que verifique se uma palavra é uma "palavra-</p><p>prima". Uma palavra é considerada uma "palavra-prima" se a soma dos valores das letras (em</p><p>que 'a' = 1, 'b' = 2, etc.) é um número primo.</p><p>106. Implemente um algoritmo que receba um número inteiro e gere a sequência de Collatz para</p><p>esse número. A sequência de Collatz é gerada aplicando as seguintes regras: se o número é par,</p><p>divida-o por 2; se o número é ímpar, multiplique-o por 3 e some 1. Repita esse processo até</p><p>chegar ao número 1.</p><p>107. Faça um programa que solicite o CPF do usuário e então faça a validação do mesmo.</p><p>Conteúdo Adicional</p><p>Caso você queira acessar o código de todos os exercícios, você pode obtê-lo no link abaixo:</p><p>https://forms.gle/G4Ux7bFtM8bgaPN2A</p><p>Cada arquivo está nomeado com o número do exercício, com a extensão .rs</p><p>https://forms.gle/G4Ux7bFtM8bgaPN2A</p><p>Sobre o Autor</p><p>Ruhan Avila da Conceição (@ruhanconceicao, nas redes sociais) é formado em Engenharia</p><p>de Computação (2015) pela Universidade Federal de Pelotas e Mestre em Computação (2016)</p><p>também pela mesma universidade. Desde 2018 é professor do Instituto Federal de Educação,</p><p>Ciência e Tecnologia Sul-rio-grandense na área de Informática, onde ministra, entre outras, as</p><p>disciplinas de Programação Orientada a Objetos, Programação Visual e Programação de</p><p>Dispositivos Móveis.</p><p>Em 2014, ainda quando aluno de graduação, Ruhan recebeu o título de Pesquisador Gaúcho</p><p>na categoria Jovem Inovador por conta de sua trajetória acadêmica e científica durante seus anos</p><p>na universidade. Seu tema de pesquisa sempre foi relacionado ao desenvolvimento algorítmico</p><p>de soluções eficientes para codificação de vídeos em tempo real. Ainda com relação à pesquisa</p><p>científica, Ruhan acumula dezenas de trabalhos publicados em congressos nacionais e</p><p>internacionais, bem como artigos em revistas científicas de grande relevância, e dois programas</p><p>de computador registrados no Instituto Nacional de Propriedade Intelectual.</p><p>Iniciado na programação na linguagem C, Ruhan Conceição possui amplo conhecimento nas</p><p>linguagens JavaScript, bem como suas bibliotecas e frameworks ReactJS, React Native, NextJS;</p><p>e Java. Além disso, o autor também já desenvolveu projetos em C#, Matlab, GoogleScript e C++.</p><p>Dentre os seus hobbies, Ruhan Conceição possui um podcast denominado R-Cast (@rcasttv</p><p>nas redes sociais), onde leva convidados para conversarem sobre diversos assuntos, incluindo:</p><p>tecnologia, política, educação, saúde, cultura, música, etc.</p><p>Outras obras de Ruhan Conceição</p><p>Dominando JavaScript: 100 exercícios resolvidos e comentados para acelerar seu</p><p>aprendizado</p><p>Neste livro, são apresentados 100 exercícios de lógica de programação em</p><p>JavaScript, todos resolvidos e comentados. Em diversos exercícios, são apresentadas</p><p>mais de uma solução, para que você possa comparar as diversas formas de resolver</p><p>um problema programando.</p><p>https://a.co/d/gqdNgnj</p><p>Dominando Java: 100+ Exercícios Resolvidos e Comentados para Acelerar seu</p><p>Aprendizado</p><p>https://a.co/d/gqdNgnj</p><p>Neste livro, são apresentados MAIS DE 100 EXERCÍCIOS de lógica de</p><p>programação em Java, todos resolvidos e comentados.</p><p>https://a.co/d/biqW8Fm</p><p>Dominando Python: 100+ Exercícios Resolvidos e Comentados para Acelerar seu</p><p>Aprendizado</p><p>Assim como nos demais, neste livro são apresentados mais de 100 exercícios de</p><p>lógica de programação em Python, todos resolvidos e comentados. Em diversos</p><p>exercícios, são apresentadas mais de uma solução para que você possa comparar as</p><p>diversas formas de resolver um problema programando.</p><p>https://a.co/d/g8CIFgP</p><p>https://a.co/d/biqW8Fm</p><p>https://a.co/d/g8CIFgP</p><p>Introdução ao Rust</p><p>Introdução aos Exercícios</p><p>Fórmulas Matemáticas</p><p>Condicionais</p><p>Laços de Repetição</p><p>Vetores</p><p>Strings</p><p>Matrizes</p><p>Funções Recursivas</p><p>Exercícios Extras</p><p>Lista Completa de Exercícios</p><p>Conteúdo Adicional</p><p>Sobre o Autor</p><p>Arrays: Sequências fixas de elementos do mesmo tipo e tamanho definido em tempo de</p><p>compilação.</p><p>Os arrays em Rust são sequências fixas de elementos do mesmo tipo e tamanho definido em</p><p>tempo de compilação.</p><p>O tamanho do array é parte do seu tipo e não pode ser alterado.</p><p>Exemplo:</p><p>Neste exemplo, declaramos um array de tamanho 5 contendo valores inteiros. Os elementos</p><p>do array podem ser acessados pelo índice usando a notação de colchetes [].</p><p>Slices: Referências a partes de um array.</p><p>Slices são referências a uma sequência contígua de elementos de um array ou de uma</p><p>estrutura de dados semelhante. Permitem o acesso a uma parte específica do array sem copiar os</p><p>elementos.</p><p>Exemplo:</p><p>Neste exemplo, criamos um slice que contém os elementos do array original no intervalo de</p><p>índices de 1 a 2. O slice é uma referência imutável ao subconjunto dos elementos do array</p><p>original.</p><p>Sequência de Caracteres</p><p>String: representa uma sequência de caracteres dinâmica.</p><p>As strings em Rust são sequências de caracteres UTF-8. São coleções dinâmicas e mutáveis.</p><p>Permitem adicionar, remover e manipular caracteres.</p><p>Exemplo:</p><p>Tipos de coleção</p><p>Vec: um vetor dinâmico que armazena elementos do mesmo tipo T.</p><p>Os vetores são sequências dinâmicas de elementos do mesmo tipo T. Permitem adicionar,</p><p>remover e acessar elementos de forma eficiente. Podem crescer ou encolher dinamicamente.</p><p>Exemplo:</p><p>HashMap: uma tabela de hash que mapeia chaves do tipo K para valores do tipo V.</p><p>Os hash maps são estruturas de dados que mapeiam chaves do tipo K para valores do tipo V.</p><p>Permitem adicionar, remover e buscar elementos de forma eficiente. Os elementos são</p><p>armazenados de forma desordenada.</p><p>Exemplo:</p><p>HashSet: uma coleção de valores únicos do tipo T.</p><p>Os hash sets são coleções de valores únicos do tipo T. Permitem adicionar, remover e</p><p>verificar a existência de elementos de forma eficiente. Não garantem uma ordem específica dos</p><p>elementos.</p><p>Exemplo:</p><p>Tipo Option</p><p>Em Rust, o tipo Option é uma enumeração genérica que representa um valor opcional.</p><p>Ele é usado quando um valor pode estar presente ou ausente, ou seja, quando existe a</p><p>possibilidade de um resultado ser nulo ou vazio.</p><p>O tipo Option tem dois valores possíveis:</p><p>- Some(T): Representa a presença de um valor do tipo T. O valor é armazenado dentro do</p><p>enum.</p><p>- None: Representa a ausência de um valor. Não há nenhum valor armazenado dentro do</p><p>enum.</p><p>O tipo Option é frequentemente utilizado para evitar erros de referência nula (null) e</p><p>fornecer uma maneira segura de lidar com valores opcionais.</p><p>Aqui estão alguns exemplos de uso do tipo Option em Rust:</p><p>No exemplo acima, temos uma função divide que retorna um Option. Se o segundo</p><p>parâmetro for diferente de zero, a função retorna Some(resultado), caso contrário, retorna None.</p><p>No main(), chamamos a função divide duas vezes e verificamos o resultado usando o match e o</p><p>if let para lidar com o valor Option.</p><p>O tipo Option permite que você trate explicitamente a possibilidade de um valor estar</p><p>ausente, evitando erros de referência nula e fornecendo uma maneira segura de lidar com valores</p><p>opcionais.</p><p>Tipo Result</p><p>Em Rust, o tipo Result é uma enumeração genérica que representa o resultado de uma</p><p>operação que pode ser bem-sucedida (Ok(T)) ou resultar em um erro (Err(E)). É usado para</p><p>tratar de maneira robusta situações em que uma função pode falhar.</p><p>O tipo Result tem dois valores possíveis:</p><p>- Ok(T): Representa o resultado bem-sucedido da operação, com um valor do tipo T.</p><p>- Err(E): Representa um erro ocorrido durante a operação, com um valor do tipo E.</p><p>O tipo Result é amplamente utilizado em Rust para tratar erros de forma segura e</p><p>fornecer informações sobre o motivo da falha.</p><p>Aqui estão alguns exemplos de uso do tipo Result em Rust:</p><p>Além desses tipos básicos, Rust também oferece recursos avançados, como tipos enumerados</p><p>(enum), estruturas (structs), traits (interfaces) e tipos genéricos, que permitem maior</p><p>flexibilidade e reutilização de código.</p><p>É importante observar que Rust é uma linguagem estaticamente tipada, o que significa que o</p><p>tipo de todas as variáveis e expressões deve ser conhecido em tempo de compilação. O</p><p>compilador Rust é capaz de inferir muitos tipos automaticamente, mas às vezes é necessário</p><p>especificá-los explicitamente.</p><p>Esses são apenas alguns dos tipos de dados disponíveis em Rust. A linguagem oferece uma</p><p>variedade de opções para representar e manipular diferentes tipos de valores, permitindo um</p><p>controle preciso sobre a memória e garantindo segurança e eficiência em tempo de compilação.</p><p>Ponteiros e Referências</p><p>Em Rust, os conceitos de ponteiros e referências são fundamentais para garantir a segurança e</p><p>a ausência de erros de memória. Embora a linguagem não permita que os desenvolvedores</p><p>trabalhem diretamente com ponteiros como em linguagens de baixo nível, ela oferece uma</p><p>abordagem mais segura para manipulação de memória por meio de referências.</p><p>Referências:</p><p>Em Rust, as referências são utilizadas para criar uma "ligação" ou "acesso emprestado" a um</p><p>valor, permitindo que você o acesse e manipule sem assumir a propriedade desse valor.</p><p>As referências são criadas usando o operador &, seguido do valor ao qual você deseja fazer</p><p>referência.</p><p>Uma referência pode ser imutável (apenas leitura) ou mutável (permitindo modificações).</p><p>Empréstimo (Borrowing):</p><p>Rust segue o conceito de "empréstimo" de valores por meio de referências. Isso significa que</p><p>um valor só pode ser mutado por uma única referência mutável em um determinado contexto,</p><p>evitando assim o acesso concorrente e os problemas de sincronização.</p><p>A duração de uma referência é limitada ao escopo onde ela é definida, garantindo que as</p><p>referências sejam válidas durante o tempo de vida do valor original.</p><p>Tempo de Vida (Lifetime):</p><p>O conceito de "tempo de vida" em Rust é importante para garantir que as referências sejam</p><p>válidas e seguras.</p><p>Os tempos de vida são anotados com apóstrofos ('a, 'b, etc.) e são usados para definir a</p><p>relação entre as referências e os valores originais.</p><p>Isso é importante ao trabalhar com funções e estruturas que contêm referências, garantindo</p><p>que as referências existam pelo tempo necessário.</p><p>Ponteiros Inteligentes:</p><p>Embora Rust não permita o uso direto de ponteiros brutos (como em C ou C++), ele fornece</p><p>ponteiros inteligentes seguros, como Box para alocar dados no heap e Rc e Arc para</p><p>compartilhamento de dados entre múltiplas propriedades de forma segura e controlada.</p><p>Em resumo, Rust enfatiza a segurança e a prevenção de erros de memória, tornando o</p><p>gerenciamento de referências e ponteiros mais intuitivo e seguro para os desenvolvedores. A</p><p>abordagem de empréstimos e tempo de vida garante que o acesso aos dados seja feito de forma</p><p>segura e sem problemas de acesso concorrente, tornando Rust uma linguagem poderosa e</p><p>confiável para desenvolvimento de software.</p><p>Introdução aos Exercícios</p><p>Se você adquiriu este livro, você quer começar a programar e ser desafiado logicamente o</p><p>quanto antes, não querendo ler um sermão da montanha. Mas, é importante ressaltarmos</p><p>algumas coisas antes.</p><p>Por mais que diversos exercícios possam ser considerados fáceis, se você é novo nesta</p><p>jornada de programação, é importante você primeiramente tentar resolver o problema para então</p><p>ir para a resolução do mesmo. Existe mais de uma solução possível para o mesmo problema.</p><p>E, você precisa pensar e elaborar a sua solução. Então, você compara com a proposta no livro,</p><p>verifica quais potencialidade de cada uma, e tenta aprender um pouco mais.</p><p>Se o exercício for muito difícil, e não conseguir resolver, pule para o próximo, e tente</p><p>novamente no dia seguinte. Não vá de imediato para a resposta, mesmo que você não consiga</p><p>resolver, e muito menos vá para a resposta sem ao menos tentar.</p><p>Aprender lógica de programação não é obter a resposta, mas sim trilhar o caminho até</p><p>chegar na resposta.</p><p>Dito isto, os demais capítulos deste livro estão divididos de acordo com os tópicos</p><p>de</p><p>programação dos exercícios propostos:</p><p>● Fórmulas Matemáticas (15 exercícios)</p><p>● Condicionais (20 exercícios)</p><p>● Laços de Repetição (25 exercícios)</p><p>● Vetores (10 exercícios)</p><p>● Strings (10 exercícios)</p><p>● Matrizes (10 exercícios)</p><p>● Funções Recursivas (10 exercícios)</p><p>● + Exercícios Extras ao Final</p><p>Você pode conferir a lista completa de exercícios ao final do livro.</p><p>A partir de agora, é tudo com você!</p><p>Fórmulas Matemáticas</p><p>Antes de começar com os exercícios, e suas respectivas soluções comentadas, vamos fazer</p><p>uma breve introdução sobre alguns comandos e funções importantes para resolver os exercícios</p><p>deste capítulo.</p><p>Imprimindo dados na tela</p><p>Em Rust, existem várias maneiras de imprimir dados na tela. As principais formas de</p><p>imprimir dados no console são através das macros println!, print! e dbg!, bem como a função</p><p>eprintln!. Aqui está uma descrição de cada uma delas:</p><p>println!: Essa macro é usada para imprimir uma mensagem formatada no console e adiciona</p><p>uma nova linha após a impressão. Ela funciona de maneira semelhante à função printf em outras</p><p>linguagens. Exemplo:</p><p>print!: Essa macro é usada para imprimir uma mensagem formatada no console, mas sem</p><p>adicionar uma nova linha. Ela é útil quando você deseja imprimir várias mensagens na mesma</p><p>linha. Exemplo:</p><p>dbg!: Essa macro é usada para imprimir o valor de uma expressão no console para fins de</p><p>depuração. Ela é útil quando você deseja visualizar o valor de uma variável ou expressão durante</p><p>a execução do programa. Exemplo:</p><p>A saída seria algo como: src/main.rs:4 x + y = 15.</p><p>eprintln!: Essa função é usada para imprimir uma mensagem formatada no console de erro</p><p>padrão (stderr) e adiciona uma nova linha após a impressão. Ela é útil quando você deseja</p><p>imprimir mensagens de erro ou mensagens de diagnóstico. Exemplo:</p><p>A mensagem será impressa no console de erro padrão.</p><p>Essas são as principais maneiras de imprimir dados no console em Rust. Elas oferecem</p><p>flexibilidade para exibir mensagens formatadas, depurar valores e exibir mensagens de erro no</p><p>console. Escolha a abordagem adequada com base nas suas necessidades específicas.</p><p>Lendo informações do teclado</p><p>Em Rust, para ler informações do teclado a partir do console, você pode usar a função</p><p>std::io::stdin() e os métodos read_line() ou read_line() da struct std::io::BufRead. Aqui está um</p><p>exemplo de como ler uma linha de entrada do usuário:</p><p>Nesse exemplo, começamos importando o módulo std::io para ter acesso aos métodos de</p><p>leitura do console. Em seguida, exibimos uma mensagem solicitando ao usuário que digite seu</p><p>nome.</p><p>Criamos uma variável input do tipo String para armazenar a linha de entrada do usuário.</p><p>Usamos o método read_line() de stdin() para ler uma linha do console e armazená-la em input.</p><p>O método read_line() retorna um Result indicando se a leitura foi bem-sucedida ou não. Nesse</p><p>caso, usamos o método expect() para tratar um possível erro.</p><p>Por fim, usamos o método trim() em input para remover espaços em branco e quebras de</p><p>linha extras e exibimos a saudação personalizada com o nome digitado pelo usuário.</p><p>Dessa forma, você pode ler informações do teclado a partir do console em Rust e usar essas</p><p>informações em seu programa.</p><p>Leitura de valores numéricos</p><p>Para ler valores numéricos do teclado em Rust, você pode usar o método parse() da struct str</p><p>para converter a entrada de texto em um tipo numérico desejado. Aqui está um exemplo de como</p><p>ler um número inteiro do teclado:</p><p>Nesse exemplo, começamos importando o módulo std::io para ter acesso aos métodos de</p><p>leitura do console. Em seguida, exibimos uma mensagem solicitando ao usuário que digite um</p><p>número inteiro.</p><p>Criamos uma variável input do tipo String para armazenar a linha de entrada do usuário.</p><p>Usamos o método read_line() de stdin() para ler uma linha do console e armazená-la em input.</p><p>O método read_line() retorna um Result indicando se a leitura foi bem-sucedida ou não.</p><p>Em seguida, usamos o método trim() em input para remover espaços em branco e quebras de</p><p>linha extras. Em seguida, chamamos o método parse() da str para converter a string em um</p><p>número inteiro. Nesse caso, estamos usando o tipo i32, mas você pode usar outros tipos</p><p>numéricos, como u32, i64, f32, etc.</p><p>Se a conversão for bem-sucedida, o número será armazenado na variável number. Caso</p><p>contrário, se ocorrer um erro durante a conversão, a mensagem de erro "Falha ao converter para</p><p>número" será exibida.</p><p>Por fim, exibimos o número digitado pelo usuário usando o valor armazenado em number.</p><p>Dessa forma, você pode ler valores numéricos do teclado e convertê-los para o tipo desejado</p><p>em Rust.</p><p>Operações matemáticas</p><p>Em Rust, você pode realizar operações matemáticas usando os operadores e funções padrão</p><p>disponíveis na linguagem. Aqui estão alguns exemplos de operações matemáticas comuns em</p><p>Rust:</p><p>Neste exemplo, realizamos diversas operações matemáticas básicas. Utilizamos os operadores</p><p>+, -, * e / para adição, subtração, multiplicação e divisão, respectivamente. O operador % é usado</p><p>para obter o resto da divisão (módulo).</p><p>Também podemos usar a função i32::pow() para calcular potências de números inteiros. Essa</p><p>função recebe a base como o primeiro argumento e o expoente como o segundo argumento.</p><p>Além disso, mostramos um exemplo de operações matemáticas com números de ponto</p><p>flutuante, onde realizamos uma combinação de adição, multiplicação e precedência de</p><p>operadores.</p><p>Em Rust, para realizar operações matemáticas avançadas, como funções trigonométricas,</p><p>logarítmicas e exponenciais, você pode utilizar as funções e métodos disponíveis nos módulos e</p><p>bibliotecas específicas. A biblioteca padrão do Rust, std, fornece acesso a algumas dessas</p><p>funções matemáticas avançadas. Aqui estão alguns exemplos:</p><p>Neste exemplo, estamos usando o módulo std::f64::consts para acessar algumas constantes</p><p>matemáticas, como PI (π) e E (número de Euler).</p><p>Também utilizamos métodos disponíveis nos tipos de ponto flutuante (f64 no exemplo) para</p><p>realizar funções trigonométricas como sin(), cos() e tan(), e funções exponenciais e logarítmicas</p><p>como exp() e log10().</p><p>Além da biblioteca padrão, você pode usar bibliotecas externas específicas para matemática</p><p>avançada em Rust, como num, nalgebra, ndarray e outras. Essas bibliotecas fornecem</p><p>funcionalidades adicionais, como álgebra linear, processamento de sinais, estatística, entre</p><p>outros.</p><p>1. Escreva um programa que solicite ao usuário dois números e exiba a soma,</p><p>subtração, multiplicação e divisão entre eles.</p><p>Importamos o módulo io de std, que nos permite interagir com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Usamos a função println!() para exibir a mensagem "Digite o primeiro número:" e, em</p><p>seguida, usamos a função io::stdin().read_line() para ler a entrada do usuário e armazená-la na</p><p>variável input1. A função expect() é usada para lidar com possíveis erros na leitura da linha.</p><p>Convertemos a string input1 em um número de ponto flutuante (f64) usando o método trim()</p><p>para remover qualquer espaço em branco no início ou no final da string, e o método parse() para</p><p>fazer a conversão. Se a conversão falhar, o programa exibirá a mensagem "Entrada inválida".</p><p>Repetimos os passos 3 e 4 para solicitar e armazenar o segundo número na variável num2.</p><p>Calculamos a soma, subtração, multiplicação e divisão dos dois números e armazenamos os</p><p>resultados nas respectivas variáveis: soma, subtracao, multiplicacao e divisao.</p><p>Usamos a função println!() para exibir os resultados das operações. Os valores são inseridos</p><p>nas strings usando a sintaxe {}.</p><p>2. Escreva um programa que calcule a média aritmética de dois números.</p><p>Importamos o módulo io do crate std, que nos permite interagir com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Usamos a função println!() para exibir a mensagem "Digite o primeiro número:" e, em</p><p>seguida, usamos a função io::stdin().read_line() para ler a entrada do usuário e armazená-la na</p><p>variável input1. A função expect() é usada para lidar com</p><p>possíveis erros na leitura da linha.</p><p>Convertemos a string input1 em um número de ponto flutuante (f64) usando o método trim()</p><p>para remover qualquer espaço em branco no início ou no final da string, e o método parse() para</p><p>fazer a conversão. Se a conversão falhar, o programa exibirá a mensagem "Entrada inválida".</p><p>Repetimos os passos 3 e 4 para solicitar e armazenar o segundo número na variável num2.</p><p>Calculamos a média aritmética dos dois números, somando-os e dividindo o resultado por</p><p>2.0. Armazenamos o resultado na variável media.</p><p>Usamos a função println!() para exibir o resultado da média. O valor é inserido na string</p><p>usando a sintaxe {}.</p><p>3. Crie um programa que calcule e exiba a média aritmética de três notas</p><p>informadas pelo usuário.</p><p>Importamos o módulo io do crate std, que nos permite interagir com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Usamos a função println!() para exibir a mensagem "Digite a primeira nota:" e, em seguida,</p><p>utilizamos um loop loop para solicitar e armazenar a primeira nota do usuário. Dentro do loop,</p><p>uma nova linha é lida do usuário usando io::stdin().read_line() e armazenada em uma variável</p><p>input. Em seguida, a string lida é convertida em um número de ponto flutuante (f64) usando</p><p>input.trim().parse(). O método trim() remove quaisquer espaços em branco no início ou no final</p><p>da string e o método parse() faz a conversão. Se a conversão for bem-sucedida, o valor da nota é</p><p>retornado e o loop é interrompido com break. Caso contrário, uma mensagem de erro é exibida e</p><p>o loop continua, solicitando uma nova entrada ao usuário.</p><p>Repetimos estes passos para solicitar e armazenar a segunda e a terceira nota nas variáveis</p><p>nota2 e nota3.</p><p>Calculamos a média aritmética das três notas, somando-as e dividindo o resultado por 3.0.</p><p>Armazenamos o resultado na variável media.</p><p>Usamos a função println!() para exibir o resultado da média. O valor é inserido na string</p><p>usando a sintaxe {}.</p><p>O programa termina sua execução.</p><p>Declarando uma função para ler as notas</p><p>A função ler_nota() é definida dentro do bloco fn main() para tratar a leitura de uma nota.</p><p>Ela usa um loop para repetir a leitura até que seja fornecida uma entrada válida.</p><p>Dentro do loop, uma nova linha é lida do usuário usando io::stdin().read_line() e armazenada</p><p>em uma variável input.</p><p>Em seguida, a string lida é convertida em um número de ponto flutuante (f64) usando</p><p>input.trim().parse(). O método trim() remove quaisquer espaços em branco no início ou no final</p><p>da string e o método parse() faz a conversão. Se a conversão for bem-sucedida, a função retorna</p><p>a nota. Caso contrário, uma mensagem de erro é exibida e o loop continua, solicitando uma nova</p><p>entrada ao usuário.</p><p>4. Escreva um programa que calcule a média geométrica entre três números</p><p>informados pelo usuário</p><p>A média geométrica é calculada multiplicando-se todos os números e tirando a raiz enésima</p><p>do produto, onde "n" é o número total de elementos. Neste caso, como estamos calculando a</p><p>média geométrica de três números, elevamos o produto dos números a 1/3, que é o mesmo que</p><p>calcular a raiz cúbica.</p><p>A solução do problema é dada como segue:</p><p>Importamos o módulo io do crate std, que nos permite interagir com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Usamos a função println!() para exibir a mensagem "Digite o primeiro número:" e, em</p><p>seguida, usamos a função io::stdin().read_line() para ler a entrada do usuário e armazená-la na</p><p>variável input1. A função expect() é usada para lidar com possíveis erros na leitura da linha.</p><p>Convertemos a string input1 em um número de ponto flutuante (f64) usando o método trim()</p><p>para remover qualquer espaço em branco no início ou no final da string, e o método parse() para</p><p>fazer a conversão. Se a conversão falhar, o programa exibirá a mensagem "Entrada inválida".</p><p>Repetimos os passos anteriores para o segundo e terceiro números.</p><p>Calculamos a média geométrica dos três números usando a fórmula (num1 * num2 *</p><p>num3).powf(1.0 / 3.0), onde powf é a função exponencial que eleva o produto dos números à</p><p>potência de 1/3, obtendo a raiz cúbica. Armazenamos o resultado na variável media.</p><p>Usamos a função println!() para exibir o resultado da média geométrica. O valor é inserido na</p><p>string usando a sintaxe {}.</p><p>O programa termina sua execução.</p><p>5. Escreva um programa que calcule o IMC de um indivíduo, utilizando a</p><p>fórmula IMC = peso / altura²</p><p>Importamos o módulo io do crate std, que nos permite interagir com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Usamos a função println!() para exibir a mensagem "Digite o peso em quilogramas:" e, em</p><p>seguida, usamos a função io::stdin().read_line() para ler a entrada do usuário e armazená-la na</p><p>variável input_peso. A função expect() é usada para lidar com possíveis erros na leitura da linha.</p><p>Convertemos a string input_peso em um número de ponto flutuante (f64) usando o método</p><p>trim() para remover qualquer espaço em branco no início ou no final da string, e o método</p><p>parse() para fazer a conversão. Se a conversão falhar, o programa exibirá a mensagem "Entrada</p><p>inválida".</p><p>Repetimos os passos anteriores para solicitar e armazenar a altura em metros na variável</p><p>altura.</p><p>Calculamos o IMC dividindo o peso pelo quadrado da altura, ou seja, peso / (altura * altura).</p><p>Armazenamos o resultado na variável imc.</p><p>Usamos a função println!() para exibir o resultado do IMC. O valor é inserido na string</p><p>usando a sintaxe {}.</p><p>O programa termina sua execução.</p><p>6. Crie um programa que calcule e exiba o perímetro de um círculo, solicitando</p><p>o raio ao usuário.</p><p>Importamos o módulo io do crate std, que nos permite interagir com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Usamos a função println!() para exibir a mensagem "Digite o raio do círculo:" e, em seguida,</p><p>usamos a função io::stdin().read_line() para ler a entrada do usuário e armazená-la na variável</p><p>input_raio. A função expect() é usada para lidar com possíveis erros na leitura da linha.</p><p>Convertemos a string input_raio em um número de ponto flutuante (f64) usando o método</p><p>trim() para remover qualquer espaço em branco no início ou no final da string, e o método</p><p>parse() para fazer a conversão. Se a conversão falhar, o programa exibirá a mensagem "Entrada</p><p>inválida".</p><p>Calculamos o perímetro do círculo utilizando a fórmula 2 * π * raio, onde π (pi) é obtido</p><p>através de std::f64::consts::PI, uma constante fornecida pela biblioteca padrão de Rust para</p><p>representar o valor de pi.</p><p>Armazenamos o resultado do perímetro na variável perimetro.</p><p>Usamos a função println!() para exibir o resultado do perímetro do círculo. O valor é inserido</p><p>na string usando a sintaxe {}.</p><p>O programa termina sua execução.</p><p>7. Escreva um programa que calcule a área de um círculo a partir do raio,</p><p>utilizando a fórmula A = πr²</p><p>Importamos o módulo io do crate std, que nos permite interagir com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Usamos a função println!() para exibir a mensagem "Digite o raio do círculo:" e, em seguida,</p><p>usamos a função io::stdin().read_line() para ler a entrada do usuário e armazená-la na variável</p><p>input_raio. A função expect() é usada para lidar com possíveis erros na leitura da linha.</p><p>Convertemos a string input_raio em um número de ponto flutuante (f64) usando o método</p><p>trim() para remover qualquer espaço em branco no início ou no final da string, e o método</p><p>parse() para fazer a conversão. Se a conversão falhar, o programa exibirá a mensagem "Entrada</p><p>inválida".</p><p>Calculamos a área do círculo utilizando a fórmula π * raio * raio, onde π (pi) é obtido através</p><p>de std::f64::consts::PI, uma constante fornecida pela biblioteca padrão de Rust para representar</p><p>o valor de pi.</p><p>Armazenamos o resultado da área na variável area.</p><p>Usamos a função println!() para exibir o resultado da área do círculo. O valor é inserido na</p><p>string usando a sintaxe {}.</p><p>O programa termina sua execução.</p><p>8. Escreva um programa que calcule</p><p>o delta de uma equação de segundo grau</p><p>(Δ = b² - 4ac).</p><p>Importamos o módulo io do crate std, que nos permite interagir com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Usamos a função println!() para exibir a mensagem "Digite o valor de a:" e, em seguida,</p><p>usamos a função io::stdin().read_line() para ler a entrada do usuário e armazená-la na variável</p><p>input_a. A função expect() é usada para lidar com possíveis erros na leitura da linha.</p><p>Convertemos a string input_a em um número de ponto flutuante (f64) usando o método</p><p>trim() para remover qualquer espaço em branco no início ou no final da string, e o método</p><p>parse() para fazer a conversão. Se a conversão falhar, o programa exibirá a mensagem "Entrada</p><p>inválida".</p><p>Repetimos os passos anteriores para solicitar e armazenar o valor de b na variável b e o valor</p><p>de c na variável c.</p><p>Calculamos o delta utilizando a fórmula b * b - 4 * a * c.</p><p>Armazenamos o resultado do delta na variável delta.</p><p>Usamos a função println!() para exibir o resultado do delta da equação. O valor é inserido na</p><p>string usando a sintaxe {}.</p><p>O programa termina sua execução.</p><p>9. Escreva um programa que calcule o perímetro e a área de um retângulo,</p><p>utilizando as fórmulas P = 2(l + c) e A = lc, onde l é a largura e c é o</p><p>comprimento</p><p>Primeiramente, lembre-se de que o perímetro de um retângulo é a soma das medidas de todos</p><p>os seus lados e a área é o produto da largura pela altura.</p><p>Importamos o módulo io do crate std, que nos permite interagir com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Usamos a função println!() para exibir a mensagem "Digite a largura do retângulo:" e, em</p><p>seguida, usamos a função io::stdin().read_line() para ler a entrada do usuário e armazená-la na</p><p>variável input_largura. A função expect() é usada para lidar com possíveis erros na leitura da</p><p>linha.</p><p>Convertemos a string input_largura em um número de ponto flutuante (f64) usando o</p><p>método trim() para remover qualquer espaço em branco no início ou no final da string, e o</p><p>método parse() para fazer a conversão. Se a conversão falhar, o programa exibirá a mensagem</p><p>"Entrada inválida".</p><p>Repetimos os passos anteriores para solicitar e armazenar o comprimento do retângulo na</p><p>variável comprimento.</p><p>Calculamos o perímetro do retângulo utilizando a fórmula 2 * (largura + comprimento) e</p><p>armazenamos o resultado na variável perimetro.</p><p>Calculamos a área do retângulo utilizando a fórmula largura * comprimento e armazenamos</p><p>o resultado na variável area.</p><p>Usamos a função println!() para exibir o resultado do perímetro do retângulo. O valor é</p><p>inserido na string usando a sintaxe {}.</p><p>Usamos a função println!() novamente para exibir o resultado da área do retângulo.</p><p>O programa termina sua execução.</p><p>10. Escreva um programa que calcule o perímetro e a área de um triângulo,</p><p>utilizando as fórmulas P = a + b + c e A = (b * h) / 2, onde a, b e c são os lados</p><p>do triângulo e h é a altura relativa ao lado b.</p><p>Lembre-se de que o perímetro de um triângulo é a soma das medidas de todos os seus lados e</p><p>a área é metade do produto da base pelo valor da altura.</p><p>Importamos o módulo io do crate std, que nos permite interagir com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Usamos a função println!() para exibir a mensagem "Digite o lado a do triângulo:" e, em</p><p>seguida, usamos a função io::stdin().read_line() para ler a entrada do usuário e armazená-la na</p><p>variável input_lado_a. A função expect() é usada para lidar com possíveis erros na leitura da</p><p>linha.</p><p>Convertemos a string input_lado_a em um número de ponto flutuante (f64) usando o método</p><p>trim() para remover qualquer espaço em branco no início ou no final da string, e o método</p><p>parse() para fazer a conversão. Se a conversão falhar, o programa exibirá a mensagem "Entrada</p><p>inválida".</p><p>Repetimos os passos anteriores para solicitar e armazenar o lado b na variável lado_b, o lado</p><p>c na variável lado_c e a altura na variável altura.</p><p>Calculamos o perímetro do triângulo utilizando a fórmula lado_a + lado_b + lado_c e</p><p>armazenamos o resultado na variável perimetro.</p><p>Calculamos a área do triângulo utilizando a fórmula (lado_b * altura) / 2 e armazenamos o</p><p>resultado na variável area.</p><p>Usamos a função println!() para exibir o resultado do perímetro do triângulo. O valor é</p><p>inserido na string usando a sintaxe {}.</p><p>Usamos a função println!() novamente para exibir o resultado da área do triângulo.</p><p>O programa termina sua execução.</p><p>11. Escreva um programa que calcule a velocidade média de um objeto,</p><p>utilizando a fórmula v = Δs/Δt, onde v é a velocidade média, Δs é a variação de</p><p>espaço e Δt é a variação de tempo</p><p>Importamos o módulo io do crate std, que nos permite interagir com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Usamos a função println!() para exibir a mensagem "Digite a variação de espaço (Δs):" e,</p><p>em seguida, usamos a função io::stdin().read_line() para ler a entrada do usuário e armazená-la</p><p>na variável input_variacao_s. A função expect() é usada para lidar com possíveis erros na leitura</p><p>da linha.</p><p>Convertemos a string input_variacao_s em um número de ponto flutuante (f64) usando o</p><p>método trim() para remover qualquer espaço em branco no início ou no final da string, e o</p><p>método parse() para fazer a conversão. Se a conversão falhar, o programa exibirá a mensagem</p><p>"Entrada inválida".</p><p>Repetimos os passos anteriores para solicitar e armazenar a variação de tempo na variável</p><p>variacao_t.</p><p>Calculamos a velocidade média utilizando a fórmula variacao_s / variacao_t e armazenamos</p><p>o resultado na variável velocidade_media.</p><p>Usamos a função println!() para exibir o resultado da velocidade média. O valor é inserido na</p><p>string usando a sintaxe {}.</p><p>12. Escreva um programa que calcule a energia cinética de um objeto em</p><p>movimento, utilizando a fórmula E = (mv²) / 2, onde E é a energia cinética, m é</p><p>a massa do objeto e v é a velocidade.</p><p>Importamos o módulo io do crate std, que nos permite interagir com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Usamos a função println!() para exibir a mensagem "Digite a massa do objeto:" e, em</p><p>seguida, usamos a função io::stdin().read_line() para ler a entrada do usuário e armazená-la na</p><p>variável input_massa. A função expect() é usada para lidar com possíveis erros na leitura da</p><p>linha.</p><p>Convertemos a string input_massa em um número de ponto flutuante (f64) usando o método</p><p>trim() para remover qualquer espaço em branco no início ou no final da string, e o método</p><p>parse() para fazer a conversão. Se a conversão falhar, o programa exibirá a mensagem "Entrada</p><p>inválida".</p><p>Repetimos os passos anteriores para solicitar e armazenar a velocidade do objeto na variável</p><p>velocidade.</p><p>Calculamos a energia cinética utilizando a fórmula (massa * velocidade * velocidade) / 2.0 e</p><p>armazenamos o resultado na variável energia_cinetica.</p><p>Usamos a função println!() para exibir o resultado da energia cinética. O valor é inserido na</p><p>string usando a sintaxe {}.</p><p>O programa termina sua execução.</p><p>13. Escreva um programa que calcule o trabalho realizado por uma força que</p><p>atua sobre um objeto, utilizando a fórmula T = F * d, onde T é o trabalho, F é a</p><p>força aplicada e d é a distância percorrida pelo objeto.</p><p>Importamos o módulo io do crate std, que nos permite interagir com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Usamos a função println!() para exibir a mensagem "Digite a força aplicada:" e, em seguida,</p><p>usamos a função io::stdin().read_line() para ler a entrada do usuário e armazená-la na variável</p><p>input_forca. A função expect() é usada para lidar com possíveis erros na leitura da linha.</p><p>Convertemos a string input_forca em um número de ponto flutuante (f64) usando o método</p><p>trim() para remover qualquer espaço em branco no início ou no final da string, e o método</p><p>parse() para fazer a conversão. Se a conversão falhar, o programa exibirá a mensagem "Entrada</p><p>inválida".</p><p>Repetimos os passos anteriores</p><p>para solicitar e armazenar a distância percorrida pelo objeto</p><p>na variável distancia.</p><p>Calculamos o trabalho realizado utilizando a fórmula forca * distancia e armazenamos o</p><p>resultado na variável trabalho.</p><p>Usamos a função println!() para exibir o resultado do trabalho realizado. O valor é inserido</p><p>na string usando a sintaxe {}.</p><p>O programa termina sua execução.</p><p>14. Escreva um programa que leia a posição x e y de dois pontos no plano</p><p>cartesiano, e calcule a distância entre ambos.</p><p>Lembre-se de que o teorema de Pitágoras nos permite calcular a distância entre dois pontos</p><p>em um plano cartesiano usando as diferenças de coordenadas x e y e aplicando a fórmula da raiz</p><p>quadrada.</p><p>Importamos o módulo io do crate std, que nos permite interagir com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Usamos a função println!() para exibir a mensagem "Digite a posição do primeiro ponto (x1,</p><p>y1):" e, em seguida, usamos a função io::stdin().read_line() para ler a entrada do usuário e</p><p>armazená-la nas variáveis input_x1 e input_y1. A função expect() é usada para lidar com</p><p>possíveis erros na leitura da linha.</p><p>Convertemos as strings input_x1 e input_y1 em números de ponto flutuante (f64) usando o</p><p>método trim() para remover qualquer espaço em branco no início ou no final das strings, e o</p><p>método parse() para fazer a conversão. Se a conversão falhar, o programa exibirá a mensagem</p><p>"Entrada inválida". Os resultados são armazenados nas variáveis x1 e y1.</p><p>Repetimos os passos anteriores para solicitar e armazenar a posição do segundo ponto nas</p><p>variáveis input_x2, input_y2, x2 e y2.</p><p>Calculamos a distância entre os pontos utilizando a fórmula da distância euclidiana: a raiz</p><p>quadrada da soma dos quadrados das diferenças das coordenadas x e y dos pontos.</p><p>Exibimos o resultado da distância utilizando a função println!(). O valor é inserido na string</p><p>usando a sintaxe {}.</p><p>O programa termina sua execução.</p><p>15. Crie um programa que solicite ao usuário o valor do raio de uma esfera e</p><p>calcule e exiba o seu volume.</p><p>Importamos o módulo io do crate std, que nos permite interagir com a entrada e saída.</p><p>Importamos a constante PI do módulo std::f64::consts, que representa o valor de π (pi).</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Usamos a função println!() para exibir a mensagem "Digite o valor do raio da esfera:" e, em</p><p>seguida, usamos a função io::stdin().read_line() para ler a entrada do usuário e armazená-la na</p><p>variável input_raio. A função expect() é usada para lidar com possíveis erros na leitura da linha.</p><p>Convertemos a string input_raio em um número de ponto flutuante (f64) usando o método</p><p>trim() para remover qualquer espaço em branco no início ou no final da string, e o método</p><p>parse() para fazer a conversão. Se a conversão falhar, o programa exibirá a mensagem "Entrada</p><p>inválida".</p><p>Calculamos o volume da esfera utilizando a fórmula (4/3) * π * raio³, onde π é o valor de π</p><p>(pi) e raio.powi(3) calcula o raio elevado ao cubo.</p><p>Exibimos o resultado do volume utilizando a função println!(). O valor é inserido na string</p><p>usando a sintaxe {}.</p><p>O programa termina sua execução.</p><p>Condicionais</p><p>Antes de partirmos para os exercícios e suas respectivas soluções comentadas, vamos fazer</p><p>uma introdução sobre alguns conteúdos importantes para a resolução das atividades.</p><p>Comparadores Lógicos</p><p>Em Rust, os comparadores lógicos são usados para realizar operações de comparação entre</p><p>valores e produzir resultados booleanos. Aqui estão os comparadores lógicos mais comuns em</p><p>Rust:</p><p>Operador == (igual a):</p><p>O operador == verifica se dois valores são iguais. Ele retorna true se os valores forem iguais</p><p>e false caso contrário.</p><p>Operador != (diferente de):</p><p>O operador != verifica se dois valores são diferentes. Ele retorna true se os valores forem</p><p>diferentes e false caso contrário.</p><p>Operador > (maior que):</p><p>O operador > verifica se o valor à esquerda é estritamente maior que o valor à direita. Ele</p><p>retorna true se a comparação for verdadeira e false caso contrário.</p><p>Operador = (maior ou igual a):</p><p>O operador >= verifica se o valor à esquerda é maior ou igual ao valor à direita. Ele retorna</p><p>true se a comparação for verdadeira e false caso contrário.</p><p>Operador</p><p>que leia dois números e informe qual é o maior.</p><p>Importamos o módulo io do crate std, que nos permite interagir com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Usamos a função println!() para exibir a mensagem "Digite o primeiro número:" e, em</p><p>seguida, usamos a função io::stdin().read_line() para ler a entrada do usuário e armazená-la na</p><p>variável input_numero1. A função expect() é usada para lidar com possíveis erros na leitura da</p><p>linha.</p><p>Convertemos a string input_numero1 em um número inteiro (i32) usando o método trim()</p><p>para remover qualquer espaço em branco no início ou no final da string, e o método parse() para</p><p>fazer a conversão. Se a conversão falhar, o programa exibirá a mensagem "Entrada inválida".</p><p>Repetimos os passos anteriores para solicitar e armazenar o segundo número na variável</p><p>numero2.</p><p>Verificamos qual é o maior número usando uma estrutura de controle if e else. Se numero1</p><p>for maior que numero2, exibimos a mensagem "O maior número é: numero1". Se numero2 for</p><p>maior que numero1, exibimos a mensagem "O maior número é: numero2". Caso contrário,</p><p>exibimos a mensagem "Os números são iguais.".</p><p>O programa termina sua execução.</p><p>18. Escreva um programa que solicite três números ao usuário e exiba o maior</p><p>deles.</p><p>Importamos o módulo io do crate std, que nos permite interagir com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Usamos a função println!() para exibir a mensagem "Digite o primeiro número:" e, em</p><p>seguida, usamos a função io::stdin().read_line() para ler a entrada do usuário e armazená-la na</p><p>variável input_numero1. A função expect() é usada para lidar com possíveis erros na leitura da</p><p>linha.</p><p>Convertemos a string input_numero1 em um número inteiro (i32) usando o método trim()</p><p>para remover qualquer espaço em branco no início ou no final da string, e o método parse() para</p><p>fazer a conversão. Se a conversão falhar, o programa exibirá a mensagem "Entrada inválida".</p><p>Repetimos os passos anteriores para solicitar e armazenar o segundo e terceiro números nas</p><p>variáveis numero2 e numero3.</p><p>Utilizando uma estrutura de controle if e else, comparamos os três números para encontrar o</p><p>maior. O maior número é armazenado na variável maior_numero.</p><p>Exibimos o maior número utilizando a função println!(). O valor é inserido na string usando</p><p>a sintaxe {}.</p><p>O programa termina sua execução.</p><p>Considerações adicionais sobre a estrutura de controle</p><p>A expressão if é composta por duas condições separadas pelo operador lógico && (AND). A</p><p>primeira condição é numero1 >= numero2, que verifica se numero1 é maior ou igual a</p><p>numero2. A segunda condição é numero1 >= numero3, que verifica se numero1 é maior ou</p><p>igual a numero3. Ambas as condições devem ser verdadeiras para que o bloco de código seja</p><p>executado.</p><p>Se as duas condições forem verdadeiras, ou seja, se numero1 for maior ou igual a numero2 e</p><p>também maior ou igual a numero3, o valor de numero1 será atribuído à variável maior_numero.</p><p>Isso significa que numero1 é o maior número entre os três.</p><p>Caso a primeira condição não seja verdadeira, ou seja, se numero1 não for maior ou igual a</p><p>numero2, o programa passa para o próximo bloco else if. Nesse bloco, a condição numero2 >=</p><p>numero1 && numero2 >= numero3 é verificada para determinar se numero2 é o maior número.</p><p>Se essa condição for verdadeira, ou seja, se numero2 for maior ou igual a numero1 e também</p><p>maior ou igual a numero3, o valor de numero2 é atribuído à variável maior_numero.</p><p>Se nenhuma das duas primeiras condições for verdadeira, isso significa que o terceiro</p><p>número, numero3, é o maior entre os três. Portanto, o bloco else é executado, e o valor de</p><p>numero3 é atribuído à variável maior_numero.</p><p>Ao final, a variável maior_numero contém o maior valor entre os três números fornecidos</p><p>pelo usuário.</p><p>Note que dentro dos blocos de códigos, há apenas uma instrução numero1, numero2 ou</p><p>numero3 sem vírgula. Isto indica que o bloco de código retornará aquela variável para ser</p><p>atribuída na variável maior_numero. Isto é uma diferença importante da sintaxe de Rust com</p><p>relação às demais linguagens de programação.</p><p>19. Faça um programa que leia um número e informe se ele é par ou ímpar.</p><p>Importamos o módulo io do crate std, que nos permite interagir com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Usamos a função println!() para exibir a mensagem "Digite um número:" e, em seguida,</p><p>usamos a função io::stdin().read_line() para ler a entrada do usuário e armazená-la na variável</p><p>input_numero. A função expect() é usada para lidar com possíveis erros na leitura da linha.</p><p>Convertemos a string input_numero em um número inteiro (i32) usando o método trim()</p><p>para remover qualquer espaço em branco no início ou no final da string, e o método parse() para</p><p>fazer a conversão. Se a conversão falhar, o programa exibirá a mensagem "Entrada inválida".</p><p>Verificamos se o número é par ou ímpar usando o operador % (módulo). Se o resto da divisão</p><p>de numero por 2 for igual a 0, significa que o número é par. Caso contrário, é ímpar.</p><p>Utilizando uma estrutura de controle if e else, exibimos a mensagem apropriada na saída,</p><p>informando se o número é par ou ímpar.</p><p>O programa termina sua execução.</p><p>20. Faça um programa que leia um número e informe se ele é positivo, negativo</p><p>ou zero.</p><p>Importamos o módulo io do crate std, que nos permite interagir com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Usamos a função println!() para exibir a mensagem "Digite um número:" e, em seguida,</p><p>usamos a função io::stdin().read_line() para ler a entrada do usuário e armazená-la na variável</p><p>input_numero. A função expect() é usada para lidar com possíveis erros na leitura da linha.</p><p>Convertemos a string input_numero em um número inteiro (i32) usando o método trim()</p><p>para remover qualquer espaço em branco no início ou no final da string, e o método parse() para</p><p>fazer a conversão. Se a conversão falhar, o programa exibirá a mensagem "Entrada inválida".</p><p>Verificamos se o número é positivo, negativo ou zero usando uma estrutura de controle if,</p><p>else if e else. Se o número for maior que zero, ele é positivo. Se for menor que zero, é negativo.</p><p>Caso contrário, é zero.</p><p>Exibimos a mensagem apropriada na saída, informando se o número é positivo, negativo ou</p><p>zero.</p><p>21. Faça um programa que leia as notas de duas provas e informe se o aluno foi</p><p>aprovado (nota maior ou igual a 6) ou reprovado (nota menor que 6) em cada</p><p>uma das provas.</p><p>Importamos o módulo io do crate std, que nos permite interagir com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Usamos a função println!() para exibir a mensagem "Digite a nota da primeira prova:" e, em</p><p>seguida, usamos a função io::stdin().read_line() para ler a entrada do usuário e armazená-la na</p><p>variável input_nota1. A função expect() é usada para lidar com possíveis erros na leitura da</p><p>linha.</p><p>Convertemos a string input_nota1 em um número de ponto flutuante (f64) usando o método</p><p>trim() para remover qualquer espaço em branco no início ou no final da string, e o método</p><p>parse() para fazer a conversão. Se a conversão falhar, o programa exibirá a mensagem "Entrada</p><p>inválida".</p><p>Repetimos os passos anteriores para solicitar e armazenar a nota da segunda prova na variável</p><p>nota2.</p><p>Verificamos se a nota da primeira prova é maior ou igual a 6.0 usando uma estrutura de</p><p>controle if e else. Se a condição for verdadeira, ou seja, se a nota for maior ou igual a 6.0,</p><p>exibimos a mensagem "O aluno foi aprovado na primeira prova.". Caso contrário, exibimos a</p><p>mensagem "O aluno foi reprovado na primeira prova.".</p><p>Repetimos o mesmo processo para a nota da segunda prova.</p><p>22. Faça um programa que leia as notas de duas provas, calcule a média</p><p>aritmética simples, e informe se o aluno foi aprovado (média maior ou igual a</p><p>6) ou reprovado (média menor que 6).</p><p>Calculamos a média aritmética simples das notas somando as duas notas e dividindo o</p><p>resultado por 2.0.</p><p>Verificamos se a média é maior</p><p>ou igual a 6.0 usando uma estrutura de controle if e else. Se a</p><p>condição for verdadeira, ou seja, se a média for maior ou igual a 6.0, exibimos a mensagem "O</p><p>aluno foi aprovado. Média: valor_da_media". Caso contrário, exibimos a mensagem "O aluno</p><p>foi reprovado. Média: valor_da_media". O valor da média é exibido com duas casas decimais</p><p>utilizando a sintaxe {:.2}.</p><p>O programa termina sua execução.</p><p>23. Faça um programa que leia três números, e informe se a soma deles é</p><p>divisível por 5 ou não.</p><p>O processo de leitura dos números é semelhante ao dos exercícios anteriores.</p><p>Calculamos a soma dos três números, somando numero1, numero2 e numero3. Verificamos</p><p>se a soma é divisível por 5 usando o operador % (módulo). Se o resto da divisão da soma por 5</p><p>for igual a 0, significa que a soma é divisível por 5.</p><p>Utilizando uma estrutura de controle if e else, exibimos a mensagem apropriada na saída,</p><p>informando se a soma é divisível por 5 ou não.</p><p>O programa termina sua execução</p><p>24. Crie um programa que leia três números e verifique se a soma deles é</p><p>positiva, negativa ou igual a zero</p><p>A leitura dos números é semelhante aos exercícios anteriores.</p><p>Calculamos a soma dos três números, somando numero1, numero2 e numero3.</p><p>Verificamos se a soma é maior que zero, menor que zero ou igual a zero usando uma estrutura</p><p>de controle if, else if e else. Se a soma for maior que zero, exibimos a mensagem "A soma dos</p><p>números é positiva.". Se for menor que zero, exibimos a mensagem "A soma dos números é</p><p>negativa.". Caso contrário, exibimos a mensagem "A soma dos números é igual a zero.".</p><p>O programa termina sua execução.</p><p>25. Faça um programa que leia três números, e mostre eles na tela em ordem</p><p>crescente.</p><p>Importamos o módulo io do crate std, que nos permite interagir com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa. Usamos a função println!()</p><p>para exibir a mensagem "Digite o primeiro número:" e, em seguida, usamos a função</p><p>io::stdin().read_line() para ler a entrada do usuário e armazená-la na variável input_numero1. A</p><p>função expect() é usada para lidar com possíveis erros na leitura da linha.</p><p>Convertemos a string input_numero1 em um número inteiro (i32) usando o método trim()</p><p>para remover qualquer espaço em branco no início ou no final da string, e o método parse() para</p><p>fazer a conversão. Se a conversão falhar, o programa exibirá a mensagem "Entrada inválida".</p><p>Repetimos os passos anteriores para solicitar e armazenar o segundo e terceiro números nas</p><p>variáveis numero2 e numero3.</p><p>Utilizando estruturas de controle if e else, encontramos o menor número entre numero1,</p><p>numero2 e numero3, atribuindo o resultado à variável menor. Note que o bloco de código do if</p><p>(ou else) retorna o valor de maneira semelhante ao exercício 18.</p><p>Utilizando estruturas de controle if e else, também encontramos o maior número entre</p><p>numero1, numero2 e numero3, atribuindo o resultado à variável maior.</p><p>Calculamos o número do meio somando os três números e subtraindo o menor e o maior.</p><p>Utilizando as variáveis menor, meio e maior, exibimos os números em ordem crescente na</p><p>tela.</p><p>O programa termina sua execução.</p><p>26. Faça um programa que leia a idade de três pessoas e quantas delas é maior</p><p>de idade (idade maior ou igual a 18).</p><p>A leitura das idades é realizada de maneira semelhante aos exercícios anteriores.</p><p>Inicializamos a variável contador_maior_idade com o valor zero. Essa variável será usada</p><p>para contar quantas pessoas são maiores de idade.</p><p>Utilizando estruturas de controle if, verificamos se cada uma das idades é maior ou igual a 18.</p><p>Se a condição for verdadeira, incrementamos o valor da variável contador_maior_idade em 1.</p><p>Exibimos o resultado na tela utilizando a função println!(). O valor da variável</p><p>contador_maior_idade é exibido na mensagem.</p><p>O programa termina sua execução.</p><p>27. Faça um programa que leia três números e informe se eles podem ser os</p><p>lados de um triângulo (a soma de dois lados deve ser sempre maior que o</p><p>terceiro lado).</p><p>Verificamos as condições para formar um triângulo, que são: a soma de dois lados deve ser</p><p>sempre maior que o terceiro lado. Armazenamos o resultado dessas verificações nas variáveis</p><p>condicao1, condicao2 e condicao3. Note que essas variáveis são do tipo boolean.</p><p>Utilizando uma estrutura de controle if e else, verificamos se todas as condições são</p><p>verdadeiras. Se todas as condições forem verdadeiras, exibimos a mensagem "Os números</p><p>podem ser os lados de um triângulo.". Caso contrário, exibimos a mensagem "Os números não</p><p>podem ser os lados de um triângulo.".</p><p>28. Faça um programa que leia o ano de nascimento de uma pessoa e informe</p><p>se ela está apta a votar (idade maior ou igual a 16 anos).</p><p>Importamos os módulos io e chrono dos crates std e chrono, respectivamente. O módulo io</p><p>nos permite interagir com a entrada e saída, e o módulo chrono nos permite trabalhar com datas</p><p>e horários.</p><p>Definimos a função main() como ponto de entrada do programa. Utilizamos a função</p><p>Utc::now().year() do módulo chrono para obter o ano atual.</p><p>Usamos a função println!() para exibir a mensagem "Digite o ano de nascimento:" e, em</p><p>seguida, usamos a função io::stdin().read_line() para ler a entrada do usuário e armazená-la na</p><p>variável input_ano. A função expect() é usada para lidar com possíveis erros na leitura da linha.</p><p>Convertemos a string input_ano em um número inteiro (i32) usando o método trim() para</p><p>remover qualquer espaço em branco no início ou no final da string, e o método parse() para fazer</p><p>a conversão. Se a conversão falhar, o programa exibirá a mensagem "Entrada inválida".</p><p>Calculamos a idade da pessoa subtraindo o ano de nascimento do ano atual.</p><p>Utilizando uma estrutura de controle if e else, verificamos se a idade é maior ou igual a 16. Se</p><p>a condição for verdadeira, exibimos a mensagem "Você está apto(a) a votar.". Caso contrário,</p><p>exibimos a mensagem "Você não está apto(a) a votar.".</p><p>29. Faça um programa que leia a idade de uma pessoa e informe se ela não está</p><p>apta a votar (idade inferior a 16 anos), se está apta a votar, porém não é</p><p>obrigada (16, 17 anos, ou idade igual ou superior a 70 anos), ou se é obrigada</p><p>(18 a 69 anos).</p><p>Importamos o módulo io do crate std, que nos permite interagir com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Usamos a função println!() para exibir a mensagem "Digite a sua idade:" e, em seguida,</p><p>usamos a função io::stdin().read_line() para ler a entrada do usuário e armazená-la na variável</p><p>input_idade. A função expect() é usada para lidar com possíveis erros na leitura da linha.</p><p>Convertemos a string input_idade em um número inteiro sem sinal (u32) usando o método</p><p>trim() para remover qualquer espaço em branco no início ou no final da string, e o método</p><p>parse() para fazer a conversão. Se a conversão falhar, o programa exibirá a mensagem "Entrada</p><p>inválida".</p><p>Utilizando uma estrutura de controle if, else if e else, verificamos as condições para</p><p>determinar a aptidão para votar:</p><p>Se a idade for menor que 16, exibimos a mensagem "Você não está apto(a) a votar."</p><p>Se a idade estiver entre 16 e 17, inclusive, ou for igual ou superior a 70, exibimos a</p><p>mensagem "Você está apto(a) a votar, porém não é obrigado(a)."</p><p>Caso contrário, exibimos a mensagem "Você está apto(a) e obrigado(a) a votar."</p><p>30. Faça um programa que leia três notas de um aluno e informe se ele foi</p><p>aprovado (nota final maior ou igual a 7), reprovado (nota final menor que 4) ou</p><p>ficou de recuperação (nota final entre 4 e 7).</p><p>Importamos o módulo io do crate std, que nos permite interagir com a entrada e saída.</p><p>Definimos a função main() como ponto de entrada do programa.</p><p>Usamos a função println!() para exibir a mensagem "Digite a primeira nota:" e, em seguida,</p><p>usamos a função io::stdin().read_line() para ler a entrada do usuário e armazená-la na variável</p><p>input_nota1. A função expect() é usada para lidar com possíveis erros na leitura da linha.</p><p>Convertemos a string input_nota1 em um número de ponto flutuante (f64) usando o método</p><p>trim() para remover qualquer</p>