<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://pcdnaescola.com.br/feed.xml" rel="self" type="application/atom+xml" /><link href="https://pcdnaescola.com.br/" rel="alternate" type="text/html" /><updated>2026-04-17T20:10:41+00:00</updated><id>https://pcdnaescola.com.br/feed.xml</id><title type="html">PcD na Escola</title><subtitle>O PcD na Escola é um projeto que visa promover a educação e tecnologia para todas as pessoas, com foco na acessibilidade e inclusão de pessoas com deficiência.</subtitle><author><name>Louise Suelen</name></author><entry><title type="html">Teste de Equações Matemáticas Acessíveis</title><link href="https://pcdnaescola.com.br/teste-mathjax-acessivel/" rel="alternate" type="text/html" title="Teste de Equações Matemáticas Acessíveis" /><published>2026-04-02T00:00:00+00:00</published><updated>2026-04-02T00:00:00+00:00</updated><id>https://pcdnaescola.com.br/teste-mathjax-acessivel</id><content type="html" xml:base="https://pcdnaescola.com.br/teste-mathjax-acessivel/"><![CDATA[<h2 id="equação-inline">Equação inline</h2>

<p>A fórmula de Euler é considerada uma das mais elegantes da matemática: $e^{i\pi} + 1 = 0$. Ela conecta cinco constantes fundamentais.</p>

<h2 id="equação-em-bloco-display">Equação em bloco (display)</h2>

<p>A integral gaussiana é um resultado clássico da análise:</p>

\[\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}\]

<h2 id="fração-e-derivada">Fração e derivada</h2>

<p>A derivada do inverso de $x$ pode ser calculada assim:</p>

\[\frac{d}{dx}\left(\frac{1}{x}\right) = -\frac{1}{x^2}\]

<h2 id="delimitadores-alternativos">Delimitadores alternativos</h2>

<p>A função de Bessel de primeira espécie pode ser expressa usando colchetes:</p>

\[J_n(x) = \frac{1}{\pi} \int_0^\pi \cos(n\tau - x\sin\tau) d\tau\]

<h2 id="equações-simples">Equações simples</h2>

<p>A fórmula de Bhaskara para resolver equações quadráticas é dada por:</p>

\[x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}\]

<p>Onde $a$, $b$ e $c$ são os coeficientes da equação quadrática $ax^2 + bx + c = 0$.</p>

<p>O $\Delta$ da equação quadrática é calculado por:</p>

\[\Delta = b^2 - 4ac\]

<h2 id="equação-com-expoentes">Equação com expoentes</h2>

<p>A fórmula de crescimento exponencial é expressa por:</p>

\[P(t) = P_0 e^{rt}\]

<p>Onde $P(t)$ é a população no tempo $t$, $P_0$ é a população inicial, $r$ é a taxa de crescimento e $e$ é a base do logaritmo natural.</p>

<h2 id="equação-com-logaritmos">Equação com logaritmos</h2>

<p>A fórmula do logaritmo natural é dada por:</p>

\[\ln(x) = \int_1^x \frac{1}{t} dt\]

<h2 id="equação-com-somatório">Equação com somatório</h2>

<p>A fórmula do somatório para a série geométrica é:</p>

\[S_n = \sum_{k=0}^{n} ar^k = a \frac{1-r^{n+1}}{1-r}\]

<p>Onde $a$ é o primeiro termo, $r$ é a razão e $n$ é o número de termos.</p>

<h2 id="equação-com-matrizes">Equação com matrizes</h2>

<p>A multiplicação de matrizes é definida por:</p>

\[C = AB\]

<p>Onde $C_{ij} = \sum_{k=1}^{n} A_{ik} B_{kj}$ para matrizes $A$ de dimensão $m \times n$ e $B$ de dimensão $n \times p$.</p>

<h2 id="matriz-de-identidade">Matriz de identidade</h2>

<p>A matriz de identidade $I_n$ é uma matriz quadrada de ordem $n$ com 1’s na diagonal principal e 0’s em todas as outras posições:</p>

\[I_n = \begin{bmatrix}1 &amp; 0 &amp; \cdots &amp; 0 \\
0 &amp; 1 &amp; \cdots &amp; 0 \\
\vdots &amp; \vdots &amp; \ddots &amp; \vdots \\
0 &amp; 0 &amp; \cdots &amp; 1\end{bmatrix}\]

<h2 id="lógica">Lógica</h2>

<p>A tabela verdade para a conjunção lógica (AND) é:</p>

\[\begin{array}{c|c|c}
P &amp; Q &amp; P \land Q \\
\hline
V &amp; V &amp; V \\
V &amp; F &amp; F \\
F &amp; V &amp; F \\
F &amp; F &amp; F \\
\end{array}\]

<p>Os conectivos lógicos são fundamentais para a construção de expressões booleanas e circuitos digitais.</p>

<p>São eles:</p>

<ul>
  <li>Conjunção (AND): $P \land Q$</li>
  <li>Disjunção (OR): $P \lor Q$</li>
  <li>Negação (NOT): $\neg P$</li>
  <li>Implicação (IMPLIES): $P \rightarrow Q$</li>
  <li>Bicondicional (IFF): $P \leftrightarrow Q$</li>
  <li>XOR (Exclusive OR): $P \oplus Q$</li>
  <li>NAND (Not AND): $\overline{P \land Q}$</li>
  <li>NOR (Not OR): $\overline{P \lor Q}$</li>
</ul>

<h2 id="limites">Limites</h2>

<p>O limite fundamental do cálculo é:</p>

\[\lim_{x \to 0} \frac{\sin x}{x} = 1\]

<p>Limite no infinito: $\lim_{n \to \infty} \left(1 + \frac{1}{n}\right)^n = e$.</p>

<p>Limite superior e inferior de uma sequência:</p>

\[\limsup_{n \to \infty} a_n \geq \liminf_{n \to \infty} a_n\]

<h2 id="letras-gregas">Letras gregas</h2>

<p>O alfabeto grego é amplamente utilizado na matemática. Algumas letras minúsculas:</p>

\[\alpha, \beta, \gamma, \delta, \epsilon, \zeta, \eta, \theta, \iota, \kappa, \lambda, \mu\]

\[\nu, \xi, \pi, \rho, \sigma, \tau, \upsilon, \phi, \chi, \psi, \omega\]

<p>E suas versões maiúsculas: $\Gamma$, $\Delta$, $\Theta$, $\Lambda$, $\Xi$, $\Pi$, $\Sigma$, $\Phi$, $\Psi$, $\Omega$.</p>

<p>Variantes: $\varepsilon$, $\vartheta$, $\varphi$, $\varrho$, $\varsigma$.</p>

<h2 id="funções-hiperbólicas">Funções hiperbólicas</h2>

<p>As funções hiperbólicas são análogas às trigonométricas:</p>

\[\sinh x = \frac{e^x - e^{-x}}{2}, \quad \cosh x = \frac{e^x + e^{-x}}{2}, \quad \tanh x = \frac{\sinh x}{\cosh x}\]

<h2 id="logaritmo-com-base">Logaritmo com base</h2>

<p>A mudança de base do logaritmo é expressa por:</p>

\[\log_a b = \frac{\ln b}{\ln a}\]

<p>O logaritmo decimal: $\lg 100 = 2$.</p>

<h2 id="derivadas-de-ordem-superior">Derivadas de ordem superior</h2>

<p>A segunda derivada de $f$ em relação a $x$:</p>

\[\frac{d^2 f}{dx^2}\]

<p>A derivada parcial de segunda ordem:</p>

\[\frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} = 0\]

<p>Notação de linha para derivadas: $f’(x)$, $f’‘(x)$, $f’’‘(x)$.</p>

<h2 id="raízes">Raízes</h2>

<p>Raiz quadrada: $\sqrt{2}$. Raiz cúbica: $\sqrt[3]{27}$. Raiz quarta: $\sqrt[4]{16}$. Raiz quinta: $\sqrt[5]{x}$.</p>

<h2 id="conjuntos-numéricos">Conjuntos numéricos</h2>

<p>Os principais conjuntos numéricos são $\mathbb{N}$ (naturais), $\mathbb{Z}$ (inteiros), $\mathbb{Q}$ (racionais), $\mathbb{R}$ (reais) e $\mathbb{C}$ (complexos).</p>

\[\mathbb{N} \subset \mathbb{Z} \subset \mathbb{Q} \subset \mathbb{R} \subset \mathbb{C}\]

<h2 id="teoria-de-conjuntos">Teoria de conjuntos</h2>

<p>União e interseção: $A \cup B$, $A \cap B$. Diferença: $A \setminus B$. Conjunto vazio: $\varnothing$.</p>

<p>Pertinência e não pertinência: $x \in A$, $y \notin B$.</p>

<p>Subconjuntos: $A \subseteq B$, $A \supseteq B$, $A \not\subset B$.</p>

<h2 id="relações-de-comparação">Relações de comparação</h2>

\[a \leq b, \quad c \geq d, \quad e \neq f, \quad g \approx h, \quad i \equiv j\]

\[a \ll b, \quad c \gg d, \quad e \sim f, \quad g \cong h, \quad i \propto j\]

\[a \perp b, \quad c \parallel d\]

<h2 id="setas">Setas</h2>

<p>Setas simples: $\rightarrow$, $\leftarrow$, $\leftrightarrow$, $\uparrow$, $\downarrow$.</p>

<p>Setas duplas: $\Rightarrow$, $\Leftarrow$, $\Leftrightarrow$.</p>

<p>Mapeamento: $f \colon A \to B$, $x \mapsto f(x)$.</p>

<p>Setas estendidas: $\xrightarrow{f}$, $\xleftarrow[\text{abaixo}]{\text{acima}}$.</p>

<p>Setas diagonais: $\nearrow$, $\searrow$, $\swarrow$, $\nwarrow$.</p>

<p>Equilíbrio químico: $\rightleftharpoons$.</p>

<h2 id="binomial-e-fatorial">Binomial e fatorial</h2>

<p>O coeficiente binomial é dado por:</p>

\[\binom{n}{k} = \frac{n!}{k!(n-k)!}\]

<h2 id="casos-funções-por-partes">Casos (funções por partes)</h2>

<p>A função valor absoluto pode ser definida por casos:</p>

\[|x| = \begin{cases} x &amp; \text{se } x \geq 0 \\ -x &amp; \text{se } x &lt; 0 \end{cases}\]

<h2 id="matrizes">Matrizes</h2>

<p>Matriz com parênteses:</p>

\[A = \begin{pmatrix} 1 &amp; 2 \\ 3 &amp; 4 \end{pmatrix}\]

<p>Determinante:</p>

\[\det(A) = \begin{vmatrix} a &amp; b \\ c &amp; d \end{vmatrix} = ad - bc\]

<h2 id="produto-interno-e-norma">Produto interno e norma</h2>

<p>O produto interno é denotado por colchetes angulares:</p>

\[\langle u, v \rangle = \sum_{i=1}^{n} u_i v_i\]

<p>A norma de um vetor é dada por:</p>

\[\|v\| = \sqrt{\langle v, v \rangle}\]

<h2 id="piso-e-teto">Piso e teto</h2>

<p>As funções piso e teto são definidas por:</p>

\[\lfloor 3.7 \rfloor = 3, \quad \lceil 3.2 \rceil = 4\]

<h2 id="acentos-matemáticos">Acentos matemáticos</h2>

<p>Vetor: $\vec{v}$, $\overrightarrow{AB}$. Chapéu: $\hat{x}$, $\widehat{ABC}$. Barra: $\bar{x}$. Til: $\tilde{x}$. Ponto: $\dot{x}$, $\ddot{x}$.</p>

<h2 id="sobrescritos-e-subscritos-especiais">Sobrescritos e subscritos especiais</h2>

<p>Inverso: $A^{-1}$. Transposta: $A^T$. Graus: $90^{\circ}$.</p>

<p>Expoentes compostos: $e^{i\pi}$, $2^{2^n}$.</p>

<h2 id="números-decimais">Números decimais</h2>

<p>Constantes matemáticas: $\pi \approx 3.14159$, $e \approx 2.71828$, $\sqrt{2} \approx 1.41421$.</p>

<h2 id="razão-e-proporção">Razão e proporção</h2>

<p>A razão áurea: $a : b = b : (a + b)$.</p>

<h2 id="aritmética-modular">Aritmética modular</h2>

<p>O teorema de Fermat: $a^{p-1} \equiv 1 \pmod{p}$.</p>

<h2 id="quantificadores">Quantificadores</h2>

\[\forall \epsilon &gt; 0, \exists \delta &gt; 0 : |x - a| &lt; \delta \Rightarrow |f(x) - f(a)| &lt; \epsilon\]

<h2 id="negação-genérica">Negação genérica</h2>

<p>Exemplos de negação: $a \not\equiv b$, $A \not\subset B$, $x \not\in S$, $a \not\parallel b$.</p>

<h2 id="overset-underset-e-stackrel">Overset, underset e stackrel</h2>

\[A \overset{f}{\rightarrow} B, \quad \underset{n \to \infty}{\lim} a_n, \quad X \stackrel{\text{def}}{=} Y\]

<h2 id="operadores-grandes-adicionais">Operadores grandes adicionais</h2>

<p>Coprodutório: $\coprod_{i=1}^{n} G_i$. União grande: $\bigcup_{i=1}^{n} A_i$. Interseção grande: $\bigcap_{i=1}^{n} A_i$.</p>

<h2 id="frações-contínuas">Frações contínuas</h2>

<p>A fração contínua de $\sqrt{2}$:</p>

\[\sqrt{2} = 1 + \cfrac{1}{2 + \cfrac{1}{2 + \cfrac{1}{2 + \cdots}}}\]

<h2 id="operadores-diversos">Operadores diversos</h2>

<p>Produto tensorial: $V \otimes W$. Soma direta: $V \oplus W$. Composição: $f \circ g$. Divisão: $a \div b$.</p>

<p>Reticências: $1, 2, 3, \ldots, n$ e $1 + 2 + \cdots + n$.</p>

<p>Geometria: $\angle ABC = 90^{\circ}$, $\triangle ABC \sim \triangle DEF$.</p>

<p>Portanto e porque: $\therefore x = 1$, $\because x &gt; 0$.</p>

<h2 id="phantom-espaçamento-invisível">Phantom (espaçamento invisível)</h2>

<p>Alinhamento usando phantom: $\phantom{-}3$ e $-3$.</p>

<h2 id="álgebra-linear">Álgebra linear</h2>

<p>O núcleo e a imagem de uma transformação linear:</p>

\[\ker(T) = \{v \in V : T(v) = 0\}, \quad \dim(\ker(T)) + \dim(\text{Im}(T)) = \dim(V)\]

<h2 id="probabilidade-e-estatística">Probabilidade e estatística</h2>

\[\Pr(A \cup B) = \Pr(A) + \Pr(B) - \Pr(A \cap B)\]

<p>Parte real e imaginária: $\Re(z)$, $\Im(z)$.</p>

<h2 id="máximo-divisor-comum">Máximo divisor comum</h2>

\[\gcd(12, 18) = 6, \quad \lcm(4, 6) = 12\]]]></content><author><name>Louise Suelen</name></author><category term="teste" /><summary type="html"><![CDATA[Página de teste para verificar a renderização de expressões matemáticas com KaTeX e acessibilidade para leitores de tela via aria-label.]]></summary></entry><entry xml:lang="pt-BR"><title type="html">Leitores de Tela: Como Funcionam e Como Interpretam Interfaces Gráficas</title><link href="https://pcdnaescola.com.br/leitores-de-tela-como-funcionam-e-como-interpretam-interfaces-graficas/" rel="alternate" type="text/html" title="Leitores de Tela: Como Funcionam e Como Interpretam Interfaces Gráficas" /><published>2026-01-27T13:00:00+00:00</published><updated>2026-01-27T13:00:00+00:00</updated><id>https://pcdnaescola.com.br/leitores-de-tela-como-funcionam-e-como-interpretam-interfaces-graficas</id><content type="html" xml:base="https://pcdnaescola.com.br/leitores-de-tela-como-funcionam-e-como-interpretam-interfaces-graficas/"><![CDATA[<p>Este artigo explica o leitor de telas, tecnologia que possibilita o acesso digital para pessoas com deficiência visual. Apresenta seu histórico, funções e reforça a importância da inclusão.</p>

<div class="text-center">
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://imagedelivery.net/Ruw4waFkOelbXULIoE-oQg/8683514b-4aaa-4f9d-ea6f-81a32c2d7100/public" alt="" loading="lazy" aria-hidden="true" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

</div>

<h2 id="apresentacao">Apresentação</h2>
<hr />

<p>A evolução das interfaces do computador, que passaram dos terminais de texto para ambientes gráficos avançados, recursos 3D e dispositivos de computação ubíqua, trouxe desafios importantes para a inclusão de pessoas com deficiência visual. Nesse cenário, o leitor de telas se destaca como uma tecnologia assistiva essencial. Ele funciona como um intermediário entre o sistema operacional e a forma como a pessoa acessa o conteúdo, e por isso é uma ferramenta indispensável para a autonomia digital.</p>

<p>Este artigo apresenta a evolução histórica dos leitores de tela, explica conceitos fundamentais do seu funcionamento e descreve como essas ferramentas aparecem em diferentes plataformas. Também discute a diferença entre a usabilidade baseada na visão e a usabilidade baseada em recursos não visuais.</p>

<p>Além disso, destaca que a acessibilidade digital não depende apenas do leitor de telas. Ela é resultado da combinação entre aplicações (programas), frameworks (conjuntos de bibliotecas que ajudam a construir software), sistemas operacionais e mecanismos de acessibilidade que permitem que essas partes se comuniquem.</p>

<p>Mais do que um programa que “fala o que está na tela”, o leitor de telas é uma forma de interação com o ambiente digital para pessoas que não usam a visão como principal meio de acesso à informação. Em vez de depender de ícones, cores e posições na tela, a navegação acontece principalmente por voz e, em muitos casos, também por linhas Braille, que permitem a leitura tátil do conteúdo digital.</p>

<p>Com isso, torna-se possível ler textos, identificar botões, preencher formulários, acompanhar mensagens e usar diferentes tipos de aplicações. Na prática, essa tecnologia abre caminho para que pessoas com deficiência visual possam acessar serviços e funcionalidades comuns do dia a dia com mais independência.</p>

<p>Além dos leitores de tela tradicionais, ferramentas baseadas em inteligência artificial também têm ampliado possibilidades, principalmente em tarefas como descrição de imagens, leitura de conteúdos complexos e apoio à compreensão de contextos.</p>

<p>Ao contrário do que muitas pessoas imaginam, leitores de tela não leem tudo automaticamente do começo ao fim. O uso costuma ser guiado. A pessoa escolhe o que quer ouvir e para onde quer ir. É possível navegar por itens, campos de formulários, títulos, listas e menus, além de revisar um texto palavra por palavra. Com o tempo, forma-se um “mapa mental” do conteúdo, construído pela sequência de informações ou pelo Braille.</p>

<p>Tudo isso deixa claro que acessibilidade digital não é um detalhe nem um gesto de boa vontade. Quando sites, aplicativos e sistemas são desenvolvidos com cuidado, a experiência com leitor de telas tende a ser fluida. Botões têm nomes claros, campos explicam o que pedem, mensagens de erro dizem o que aconteceu e como resolver, e as etapas para concluir uma tarefa ficam mais fáceis de entender.</p>

<p>Por outro lado, quando a acessibilidade não é considerada, a autonomia diminui. Aparecem botões sem identificação, informações que dependem apenas de cor ou de imagem, conteúdos que mudam sem aviso e formulários difíceis de preencher usando apenas o teclado. Esses problemas são comuns e ajudam a explicar por que tantas pessoas com deficiência visual ainda enfrentam obstáculos em tarefas como comprar pela internet, acessar serviços públicos, estudar ou trabalhar.</p>

<p>Diante disso, busca-se apresentar o que é um leitor de telas, explicar seu papel no cotidiano e destacar as diferenças mais importantes entre a navegação visual e a navegação não visual, especialmente na internet e em aplicativos modernos. Ao longo do texto, também serão apresentados exemplos de práticas que ajudam ou atrapalham a usabilidade, além de uma visão geral das ferramentas mais utilizadas e das suas principais funcionalidades.</p>

<h2 id="um-pouco-de-historia-do-texto-a-interface-com-janelas">Um pouco de história: do texto à interface com janelas</h2>
<hr />

<p>A história dos leitores de tela está ligada, desde o início, à busca por autonomia no estudo e no trabalho de pessoas cegas, especialmente em áreas como matemática e ciência de dados no final do século XX. Em 1984, na IBM, Jim Thatcher e Jesse Wright discutiram como a tecnologia estava ficando cada vez mais visual e como isso poderia aumentar a exclusão de pessoas cegas.</p>

<p>Um exemplo claro dessa mudança foi a transição dos cartões perfurados para terminais de vídeo, que alterou profundamente a forma de interação com os computadores.</p>

<p>O surgimento dessa tecnologia ganhou um marco importante em 1986, com o lançamento do <strong>IBM Screen Reader</strong> para MS-DOS. Era um software simples, mas muito relevante para a época. Ele captava o conteúdo textual exibido pelo computador e transformava esse texto em fala sintetizada, com controle feito pelo teclado.</p>

<p>Como os computadores eram usados principalmente em modo texto, essa conversão era mais direta. O que aparecia na tela era, em grande parte, uma representação textual estruturada, o que facilitava que o leitor de telas “acompanhasse” a informação apresentada.</p>

<p>Nos anos 1990, esse cenário começou a mudar rapidamente. Pesquisas e relatos da época passaram a descrever uma espécie de “crise de acessibilidade”, causada pela popularização das interfaces gráficas, como as do Windows e do Macintosh. Antes, no DOS e em outros sistemas baseados em texto, a informação era apresentada de forma linear e fácil de transformar em fala.</p>

<p>Com as interfaces gráficas, a interação passou a depender muito mais de janelas, botões, ícones e imagens, que nem sempre tinham uma descrição textual clara para ser interpretada por tecnologias assistivas. Para lidar com esse novo contexto, leitores de tela precisaram evoluir.</p>

<p>Programas como o <abbr title="Job Access With Speech"><strong>JAWS</strong></abbr>, criado em 1989 pela Henter-Joyce, avançaram para reconhecer componentes da interface, como menus, janelas e elementos mais complexos. Aos poucos, esses leitores passaram a organizar e interpretar a interface de um jeito que pudesse ser entendido por áudio, auxiliando pessoas cegas e pessoas com baixa visão a compreender a lógica do sistema e a navegar com mais segurança.</p>

<p>No fim dos anos 1990, a consolidação da web trouxe uma nova onda de desafios. A internet ampliou o acesso à informação, mas também aumentou a dependência de conteúdos visuais e de páginas com estruturas variadas. Em 1997, o <abbr title="World Wide Web Consortium"><strong>W3C</strong></abbr> lançou a Iniciativa de Acessibilidade na Web (<abbr title="Web Accessibility Initiative"><strong>WAI</strong></abbr>), reforçando a ideia de que a força da web está em ser acessível para todas as pessoas.</p>

<p>A partir dos anos 2000, leitores de tela de código aberto passaram a se popularizar. Um exemplo importante é o <abbr title="NonVisual Desktop Access"><strong>NVDA</strong></abbr>, lançado em 2006, que contribuiu para tornar essas ferramentas mais acessíveis, já que antes as opções principais eram pagas e tinham preços elevados.</p>

<p>A seguir, serão destacados os principais eventos que impulsionaram a acessibilidade para pessoas com deficiência visual, acompanhando as transformações tecnológicas e o uso crescente de computadores e internet pela sociedade.</p>

<p class="small text-light mb-2" id="tabela-1-ajuda">Observação: em telas pequenas, deslize a tabela para o lado para visualizar todo o conteúdo.</p>
<div class="table-responsive">
<table class="table table-bordered table-striped table-hover table-dark text-white border-secondary" aria-describedby="tabela-1-ajuda"><thead>
    <tr>
        <th scope="col">Período ou Ano</th>
        <th scope="col">Marco Histórico</th>
        <th scope="col">Inovação Tecnológica</th>
        <th scope="col">Impacto na Acessibilidade</th>
    </tr>
</thead>
<tbody>
    <tr>
        <td>de 1984 a 1986</td>
        <td>Lançamento do IBM Screen Reader</td>
        <td>Interceptação de buffer de texto no ambiente MS-DOS e conversão para fala</td>
        <td>O início efetivo da participação de pessoas cegas na computação pessoal</td>
    </tr>
    <tr>
        <td>de 1989 a 1995</td>
        <td>Consolidação do leitor de telas JAWS</td>
        <td>Utilização de janelas e menus em ambientes gráficos (GUI)</td>
        <td>Fim do isolamento imposto pelo Windows 3.1/95, permitindo que pessoas cegas tivessem acesso a uma interface mais complexa</td>
    </tr>
    <tr>
        <td>1997</td>
        <td>Lançamento da Iniciativa de Acessibilidade na Web (WAI) pelo W3C</td>
        <td>Definição de diretrizes para tornar a web acessível</td>
        <td>Estabelecimento de padrões que orientam o desenvolvimento de conteúdo acessível para leitores de tela e outras tecnologias assistivas</td>
    </tr>
    <tr>
        <td>2006</td>
        <td>Lançamento do NVDA (NonVisual Desktop Access)</td>
        <td>Leitor de telas de código aberto e gratuito para Windows</td>
        <td>Democratização global do acesso sem custos de licença ao leitor de telas, ampliando a inclusão digital para pessoas com deficiência visual</td>
    </tr>
    <tr>
        <td>2009</td>
        <td>Lançamento do VoiceOver para Mac OS X e iOS</td>
        <td>Primeiro leitor de tela nativo em interface touchscreen</td>
        <td>Fim da dependência de teclados físicos para mobilidade. Acesso facilitado a smartphones e tablets para pessoas cegas</td>
    </tr>
    <tr>
        <td>de 2020 até hoje</td>
        <td>Era da IA Generativa</td>
        <td>Descrição de imagens via visão computacional e LLMs</td>
        <td>Resolução do problema crônico da falta de texto alternativo. Aumento da autonomia para acessar conteúdos visuais, como fotos, gráficos e memes, que antes eram inacessíveis para pessoas cegas</td>
    </tr>
    </tbody>
    </table>
</div>

<p>Esses são alguns dos marcos na história dos leitores de tela, embora existam outros avanços relevantes. Ao longo das décadas, esses dispositivos evoluíram para se adaptar às novas tecnologias e às necessidades de acessibilidade.</p>

<p>Hoje, os leitores de tela são fundamentais para a inclusão digital de pessoas com deficiência visual, proporcionando acesso autônomo a conteúdos e serviços online. Eles continuam a evoluir, incorporando recursos para melhorar a descrição de imagens e a compreensão de contextos, o que amplia ainda mais as possibilidades de acesso e participação na sociedade digital.</p>

<h2 id="como-o-leitor-de-telas-funciona-por-dentro">Como o leitor de telas funciona por dentro</h2>
<hr />

<p>Um leitor de telas moderno faz muito mais do que “ler o que está escrito”. Ele precisa entender o que cada parte da tela significa e em que situação ela está. Por exemplo, ele precisa diferenciar um botão de um link, saber se uma caixa de seleção está marcada ou desmarcada, identificar qual campo está com foco e avisar quando algo muda na tela.</p>

<p>Depois disso, ele transforma essas informações em uma sequência que a pessoa pode acompanhar por áudio ou, em muitos casos, por uma linha Braille. O importante é saber que ele é muito mais complexo do que parece, e que a qualidade da experiência depende muito de como o conteúdo foi estruturado e marcado por quem o desenvolveu.</p>

<h3 id="o-caminho-da-informacao-do-codigo-a-acessibilidade">O caminho da informação: do código à acessibilidade</h3>
<hr />

<p>Quando uma pessoa abre um site ou um aplicativo, o navegador ou o programa organiza o conteúdo internamente. No caso da web, o <abbr title="HyperText Markup Language em português: Linguagem de Marcação de Hipertexto"><strong>HTML</strong></abbr> é transformado em uma estrutura chamada <abbr title="Document Object Model em português: Modelo de Objeto de Documento"><strong>DOM</strong></abbr>, que é como um “mapa” do que existe na página.</p>

<div class="text-center">
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://imagedelivery.net/Ruw4waFkOelbXULIoE-oQg/fe5baa0a-17fc-48cc-4772-dd3f5a111d00/public" alt="Diagrama mostrando a transformação do HTML em DOM" loading="lazy" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

    <figcaption class="visually-hidden">
        A imagem é um infográfico em estilo de ilustração simples, com fundo bege claro e contornos em azul-escuro, organizado em três quadros numerados que explicam, passo a passo, o que acontece quando uma página web é aberta e como o HTML vira uma estrutura em forma de árvore.
        No primeiro quadro, no canto superior esquerdo, aparece o texto “1. A pessoa abre um site”. Abaixo, há o desenho de uma pessoa sentada de perfil diante de um notebook aberto, com as mãos próximas ao teclado. A tela do notebook mostra retângulos e linhas claras, sugerindo uma página carregada. A pessoa usa uma blusa amarela e está sentada em uma cadeira azul.
        No segundo quadro, no canto superior direito, está escrito “2. O navegador lê o HTML”. A ilustração mostra uma janela de navegador com barra superior e três círculos pequenos no canto (lembrando botões de janela).
        Dentro dessa janela aparece um trecho de código HTML em formato simplificado: &lt;html&gt; depois uma linha com &lt;h1&gt;Título&lt;/h1&gt; e outra linha com &lt;p&gt;Parágrafo&lt;/p&gt; e ao final &lt;/html&gt;, como se o navegador estivesse interpretando a marcação do documento.
        O terceiro quadro ocupa a parte inferior inteira e traz o título “3. O HTML é convertido em DOM”. À esquerda, há um ícone que lembra uma folha ou documento, com um cabeçalho em tom azulado e linhas horizontais indicando texto. Uma seta aponta desse documento para a direita, onde aparece um diagrama em forma de árvore (um organograma) representando o DOM: no topo está um oval com “html”, dele saem dois ramos para “head” e “body”. A partir de “body”, saem mais dois ramos para “h1” e “p”. Embaixo de “h1” há uma caixinha com a palavra “Titulo”, e embaixo de “p” outra caixinha com “Parágrafo”, reforçando que o conteúdo do HTML vira nós hierárquicos na estrutura do DOM.
    </figcaption>
</div>

<p>O DOM não é o formato ideal para tecnologias assistivas porque reúne muitos detalhes visuais e de formatação, o que pode tornar difícil a navegação por leitores de tela. Por isso, os navegadores costumam criar uma estrutura paralela chamada árvore de acessibilidade.</p>

<p>Nessa árvore, o conteúdo é apresentado de maneira simplificada, destacando apenas os elementos fundamentais para garantir uma compreensão e navegação mais fáceis. Por exemplo, um botão é identificado como tal, com seu nome e função, enquanto elementos decorativos ou de formatação podem ser ignorados.</p>

<div class="text-center">
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://imagedelivery.net/Ruw4waFkOelbXULIoE-oQg/95c4dbca-018d-463e-a380-589e724c0100/public" alt="Diagrama mostrando que a DOM não é o melhor formato para tecnologias assistivas" loading="lazy" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

    <figcaption class="visually-hidden">
    A imagem é um infográfico em estilo de ilustração simples, com fundo bege claro, traços em azul-escuro e elementos em tons de azul e amarelo. Ela está organizada em três quadros, explicando por que o DOM “puro” não é a melhor estrutura para navegação com leitor de telas e como o navegador cria uma árvore de acessibilidade para tornar essa navegação mais eficiente.
    No quadro superior, que ocupa toda a largura, aparece o texto “O DOM não é ideal para navegação com leitor de”. À esquerda desse quadro há um pequeno diagrama em forma de árvore com o nó “DOM” no topo, ramificando para “head” e “body”. Abaixo de “body” surgem dois nós representando o conteúdo: “Título” e “Parágrafo”, em caixas arredondadas. À direita, há o desenho de uma janela de navegador com uma área mostrando código HTML simplificado (com linhas como &lt;html&gt;, &lt;h1&gt;Título&lt;/h1&gt;, &lt;p&gt;Parágrafo&lt;/p&gt; e &lt;/html&gt;). Sobreposta à janela, existe uma representação de um bloco visual de página, com retângulos azuis sugerindo áreas de conteúdo. Entre o diagrama do DOM e a janela do navegador, há um balão com um ícone de alto-falante, indicando a saída de áudio típica de um leitor de telas ou de uma tecnologia assistiva.
    No quadro inferior esquerdo, o texto diz “O navegador cria uma árvore de acessibilidade”. Abaixo, aparece outro diagrama em árvore, agora mais simplificado, com o nó “raiz” no topo. Dele saem dois ramos para “Título” e “Parágrafo”. Abaixo do nó “Título” há uma pequena caixa com a palavra “Título” repetida, sugerindo o conteúdo exposto de forma mais direta e organizada. A ideia visual é mostrar que essa árvore de acessibilidade reduz o excesso de nós e prioriza elementos semânticos relevantes para navegação.
    No quadro inferior direito, está escrito “Essa árvore é usada para navegação mais eficiente”. A ilustração mostra o perfil de uma pessoa com fones de ouvido grandes, vestindo uma blusa amarela. À frente do rosto há três linhas curvas, como ondas sonoras, indicando que a pessoa está ouvindo informações — reforçando que, com a árvore de acessibilidade, a leitura e a navegação por voz ficam mais claras e eficientes do que depender do DOM completo e cheio de detalhes estruturais.
    </figcaption>
</div>

<div class="text-center">
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://imagedelivery.net/Ruw4waFkOelbXULIoE-oQg/b3027c85-4324-4b17-986f-d21bb27c4c00/public" alt="DOM versus árvore de acessibilidade: diferenças entre as estruturas" loading="lazy" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

    <figcaption class="visually-hidden">
        A imagem é um infográfico em fundo escuro, com texto em tons claros (branco e azul) e um layout dividido verticalmente em duas colunas, comparando “DOM” com “Árvore de Acessibilidade”. No topo, em letras grandes, está o título “DOM vs Árvore de Acessibilidade”. Uma linha vertical fina separa as duas áreas, deixando claro que é uma comparação lado a lado.
        Na coluna da esquerda, aparece o cabeçalho “DOM” e, logo abaixo, a frase “Uma estrutura completa com formatação”. Abaixo do texto, há um diagrama em forma de árvore com vários nós arredondados conectados por linhas, representando a complexidade do DOM. No topo dessa árvore está “html”, que se ramifica em “head” e “body”. A partir de “body”, surgem vários elementos e ramos, incluindo nós como “Título”, “descrição”, “p”, “div”, “ul”, “bt”, “OK”, “button” e “UI”, como se fossem tags e componentes misturados. Ao lado de uma parte do diagrama há um pequeno ícone azul, sugerindo que ali existe um detalhe extra ou um ponto de atenção, reforçando visualmente a ideia de “muita coisa” para navegar.
        Ainda na coluna esquerda, na parte inferior, existem três linhas que parecem trechos de código HTML exibidos como caixas horizontais. A primeira mostra algo como uma tag de imagem com atributo alt, por exemplo “&lt;img src=... alt="foto"&gt;”. A segunda mostra um botão com estilo, algo como “&lt;button style&gt;Enviar&lt;/button&gt;”, destacada com uma tonalidade mais azulada, como se estivesse selecionada ou enfatizada. A terceira mostra um elemento de texto escondido, “&lt;span class="visually-hide" oculto&gt;&lt;/span&gt;” (com a ideia de conteúdo visualmente oculto). Esses exemplos reforçam que o DOM contém marcação completa, estilos e elementos que podem não ser essenciais para a navegação auditiva.
        Na coluna da direita, o cabeçalho diz “Árvore de Acessibilidade” e abaixo vem a frase “Uma versão simplificada para leitores de tela”. O diagrama de árvore nessa coluna é bem mais enxuto. No topo está “raiz”, e dele saem nós como “Título” e “Botão OK”. Ao lado do diagrama há um ícone de alto-falante, indicando saída de voz/leitura. Mais abaixo, há uma região com a frase “Conteúdo essencial para navegação”, acompanhada de um pequeno ícone de acessibilidade (uma pessoa estilizada em um círculo azul). A árvore continua com itens como “Imagem” e “Descrição”, como se o conteúdo fosse reduzido ao que importa semanticamente para quem navega via leitor de telas.
        Na parte inferior da coluna direita, há uma pequena lista visual de elementos destacados, com rótulos como “Imagem” e “Botão”, e um trecho que indica “Enviar” com a anotação “role-button”, sugerindo que a árvore de acessibilidade expõe funções e papéis (roles) de forma clara para tecnologias assistivas. No rodapé central da imagem, atravessando abaixo das duas colunas, aparece a frase “Como o navegador transforma conteúdo para tecnologias assistivas”, resumindo a mensagem principal: o navegador pega a complexidade do DOM e gera uma estrutura mais direta e navegável para leitor de telas.
    </figcaption>
</div>

<p>A árvore de acessibilidade foca no conteúdo relevante, ignorando elementos decorativos ou sem função. Quando uma página usa marcações genéricas e não define papéis claros para títulos, botões, links ou imagens, o leitor de telas não consegue organizar a informação corretamente.</p>

<p>Para que o leitor de telas consiga apresentar um elemento corretamente, cada item dessa árvore de acessibilidade precisa ter informações básicas, como:</p>

<ul>
  <li>
    <p><strong>Nome:</strong> como o elemento deve ser chamado. Pode ser o texto de um botão, o rótulo de um campo ou a descrição de uma imagem. <strong>Exemplos:</strong> um botão de envio pode ter o nome “Enviar”, um campo de busca pode ser “Pesquisar produtos” e uma imagem de um gato pode ser “Foto de um gato preto com olhos verdes e orelhas pontudas”.</p>
  </li>
  <li>
    <p><strong>Função:</strong> identifica o tipo de elemento, como botão, link, caixa de seleção ou cabeçalho. <strong>Exemplos:</strong> um botão de envio tem a função “botão”, um campo de busca é um “campo de texto” e uma imagem corresponde à função “imagem”.</p>
  </li>
  <li>
    <p><strong>Estado:</strong> em que condição ele está naquele momento. <strong>Exemplos:</strong> um botão pode estar “desabilitado” ou “habilitado”, uma caixa de seleção pode estar “marcada” ou “desmarcada”, e um menu pode estar “expandido” ou “recolhido”.</p>
  </li>
  <li>
    <p><strong>Valor:</strong> informação variável quando faz sentido. <strong>Exemplos:</strong> um campo de formulário pode ter o valor “João Silva”, um controle de volume pode estar em “50%” e um indicador de progresso pode mostrar “75% concluído”.</p>
  </li>
</ul>

<h3 id="apis-de-acessibilidade-a-ponte-entre-o-sistema-e-o-leitor-de-telas"><abbr title="Application Programming Interface em Português: Interface de Programação de Aplicações">APIs</abbr> de acessibilidade: a ponte entre o sistema e o leitor de telas</h3>
<hr />

<p>O leitor de telas não fica “lendo o código” da página o tempo todo. Na maioria dos casos, ele conversa com o sistema operacional (Windows, macOS, Linux, Android, iOS) por meio de APIs de acessibilidade, que funcionam como uma ponte.</p>

<p>Na prática, os programas “avisam” coisas importantes, como qual botão está selecionado, qual campo está com foco, se uma opção está marcada, se um menu foi aberto ou se apareceu uma mensagem de erro. O leitor de telas consulta essas informações e transforma tudo em retorno para a pessoa, geralmente por voz e, em alguns casos, também por Braille.</p>

<p>Cada sistema operacional tem suas próprias tecnologias para essa comunicação. No Windows, por exemplo, essas soluções foram mudando e melhorando com o tempo. Ferramentas mais modernas, como o <strong>UI Automation</strong> (que é uma API de acessibilidade do Windows), ajudaram a tornar a troca de informações mais estável e mais completa, especialmente em programas e navegadores atuais.</p>

<p>No macOS também existe uma infraestrutura própria de acessibilidade, integrada ao sistema. No Linux, há um conjunto de tecnologias com o mesmo objetivo. Elas não são iguais entre si. Cada sistema tem suas particularidades e sua forma de expor informações para leitores de tela.</p>

<p>Isso tem um efeito direto no dia a dia. Quando uma interface é construída de um jeito correto, o navegador e o sistema conseguem explicar com clareza o que cada elemento é. Por exemplo, um botão de verdade é entendido como botão, com nome, estado e comportamento esperados.</p>

<p>Já quando a interface é montada com elementos genéricos e “simulações”, fica mais difícil para o leitor de telas entender o que aquilo realmente é. O resultado costuma ser uma experiência frágil, com informações incompletas, confusas ou até silenciosas em momentos importantes.</p>

<p>Por isso que em programação, componentes como botões, links e formulários devem ser construídos corretamente. Simulá-los apenas visualmente sem significado lógico prejudica a experiência de usuários de tecnologias assistivas, como leitores de tela.</p>

<h3 id="saida-por-voz-e-por-braille">Saída por voz e por Braille</h3>
<hr />

<p>Depois de entender a interface, o leitor de telas precisa transformar tudo em uma forma de retorno que a pessoa consiga acompanhar.</p>

<p>A forma mais comum é a síntese de voz, também chamada de <abbr title="Text-to-Speech em Português: Síntese de Texto para Fala"><strong>TTS</strong></abbr>. Esses recursos evoluíram muito com o tempo. As vozes antigas eram mais robóticas e pouco naturais. Hoje, existem modelos bem mais fluentes, com melhor entonação e com opções de velocidade, tom e pronúncia.</p>

<p>Outra forma muito importante é a linha Braille, um dispositivo que permite ler o conteúdo pelo tato. Nela, pequenos pinos sobem e descem para formar os caracteres em Braille, e esses caracteres mudam conforme a pessoa navega.</p>

<figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://imagedelivery.net/Ruw4waFkOelbXULIoE-oQg/565bfa8f-7969-40c8-5040-218b9caa7f00/public" alt="Linha Braille retangular, com acabamento prateado nas laterais e preto no centro. Ele possui uma fileira de 40 células Braille com pinos táteis e botões de entrada na parte superior, organizados em dois grupos de quatro para as mãos esquerda e direita. Dois botões retangulares alongados estão localizados na borda inferior." loading="lazy" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
        <figcaption id="figcaption-https-imagedelivery-net-ruw4wafkoelbxulioe-oqg-565bfa8f-7969-40c8-5040-218b9caa7f00-public" class="figure-caption text-center mt-4">
            <div class="d-inline-flex align-items-center bg-dark bg-opacity-50 rounded-pill px-4 py-3 figcaption-wrapper">
                <span class="text-light small figcaption-text">Linha Braille Brailliant HumanWare com 40 células, botões de entrada e navegação.</span>
            </div>
        </figcaption>
    
</figure>

<p>Esse recurso é especialmente útil quando é necessário alta precisão, como na programação, na revisão de textos, na leitura de símbolos e especificamente importante para a população surdocega.</p>

<p>Algumas linhas Braille usam células de 8 pontos, o que ajuda a representar letras maiúsculas, números e símbolos com mais flexibilidade, além de apoiar melhor conteúdos técnicos.</p>

<h2 id="quais-leitores-de-tela-existem-para-cada-sistema-operacional">Quais leitores de tela existem para cada sistema operacional?</h2>
<hr />

<p>Existem vários leitores de tela para diferentes sistemas operacionais, cada um com suas próprias funções. Alguns são nativos do sistema e outros exigem download.</p>

<p>Abaixo está uma tabela com os principais leitores de tela organizados por sistema operacional:</p>

<div class="table-responsive mb-4">
    <table class="table table-bordered table-dark" aria-labelledby="leitores-de-tela-por-sistema-operacional" aria-describedby="leitores-de-tela-por-sistema-operacional-desc">
        <caption id="leitores-de-tela-por-sistema-operacional" class="fw-bold text-white mb-2">Leitores de tela por sistema operacional</caption>
        <thead>
            <tr>
                <th scope="col">Sistema Operacional</th>
                <th scope="col">Leitor de Telas</th>
                <th scope="col">Descrição</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>Windows</td>
                <td><a href="https://www.nvaccess.org/" target="_blank" rel="noopener noreferrer">NVDA (NonVisual Desktop Access)</a></td>
                <td>Gratuito e de código aberto, é um dos mais populares no mundo.</td>
            </tr>
            <tr>
                <td>Windows</td>
                <td> <a href="https://www.freedomscientific.com/products/software/jaws/" target="_blank" rel="noopener noreferrer">JAWS (Job Access With Speech)</a></td>
                <td>É um software comercial (pago) muito robusto e tradicional no mercado corporativo.</td>
            </tr>
            <tr>
                <td>Windows</td>
                <td><a href="https://support.microsoft.com/pt-br/windows/guia-completo-do-narrador-e4397a0d-ef4f-b386-d8ae-c172f109bdb1" target="_blank" rel="noopener noreferrer">Narrador</a></td>
                <td>É o leitor de telas que já vem integrado no próprio Windows, oferecido gratuitamente pela Microsoft.</td>
            </tr>
            <tr>
                <td>macOS</td>
                <td> <a href="https://support.apple.com/pt-br/guide/voiceover/welcome/mac" target="_blank" rel="noopener noreferrer">VoiceOver</a></td>
                <td>Integrado em todos os computadores da Apple (MacBooks, iMacs). É gratuito e conhecido por sua alta qualidade.</td>
            </tr>
            <tr>
                <td>iOS</td>
                <td> <a href="https://support.apple.com/pt-br/guide/iphone/iph3e2e415f/ios" target="_blank" rel="noopener noreferrer">VoiceOver</a></td>
                <td>Versão para dispositivos móveis da Apple (iPhone e iPad). Apesar do mesmo nome, sua interação é baseada em gestos de toque na tela.</td>
            </tr>
            <tr>
                <td>Android</td>
                <td><a href="https://support.google.com/accessibility/android/answer/6283677?hl=pt-BR" target="_blank" rel="noopener noreferrer">TalkBack</a></td>
                <td>É o leitor de telas padrão do sistema Android, do Google. Já vem instalado na maioria dos celulares e tablets.</td>
            </tr>
            <tr>
                <td>Linux</td>
                <td><a href="https://help.gnome.org/users/orca/stable//" target="_blank" rel="noopener noreferrer">Orca</a></td>
                <td>O principal leitor de telas para o ambiente gráfico GNOME, comum em muitas distribuições Linux. É gratuito e de código aberto.</td>
            </tr>
        </tbody>
    </table>
</div>

<h2 id="diferencas-entre-usar-a-tecnologia-com-visao-e-usar-com-leitor-de-telas">Diferenças entre usar a tecnologia com visão e usar com leitor de telas</h2>
<hr />

<p>Para entender como uma pessoa com deficiência visual usa computador ou celular, é importante saber que a experiência costuma ser bem diferente da de uma pessoa que enxerga.</p>

<p>Em vez de depender do que está visível na tela, a navegação acontece principalmente por áudio e por uma organização lógica do conteúdo feita por sistemas operacionais, aplicativos e leitores de tela.</p>

<p>Uma forma simples de imaginar isso é pensar na tela como uma sala cheia de objetos.</p>

<p>Para quem enxerga, é como entrar nessa sala com as luzes acesas. Dá para ver tudo ao mesmo tempo: porta, janela, mesa, cadeira. A pessoa olha rapidamente para onde quer, percebe cores, tamanhos, posição dos itens e entende o conjunto da “paisagem” de uma vez. Se quiser interagir com algo, basta apontar e clicar com o mouse, ou tocar diretamente no ponto certo da tela.</p>

<p>Para quem usa leitor de telas, é como estar nessa sala no escuro com uma lanterna que ilumina apenas um objeto por vez. Para conhecer o ambiente, é preciso percorrer item por item, seguindo uma ordem.</p>

<p>O leitor de telas anuncia um elemento de cada vez, como se a pessoa estivesse “varrendo” a tela. Com base no que escuta, a pessoa vai montando um mapa mental de como a página ou o aplicativo está organizado.</p>

<p>Por isso, a estrutura do conteúdo faz muita diferença. Quando um site ou aplicativo está bem construído, o leitor de telas consegue dizer claramente o que cada coisa é, como “botão”, “título”, “campo de edição”, “lista com 5 itens”.</p>

<p>Isso orienta a navegação e dá segurança. Quando a estrutura é ruim, a experiência se parece com uma sala em que todos os objetos são caixas iguais e sem etiqueta. A pessoa até consegue explorar, mas fica mais demorado, confuso e com maior chance de erro.</p>

<p>A seguir está uma tabela com algumas das principais diferenças entre a experiência de navegação visual e a navegação com leitor de telas:</p>

<div class="table-responsive mb-4">
    <table class="table table-bordered table-dark" aria-labelledby="comparativo-experiencias-uso" aria-describedby="comparativo-experiencias-uso-desc">
        <caption id="comparativo-experiencias-uso" class="fw-bold text-white mb-2">Comparativo entre as experiências de uso</caption>
        <thead>
            <tr>
                <th scope="col">Aspecto da Experiência</th>
                <th scope="col">Pessoas que Enxergam</th>
                <th scope="col">Pessoas que usam Leitores de Telas</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td><strong>Acesso à Informação</strong></td>
                <td>Acessa a tela inteira de uma vez, pulando para qualquer parte que chame a atenção (acesso paralelo).</td>
                <td>Ouve um elemento por vez, em uma ordem linear, como se estivesse lendo um texto linha por linha (acesso sequencial).</td>
            </tr>
            <tr>
                <td><strong>Interação (Clicar)</strong></td>
                <td>Usa o mouse para apontar e clicar, ou toca diretamente no elemento desejado na tela.</td>
                <td>Navega com o teclado (usando teclas como <kbd>Tab</kbd>, <kbd>Seta</kbd>) até o elemento e pressiona <kbd>Enter</kbd>, ou usa gestos específicos de deslizar na tela do celular (ou trackpad se estiver usando um laptop).</td>
            </tr>
            <tr>
                <td><strong>Compreensão do Layout</strong></td>
                <td>Vê a disposição dos elementos (o que está no topo, no rodapé, na lateral) de forma instantânea.</td>
                <td>Constrói um mapa mental da página a partir da ordem em que os elementos são anunciados pelo leitor de telas. Se a estrutura for ruim, essa construção fica prejudicada.</td>
            </tr>
            <tr>
                <td><strong>Velocidade</strong></td>
                <td>Pode ser muito rápido para encontrar e interagir com um elemento visualmente destacado (um botão grande e vermelho, por exemplo).</td>
                <td>A velocidade depende da familiaridade com os atalhos do leitor de telas e da boa estrutura da página. Pode ser muito rápido para navegar se a página for bem construída ou muito lento se for mal estruturada. Além disso, é natural ter uma navegação mais lenta no início, enquanto se aprende a usar o leitor de telas.</td>
            </tr>
            <tr>
                <td><strong>Conteúdo Gráfico</strong></td>
                <td>Vê imagens, gráficos e vídeos diretamente.</td>
                <td>Depende de descrições alternativas (texto alternativo ou audiodescrição) para entender o que a imagem ou o vídeo contém. Sem isso, o conteúdo é inacessível.</td>
            </tr>
            <tr>
                <td><strong>Feedback</strong></td>
                <td>Recebe feedback visual: um botão muda de cor ao ser pressionado, uma animação aparece, etc.</td>
                <td>Recebe feedback auditivo (o leitor de telas diz "botão pressionado") ou tátil (uma vibração no celular ou em um display braille).</td>
            </tr>
        </tbody>
    </table>
</div>

<p>Essas diferenças mostram que a experiência de uso para pessoas com deficiência visual é única e depende muito da qualidade da estrutura do conteúdo e da forma como as informações são organizadas.</p>

<p>Por isso, é fundamental que pessoas desenvolvedoras de software e designers tenham em mente essas particularidades para criar interfaces mais acessíveis e inclusivas.</p>

<h2 id="uma-camada-adicional-de-complexidade">Uma camada adicional de complexidade</h2>
<hr />

<p>Cada sistema operacional transmite informações de acessibilidade de forma única, e cada leitor de telas as interpreta de modo distinto. É fundamental conhecer tanto o sistema quanto o leitor de telas, já que diferentes leitores podem modificar bastante a experiência de uso.</p>

<p>Três pessoas cegas usando Windows 11 com NVDA, Jaws ou Narrador terão experiências distintas, pois cada leitor de telas possui comandos e configurações específicas que afetam a apresentação das informações. Além das teclas comuns do sistema operacional e dos atalhos universais nos aplicativos, cada leitor de tela utiliza comandos específicos e métodos próprios para organizar a experiência, que podem variar conforme o software escolhido.</p>

<p>Pequenas alterações em comandos, na navegação ou na interpretação de elementos gráficos podem impactar consideravelmente o acesso e a compreensão de conteúdos digitais por indivíduos com deficiência visual. Dessa forma, é indispensável realizar testes e adaptar as aplicações para múltiplas plataformas e ferramentas, garantindo uma experiência digital eficiente e inclusiva.</p>

<p>Da mesma forma, no contexto dos dispositivos móveis, a utilização do Google Talkback em sistemas Android pode apresentar variações conforme a marca do smartphone utilizado pela pessoa.</p>

<p>Ao migrar de um sistema operacional para outro, como do Windows para o macOS ou do Android para o iOS, é necessário não só aprender as regras e características do novo sistema, mas também se adaptar a um novo leitor de telas.</p>

<p>Esse processo de adaptação também ocorre dentro de um mesmo sistema operacional: por exemplo, ao deixar de usar o NVDA no Windows para utilizar o Jaws, será preciso aprender desde o início como funciona esse novo leitor de telas.</p>

<p>Além disso, cada programa possui suas próprias combinações de teclas de atalho, como ao trocar do Word para o Google Docs ou do Microsoft Edge para o Google Chrome, entre outros.</p>

<p>O uso de recursos digitais torna-se ainda mais desafiador: além de ser necessário aprender a lidar com o sistema operacional e os aplicativos desejados, é essencial compreender profundamente o leitor de telas. Caso haja troca de leitor, será preciso reaprender tudo novamente.</p>

<p>Esse domínio é fundamental, pois, sem ele, a pessoa pode não saber se uma dificuldade de acesso a determinado conteúdo ocorre devido à falta de acessibilidade ou simplesmente por não ter experiência suficiente com o leitor de telas para conseguir encontrar esse conteúdo.</p>

<h3 id="qual-o-motivo-de-tanta-complexidade">Qual o motivo de tanta complexidade?</h3>
<hr />

<p>A variação de experiência acontece porque acessibilidade digital funciona como uma espécie de “cadeia de tradução”. Primeiro, o aplicativo (um site, um programa, uma tela do celular) precisa “contar” para o sistema operacional o que existe ali: se algo é um botão, um campo de texto, um menu, um alerta, se está marcado ou desmarcado, se está desabilitado, qual é o nome daquele elemento e o que acontece quando a pessoa ativa.</p>

<p>Depois, o leitor de telas “ouve” essas informações e decide como transformar isso em fala, em braille e em formas de navegação. O ponto central é que não existe uma única tradução universal: cada sistema operacional tem seu próprio jeito de receber e organizar essas informações, e cada leitor de telas tem seu próprio jeito de interpretá-las e apresentá-las.</p>

<p>É como se cada sistema operacional falasse um idioma interno diferente, e cada leitor de telas fosse um intérprete com estilo próprio. Mesmo quando dois intérpretes recebem a mesma frase, um pode preferir explicar mais, outro pode ser mais direto; um pode repetir detalhes para garantir clareza, outro pode economizar palavras; um pode organizar a informação em uma ordem, outro em outra.</p>

<p>Isso não significa que um esteja “errado” e o outro “certo” o tempo todo, muitas vezes são escolhas diferentes, feitas para públicos diferentes e hábitos diferentes. No Windows, por exemplo, três pessoas usando NVDA, JAWS e Narrador podem estar consumindo a “mesma tela”, mas cada leitor de telas tem seu próprio conjunto de comandos, seus próprios modos de navegação e até sua própria forma de anunciar informações.</p>

<p>Um pode dizer “botão, menu, colapsado” com mais frequência; outro pode anunciar menos coisas para ficar mais rápido; um pode facilitar saltos específicos por tipo de elemento; outro pode destacar mais mensagens automáticas. Além disso, cada pessoa costuma personalizar o leitor: muda nível de pontuação falada, velocidade, eco de teclas, forma de anunciar links, avisos, e assim por diante. Só isso já muda bastante a vivência.</p>

<p>Também existe um fator que não aparece “de fora”, mas pesa muito: aplicativos e sites nem sempre descrevem a interface de um jeito claro e completo. Quando um elemento é construído de forma “improvisada” (por exemplo, algo que parece botão, mas não se comporta como botão), cada leitor de telas pode tentar “adivinhar” o que aquilo é para tentar comunicar para a pessoa usuária.</p>

<p>Só que cada leitor faz essas adaptações do seu próprio jeito. É aí que duas pessoas podem ter resultados diferentes: uma encontra, a outra não; uma ouve um aviso útil, a outra não ouve; uma consegue ativar um controle, a outra precisa de outro caminho.</p>

<p>Na Web, costuma existir mais “regras em comum”, porque há recomendações e boas práticas bem conhecidas para construir páginas de um jeito mais compreensível por várias tecnologias assistivas.</p>

<p>Mesmo assim, isso não vira uma experiência idêntica, porque ainda existe o navegador no meio (Chrome, Edge, Firefox, Safari) e o leitor de telas em cima disso. É muita gente “traduzindo” em sequência: a página, o navegador, o sistema operacional e o leitor. Se qualquer etapa fizer um trabalho diferente, o resultado muda.</p>

<p>Em dispositivos móveis, a variação pode ser ainda mais evidente. No Android, por exemplo, o TalkBack pode apresentar diferenças conforme a marca do aparelho, a versão do sistema e até mudanças feitas pela fabricante. Às vezes o caminho de configurações muda; às vezes certos gestos funcionam de outro jeito; às vezes recursos aparecem ou somem dependendo do modelo. Então duas pessoas dizendo “eu uso TalkBack” podem, na prática, estar usando experiências bem diferentes.</p>

<p>Além disso, cada programa tem seus próprios atalhos e sua própria organização interna. Trocar do Word para o Google Docs, ou do Edge para o Chrome, muda menus, comandos, comportamento de edição e até a forma como a interface “se movimenta”. Para uma pessoa com deficiência visual, isso pesa porque o uso eficiente depende de memória muscular (atalhos), previsibilidade e domínio de navegação. Qualquer mudança nessas peças exige adaptação.</p>

<p>Então, por que não existe uma padronização completa, do tipo “tudo funciona igual para todo mundo”? Porque, na prática, estamos falando de muitos mundos diferentes tentando conversar ao mesmo tempo. Sistemas operacionais foram criados por empresas diferentes, em épocas diferentes, com objetivos e tecnologias diferentes.</p>

<p>Leitores de telas também foram criados com filosofias diferentes: alguns priorizam rapidez, outros priorizam detalhamento; alguns são mais “guiados”, outros são mais “exploratórios”; alguns investem mais em personalização, outros buscam simplicidade. E, no mobile, ainda entra o fator de cada fabricante mexer no sistema.</p>

<p>Existe, sim, padronização, só que ela costuma padronizar mais o “mínimo necessário para funcionar” do que o “jeito exato de usar”. Em outras palavras: há esforços para que botões sejam botões, campos sejam campos, e as informações essenciais estejam presentes.</p>

<p>Mas ninguém consegue (e nem seria desejável) impor que todos os leitores de telas tenham os mesmos atalhos, falem com as mesmas palavras, na mesma ordem, com a mesma quantidade de detalhes. Isso tiraria liberdade de evolução, impediria que cada produto atendesse melhor certos perfis de uso e ignoraria que pessoas diferentes preferem estilos diferentes de leitura.</p>

<p>Por fim, esse é o motivo pelo qual sem dominar bem o leitor de telas, pode ficar difícil saber se um problema é falta de acessibilidade ou falta de familiaridade com o próprio leitor. Como a experiência depende tanto da ferramenta e das configurações, uma pessoa pode “não encontrar” algo que está lá, ou pode achar que algo é inacessível quando, na verdade, é acessível, mas exige um modo de navegação diferente.</p>

<p>Testar diferentes combinações de leitores, navegadores e dispositivos permite identificar se o problema está na interface ou no uso das ferramentas, aumentando as chances de proporcionar uma boa experiência para mais pessoas.</p>

<h2 id="algumas-dicas-para-melhorar-a-experiencia-de-uso-das-pessoas-com-deficiencia-visual">Algumas dicas para melhorar a experiência de uso das pessoas com deficiência visual</h2>
<hr />

<p>A acessibilidade digital é um campo complexo, mas existem algumas práticas que podem ajudar a melhorar a experiência de uso para pessoas com deficiência visual. A seguir estão algumas dicas importantes para tornar seus materiais digitais mais acessíveis.</p>

<h3 id="pense-em-estrutura-e-semantica-ao-inves-de-aparencia">Pense em estrutura e semântica ao invés de aparência</h3>
<hr />

<p>Os leitores de tela utilizam a estrutura do conteúdo, independentemente do aspecto visual, para interpretar informações. Quando a estrutura é insuficiente ou inadequada, os dados tornam-se difíceis de identificar e a navegação pode ser inviabilizada ou significativamente comprometida.</p>

<h4 id="use-títulos-de-verdade">Use títulos de verdade</h4>

<p>Em documentos, como os produzidos via Word, Google Docs ou LibreOffice, utilize os títulos nativos do programa, como “Título 1”, “Título 2”, etc ao invés de apenas aumentar o tamanho da fonte e colocar em negrito.</p>

<p>No Word, a própria Microsoft recomenda usar estilos de título para facilitar navegação por estrutura.</p>

<h4 id="use-listas-de-verdade">Use listas de verdade</h4>

<p>Para criar listas, utilize os recursos nativos de formatação de lista (marcada ou numerada) em vez de usar símbolos manuais (como asteriscos, hífens ou números digitados).</p>

<h4 id="use-um-sumário-automático">Use um sumário automático</h4>

<p>Em documentos longos, utilize a funcionalidade de sumário automático, que cria links para os títulos e facilita a navegação.</p>

<h4 id="quebra-de-página">Quebra de página</h4>

<p>Em documentos, não use um monte de <kbd>Enter</kbd> para criar espaço entre seções. Por exemplo: Você acabou de escrever um capítulo e quer começar o próximo em uma nova página. Em vez de apertar <kbd>Enter</kbd> várias vezes, use a função de quebra de página do programa.</p>

<p>No Word você consegue fazer essa quebra de página com o atalho <kbd>Ctrl</kbd> + <kbd>Enter</kbd>.</p>

<p>No Google Docs, vá em “Inserir” → “Quebra” → “Quebra de página”.</p>

<h4 id="não-use-caixas-de-texto-para-conteúdo-importante">Não use caixas de texto para conteúdo importante</h4>

<p>Evite usar caixas de texto (text boxes) para colocar informações essenciais, pois elas podem ser ignoradas por leitores de tela. Se precisar usar uma caixa de texto, certifique-se de que ela esteja corretamente rotulada e seja acessível.</p>

<p>No PowerPoint, por exemplo, existe o recurso de “placeholder” que é uma caixa de texto pré-formatada e acessível, ideal para títulos e conteúdo principal. Evite criar caixas de texto personalizadas que não sejam reconhecidas como parte do fluxo de leitura.</p>

<h4 id="use-descrições-alternativas-para-imagens-e-gráficos">Use descrições alternativas para imagens e gráficos</h4>

<p>De acordo com as diretrizes de acessibilidade do <abbr title="World Wide Web Consortium em português: Consórcio World Wide Web">W3C</abbr> e das <abbr title="Web Content Accessibility Guidelines em português: Diretrizes de Acessibilidade para Conteúdo Web">WCAG</abbr>, todas as imagens e gráficos devem ter descrições alternativas que transmitam a mesma informação que a imagem visualmente apresenta.</p>

<p>A seguir está uma imagem de exemplo, para a qual serão mostradas duas formas de descrição alternativa: uma correta e outra incorreta.</p>

<div class="text-center">
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://media.istockphoto.com/id/1323184150/photo/her-disability-doesnt-stop-her-from-being-a-successful-businesswoman.jpg?s=612x612&amp;w=0&amp;k=20&amp;c=qnr9GU2wt_XrikxPbYin89x6tAzSpcgfhUBXOTG4_FQ=" alt="Mulher de pele preta, cabelos curtos e cacheados, sorrindo, de óculos escuros e blazer rosa, segurando uma bengala branca em uma área externa com prédios ao fundo." loading="lazy" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

</div>

<p><strong>Descrição alternativa incorreta:</strong> “foto123.png”, “imagem.png”, “ilustracao-xgpowyqtpom976544.png” e variações do tipo “foto de mulher” ou “mulher com bengala”.</p>

<p>Essas descrições não transmitem informações relevantes sobre a imagem, como características visuais, contexto ou elementos importantes. Elas não ajudam a pessoa com deficiência visual a entender o conteúdo da imagem e podem ser consideradas inúteis para fins de acessibilidade.</p>

<p><strong>Descrição alternativa correta:</strong> “Mulher de pele preta, cabelos curtos e cacheados, sorrindo, de óculos escuros e blazer rosa, segurando uma bengala branca em uma área externa com prédios ao fundo.”</p>

<p>Essa descrição alternativa é detalhada e informativa, fornecendo uma representação clara da imagem para pessoas com deficiência visual. Ela inclui informações sobre a aparência da mulher, suas expressões faciais, o que ela está vestindo e o ambiente ao seu redor, permitindo que a pessoa compreenda o conteúdo visual de forma mais completa.</p>

<p>Claro que, o texto alternativo tem limites de tamanho de acordo com as próprias diretrizes de acessibilidade, e é importante encontrar um equilíbrio entre ser detalhado e ser conciso. O ideal é incluir as informações mais relevantes para transmitir o significado da imagem, sem se tornar excessivamente longo ou difícil de entender.</p>

<p>Quando a imagem for muito complexa, como um gráfico ou uma ilustração com muitos elementos, não é indicado apenas o texto alternativo, mas também uma descrição mais detalhada com o conteúdo completo da imagem.</p>

<p>Se for uma página web, essa descrição pode ser colocada em uma <code class="language-plaintext highlighter-rouge">&lt;figcaption&gt;</code>, que é um elemento HTML usado para fornecer uma legenda ou descrição para uma figura que acompanha a imagem e que será reconhecida por leitores de tela como parte do conteúdo da imagem. Também é possível adicionar a descrição em um parágrafo de texto abaixo da imagem, desde que esteja claro que se trata de uma descrição da imagem e seja acessível para leitores de tela.</p>

<p>Em documentos de texto, slides e outros materiais, a descrição pode ser colocada em um parágrafo próximo à imagem, com uma indicação clara de que se trata de uma descrição detalhada da imagem. Isso é muito importante em contexto onde existem gráficos, mapas, organogramas e outros elementos visuais complexos.</p>

<p><strong>Observação:</strong> Em hipótese alguma use o campo de texto alternativo, seja no Word, no Google Docs, PowerPoint ou em qualquer outro programa, para colocar a <abbr title="Uniform Resource Locator em português: Localizador Uniforme de Recursos">URL</abbr> (endereço da imagem) ou informações irrelevantes, pois o leitor de telas irá ler exatamente o que está escrito ali.</p>

<h4 id="não-use-cores-como-única-forma-de-transmitir-informação">Não use cores como única forma de transmitir informação</h4>

<p>As cores podem ser usadas para destacar informações, mas não devem ser a única forma de transmitir uma mensagem importante. Portanto, é fundamental usar outros elementos visuais, como texto, ícones ou padrões, para garantir que a informação seja acessível.</p>

<p><strong>Observação:</strong> É muito comum em aulas, apresentações e afins frases como <strong>“os itens em vermelho são obrigatórios”</strong> ou <strong>“tudo que está em verde é o saldo positivo”</strong>. Essas formas de comunicação não são acessíveis, fatalmente pessoas impossibilitadas de perceber as cores não terão acesso a essas informações.</p>

<h4 id="tabelas-use-as-para-dados-tabulares-não-para-layout">Tabelas: use-as para dados tabulares, não para layout</h4>

<p>As tabelas devem ser usadas apenas para apresentar dados tabulares, ou seja, informações organizadas em linhas e colunas que fazem sentido como um conjunto. Elas não devem ser usadas para criar layouts ou organizar o conteúdo visualmente, pois isso pode confundir os leitores de tela e dificultar a navegação.</p>

<p>Se for necessário usar uma tabela para organizar dados, certifique-se de que ela esteja corretamente estruturada, com cabeçalhos de coluna e linha, e que seja acessível para leitores de tela. Evite usar tabelas para criar espaçamento ou para organizar elementos visuais, pois isso pode tornar a experiência de navegação confusa e frustrante para pessoas com deficiência visual.</p>

<h4 id="use-links-descritivos-não-cole-a-url-inteira">Use links descritivos (não cole a URL inteira)</h4>
<hr />

<p>Ao invés de colocar a URL completa como texto do link, use uma descrição clara e informativa do destino do link.</p>

<p>Por exemplo, em vez de usar <code class="text-decoration-underline text-white">https://www.exemplo.com/artigo-sobre-acessibilidade</code>, use <code class="text-decoration-underline text-white">Leia nosso artigo sobre acessibilidade</code>.</p>

<p>Isso torna o link mais compreensível e fácil de navegar não somente para pessoas com deficiência visual, mas para todas as pessoas, pois fornece contexto sobre o que esperar ao clicar no link.</p>

<h4 id="evite-inserir-caixas-de-texto-soltas-no-powerpoint">Evite inserir caixas de texto “soltas” no PowerPoint</h4>

<p>No PowerPoint, evite usar caixas de texto (text boxes) para inserir informações importantes, pois elas podem ser ignoradas por leitores de tela. Em vez disso, utilize os placeholders pré-formatados para títulos e conteúdo principal, que são reconhecidos como parte do fluxo de leitura. Se for necessário usar uma caixa de texto personalizada, certifique-se de que ela esteja corretamente rotulada e seja acessível para leitores de tela.</p>

<p>Além disso, não se esqueça de marcar conteúdo decorativo como tal, para que o leitor de telas possa ignorá-lo. Por exemplo, se você usar uma caixa de texto apenas para criar um efeito visual, como um destaque ou um fundo colorido, certifique-se de marcar essa caixa como decorativa para que ela não seja lida pelo leitor de telas.</p>

<h4 id="verifique-e-ajuste-a-ordem-de-tabulação">Verifique e ajuste a ordem de tabulação</h4>

<p>A ordem de tabulação, ou ordem de leitura, é a sequência em que os elementos de uma página ou aplicativo são acessados quando a pessoa navega usando o teclado (geralmente com a tecla <kbd>Tab</kbd>). É fundamental garantir que essa ordem seja lógica e intuitiva para que as pessoas com deficiência visual possam navegar de forma eficiente.</p>

<p>Ajuste via painel/lista de seleção de elementos: Em muitos programas, como o Word, Google Docs, PowerPoint e outros, existe um painel ou lista de seleção de elementos que permite visualizar a estrutura do documento e ajustar a ordem de leitura. Certifique-se de que os elementos estejam organizados de forma lógica, seguindo a hierarquia e a sequência natural do conteúdo.</p>

<h3 id="dicas-por-formato-de-arquivo">Dicas por formato de arquivo</h3>
<hr />

<h4 id="excel-planilhas">Excel (planilhas)</h4>

<p>Planilhas são muito usadas para organizar informações, acompanhar atividades e apresentar resultados. Para pessoas que usam leitores de tela, a clareza da estrutura (tabelas, cabeçalhos e nomes de abas) faz toda a diferença.</p>

<ul>
  <li>
    <p><strong>Descreva imagens/gráficos com texto alternativo:</strong> Especialmente gráficos que transmitem informação. Se um gráfico for a principal forma de apresentar um resultado, considere também explicar os dados no próprio texto da planilha (por exemplo, em uma célula próxima) ou em um documento de apoio.</p>
  </li>
  <li>
    <p><strong>Estruture tabelas de forma simples:</strong> Evite células mescladas, divididas, aninhamento e muitas células em branco. Células em branco em sequência podem “parecer fim da tabela” para quem escuta a leitura, fazendo a pessoa perder contexto.</p>
  </li>
  <li>
    <p><strong>Defina cabeçalhos na tabela:</strong> Cabeçalhos permitem ao leitor de telas associar corretamente coluna/linha com os dados. Sem isso, a leitura pode virar uma sequência de valores sem significado claro.</p>
  </li>
  <li>
    <p><strong>Evite múltiplas tabelas na mesma planilha:</strong> Quando possível, separe conteúdos diferentes em abas diferentes (ou até em arquivos diferentes) para reduzir confusão de contexto.</p>
  </li>
  <li>
    <p><strong>Renomeie as abas e remova planilhas vazias:</strong> Nomes claros ajudam na navegação com leitor de telas, porque a pessoa consegue entender rapidamente onde está e o que cada aba contém.</p>
  </li>
  <li>
    <p><strong>Mantenha bom contraste:</strong> Use combinações de fundo e texto que sejam legíveis.</p>
  </li>
  <li>
    <p><strong>Não use cor como único significado:</strong> Se algo está “em vermelho porque é crítico”, inclua também texto/indicador (por exemplo: “Crítico”, “Atrasado”, “Fora do prazo”, etc.).</p>
  </li>
</ul>

<h4 id="pdf">PDF</h4>

<p>Um <abbr title="Portable Document Format">PDF</abbr> pode ser acessível, mas isso depende de ele ter estrutura (tags/marcações). Na prática, “parecer certo visualmente” não garante que a leitura por leitor de telas será boa.</p>

<ul>
  <li>
    <p><strong>PDF acessível precisa de estrutura (tags/marcações):</strong> O arquivo deve ter ordem lógica de leitura, texto real (não só imagem), descrições alternativas quando necessário, tabelas estruturadas e formulários acessíveis.</p>
  </li>
  <li>
    <p><strong>Gere o PDF a partir de um documento Office já acessível:</strong> Se o Word/Docs/LibreOffice estiverem bem estruturados (títulos, listas, tabelas), a exportação tende a preservar a semântica.</p>
  </li>
  <li>
    <p><strong>Ao salvar como PDF, habilite marcas estruturais para acessibilidade:</strong> Procure opções do tipo “tags para acessibilidade”, “marcas estruturais” ou “estrutura do documento”, para preservar hierarquia de títulos, ordem de leitura e outras informações importantes.</p>
  </li>
  <li>
    <p><strong>Evite “imprimir para PDF” em ferramentas que perdem tags:</strong> Alguns geradores por “impressora PDF” não preservam marcações e geram um PDF sem estrutura (ou seja, mais difícil de navegar com leitor de telas).</p>
  </li>
  <li>
    <p><strong>Para PDFs complexos, pode ser necessário editor especializado:</strong> Especialmente para ajustar ordem de leitura, títulos, tabelas e formulários.</p>
  </li>
</ul>

<h4 id="documento-digitalizado-scanner">Documento digitalizado (scanner)</h4>

<p>Quando um documento é digitalizado, muitas vezes ele vira apenas uma imagem dentro de um PDF. Isso muda completamente a acessibilidade.</p>

<ul>
  <li>
    <p><strong>PDF digitalizado é imagem — leitor de telas não lê:</strong> Se o conteúdo virou uma “foto”, não há texto real para o leitor de telas interpretar.</p>
  </li>
  <li>
    <p><strong>Use <abbr title="Optical Character Recognition em português: Reconhecimento Óptico de Caracteres">OCR</abbr> para converter imagem em texto:</strong> Depois do OCR, revise o resultado. O OCR costuma errar mais quando há baixa resolução, fundo com ruído, fonte pequena, fonte cursiva/itálica/decorada, ou quando o documento está torto e com sombras.</p>
  </li>
  <li>
    <p><strong>Depois que virar texto, aplique as mesmas regras de acessibilidade:</strong> Estrutura de títulos, descrições alternativas quando necessário, tabelas corretas, links descritivos, contraste adequado e assim por diante.</p>
  </li>
</ul>

<h3 id="checklist">Checklist</h3>
<hr />

<p>Se você quiser priorizar o que mais costuma impactar a experiência, este checklist é um bom ponto de partida:</p>

<ul>
  <li>
    <p><strong>Títulos com estilos semânticos (não “na mão”):</strong> Use os recursos de Título 1, Título 2, etc., para permitir navegação por estrutura.</p>
  </li>
  <li>
    <p><strong>Imagens sempre com descrição útil (e descrições longas no texto quando necessário):</strong> Texto alternativo deve explicar o que importa na imagem, não o nome do arquivo.</p>
  </li>
  <li>
    <p><strong>Nada essencial em caixa de texto / cabeçalho / rodapé:</strong> Informações importantes precisam estar no fluxo principal de leitura.</p>
  </li>
  <li>
    <p><strong>Tabelas sem mesclagem e com cabeçalhos definidos:</strong> Evite células mescladas e garanta que cabeçalhos estejam configurados.</p>
  </li>
  <li>
    <p><strong>Documento longo com sumário linkável:</strong> Um sumário automático facilita muito a navegação.</p>
  </li>
  <li>
    <p><strong>Ordem de leitura correta (especialmente em slides):</strong> Garanta que a tabulação e a sequência de leitura façam sentido.</p>
  </li>
  <li>
    <p><strong>PDF com tags/estrutura (não “impresso” como imagem):</strong> Prefira exportar preservando marcações.</p>
  </li>
  <li>
    <p><strong>Digitalizados sempre com OCR + revisão:</strong> Sem OCR, vira imagem e deixa de ser lido.</p>
  </li>
  <li>
    <p><strong>Nunca depender só de cor/efeito visual para transmitir informação:</strong> Sempre inclua texto ou outro indicador além da cor.</p>
  </li>
</ul>

<h2 id="conclusao">Conclusão</h2>
<hr />

<p>Leitores de tela não “adivinham” o que está na tela. Eles dependem do que o sistema, o navegador e o próprio conteúdo conseguem expor com clareza: nome, função, estado, valor e, principalmente, uma estrutura lógica. Quando essa estrutura existe, a navegação fica rápida, previsível e eficiente. Quando não existe, a experiência vira tentativa e erro.</p>

<p>Por isso, acessibilidade digital não é um detalhe que se coloca no final. Ela começa na forma como você organiza títulos, listas, tabelas e links, e continua no cuidado com gráficos, imagens e com a ordem de leitura, especialmente em documentos e apresentações.</p>

<p>Se você quer um caminho prático: priorize semântica, evite “gambiarras visuais”, descreva o que é essencial e teste seus materiais com teclado e com leitor de telas. O objetivo não é “passar em uma checklist”, e sim garantir que a pessoa consiga entender o conteúdo e concluir tarefas com autonomia.</p>

<p>Quando a gente projeta pensando também em quem acessa por áudio e por Braille, o resultado costuma ser melhor para todo mundo: documentos mais organizados, informações mais claras e interfaces mais fáceis de usar.</p>]]></content><author><name>Louise Suelen</name></author><category term="Acessibilidade Digital" /><category term="Leitores de Tela" /><category term="Acessibilidade Digital" /><summary type="html"><![CDATA[Este artigo explica o leitor de telas, tecnologia que possibilita o acesso digital para pessoas com deficiência visual. Apresenta seu histórico, funções e reforça a importância da inclusão.]]></summary></entry><entry xml:lang="pt-BR"><title type="html">Tecnologias Assistivas no Ensino de Química: Uma Proposta de Tabela Periódica Acessível</title><link href="https://pcdnaescola.com.br/tecnologias-assistivas-no-ensino-de-quimica-uma-proposta-de-tabela-periodica-acessivel/" rel="alternate" type="text/html" title="Tecnologias Assistivas no Ensino de Química: Uma Proposta de Tabela Periódica Acessível" /><published>2026-01-02T13:00:00+00:00</published><updated>2026-01-02T13:00:00+00:00</updated><id>https://pcdnaescola.com.br/tecnologias-assistivas-no-ensino-de-quimica-uma-proposta-de-tabela-periodica-inclusiva</id><content type="html" xml:base="https://pcdnaescola.com.br/tecnologias-assistivas-no-ensino-de-quimica-uma-proposta-de-tabela-periodica-acessivel/"><![CDATA[<div class="text-center">
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://imagedelivery.net/Ruw4waFkOelbXULIoE-oQg/01248cbd-d6fc-4d17-2007-b107616a0000/public" alt="" loading="lazy" aria-hidden="true" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

</div>

<h2 id="apresentacao">Apresentação</h2>
<hr />

<p>A percepção equivocada de que pessoas com deficiência enfrentam obstáculos intransponíveis continua presente em diversos setores da sociedade, inclusive no contexto educacional. Tal visão contribui para a insuficiência de materiais e metodologias pedagógicas adaptadas, o que torna o processo de inclusão mais complexo.</p>

<p>A falta de informação, o pouco contato diário com pessoas com deficiência e a carência de ações voltadas à conscientização ajudam a manter preconceitos. Diante disso, este estudo investiga os desafios e as estratégias para ensinar a tabela periódica dos elementos químicos a estudantes com deficiência visual, destacando a relevância de adaptações específicas que sejam viáveis e aplicáveis.</p>

<p>O uso de recursos digitais, como o desenvolvimento web é essencial para ampliar o acesso de pessoas com deficiência visual ao conhecimento científico. Por isso, foi criada uma tabela periódica inclusiva, compatível com linhas Braille e leitores de tela.</p>

<p>A metodologia empregada envolveu uma revisão bibliográfica detalhada, seguida pela confecção prática da tabela, que foi validada por especialistas com deficiência visual. A acessibilidade foi analisada por meio de testes feitos por profissionais com deficiência visual que atuam nas áreas de acessibilidade digital, desenvolvimento de software, psicologia, pedagogia e outros campos.</p>

<p>Pessoas cegas e com baixa visão participaram da avaliação usando tecnologias assistivas em diferentes dispositivos. Os resultados mostram que, com adaptações e uso adequado da tecnologia, é possível garantir uma experiência educacional inclusiva no estudo da tabela periódica.</p>

<p>Essa iniciativa não só amplia o acesso ao conhecimento científico, como também ajuda a romper barreiras históricas e incentiva a participação ativa de estudantes com deficiência visual nas escolas. Além disso, destaca-se a importância de investir continuamente na melhoria de materiais didáticos acessíveis.</p>

<p>Ao divulgar essa proposta, busca-se promover uma educação mais inclusiva e justa, na qual todas as pessoas tenham oportunidades plenas de aprendizado e desenvolvimento, contribuindo assim para uma transformação social duradoura.</p>

<h2 id="conceitos-gerais">Conceitos gerais</h2>
<hr />

<p>Historicamente, pessoas com deficiência foram frequentemente consideradas incapazes. Em diversos contextos, elas acabaram sendo responsabilizadas por sua própria exclusão social, fenômeno atualmente identificado como capacitismo.</p>

<blockquote class="bg-dark text-light rounded shadow-lg p-4 my-5 border-start border-4 border-primary">
  <p class="lead fst-italic lh-lg">"Esse preconceito é tão forte na sociedade que atinge até instituições e pessoas que, em teoria, deveriam defender os direitos de grupos minorizados e marginalizados."</p>
  <footer class="text-light">IVANOVICH; GESSER, 2020</footer>
</blockquote>

<p>Nessa conjuntura, as pessoas com deficiência frequentemente são percebidas como menos aptas a experienciar, aprender, expressar desejos e, especialmente, serem alvo de desejo.</p>

<blockquote class="bg-dark text-light rounded shadow-lg p-4 my-5 border-start border-4 border-primary">
  <p class="lead fst-italic lh-lg">"Assim, são muitas vezes impedidas de viver plenamente e de exercer seus direitos."</p>
  <footer class="text-light">GESSER; BLOCK; HENRIQUE NUERNBERG, 2019</footer>
</blockquote>

<p>O capacitismo é estrutural e persistente na sociedade porque:</p>

<blockquote class="bg-dark text-light rounded shadow-lg p-4 my-5 border-start border-4 border-primary">
  <p class="lead fst-italic lh-lg">"[...] desde o momento em que uma criança nasce ela emerge em um mundo onde recebe mensagens de que ser uma pessoa com deficiência é ser inferior."</p>
  <footer class="text-light">GESSER; BLOCK; HENRIQUE NUERNBERG, 2019</footer>
</blockquote>

<p>Pessoas com deficiência visual também integram esse contexto, principalmente porque:</p>

<blockquote class="bg-dark text-light rounded shadow-lg p-4 my-5 border-start border-4 border-primary">
  <p class="lead fst-italic lh-lg">"[...] a sociedade reconhece o que é extremamente visual, privilegiando a visualização como condição de conhecer, em um universo constituído por símbolos gráficos, imagens, letras e números."</p>
  <footer class="text-light">REIS, 2015, p. 15</footer>
</blockquote>

<p>A educação, ao representar os valores da sociedade contemporânea e contribuir para o desenvolvimento das próximas gerações, fundamenta-se de maneira significativa no uso de recursos visuais, como jogos, imagens e gráficos (REIS, 2015).</p>

<p>A Química é uma área do conhecimento altamente dependente da visão. Ela é:</p>

<blockquote class="bg-dark text-light rounded shadow-lg p-4 my-5 border-start border-4 border-primary">
  <p class="lead fst-italic lh-lg">"[...] a ciência responsável pelo estudo da matéria e de suas transformações."</p>
  <footer class="text-light">FELTRE, 2004, p. 7</footer>
</blockquote>

<p>Nesta área, o emprego de representações visuais é fundamental, viabilizando a comunicação eficiente de um elevado volume de informações em tempo reduzido. A disciplina de Química contempla atividades experimentais, práticas laboratoriais, bem como a manipulação de vidrarias e substâncias químicas.</p>

<blockquote class="bg-dark text-light rounded shadow-lg p-4 my-5 border-start border-4 border-primary">
  <p class="lead fst-italic lh-lg">"Por isso, cores, gráficos e equações químicas fazem parte de sua linguagem simbólica."</p>
  <footer class="text-light">FELTRE, 2004</footer>
</blockquote>

<p>Apesar dos desafios da Química para pessoas com deficiência visual, o uso de novas tecnologias permite criar estratégias inclusivas.</p>

<p>Cabe às instituições de ensino, equipes pedagógicas, docentes e ao Serviço de Atendimento Educacional Especializado (SAEE) planejar e aplicar adaptações que garantam o acesso à aprendizagem (BRASIL, 1996).</p>

<h2 id="educacao-e-deficiencia-visual-principais-questoes">Educação e deficiência visual: principais questões</h2>
<hr />

<p>Segundo Reis (2015, p. 28), a deficiência visual pode ser entendida como “um impedimento total ou, ainda, a diminuição da capacidade visual”. Essa condição pode resultar de diferentes causas que acometem os olhos ou o sistema visual como um todo. É importante ressaltar que, além da cegueira, a baixa visão também integra o espectro das deficiências visuais.</p>

<p>De acordo com Reis (2015, p. 28), a deficiência visual é avaliada a partir de duas medidas oftalmológicas: acuidade visual (capacidade de enxergar a uma determinada distância) e campo visual (área alcançada pela visão).</p>

<div class="text-center mb-4">
        <figcaption>Figura 1: Representação visual dos dois principais parâmetros oftalmológicos para avaliação visual.</figcaption>

        <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://imagedelivery.net/Ruw4waFkOelbXULIoE-oQg/db43e9f5-7daa-4214-f8ff-9282daaff900/public" alt="Ilustração explicando os conceitos de acuidade visual e campo visual." loading="lazy" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

        <figcaption class="visually-hidden">Na parte superior, uma cabeça de perfil olhando para uma tabela de exame visual com letras decrescentes, representando a acuidade visual. Na parte inferior, outra cabeça de perfil com um cone triangular saindo dos olhos, mostrando a área de visão que alcança uma árvore, representando o campo visual.</figcaption>
        <figcaption>Fonte: Elaborado pelas autoras.</figcaption>
</div>

<p>A baixa visão caracteriza-se por uma manifestação heterogênea, podendo os indivíduos apresentar distintos perfis de funcionamento visual. Essa variação decorre da interação entre fatores como acuidade visual, amplitude do campo visual e a etiologia (causa ou origem) da deficiência.</p>

<p>Segundo o Ministério da Educação (BRASIL, 2005, p.16), considera-se pessoa com baixa visão quem possui “desde a condição de indicar a projeção da luz até o grau em que a redução da acuidade visual interfere ou limita seu desenvolvimento”.</p>

<p>O e-book “Acessibilidade Para Estudantes Com Deficiência Visual: Orientações Para O Ensino Superior” define:</p>

<blockquote class="bg-dark text-light rounded shadow-lg p-4 my-5 border-start border-4 border-primary">
    <p class="lead fst-italic lh-lg">"[...] a baixa visão corresponde a um comprometimento do funcionamento visual, em ambos os olhos, que não pode ser sanado, por exemplo, com o uso de óculos convencionais, lentes de contato ou cirurgias oftalmológicas."</p>
    <footer class="text-light">GARRUTTI DE LOURENÇO et al., 2020, p. 2</footer>
</blockquote>

<p>Dessa forma, condições como miopia, que podem ser corrigidas com o uso de óculos, não são classificadas como deficiência visual, mas sim como problemas visuais, uma vez que podem ser substancialmente reduzidas ou eliminadas por meio de recursos ópticos.</p>

<h3 id="principais-caracteristicas-da-baixa-visao">Principais características da baixa visão</h3>
<hr />

<p>De acordo com Garrutti de Lourenço et al. (2020, p. 2), a baixa visão está relacionada a distintos tipos de limitações visuais, que podem manifestar-se de forma isolada ou simultânea. Destacam-se entre essas limitações:</p>

<ul>
  <li>
    <p>redução da nitidez visual (acuidade visual diminuída);</p>
  </li>
  <li>
    <p>restrição do campo visual, limitando a percepção ao espaço imediatamente à frente;</p>
  </li>
  <li>
    <p>alteração na discriminação de contraste, dificultando a identificação de objetos;</p>
  </li>
  <li>
    <p>dificuldade de adaptação à luminosidade, tanto em ambientes intensamente iluminados quanto pouco iluminados;</p>
  </li>
  <li>
    <p>modificação na percepção das cores;</p>
  </li>
  <li>
    <p>limitação na visualização de objetos próximos ou distantes;</p>
  </li>
  <li>
    <p>percepção restrita do entorno, observando apenas uma área delimitada conforme a condição apresentada.</p>
  </li>
</ul>

<p>Fonte: Elaborado pelas autoras com base em GARRUTTI DE LOURENÇO et al., 2020.</p>

<p>Alterações visuais que muitas vezes passam despercebidas exigem adaptações específicas para leitura, escrita e outras atividades diárias. A baixa visão requer intervenções adequadas, pois a principal barreira à inclusão é a falta de crença na importância dessas adaptações, segundo Garrutti de Lourenço et al. (2020, p. 2).</p>

<p>Dentre as principais causas de baixa visão, incluem-se:</p>

<ul>
  <li>
    <p>complicações oculares em prematuros (retinopatia da prematuridade);</p>
  </li>
  <li>
    <p>inflamações decorrentes de toxoplasmose (retinocoroidite macular por toxoplasmose);</p>
  </li>
  <li>
    <p>albinismo;</p>
  </li>
  <li>
    <p>catarata congênita;</p>
  </li>
  <li>
    <p>doenças retinianas (retinose pigmentar);</p>
  </li>
  <li>
    <p>comprometimento do nervo óptico (atrofia ótica);</p>
  </li>
  <li>
    <p>glaucoma;</p>
  </li>
  <li>
    <p>retinopatia diabética.</p>
  </li>
</ul>

<p>Fonte: Elaborado pelas autoras com base em GARRUTTI DE LOURENÇO et al., 2020.</p>

<p>É fundamental que profissionais da educação identifiquem as necessidades educacionais específicas de cada estudante com baixa visão, visando práticas pedagógicas inclusivas e personalizadas (GARRUTTI DE LOURENÇO et al., 2020, p. 2).</p>

<p>Diante disso, são frequentes na escola situações envolvendo estudantes com baixa visão, tais como:</p>

<ul>
  <li>
    <p>Dificuldade ao ler textos com fonte pequena ou baixo contraste;</p>
  </li>
  <li>
    <p>Cansaço visual que surge rapidamente ao realizar tarefas de leitura e escrita;</p>
  </li>
  <li>
    <p>Dificuldade em enxergar os conteúdos mostrados no quadro ou nos materiais didáticos tradicionais;</p>
  </li>
  <li>
    <p>É preciso mais tempo para terminar tarefas que exigem processamento visual;</p>
  </li>
  <li>
    <p>Dificuldade na participação em atividades realizadas sob iluminação intensa ou em superfícies refletoras;</p>
  </li>
  <li>
    <p>Necessidade dispositivos ópticos, iluminação apropriada e materiais acessíveis.</p>
  </li>
</ul>

<p>Fonte: Elaborado pelas autoras com base em GARRUTTI DE LOURENÇO et al., 2020, p. 3.</p>

<p>As necessidades de cada estudante com baixa visão devem ser avaliadas individualmente, pois as dificuldades variam entre as pessoas (GARRUTTI DE LOURENÇO et al., 2020, p. 3-4).</p>

<h3 id="cegueira">Cegueira</h3>
<hr />

<p>Apesar de algumas pessoas cegas apresentarem certa percepção luminosa, a compreensão do ambiente ocorre predominantemente por meio dos sentidos táctil e auditivo. Dessa forma, a cegueira abrange desde a completa ausência de visão até uma mínima detecção de luz, demandando abordagens educacionais que valorizem métodos alternativos baseados no tato e na audição.</p>

<p>A disponibilização de materiais didáticos variados é igualmente essencial, pois proporciona diferentes possibilidades de aprendizagem aos estudantes cegos. Dentre as estratégias indicadas para promover a inclusão escolar de alunos com cegueira, ressaltam-se:</p>

<ul>
  <li>
    <p>Uso de materiais em Braille para facilitar a leitura e escrita;</p>
  </li>
  <li>
    <p>Oferta de recursos táteis, como mapas e gráficos em alto-relevo;</p>
  </li>
  <li>
    <p>Implementação de softwares leitores de tela para acesso aos conteúdos digitais;</p>
  </li>
  <li>
    <p>Adaptação das atividades para que possam ser realizadas por meio do tato e da audição;</p>
  </li>
  <li>
    <p>Formação dos professores acerca das necessidades educacionais específicas desses alunos.</p>
  </li>
</ul>

<p>Fonte: Elaborado pelas autoras com base em BRASIL, 2005; SIAULIYS; ORMELEZI; BRIANT, 2010.</p>

<p>É imprescindível que os ambientes educacionais promovam a efetivação dos direitos constitucionais e legais das pessoas com deficiência, concretizando as garantias previstas em lei. A adoção de medidas de acessibilidade física e digital, assim como a integração entre docentes, familiares e especialistas, constitui obrigação legal destinada a garantir o desenvolvimento acadêmico e social desses estudantes, conforme estabelecem a Constituição Federal e a Lei nº 13.146/2015 (BRASIL, 2015), bem como demais legislações aplicáveis à inclusão.</p>

<h2 id="a-quimica">A Química</h2>
<hr />

<p>A Química, originada há muito tempo, firmou-se progressivamente como uma ciência moderna, especialmente nos séculos XVI e XVII, período em que surgiram modelos conceituais semelhantes aos atuais. Durante seu desenvolvimento, a disciplina ultrapassou métodos apenas quantitativos e passou a utilizar imagens, símbolos próprios e códigos de cores, tornando mais fácil entender os fenômenos naturais.</p>

<p>A introdução dessa disciplina nos currículos franceses do século XIX ocorreu devido ao destaque das ciências naturais nas reformas educacionais republicanas e ao método da “lição de coisas”, que favorecia o aprendizado prático com objetos.</p>

<p>O ensino de Química hoje inclui cálculos estequiométricos, observação sistemática, notação de fórmulas moleculares e uso de códigos cromáticos para facilitar a compreensão (KAHN, 2014; SCHWAHN; OAIGEN, 2009, 2008; SCHWAHN; ANDRADE NETO, 2011).</p>

<p>Razuck e Guimarães (2014, p. 3) reforçam a importância dessa abordagem visual afirmando que a Química:</p>

<blockquote class="bg-dark text-light rounded shadow-lg p-4 my-5 border-start border-4 border-primary">
  <p class="lead fst-italic lh-lg">"[...] se utiliza de grande apelo visual, pois muitos de seus conceitos se baseiam na visualização de esquemas para sua compreensão."</p>
  <footer class="text-light">RAZUCK; GUIMARÃES, 2014, p. 3</footer>
</blockquote>

<p>De acordo com os autores, o aprendizado em Química está intimamente ligado à utilização de imagens, ilustrações, diagramas ou modelos, pois esses recursos facilitam a compreensão dos conceitos. Eles ainda acrescentam que:</p>

<blockquote class="bg-dark text-light rounded shadow-lg p-4 my-5 border-start border-4 border-primary">
  <p class="lead fst-italic lh-lg">"[...] a utilização de imagens, como ferramenta, na compreensão de conceitos é verificada, por exemplo, no ensino de Modelos Atômicos, no qual cada modelo se associa a uma representação imagística."</p>
  <footer class="text-light">RAZUCK; GUIMARÃES, 2014, p. 3</footer>
</blockquote>

<p>O aspecto visual é fundamental na Química e constitui parte integrante de sua essência, visto que a disciplina consolidou, ao longo do tempo, uma linguagem específica composta por símbolos, fórmulas e representações gráficas. Entre os exemplos desse contexto destacam-se a tabela periódica, os modelos moleculares e as estruturas de Lewis, ferramentas que contribuem significativamente tanto para o processo de ensino quanto para a compreensão dos conteúdos químicos.</p>

<p>Segundo Almeida (2015) e Feltre (2004), compreender Química requer explicações teóricas e demonstrações práticas e visuais.</p>

<p>Assim, Química é definida como:</p>

<blockquote class="bg-dark text-light rounded shadow-lg p-4 my-5 border-start border-4 border-primary">
  <p class="lead fst-italic lh-lg">"[...] uma ciência que possui uma linguagem própria proveniente do aspecto representacional da ciência como o uso de fórmulas e reações."</p>
  <footer class="text-light">ALMEIDA, 2015, p. 19</footer>
</blockquote>

<p>A especificidade dos objetos de estudo da Química atribui à disciplina uma natureza peculiar, exigindo a integração de fundamentação teórica com atividades práticas e recursos visuais (FELTRE, 2004). Dessa forma, a padronização de equações, fórmulas, gráficos e textos é essencial, visto que a escolha das formas de representação interfere diretamente na clareza do conteúdo e pode influenciar os resultados obtidos (ALMEIDA, 2015).</p>

<p>A Química desenvolveu uma linguagem própria composta por símbolos, fórmulas, imagens e práticas. Entender Química exige interpretar e usar essa linguagem para estudar os fenômenos naturais.</p>

<h2 id="tabela-periodica">Tabela periódica</h2>
<hr />

<p>Tolentino e Rocha-Filho (1997, p. 1) afirmam que:</p>

<blockquote class="bg-dark text-light rounded shadow-lg p-4 my-5 border-start border-4 border-primary">
  <p class="lead fst-italic lh-lg">"[...] A classificação periódica dos elementos é, sem dúvida, uma das maiores e mais valiosas generalizações científicas. Concretizada na segunda metade da década de 60 do século 19, desde então muito serviu como guia de pesquisas em Química e, aos poucos, se tornou um valioso instrumento didático no ensino da Química."</p>
  <footer class="text-light">TOLENTINO; ROCHA-FILHO, 1997, p. 1</footer>
</blockquote>

<p>A tabela periódica organiza os elementos químicos por número atômico, destacando padrões nas propriedades devido à configuração eletrônica dos átomos.</p>

<p>As linhas horizontais da tabela periódica, denominadas períodos, localizam à esquerda os metais e à direita os não metais. As colunas verticais, conhecidas como grupos, reúnem elementos com propriedades específicas, exemplificados pelo grupo 1, que corresponde aos metais alcalinos (FELTRE, 2004).</p>

<p>Elementos de um mesmo grupo tendem a apresentar semelhanças marcantes, geralmente mais evidentes do que aquelas verificadas entre elementos de um mesmo período. Contudo, algumas exceções ocorrem, sendo as similaridades entre lantanídeos e actinídeos dentro de um mesmo período um exemplo relevante (FELTRE, 2004).</p>

<p>De acordo com a lei periódica de Moseley, as propriedades físicas e químicas dos elementos mudam periodicamente conforme seus números atômicos aumentam. Essas mudanças, chamadas de propriedades periódicas, aparecem ao longo da tabela periódica, como é o caso do raio atômico, da eletronegatividade e da eletropositividade (FELTRE, 2004).</p>

<p>A classificação em blocos na tabela periódica reflete a distribuição dos elétrons nos átomos.</p>

<ul>
  <li>
    <p>O bloco <strong>s</strong> inclui elementos como hidrogênio, hélio e metais alcalinos;</p>
  </li>
  <li>
    <p>O bloco <strong>p</strong> reúne elementos diversos, incluindo metaloides;</p>
  </li>
  <li>
    <p>O bloco <strong>d</strong> corresponde aos metais de transição;</p>
  </li>
  <li>
    <p>O bloco <strong>f</strong> agrupa lantanídeos e actinídeos.</p>
  </li>
</ul>

<p>A repetição de certos padrões, chamada periodicidade, é a base para criar a lei periódica e a tabela periódica. Isso significa que elementos em posições parecidas mostram características semelhantes, como o tamanho dos átomos, a facilidade para ganhar ou perder elétrons e a energia necessária para retirar um elétron.</p>

<p>Essa regularidade acontece por causa da configuração eletrônica única de cada elemento, o que define suas propriedades químicas e modos típicos de agir.</p>

<h3 id="propriedades-da-tabela-periodica">Propriedades da tabela periódica</h3>
<hr />

<p>Propriedades químicas seguem padrões na tabela periódica, facilitando comparações. Energia de ionização indica quão difícil é perder um elétron; afinidade eletrônica mostra a energia liberada ao receber um elétron. Ambos variam de forma previsível entre os elementos.</p>

<p>O raio atômico, que indica o tamanho do átomo, varia sistematicamente de acordo com a posição do elemento na tabela periódica.</p>

<div class="text-center mb-4">
    <figcaption>Figura 2: Variação das propriedades periódicas na tabela periódica.</figcaption>
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://upload.wikimedia.org/wikipedia/commons/thumb/a/a9/Periodic_trends_-_pt_edition.svg/600px-Periodic_trends_-_pt_edition.svg.png" alt="Diagrama mostrando as tendências periódicas da tabela periódica." loading="lazy" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

    <figcaption>Fonte: <a href="https://upload.wikimedia.org/wikipedia/commons/thumb/a/a9/Periodic_trends_-_pt_edition.svg/600px-Periodic_trends_-_pt_edition.svg.png" target="_blank" rel="noopener noreferrer" class="text-break d-inline-block mw-100">      https://upload.wikimedia.org/wikipedia/commons/thumb/a/a9/Periodic_trends_-_pt_edition.svg/600px-Periodic_trends_-_pt_edition.svg.png</a></figcaption>
</div>
<div class="sr-only">
    <p>Descrição detalhada da imagem: A imagem mostra a tabela periódica dos elementos em forma de retângulo dividido em pequenos quadrados (cada um representando um elemento químico). Sobre essa tabela, há setas coloridas que indicam como algumas propriedades periódicas variam de acordo com a posição dos elementos.</p>
    <p>Raio atômico (tamanho do átomo):</p>

    <ul>
        <li>Representado por uma seta azul grossa apontando de cima para baixo (mostrando que aumenta ao descer na tabela). </li>
        <li>Outra seta azul aponta da direita para a esquerda, indicando que o raio também cresce nesse sentido. </li>
        <li>
            Em resumo: átomos maiores estão mais à esquerda e embaixo na tabela. </li>
    </ul>

    <p>Energia de ionização (energia para retirar um elétron): </p>

    <ul>
        <li>Uma seta vermelha apontando da esquerda para a direita, mostrando que essa energia cresce nesse sentido. </li>
        <li>Outra seta vermelha aponta de baixo para cima, reforçando que também cresce ao subir na tabela. </li>
        <li>Isso significa que é mais difícil retirar elétrons de elementos localizados no canto superior direito (como o flúor). </li>
    </ul>

    <p>Afinidade eletrônica (energia liberada ao ganhar um elétron): </p>

    <ul>
        <li>Representada por uma seta marrom apontando da esquerda para a direita e outra de baixo para cima. </li>
        <li>Indica que os elementos no canto superior direito tendem a atrair elétrons com mais facilidade. </li>
    </ul>

    <p>Características metálicas: </p>

    <ul>
        <li>Uma seta cinza-escura atravessa a tabela do canto superior direito para o canto inferior esquerdo, mostrando que a tendência metálica aumenta nesse sentido. </li>
        <li>Ou seja, os metais predominam na parte esquerda e inferior da tabela (como sódio e cálcio). </li>
    </ul>

    <p>Características não-metálicas: </p>

    <ul>
        <li>Uma seta marrom mais clara atravessa a tabela do canto inferior esquerdo para o canto superior direito, indicando que as propriedades não-metálicas crescem nesse sentido. </li>
        <li>Assim, os não-metais estão mais concentrados na parte superior direita (como oxigênio, nitrogênio e cloro). </li>
    </ul>

    <p>Fim da descrição detalhada da imagem.</p>
</div>

<p>Além dessas características, observa-se uma diferença clara entre os grupos de elementos: os metais, que ficam majoritariamente à esquerda da tabela, apresentam-se geralmente sólidos em temperatura ambiente, conduzem bem calor e eletricidade, além de serem maleáveis e dúcteis; por outro lado, os não metais estão principalmente à direita da tabela, podendo ser encontrados nos estados sólido, líquido ou gasoso, e não são bons condutores de calor e eletricidade.</p>

<p>Mais do que apenas uma lista de símbolos, a tabela periódica é organizada de forma a revelar padrões, similaridades e distinções entre os elementos, o que torna mais fácil entender suas propriedades químicas e como eles se comportam.</p>

<h2 id="tecnologias-assistivas-no-ensino-de-quimica">Tecnologias assistivas no ensino de Química</h2>
<hr />

<p>Conforme estabelece a Lei nº 13.146, de 6 de julho de 2015, conhecida como Lei Brasileira de Inclusão da Pessoa com Deficiência (BRASIL, 2015), o Art. 3º, inciso III, define tecnologias assistivas nos seguintes termos:</p>

<blockquote class="bg-dark text-light rounded shadow-lg p-4 my-5 border-start border-4 border-primary">
  <p class="lead fst-italic lh-lg">"[...] produtos, equipamentos, dispositivos, recursos, metodologias, estratégias, práticas e serviços que objetivem promover a funcionalidade, relacionada à atividade e à participação da pessoa com deficiência ou com mobilidade reduzida, visando à sua autonomia, independência, qualidade de vida e inclusão social."</p>
  <footer class="text-light">BRASIL, 2015</footer>
</blockquote>

<p>Tecnologias assistivas são ferramentas que possibilitam a participação de pessoas com deficiência, promovendo inclusão e autonomia. No ensino de Química, garantem acesso igualitário ao conteúdo para alunos com deficiência visual.</p>

<p>O uso dessas ferramentas se torna ainda mais eficaz quando está em sintonia com o conceito de desenho universal, que, segundo o artigo 3º, inciso III, da Lei Brasileira de Inclusão (Lei nº 13.146/2015), é definido como:</p>

<blockquote class="bg-dark text-light rounded shadow-lg p-4 my-5 border-start border-4 border-primary">
  <p class="lead fst-italic lh-lg">"[...] concepção de produtos, ambientes, programas e serviços a serem usados por todas as pessoas, sem necessidade de adaptação ou de projeto específico, incluindo os recursos de tecnologia assistiva."</p>
  <footer class="text-light">BRASIL, 2015</footer>
</blockquote>

<p>Esse conceito defende que produtos e ambientes sejam criados desde o início para atender a todos, sem depender de adaptações posteriores, considerando diversas características físicas, sensoriais e cognitivas.</p>

<p>As tecnologias assistivas variam em complexidade. As chamadas <em>low-tech</em> (tecnologias de baixa complexidade) incluem opções simples, como:</p>

<ul>
  <li><strong>planos inclinados para leitura</strong>;</li>
  <li><strong>lápis de ponta grossa</strong>;</li>
  <li><strong>marcadores de página em Braille</strong>;</li>
  <li><strong>materiais táteis confeccionados artesanalmente</strong>.</li>
</ul>

<p>Por outro lado, as <em>high-tech</em> (tecnologias de alta complexidade) abrangem equipamentos e materiais industriais, como por exemplo:</p>

<ul>
  <li><strong><em>softwares</em> leitores de tela</strong>;</li>
  <li><strong>impressoras Braille</strong>;</li>
  <li><strong>lupas eletrônicas</strong>;</li>
  <li><strong>dispositivos de ampliação de tela</strong>.</li>
</ul>

<p>Essas tecnologias podem ser organizadas em categorias específicas, que abrangem desde tarefas diárias até lazer. Exemplos são:</p>

<ul>
  <li><strong>Auxílios para a vida diária e prática</strong>: engrossadores de lápis, cadernos com pauta grossa, utensílios de cozinha adaptados.</li>
  <li><strong>Comunicação alternativa (CAA)</strong>: pranchas de comunicação, vocalizadores de fala, intérpretes virtuais de <em>Libras</em>.</li>
  <li><strong>Acessibilidade ao computador</strong>: teclados adaptados, leitores de tela, <em>softwares</em> de comando de voz.</li>
  <li><strong>Controle de ambiente</strong>: sistemas de iluminação controlados por voz, torneiras com sensor, assistentes virtuais como <em>Alexa</em> e <em>Google Home</em>.</li>
  <li><strong>Projetos arquitetônicos acessíveis</strong>: rampas, pisos táteis, banheiros acessíveis.</li>
  <li><strong>Órteses e próteses</strong>: próteses de membros, aparelhos ortopédicos, posicionadores posturais.</li>
  <li><strong>Adequação postural</strong>: almofadas especiais, planos inclinados, encostos anatômicos.</li>
  <li><strong>Auxílios de mobilidade</strong>: cadeiras de rodas, bengalas, andadores.</li>
  <li><strong>Recursos para baixa visão e cegueira</strong>: lupas, ampliadores, <em>Braille</em>, relógios falantes.</li>
  <li><strong>Recursos para surdez</strong>: legendas, sistemas de alerta vibratório em celulares, sinais visuais de alerta.</li>
  <li><strong>Mobilidade veicular</strong>: automóveis adaptados, elevadores em ônibus.</li>
  <li><strong>Esporte e lazer</strong>: bolas com guizo, dominó em alto relevo, baralhos em <em>Braille</em>.</li>
</ul>

<p>Categorias da Tecnologia Assistiva (BERSCH, 2013).</p>

<p>Os exemplos mostram como as tecnologias assistivas são amplas e versáteis, capazes de transformar práticas educativas, especialmente nas aulas de Química. Além disso, essas ferramentas promovem inclusão e garantem que estudantes com deficiência tenham acesso efetivo em diferentes áreas do conhecimento.</p>

<h2 id="internet-e-desenvolvimento-web-como-tecnologias-assistivas">Internet e desenvolvimento Web como tecnologias assistivas</h2>
<hr />

<p>A internet é uma rede mundial de computadores que permite a troca de informações entre usuários em qualquer lugar. Já a web consiste em páginas conectadas, acessadas por navegadores como Google Chrome, Firefox ou Safari.</p>

<p>O desenvolvimento web envolve planejar, criar e manter recursos online, utilizando linguagens e tecnologias específicas para assegurar a funcionalidade e a boa experiência em sites e aplicações (OLIVEIRA, 2021).</p>

<p>Esta área é organizada em dois domínios fundamentais:</p>

<ul>
  <li>
    <p><a href="https://pcdnaescola.com.br/computacao-para-iniciantes/programas-ou-softwares/#o-que-e-front-end" target="_blank" rel="noopener noreferrer"><strong>Front-end</strong></a>: refere-se à parte visual e interativa do site ou aplicação, com a qual as pessoas interagem diretamente. São os botões, menus, textos, mídias e outros elementos que compõem a interface do usuário.</p>
  </li>
  <li>
    <p><a href="https://pcdnaescola.com.br/computacao-para-iniciantes/programas-ou-softwares/#o-que-e-back-end" target="_blank" rel="noopener noreferrer"><strong>Back-end</strong></a>: é a parte que funciona nos bastidores, responsável por processar dados, gerenciar servidores e bancos de dados. O back-end lida com a lógica do sistema, as regras de negócio, autenticação de usuários, armazenamento de informações e comunicação com o front-end.</p>
  </li>
</ul>

<p>Conteúdos na internet podem ser acessíveis desde o início usando tecnologias apropriadas, tornando a web uma ferramenta assistiva graças à sua versatilidade.</p>

<p>Um site ou aplicativo vai além de uma imagem estática, composto por camadas de informação que se complementam para atender a diferentes necessidades. Por exemplo, um gráfico pode não ser acessível para pessoas cegas, mas um código bem estruturado pode detalhar cada ponto do gráfico, tornando-o compatível com leitores de tela.</p>

<p>Essa abordagem está em consonância com o conceito de Desenho Universal, cujo objetivo é criar produtos e ambientes acessíveis para todos, independentemente das necessidades individuais. O desenvolvimento da Internet e de aplicações Web com foco em acessibilidade contribui para a eliminação de barreiras educacionais, assegurando que o conteúdo esteja disponível para todas as pessoas.</p>

<p>Para isso, é essencial seguir as diretrizes de acessibilidade, como o <em>WCAG</em> (<em>Web Content Accessibility Guidelines</em>). O <em>WCAG</em> é um conjunto de recomendações internacionais que orienta a criação de conteúdos <em>Web</em> acessíveis para pessoas com deficiência.</p>

<p>Quando um site segue essas diretrizes, ele se torna compatível com tecnologias assistivas, como leitores de tela e linhas <em>Braille</em>. A inclusão, nesse sentido, não é um recurso extra, mas parte do processo de criação.</p>

<p>A internet e o desenvolvimento web tornam-se acessíveis ao aplicar práticas de codificação e design que garantem a leitura visual e semântica das informações. Assim, o conteúdo é logicamente estruturado para facilitar a interpretação por tecnologias assistivas que vão interfacear a comunicação entre a pessoa e o conteúdo digital.</p>

<p>Entre essas práticas, destacam-se os aspectos apresentados a seguir.</p>

<h3 id="html-semantico"><em>HTML</em> Semântico</h3>
<hr />

<p>Trata-se do uso de elementos de código que deixam clara a função estrutural de cada parte da página.</p>

<p>Ao invés de usar apenas elementos genéricos, como <em>&lt;div&gt;</em> e <em>&lt;span&gt;</em>, o <em>HTML</em> semântico emprega tags (etiquetas) específicas, como:</p>

<ul>
  <li><em>&lt;header&gt;</em> para o cabeçalho,</li>
  <li><em>&lt;nav&gt;</em> para a navegação,</li>
  <li><em>&lt;article&gt;</em> para artigos,</li>
  <li><em>&lt;section&gt;</em> para seções,</li>
  <li><em>&lt;footer&gt;</em> para o rodapé,</li>
  <li><em>&lt;ul&gt;</em> para listas não ordenadas,</li>
  <li><em>&lt;ol&gt;</em> para listas ordenadas,</li>
  <li><em>&lt;li&gt;</em> para itens de lista,</li>
  <li>E assim por diante.</li>
</ul>

<p>Essas tags definem de forma explícita a função de cada seção do conteúdo, contribuindo para uma melhor compreensão da estrutura da página.</p>

<p>Em vez de a pessoa desenvolvedora criar tudo de maneira genérica e apenas alterar a aparência visual, desde o início são sugeridos elementos estruturais que facilitam a compreensão da natureza do conteúdo.</p>

<p>Os <em>softwares</em> leitores de tela reconhecem as marcações semânticas e informam as pessoas usuárias sobre como o conteúdo está organizado hierarquicamente, tornando a navegação e a compreensão do contexto mais fáceis.</p>

<div class="text-center mb-4">
    <figcaption>Figura 3: Comparação entre <em>HTML</em> semântico e não semântico.</figcaption>
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://imagedelivery.net/Ruw4waFkOelbXULIoE-oQg/a853eb89-dbf2-4e78-41ca-75712f919600/public" alt="Ilustração comparando HTML semântico e não semântico." loading="lazy" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

    <div class="sr-only">
        <p>Descrição detalhada da imagem: A imagem é um infográfico em fundo preto, com o título grande no topo “<em>HTML</em> Semântico: Clareza Estrutural e Acessibilidade”, comparando duas formas de estruturar páginas.</p>
        <p>À esquerda, a seção “Genérico (Ruim)” traz o subtítulo “Tudo igual, difícil de entender” e mostra um bloco cinza com várias caixas com tags de “&lt;div&gt;” e algumas “&lt;span&gt;”, ilustrando uma estrutura confusa. Uma seta azul liga esse bloco a um monitor com interrogações (“???”), indicando falta de clareza na organização do conteúdo.</p>
        <p>O centro mostra um ícone de pessoa com notebook e a legenda “Estrutura desde o início”, ligado por linhas coloridas ao texto “Acessibilidade e compreensão”, destacando que uma estrutura adequada facilita o uso por pessoas com tecnologias assistivas como leitores de tela.</p>
        <p>No lado direito encontra-se a seção “Semântico (Bom)”, com o subtítulo “Função explícita, fácil de entender”. Ali é apresentado um wireframe (esboço) azul de uma página, cujas áreas são claramente identificadas:</p>
        <ul>
            <li>no topo está o “&lt;header&gt;” tag para o cabeçalho da página,</li>
            <li>seguido por “&lt;nav&gt;”; para a barra de navegação (menu),</li>
            <li>o conteúdo principal aparece dividido em blocos verdes, com “&lt;article&gt;” (artigo) à esquerda, “&lt;section&gt;” (seção) ao centro e outra “&lt;section&gt;” (seção) à direita, que exibe exemplos de listas com “&lt;ul&gt;” (lista não ordenada), “&lt;ol&gt;” (lista ordenada) e “&lt;li&gt;” (item de lista).</li>
            <li>Na base da página encontra-se o “&lt;footer&gt;” (rodapé) da página.</li>
        </ul>
        <p>Abaixo desse esquema visual, outro monitor apresenta um ícone de alto-falante e balões rotulados indicam os elementos facilmente reconhecíveis, como “Navegação”, “Cabeçalho”, “Artigo”, “Rodapé” e “Lista”.</p>
        <p>Uma seta curva verde aponta para o layout semântico (página estruturada com as tags que indicam a função de cada elemento), acompanhada da frase “Organização hierárquica clara para todos, incluindo leitores de tela”, destacando que essa maneira de construir páginas facilita a compreensão para todas as pessoas incluindo aquelas que utilizam tecnologias assistivas como leitores de tela.</p>
        <p>Resumindo: a imagem compara duas formas de estruturar páginas web, mostrando que o <em>HTML</em> semântico, com tags específicas, oferece clareza e acessibilidade, enquanto o <em>HTML</em> genérico dificulta a compreensão do conteúdo e trata tudo de forma igual.</p>
        <p>Fim da descrição detalhada da imagem.</p>
    </div>
    <figcaption>Fonte: Elaborado pela autora.</figcaption>
</div>

<h3 id="texto-alternativo-em-imagens-alt-text">Texto Alternativo em Imagens (<em>Alt Text</em>)</h3>
<hr />

<p>O texto alternativo é uma descrição textual associada a imagens, inserida pelo atributo <em>alt</em> (texto alternativo) na tag <em>&lt;img&gt;</em> (que serve para inserir imagens) do HTML. Ele permite que pessoas cegas, usando leitores de tela, compreendam o conteúdo visual das imagens.</p>

<p>No ensino de Química, usar representações gráficas com textos alternativos detalhando a composição molecular é recomendado. Por exemplo:</p>

<div class="text-center mb-4">
    <figcaption>Figura 4: Estrutura molecular do benzeno.</figcaption>
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://imagedelivery.net/Ruw4waFkOelbXULIoE-oQg/dde96d0f-0607-4ab3-d3ec-51f9825b0300/public" alt="Estrutura molecular do benzeno (C6H6)." loading="lazy" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

    <figcaption class="visually-hidden">Descrição detalhada da imagem: A imagem mostra um desenho simples, em preto e branco, de uma molécula em forma de anel: seis letras “C” (carbono) formam um hexágono, como se fosse uma “argola” com seis lados. Entre esses carbonos aparecem linhas alternadas (algumas duplas e outras simples), indicando as ligações entre eles. Em volta do anel, há seis letras “H” (hidrogênio), uma ligada a cada carbono, apontando para fora do hexágono. É o tipo de esquema usado em química para mostrar a estrutura de uma molécula, com tudo bem centralizado em um fundo branco.</figcaption>
    <figcaption>Fonte: <a href="https://upload.wikimedia.org/wikipedia/commons/2/23/Benzene-2D-flat.png" target="_blank" class="text-break">https://upload.wikimedia.org/wikipedia/commons/2/23/Benzene-2D-flat.png</a></figcaption>
</div>

<p>A imagem é inserida assim no código <em>HTML</em>:</p>

<div class="language-html bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;figure</span> <span class="na">class=</span><span class="s">"custom-figure text-center my-5"</span><span class="nt">&gt;</span>
    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">"figure-container position-relative d-inline-block"</span><span class="nt">&gt;</span>
        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">"image-wrapper position-relative overflow-hidden shadow-lg"</span><span class="nt">&gt;</span>

            <span class="nt">&lt;img</span> <span class="na">class=</span><span class="s">"img-fluid"</span>
                 <span class="na">src=</span><span class="s">"endereco-da-imagem"</span>
                  <span class="na">alt=</span><span class="s">"Estrutura molecular do benzeno (C6H6)."</span>
                  <span class="na">loading=</span><span class="s">"lazy"</span>
                   <span class="nt">/&gt;</span>

            <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">"image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center"</span>
                 <span class="na">aria-hidden=</span><span class="s">"true"</span><span class="nt">&gt;</span>
                <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">"text-center"</span><span class="nt">&gt;</span>
                    <span class="nt">&lt;i</span> <span class="na">class=</span><span class="s">"material-icons text-white fs-1 mb-3 zoom-icon"</span> <span class="na">aria-hidden=</span><span class="s">"true"</span><span class="nt">&gt;</span>zoom_in<span class="nt">&lt;/i&gt;</span>
                    <span class="nt">&lt;p</span> <span class="na">class=</span><span class="s">"text-white small mb-0 zoom-text"</span><span class="nt">&gt;</span>Clique para ampliar<span class="nt">&lt;/p&gt;</span>
                <span class="nt">&lt;/div&gt;</span>
            <span class="nt">&lt;/div&gt;</span>
        <span class="nt">&lt;/div&gt;</span>

        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">"figure-decoration position-absolute bottom-0 start-50 translate-middle-x"</span>
             <span class="na">aria-hidden=</span><span class="s">"true"</span><span class="nt">&gt;</span>
            <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">"bg-primary rounded-pill shadow-sm accent-bar"</span><span class="nt">&gt;&lt;/div&gt;</span>
        <span class="nt">&lt;/div&gt;</span>
    <span class="nt">&lt;/div&gt;</span>

    
<span class="nt">&lt;/figure&gt;</span>

<span class="nt">&lt;figcaption&gt;</span>Descrição detalhada da imagem: A imagem mostra um desenho simples, em preto e branco, de uma molécula em forma de anel: seis letras “C” (carbono) formam um hexágono, como se fosse uma “argola” com seis lados. Entre esses carbonos aparecem linhas alternadas (algumas duplas e outras simples), indicando as ligações entre eles. Em volta do anel, há seis letras “H” (hidrogênio), uma ligada a cada carbono, apontando para fora do hexágono. É o tipo de esquema usado em química para mostrar a estrutura de uma molécula, com tudo bem centralizado em um fundo branco.<span class="nt">&lt;/figcaption&gt;</span>
</code></pre></div></div>

<p>O atributo <em>alt</em> deve ser resumido, claro e descritivo, transmitindo a informação essencial da imagem. Para desenhos complexos, como gráficos ou diagramas, é recomendável fornecer uma descrição mais detalhada em um texto complementar próximo à imagem como é feito com a tag <em>&lt;figcaption&gt;</em> que serve para legendar figuras.</p>

<h3 id="compatibilidade-com-leitores-de-telas">Compatibilidade com Leitores de Telas</h3>
<hr />

<p>Leitores de tela convertem conteúdo visual em áudio ou tato via dispositivos Braille. Sites e aplicativos devem garantir a interação eficiente desses <em>softwares</em> com todos os componentes da interface, incluindo botões, hiperlinks e menus de navegação.</p>

<p>A falta de compatibilidade dificulta o acesso à informação para pessoas com deficiência visual, tornando recursos digitais obstáculos à inclusão. Para assegurar essa compatibilidade, é essencial seguir as diretrizes de acessibilidade, como o <em>WCAG</em>, e testar regularmente os recursos com leitores de tela populares, como <em>NVDA</em>, <em>JAWS</em> e <em>VoiceOver</em>.</p>

<h3 id="design-de-alto-contraste-e-tamanho-de-fonte-ajustavel"><em>Design</em> de Alto Contraste e Tamanho de Fonte Ajustável:</h3>
<hr />

<p>Para pessoas com baixa visão, a inclusão de recursos que possibilitam a personalização do contraste de cores e do tamanho da tipografia é fundamental para garantir a acessibilidade. O desenvolvimento web atual adota funcionalidades que permitem ajustar esses parâmetros visuais, conferindo a pessoa autonomia para adaptar a apresentação do conteúdo às suas necessidades perceptivas particulares.</p>

<h3 id="wai-aria-accessible-rich-internet-applications"><em>WAI-ARIA</em> (<em>Accessible Rich Internet Applications</em>)</h3>
<hr />

<p><em>WAI-ARIA</em> (<em>Accessible Rich Internet Applications</em> ou em Português, Aplicações Ricas de Internet Acessíveis) é uma especificação técnica do W3C (World Wide Web Consortium - um consórcio internacional que desenvolve padrões para a web) que adiciona atributos ao HTML para melhorar a acessibilidade de aplicações web dinâmicas. Esses atributos fornecem metadados sobre função, estado e propriedades dos elementos, facilitando a interpretação por tecnologias assistivas.</p>

<p>Esta especificação é importante para implementar interfaces complexas, como abas, menus expansíveis e modais, onde a semântica estrutural do <em>HTML</em> pode não ser suficiente para descrever o comportamento e as relações dos elementos interativos.</p>

<p>Exemplos de atributos <em>WAI-ARIA</em> incluem:</p>

<ul>
  <li>
    <p><em>aria-label</em>: fornece uma etiqueta descritiva para elementos interativos como botões ou links. Por exemplo, uma sequência de botões que só contém ícones pode usar <em>aria-label</em> para descrever a função de cada botão.</p>
  </li>
  <li>
    <p><em>aria-hidden</em>: indica se um elemento deve ser ignorado por tecnologias assistivas. Isso é útil para ocultar elementos decorativos que não contribuem para a compreensão do conteúdo.</p>
  </li>
  <li>
    <p><em>role</em>: define o papel de um elemento na interface que pode não ser evidente apenas pela tag <em>HTML</em>. Por exemplo, um <em>&lt;section&gt;</em> (<em>seção</em>) pode ser designado como um <em>role=”dialog”</em> para indicar que é uma janela modal interativa.</p>
  </li>
</ul>

<h3 id="acessibilidade-no-codigo">Acessibilidade no Código</h3>
<hr />

<p>A acessibilidade no código envolve a aplicação de boas práticas de desenvolvimento web para garantir que todas as pessoas, independentemente de suas habilidades, possam acessar e interagir com o conteúdo digital. Isso inclui o uso de <em>HTML</em> semântico, atributos <em>WAI-ARIA</em>, textos alternativos para imagens, navegação por teclado, entre outros.</p>

<p>Além disso, conteúdos suplementares, como tooltips ou submenus, não devem ser ativados exclusivamente através do foco por mouse (<em>mouse over</em>) ou teclado (<em>focus</em>), mas sim por ambos os métodos, garantindo que todas as pessoas possam acessar essas informações.</p>

<p>É fundamental também que a funcionalidade seja independente da orientação da tela, garantindo sempre múltiplas alternativas de acesso ao conteúdo. Mensagens relevantes para a pessoa, como confirmações de ações executadas ou notificações sobre o andamento de processos, devem ser comunicadas sem ocasionar alterações no contexto ou foco da interface.</p>

<p>Existem outras diretrizes que falam sobre toda funcionalidade baseada em arrastar e soltar ter alternativa por clique, toque, teclado ou comando de voz, entre outras recomendações. São muitas boas práticas que devem ser adotadas para garantir a acessibilidade no código.</p>

<p>O ideial é que equipes de desenvolvimento de <em>software</em> estejam sempre atualizadas sobre as melhores práticas e diretrizes de acessibilidade, como as do <em>WCAG</em>, para criar experiências digitais inclusivas. É sempre melhor um projeto nascer acessível do que tentar adaptar algo que já existe sem boas práticas de acessibilidade.</p>

<h2 id="desenvolvimento-de-uma-tabela-periodica-acessivel">Desenvolvimento de uma Tabela Periódica Acessível</h2>
<hr />

<p>Considerando os desafios já destacados, criou-se uma tabela periódica focada na acessibilidade. Esse recurso foi desenvolvido seguindo princípios fundamentais para assegurar que qualquer pessoa, inclusive aquelas com diferentes condições visuais, possa acessar e utilizar a tabela com facilidade.</p>

<p>Os critérios de acessibilidade estabelecidos são:</p>

<ul>
  <li>
    <p><strong>Compatibilidade com leitores de tela</strong>: A tabela foi estruturada para que pessoas que utilizam leitores de tela consigam acessar, entender e interagir facilmente com todas as informações fornecidas.</p>
  </li>
  <li>
    <p><strong>Adaptabilidade</strong>: O design responsivo assegura que a tabela seja exibida corretamente em uma ampla variedade de dispositivos, incluindo smartphones, tablets e computadores. Dessa forma, o conteúdo permanece consistente e acessível independentemente do tamanho do texto ou das necessidades visuais da pessoa, viabilizando a navegação tanto nos modos retrato (vertical) quanto paisagem (horizontal), sem apresentar distorções.</p>
  </li>
  <li>
    <p><strong>Independência das cores</strong>: As relações químicas são indicadas por sinais e descrições além das cores, facilitando a compreensão inclusive para quem tem deficiência de percepção cromática ou não enxerga.</p>
  </li>
  <li>
    <p><strong>Alto contraste</strong>: Há opções com cores muito destacadas, como letras brancas em fundo preto e diferentes tons de cinza, facilitando a leitura para pessoas com baixa visão.</p>
  </li>
  <li>
    <p><strong>Ajuste de tamanho do texto</strong>: O tamanho da fonte pode ser alterado conforme a necessidade, garantindo a manutenção da integridade e clareza das informações apresentadas.</p>
  </li>
  <li>
    <p><strong>Integração com VLibras</strong>: Um botão exclusivo para VLibras (sistema de tradução automática para a Língua Brasileira de Sinais) permite converter textos para Libras, promovendo maior acessibilidade para pessoas surdas.</p>
  </li>
</ul>

<p>A Tabela Periódica Acessível busca garantir precisão semântica, preservando o significado original do conteúdo. Materiais fidedignos (fiéis) não apresentam alterações ou distorções em seu sentido.</p>

<p>É importante destacar que a interação entre tecnologias assistivas e conteúdo sem acessibilidade pode comprometer a transmissão eficiente de informações, impactando de forma significativa as áreas de ciências exatas e tecnológicas. Dessa forma, o desenvolvimento de recursos acessíveis torna-se fundamental para assegurar o acesso equitativo ao conhecimento científico por todas as pessoas.</p>

<p>A interpretação da tabela periódica pode ser bastante desafiadora para pessoas cegas ou com baixa visão, mesmo quando fazem uso de leitores de tela. A presença de símbolos, números e agrupamentos torna a compreensão auditiva difícil, principalmente se as descrições não forem bem-organizadas.</p>

<p>A maioria das soluções online ignora práticas de acessibilidade e dificulta o aprendizado de pessoas cegas, com daltonismo, dislexia ou baixa visão. Assim, criar uma tabela periódica acessível é fundamental para incluir todos os estudantes no estudo da Química.</p>

<p>Adicionalmente a solução foi desenvolvida para funcionar eficientemente mesmo com internet limitada e em dispositivos de baixo desempenho, priorizando o baixo uso de recursos e dados. O objetivo é facilitar o acesso à tabela periódica em regiões com infraestrutura tecnológica restrita, permitindo que mais pessoas consultem o recurso sem barreiras técnicas.</p>

<h3 id="metodologia">Metodologia</h3>
<hr />

<p>A criação da Tabela Periódica Acessível envolveu um processo iterativo de descoberta, prototipagem, testes, ajustes e otimizações, guiado por quatro objetivos principais:</p>

<ul>
  <li>
    <p><strong>Compatibilidade com Tecnologias Assistivas</strong>: Assegurar que a ferramenta ofereça total funcionalidade para leitores de tela, linhas Braille e lupas eletrônicas, utilizando <em>HTML</em> semântico, recursos <em>WAI-ARIA</em> e gerenciamento apropriado de foco.</p>
  </li>
  <li>
    <p><strong>Responsividade e Baixo Custo Cognitivo</strong>: Proporcionar uma experiência de uso eficiente em qualquer dispositivo, assegurando navegação intuitiva, áreas de toque adequadas e um layout responsivo que preserva a organização das informações.</p>
  </li>
  <li>
    <p><strong>Configuração Visual</strong>: Oferecer as pessoas a possibilidade de modificar aspectos visuais da ferramenta, como contraste ou tamanho da fonte, conforme suas preferências, que podem ser armazenadas para uso futuro.</p>
  </li>
  <li>
    <p><strong>Garantir a precisão semântica do conteúdo</strong>: Transmitir corretamente todas as informações e relações químicas, incluindo períodos, grupos e categorias, sem confiar apenas em elementos visuais como cores ou organização espacial.</p>
  </li>
</ul>

<p>Todas as decisões técnicas e de design seguiram quatro princípios fundamentais.</p>

<p><strong>1. Independência de Modalidade Sensorial</strong></p>

<p>As cores são usadas apenas para reforço visual e nunca como única fonte de informação. Cada categoria química é identificada por:</p>

<ul>
  <li>
    <p>Texto claro no rótulo</p>
  </li>
  <li>
    <p>Agrupamento em seções com cabeçalhos</p>
  </li>
  <li>
    <p>Atributos <em>ARIA</em></p>
  </li>
  <li>
    <p>Detalhes nas janelas modais</p>
  </li>
</ul>

<p>Assim, qualquer pessoa, independentemente de sua capacidade visual, pode compreender as relações entre os elementos químicos.</p>

<p><strong>2. Compatibilidade com Tecnologias Assistivas</strong></p>

<p>Todos os componentes interativos estão devidamente configurados com atributos <em>WAI-ARIA</em> apropriados:</p>

<ul>
  <li>
    <p><strong><em>role</em></strong>: determina o papel semântico do elemento (caixa de diálogo, botão, navegação, etc.);</p>
  </li>
  <li>
    <p><strong><em>aria-label</em></strong> ou <strong><em>aria-labelledby</em></strong>: atribui rótulos acessíveis a elementos interativos;</p>
  </li>
  <li>
    <p><strong><em>aria-pressed</em></strong>: sinaliza o estado (pressionado ou não) de botões do tipo alternância (toggle);</p>
  </li>
  <li>
    <p><strong><em>aria-expanded</em></strong>: informa se um componente expansível está aberto ou fechado (como menus ou acordeões);</p>
  </li>
  <li>
    <p><strong><em>aria-hidden</em></strong>: oculta elementos estritamente decorativos dos leitores de tela ou linhas Braille;</p>
  </li>
  <li>
    <p><strong><em>aria-live</em></strong>: anuncia alterações dinâmicas no conteúdo sem interromper o foco atual como mensagens de confirmação ou erros.</p>
  </li>
</ul>

<p>O foco é gerenciado programaticamente para garantir que, ao abrir janelas modais, ele seja imediatamente direcionado ao primeiro elemento interativo. Ao fechar a janela, o foco retorna exatamente ao botão ativador, assegurando a continuidade e o contexto da navegação da pessoa.</p>

<p><strong>3. Configurabilidade Visual Personalizada</strong></p>

<p>Visando atender à pluralidade de necessidades visuais, foram desenvolvidos controles que possibilitam ampla personalização, a saber:</p>

<ul>
  <li>
    <p><strong>Alto contraste</strong>: relação de luminância (medida da intensidade de luz emitida ou refletida por uma superfície) superior a 7:1, em conformidade com o nível AAA do WCAG (<em>Web Content Accessibility Guidelines</em>);</p>
  </li>
  <li>
    <p><strong>Contraste negativo</strong>: inversão de polaridade (contraste negativo) destinada a pessoas sensíveis a fundos claros;</p>
  </li>
  <li>
    <p><strong>Escala de cinza</strong>: supressão integral das informações cromáticas (cores) para facilitar a distinção de elementos por meio de formas e textos;</p>
  </li>
  <li>
    <p><strong>Ajuste de tamanho de texto</strong>: possibilidade de escalonamento (zoom) entre 80% e 200%, mantendo a integridade do layout;</p>
  </li>
  <li>
    <p><strong>Sublinhado de links</strong>: reforço visual para identificação independentemente da cor;</p>
  </li>
  <li>
    <p><strong>Fontes aprimoradas</strong>: tipografias (fontes) otimizadas para maior legibilidade (distinção entre caracteres parecidos, como “I”, “l” e “1”).</p>
  </li>
</ul>

<p>Todos os ajustes realizados são armazenados via <em>localStorage</em>, que é um mecanismo do navegador Web (Google Chrome, Firefox, Safari, etc.) para salvar dados localmente no dispositivo da pessoa, permitindo que suas preferências sejam mantidas em visitas futuras.</p>

<p><strong>4. Design Responsivo e Performático</strong></p>

<p>A interface é otimizada para:</p>

<ul>
  <li>
    <p>Dispositivos móveis (smartphones e tablets),</p>
  </li>
  <li>
    <p>Computadores desktop e notebooks,</p>
  </li>
  <li>
    <p>Conexões lentas ou instáveis,</p>
  </li>
  <li>
    <p>Equipamentos com baixo processamento e memória.</p>
  </li>
</ul>

<p>A aplicação adota uma arquitetura JavaScript modular, incorporando técnicas de <em>Code Splitting</em> (divisão de código) e <em>Lazy Loading</em> (carregamento em partes), o que permite o carregamento dos scripts somente sob demanda e contribui para a redução do tempo de inicialização. Além disso, as imagens da tabela periódica são veiculadas (distribuídas) por meio de uma CDN (<em>Content Delivery Network</em> em Português Rede de Distribuição de Conteúdo), que armazena os arquivos em servidores (computadores dedicados a entregar conteúdos) distribuídos globalmente.</p>

<p>Outro papel importante da CDN é otimizar as imagens para diferentes tamanhos de tela e resoluções, garantindo que a qualidade visual seja mantida sem comprometer o desempenho. A CDN também faz a compressão automática das imagens, reduzindo o tamanho dos arquivos e acelerando o tempo de carregamento, especialmente em conexões mais lentas.</p>

<p>Essa compressão acontece também com os <em>scripts</em> e estilos (<em>CSS</em>) da aplicação, para que o uso de dados seja minimizado, tornando a ferramenta mais acessível em termos de requisitos técnicos. Dessa forma, garante-se baixa latência (tempo de resposta rápido) e economia de dados para a pessoa, independentemente das condições de conexão.</p>

<h3 id="arquitetura-tecnica-em-tres-camadas">Arquitetura Técnica em Três Camadas</h3>
<hr />

<p>A fim de atingir esses objetivos e respeitar esses princípios anteriormente mencionados, a solução foi estruturada em três camadas técnicas separadas, cada uma com responsabilidades específicas, para garantir a manutenebilidade (facilidade de manutenção) do código e a organização lógica.</p>

<p><strong>1. Camada de Controles Globais: Barra de Ferramentas de Acessibilidade</strong></p>

<p>Esta camada apresenta uma barra de ferramentas de acessibilidade (A11y Toolbar) disponível em todas as páginas do site. Por meio dela, pessoas conseguem ajustar a aparência visual conforme suas preferências. As escolhas feitas são registradas no <em>localStorage</em> do navegador, garantindo que permaneçam salvas entre os acessos ao site.</p>

<p>Entre os controles oferecidos estão:</p>

<ul>
  <li>
    <p><strong>Ajuste de texto</strong>: muda o tamanho da fonte.</p>
  </li>
  <li>
    <p><strong>Alto contraste e contraste negativo</strong>: aumentam a luminância.</p>
  </li>
  <li>
    <p><strong>Escala de cinza</strong>: elimina as cores.</p>
  </li>
  <li>
    <p><strong>Sublinhado de links e fonte aprimorada</strong>: facilitam identificar elementos interativos e ler o texto.</p>
  </li>
</ul>

<p>O plugin <a href="https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/vlibras" target="_blank" rel="noopener noreferrer">VLibras</a> também é incorporado a essa camada, sendo posicionado dinamicamente para evitar sobrepor outros controles.</p>

<p><strong>2. Camada de Interface da Tabela Periódica</strong></p>

<p>Esta página é a interface principal da tabela periódica, desenvolvida para garantir navegação fácil. Aqui estão apresentados os elementos essenciais que fazem parte dela, como:</p>

<ul>
  <li>
    <p><strong>Link “Pular para o Conteúdo” (<em>Skip Link</em>)</strong>: oferece às pessoas que usam teclado ou leitores de tela a possibilidade de ir direto ao conteúdo principal da página.</p>
  </li>
  <li>
    <p><strong>Painel de Controle</strong>: apresenta botões de alternância (<em>toggle</em>) para a seleção dos modos de visualização (“Por Períodos”, “Por Grupos” e “Por Categorias”) e para ativação do sistema de cores opcional. As cores são oferecidas como recurso complementar para pessoas que as identificam, sem prejudicar a compreensão das relações químicas quando não utilizadas.</p>
  </li>
  <li>
    <p><strong>Modais Informativas</strong>: Janelas de diálogo como “Como Usar”, “Saiba Mais” e créditos oferecem instruções, contextualizam a tabela e apresentam as pessoas responsáveis pelo desenvolvimento.</p>
  </li>
  <li>
    <p><strong>Modal de Elemento</strong>: ao escolher um elemento, aparece uma janela modal detalhada mostrando todas as suas informações químicas (como número atômico, massa, distribuição eletrônica etc.) apresentadas de forma textual e linear.</p>
  </li>
</ul>

<p><strong>3. Camada de Lógica: Geração do Conteúdo da Tabela Periódica</strong></p>

<p>Esta camada é o núcleo funcional da ferramenta, formada por quatro scripts modulares que gerenciam dados e interatividade.</p>

<p>Os <em>scripts</em> são:</p>

<ul>
  <li>
    <p><strong><em>tabela-periodica.js</em></strong>: Funciona como o repositório de dados da aplicação, exportando um Array (estrutura) de Objetos com as propriedades completas dos elementos químicos, servindo como a base de informações para os componentes da interface da tabela periódica.</p>
  </li>
  <li>
    <p><strong><em>tabela-periodica-grupos.js</em></strong>: Módulo responsável pela lógica de agrupamento e renderização da visualização “Por Grupos”. Ele processa os dados brutos organizando-os por colunas e realiza a manipulação para injetar o <em>HTML</em> dinamicamente na interface da tabela periódica.</p>
  </li>
  <li>
    <p><strong><em>tabela-periodica-categorias.js</em></strong>: Controlador da visualização “Por Categorias”, classifica elementos pelas séries químicas e organiza a interface hierarquicamente em categorias e subcategorias (como Metais Alcalinos e Gases Nobres) para segmentar a navegação.</p>
  </li>
  <li>
    <p><strong><em>tabela-periodica-colors.js</em></strong>: Controla um sistema opcional de cores. Ele atribui classes <em>CSS</em> aos elementos conforme suas categorias químicas e usa um <em>MutationObserver</em> (observador de mudanças) para que a coloração seja mantida corretamente, mesmo quando os elementos são recriados dinamicamente ao mudar o modo de visualização.</p>
  </li>
</ul>

<p>A arquitetura modular organiza o sistema, melhora a eficiência e facilita a manutenção do código. Optou-se por JavaScript puro (<em>vanilla JS</em>) para evitar <em>frameworks</em> (bibliotecas ou estruturas de código pré-construídos) externos, reduzindo arquivos e melhorando o desempenho em conexões lentas.</p>

<p>Assim, depois que o sistema é carregado, ele continua funcionando normalmente mesmo com a internet instável. Apesar de não ser a opção tecnicamente mais avançada ou que utiliza os métodos mais modernos do desenvolvimento de software, essa solução é a que melhor satisfaz as necessidades de acessibilidade e usabilidade em cenários de conectividade limitada, que são justamente os contextos para os quais a ferramenta foi criada.</p>

<h3 id="validacao-e-testes">Validação e Testes</h3>
<hr />

<p>Para fazer a validação de acessibilidade da tabela periódica, foram realizados testes manuais com as seguintes tecnologias assistivas:</p>

<p class="small text-light mb-2" id="tabela-1-ajuda">Observacao: em telas pequenas, deslize horizontalmente para ler todas as colunas da tabela.</p>
<div class="table-responsive">
<table class="table table-bordered table-striped table-hover table-dark text-white border-secondary" aria-describedby="tabela-1-ajuda"><caption class="visually-hidden">Tabela 1: Tecnologias assistivas utilizadas nos testes de validação de acessibilidade da tabela periódica acessível.</caption>
    <thead class="table-dark">
        <tr>
            <th scope="col">Tecnologia</th>
            <th scope="col">Descrição</th>
            <th scope="col">Sistema Operacional</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <th scope="row">NVDA (NonVisual Desktop Access)</th>
            <td>Leitor de telas gratuito e de código aberto.</td>
            <td>Windows 11</td>
        </tr>
        <tr>
            <th scope="row">JAWS (Job Access With Speech)</th>
            <td>Leitor de telas pago e de código fechado.</td>
            <td>Windows 11</td>
        </tr>
        <tr>
            <th scope="row">VoiceOver</th>
            <td>Leitor de telas integrado em dispositivos Apple.</td>
            <td>iOS 15 e macOS 26.2 (Tahoe)</td>
        </tr>
        <tr>
            <th scope="row">Orca</th>
            <td>Leitor de telas gratuito e de código aberto.</td>
            <td>Linux Ubuntu MATE 22.04 LTS</td>
        </tr>
        <tr>
            <th scope="row">Google TalkBack</th>
            <td>Leitor de telas integrado em dispositivos Android.</td>
            <td>Android 16</td>
        </tr>
        <tr>
            <th scope="row">Lupas Eletrônicas</th>
            <td>Softwares de ampliação de tela que aumentam o tamanho dos elementos visuais.</td>
            <td>
                <ul>
                    <li>Windows 11</li>
                    <li>macOS 26.2 (Tahoe)</li>
                    <li>Linux Ubuntu MATE 22.04 LTS</li>
                    <li>Linux Ubuntu 22.04 LTS - GNOME</li>
                    <li>Linux Mint 21.1 - Cinnamon</li>
                    <li>iOS 15</li>
                    <li>Android 16</li>
                </ul>
            </td>
        </tr>
    </tbody>
    <caption class="text-white">Fonte: Elaborada pela autora.</caption>
</table>
</div>

<p>Para garantir a compatibilidade da tabela periódica acessível, foram realizados testes nos seguintes navegadores:</p>

<ul>
  <li>
    <p>Google Chrome</p>
  </li>
  <li>
    <p>Mozilla Firefox</p>
  </li>
  <li>
    <p>Microsoft Edge</p>
  </li>
  <li>
    <p>Safari</p>
  </li>
</ul>

<p>O objetivo desses testes foi assegurar que a tabela funcionasse corretamente em diferentes ambientes, proporcionando uma experiência consistente para todas as pessoas usuárias, independentemente do navegador ou tecnologia assistiva utilizada.</p>

<p>Participaram do processo de validação 55 pessoas com deficiência visual, sendo:</p>

<ul>
  <li>
    <p>47 pessoas (85%) cegas;</p>
  </li>
  <li>
    <p>8 pessoas (15%) com baixa visão.</p>
  </li>
</ul>

<p>As regiões Sudeste e Nordeste do Brasil foram as mais representadas, somando mais de 70% do total de participantes. A distribuição geográfica completa está detalhada na Tabela a seguir.</p>

<p class="small text-light mb-2" id="tabela-2-ajuda">Observacao: em telas pequenas, deslize horizontalmente para ler todas as colunas da tabela.</p>
<div class="table-responsive">
<table class="table table-bordered table-striped table-hover table-dark text-white border-secondary" aria-describedby="tabela-2-ajuda"><caption class="visually-hidden">Tabela 2: Distribuição geográfica dos participantes do teste de validação da tabela periódica acessível.</caption>
    <thead class="table-dark">
        <tr>
            <th scope="col">Região</th>
            <th scope="col">Porcentagem</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <th scope="row">Sudeste</th>
            <td>40,00%</td>
        </tr>
        <tr>
            <th scope="row">Nordeste</th>
            <td>32,73%</td>
        </tr>
        <tr>
            <th scope="row">Sul</th>
            <td>16,36%</td>
        </tr>
        <tr>
            <th scope="row">Centro-Oeste</th>
            <td>9,09%</td>
        </tr>
        <tr>
            <th scope="row">Norte</th>
            <td>1,82%</td>
        </tr>
    </tbody>
    <caption class="text-white">Fonte: Elaborada pela autora.</caption>
</table>
</div>

<p>As áreas de atuaação das pessoas participantes estão distribuídas conforme a Tabela a seguir.</p>

<p class="small text-light mb-2" id="tabela-3-ajuda">Observacao: em telas pequenas, deslize horizontalmente para ler todas as colunas da tabela.</p>
<div class="table-responsive">
<table class="table table-bordered table-striped table-hover table-dark text-white border-secondary" aria-describedby="tabela-3-ajuda"><caption class="visually-hidden">Tabela 3: Profissões dos participantes do teste de validação da tabela periódica acessível.</caption>
    <thead class="table-dark">
        <tr>
            <th scope="col">Profissão</th>
            <th scope="col">Quantidade de pessoas</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <th scope="row">Desenvolvimento de Software</th>
            <td>11</td>
        </tr>
        <tr>
            <th scope="row">Análise de Acessibilidade Digital</th>
            <td>8</td>
        </tr>
        <tr>
            <th scope="row">Advocacia</th>
            <td>4</td>
        </tr>
        <tr>
            <th scope="row">Esporte</th>
            <td>3</td>
        </tr>
        <tr>
            <th scope="row">Atuação</th>
            <td>3</td>
        </tr>
        <tr>
            <th scope="row">Empreendedorismo</th>
            <td>3</td>
        </tr>
        <tr>
            <th scope="row">Psicologia</th>
            <td>3</td>
        </tr>
        <tr>
            <th scope="row">Docência de área específica</th>
            <td>3</td>
        </tr>
        <tr>
            <th scope="row">Estudante</th>
            <td>2</td>
        </tr>
        <tr>
            <th scope="row">Massoterapia</th>
            <td>2</td>
        </tr>
        <tr>
            <th scope="row">Pedagogia</th>
            <td>2</td>
        </tr>
        <tr>
            <th scope="row">Informática</th>
            <td>2</td>
        </tr>
        <tr>
            <th scope="row">Análise de produtos</th>
            <td>1</td>
        </tr>
        <tr>
            <th scope="row">Ciência de dados</th>
            <td>1</td>
        </tr>
        <tr>
            <th scope="row">Funcionalismo público</th>
            <td>1</td>
        </tr>
        <tr>
            <th scope="row">Consultoria</th>
            <td>1</td>
        </tr>
        <tr>
            <th scope="row">Edição de áudio</th>
            <td>1</td>
        </tr>
        <tr>
            <th scope="row">Fisioterapia</th>
            <td>1</td>
        </tr>
        <tr>
            <th scope="row">Musicista</th>
            <td>1</td>
        </tr>
        <tr>
            <th scope="row">Revisão Braille</th>
            <td>1</td>
        </tr>
        <tr>
            <th scope="row">Terapia Ocupacional</th>
            <td>1</td>
        </tr>
    </tbody>
    <tfoot>
        <tr>
            <th scope="row">Total</th>
            <td>55</td>
        </tr>
    </tfoot>
    <caption>Fonte: Elaborada pela autora.</caption>
</table>
</div>

<p>Percebe-se uma diversidade significativa de áreas de atuação entre as pessoas participantes, porém há uma predominância de profissionais ligados à tecnologia e acessibilidade digital. Apesar disso, também há representantes de outras áreas, como advocacia, psicologia, docência e pedagogia, entre outras.</p>

<p>Essa variedade contribui para uma avaliação mais abrangente da tabela periódica acessível, considerando diferentes perspectivas e necessidades.</p>

<p>Os testes consistiram em:</p>

<ul>
  <li>
    <p><strong>Navegação por teclado</strong>: Verificação da funcionalidade completa da tabela periódica utilizando apenas o teclado, garantindo que todas as interações possam ser realizadas sem o uso do mouse.</p>
  </li>
  <li>
    <p><strong>Leitura por leitores de tela</strong>: Avaliação da compatibilidade da tabela periódica com diversos leitores de tela, assegurando que todas as informações sejam acessíveis e compreensíveis mantendo a semântica correta.</p>
  </li>
  <li>
    <p><strong>Uso no mobile</strong>: Testes de usabilidade e acessibilidade em dispositivos móveis, verificando a responsividade do design e a facilidade de navegação em telas menores.</p>
  </li>
  <li>
    <p><strong>Testes com lupas eletrônicas</strong>: Análise da legibilidade e usabilidade da tabela periódica quando ampliada por lupas eletrônicas, garantindo que o conteúdo permaneça claro e organizado mesmo em níveis elevados de zoom.</p>
  </li>
  <li>
    <p><strong>Avaliação de personalização visual</strong>: Testes das funcionalidades de ajuste de contraste, tamanho de fonte e outras opções visuais para assegurar que as preferências da pessoa sejam aplicadas corretamente e que a tabela permaneça acessível em todas as configurações.</p>
  </li>
</ul>

<p>O objetivo era validar:</p>

<ul>
  <li>
    <p>A acessibilidade da tabela periódica para pessoas com diferentes condições visuais.</p>
  </li>
  <li>
    <p>A usabilidade em diversos dispositivos.</p>
  </li>
  <li>
    <p>A eficácia das opções de personalização visual.</p>
  </li>
  <li>
    <p>A compatibilidade com tecnologias assistivas populares.</p>
  </li>
  <li>
    <p>A manutenção da precisão semântica do conteúdo quando acessado por leitores de tela.</p>
  </li>
  <li>
    <p>A redução do custo cognitivo durante a navegação e interação com a tabela periódica.</p>
  </li>
  <li>
    <p>A satisfação geral das pessoas participantes com a experiência de uso da tabela periódica acessível.</p>
  </li>
</ul>

<p>Depois dos testes as pessoas participantes responderam, via formulário online, a uma pesquisa de satisfação com perguntas objetivas e subjetivas sobre a experiência de uso da tabela periódica acessível.</p>

<p>As perguntas do formulário foram:</p>

<p class="small text-light mb-2" id="tabela-4-ajuda">Observacao: em telas pequenas, deslize horizontalmente para ler todas as colunas da tabela.</p>
<div class="table-responsive">
<table class="table table-bordered table-striped table-hover table-dark text-white border-secondary" aria-describedby="tabela-4-ajuda"><caption class="visually-hidden">Tabela 4: Perguntas e possibilidades de respostas do questionário de satisfação.</caption>
    <thead class="table-dark">
        <tr>
            <th scope="col">Pergunta</th>
            <th scope="col">Possibilidades de resposta</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <th scope="row">1. Compare a Tabela Periódica Acessível com outras tabelas periódicas que você já utilizou, apenas versões digitais (sites ou aplicativos) e considere os seguintes aspectos:
                <ul class="mt-4">
                    <li>Acessibilidade</li>
                    <li>Usabilidade</li>
                    <li>Design</li>
                </ul>
                Como você avaliaria a Tabela Periódica Acessível em relação a essas outras opções?
            </th>
            <td>
                <ul>
                    <li>Menos acessível, usável e com design pior.</li>
                    <li>Igualmente acessível, usável e com design semelhante.</li>
                    <li>Mais acessível, usável e com design melhor.</li>
                </ul>
            </td>
        </tr>
        <tr>
            <th scope="row">2. Quão fácil foi para você navegar e encontrar informações na Tabela Periódica Acessível usando apenas o teclado?</th>
            <td>
                <ul>
                    <li>Difícil.</li>
                    <li>Nem difícil, nem fácil.</li>
                    <li>Fácil.</li>
                </ul>
            </td>
        </tr>
        <tr>
            <th scope="row">3. A Tabela Periódica Acessível funcionou bem com o leitor de tela que você utiliza?</th>
            <td>
                <ul>
                    <li>Não funcionou bem.</li>
                    <li>Funcionou razoavelmente bem.</li>
                    <li>Funcionou perfeitamente.</li>
                    <li>Não utilizei leitor de tela.</li>
                </ul>
            </td>
        </tr>
        <tr>
            <th scope="row">4. Quão satisfatório foi o ajuste de contraste e tamanho de fonte na Tabela Periódica Acessível para atender às suas necessidades visuais?</th>
            <td>
                <ul>
                    <li>Insatisfatório.</li>
                    <li>Razoavelmente satisfatório.</li>
                    <li>Muito satisfatório.</li>
                    <li>Não utilizei esses recursos.</li>
                </ul>
            </td>
        </tr>
        <tr>
            <th scope="row">5. Você encontrou alguma dificuldade ao usar a Tabela Periódica Acessível em dispositivos móveis (smartphones ou tablets)?</th>
            <td>
                Resposta aberta (campo de texto livre).
            </td>
        </tr>
        <tr>
            <th scope="row">6. Com base na sua experiência, qual é o seu nível geral de satisfação com a Tabela Periódica Acessível? Sinta-se à vontade para compartilhar quaisquer comentários adicionais ou sugestões para melhorias.</th>
            <td>Resposta aberta (campo de texto livre).</td>
        </tr>
    </tbody>
    <caption>Fonte: Elaborada pela autora.</caption>
</table>
</div>

<p>Esse questionamento aberto permitiu que as pessoas participantes expressassem suas opiniões e fornecessem feedback valioso para aprimorar a ferramenta.</p>

<h2 id="resultados-e-impacto">Resultados e Impacto</h2>
<hr />

<p>A seguir são apresentados os resultados obtidos a partir dos testes de validação da tabela periódica acessível, bem como o impacto observado na experiência de uso das pessoas participantes. A análise dos dados coletados revelou que a maioria das pessoas avaliou a tabela periódica acessível como uma ferramenta necessária e inovadora, destacando seu baixo custo cognitivo e a facilidade de navegação.</p>

<h3 id="analise-dos-resultados">Análise dos Resultados</h3>
<hr />

<p><strong>Pergunta 1</strong></p>

<div class="text-center mb-4">
    <figcaption>Figura 5: Avaliação comparativa da tabela — acessibilidade, usabilidade e design.</figcaption>
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://imagedelivery.net/Ruw4waFkOelbXULIoE-oQg/eeeaa7fe-f176-447b-b3d0-bae2815a0500/public" alt="Gráfico de barras horizontais com a distribuição das respostas da Pergunta 1." loading="lazy" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

    <figcaption class="visually-hidden">Descrição detalhada da imagem: A imagem apresenta um gráfico de barras horizontais em fundo escuro, intitulado “Pergunta 1 — Distribuição geral (pessoas cegas n=47, pessoas com baixa visão n=8) / Comparação com outras tabelas digitais (acessibilidade, usabilidade e design)”.
    <br />
    O gráfico resume 55 respostas no total (n=55) para uma pergunta de comparação com outras tabelas digitais, considerando acessibilidade, usabilidade e design.
    <br />
    Eixo horizontal (X): rotulado como “Percentual do total (n=55)”, com escala de 0 a 100%.
    <br />
    Eixo vertical (Y): lista três categorias de resposta (rótulos longos, alinhados à esquerda), correspondentes às avaliações possíveis.
    <br />
    Há três barras (uma por categoria), com os valores escritos junto às barras:
    <br />
    “Mais acessível/usável e design melhor” — barra muito mais longa, representando 89,1%, com 49 respostas indicadas como “89.1% (49)”.
    <br />
    “Igualmente acessível/usável e design semelhante” — barra bem menor, representando 10,9%, com 6 respostas indicadas como “10.9% (6)”.
    <br />
    “Menos acessível/usável e design pior” — categoria sem barra visível (valor zerado), indicada como 0,0%, com 0 respostas (“0.0% (0)”).
    </figcaption>
    <figcaption>Fonte: Elaborada pela autora.</figcaption>
</div>

<p>A maioria expressiva dos participantes (89,1%) avaliou que a tabela é mais acessível, fácil de usar e apresenta melhor design do que outras tabelas digitais. Uma parcela menor (10,9%) percebeu equivalência entre as opções, enquanto nenhum participante considerou que a tabela era menos acessível ou apresentava um design inferior.</p>

<p>A tabela periódica acessível se destaca pelas qualidades de acessibilidade, usabilidade e design. Estes resultados evidenciam a necessidade de envolvimento de pessoas com deficiência no processo de desenvolvimento de recursos educacionais, garantindo que suas necessidades sejam atendidas e que a experiência de uso seja satisfatória.</p>

<p><strong>Pergunta 2</strong></p>

<div class="text-center mb-4">
    <figcaption>Figura 6: Facilidade de navegação e de encontrar informações usando apenas o teclado.</figcaption>   
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://imagedelivery.net/Ruw4waFkOelbXULIoE-oQg/1c551c9d-ea77-4d7c-4b43-303f8e0c0100/public" alt="Gráfico de barras horizontais da Pergunta 2 sobre navegar e encontrar informações só com teclado: 72,7% (40 pessoas) consideram fácil; 27,3% (15 pessoas) nem difícil nem fácil; 0% (0 pessoas) difícil." loading="lazy" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

    <figcaption class="visually-hidden">Descrição detalhada da imagem: A imagem apresenta um gráfico de barras horizontais em fundo escuro, intitulado “Pergunta 2 — Distribuição geral (pessoas cegas n=47, pessoas com baixa visão n=8) / Facilidade de navegação e de encontrar informações usando apenas teclado”.
    <br />
    O gráfico resume 55 respostas (n=55) sobre a facilidade de navegação e de localizar informações utilizando somente o teclado.
    <br />
    Eixo horizontal (X): rotulado como “Percentual do total (n=55)”, com escala percentual iniciando em 0 e seguindo até aproximadamente 80 (com marcações regulares).
    <br />
    Eixo vertical (Y): contém três categorias de resposta.
    <br />
    As três barras e seus valores (percentual e contagem) são:
    <br />
    “Fácil” — a barra mais longa, com 72,7% (40), indicada no fim da barra como “72.7% (40)”.
    <br />
    “Nem difícil, nem fácil” — barra intermediária, com 27,3% (15), indicada como “27.3% (15)”.
    <br />
    “Difícil” — não há barra visível (valor zero), indicado como 0,0% (0).
    </figcaption>
    <figcaption>Fonte: Elaborada pela autora.</figcaption>
</div>

<p>72,7% dos participantes acham fácil usar apenas o teclado para navegar e encontrar informações. 27,3% classificaram como neutro, e nenhum relatou dificuldades impeditivas (0%).</p>

<p>Os resultados mostram que a tabela periódica acessível permite navegação eficiente por teclado, beneficiando pessoas que precisam desta modalidade de navegação. A falta de relatos de dificuldade confirma a eficácia do design acessível.</p>

<p><strong>Pergunta 3</strong></p>

<div class="text-center mb-4">
    <figcaption>Figura 7: Funcionamento da Tabela Periódica Acessível com leitor de telas.</figcaption>
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://imagedelivery.net/Ruw4waFkOelbXULIoE-oQg/3fee5239-ce97-4e84-7b0b-1b73313d5100/public" alt="Gráfico de barras horizontais da Pergunta 3 sobre compatibilidade com leitores de tela: 78,2% (43 pessoas) consideram que funcionou perfeitamente; 16,4% (9 pessoas) que funcionou razoavelmente bem; 5,5% (3 pessoas) que não funcionou bem; 0% (0 pessoas) não utilizaram leitor de telas." loading="lazy" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

    <figcaption class="visually-hidden">Descrição detalhada da imagem: A imagem apresenta um gráfico de barras horizontais em fundo escuro, com o título “Pergunta 3 — Distribuição geral (n=55) / A Tabela Periódica Acessível funcionou bem com o leitor de tela utilizado?”.
    <br />
    O gráfico resume 55 respostas (n=55) sobre a experiência de uso da Tabela Periódica Acessível em relação ao leitor de tela (quando utilizado).
    <br />
    Eixo horizontal (X): rotulado como “Percentual do total (n=55)”, com escala percentual iniciando em 0 e indo até cerca de 70 (com marcações regulares).
    <br />
    Eixo vertical (Y): lista quatro categorias de resposta, cada uma com uma barra correspondente.
    <br />
    As categorias e valores exibidos no final das barras (percentual e contagem) são:
    <br />
    1 “Funcionou perfeitamente” — barra mais longa, com 69,1% (38).
    <br />
    2 “Não utilizei leitor de tela” — segunda maior barra, com 14,5% (8).
    <br />
    3 “Funcionou razoavelmente bem” — barra menor, com 12,7% (7).
    <br />
    4 “Não funcionou bem” — barra curta, com 3,6% (2).
    </figcaption>
    <figcaption>Fonte: Elaborada pela autora.</figcaption>
</div>

<p>Dos 55 participantes, a maior parte (69,1%) afirmou que a tabela funcionou perfeitamente com o leitor de telas usado. Uma parcela menor (14,5%) não utilizou o leitor de telas e 12,7% disseram que o funcionamento foi razoavelmente bom. Somente 3,6% dos entrevistados relataram que a tabela não funcionou bem.</p>

<p>Os participantes com baixa visão que não utilizaram leitores de tela recorreram a ampliadores (lupas), recursos de contraste e demais ferramentas de acessibilidade. Não foi possível identificar por que pessoas usuárias de leitores de tela avaliaram o funcionamento da tabela de maneiras tão diferentes, indo do “perfeito” ao “razoavelmente bem” ou “não funcionou bem”.</p>

<p>Vale ressaltar que cada participante apresenta diferentes níveis de habilidade ao usar leitores de tela, já que nem todos conhecem ou dominam totalmente as ferramentas oferecidas pelo software. Além disso, a compatibilidade pode ser afetada por fatores como a versão do leitor de telas, o sistema operacional e as configurações individuais.</p>

<p>Os resultados demonstram que a tabela periódica acessível apresenta compatibilidade consistente com leitores de tela, uma vez que a maior parte das pessoas usuárias relatou experiências positivas. Contudo, evidencia-se a necessidade de futuras pesquisas. Destaca-se a importância de considerar a diversidade de experiências e habilidades das pessoas usuárias para compreender as diferentes avaliações e identificar oportunidades de aprimoramento da ferramenta, caso necessário.</p>

<p><strong>Pergunta 4</strong></p>

<div class="text-center mb-4">
    <figcaption>Figura 8: Satisfação com ajuste de contraste e tamanho de fonte.</figcaption>
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://imagedelivery.net/Ruw4waFkOelbXULIoE-oQg/dbb59e77-f3ca-491d-43e8-5017245ae700/public" alt="Gráfico de barras horizontais da Pergunta 4 sobre satisfação com ajuste de contraste e tamanho da fonte: 85,5% (47) não utilizaram esses recursos; 14,5% (8) consideraram muito satisfatório; 0% (0) razoavelmente satisfatório ou insatisfatório." loading="lazy" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

    <figcaption class="visually-hidden">Descrição detalhada da imagem: A imagem apresenta um gráfico de barras horizontais em fundo escuro, com o título “Pergunta 4 — Distribuição geral (n=55) / Satisfação com ajuste de contraste e tamanho de fonte para atender às necessidades visuais”.
    <br />
    O gráfico resume 55 respostas (n=55) sobre a satisfação com recursos de ajuste de contraste e de tamanho de fonte (recursos tipicamente associados à personalização visual).
    <br />
    Eixo horizontal (X): rotulado como “Percentual do total (n=55)”, com escala percentual partindo de 0 e chegando até cerca de 90 (marcas regulares).
    <br />
    Eixo vertical (Y): contém quatro categorias de resposta, cada uma com seu rótulo à esquerda.
    <br />
    As barras e valores indicados são:
    <br />
    1 “Não utilizei esses recursos” — barra mais longa, com 85,5% (47), indicada no fim da barra como “85.5% (47)”.
    <br />
    2 “Muito satisfatório” — barra menor, com 14,5% (8), indicada como “14.5% (8)”.
    <br />
    3 “Insatisfatório” — não há barra visível, indicado como 0,0% (0).
    <br />
    4 “Razoavelmente satisfatório” — também sem barra visível, indicado como 0,0% (0).
    </figcaption>
    <figcaption>Fonte: Elaborada pela autora.</figcaption>
</div>

<p>A maioria dos participantes (85,5%) indicou que não utilizou os recursos de ajuste de contraste e tamanho da fonte. Dos que avaliaram a experiência, 14,5% consideraram-na como muito satisfatória. Não foram observados registros de avaliação intermediária (razoavelmente satisfatório) ou de insatisfação, ambos com índice de 0%.</p>

<p>O pequeno número de pessoas que utilizaram o recurso se deve à baixa participação de pessoas com baixa visão na pesquisa, já que a maioria dos participantes eram pessoas cegas que utilizam leitores de tela. Uma possibilidade para aprimorar pesquisas futuras é investir esforços adicionais na inclusão de um número mais significativo de pessoas com baixa visão.</p>

<p>Embora a participação seja voluntária, a expansão das estratégias de divulgação pode potencialmente aumentar o número de participantes, contribuindo para uma avaliação mais robusta da ferramenta. Porém, é importante destacar que a satisfação expressa por aqueles que utilizaram os recursos de personalização visual é um indicativo positivo da eficácia desses recursos para atender às necessidades visuais das pessoas usuárias.</p>

<p><strong>Pergunta 5</strong></p>

<p>A pergunta 5 era aberta (campo de texto livre) e buscava identificar dificuldades específicas relacionadas ao uso da tabela periódica acessível em dispositivos móveis. As respostas foram analisadas qualitativamente para identificar temas comuns e insights (percepções ou entendimentos) sobre a experiência de uso em plataformas móveis.</p>

<p>A maioria dos participantes relatou que a tabela periódica acessível funcionou bem em dispositivos móveis, sem dificuldades significativas. As pessoas com baixa visão que utilizaram a tabela em smartphones ou tablets mencionaram que os recursos de personalização visual, como ajuste de contraste e tamanho de fonte, foram úteis para melhorar a legibilidade e a usabilidade da tabela em telas menores.</p>

<p>Além disso, a ideia de dividir a tabela periódica em diferentes modos de visualização e em “cartões” (elementos químicos apresentados em formato de cartões) foi destacada como uma solução eficaz para facilitar a navegação e a compreensão do conteúdo em dispositivos móveis, onde o espaço de tela é limitado. Essa abordagem permitiu que as pessoas usuárias que apresentam campo visual reduzido ou que utilizam lupas eletrônicas pudessem acessar as informações de maneira mais organizada e acessível, sem grande custo cognitivo ou fadiga visual.</p>

<p>Para as pessoas usuárias de leitores de tela, a experiência de uso em dispositivos móveis também foi positiva, com relatos de que a tabela periódica acessível manteve sua funcionalidade e compatibilidade com os leitores de tela. A possibilidade de “granular” (filtrar ou organizar) as informações em diferentes modos de visualização contribuiu para uma navegação mais eficiente e direcionada, permitindo que as pessoas usuárias pudessem acessar as informações de maneira mais rápida e intuitiva.</p>

<p>A tabela periódica é uma ferramenta de consulta sobre os elementos químicos, e a possibilidade de acessar essas informações de maneira eficiente em dispositivos móveis é fundamental para garantir a inclusão e a equidade no acesso ao conhecimento científico. Os resultados indicam que a tabela periódica acessível foi bem-sucedida em atender às necessidades das pessoas usuárias em plataformas móveis, proporcionando uma experiência de uso satisfatória e inclusiva.</p>

<p><strong>Pergunta 6</strong></p>

<p>A pergunta 6 também era aberta (campo de texto livre) e buscava avaliar o nível geral de satisfação dos participantes com a tabela periódica acessível, além de permitir que eles compartilhassem comentários adicionais ou sugestões para melhorias. A análise qualitativa das respostas revelou um alto nível de satisfação geral com a tabela periódica acessível, com muitos participantes expressando entusiasmo e reconhecimento pela importância de uma ferramenta acessível para o ensino de Química.</p>

<p>Um ponto recorrente foi a insegurança em definir com precisão a fidelidade semântica da tabela periódica acessível. Muitas pessoas comentaram que suas dificuldades com o conteúdo de Química as levavam a se perguntar se suas dúvidas originavam-se de questões de acessibilidade ou simplesmente de problemas com um conteúdo que não dominam.</p>

<p>Houveram diversos relatos negativos relacionados a experiências educacionais das pessoas participantes, como a falta de recursos acessíveis em materiais didáticos, a ausência de apoio adequado por parte de instituições de ensino e a dificuldade em encontrar informações científicas apresentadas de forma inclusiva. Esses relatos reforçam a importância de iniciativas como a tabela periódica acessível, que visam preencher lacunas significativas na oferta de recursos educacionais para pessoas com deficiência visual.</p>

<p>Muitos participantes destacaram a relevância da tabela periódica acessível como uma ferramenta que promove a inclusão e a equidade no acesso ao conhecimento científico. Eles ressaltaram que a tabela não apenas facilita o aprendizado, mas também contribui para a autonomia e a participação ativa em ambientes educacionais.</p>

<h3 id="ferramenta-disponivel-para-uso">Ferramenta Disponível para Uso</h3>
<hr />

<p>A tabela periódica acessível está disponível para uso público no seguinte endereço: <a href="https://pcdnaescola.com.br/ferramentas-tabela-periodica-acessivel-para-pessoas-com-deficiencia/" target="_blank" rel="noopener noreferrer" class="text-break">https://pcdnaescola.com.br/ferramentas-tabela-periodica-acessivel-para-pessoas-com-deficiencia/</a>. A ferramenta pode ser acessada gratuitamente por qualquer pessoa interessada, sem necessidade de cadastro ou pagamento.</p>

<p>A metodologia permitiu desenvolver uma ferramenta que torna a tabela periódica acessível a pessoas com deficiência visual, comprovando sua viabilidade técnica e pedagógica. A seguir são destacados os principais aspectos relacionados à ultilização da tabela periódica acessível:</p>

<h3 id="modos-de-visualizacao">1. Modos de Visualização</h3>
<hr />

<p>A tabela periódica pode ser visualizada de três maneiras diferentes: por períodos, por grupos e por categorias. Cada modo oferece uma perspectiva distinta sobre a organização dos elementos químicos, facilitando a compreensão das suas propriedades e relações.</p>

<div class="text-center mb-4">
    <figcaption>Figura 9: Botões de controle para alternar entre os modos de visualização da tabela periódica (visualização por períodos, grupos e categorias).</figcaption>
     <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://imagedelivery.net/Ruw4waFkOelbXULIoE-oQg/fa712b1a-0440-4eb2-911f-c2d6b1ad5c00/public" alt="Botões de controle para alternar entre os modos de visualização da tabela periódica" loading="lazy" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

    <figcaption class="visually-hidden">A imagem mostra uma barra de opções de visualização em fundo escuro. No canto esquerdo aparece o texto “Modo de visualização:”. À direita desse texto há três botões grandes, arredondados, alinhados horizontalmente. O primeiro botão está destacado em azul e traz um ícone de linhas empilhadas junto do texto “Por períodos”, indicando que essa opção está selecionada. O segundo botão é cinza escuro, com um ícone de colunas e o texto “Por grupos”. O terceiro botão também é cinza escuro e apresenta um ícone de formas geométricas junto do texto “Por categorias”. A imagem representa um menu onde a pessoa usuária pode escolher como deseja organizar ou visualizar as informações: por períodos, por grupos ou por categorias.</figcaption>
    <figcaption>Fonte: Elaborada pela autora.</figcaption>
</div>

<h4 id="visualizacao-por-periodos">1.1 Visualização por Períodos</h4>
<hr />

<p>Os elementos estão organizados em seções que equivalem aos períodos (as linhas horizontais da tabela), tornando a tabela dividida em partes menores e mais fáceis de manejar, isso é especialmente útil em telas de smartphones, onde o conteúdo aparece na vertical.</p>

<div class="text-center mb-4">
    <figcaption>Figura 10: Demonstração da visualização por períodos, com elementos agrupados em seções correspondentes a cada linha da tabela.</figcaption>
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://imagedelivery.net/Ruw4waFkOelbXULIoE-oQg/6f7c129b-9d6e-4a40-d20b-7cbb1d7bdb00/public" alt="visualização do primeiro e segundo períodos da tabela periódica" loading="lazy" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

    <figcaption class="visually-hidden">A imagem mostra uma parte de uma tabela periódica organizada por períodos, sobre um fundo escuro. No topo aparece o título “1º período”. Logo abaixo há dois cartões grandes e arredondados. O primeiro é branco e mostra a letra “H” no centro, com o nome “Hidrogênio” escrito abaixo, além das indicações “Período 1” na parte superior e “Coluna 1” na parte inferior. Ao lado dele há um cartão azul claro com a sigla “He” e o nome “Hélio”, também com “Período 1” no topo e “Coluna 18” na parte de baixo. <br /> Mais abaixo está o título “2º período”. Nessa parte aparecem quatro cartões coloridos alinhados lado a lado. O primeiro é roxo e mostra “Li” com o nome “Lítio”, indicando “Período 2” no topo e “Coluna 1” embaixo. O segundo é azul acinzentado, com “Be” e o nome “Berílio”, marcado como “Período 2” e “Coluna 2”. O terceiro é vermelho, com a letra “B” e o nome “Boro”, identificado como “Período 2” e “Coluna 13”. O quarto é verde, com a letra “C” e o nome “Carbono”, mostrando “Período 2” e “Coluna 14”. <br /> Cada cartão tem o símbolo do elemento em letras grandes no centro, o nome completo logo abaixo e pequenas setas para baixo, sugerindo que é possível abrir mais informações. A imagem representa um modo visual da tabela periódica em que os elementos aparecem como blocos separados por períodos, usando cores diferentes para facilitar a identificação e a organização.</figcaption>
    <figcaption>Fonte: Elaborada pela autora.</figcaption>
</div>

<h4 id="visualizacao-por-grupos">1.2 Visualização por Grupos</h4>
<hr />

<p>Os elementos estão dispostos em grupos (colunas verticais), possibilitando que a pessoa examine elementos com propriedades químicas semelhantes. Essa estrutura de navegação também se mostra mais adequada para dispositivos com telas reduzidas.</p>

<div class="text-center mb-4">
    <figcaption>Figura 11: Demonstração da visualização por grupos, com elementos organizados em colunas.</figcaption>
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://imagedelivery.net/Ruw4waFkOelbXULIoE-oQg/550b29eb-4641-4cb6-59b9-6d4c77df1000/public" alt="visualização dos grupos 3 e 4 da tabela periódica" loading="lazy" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

    <figcaption class="visually-hidden">
    A imagem mostra uma parte da tabela periódica organizada por grupos, sobre um fundo escuro. Na parte superior aparece o título “Grupo 3”. Abaixo dele há dois cartões grandes e arredondados, na cor amarela. O primeiro cartão mostra o símbolo “Sc” e o nome “Escândio”, com a indicação “Coluna 3” na parte superior e “Período 4” na parte inferior. Ao lado está outro cartão também amarelo com o símbolo “Y” e o nome “Ítrio”, identificado como “Coluna 3” e “Período 5”. Em ambos os cartões há uma pequena seta para baixo abaixo do nome do elemento, indicando que podem existir mais informações ao serem selecionados.
    <br />
    Mais abaixo aparece o título “Grupo 4”. Logo em seguida há quatro cartões amarelos alinhados horizontalmente. O primeiro mostra “Ti” e o nome “Titânio”, com as indicações “Coluna 4” e “Período 4”. O segundo apresenta “Zr” e o nome “Zircônio”, marcado como “Coluna 4” e “Período 5”. O terceiro cartão mostra “Hf” e o nome “Háfnio”, com “Coluna 4” e “Período 6”. O quarto cartão exibe “Rf” e o nome “Rutherfórdio”, identificado como “Coluna 4” e “Período 7”.
    <br />
    Todos os cartões têm o símbolo químico em letras grandes no centro, o nome completo do elemento logo abaixo e as informações de coluna e período em letras menores. A imagem representa um modo de visualização da tabela periódica por grupos, em que os elementos são apresentados em blocos separados e organizados verticalmente conforme pertencem à mesma coluna química, facilitando a comparação entre elementos do mesmo grupo.
    </figcaption>
    <figcaption>Fonte: Elaborada pela autora.</figcaption>
</div>

<h4 id="visualizacao-por-categorias">1.3 Visualização por Categorias</h4>
<hr />

<p>Os elementos estão classificados de acordo com suas categorias químicas, distribuídos em quatro grupos principais. São eles:</p>

<ul>
  <li>
    <p>Metais</p>
  </li>
  <li>
    <p>Semimetais</p>
  </li>
  <li>
    <p>Não Metais</p>
  </li>
  <li>
    <p>Outros (Hidrogênio)</p>
  </li>
</ul>

<p>Ao agrupar elementos que compartilham características químicas, essa apresentação torna mais simples entender as propriedades e os comportamentos de cada um deles.</p>

<p>Por exemplo, no âmbito da categoria “Metais”, estão incluídas subcategorias como Metais Alcalinos, Metais Alcalinoterrosos, Metais de Transição, Lantanídeos, Actinídeos e Outros Metais.</p>

<p>A categoria “Não Metais” inclui os não metais, halogênios e gases nobres, enquanto o hidrogênio é classificado separadamente em “Outros” devido às suas características únicas.</p>

<p>Essa estrutura facilita a exploração didática da tabela periódica e a compreensão das relações e classificações dos elementos.</p>

<div class="text-center mb-4">
    <figcaption>Figura 12: Exemplo da categoria "Semimetais" na visualização por categorias.</figcaption>
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://imagedelivery.net/Ruw4waFkOelbXULIoE-oQg/00bf013e-2494-4376-ba30-04a57a056c00/public" alt="Semimetais na visualização por categorias" loading="lazy" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

    <figcaption class="visually-hidden">
    A imagem mostra uma parte da tabela periódica organizada por categoria, com o título “Semimetais” centralizado no topo, sobre um fundo escuro. Abaixo do título aparecem vários cartões grandes, arredondados e todos na cor vermelha, distribuídos em duas linhas. Na primeira linha há quatro cartões. O primeiro mostra a letra “B” e o nome “Boro”, com a indicação “Período 2” na parte superior e “Grupo 13” na parte inferior. Ao lado dele está o cartão do “Si”, com o nome “Silício”, identificado como “Período 3” e “Grupo 14”. Em seguida aparece o cartão do “Ge”, com o nome “Germânio”, marcado como “Período 4” e “Grupo 14”. O quarto cartão dessa linha mostra “As” e o nome “Arsênio”, com as informações “Período 4” e “Grupo 15”.
    <br />
    Na segunda linha há três cartões também vermelhos. O primeiro apresenta “Sb” e o nome “Antimônio”, com “Período 5” e “Grupo 15”. O segundo mostra “Te” e o nome “Telúrio”, identificado como “Período 5” e “Grupo 16”. O terceiro cartão exibe “Po” e o nome “Polônio”, com “Período 6” e “Grupo 16”.
    <br />
    Em todos os cartões, o símbolo químico aparece em letras grandes no centro, o nome completo do elemento logo abaixo e, mais embaixo, uma pequena seta apontando para baixo, indicando que é possível acessar mais informações. A imagem representa um modo de visualização da tabela periódica por categorias, reunindo apenas os elementos classificados como semimetais e mostrando de forma clara seus períodos e grupos.
    </figcaption>
    <figcaption>Fonte: Elaborada pela autora.</figcaption>
</div>

<div class="text-center mb-4">
    <figcaption>Figura 13: Exemplo da categoria "Não Metais" na visualização por categorias.</figcaption>
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://imagedelivery.net/Ruw4waFkOelbXULIoE-oQg/74c6cb47-115f-4972-7e14-266316dd8600/public" alt="Não metais na visualização por categorias" loading="lazy" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

    <figcaption class="visually-hidden">
    A imagem mostra uma parte da tabela periódica organizada por categoria, com o título “Não Metais” no centro da parte superior, sobre um fundo escuro. Abaixo do título aparecem vários cartões grandes, arredondados e todos na cor verde, distribuídos em duas linhas.
    <br />
    Na primeira linha há quatro cartões. O primeiro apresenta a letra “C” e o nome “Carbono”, com a indicação “Período 2” na parte superior e “Grupo 14” na parte inferior. Ao lado dele está o cartão do “N”, com o nome “Nitrogênio”, identificado como “Período 2” e “Grupo 15”. Em seguida aparece o cartão do “O”, com o nome “Oxigênio”, marcado como “Período 2” e “Grupo 16”. O quarto cartão dessa linha mostra “P” e o nome “Fósforo”, com as informações “Período 3” e “Grupo 15”.
    <br />
    Na segunda linha há dois cartões verdes. O primeiro mostra a letra “S” e o nome “Enxofre”, com a indicação “Período 3” e “Grupo 16”. Ao lado dele está o cartão do “Se”, com o nome “Selênio”, identificado como “Período 4” e “Grupo 16”.
    <br />
    Em todos os cartões, o símbolo químico aparece em letras grandes no centro, o nome completo do elemento logo abaixo e, mais embaixo, uma pequena seta apontando para baixo, indicando que é possível abrir mais informações. A imagem representa um modo de visualização da tabela periódica por categorias, reunindo apenas os elementos classificados como não metais e mostrando de forma clara seus períodos e grupos.
    </figcaption>
    <figcaption>Fonte: Elaborada pela autora.</figcaption>
</div>

<h3 id="painel-de-controle">2. Painel de Controle</h3>
<hr />

<p>Um painel de controle fixo no topo permite alternar entre períodos, grupos, categorias e ativar ou desativar as cores da tabela.</p>

<div class="text-center mb-4">
    <figcaption>Figura 14: Painel de controle da tabela periódica, com opções para alternar visualizações e ativar/desativar cores.</figcaption>
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://imagedelivery.net/Ruw4waFkOelbXULIoE-oQg/afcad38c-2abe-484b-6d3e-942882041c00/public" alt="Painel de controle da tabela periódica" loading="lazy" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

    <figcaption class="visually-hidden">
    A imagem mostra um painel de configurações em fundo escuro, com cantos arredondados, organizado em duas partes principais. Na parte superior aparece o texto “Modo de visualização:”, acompanhado de um pequeno ícone ao lado esquerdo. Logo abaixo desse título há três botões grandes e arredondados, dispostos horizontalmente. O primeiro botão está destacado em azul e contém um ícone de linhas empilhadas junto do texto “Por períodos”, indicando que esta opção está selecionada no momento. Ao lado dele há um segundo botão em cinza escuro com um ícone de colunas e o texto “Por grupos”. O terceiro botão, também em cinza escuro, apresenta um ícone de formas geométricas e o texto “Por categorias”.
    <br />
    Abaixo dessa primeira área existe uma linha horizontal que separa as seções. Em seguida aparece o texto “Visualização com cores:”, acompanhado de um ícone que lembra uma paleta de pintura. Logo abaixo desse texto há um botão arredondado em tom escuro com o rótulo “Ativar cores” e um pequeno ícone de conta-gotas, indicando que é possível ligar ou desligar o uso de cores na visualização dos elementos.
    <br />
    No conjunto, a imagem representa um menu de opções onde a pessoa usuária pode escolher como deseja visualizar a tabela ou os conteúdos — por períodos, por grupos ou por categorias — e também decidir se quer ativar ou não uma visualização colorida.
    </figcaption>
    <figcaption>Fonte: Elaborada pela autora.</figcaption>
</div>

<p>Ao habilitar a visualização por períodos, o painel apresenta uma seção intitulada “Navegue pelos períodos da tabela”, composta por botões referentes aos sete períodos, bem como opções específicas para lantanídeos e actinídeos. A seleção de qualquer um desses botões direciona a pessoa imediatamente para a respectiva seção da página.</p>

<div class="text-center mb-4">
    <figcaption>Figura 15: Painel de navegação por períodos, com botões para cada período, lantanídeos e actinídeos.</figcaption>
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://imagedelivery.net/Ruw4waFkOelbXULIoE-oQg/08252ef4-b9e3-4c16-73c0-491563db6c00/public" alt="" loading="lazy" aria-hidden="true" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

    <figcaption class="visually-hidden">A imagem mostra um painel de navegação em fundo escuro, com cantos arredondados, pensado para facilitar a exploração da tabela periódica. No canto esquerdo do painel há um ícone circular com três linhas horizontais, semelhante a um menu. Ao lado desse ícone aparece o texto “Navegue pelos períodos da tabela”, indicando o objetivo da área.
    <br />
    Logo abaixo desse título há uma sequência de botões pequenos, ovais e de cor cinza escuro, alinhados horizontalmente. Cada botão representa um período da tabela periódica e traz os rótulos “1º Período”, “2º Período”, “3º Período”, “4º Período”, “5º Período”, “6º Período” e “7º Período”. Esses botões sugerem que a pessoa usuária pode selecionar diretamente o período que deseja visualizar.
    <br />
    Abaixo dessa primeira linha de botões há dois outros botões semelhantes, também ovais e escuros, com os rótulos “Lantanídeos” e “Actinídeos”, permitindo o acesso direto a esses conjuntos específicos de elementos químicos.
    <br />
    No conjunto, a imagem representa um componente de navegação simples e organizado, que permite escolher rapidamente diferentes períodos da tabela periódica ou acessar grupos especiais, de forma clara e fácil de usar.
    </figcaption>
    <figcaption>Fonte: Elaborada pela autora.</figcaption>
</div>

<p>Na visualização por grupos, o painel mostra botões para cada um dos 18 grupos e para lantanídeos e actinídeos. Ao clicar em um botão, a pessoa vai direto à seção correspondente.</p>

<div class="text-center mb-4">
    <figcaption>Figura 16: Painel de navegação por grupos, com botões para os 18 grupos, lantanídeos e actinídeos.</figcaption>
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://imagedelivery.net/Ruw4waFkOelbXULIoE-oQg/dee30e7b-9132-4219-ab2d-07521b680600/public" alt="" loading="lazy" aria-hidden="true" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

    <figcaption class="visually-hidden">A imagem mostra um painel de navegação em fundo escuro, com bordas arredondadas, voltado para a exploração da tabela periódica por grupos. No canto esquerdo há um ícone circular com o desenho de colunas verticais, indicando a ideia de organização por grupos. Ao lado desse ícone aparece o texto “Navegue pelos grupos da tabela”, que explica a função do painel.
    <br />
    Abaixo do título há vários botões pequenos, ovais e em tom de cinza escuro, distribuídos em duas linhas principais. Na primeira linha aparecem os botões “Grupo 1”, “Grupo 2”, “Grupo 3”, “Grupo 4”, “Grupo 5”, “Grupo 6”, “Grupo 7”, “Grupo 8” e “Grupo 9”. Logo abaixo, na segunda linha, estão os botões “Grupo 10”, “Grupo 11”, “Grupo 12”, “Grupo 13”, “Grupo 14”, “Grupo 15”, “Grupo 16” e “Grupo 17”.
    <br />
    Na parte inferior do painel há mais três botões semelhantes, com os rótulos “Grupo 18”, “Lantanídeos” e “Actinídeos”. Esses botões permitem acessar rapidamente tanto o último grupo da tabela periódica quanto os conjuntos especiais de elementos.
    <br />
    No conjunto, a imagem representa um menu de navegação claro e organizado, que possibilita escolher diretamente qualquer grupo da tabela periódica ou acessar categorias específicas, facilitando a exploração e a compreensão da estrutura da tabela.
    </figcaption>
    <figcaption>Fonte: Elaborada pela autora.</figcaption>
</div>

<p>Na visualização por categorias, o painel apresenta a seção “Navegue pelas categorias da tabela”, exibindo botões hierarquicamente organizados de acordo com as quatro principais categorias: Metais (com subdivisões como Alcalinos, Alcalinoterrosos, Transição, entre outras), Semimetais, Não Metais (incluindo Halogênios e Gases Nobres) e Outros (Hidrogênio). Ao selecionar um desses botões, a pessoa é direcionada para a respectiva categoria ou subcategoria, promovendo uma navegação eficiente pelo tipo de elemento químico.</p>

<div class="text-center mb-4">
    <figcaption>Figura 17: Painel de navegação por categorias, com botões organizados hierarquicamente.</figcaption>
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://imagedelivery.net/Ruw4waFkOelbXULIoE-oQg/a6cf2451-92d0-4f8e-b17b-1d10bfae7000/public" alt="" loading="lazy" aria-hidden="true" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

    <figcaption class="visually-hidden">A imagem mostra um painel de navegação em fundo escuro, com cantos arredondados, dedicado à exploração da tabela periódica por categorias. No canto esquerdo há um ícone que representa diferentes formas geométricas, indicando classificação ou agrupamento. Ao lado desse ícone aparece o texto “Navegue pelas categorias da tabela:”, que explica a função do painel.
    <br />
    Abaixo do título há vários botões ovais, em tom de cinza escuro, organizados em duas linhas. Na primeira linha aparecem os botões “Metais Alcalinos”, “Alcalinoterrosos”, “Metais de Transição”, “Lantanídeos”, “Actinídeos” e “Outros Metais”. Na segunda linha estão os botões “Semimetais”, “Não Metais”, “Halogênios”, “Gases Nobres” e “Hidrogênio”.
    <br />
    Todos os botões têm o mesmo formato e estilo visual, sugerindo que podem ser selecionados para filtrar ou navegar entre os diferentes tipos de elementos químicos. No conjunto, a imagem representa um menu claro e organizado que permite escolher categorias específicas da tabela periódica, facilitando a navegação e o entendimento da classificação dos elementos.
    </figcaption>
    <figcaption>Fonte: Elaborada pela autora.</figcaption>
</div>

<h3 id="cartoes-de-elementos-quimicos">3. Cartões de Elementos Químicos</h3>
<hr />

<p>Cada elemento químico aparece em um cartão com símbolo, nome, período e coluna.</p>

<div class="text-center mb-4">
    <figcaption>Figura 18: Cartão interativo do elemento Boro</figcaption>
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://imagedelivery.net/Ruw4waFkOelbXULIoE-oQg/22f300fb-5e4d-45ea-3131-3f47f6848d00/public" alt="" loading="lazy" aria-hidden="true" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

    <figcaption class="visually-hidden">Exemplo de cartão de elemento químico. O cartão é um quadrado com bordas arredondadas. O elemento do exemplo é o Boro, no cartão está sendo exibido o símbolo (B), o nome (Boro), o período (2) e a coluna (13) que é onde ele está localizado na tabela periódica.
    </figcaption>
    <figcaption>Fonte: Elaborada pela autora.</figcaption>
</div>

<p>Estes cartões permitem interação: ao usar o mouse, tocar na tela ou pressionar <em>Enter</em>, uma janela modal surge exibindo dados detalhados do elemento, incluindo símbolo, nome, número atômico, massa atômica e configuração eletrônica.</p>

<h3 id="modal-de-detalhes-do-elemento">4. <em>Modal</em> de Detalhes do Elemento</h3>
<hr />

<p>Ao acessar um cartão de elemento por clique, toque ou <em>Enter</em>, abre-se uma janela <em>modal</em> com informações detalhadas.</p>

<ul>
  <li>
    <p><strong>Gerenciamento de foco:</strong> Ao abrir a <em>modal</em>, o foco é automaticamente direcionado para o primeiro elemento interativo (geralmente o botão de fechar no canto superior direito), garantindo que pessoas que navegam por teclado ou usam leitores de tela saibam imediatamente onde estão e possam fechar a janela facilmente.</p>
  </li>
  <li>
    <p>Ao fechar a <em>modal</em>, o foco retorna automaticamente para o cartão do elemento que foi acessado, evitando que o usuário se perca na página e precise procurar novamente onde estava antes de abrir a janela.</p>
  </li>
  <li>
    <p><strong>Estrutura semântica:</strong> A <em>modal</em> utiliza elementos <em>HTML</em> semânticos apropriados, com atributos <em>ARIA</em> <em>role</em>=”<em>dialog</em>” e <em>aria-modal</em>=”<em>true</em>”, informando aos leitores de tela que uma janela de diálogo foi aberta e alterando o modo de navegação.</p>
  </li>
  <li>
    <p><strong>Rotulagem acessível:</strong> Cada <em>modal</em> possui um título claro (o nome do elemento), anunciado quando a janela é aberta. As informações são organizadas hierarquicamente com títulos (<em>&lt;h2&gt;</em>, <em>&lt;h3&gt;</em>) que permitem navegação rápida por marcos de referência.</p>
  </li>
</ul>

<p><strong>Informações apresentadas na <em>modal</em></strong></p>

<p>A janela <em>modal</em> de cada elemento apresenta as seguintes informações:</p>

<ul>
  <li>
    <p><strong>Nome do elemento:</strong> Apresentado como título principal da <em>modal</em>, sendo a primeira informação anunciada pelos leitores de tela.</p>
  </li>
  <li>
    <p><strong>Ilustração do elemento:</strong> Uma imagem que mostra como o elemento aparece ou é utilizado no cotidiano. Por exemplo, para o carbono, pode ser uma ilustração de grafite ou diamante; para o oxigênio, uma representação de bolhas de ar.</p>
  </li>
  <li>
    <p><strong>Grupo</strong>: Indica a família de elementos à qual pertence (por exemplo: “Metais Alcalinos”, “Halogênios”, “Gases Nobres”). Essa informação é fundamental para entender as propriedades químicas do elemento.</p>
  </li>
  <li>
    <p><strong>Símbolo</strong>: A abreviatura química do elemento (exemplo: H para Hidrogênio, O para Oxigênio, Au para Ouro), apresentada de forma clara e acessível.</p>
  </li>
  <li>
    <p><strong>Número atômico</strong>: Indica quantos prótons existem no núcleo do átomo, definindo a identidade do elemento e sua posição na tabela periódica.</p>
  </li>
  <li>
    <p><strong>Número de massa (massa atômica)</strong>: Representa a soma de prótons e nêutrons no núcleo, indicando a massa aproximada do átomo.</p>
  </li>
  <li>
    <p><strong>Distribuição eletrônica</strong>: Apresentada de duas formas complementares para garantir acessibilidade total:</p>

    <ul>
      <li><strong>Visual</strong>: Um diagrama ilustrativo mostrando o núcleo do átomo no centro e as camadas eletrônicas ao redor, com os elétrons distribuídos em suas respectivas posições. Essa representação visual auxilia quem enxerga a compreender espacialmente a organização dos elétrons.</li>
    </ul>
  </li>
</ul>

<div class="text-center mb-4">
    <figcaption>Figura 19: Representação visual da distribuição eletrônica do Hidrogênio.</figcaption>
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://imagedelivery.net/Ruw4waFkOelbXULIoE-oQg/c7c023b7-c298-4a7a-772f-9005930f1100/public" alt="Diagrama ilustrativo da distribuição eletrônica do Hidrogênio" loading="lazy" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

        <figcaption class="visually-hidden">A imagem mostra uma representação visual simples da distribuição eletrônica do hidrogênio, sobre um fundo preto. No centro aparece um pequeno círculo cinza, que representa o núcleo do átomo. Ao redor desse núcleo há um único círculo fino na cor azul-clara, formando uma órbita eletrônica. Sobre essa órbita existe apenas um pequeno ponto azul-claro, que representa o único elétron do hidrogênio, girando em volta do núcleo. Perto da parte superior da órbita está a letra “K”, indicando a camada eletrônica K, que é a primeira e única camada ocupada nesse elemento. A imagem ilustra de forma didática que o hidrogênio possui apenas um elétron distribuído na camada mais interna do átomo.
    </figcaption>
    <figcaption>Fonte: Elaborada pela autora.</figcaption>
</div>

<ul>
  <li><strong>Linear (textual)</strong>: A notação científica padrão da distribuição eletrônica, apresentada em formato de texto sequencial. Exemplo: Camada 1: 1s¹. A leitura dessa notação é direta, sequencial e construída usando atributos <em>ARIA</em> para garantir que leitores de tela anunciem corretamente cada parte da configuração eletrônica.</li>
</ul>

<div class="text-center mb-4">
    <figcaption>Figura 20: Modal de detalhes do elemento, exibindo informações completas e acessíveis.</figcaption>
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://imagedelivery.net/Ruw4waFkOelbXULIoE-oQg/6dc29fb6-d403-40e4-1dea-0017e6efd300/public" alt="Janela pop-up de informações do elemento Boro" loading="lazy" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

    <figcaption class="visually-hidden">
    A imagem mostra uma janela de detalhes aberta sobre a tabela periódica, com foco no elemento Boro, em uma interface de fundo escuro. No topo da janela aparece o título “Boro” e, no canto superior direito, há um botão em forma de “X” para fechar o painel. Logo abaixo está o subtítulo “Informações”, indicando que se trata de um painel informativo.
    <br />
    Na parte superior do conteúdo há uma ilustração em estilo de carta, semelhante a um cartão educativo. Nela aparece a letra “B”, o nome “Boro”, o número atômico “5” e a indicação “Equipamentos Esportivos”, acompanhada do desenho de uma raquete e uma bola, sugerindo um uso ou associação simbólica do elemento. Abaixo dessa ilustração estão listadas várias informações textuais: o grupo químico “Semimetal”, o símbolo “B”, o número atômico “5” e o número de massa “10,81”.
    <br />
    Mais abaixo aparece a seção “Distribuição eletrônica”, acompanhada de um diagrama visual do átomo. Esse diagrama mostra um núcleo central em cinza e duas camadas eletrônicas circulares, identificadas pelas letras “K” e “L”. Pequenos pontos azuis sobre essas órbitas representam os elétrons distribuídos ao redor do núcleo. Logo abaixo do desenho, a distribuição eletrônica é detalhada em texto, indicando: “Camada 1: 1s2” e “Camada 2: 2s2 2p1”.
    <br />
    Na parte inferior da janela há um botão com o texto “Voltar à tabela”, indicando que a pessoa usuária pode fechar o painel e retornar à visualização geral da tabela periódica. Ao fundo, de forma desfocada e escurecida, ainda é possível perceber outros cartões da tabela periódica, como Lítio, Carbono, Nitrogênio, Neônio, Silício e Argônio, mostrando que o painel do Boro está sobreposto à tabela principal.
    </figcaption>
    <figcaption>Fonte: Elaborada pela autora.</figcaption>
</div>

<h2 id="consideracoes-finais">Considerações Finais</h2>
<hr />

<p>Este artigo teve como objetivo investigar desafios e estratégias para o ensino da tabela periódica a estudantes com deficiência visual e, a partir disso, propor e validar uma ferramenta digital acessível. Esse objetivo foi alcançado por meio do desenvolvimento de uma Tabela Periódica Acessível baseada em tecnologias <em>Web</em> e em princípios de acessibilidade, contemplando o uso de <em>HTML</em> semântico, textos alternativos, compatibilidade com leitores de tela, navegação por teclado e rotulagem adequada com <em>ARIA</em>, além de modos de visualização que organizam o conteúdo em blocos menores e mais manejáveis.</p>

<p>Os resultados obtidos na validação indicam que a proposta responde diretamente ao problema da pesquisa: é possível disponibilizar a tabela periódica em formato digital sem que o recurso se torne uma barreira para pessoas com deficiência visual. A maioria dos participantes considerou a ferramenta mais acessível, mais usável e com melhor design do que outras tabelas digitais (89,1%). Também se observou boa avaliação da navegação por teclado (72,7% classificaram como fácil) e do funcionamento com leitores de tela (69,1% relataram funcionamento perfeito). Em conjunto, esses achados sugerem que as decisões de design e a estrutura técnica adotada contribuíram para reduzir barreiras, favorecendo autonomia e consistência na experiência de uso.</p>

<p>Como contribuição prática, a pesquisa disponibiliza uma ferramenta gratuita e pública que pode ser incorporada ao contexto educacional como recurso de apoio ao ensino de Química, especialmente quando se busca ampliar a autonomia e a participação de estudantes com deficiência visual. Do ponto de vista teórico e metodológico, o trabalho reforça a internet e o desenvolvimento <em>Web</em> como tecnologias assistivas viáveis, evidenciando que acessibilidade não é um complemento, mas um requisito estruturante do projeto. Além disso, o estudo exemplifica um caminho replicável de concepção de recursos educacionais: combinar princípios de Desenho Universal, boas práticas de acessibilidade e validação com pessoas usuárias para orientar decisões de desenvolvimento.</p>

<p>Apesar dos resultados positivos, algumas limitações devem ser consideradas. A amostra foi restrita e apresentou baixa participação de pessoas com baixa visão, o que reduz a generalização dos achados para todo o espectro da deficiência visual. A avaliação também foi baseada predominantemente em percepções de uso (questionário), sem contemplar medidas diretas de aprendizagem ou acompanhamento longitudinal em sala de aula. Adicionalmente, a experiência pode variar conforme dispositivo, sistema operacional, versão do leitor de tela e nível de familiaridade das pessoas participantes com tecnologias assistivas.</p>

<p>Como continuidade, recomenda-se ampliar a pesquisa com maior diversidade de participantes (incluindo mais pessoas com baixa visão) e com estudos em ambientes educacionais reais, investigando não apenas usabilidade e acessibilidade, mas também impactos no aprendizado, na motivação e na participação em atividades de Química. Outra direção relevante é aprofundar testes comparativos entre diferentes leitores de tela e plataformas, bem como aprimorar estratégias pedagógicas de uso da ferramenta (por exemplo, roteiros didáticos e orientações para docentes) para fortalecer sua integração ao currículo.</p>

<p>Por fim, novas investigações podem explorar a combinação de recursos digitais acessíveis com abordagens multissensoriais (como materiais táteis), buscando ampliar ainda mais as possibilidades de ensino inclusivo de conteúdos que dependem fortemente de representações visuais. A pesquisa reforça a importância de considerar a diversidade de necessidades e experiências das pessoas com deficiência visual no desenvolvimento de recursos educacionais, promovendo uma educação mais inclusiva, equitativa e centrada na autonomia dos estudantes.</p>

<h2 id="referencias">Referências</h2>
<hr />

<ul class="references-list text-light text-break ps-lg-4">
    <li class="mb-3">
    BERSCH, R. Classificações de Tecnologia Assistiva. Porto Alegre: Acessibilidade Brasil/Assistiva, 2013.
    </li>
    <li class="mb-3">
        BERSCH, R. Tecnologia Assistiva e Educação Inclusiva. In: <em>Ensaios Pedagógicos</em>. Brasília: Ministério da Educação, Secretaria de Educação Especial, 2006. p. 146.
    </li>
    <li class="mb-3">
    BRASIL. Lei nº 9.394, de 20 de dezembro de 1996. Estabelece as diretrizes e bases da educação nacional. <em>Diário Oficial da União</em>, Brasília, DF, v. 134, n. 248, 23 dez. 1996. Seção 1, p. 27834–27841.
    </li>
        <li class="mb-3">
            BRASIL. Lei nº 13.146, de 6 de julho de 2015. Institui a Lei Brasileira de Inclusão da Pessoa com Deficiência (Estatuto da Pessoa com Deficiência).
        </li>
    <li class="mb-3">
    BRASIL. Decreto nº 3.298, de 20 de dezembro de 1999. Regulamenta a Lei nº 7.853/1989 e dispõe sobre a Política Nacional para a Integração da Pessoa Portadora de Deficiência.
    </li>
    <li class="mb-3">
        BRASIL. Ministério da Educação. Secretaria de Educação Especial. <em>Desenvolvendo competências para o atendimento das necessidades educacionais de alunos cegos e de alunos com baixa visão</em>. Brasília: MEC/SEESP, 2005.
    </li>
    <li class="mb-3">
        CONDE, A. J. M. Definindo cegueira e baixa visão.
    </li>
    <li class="mb-3">
        FELTRE, R. <em>Química Geral</em>. São Paulo: Editora Moderna, 2004.
    </li>
    <li class="mb-3">
        GALVÃO FILHO, T. As novas tecnologias na escola e no mundo atual: fator de inclusão social do aluno com necessidades especiais? In: <em>Anais do III Congresso Ibero-Americano de Informática na Educação Especial</em>. Fortaleza: MEC, 2002.
    </li>
    <li class="mb-3">
        GALVÃO FILHO, T.; DAMASCENO, L. Programa InfoEsp: Premio Reina Sofia 2007 de Rehabilitación y de Integración. <em>Boletín del Real Patronato Sobre Discapacidad</em>, Ministerio de Educación, Política Social y Deporte, Madrid, n. 63, p. 14–23, abr. 2008. ISSN 1696-0998.
    </li>
    <li class="mb-3">
    GARRUTTI DE LOURENÇO, B. A.; <em>et al.</em> <em>Acessibilidade para estudantes com deficiência visual: orientações para o ensino superior</em>. São Paulo: UNIFESP, 2020.
    </li>
    <li class="mb-3">
        IVANOVICH, A. C. F.; GESSER, M. Deficiência e capacitismo: correção dos corpos e produção de sujeitos (a)políticos. <em>Quaderns de Psicologia</em>, v. 22, n. 3, e1618, 2020.
    </li>
    <li class="mb-3">
        JACYNTHO, M. D. de A. <em>Processos para Desenvolvimento de Aplicações Web</em>. 2008. 25 f. Monografia (Bacharelado em Ciência da Computação) — PUC-Rio, 2008.
    </li>
    <li class="mb-3">
        LIMA, A. G. <em>JavaScript – Aplicações Interativas para a Web</em>.
    </li>
    <li class="mb-3">
        MANTOAN, M. T. E. A tecnologia aplicada à educação na perspectiva inclusiva. Mimeo, 2005.
    </li>
    <li class="mb-3">
        RABELLO, E. T.; PASSOS, J. S. Vygotsky e o desenvolvimento humano.
    </li>
    <li class="mb-3">
        REBONATTO, M. T. <em>Organização de Computadores – Notas de aula</em>. Passo Fundo, 2003.
    </li>
    <li class="mb-3">
        REIS, C. de A. R. <em>A baixa visão no meu caminho</em>. Aracaju: Editora Triunfo, 2015.
    </li>
    <li class="mb-3">
        SANTOS, E. C. dos; FERRÉ, F. <em>Introdução ao desenvolvimento Web usando HTML, CSS e PHP</em>.
    </li>
    <li class="mb-3">
        SIAULIYS, M. O. C.; ORMELEZI, E. M.; BRIANT, M. E. (Org.). <em>A deficiência visual associada à deficiência múltipla e o atendimento educacional especializado: encarando desafios e construindo possibilidades</em>. São Paulo: Laramara, 2010.
    </li>
    <li class="mb-3">
        SILVA, M. O. E. Inclusão e Formação Docente. <em>Eccos – Revista Científica</em>, v. 10, n. 2, p. 479–495, [s.d.].
    </li>
    <li class="mb-3">
    W3C – World Wide Web Consortium. <em>Web Content Accessibility Guidelines (WCAG) 2.2</em>. 05 out. 2023.
    </li>
    <li class="mb-3">
    W3C – World Wide Web Consortium. <em>Accessible Rich Internet Applications (WAI‑ARIA) 1.2</em>. 06 set. 2023.
    </li>
</ul>]]></content><author><name>Louise Suelen</name></author><category term="Educação" /><category term="Educação" /><category term="Química" /><summary type="html"><![CDATA[Este artigo apresenta uma proposta de tabela periódica acessível para estudantes com deficiência visual, utilizando tecnologias WEB para implementar recursos de acessibilidade na ferramenta.]]></summary></entry><entry xml:lang="pt-BR"><title type="html">Introdução à Programação: Exercícios para Praticar</title><link href="https://pcdnaescola.com.br/introducao-a-programacao-exerc%C3%ADcios-para-praticar/" rel="alternate" type="text/html" title="Introdução à Programação: Exercícios para Praticar" /><published>2025-10-14T13:00:00+00:00</published><updated>2025-10-14T13:00:00+00:00</updated><id>https://pcdnaescola.com.br/introducao-a-programacao-exerc%C3%ADcios-para-praticar</id><content type="html" xml:base="https://pcdnaescola.com.br/introducao-a-programacao-exerc%C3%ADcios-para-praticar/"><![CDATA[<h2 id="apresentação">Apresentação</h2>
<hr />

<p>No artigo anterior, aprendemos sobre as estruturas de repetição em Ruby. Vimos o <code class="language-plaintext highlighter-rouge">while</code> e o <code class="language-plaintext highlighter-rouge">until</code>, que repetem código enquanto uma condição for verdadeira ou falsa. Depois, o <code class="language-plaintext highlighter-rouge">for</code> e o <code class="language-plaintext highlighter-rouge">each</code>, que percorrem coleções como arrays e ranges, e o <code class="language-plaintext highlighter-rouge">times</code>, que repete uma ação um número exato de vezes. Por fim, o <code class="language-plaintext highlighter-rouge">loop</code>, que cria um ciclo que só para com o comando <code class="language-plaintext highlighter-rouge">break</code>, e o <code class="language-plaintext highlighter-rouge">next</code>, que pula para a próxima iteração sem executar o restante do bloco.</p>

<p>Com esse artigo, encerramos o ciclo de apresentação dos fundamentos da programação nesta série. Ao longo dos últimos artigos, passamos por variáveis, tipos de dados, entrada e saída de dados, expressões condicionais e estruturas de repetição. São os blocos básicos com os quais qualquer programa é construído.</p>

<p>Mas saber o que existe e saber usar são coisas diferentes. É como aprender as regras de um jogo: você pode ler o manual inteiro e ainda não saber jogar. A leitura e os exemplos dos artigos anteriores apresentaram os conceitos isolados, agora chegou o momento de combiná-los para resolver problemas reais.</p>

<p>Neste artigo, esses conceitos serão colocados em prática com exercícios organizados em três níveis de dificuldade. No nível básico, os programas são curtos e diretos, focados em um conceito por vez. No intermediário, diferentes estruturas começam a ser combinadas para resolver problemas mais elaborados. No avançado, o desafio é pensar no programa como um sistema completo, com menus, validações e estruturas de dados.</p>

<p>Para cada exercício há o enunciado, uma explicação passo a passo de como chegar na solução e o código completo ao final.</p>

<p><strong>Dica importante</strong>: Antes de ler a solução, tente resolver o exercício por conta própria. Mesmo que o resultado não seja perfeito, o esforço de pensar na solução é o que realmente desenvolve o raciocínio lógico. A solução apresentada aqui é apenas uma das formas possíveis de resolver cada problema.</p>

<h2 id="nível-básico">Nível Básico</h2>
<hr />

<p>Os exercícios do nível básico focam nos fundamentos da programação: variáveis, entrada de dados, conversão de tipos e condicionais simples. Você vai praticar o uso de <code class="language-plaintext highlighter-rouge">puts</code>, <code class="language-plaintext highlighter-rouge">print</code>, <code class="language-plaintext highlighter-rouge">gets.chomp</code>, interpolação de strings, o operador de módulo <code class="language-plaintext highlighter-rouge">%</code> e estruturas <code class="language-plaintext highlighter-rouge">if/else</code>. São três programas curtos e diretos, ideais para quem está dando os primeiros passos na escrita de código.</p>

<h3 id="programa-saudação-personalizada">Programa saudação personalizada</h3>
<hr />

<p>O programa pede para a pessoa digitar um nome e depois imprime uma saudação personalizada com o nome digitado.</p>

<h4 id="como-fazer">Como fazer?</h4>

<p>Para desenvolver este e qualquer outro programa, devemos dividir o problema grande em passos lógicos menores. O raciocínio deve seguir o fluxo:</p>

<ul>
  <li><strong>Entrada</strong></li>
  <li><strong>Processamento</strong></li>
  <li><strong>Saída</strong></li>
</ul>

<p>O problema é: Preciso pegar um texto da pessoa (o nome) e devolvê-lo dentro de uma frase.</p>

<p>Então precisamos de:</p>

<ul>
  <li>Uma maneira de mostrar texto na tela.</li>
  <li>Uma maneira de capturar (pegar) o que a pessoa digita.</li>
  <li>Um lugar para guardar essa informação que a pessoa digitou (variável).</li>
</ul>

<p>Precisamos criar uma variável vazia chamada <code class="language-plaintext highlighter-rouge">nome</code> para guardar o que a pessoa digitar depois. Então vamos criar e inicializar essa variável como uma <code class="language-plaintext highlighter-rouge">string</code> vazia.</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">nome</span> <span class="o">=</span> <span class="s2">""</span>
</code></pre></div></div>

<p><em>Em Ruby, diferente de outras linguagens de programação, isso não é estritamente obrigatório (você poderia criar a variável direto no momento da leitura), mas ajuda na organização mental e do código.</em></p>

<p>O próximo passo é informar à pessoa o que o programa faz e pedir a informação correta. Vamos usar <code class="language-plaintext highlighter-rouge">puts</code> e <code class="language-plaintext highlighter-rouge">print</code>.</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">puts</span> <span class="s2">"Programa de Saudação Personalizada"</span> <span class="c1"># Título que pula linha no final</span>
<span class="nb">print</span> <span class="s2">"Por favor, digite seu nome: "</span>      <span class="c1"># Pergunta que não pula a linha</span>
</code></pre></div></div>

<p>Agora o programa deve parar e esperar a pessoa digitar a informação e apertar <code class="language-plaintext highlighter-rouge">ENTER</code>.</p>

<p>Temos que lembrar de ler a informação do teclado (com o <code class="language-plaintext highlighter-rouge">gets</code>), mas também temos que limpar o espaço causado pela tecla <code class="language-plaintext highlighter-rouge">Enter</code> que vem junto, usando <code class="language-plaintext highlighter-rouge">chomp</code>.</p>

<p>Então usamos:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">nome</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span>
</code></pre></div></div>

<p>Agora temos o nome guardado na variável <code class="language-plaintext highlighter-rouge">nome</code> e precisamos misturá-lo com uma frase fixa.</p>

<p>Vamos escrever a frase fixa e, no meio dela, inserir o nome que está dentro da variável. Também vamos evitar que tenham espaços sobrando no nome guardado, tanto no começo quanto no final. Para limpar esses espaços, caso eles existam, vamos usar o método <code class="language-plaintext highlighter-rouge">strip</code>.</p>

<p>Podemos fazer isso assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">puts</span> <span class="s2">"Olá </span><span class="si">#{</span><span class="n">nome</span><span class="p">.</span><span class="nf">strip</span><span class="si">}</span><span class="s2">! Receba as boas-vindas ao nosso programa!"</span>
</code></pre></div></div>

<p>O programa completo ficou assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Declara variável para receber o nome da pessoa</span>
<span class="n">nome</span> <span class="o">=</span> <span class="s2">""</span>

<span class="c1"># Pede para a pessoa digitar seu nome</span>
<span class="nb">puts</span> <span class="s2">"Programa de Saudação Personalizada"</span>
<span class="nb">print</span> <span class="s2">"Por favor, digite seu nome: "</span>
<span class="n">nome</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span>

<span class="c1"># Exibe a saudação personalizada</span>
<span class="nb">puts</span> <span class="s2">"Olá </span><span class="si">#{</span><span class="n">nome</span><span class="p">.</span><span class="nf">strip</span><span class="si">}</span><span class="s2">! Receba as boas-vindas ao nosso programa!"</span>
</code></pre></div></div>

<h3 id="programa-calculadora-de-idade-atual">Programa calculadora de idade atual</h3>
<hr />

<p>O programa deve pedir para a pessoa digitar um ano de nascimento (exemplo: 1995) e depois deve mostrar sua idade aproximada.</p>

<p>É importante lembrar de fazer a validação para impedir que a pessoa passe letras ao programa, uma data de nascimento que seja impossível (muito no passado, como 1500) ou uma data futura superior à data atual.</p>

<h4 id="como-fazer-1">Como fazer?</h4>

<p>O problema é: Precisamos garantir que a pessoa digite um dado válido. Se ela digitar errado, o programa não pode continuar; precisamos repetir a pergunta até receber uma informação válida.</p>

<p>Sabemos quantas tentativas a pessoa vai gastar até colocar um ano de nascimento válido? Não. Precisamos que o programa comece pedindo um ano de nascimento e só pare de pedir quando receber um valor correto.</p>

<p>Qual laço de repetição pode ser usado nestas condições? O <code class="language-plaintext highlighter-rouge">while</code>.</p>

<p>Para fazer o programa ser executado na primeira vez, vamos assumir que a pessoa <strong>ainda não tem</strong> uma idade válida (idade = 0). Enquanto a idade continuar inválida (ou zero), o programa fica preso num loop (laço de repetição) perguntando o ano.</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">idade</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">while</span> <span class="n">idade</span> <span class="o">&lt;=</span> <span class="mi">0</span>
  <span class="c1"># Perguntas e validações acontecem aqui dentro</span>
<span class="k">end</span>
</code></pre></div></div>

<p>E se a pessoa digitar “abcd” em vez de números? Se tentarmos fazer algum cálculo matemático (“2025 menos abcd”), o programa vai “quebrar” (dar erro e fechar).</p>

<p>Temos que converter o que a pessoa digitar para números inteiros (porque não existem anos com vírgula, como 1995,2). Mas, se a pessoa digitar letras, ao invés de travar, temos que transformar o que ela digitou em um valor nulo (<code class="language-plaintext highlighter-rouge">nil</code>) silenciosamente.</p>

<p>Vamos tentar transformar o texto em número inteiro usando <code class="language-plaintext highlighter-rouge">Integer(...)</code>. Se der erro (porque a pessoa não digitou números), vamos usar o <code class="language-plaintext highlighter-rouge">rescue</code> para capturar esse erro e transformar o valor em <code class="language-plaintext highlighter-rouge">nil</code> (nulo) em vez de travar o sistema.</p>

<p>Podemos fazer assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">print</span> <span class="s2">"Digite o seu ano de nascimento (exemplo: 1990): "</span>
<span class="n">ano_nascimento</span> <span class="o">=</span> <span class="no">Integer</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span> <span class="k">rescue</span> <span class="kp">nil</span>
</code></pre></div></div>

<p><em>Isso é fundamental: sem o <code class="language-plaintext highlighter-rouge">rescue nil</code>, quando a pessoa digitar letras, isso travaria o programa imediatamente e ele seria encerrado com erro.</em></p>

<p>Ok! Mas agora, como fazer a validação do ano digitado?</p>

<p>Por exemplo, se a pessoa digitou um número absurdo, que não tem como ser um ano de nascimento (exemplo: ano 1500 ou ano 3000). A solução é criar um <code class="language-plaintext highlighter-rouge">if</code> com várias barreiras. A informação digitada é rejeitada se <strong>qualquer uma</strong> das condições ruins for verdade.</p>

<p>O ano será considerado inválido SE:</p>

<ul>
  <li>For vazio (<code class="language-plaintext highlighter-rouge">nil?</code>, como no caso em que digitamos letras e o <code class="language-plaintext highlighter-rouge">rescue</code> converteu para <code class="language-plaintext highlighter-rouge">nil</code>) <strong>OU</strong> (<code class="language-plaintext highlighter-rouge">||</code>)</li>
  <li>For muito antigo, de forma que não tenha como a pessoa estar viva (menor que o ano 1900) <strong>OU</strong> (<code class="language-plaintext highlighter-rouge">||</code>)</li>
  <li>For no futuro (maior que o ano atual).</li>
</ul>

<p>Então devemos perguntar se o ano de nascimento é nulo, se ele é menor que 1900 ou maior que o ano atual.</p>

<p>Podemos fazer isso assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="n">ano_nascimento</span><span class="p">.</span><span class="nf">nil?</span> <span class="o">||</span> <span class="n">ano_nascimento</span> <span class="o">&lt;</span> <span class="mi">1900</span> <span class="o">||</span> <span class="n">ano_nascimento</span> <span class="o">&gt;</span> <span class="no">Time</span><span class="p">.</span><span class="nf">now</span><span class="p">.</span><span class="nf">year</span>
    <span class="nb">puts</span> <span class="s2">"Ano de nascimento inválido. Por favor informe um ano válido."</span>
<span class="k">else</span>
</code></pre></div></div>

<p>Neste caso, o <code class="language-plaintext highlighter-rouge">if</code> está testando três condições ao mesmo tempo:</p>

<ol>
  <li><strong><code class="language-plaintext highlighter-rouge">ano_nascimento.nil?</code></strong>: “O valor dentro da variável <code class="language-plaintext highlighter-rouge">ano_nascimento</code> é nulo?” (ou seja, a pessoa digitou letras?).</li>
  <li><strong><code class="language-plaintext highlighter-rouge">ano_nascimento &lt; 1900</code></strong>: “A pessoa digitou uma data antes de 1900?” (o que provavelmente é um erro).</li>
  <li><strong><code class="language-plaintext highlighter-rouge">ano_nascimento &gt; Time.now.year</code></strong>: “O ano de nascimento digitado é maior que o ano atual?” (o que também é um erro). O <code class="language-plaintext highlighter-rouge">Time.now.year</code> pega o ano atual direto do relógio do computador automaticamente.</li>
</ol>

<p>Se o valor digitado passou pelas condições do <code class="language-plaintext highlighter-rouge">if</code> (não é nulo, não é menor que 1900 e não é futuro), entramos no “caso contrário”, o <code class="language-plaintext highlighter-rouge">else</code>. Dentro do <code class="language-plaintext highlighter-rouge">else</code>, fazemos o cálculo.</p>

<ul>
  <li>Colocamos a variável <code class="language-plaintext highlighter-rouge">ano_atual</code> para receber o ano atual do relógio do computador.</li>
  <li>Depois, a <code class="language-plaintext highlighter-rouge">idade</code> vai receber o ano atual menos o ano digitado.</li>
  <li>Então a variável <code class="language-plaintext highlighter-rouge">idade</code> vai ser atualizada com esse resultado.
    <ul>
      <li>Por exemplo: <code class="language-plaintext highlighter-rouge">idade = 2026 - 1995</code></li>
      <li>A variável <code class="language-plaintext highlighter-rouge">idade</code> vai atualizar de <code class="language-plaintext highlighter-rouge">0</code> para <code class="language-plaintext highlighter-rouge">31</code>.</li>
    </ul>
  </li>
</ul>

<p>Como a <code class="language-plaintext highlighter-rouge">idade</code> agora é um número positivo (exemplo: 31), quando o programa chegar no fim do bloco (no <code class="language-plaintext highlighter-rouge">end</code>) e voltar lá no <code class="language-plaintext highlighter-rouge">while</code>, a condição <code class="language-plaintext highlighter-rouge">idade &lt;= 0</code> será <strong>falsa</strong>. O loop quebra e o programa avança sem repetir a pergunta.</p>

<p>O código do <code class="language-plaintext highlighter-rouge">else</code> ficaria assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">else</span>
  <span class="c1"># Calcular a idade atual</span>
  <span class="n">ano_atual</span> <span class="o">=</span> <span class="no">Time</span><span class="p">.</span><span class="nf">now</span><span class="p">.</span><span class="nf">year</span>
  <span class="n">idade</span> <span class="o">=</span> <span class="n">ano_atual</span> <span class="o">-</span> <span class="n">ano_nascimento</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Depois de fazer todo esse cálculo, é preciso exibir o resultado para a pessoa:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">puts</span> <span class="s2">"O ano atual é </span><span class="si">#{</span><span class="no">Time</span><span class="p">.</span><span class="nf">now</span><span class="p">.</span><span class="nf">year</span><span class="si">}</span><span class="s2">, seu ano de nascimento é </span><span class="si">#{</span><span class="n">ano_nascimento</span><span class="si">}</span><span class="s2">, então a sua idade atual é aproximadamente </span><span class="si">#{</span><span class="n">idade</span><span class="si">}</span><span class="s2"> anos."</span>
</code></pre></div></div>

<p>O programa completo fica assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Variável que vai guardar a idade da pessoa</span>
<span class="n">idade</span> <span class="o">=</span> <span class="mi">0</span>

<span class="c1"># Vamos pedir o ano de nascimento da pessoa</span>
<span class="c1"># Lembrar de validar que a pessoa não digitou letras ou um ano impossível</span>

<span class="nb">puts</span> <span class="s2">"Programa calculadora de idade atual"</span>

<span class="k">while</span> <span class="n">idade</span> <span class="o">&lt;=</span> <span class="mi">0</span>

  <span class="nb">print</span> <span class="s2">"Digite o seu ano de nascimento (exemplo: 1990): "</span>
  <span class="n">ano_nascimento</span> <span class="o">=</span> <span class="no">Integer</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span> <span class="k">rescue</span> <span class="kp">nil</span>

  <span class="k">if</span> <span class="n">ano_nascimento</span><span class="p">.</span><span class="nf">nil?</span> <span class="o">||</span> <span class="n">ano_nascimento</span> <span class="o">&lt;</span> <span class="mi">1900</span> <span class="o">||</span> <span class="n">ano_nascimento</span> <span class="o">&gt;</span> <span class="no">Time</span><span class="p">.</span><span class="nf">now</span><span class="p">.</span><span class="nf">year</span>
    <span class="nb">puts</span> <span class="s2">"Ano de nascimento inválido. Por favor informe um ano válido."</span>
  <span class="k">else</span>
    <span class="c1"># Calcular a idade atual</span>
    <span class="n">ano_atual</span> <span class="o">=</span> <span class="no">Time</span><span class="p">.</span><span class="nf">now</span><span class="p">.</span><span class="nf">year</span>
    <span class="n">idade</span> <span class="o">=</span> <span class="n">ano_atual</span> <span class="o">-</span> <span class="n">ano_nascimento</span>
  <span class="k">end</span>
<span class="k">end</span>

<span class="nb">puts</span> <span class="s2">"O ano atual é </span><span class="si">#{</span><span class="no">Time</span><span class="p">.</span><span class="nf">now</span><span class="p">.</span><span class="nf">year</span><span class="si">}</span><span class="s2">, seu ano de nascimento é </span><span class="si">#{</span><span class="n">ano_nascimento</span><span class="si">}</span><span class="s2">, então a sua idade atual é aproximadamente </span><span class="si">#{</span><span class="n">idade</span><span class="si">}</span><span class="s2"> anos."</span>
</code></pre></div></div>

<h3 id="programa-que-identifica-se-o-número-é-par-ou-ímpar">Programa que identifica se o número é par ou ímpar</h3>
<hr />

<p>O programa deve receber um número digitado pelo usuário e determinar se ele é par ou ímpar.</p>

<h4 id="como-fazer-2">Como fazer?</h4>

<p>A pergunta que devemos fazer é: como eu ensino para uma máquina o que é um número par ou ímpar? Na matemática, um número é par se, ao ser dividido por 2, <strong>não sobra nada</strong> (o resto é zero). Se sobrar alguma coisa, então o número é ímpar.</p>

<p>Vamos precisar de uma variável para receber o número:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numero</span> <span class="o">=</span> <span class="mf">0.0</span>
</code></pre></div></div>

<p>Depois, precisamos informar o nome do programa e pedir um número para a pessoa. Vamos usar o <code class="language-plaintext highlighter-rouge">puts</code> para exibir o nome do programa (com quebra de linha) e <code class="language-plaintext highlighter-rouge">print</code> para pedir o número (sem quebra de linha, mantendo o cursor ao lado).</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">puts</span> <span class="s2">"Programa que calcula se um número é par ou ímpar"</span>
<span class="nb">print</span> <span class="s2">"Digite um número: "</span>
</code></pre></div></div>

<p>Depois vamos usar a variável <code class="language-plaintext highlighter-rouge">numero</code> para receber o que a pessoa digita. Precisamos converter para <code class="language-plaintext highlighter-rouge">Float</code> (número decimal com vírgula) e limpar o espaço causado pela tecla <code class="language-plaintext highlighter-rouge">Enter</code>.</p>

<p>Geralmente, este tipo de programa costuma usar números inteiros. Mas, usando <code class="language-plaintext highlighter-rouge">Float</code>, o programa não travará se alguém digitar “2.5” ou “7.2”. Se a pessoa digitar um número inteiro como 4, o programa converterá para 4.0 e o cálculo funcionará normalmente.</p>

<p>Podemos receber o número dessa forma:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numero</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>
</code></pre></div></div>

<p>Podemos usar um <code class="language-plaintext highlighter-rouge">if numero % 2 == 0</code> para fazer a pergunta: se o número digitado for dividido por 2, o resto da divisão (o que sobra) é igual a 0?</p>

<ul>
  <li>Se o resto da divisão for <strong>0</strong>, a divisão foi exata. O número é <strong>PAR</strong>.</li>
  <li>Se o resto da divisão <strong>não</strong> for 0, o número é <strong>ÍMPAR</strong>.</li>
</ul>

<p>Vamos usar o <code class="language-plaintext highlighter-rouge">%</code>, que é o operador no Ruby para calcular o resto de uma divisão.</p>

<p>O código da verificação ficaria assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="n">numero</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span>
  <span class="nb">puts</span> <span class="s2">"</span><span class="si">#{</span><span class="n">numero</span><span class="si">}</span><span class="s2"> dividido por 2 é igual a </span><span class="si">#{</span><span class="n">numero</span> <span class="o">/</span> <span class="mi">2</span><span class="si">}</span><span class="s2">, portanto é um número par."</span>
<span class="k">else</span>
  <span class="nb">puts</span> <span class="s2">"</span><span class="si">#{</span><span class="n">numero</span><span class="si">}</span><span class="s2"> dividido por 2 é igual a </span><span class="si">#{</span><span class="n">numero</span> <span class="o">/</span> <span class="mi">2</span><span class="si">}</span><span class="s2">, portanto é um número ímpar."</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Depois finalizamos o bloco condicional (<code class="language-plaintext highlighter-rouge">if</code> / <code class="language-plaintext highlighter-rouge">else</code>) com o <code class="language-plaintext highlighter-rouge">end</code> e imprimimos que o programa finalizou.</p>

<p>O código completo fica assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Vamos pedir para a pessoa digitar um número e determinar se ele é par ou ímpar</span>

<span class="n">numero</span> <span class="o">=</span> <span class="mf">0.0</span>

<span class="nb">puts</span> <span class="s2">"Programa que calcula se um número é par ou ímpar"</span>

<span class="nb">print</span> <span class="s2">"Digite um número: "</span>
<span class="n">numero</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="k">if</span> <span class="n">numero</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span>
  <span class="nb">puts</span> <span class="s2">"</span><span class="si">#{</span><span class="n">numero</span><span class="si">}</span><span class="s2"> dividido por 2 é igual a </span><span class="si">#{</span><span class="n">numero</span> <span class="o">/</span> <span class="mi">2</span><span class="si">}</span><span class="s2">, portanto é um número par."</span>
<span class="k">else</span>
  <span class="nb">puts</span> <span class="s2">"</span><span class="si">#{</span><span class="n">numero</span><span class="si">}</span><span class="s2"> dividido por 2 é igual a </span><span class="si">#{</span><span class="n">numero</span> <span class="o">/</span> <span class="mi">2</span><span class="si">}</span><span class="s2">, portanto é um número ímpar."</span>
<span class="k">end</span>

<span class="nb">puts</span> <span class="s2">"Fim do programa."</span>
</code></pre></div></div>

<h2 id="nível-intermediário">Nível Intermediário</h2>
<hr />

<p>No nível intermediário, os exercícios combinam laços de repetição (<code class="language-plaintext highlighter-rouge">for</code>, <code class="language-plaintext highlighter-rouge">while</code>, <code class="language-plaintext highlighter-rouge">each</code>, <code class="language-plaintext highlighter-rouge">loop</code>, <code class="language-plaintext highlighter-rouge">times</code>) com lógicas mais elaboradas, como acumuladores, contadores, validação de entradas e o uso do <code class="language-plaintext highlighter-rouge">rescue</code> para tratar erros. Você vai implementar tabuadas, contar vogais, verificar números primos, somar quantidades variáveis de números, gerar a sequência de Fibonacci e criar um jogo de adivinhação. O objetivo é aprender a pensar além de um único bloco de código e combinar estruturas para resolver problemas mais complexos.</p>

<h3 id="programa-para-exibir-a-tabuada-de-um-número">Programa para exibir a tabuada de um número</h3>
<hr />

<p>O programa deve receber um número digitado pela pessoa e informar a sua tabuada de multiplicação de 1 a 10.</p>

<h4 id="como-fazer-3">Como fazer?</h4>

<p>O problema consiste em repetir uma mesma operação matemática (multiplicação) várias vezes, alterando apenas um dos números.</p>

<p>Precisamos:</p>

<ol>
  <li>Receber o número que a pessoa quer calcular.</li>
  <li>Criar um laço de repetição que vá de 1 até 10.</li>
  <li>Dentro desse laço, multiplicar o número escolhido pelo contador atual e mostrar o resultado.</li>
</ol>

<p>Vamos começar pedindo o número:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numero</span> <span class="o">=</span> <span class="mi">0</span>

<span class="nb">puts</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">Programa para exibir a tabuada de um número.</span><span class="se">\n</span><span class="s2">"</span>
<span class="nb">print</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">Digite um número inteiro: "</span>
<span class="n">numero</span> <span class="o">=</span> <span class="no">Integer</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>
</code></pre></div></div>

<p>Agora, vamos ver como resolver a repetição. Existem três formas principais de fazer isso em Ruby: o jeito clássico (<code class="language-plaintext highlighter-rouge">for</code>), o jeito manual (<code class="language-plaintext highlighter-rouge">while</code>) e o jeito “Ruby” (<code class="language-plaintext highlighter-rouge">each</code>).</p>

<h4 id="1-o-jeito-clássico-o-laço-for">1. O Jeito Clássico: O Laço <code class="language-plaintext highlighter-rouge">for</code></h4>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="mi">1</span><span class="o">..</span><span class="mi">10</span>
  <span class="n">resultado</span> <span class="o">=</span> <span class="n">numero</span> <span class="o">*</span> <span class="n">i</span>
  <span class="nb">puts</span> <span class="s2">"</span><span class="si">#{</span><span class="n">numero</span><span class="si">}</span><span class="s2"> x </span><span class="si">#{</span><span class="n">i</span><span class="si">}</span><span class="s2"> = </span><span class="si">#{</span><span class="n">resultado</span><span class="si">}</span><span class="s2">"</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Aqui estamos dizendo: “Para (<code class="language-plaintext highlighter-rouge">for</code>) cada número (<code class="language-plaintext highlighter-rouge">i</code>) dentro do intervalo de 1 até 10 (<code class="language-plaintext highlighter-rouge">1..10</code>), faça o que está abaixo”. O computador pega o primeiro número (1), coloca na variável <code class="language-plaintext highlighter-rouge">i</code>, executa o bloco, volta, pega o próximo (2), e assim por diante até o 10.</p>

<h4 id="2-o-jeito-manual-o-laço-while">2. O Jeito “Manual”: O Laço <code class="language-plaintext highlighter-rouge">while</code></h4>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">i</span> <span class="o">=</span> <span class="mi">1</span>

<span class="k">while</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="mi">10</span>
  <span class="n">resultado</span> <span class="o">=</span> <span class="n">numero</span> <span class="o">*</span> <span class="n">i</span>
  <span class="nb">puts</span> <span class="s2">"</span><span class="si">#{</span><span class="n">numero</span><span class="si">}</span><span class="s2"> x </span><span class="si">#{</span><span class="n">i</span><span class="si">}</span><span class="s2"> = </span><span class="si">#{</span><span class="n">resultado</span><span class="si">}</span><span class="s2">"</span>
  <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">end</span>
</code></pre></div></div>

<p>O while significa “enquanto”. Definimos manualmente que <code class="language-plaintext highlighter-rouge">i = 1</code>. Enquanto i for menor ou igual a 10, ele executa.</p>

<p>Atenção: No while, precisamos aumentar o contador manualmente (<code class="language-plaintext highlighter-rouge">i += 1</code>). Se esquecermos isso, o <code class="language-plaintext highlighter-rouge">i</code> será sempre 1 e o programa ficará preso num loop infinito.</p>

<h4 id="3-o-jeito-ruby-o-laço-each">3. O Jeito “Ruby”: O Laço <code class="language-plaintext highlighter-rouge">each</code></h4>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="mi">1</span><span class="o">..</span><span class="mi">10</span><span class="p">).</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">i</span><span class="o">|</span>
  <span class="n">resultado</span> <span class="o">=</span> <span class="n">numero</span> <span class="o">*</span> <span class="n">i</span>
  <span class="nb">puts</span> <span class="s2">"</span><span class="si">#{</span><span class="n">numero</span><span class="si">}</span><span class="s2"> x </span><span class="si">#{</span><span class="n">i</span><span class="si">}</span><span class="s2"> = </span><span class="si">#{</span><span class="n">resultado</span><span class="si">}</span><span class="s2">"</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Este é o jeito preferido em Ruby.</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">(1..10)</code>: Criamos o intervalo de números.</li>
  <li><code class="language-plaintext highlighter-rouge">.each do</code>: Dizemos “para <strong>cada</strong> item dentro deste intervalo, faça…”.</li>
  <li><code class="language-plaintext highlighter-rouge">|i|</code>: As barras verticais funcionam como uma pinça que pega o número da vez e coloca na variável <code class="language-plaintext highlighter-rouge">i</code>.</li>
</ul>

<p>Embora os três produzam o mesmo resultado visual, o <code class="language-plaintext highlighter-rouge">each</code> é a maneira mais comum em Ruby, focada em percorrer coleções de dados.</p>

<p>No programa completo demonstrando os três métodos e fica assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numero</span> <span class="o">=</span> <span class="mi">0</span>

<span class="nb">puts</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">Programa para exibir a tabuada de um número.</span><span class="se">\n</span><span class="s2">"</span>
<span class="nb">print</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">Digite um número inteiro: "</span>
<span class="n">numero</span> <span class="o">=</span> <span class="no">Integer</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="nb">puts</span> <span class="s2">"Tabuada do número </span><span class="si">#{</span><span class="n">numero</span><span class="si">}</span><span class="s2"> usando o laço 'for':</span><span class="se">\n\n</span><span class="s2">"</span>

<span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="mi">1</span><span class="o">..</span><span class="mi">10</span>
  <span class="n">resultado</span> <span class="o">=</span> <span class="n">numero</span> <span class="o">*</span> <span class="n">i</span>
  <span class="nb">puts</span> <span class="s2">"</span><span class="si">#{</span><span class="n">numero</span><span class="si">}</span><span class="s2"> x </span><span class="si">#{</span><span class="n">i</span><span class="si">}</span><span class="s2"> = </span><span class="si">#{</span><span class="n">resultado</span><span class="si">}</span><span class="s2">"</span>
<span class="k">end</span>

<span class="nb">puts</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">A mesma tabuada usando o laço 'while':</span><span class="se">\n\n</span><span class="s2">"</span>

<span class="n">i</span> <span class="o">=</span> <span class="mi">1</span>

<span class="k">while</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="mi">10</span>
  <span class="n">resultado</span> <span class="o">=</span> <span class="n">numero</span> <span class="o">*</span> <span class="n">i</span>
  <span class="nb">puts</span> <span class="s2">"</span><span class="si">#{</span><span class="n">numero</span><span class="si">}</span><span class="s2"> x </span><span class="si">#{</span><span class="n">i</span><span class="si">}</span><span class="s2"> = </span><span class="si">#{</span><span class="n">resultado</span><span class="si">}</span><span class="s2">"</span>
  <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">end</span>

<span class="nb">puts</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">A mesma tabuada usando o laço 'each':</span><span class="se">\n\n</span><span class="s2">"</span>

<span class="p">(</span><span class="mi">1</span><span class="o">..</span><span class="mi">10</span><span class="p">).</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">i</span><span class="o">|</span>
  <span class="n">resultado</span> <span class="o">=</span> <span class="n">numero</span> <span class="o">*</span> <span class="n">i</span>
  <span class="nb">puts</span> <span class="s2">"</span><span class="si">#{</span><span class="n">numero</span><span class="si">}</span><span class="s2"> x </span><span class="si">#{</span><span class="n">i</span><span class="si">}</span><span class="s2"> = </span><span class="si">#{</span><span class="n">resultado</span><span class="si">}</span><span class="s2">"</span>
<span class="k">end</span>
</code></pre></div></div>

<h3 id="programa-contador-de-vogais">Programa contador de vogais</h3>
<hr />

<p>O programa deve receber uma frase ou texto digitado pela pessoa e identificar quantas vogais existem nele.</p>

<h4 id="como-fazer-4">Como fazer?</h4>

<p>O computador é muito literal: para ele, “a” é totalmente diferente de “á” ou “A”. Se não limparmos o texto, teríamos que procurar pela mesma letra várias vezes, testando cada possibilidade de acento ou maiúscula.</p>

<p>Então o fluxo lógico será:</p>

<ol>
  <li>Receber a frase.</li>
  <li>Limpar a frase: remover acentos e transformar tudo em minúsculo.</li>
  <li>Percorrer letra por letra da frase limpa.</li>
  <li>Verificar se a letra atual é uma vogal conhecida.</li>
  <li>Se for, somar 1 ao contador.</li>
</ol>

<p>Primeiro, definimos o que são vogais e pedimos a frase:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">vogais</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"a"</span><span class="p">,</span> <span class="s2">"e"</span><span class="p">,</span> <span class="s2">"i"</span><span class="p">,</span> <span class="s2">"o"</span><span class="p">,</span> <span class="s2">"u"</span><span class="p">]</span>

<span class="nb">puts</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">Programa contador de vogais.</span><span class="se">\n\n</span><span class="s2">"</span>
<span class="nb">print</span> <span class="s2">"Digite uma frase: "</span>
<span class="n">frase_digitada</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span>
</code></pre></div></div>

<p>Agora precisamos fazer o “tratamento dos dados”. Vamos usar o método <code class="language-plaintext highlighter-rouge">tr</code> (Translate/Traduzir) para trocar letras com acento por letras sem acento.</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">sem_acentos</span> <span class="o">=</span> <span class="n">frase_digitada</span><span class="p">.</span><span class="nf">tr</span><span class="p">(</span>
  <span class="s2">"áàãâäéèêëíìîïóòõôöúùûüçÁÀÃÂÄÉÈÊËÍÌÎÏÓÒÕÔÖÚÙÛÜÇ"</span><span class="p">,</span>
  <span class="s2">"aaaaaeeeeiiiiooooouuuucAAAAAEEEEIIIIOOOOOUUUUC"</span>
<span class="p">)</span>
</code></pre></div></div>

<p>Depois, transformamos tudo em letras minúsculas para padronizar a comparação:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">frase_minuscula</span> <span class="o">=</span> <span class="n">sem_acentos</span><span class="p">.</span><span class="nf">downcase</span>
</code></pre></div></div>

<p>Agora que o texto está limpo, vamos contá-lo. Vamos iniciar um contador (<code class="language-plaintext highlighter-rouge">total_vogais</code>) em zero e verificar caractere por caractere.</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">total_vogais</span> <span class="o">=</span> <span class="mi">0</span>

<span class="n">frase_minuscula</span><span class="p">.</span><span class="nf">each_char</span> <span class="k">do</span> <span class="o">|</span><span class="n">char</span><span class="o">|</span>
  <span class="k">if</span> <span class="n">vogais</span><span class="p">.</span><span class="nf">include?</span><span class="p">(</span><span class="n">char</span><span class="p">)</span>
    <span class="n">total_vogais</span> <span class="o">+=</span> <span class="mi">1</span>
  <span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>

<ul>
  <li><code class="language-plaintext highlighter-rouge">frase_minuscula.each_char do |char|</code>: Para cada caractere da frase, coloque-o na variável temporária <code class="language-plaintext highlighter-rouge">char</code>.</li>
  <li><code class="language-plaintext highlighter-rouge">if vogais.include?(char)</code>: Pergunta “A letra que está em <code class="language-plaintext highlighter-rouge">char</code> faz parte da minha lista de <code class="language-plaintext highlighter-rouge">vogais</code>?”.</li>
  <li>Se sim, adicionamos 1 ao <code class="language-plaintext highlighter-rouge">total_vogais</code>.</li>
</ul>

<p>O programa completo fica assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">vogais</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"a"</span><span class="p">,</span> <span class="s2">"e"</span><span class="p">,</span> <span class="s2">"i"</span><span class="p">,</span> <span class="s2">"o"</span><span class="p">,</span> <span class="s2">"u"</span><span class="p">]</span>

<span class="nb">puts</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">Programa contador de vogais.</span><span class="se">\n\n</span><span class="s2">"</span>
<span class="nb">print</span> <span class="s2">"Digite uma frase: "</span>
<span class="n">frase_digitada</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span>

<span class="c1"># Substituindo letras acentuadas por suas equivalentes sem acento</span>
<span class="n">sem_acentos</span> <span class="o">=</span> <span class="n">frase_digitada</span><span class="p">.</span><span class="nf">tr</span><span class="p">(</span>
  <span class="s2">"áàãâäéèêëíìîïóòõôöúùûüçÁÀÃÂÄÉÈÊËÍÌÎÏÓÒÕÔÖÚÙÛÜÇ"</span><span class="p">,</span>
  <span class="s2">"aaaaaeeeeiiiiooooouuuucAAAAAEEEEIIIIOOOOOUUUUC"</span>
<span class="p">)</span>

<span class="n">frase_minuscula</span> <span class="o">=</span> <span class="n">sem_acentos</span><span class="p">.</span><span class="nf">downcase</span>

<span class="n">total_vogais</span> <span class="o">=</span> <span class="mi">0</span>

<span class="n">frase_minuscula</span><span class="p">.</span><span class="nf">each_char</span> <span class="k">do</span> <span class="o">|</span><span class="n">char</span><span class="o">|</span>
  <span class="k">if</span> <span class="n">vogais</span><span class="p">.</span><span class="nf">include?</span><span class="p">(</span><span class="n">char</span><span class="p">)</span>
    <span class="n">total_vogais</span> <span class="o">+=</span> <span class="mi">1</span>
  <span class="k">end</span>
<span class="k">end</span>

<span class="nb">puts</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">A frase '</span><span class="si">#{</span><span class="n">frase_digitada</span><span class="si">}</span><span class="s2">' possui </span><span class="si">#{</span><span class="n">total_vogais</span><span class="si">}</span><span class="s2"> vogais.</span><span class="se">\n\n</span><span class="s2">"</span>
</code></pre></div></div>

<h3 id="programa-que-verifica-se-um-número-é-primo">Programa que verifica se um número é primo</h3>
<hr />

<p>O programa deve receber um número e identificar se ele é primo ou não, informando o resultado à pessoa.</p>

<p>Um <strong>número primo</strong> é aquele que só aceita ser dividido por 1 e por ele mesmo (exemplos: 2, 3, 5, 7, 11…). Se o número aceitar ser dividido por qualquer outro valor, ele não é primo.</p>

<h4 id="como-fazer-5">Como fazer?</h4>

<p>A lógica que vamos usar é a seguinte: usa uma estratégia chamada “bandeira” (flag). Vamos assumir inicialmente que o número é primo (bandeira levantada/true) e tentar provar o contrário. Se encontrarmos qualquer número que consiga dividir o número digitado pela pessoa, baixamos a bandeira (false) e paramos de procurar, pois já conseguiremos provar que o número não é primo.</p>

<p>Primeiro, recebemos o número:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numero</span> <span class="o">=</span> <span class="mi">0</span>
<span class="nb">puts</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">Programa que verifica se um número é primo.</span><span class="se">\n\n</span><span class="s2">"</span>
<span class="nb">print</span> <span class="s2">"Digite um número inteiro positivo (exemplo: 7): "</span>
<span class="n">numero</span> <span class="o">=</span> <span class="no">Integer</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="n">primo</span> <span class="o">=</span> <span class="kp">true</span> <span class="c1"># Começamos acreditando que é primo</span>
</code></pre></div></div>

<p>Agora vamos às regras de validação:</p>

<ol>
  <li><strong>Números menores que 2</strong>: Na matemática, 0, 1 e números negativos não são primos. Se o número for menor que 2, já definimos <code class="language-plaintext highlighter-rouge">primo = false</code>.</li>
  <li><strong>Números a partir de 2</strong>: Precisamos testar. Vamos criar um laço que vai do número 2 até o número imediatamente anterior ao digitado (<code class="language-plaintext highlighter-rouge">numero - 1</code>).
    <ul>
      <li><em>Por que começar do 2?</em> Porque todo número divide por 1, então testar o 1 é inútil.</li>
      <li><em>Por que parar no anterior?</em> Porque todo número divide por ele mesmo. Queremos saber se existe algum “intruso” no meio do caminho que consiga dividir.</li>
    </ul>
  </li>
</ol>

<p>O código de verificação será:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="n">numero</span> <span class="o">&lt;</span> <span class="mi">2</span>
  <span class="n">primo</span> <span class="o">=</span> <span class="kp">false</span>
<span class="k">else</span>
  <span class="c1"># Testamos do 2 até o número anterior</span>
  <span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="mi">2</span><span class="o">..</span><span class="p">(</span><span class="n">numero</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">numero</span> <span class="o">%</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">0</span>
      <span class="n">primo</span> <span class="o">=</span> <span class="kp">false</span>
      <span class="k">break</span> <span class="c1"># Para o laço imediatamente, já sabemos que não é primo</span>
    <span class="k">end</span>
  <span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Note o uso do <code class="language-plaintext highlighter-rouge">break</code>: ele funciona como um botão de emergência. Se descobrimos que 10 divide por 2, não precisamos testar se divide por 3, 4 ou 5. Já sabemos que não é primo, então paramos para economizar processamento.</p>

<p>Por fim, exibimos o resultado baseados no estado da nossa variável <code class="language-plaintext highlighter-rouge">primo</code>.</p>

<p>O programa completo fica assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numero</span> <span class="o">=</span> <span class="mi">0</span>

<span class="nb">puts</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">Programa que verifica se um número é primo.</span><span class="se">\n\n</span><span class="s2">"</span>
<span class="nb">print</span> <span class="s2">"Digite um número inteiro positivo (exemplo: 7): "</span>
<span class="n">numero</span> <span class="o">=</span> <span class="no">Integer</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="n">primo</span> <span class="o">=</span> <span class="kp">true</span>

<span class="c1"># Números menores que 2 não são primos</span>
<span class="k">if</span> <span class="n">numero</span> <span class="o">&lt;</span> <span class="mi">2</span>
  <span class="n">primo</span> <span class="o">=</span> <span class="kp">false</span>
<span class="k">else</span>
  <span class="c1"># Caso contrário, vamos testar do 2 até o número anterior ao escolhido</span>
  <span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="mi">2</span><span class="o">..</span><span class="p">(</span><span class="n">numero</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">numero</span> <span class="o">%</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">0</span>
      <span class="n">primo</span> <span class="o">=</span> <span class="kp">false</span>
      <span class="k">break</span> <span class="c1"># Para o laço porque já sabemos que não é primo</span>
    <span class="k">end</span>
  <span class="k">end</span>
<span class="k">end</span>

<span class="c1"># Mostrando o resultado</span>
<span class="k">if</span> <span class="n">primo</span>
  <span class="nb">puts</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">O número </span><span class="si">#{</span><span class="n">numero</span><span class="si">}</span><span class="s2"> é primo!</span><span class="se">\n\n</span><span class="s2">"</span>
<span class="k">else</span>
  <span class="nb">puts</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">O número </span><span class="si">#{</span><span class="n">numero</span><span class="si">}</span><span class="s2"> não é primo!</span><span class="se">\n\n</span><span class="s2">"</span>
<span class="k">end</span>
</code></pre></div></div>

<h3 id="programa-que-soma-n-números">Programa que soma N números</h3>
<hr />

<p>O programa deve perguntar quantos números a pessoa deseja somar, depois pedir quais são os números e fazer a soma. No final deve exibir o valor total da soma.</p>

<h4 id="como-fazer-6">Como fazer?</h4>

<p>Vamos usar um <strong>acumulador</strong> (uma variável que começa em zero e guarda o total de números que a pessoa quer somar). Também vamos usar um <strong>loop</strong> (laço de repetição) que roda a quantidade de vezes que a pessoa definiu quando disse quantos números queria somar.</p>

<p>Exemplo: se a pessoa disser que quer somar 10 números o programa deve executar o laço de repetição 10 vezes.</p>

<p>Vamos começar declarando as variáveis. Isso é obrigatório no Ruby? Não, mas no estudo de lógica de programação isso ajuda a ir organizando o raciocínio.</p>

<p>Precisamos de:</p>

<ul>
  <li>Uma variável para guardar <strong>quantos</strong> números vamos somar. Vamos iniciar ela com valor 0.</li>
  <li>Uma variável <code class="language-plaintext highlighter-rouge">Float</code> para registrar a soma dos números.</li>
  <li>Um <code class="language-plaintext highlighter-rouge">array</code> para guardar os números digitados</li>
  <li>Uma variável temporária para guardar o que a pessoa digitar no teclado.</li>
  <li>Uma variável temporária para guardar o número convertido para <code class="language-plaintext highlighter-rouge">Float</code>.</li>
</ul>

<p>A declaração das variáveis fica assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Vamos definir as variáveis "gavetas" que o programa vai precisar</span>
<span class="c1"># Vamos iniciar as variáveis com valores padrão (0, 0.0 e nil) para evitar erros</span>

<span class="n">quantidade_numeros</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># Vai guardar quantos números a pessoa  quer somar</span>
<span class="n">soma</span> <span class="o">=</span> <span class="mf">0.0</span>              <span class="c1"># Vai guardar a soma dos números</span>
<span class="n">numeros_digitados</span> <span class="o">=</span> <span class="p">[]</span> <span class="c1"># Vai guardar os números digitados pela pessoa</span>
<span class="n">entrada_digitada</span> <span class="o">=</span> <span class="kp">nil</span> <span class="c1"># Vai guardar o que a pessoa digitou no teclado</span>
<span class="n">numero_convertido</span> <span class="o">=</span> <span class="mf">0.0</span> <span class="c1"># Vai guardar o número convertido para float</span>
</code></pre></div></div>

<p>Depois podemos usar um puts para apresentar o programa.</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">puts</span> <span class="s2">"Programa que soma N números definidos por você."</span>
</code></pre></div></div>

<p>Agora precisamos fazer duas coisas:</p>

<ul>
  <li>Descobrir quantos números a pessoa quer somar</li>
  <li>Validar o que foi digitado pela pessoa</li>
</ul>

<p>Queremos que a pessoa informe nesse primeiro momento quantos números ela quer somar, então:</p>

<ul>
  <li>A quantidade de números a serem somados é um valor inteiro, pois não se pode somar 1,5 ou 3,4 números. Podemos somar 2 números, 3, 4, 5 e assim por diante.</li>
  <li>Quando fazemos a pergunta “quantos números você deseja somar?” não podemos aceitar valores como -5, -2 ou 0. Não temos como somar um número negativo de vezes e também não temos como somar 0 vezes, isso é o mesmo que não somar.</li>
  <li>Também não podemos aceitar o número 1. Somar um número vai dar ele mesmo, se perguntamos a pessoa quantos números ela quer somar e ela responder 1 vamos somar esse número com o quê? Com nada, então a resposta será esse próprio número. Não tem motivo para essa operação ser feita, então devemos impedir essa entrada.</li>
  <li>O valor mínimo para a quantidade de números que podem ser somados tem que ser 2, pois para fazer uma soma precisamos de pelo menos dois números.</li>
  <li>Além disso, devemos verificar se a pessoa digitou números mesmo e caso tenha digitado letras ou outros símbolos devemos impedir o avanço do programa até ela digitar um número válido.</li>
</ul>

<p>Como vamos fazer isso? Vamos usar uma estratégia de forma que o programa não aceita avançar até que a pessoa coloque um número válido.</p>

<p>Vamos criar um ciclo infinito, de forma que o único jeito de sair dele é encontrar o comando <code class="language-plaintext highlighter-rouge">break</code>.</p>

<p>Dentro desse ciclo infinito vamos usar <strong><code class="language-plaintext highlighter-rouge">gets.chomp</code></strong> para o programa pausar e esperar a pessoa digitar. O <code class="language-plaintext highlighter-rouge">.chomp</code> é essencial para limpar o caractere <code class="language-plaintext highlighter-rouge">Enter</code> (nova linha) que vem junto com a digitação.</p>

<p>Para implementar essa estratégia de “não deixar passar até acertar”, vamos usar o bloco de tratamento de erros do Ruby. Pense nele como uma rede de segurança: nós <em>tentamos</em> (<code class="language-plaintext highlighter-rouge">begin</code>) converter o que a pessoa digitou para um número inteiro. Se a pessoa tiver digitado letras (como “dez” ou “abc”), o Ruby vai gerar um erro chamado <code class="language-plaintext highlighter-rouge">ArgumentError</code>. Em vez de o programa travar e fechar na cara da pessoa, nós <em>resgatamos</em> (<code class="language-plaintext highlighter-rouge">rescue</code>) esse erro e mostramos uma mensagem amigável.</p>

<p>O código para essa parte fica assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kp">loop</span> <span class="k">do</span>
  <span class="nb">print</span> <span class="s2">"Quantos números você quer somar? "</span>
  <span class="k">begin</span>
    <span class="n">entrada_digitada</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span>
    <span class="c1"># Tentamos converter o texto para um Inteiro estrito.</span>
    <span class="c1"># Se tiver letras, o comando Integer() grita um erro!</span>
    <span class="n">quantidade_numeros</span> <span class="o">=</span> <span class="no">Integer</span><span class="p">(</span><span class="n">entrada_digitada</span><span class="p">)</span>

    <span class="c1"># Se a conversão funcionou, o código chega aqui.</span>
    <span class="c1"># Agora verificamos a regra de negócio: precisa ser pelo menos 2.</span>
    <span class="k">if</span> <span class="n">quantidade_numeros</span> <span class="o">&lt;</span> <span class="mi">2</span>
      <span class="nb">puts</span> <span class="s2">"A quantidade de números deve ser pelo menos 2. Tente novamente."</span>
    <span class="k">else</span>
      <span class="c1"># Se passou na conversão E passou na verificação de valor,</span>
      <span class="c1"># podemos quebrar o ciclo infinito e avançar.</span>
      <span class="k">break</span>
    <span class="k">end</span>
  <span class="k">rescue</span> <span class="no">ArgumentError</span>
    <span class="c1"># Se o Integer() falhou lá em cima, o código pula direto para cá.</span>
    <span class="nb">puts</span> <span class="s2">"Entrada inválida. Por favor, digite um número inteiro positivo (ex: 3)."</span>
  <span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Neste ponto, já garantimos que a variável <code class="language-plaintext highlighter-rouge">quantidade_numeros</code> tem um valor válido (por exemplo, 3). Agora precisamos pedir os números propriamente ditos que a pessoa quer somar.</p>

<p>Para isso, não vamos usar um <code class="language-plaintext highlighter-rouge">while</code> manual. O Ruby tem um jeito muito elegante de dizer “faça isso X vezes”: o método <code class="language-plaintext highlighter-rouge">.times</code>. Como a nossa variável <code class="language-plaintext highlighter-rouge">quantidade_numeros</code> é um número inteiro, ela “sabe” como repetir algo.</p>

<p>Dentro dessa repetição, precisaremos de <strong>outro ciclo de validação</strong>. Por que? Imagine que a pessoa disse que quer somar 5 números. Ela digita o primeiro, o segundo… e no terceiro ela digita “banana” sem querer. Não queremos que o programa volte lá para o início, queremos apenas que ele insista: “Ei, digite o 3º número corretamente”.</p>

<p>Além disso, para os números da soma, vamos aceitar números quebrados (com ponto), então usaremos <code class="language-plaintext highlighter-rouge">Float()</code> em vez de <code class="language-plaintext highlighter-rouge">Integer()</code> na conversão. E não esqueça: precisamos guardar cada número válido no nosso array <code class="language-plaintext highlighter-rouge">numeros_digitados</code> e somá-lo na variável <code class="language-plaintext highlighter-rouge">soma</code>.</p>

<p>Veja como fica essa lógica traduzida para código:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">puts</span> <span class="s2">"Você quer somar </span><span class="si">#{</span><span class="n">quantidade_numeros</span><span class="si">}</span><span class="s2"> números."</span>

<span class="c1"># O |i| é o contador automático. Ele começa valendo 0.</span>
<span class="n">quantidade_numeros</span><span class="p">.</span><span class="nf">times</span> <span class="k">do</span> <span class="o">|</span><span class="n">i</span><span class="o">|</span>
  <span class="kp">loop</span> <span class="k">do</span>
    <span class="c1"># Usamos (i + 1) para mostrar "1º número" em vez de "0º número"</span>
    <span class="nb">print</span> <span class="s2">"Digite o </span><span class="si">#{</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="si">}</span><span class="s2">º número para somar: "</span>
    <span class="k">begin</span>
      <span class="n">entrada_digitada</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span>
      
      <span class="c1"># Convertendo para Float para aceitar decimais (ex: 10.5)</span>
      <span class="n">numero_convertido</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="n">entrada_digitada</span><span class="p">)</span>
      
      <span class="c1"># Se chegou aqui, o número é válido! Vamos guardar nas gavetas.</span>
      
      <span class="c1"># 1. Guarda na lista para mostrar no final</span>
      <span class="n">numeros_digitados</span> <span class="o">&lt;&lt;</span> <span class="n">numero_convertido</span> 
      
      <span class="c1"># 2. Acumula no valor total</span>
      <span class="n">soma</span> <span class="o">+=</span> <span class="n">numero_convertido</span> 
      
      <span class="c1"># Pronto, pegamos esse número. Podemos sair do loop de validação</span>
      <span class="c1"># e deixar o.times ir para a próxima repetição.</span>
      <span class="k">break</span> 
    <span class="k">rescue</span> <span class="no">ArgumentError</span>
      <span class="nb">puts</span> <span class="s2">"Entrada inválida. Digite um número válido (ex: 10, 4.5, -2)."</span>
    <span class="k">end</span>
  <span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Agora que o laço <code class="language-plaintext highlighter-rouge">.times</code> terminou, significa que todos os números foram pedidos, validados, guardados e somados. As nossas variáveis estão cheias com as informações corretas.</p>

<p>A última etapa é apenas exibir o resultado.
Para mostrar a lista de números que a pessoa digitou, o nosso array <code class="language-plaintext highlighter-rouge">numeros_digitados</code> precisa virar um texto bonito. O método <code class="language-plaintext highlighter-rouge">.join("\n")</code> faz exatamente isso: ele pega cada item da lista e cola um no outro usando uma “nova linha” (<code class="language-plaintext highlighter-rouge">\n</code>) como cola.</p>

<p>E para mostrar a soma, usamos a interpolação <code class="language-plaintext highlighter-rouge">#{soma}</code> dentro da string, o que evita termos que ficar convertendo tipos manualmente.</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Mostrando o resultado final</span>

<span class="nb">puts</span> <span class="s2">"Você digitou </span><span class="si">#{</span><span class="n">quantidade_numeros</span><span class="si">}</span><span class="s2"> números. São eles:</span><span class="se">\n</span><span class="si">#{</span><span class="n">numeros_digitados</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span><span class="si">}</span><span class="s2">."</span>
<span class="nb">puts</span> <span class="s2">"A soma dos números que você digitou é: </span><span class="si">#{</span><span class="n">soma</span><span class="si">}</span><span class="s2">."</span>
<span class="nb">puts</span> <span class="s2">"Obrigado por usar o programa de soma!"</span>
</code></pre></div></div>

<p>O código completo do programa fica assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Vamos definir as variáveis "gavetas" que o programa vai precisar</span>
<span class="c1"># Vamos iniciar as variáveis com valores padrão (0, 0.0 e nil) para evitar erros</span>

<span class="n">quantidade_numeros</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># Vai guardar quantos números a pessoa  quer somar</span>
<span class="n">soma</span> <span class="o">=</span> <span class="mf">0.0</span>              <span class="c1"># Vai guardar a soma dos números</span>
<span class="n">numeros_digitados</span> <span class="o">=</span> <span class="p">[]</span> <span class="c1"># Vai guardar os números digitados pela pessoa</span>
<span class="n">entrada_digitada</span> <span class="o">=</span> <span class="kp">nil</span> <span class="c1"># Vai guardar o que a pessoa digitou no teclado</span>
<span class="n">numero_convertido</span> <span class="o">=</span> <span class="mf">0.0</span> <span class="c1"># Vai guardar o número convertido para float</span>

<span class="nb">puts</span> <span class="s2">"Programa que soma N números definidos por você."</span>

<span class="c1"># Descobrindo quantos números a pessoa quer somar</span>

<span class="kp">loop</span> <span class="k">do</span>
  <span class="nb">print</span> <span class="s2">"Quantos números você quer somar? "</span>
  <span class="k">begin</span>
    <span class="n">entrada_digitada</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span>
    <span class="n">quantidade_numeros</span> <span class="o">=</span> <span class="no">Integer</span><span class="p">(</span><span class="n">entrada_digitada</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">quantidade_numeros</span> <span class="o">&lt;</span> <span class="mi">2</span>
      <span class="nb">puts</span> <span class="s2">"A quantidade de números a serem somados deve ser pelo menos 2 e devem ser números inteiros positivos, por exemplo: 3. Tente novamente."</span>
    <span class="k">else</span>
      <span class="k">break</span>
    <span class="k">end</span>
  <span class="k">rescue</span> <span class="no">ArgumentError</span>
    <span class="nb">puts</span> <span class="s2">"Entrada inválida. Por favor, digite um número inteiro positivo. Exemplo: 3"</span>
  <span class="k">end</span>
<span class="k">end</span>

<span class="c1"># Pedindo os números para a pessoa e somando</span>

<span class="nb">puts</span> <span class="s2">"Você quer somar </span><span class="si">#{</span><span class="n">quantidade_numeros</span><span class="si">}</span><span class="s2"> números."</span>

<span class="n">quantidade_numeros</span><span class="p">.</span><span class="nf">times</span> <span class="k">do</span> <span class="o">|</span><span class="n">i</span><span class="o">|</span>
  <span class="kp">loop</span> <span class="k">do</span>
    <span class="nb">print</span> <span class="s2">"Digite o </span><span class="si">#{</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="si">}</span><span class="s2">º número para somar: "</span>
    <span class="k">begin</span>
      <span class="n">entrada_digitada</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span>
      <span class="n">numero_convertido</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="n">entrada_digitada</span><span class="p">)</span>
      <span class="n">numeros_digitados</span> <span class="o">&lt;&lt;</span> <span class="n">numero_convertido</span>
      <span class="n">soma</span> <span class="o">+=</span> <span class="n">numero_convertido</span>
      <span class="k">break</span>
    <span class="k">rescue</span> <span class="no">ArgumentError</span>
      <span class="nb">puts</span> <span class="s2">"Entrada inválida. Por favor, digite um número válido. Exemplos: 10, 4.5, -3.2, 200"</span>
    <span class="k">end</span>
  <span class="k">end</span>
<span class="k">end</span>

<span class="c1"># Mostrando o resultado final para a pessoa</span>

<span class="nb">puts</span> <span class="s2">"Você digitou </span><span class="si">#{</span><span class="n">quantidade_numeros</span><span class="si">}</span><span class="s2"> números. São eles:</span><span class="se">\n</span><span class="si">#{</span><span class="n">numeros_digitados</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span><span class="si">}</span><span class="s2">."</span>
<span class="nb">puts</span> <span class="s2">"A soma dos números que você digitou é: </span><span class="si">#{</span><span class="n">soma</span><span class="si">}</span><span class="s2">."</span>
<span class="nb">puts</span> <span class="s2">"Obrigado por usar o programa de soma!"</span>
</code></pre></div></div>

<h3 id="programa-que-exibe-a-sequência-de-fibonacci">Programa que exibe a sequência de Fibonacci</h3>
<hr />

<p>O objetivo deste programa é gerar a <strong>Sequência de Fibonacci</strong> e exibir a quantidade de termos da sequência que a pessoa digitar. Ou seja, se a pessoa disser que quer visualizar 10 termos o programa deve mostrar os 10 primeiros números da sequência de Fibonacci.</p>

<p>Na matemática, essa sequência começa geralmente com 0 e 1, e cada número seguinte é a soma dos dois anteriores.</p>

<p>Exemplo da sequência: 0, 1, 1, 2, 3, 5, 8…</p>

<p>Porque:</p>

<ul>
  <li>0 + 1 = 1,</li>
  <li>1 + 1 = 2,</li>
  <li>1 + 2 = 3,</li>
  <li>3 + 2 = 5</li>
  <li>5 + 3 = 8.</li>
</ul>

<p>E assim por diante.</p>

<h4 id="como-fazer-7">Como fazer?</h4>

<p>Vamos dividir o problema em três partes:</p>

<ul>
  <li>Parte 1: Preparação e Validação da Entrada</li>
  <li>Parte 2: Configuração das Variáveis da Sequência</li>
  <li>Parte 3: Cálculo e Exibição da sequência</li>
</ul>

<p>Vamos começar a etapa 1 de preparação e validação da entrada criando a variável <code class="language-plaintext highlighter-rouge">quantidade_de_termos</code> e atribuindo a ela o valor <code class="language-plaintext highlighter-rouge">nil</code> (nulo/vazio). Isso será feito porque precisamos que ela exista e esteja vazia para que a condição do <code class="language-plaintext highlighter-rouge">while</code> (que vamos criar depois) seja verdadeira na primeira vez que o programa rodar.</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">quantidade_de_termos</span> <span class="o">=</span> <span class="kp">nil</span>
</code></pre></div></div>

<p>Agora vamos mostrar a pessoa o título do programa:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">puts</span> <span class="s2">"Programa para exibir a sequência de Fibonacci"</span>
</code></pre></div></div>

<p>Agora o que vamos fazer é criar um laço de repetição que só para quando a pessoa digitar um número válido. Se ela digitar algo errado, a variável continua <code class="language-plaintext highlighter-rouge">nil</code> e o loop se repete.</p>

<p>Vamos usar o <code class="language-plaintext highlighter-rouge">while</code> que significa “enquanto”, pois queremos que enquanto a quantidade de termos (números) que a pessoa deseja visualizar for nula, o programa faça alguma coisa.</p>

<p>O <code class="language-plaintext highlighter-rouge">while</code> vai começar perguntando: a quantidade de termos é nula?</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">while</span> <span class="n">quantidade_de_termos</span><span class="p">.</span><span class="nf">nil?</span>
</code></pre></div></div>

<p>Dentro do while vamos incluir:</p>

<ul>
  <li><strong><code class="language-plaintext highlighter-rouge">print</code>:</strong> Para mostrar a pergunta na tela sem pular linha, assim a resposta vai ser digitada ao lado da pergunta.</li>
  <li><code class="language-plaintext highlighter-rouge">quantidade_de_termos =</code>: É a variável que vai receber o número que a pessoa digitar.</li>
  <li><strong><code class="language-plaintext highlighter-rouge">Integer(...)</code>:</strong> Para transformar o texto digitado em um Número Inteiro antes de armazenar na variável.</li>
  <li><strong><code class="language-plaintext highlighter-rouge">gets.chomp</code>:</strong> Para pegar o que a pessoa digitou e remover o “Enter” final.</li>
  <li><strong><code class="language-plaintext highlighter-rouge">rescue nil</code>:</strong> Se o <code class="language-plaintext highlighter-rouge">Integer</code> falhar (porque a pessoa digitou texto ao invés de números como “dez” ou “abc”), o comando normalmente daria erro e fecharia o programa. O <code class="language-plaintext highlighter-rouge">rescue nil</code> age nesse momento e se der erro, ele captura o erro e no lugar de fechar o programa ele devolve <code class="language-plaintext highlighter-rouge">nil</code> para ser colocado na variável.</li>
</ul>

<p>Então a variável <code class="language-plaintext highlighter-rouge">quantidade_de_termos</code> deve receber o que a pessoa digitar (através do <strong><code class="language-plaintext highlighter-rouge">gets.chomp</code>),</strong> esse conteúdo digitado deve ser convertido para um número inteiro antes de ser passado para a variável (pelo <strong><code class="language-plaintext highlighter-rouge">Integer(...)</code></strong>) e se o <strong><code class="language-plaintext highlighter-rouge">Integer(...)</code></strong>  não conseguir converter o conteúdo digitado para inteiro o <code class="language-plaintext highlighter-rouge">rescue</code> vai passar o valor <code class="language-plaintext highlighter-rouge">nil</code> para a variável ao invés de só dar erro e encerrar o programa.</p>

<p>O código ficará assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">print</span> <span class="s2">"Quantos números da sequência de Fibonacci você deseja ver? "</span>
<span class="n">quantidade_de_termos</span> <span class="o">=</span> <span class="no">Integer</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span> <span class="k">rescue</span> <span class="kp">nil</span>
</code></pre></div></div>

<p>Depois disso, vamos adicionar um <code class="language-plaintext highlighter-rouge">if</code> para avaliar se a conversão falhou (e virou <code class="language-plaintext highlighter-rouge">nil</code>), se sim avisamos para a pessoa.</p>

<p>Para encerrar essa parte colocamos um <code class="language-plaintext highlighter-rouge">end</code> para fechar o <code class="language-plaintext highlighter-rouge">while</code>. Se a pessoa digitou um número correto, <code class="language-plaintext highlighter-rouge">quantidade_de_termos</code> passa a ter um valor válido (exemplo: 5), o <code class="language-plaintext highlighter-rouge">while</code> percebe que não é mais <code class="language-plaintext highlighter-rouge">nil</code> e libera o programa para seguir em frente.</p>

<p>O código fica assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="k">if</span> <span class="n">quantidade_de_termos</span><span class="p">.</span><span class="nf">nil?</span>
    <span class="nb">puts</span> <span class="s2">"Erro: Por favor, digite um número inteiro válido."</span>
  <span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Agora vamos configurar as variáveis que serão usadas para calcular a sequência de Fibonacci propriamente dita.</p>

<p>Vamos usar:</p>

<ul>
  <li><strong><code class="language-plaintext highlighter-rouge">termo_anterior = 0</code></strong></li>
  <li><strong><code class="language-plaintext highlighter-rouge">termo_atual = 1</code></strong></li>
  <li><strong><code class="language-plaintext highlighter-rouge">i = 1</code></strong></li>
</ul>

<p>Mas, por que esses valores de inicialização para as variáveis?</p>

<p>A Sequência de Fibonacci funciona com uma regra simples: <strong>o próximo número é a soma dos dois anteriores.</strong> Para a matemática começar a funcionar, você precisa de dois números “semente” (o pontapé inicial). A sequência clássica começa assim:
<code class="language-plaintext highlighter-rouge">0, 1, 1, 2, 3...</code></p>

<p>Se olharmos para as variáveis antes do laço de repetição começar:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">termo_anterior = 0</code> Representa o <strong>primeiro</strong> número da sequência.</li>
  <li><code class="language-plaintext highlighter-rouge">termo_atual = 1</code> Representa o <strong>segundo</strong> número da sequência.</li>
</ul>

<p><strong>O que aconteceria se <code class="language-plaintext highlighter-rouge">termo_atual</code> fosse 0?</strong>
O cálculo seria:
<code class="language-plaintext highlighter-rouge">0 (anterior) + 0 (atual) = 0 (próximo)</code>
O programa ficaria preso em zeros eternamente (0, 0, 0, 0…), porque 0 + 0 nunca vai dar outro resultado. Precisamos desse <code class="language-plaintext highlighter-rouge">1</code> para fazer a soma começar a crescer.</p>

<p>Já a variável <code class="language-plaintext highlighter-rouge">i</code> é o nosso <strong>contador, ela vai</strong> controlar quantas vezes vamos repetir o código.</p>

<p>Imagine que a pessoa pediu para ver <strong>3 termos</strong> (<code class="language-plaintext highlighter-rouge">quantidade_de_termos = 3</code>).</p>

<p>A condição do nosso <code class="language-plaintext highlighter-rouge">while</code> é:
<code class="language-plaintext highlighter-rouge">enquanto i &lt;= quantidade_de_termos</code></p>

<p>Então para atender essa condição qual valor precisamos inicializar i? Vamos testar…</p>

<ul>
  <li>Se a gente iniciar <code class="language-plaintext highlighter-rouge">i = 0</code> então:</li>
</ul>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="no">Volta</span> <span class="mi">1</span> <span class="k">do</span> <span class="n">laço</span> <span class="n">de</span> <span class="ss">repetição: </span><span class="n">i</span> <span class="n">vale</span> <span class="mi">0</span><span class="o">.</span> <span class="p">(</span><span class="mi">0</span> <span class="o">&lt;=</span> <span class="mi">3</span><span class="p">?</span> <span class="no">Sim</span><span class="p">)</span><span class="o">.</span>

<span class="no">Volta</span> <span class="mi">2</span> <span class="k">do</span> <span class="n">laço</span> <span class="n">de</span> <span class="ss">repetição: </span><span class="n">i</span> <span class="n">vale</span> <span class="mi">1</span><span class="o">.</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;=</span> <span class="mi">3</span><span class="p">?</span> <span class="no">Sim</span><span class="p">)</span><span class="o">.</span>

<span class="no">Volta</span> <span class="mi">3</span> <span class="k">do</span> <span class="n">laço</span> <span class="n">de</span> <span class="ss">repetição: </span><span class="n">i</span> <span class="n">vale</span> <span class="mi">2</span><span class="o">.</span> <span class="p">(</span><span class="mi">2</span> <span class="o">&lt;=</span> <span class="mi">3</span><span class="p">?</span> <span class="no">Sim</span><span class="p">)</span><span class="o">.</span>

<span class="no">Volta</span> <span class="mi">4</span> <span class="k">do</span> <span class="n">laço</span> <span class="n">de</span> <span class="ss">repetição: </span><span class="n">i</span> <span class="n">vale</span> <span class="mi">3</span><span class="o">.</span> <span class="p">(</span><span class="mi">3</span> <span class="o">&lt;=</span> <span class="mi">3</span><span class="p">?</span> <span class="no">Sim</span><span class="p">)</span><span class="o">.</span>
</code></pre></div></div>

<p><strong>Resultado:</strong> Mostrou 4 vezes, isso estaria errado, porque deveria exibir três vezes conforme o solicitado pela pessoa. Aqui teria mostrado um número a mais do que a pessoa pediu.</p>

<ul>
  <li>Se a gente iniciar <code class="language-plaintext highlighter-rouge">i = 1</code> então:</li>
</ul>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="no">Volta</span> <span class="mi">1</span> <span class="k">do</span> <span class="n">laço</span> <span class="n">de</span> <span class="ss">repetição: </span><span class="n">i</span> <span class="n">vale</span> <span class="mi">1</span><span class="o">.</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;=</span> <span class="mi">3</span><span class="p">?</span> <span class="no">Sim</span><span class="o">.</span> <span class="no">Mostra</span> <span class="n">o</span> <span class="mi">1</span><span class="n">º</span> <span class="n">termo</span><span class="p">)</span><span class="o">.</span>

<span class="no">Volta</span> <span class="mi">2</span> <span class="k">do</span> <span class="n">laço</span> <span class="n">de</span> <span class="ss">repetição: </span><span class="n">i</span> <span class="n">vale</span> <span class="mi">2</span><span class="o">.</span> <span class="p">(</span><span class="mi">2</span> <span class="o">&lt;=</span> <span class="mi">3</span><span class="p">?</span> <span class="no">Sim</span><span class="o">.</span> <span class="no">Mostra</span> <span class="n">o</span> <span class="mi">2</span><span class="n">º</span> <span class="n">termo</span><span class="p">)</span><span class="o">.</span>

<span class="no">Volta</span> <span class="mi">3</span> <span class="k">do</span> <span class="n">laço</span> <span class="n">de</span> <span class="ss">repetição: </span><span class="n">i</span> <span class="n">vale</span> <span class="mi">3</span><span class="o">.</span> <span class="p">(</span><span class="mi">3</span> <span class="o">&lt;=</span> <span class="mi">3</span><span class="p">?</span> <span class="no">Sim</span><span class="o">.</span> <span class="no">Mostra</span> <span class="n">o</span> <span class="mi">3</span><span class="n">º</span> <span class="n">termo</span><span class="p">)</span><span class="o">.</span>

<span class="no">Volta</span> <span class="mi">4</span> <span class="k">do</span> <span class="n">laço</span> <span class="n">de</span> <span class="ss">repetição: </span><span class="n">i</span> <span class="n">vale</span> <span class="mi">4</span><span class="o">.</span> <span class="p">(</span><span class="mi">4</span> <span class="o">&lt;=</span> <span class="mi">3</span><span class="p">?</span> <span class="no">Não</span><span class="o">.</span> <span class="no">Para</span> <span class="n">de</span> <span class="n">mostrar</span><span class="p">)</span><span class="o">.</span>
</code></pre></div></div>

<p><strong>Resultado:</strong> Mostrou 3 vezes. <strong>Correto, é o número de termos que a pessoa pediu para ver.</strong></p>

<p>Por isso, precisamos iniciar o i com 1.</p>

<p>Depois de inicializar as variáveis do cálculo, vamos mostrar um cabeçalho bonito, pulando uma linha (<code class="language-plaintext highlighter-rouge">\n</code>) antes de mostrar a sequência Fibonacci.</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">termo_anterior</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">termo_atual</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">i</span> <span class="o">=</span> <span class="mi">1</span> <span class="c1"># Variável de controle para contar os termos exibidos</span>

<span class="nb">puts</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">Sequência de Fibonacci (Exibindo </span><span class="si">#{</span><span class="n">quantidade_de_termos</span><span class="si">}</span><span class="s2"> termos):"</span>
</code></pre></div></div>

<p>Agora vamos calcular a sequência enquanto o contador <code class="language-plaintext highlighter-rouge">i</code> for menor ou igual ao número que a pessoa pediu. Exemplo: Se a pessoa pediu 5 termos, o laço vai rodar quando <code class="language-plaintext highlighter-rouge">i</code> for 1, 2, 3, 4 e 5. Quando <code class="language-plaintext highlighter-rouge">i</code> for 6, ele para.</p>

<p>Precisamos ter bastante atenção neste cálculo, pois devido ao fato de fazermos a passagem dos valores por mais de uma variável pode ficar um pouco confuso.</p>

<p>Vamos lá…</p>

<p>Além das variáveis:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">termo_anterior</code>, que inicializamos com 0, que servirá para guardar o número anterior da sequência.</li>
  <li><code class="language-plaintext highlighter-rouge">termo_atual</code>, que inicializamos com 1, que servirá para guardar o número atual da sequência.</li>
  <li><code class="language-plaintext highlighter-rouge">i</code>, que inicializamos com 1, que será o contador que garante que o laço de repetição não seja executado infinitamente.</li>
</ul>

<p>Também vamos precisar da variável:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">proximo_termo</code>, que vamos usar para calcular o próximo número (que será a soma dos dois anteriores).</li>
</ul>

<p>Com essas variáveis o passo a passo do laço de repetição será:</p>

<ol>
  <li>Mostrar o número que está em <code class="language-plaintext highlighter-rouge">termo_anterior</code>.</li>
  <li>Calcular o próximo termo</li>
  <li>Atualizar os valores das variáveis</li>
  <li>Incrementar o contador <code class="language-plaintext highlighter-rouge">i</code> para o laço de repetição avançar</li>
</ol>

<p>O laço de repetição usado será um <code class="language-plaintext highlighter-rouge">while</code> para repetir até mostrar a quantidade de termos que a pessoa pediu, ou seja até que <code class="language-plaintext highlighter-rouge">i &lt;= quantidade_de_termos</code>.</p>

<p>Com <code class="language-plaintext highlighter-rouge">termo_anterior = 0</code> e <code class="language-plaintext highlighter-rouge">termo_atual = 1</code> no início do <code class="language-plaintext highlighter-rouge">while</code> acontecerá o seguinte:</p>

<ul>
  <li>mostra o valor de <code class="language-plaintext highlighter-rouge">termo_anterior</code>.
    <ul>
      <li>Na primeira vez 0, porque é o valor que iniciamos a variável.</li>
    </ul>
  </li>
  <li>Depois vamos calcular o próximo termo que será <code class="language-plaintext highlighter-rouge">proximo_termo = termo_anterior + termo_atual</code>.
    <ul>
      <li>Na primeira vez <code class="language-plaintext highlighter-rouge">proximo_termo = 0 + 1</code>, ou seja, 1 porque <code class="language-plaintext highlighter-rouge">termo_anterior</code> neste momento é 0 e <code class="language-plaintext highlighter-rouge">termo_atual</code> é 1.</li>
    </ul>
  </li>
  <li>Depois vamos atualizar os valores das variáveis <code class="language-plaintext highlighter-rouge">termo_anterior</code> passa a ser o antigo <code class="language-plaintext highlighter-rouge">termo_atual</code> e o <code class="language-plaintext highlighter-rouge">termo_atual</code> passa a ser o <code class="language-plaintext highlighter-rouge">proximo_termo</code>.
    <ul>
      <li>Então agora temos <code class="language-plaintext highlighter-rouge">termo_anterior = 1</code> e <code class="language-plaintext highlighter-rouge">termo_atual = 1</code>.</li>
    </ul>
  </li>
  <li>Depois precisamos incrementar o contador, para o laço de repetição avançar e não ficar se repetindo para sempre.
    <ul>
      <li>Então precisamos fazer <code class="language-plaintext highlighter-rouge">i += 1</code>.</li>
    </ul>
  </li>
  <li>Na próxima execução do <code class="language-plaintext highlighter-rouge">while</code> ele vai mostrar no terminal o novo valor de <code class="language-plaintext highlighter-rouge">termo_anterior</code>.
    <ul>
      <li>Que agora é 1.</li>
    </ul>
  </li>
  <li>Vai calcular o próximo termo que será <code class="language-plaintext highlighter-rouge">proximo_termo = termo_anterior + termo_atual</code>.
    <ul>
      <li>Agora 1 + 1 = 2 então o próximo termo será 2.</li>
    </ul>
  </li>
  <li>Depois o laço vai atualizar as variáveis.
    <ul>
      <li>Agora <code class="language-plaintext highlighter-rouge">termo_anterior = 1</code>, <code class="language-plaintext highlighter-rouge">termo_atual = 2</code>.</li>
    </ul>
  </li>
  <li>Depois ele vai incrementar o i mais uma vez para o laço ser executado novamente.</li>
</ul>

<p>E assim, ele vai repetir esse processo até que o valor de i seja igual a quantidade de termos que a pessoa pediu para ver.</p>

<p>O código desse trecho ficará assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">while</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">quantidade_de_termos</span>
  <span class="nb">print</span> <span class="s2">"</span><span class="se">\n</span><span class="si">#{</span><span class="n">termo_anterior</span><span class="si">}</span><span class="s2">"</span>

  <span class="n">proximo_termo</span> <span class="o">=</span> <span class="n">termo_anterior</span> <span class="o">+</span> <span class="n">termo_atual</span>
  <span class="n">termo_anterior</span> <span class="o">=</span> <span class="n">termo_atual</span>
  <span class="n">termo_atual</span> <span class="o">=</span> <span class="n">proximo_termo</span>

  <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">end</span>
</code></pre></div></div>

<p>O programa completo ficará assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">quantidade_de_termos</span> <span class="o">=</span> <span class="kp">nil</span>

<span class="c1"># Título do programa</span>
<span class="nb">puts</span> <span class="s2">"Programa para exibir a sequência de Fibonacci"</span>

<span class="c1"># Estrutura de repetição para garantir uma entrada válida</span>
<span class="k">while</span> <span class="n">quantidade_de_termos</span><span class="p">.</span><span class="nf">nil?</span>
  <span class="nb">print</span> <span class="s2">"Quantos números da sequência de Fibonacci você deseja ver? "</span>

  <span class="c1"># Uso do rescue na mesma linha para retornar nil em caso de erro</span>
  <span class="n">quantidade_de_termos</span> <span class="o">=</span> <span class="no">Integer</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span> <span class="k">rescue</span> <span class="kp">nil</span>

  <span class="k">if</span> <span class="n">quantidade_de_termos</span><span class="p">.</span><span class="nf">nil?</span>
    <span class="nb">puts</span> <span class="s2">"Erro: Por favor, digite um número inteiro válido."</span>
  <span class="k">end</span>
<span class="k">end</span>

<span class="n">termo_anterior</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">termo_atual</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">i</span> <span class="o">=</span> <span class="mi">1</span> <span class="c1"># Variável de controle para contar os termos exibidos</span>

<span class="nb">puts</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">Sequência de Fibonacci (Exibindo </span><span class="si">#{</span><span class="n">quantidade_de_termos</span><span class="si">}</span><span class="s2"> termos):"</span>

<span class="k">while</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">quantidade_de_termos</span>
  <span class="nb">print</span> <span class="s2">"</span><span class="se">\n</span><span class="si">#{</span><span class="n">termo_anterior</span><span class="si">}</span><span class="s2">"</span>

  <span class="n">proximo_termo</span> <span class="o">=</span> <span class="n">termo_anterior</span> <span class="o">+</span> <span class="n">termo_atual</span>
  <span class="n">termo_anterior</span> <span class="o">=</span> <span class="n">termo_atual</span>
  <span class="n">termo_atual</span> <span class="o">=</span> <span class="n">proximo_termo</span>

  <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">end</span>

<span class="nb">puts</span> <span class="s2">"</span><span class="se">\n\n</span><span class="s2">Fim do programa."</span>
</code></pre></div></div>

<h3 id="programa-que-gera-um-número-aleatório-e-pede-para-a-pessoa-adivinhar-qual-é">Programa que gera um número aleatório e pede para a pessoa adivinhar qual é</h3>
<hr />

<p>O computador vai “escolher” um número aleatório, de 1 a 10 e a pessoa vai tentar descobrir qual é. O programa não pode parar (fechar) até que a pessoa acerte. Se a pessoa errar, o programa deve pedir para ela tentar outra vez digitando outro número.</p>

<p>Lembre-se de impedir que o programa processe letras, números decimais ou qualquer coisa que não seja um número inteiro.</p>

<h4 id="como-fazer-8">Como fazer?</h4>

<p>Vamos começar criando uma variável chamada <code class="language-plaintext highlighter-rouge">numero_secreto</code> para receber o número gerado aleatoriamente. Mas, como vamos gerar esse número aleatório? Vamos usar <code class="language-plaintext highlighter-rouge">rand(1..10)</code> que significa: “sorteie um número dentro desse intervalo entre 1 e 10”.</p>

<p>Exemplo: pode sair 3, ou 7, ou 10… cada execução pode sortear um número diferente.</p>

<p>Então:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numero_secreto</span> <span class="o">=</span> <span class="nb">rand</span><span class="p">(</span><span class="mi">1</span><span class="o">..</span><span class="mi">10</span><span class="p">)</span>
</code></pre></div></div>

<p>Quer dizer “faça o sorteio de um número aleatório dentro do intervalo entre 1 e 10 e depois coloque esse número dentro da variável <code class="language-plaintext highlighter-rouge">numero_secreto</code>”.</p>

<p>Depois vamos criar a variável <code class="language-plaintext highlighter-rouge">palpite</code> e iniciar ela com valor 0.</p>

<p>Após a criação das variáveis vamos exibir mensagens para a pessoa com o nome do programa e a orientação do que ela deve fazer.</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">puts</span> <span class="s2">"Programa de Adivinhação de Números"</span>
<span class="nb">puts</span> <span class="s2">"Tente adivinhar o número secreto entre 1 e 10."</span>
</code></pre></div></div>

<p>Agora enquanto o número informado pela pessoa for diferente do número armazenado na variável <code class="language-plaintext highlighter-rouge">numero_secreto</code> (o número sorteado), o programa deverá continuar executando o bloco de código responsável por solicitar novas tentativas de adivinhação a pessoa.</p>

<p>Para isso vamos usar o <code class="language-plaintext highlighter-rouge">while</code>:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">while</span> <span class="n">palpite</span> <span class="o">!=</span> <span class="n">numero_secreto</span>
  <span class="o">...</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Aqui estamos dizendo isso, enquanto o valor do palpite for diferente do número secreto, repita a execução do bloco.</p>

<p>Ou seja:</p>

<ul>
  <li>Se a pessoa <strong>errar</strong>, o programa <strong>continua</strong> pedindo outro palpite.</li>
  <li>Só vai parar de pedir quando o <code class="language-plaintext highlighter-rouge">palpite == numero_secreto</code> (quando a pessoa acertar).</li>
</ul>

<p>Dentro do <code class="language-plaintext highlighter-rouge">while</code> primeiro vamos colocar um <code class="language-plaintext highlighter-rouge">print</code> pedindo o palpite:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">print</span> <span class="s2">"Digite seu palpite: "</span>
</code></pre></div></div>

<p>Depois vamos ler a entrada digitada pela pessoa, remover a quebra de linha ao final e tentar convertê-la em um número inteiro.</p>

<p>Se a pessoa digitar um número válido, ele será convertido, mas se a entrada digitada não for um número, ocorre erro e por isso o <code class="language-plaintext highlighter-rouge">rescue nil</code>   deve ser usado, pois ao invés de interromper o programa, retorna-se <code class="language-plaintext highlighter-rouge">nil</code> em caso de erro na conversão.</p>

<p>Colocaremos o valor que foi pego da entrada na variável <code class="language-plaintext highlighter-rouge">palpite</code>:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">palpite</span> <span class="o">=</span> <span class="no">Integer</span> <span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span> <span class="k">rescue</span> <span class="kp">nil</span>
</code></pre></div></div>

<p>Vamos comparar valores, mas antes precisamos validar a entrada para evitar cálculos com dados não numéricos. Se a entrada for inválida, o bloco <code class="language-plaintext highlighter-rouge">rescue</code> transforma o valor em <code class="language-plaintext highlighter-rouge">nil</code>, e é preciso checar se esse valor é nulo antes de continuar.</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="n">palpite</span><span class="p">.</span><span class="nf">nil?</span>
  <span class="nb">puts</span> <span class="s2">"Por favor, insira um número válido."</span>
  <span class="k">next</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Aqui <code class="language-plaintext highlighter-rouge">palpite.nil?</code> pergunta: “o palpite é <code class="language-plaintext highlighter-rouge">nil</code>?” Se for <code class="language-plaintext highlighter-rouge">nil</code>, significa que a pessoa digitou algo que não virou número então mostramos a mensagem informando o erro.</p>

<p>O <code class="language-plaintext highlighter-rouge">next</code> dentro do <code class="language-plaintext highlighter-rouge">while</code> é usado para fazer o inverso do comando <code class="language-plaintext highlighter-rouge">break</code>, se nós usamos o comando break para parar a execução imediatamente, o <code class="language-plaintext highlighter-rouge">next</code>  é usado para interromper a atividade atual e iniciar a próxima atividade imediatamente no laço de repetição.</p>

<p>É como dizer: “Não é o resultado esperado, então interrompa e siga para o próximo comando no loop.”</p>

<p>Neste caso, o próximo comando será pedir o palpite de novo.</p>

<p>Agora temos que verificar se o palpite digitado pela pessoa está no intervalo entre os números 1 e 10. Precisamos garantir que o palpite não seja <code class="language-plaintext highlighter-rouge">≤ 0</code> (o, -1, -2, -3 e assim por diante nos números negativos), ele também não pode ser <code class="language-plaintext highlighter-rouge">&gt; 10</code>  (11, 12, 13 e assim por diante).</p>

<p>Para garantir que o palpite vai estar entre 1 e 10 (que é o que queremos) vamos fazer:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="n">palpite</span> <span class="o">&lt;=</span> <span class="mi">0</span> <span class="o">||</span> <span class="n">palpite</span> <span class="o">&gt;</span> <span class="mi">10</span>
  <span class="nb">puts</span> <span class="s2">"Seu palpite deve estar entre o número 1 e o número 10."</span>
  <span class="k">next</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Assim, estamos dizendo que se o palpite for menor ou igual a 0 OU maior que 10, ele é inválido e não pode ser aceito. Com o palpite inválido nós mostramos a mensagem:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">puts</span> <span class="s2">"Seu palpite deve estar entre o número 1 e o número 10."</span>
</code></pre></div></div>

<p>E usamos o <code class="language-plaintext highlighter-rouge">next</code> para pular as próximas etapas e pedir outro palpite de novo.</p>

<p>Agora que validamos o palpite chegou a hora de comparar ele com o número secreto. Como vamos fazer isso? Vamos verificar se ele é menor ou maior e se ele não for menor nem maior só poderá ser igual.</p>

<ul>
  <li>Se o palpite for menor que o número secreto, precisamos dizer a pessoa que o número escolhido por ela é muito baixo e que ela precisa tentar de novo.</li>
  <li>Se o palpite for maior que o número secreto, precisamos dizer a pessoa que o número escolhido por ela é muito alto e que ela precisa tentar de novo.</li>
  <li>Se o palpite não for menor e também não for maior ele só poderá ser igual ao número secreto. Então isso significa que a pessoa vai ter acertado o número secreto, que seu palpite estava correto. Nesse caso precisamos exibir uma mensagem de parabéns.</li>
</ul>

<p>Vamos fazer isso dessa forma:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="n">palpite</span> <span class="o">&lt;</span> <span class="n">numero_secreto</span>
  <span class="nb">puts</span> <span class="s2">"Muito baixo! Tente novamente."</span>
<span class="k">elsif</span> <span class="n">palpite</span> <span class="o">&gt;</span> <span class="n">numero_secreto</span>
  <span class="nb">puts</span> <span class="s2">"Muito alto! Tente novamente."</span>
<span class="k">else</span>
  <span class="nb">puts</span> <span class="s2">"Parabéns! Você adivinhou o número secreto </span><span class="si">#{</span><span class="n">numero_secreto</span><span class="si">}</span><span class="s2">!"</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Nós começamos escolhendo as dicas:</p>

<ul>
  <li>Se <code class="language-plaintext highlighter-rouge">palpite &lt; numero_secreto</code>: isso quer dizer que a pessoa chutou um número menor do que o secreto então o programa diz: “Muito baixo!” para ela saber que o número que ela escolheu é menor que o número secreto.</li>
  <li><code class="language-plaintext highlighter-rouge">elsif palpite &gt; numero_secreto</code>: senão, se o número escolhido pela pessoa for maior que o número secreto então o programa diz: “Muito alto!” para ela saber disso.</li>
  <li><code class="language-plaintext highlighter-rouge">else</code>: ou seja, se não é menor e não é maior, então só pode ser <strong>igual, logo a pessoa acertou o número. Neste caso, devemos imprimir parabéns e exibir o número.</strong> Por isso usamos <code class="language-plaintext highlighter-rouge">#{numero_secreto}</code> para inserir o número secreto na mensagem de parabéns.</li>
</ul>

<p>Quando a pessoa acerta o número, o valor de <code class="language-plaintext highlighter-rouge">palpite</code> passa a ser exatamente igual ao <code class="language-plaintext highlighter-rouge">numero_secreto</code>.</p>

<p>O <code class="language-plaintext highlighter-rouge">while</code> só continua rodando (executando) <strong>enquanto os dois forem diferentes</strong> (<code class="language-plaintext highlighter-rouge">palpite != numero_secreto</code>). Então, no momento em que eles ficam iguais, essa condição deixa de ser verdadeira.</p>

<p>Em outras palavras: o laço existe para repetir o jogo <strong>até a pessoa acertar</strong>. Assim que acerta, a condição falha e o <code class="language-plaintext highlighter-rouge">while</code> simplesmente para de executar.</p>

<p>Assim o programa termina.</p>

<p>O programa completo fica assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numero_secreto</span> <span class="o">=</span> <span class="nb">rand</span><span class="p">(</span><span class="mi">1</span><span class="o">..</span><span class="mi">10</span><span class="p">)</span>
<span class="n">palpite</span> <span class="o">=</span> <span class="mi">0</span>

<span class="nb">puts</span> <span class="s2">"Programa de Adivinhação de Números"</span>
<span class="nb">puts</span> <span class="s2">"Tente adivinhar o número secreto entre 1 e 10."</span>

<span class="c1"># enquanto o palpite for diferente do número secredo</span>

<span class="k">while</span> <span class="n">palpite</span> <span class="o">!=</span> <span class="n">numero_secreto</span>
  <span class="nb">print</span> <span class="s2">"Digite seu palpite: "</span>
  <span class="n">palpite</span> <span class="o">=</span> <span class="no">Integer</span> <span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span> <span class="k">rescue</span> <span class="kp">nil</span>

  <span class="k">if</span> <span class="n">palpite</span><span class="p">.</span><span class="nf">nil?</span>
    <span class="nb">puts</span> <span class="s2">"Por favor, insira um número válido."</span>
    <span class="k">next</span>
  <span class="k">end</span>

  <span class="k">if</span> <span class="n">palpite</span> <span class="o">&lt;=</span> <span class="mi">0</span> <span class="o">||</span> <span class="n">palpite</span> <span class="o">&gt;</span> <span class="mi">10</span>
    <span class="nb">puts</span> <span class="s2">"Seu palpite deve estar entre o número 1 e o número 10."</span>
    <span class="k">next</span>
  <span class="k">end</span>

  <span class="k">if</span> <span class="n">palpite</span> <span class="o">&lt;</span> <span class="n">numero_secreto</span>
    <span class="nb">puts</span> <span class="s2">"Muito baixo! Tente novamente."</span>
  <span class="k">elsif</span> <span class="n">palpite</span> <span class="o">&gt;</span> <span class="n">numero_secreto</span>
    <span class="nb">puts</span> <span class="s2">"Muito alto! Tente novamente."</span>
  <span class="k">else</span>
    <span class="nb">puts</span> <span class="s2">"Parabéns! Você adivinhou o número secreto </span><span class="si">#{</span><span class="n">numero_secreto</span><span class="si">}</span><span class="s2">!"</span>
  <span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>

<h2 id="nível-avançado">Nível Avançado</h2>
<hr />

<p>Os exercícios avançados exigem pensar no programa como um sistema completo, com menus interativos, validação rigorosa de entradas, ciclos de repetição com múltiplas condições de saída e estruturas de dados como arrays e hashes. O foco é integrar todos os recursos anteriores em programas mais robustos e próximos de aplicações reais.</p>

<h3 id="programa-que-converte-dias-horas-e-minutos-em-segundos">Programa que converte dias, horas e minutos em segundos</h3>
<hr />

<p>Escreva um programa que recebe:</p>

<ul>
  <li>Uma quantidade de dias (entre 1 e 365)</li>
  <li>Ou uma quantidade de horas (podem ser ilimitadas, mas não zero ou negativas)</li>
  <li>Ou uma quantidade de minutos (que também podem ser ilimitados, mas não zero ou negativos)</li>
</ul>

<p>O programa deve identificar o que foi inserido, fazer a conversão e informar para a pessoa quantos segundos são equivalentes ao que item informado.</p>

<h4 id="como-fazer-9">Como fazer?</h4>

<p>A primeira etapa, como sempre, é apresentar o programa para as pessoas e dizer o que ele faz:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">puts</span> <span class="s2">"Programa que converte dias, horas ou minutos em segundos."</span>
</code></pre></div></div>

<p>Depois vamos usar um:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kp">loop</span> <span class="k">do</span>
  <span class="o">...</span>
  <span class="k">break</span> <span class="k">if</span> <span class="n">resposta</span> <span class="o">==</span> <span class="s2">"n"</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Por que usar isso? Imagine que nós queremos converter dias em segundos; depois, minutos em segundos; em seguida, horas em segundos. Para garantir que o programa continue perguntando se a pessoa deseja fazer novas conversões e repita esse processo enquanto ela quiser, precisamos desse recurso.</p>

<p>Depois vamos criar o menu de opções, para isso precisamos de uma variável:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="c1"># Menu de opções</span>
  <span class="n">opcao</span> <span class="o">=</span> <span class="kp">nil</span>
</code></pre></div></div>

<p>Fazemos isso para que o <code class="language-plaintext highlighter-rouge">while</code> da próxima linha funcione na primeira vez.</p>

<p>Depois vamos inserir:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="k">while</span> <span class="n">opcao</span><span class="p">.</span><span class="nf">nil?</span> <span class="o">||</span> <span class="o">!</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">].</span><span class="nf">include?</span><span class="p">(</span><span class="n">opcao</span><span class="p">)</span>
</code></pre></div></div>

<p>Essa linha quer dizer “<strong>enquanto a opção for nula (<code class="language-plaintext highlighter-rouge">nil</code>) OU não for 1, 2 ou 3, repita o bloco abaixo”</strong>.</p>

<p>Onde:</p>

<p>• <code class="language-plaintext highlighter-rouge">opcao.nil?</code> pergunta: “a opção está nula?”</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">||</code> representa o operador <strong>“ou”</strong></li>
  <li><code class="language-plaintext highlighter-rouge">![1, 2, 3].include?(opcao)</code> pergunta: “a opção digitada pela pessoa NÃO está na lista [1, 2, 3]?” O <code class="language-plaintext highlighter-rouge">!</code> na frente inverte a resposta, pergunta se é diferente.</li>
</ul>

<p>Esse é um recurso de segurança do menu: não deixa a opção passar enquanto não for válida, ou seja 1, 2 ou 3.</p>

<p>Depois colocamos um:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="nb">puts</span> <span class="s2">""</span>
</code></pre></div></div>

<p>Que Imprime uma linha em branco na tela só para dar um espaçamento visual e deixar mais bonito.</p>

<p>Na sequência colocamos:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="nb">puts</span> <span class="s2">"Escolha qual informação você deseja converter"</span>
    <span class="nb">puts</span> <span class="s2">"1 - Converter dias em segundos"</span>
    <span class="nb">puts</span> <span class="s2">"2 - Converter horas em segundos"</span>
    <span class="nb">puts</span> <span class="s2">"3 - Converter minutos em segundos"</span>
</code></pre></div></div>

<p>Aqui mostramos o menu com as 3 opções. Cada <code class="language-plaintext highlighter-rouge">puts</code> escreve uma linha na tela para que as opções fiquem uma abaixo da outra.</p>

<p>Depois colocamos:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="nb">print</span> <span class="s2">"Digite sua opção: "</span>
</code></pre></div></div>

<p>Usamos <code class="language-plaintext highlighter-rouge">print</code> para mostrar a mensagem, mas <strong>não pular para a próxima linha</strong>. Assim o cursor fica ali do lado, esperando a pessoa digitar na mesma linha e a resposta dela vai ficar ao lado da pergunta.</p>

<p>O próximo passo é incluir:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">opcao</span> <span class="o">=</span> <span class="no">Integer</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span> <span class="k">rescue</span> <span class="kp">nil</span>
</code></pre></div></div>

<p>Onde:</p>

<ol>
  <li><code class="language-plaintext highlighter-rouge">gets</code> <strong>pega</strong> o que a pessoa digitou no teclado (incluindo o <code class="language-plaintext highlighter-rouge">Enter</code>)</li>
  <li><code class="language-plaintext highlighter-rouge">.chomp</code> <strong>tira o <code class="language-plaintext highlighter-rouge">Enter</code></strong> do final</li>
  <li><code class="language-plaintext highlighter-rouge">Integer(...)</code> tenta <strong>converter</strong> o texto em número inteiro. Se a pessoa digitou “2”, vira o número 2</li>
  <li><code class="language-plaintext highlighter-rouge">rescue nil</code> é usado <strong>se der erro</strong> (exemplo: a pessoa digitou “banana”, que não é número), em vez de o programa quebrar e dar erro, ele coloca <code class="language-plaintext highlighter-rouge">nil</code> (nada) na variável, assim a opção será nula e o <code class="language-plaintext highlighter-rouge">while</code>, que verifica isso, vai pedir para ela digitar uma opção válida.</li>
</ol>

<p>Depois criamos um:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">if</span> <span class="n">opcao</span><span class="p">.</span><span class="nf">nil?</span> <span class="o">||</span> <span class="o">!</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">].</span><span class="nf">include?</span><span class="p">(</span><span class="n">opcao</span><span class="p">)</span>
      <span class="nb">puts</span> <span class="s2">"Opção inválida! Escolha 1, 2 ou 3."</span>
      <span class="n">opcao</span> <span class="o">=</span> <span class="kp">nil</span>
    <span class="k">end</span>
</code></pre></div></div>

<p>Para verifica se a opção é inválida (mesma verificação do <code class="language-plaintext highlighter-rouge">while</code>). Se for:</p>

<ul>
  <li>Avisa a pessoa que sim a opção é inválida</li>
  <li>Coloca <code class="language-plaintext highlighter-rouge">nil</code> na <code class="language-plaintext highlighter-rouge">opcao</code> de novo, para garantir que o <code class="language-plaintext highlighter-rouge">while</code> vai repetir</li>
</ul>

<p>Já o <code class="language-plaintext highlighter-rouge">end</code> fecha o <code class="language-plaintext highlighter-rouge">if</code>.</p>

<p>Na próxima linha usaremos um <code class="language-plaintext highlighter-rouge">end</code> para fechar o <code class="language-plaintext highlighter-rouge">while</code> do menu. Se a opção foi válida, o programa segue em frente. Se não foi , volta para pedir a pessoa para digitar uma opção que seja.</p>

<p>Continuando vamos usar um <code class="language-plaintext highlighter-rouge">case</code> para analisar o valor da variável <code class="language-plaintext highlighter-rouge">opcao</code> e escolher qual caminho seguir.</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Entrada do valor conforme a opção escolhida</span>
  <span class="k">case</span> <span class="n">opcao</span>
</code></pre></div></div>

<p>Quando a opção for 1 o <code class="language-plaintext highlighter-rouge">case</code> entra no bloco de conversão de <strong>dias</strong>.</p>

<p>Dentro desse bloco será criada uma variável chamada <code class="language-plaintext highlighter-rouge">valor</code> começando com <code class="language-plaintext highlighter-rouge">nil</code> (nulo), igual fizemos com a variável <code class="language-plaintext highlighter-rouge">opcao</code>.</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="k">when</span> <span class="mi">1</span>
    <span class="n">valor</span> <span class="o">=</span> <span class="kp">nil</span>
</code></pre></div></div>

<p>Isso é feito para a variável ser usada em um <code class="language-plaintext highlighter-rouge">while</code>  logo abaixo.</p>

<p>O <code class="language-plaintext highlighter-rouge">while</code> será esse:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">while</span> <span class="n">valor</span><span class="p">.</span><span class="nf">nil?</span> <span class="o">||</span> <span class="n">valor</span> <span class="o">&lt;</span> <span class="mi">1</span> <span class="o">||</span> <span class="n">valor</span> <span class="o">&gt;</span> <span class="mi">365</span>
</code></pre></div></div>

<p>Ou seja, estamos dizendo que “enquanto o valor for nulo (nada), OU menor que 1, OU maior que 365, repita o bloco para pedir a quantidade de dias para a pessoa.” Só será aceito um valor de dias entre 1 e 365 (os dias de um ano).</p>

<p>Usaremos:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">print</span> <span class="s2">"Digite quantos dias você deseja converter para segundos: "</span>
</code></pre></div></div>

<p>Para pedir o valor a pessoa, com o cursor na mesma linha que a pergunta.</p>

<p>E, usaremos:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">valor</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span> <span class="k">rescue</span> <span class="kp">nil</span>
</code></pre></div></div>

<p>Para analisar o que foi digitado, limpar, verificar se é válido para colocar na variável <code class="language-plaintext highlighter-rouge">valor</code>. A diferença é que <code class="language-plaintext highlighter-rouge">Float</code> aceita <strong>números decimais</strong> como <code class="language-plaintext highlighter-rouge">1.5</code> (um dia e meio). Se a pessoa digitar algo inválido será transformado em <code class="language-plaintext highlighter-rouge">nil</code> (nulo).</p>

<p>Depois faremos um <code class="language-plaintext highlighter-rouge">if</code> para caso o valor não passar na validação, avisar a pessoa. Assim, o <code class="language-plaintext highlighter-rouge">while</code> vai repetir e pedir de novo para a pessoa digitar a quantidade de dias que ela quer converter.</p>

<p>Ele ficará assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code>      <span class="k">if</span> <span class="n">valor</span><span class="p">.</span><span class="nf">nil?</span> <span class="o">||</span> <span class="n">valor</span> <span class="o">&lt;</span> <span class="mi">1</span> <span class="o">||</span> <span class="n">valor</span> <span class="o">&gt;</span> <span class="mi">365</span>
        <span class="nb">puts</span> <span class="s2">"Essa quantidade de dias é inválida! Por favor, insira um número entre 1 e 365."</span>
      <span class="k">end</span>
</code></pre></div></div>

<p>Depois usaremos um <code class="language-plaintext highlighter-rouge">end</code> para fechar o <code class="language-plaintext highlighter-rouge">while</code> da validação de dias.</p>

<p>O próximo passo é fazer a conta: <strong>dias × 24 horas × 60 minutos × 60 segundos</strong>.</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">segundos</span> <span class="o">=</span> <span class="p">(</span><span class="n">valor</span> <span class="o">*</span> <span class="mi">24</span> <span class="o">*</span> <span class="mi">60</span> <span class="o">*</span> <span class="mi">60</span><span class="p">).</span><span class="nf">round</span>
</code></pre></div></div>

<p>O <code class="language-plaintext highlighter-rouge">.round</code> arredonda o resultado para um número inteiro (exemplo: 129600.0 vira 129600), porque não faz sentido ter “meio segundo” aqui.</p>

<p>O próximo passo é mostrar o resultado.</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">puts</span> <span class="s2">"</span><span class="si">#{</span><span class="n">valor</span><span class="si">}</span><span class="s2"> dia(s) equivalem a </span><span class="si">#{</span><span class="n">segundos</span><span class="si">}</span><span class="s2"> segundos."</span>
</code></pre></div></div>

<p>Assim encerramos o que acontece quando a opção for 1.</p>

<p>Quando a opção for 2 o <code class="language-plaintext highlighter-rouge">case</code> entra no bloco de conversão de <strong>horas</strong>.</p>

<p>Aqui seguiremos a mesma lógica dos dias (que criamos no caso 1), mas aqui o valor só precisa ser <strong>maior que zero</strong>. Pode ser qualquer número positivo, sem limite.</p>

<p>Então vamos colocar a variável <code class="language-plaintext highlighter-rouge">valor</code> como nula e configurar nosso <code class="language-plaintext highlighter-rouge">while</code> como:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="n">valor</span> <span class="o">=</span> <span class="kp">nil</span>

    <span class="k">while</span> <span class="n">valor</span><span class="p">.</span><span class="nf">nil?</span> <span class="o">||</span> <span class="n">valor</span> <span class="o">&lt;=</span> <span class="mi">0</span>
</code></pre></div></div>

<p>Depois colocaremos:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code>      <span class="nb">print</span> <span class="s2">"Digite a quantidade de horas: "</span>
      <span class="n">valor</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span> <span class="k">rescue</span> <span class="kp">nil</span>

      <span class="k">if</span> <span class="n">valor</span><span class="p">.</span><span class="nf">nil?</span> <span class="o">||</span> <span class="n">valor</span> <span class="o">&lt;=</span> <span class="mi">0</span>
        <span class="nb">puts</span> <span class="s2">"Essa quantidade de horas é inválida! Por favor, insira um número maior que zero."</span>
      <span class="k">end</span>
</code></pre></div></div>

<p>Para pedir, converter e validar o <code class="language-plaintext highlighter-rouge">valor</code> seguindo a mesma estrutura que criamos no caso dos dias.</p>

<p>Usamos <code class="language-plaintext highlighter-rouge">end</code> para fechar o <code class="language-plaintext highlighter-rouge">while</code> das horas.</p>

<p>Na sequência fazemos o cálculo:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">segundos</span> <span class="o">=</span> <span class="p">(</span><span class="n">valor</span> <span class="o">*</span> <span class="mi">60</span> <span class="o">*</span> <span class="mi">60</span><span class="p">).</span><span class="nf">round</span>
</code></pre></div></div>

<p>Aqui, usamos <strong>Horas × 60 minutos × 60 segundos</strong>. Não precisamos multiplicar por 24 porque já estamos em horas.</p>

<p>No final usamos:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">puts</span> <span class="s2">"</span><span class="si">#{</span><span class="n">valor</span><span class="si">}</span><span class="s2"> hora(s) equivalem a </span><span class="si">#{</span><span class="n">segundos</span><span class="si">}</span><span class="s2"> segundos."</span>
</code></pre></div></div>

<p>Para mostrar o resultado e encerramos o caso 2.</p>

<p>Quando a opção for 3 o <code class="language-plaintext highlighter-rouge">case</code> entra no bloco de conversão de <strong>minutos</strong>.</p>

<p>Vamos usar:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="n">valor</span> <span class="o">=</span> <span class="kp">nil</span>

    <span class="k">while</span> <span class="n">valor</span><span class="p">.</span><span class="nf">nil?</span> <span class="o">||</span> <span class="n">valor</span> <span class="o">&lt;=</span> <span class="mi">0</span>
      <span class="nb">print</span> <span class="s2">"Digite a quantidade de minutos: "</span>
      <span class="n">valor</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span> <span class="k">rescue</span> <span class="kp">nil</span>

      <span class="k">if</span> <span class="n">valor</span><span class="p">.</span><span class="nf">nil?</span> <span class="o">||</span> <span class="n">valor</span> <span class="o">&lt;=</span> <span class="mi">0</span>
        <span class="nb">puts</span> <span class="s2">"Essa quantidade de minutos é inválida! Por favor, insira um número maior que zero."</span>
      <span class="k">end</span>
    <span class="k">end</span>
</code></pre></div></div>

<p>Que é uma estrutura semelhante as anteriores para pedir, converter, validar e repetir se for necessário.</p>

<p>Depois vamos fazer o cálculo de m<strong>inutos × 60 segundos</strong>. Só uma multiplicação, porque minuto já está a um passo de segundo.</p>

<p>Será assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">segundos</span> <span class="o">=</span> <span class="p">(</span><span class="n">valor</span> <span class="o">*</span> <span class="mi">60</span><span class="p">).</span><span class="nf">round</span>
</code></pre></div></div>

<p>Na sequência exibimos o resultado:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">puts</span> <span class="s2">"</span><span class="si">#{</span><span class="n">valor</span><span class="si">}</span><span class="s2"> minuto(s) equivalem a </span><span class="si">#{</span><span class="n">segundos</span><span class="si">}</span><span class="s2"> segundos."</span>
</code></pre></div></div>

<p>E, fechamos o <code class="language-plaintext highlighter-rouge">case</code> com <code class="language-plaintext highlighter-rouge">end</code>. O programa já fez a conversão e agora segue em frente.</p>

<p>Na sequência vamos colocar um:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="nb">puts</span> <span class="s2">""</span>
</code></pre></div></div>

<p>Apenas para dar um espaço visual na resposta.</p>

<p>Depois, vamos criar uma variável chamada <code class="language-plaintext highlighter-rouge">resposta</code> iniciada com <code class="language-plaintext highlighter-rouge">nil</code> (nulo) para o próximo <code class="language-plaintext highlighter-rouge">while</code> que vamos fazer funcionar.</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">resposta</span> <span class="o">=</span> <span class="kp">nil</span>
</code></pre></div></div>

<p>Esse próximo <code class="language-plaintext highlighter-rouge">while</code> será assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="k">while</span> <span class="n">resposta</span> <span class="o">!=</span> <span class="s2">"s"</span> <span class="o">&amp;&amp;</span> <span class="n">resposta</span> <span class="o">!=</span> <span class="s2">"n"</span>
    <span class="nb">print</span> <span class="s2">"Deseja fazer outra conversão? (s para sim ou n para não): "</span>
    <span class="n">resposta</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">.</span><span class="nf">downcase</span>

    <span class="k">if</span> <span class="n">resposta</span> <span class="o">!=</span> <span class="s2">"s"</span> <span class="o">&amp;&amp;</span> <span class="n">resposta</span> <span class="o">!=</span> <span class="s2">"n"</span>
      <span class="nb">puts</span> <span class="s2">"Resposta inválida! Por favor, digite 's' para sim ou 'n' para não."</span>
    <span class="k">end</span>
  <span class="k">end</span>
</code></pre></div></div>

<p>Ou seja, enquanto a resposta for diferente de sim (<code class="language-plaintext highlighter-rouge">!= "s"</code>) e de não (<code class="language-plaintext highlighter-rouge">!= "n"</code>) vai mostrar a mensagem: <code class="language-plaintext highlighter-rouge">"Resposta inválida! Por favor, digite 's' para sim ou 'n' para não."</code> e depois vai perguntar se a pessoa deseja fazer outra conversão e ler a resposta novamente.</p>

<p>Daí é só colocar um <code class="language-plaintext highlighter-rouge">break</code> para o programa encerrar se <code class="language-plaintext highlighter-rouge">resposta == “n”</code>, encerrar o <code class="language-plaintext highlighter-rouge">loop</code> com <code class="language-plaintext highlighter-rouge">end</code> e colocar uma mensagem de fim do programa.</p>

<p>Vai ficar assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="k">break</span> <span class="k">if</span> <span class="n">resposta</span> <span class="o">==</span> <span class="s2">"n"</span>
<span class="k">end</span>

<span class="nb">puts</span> <span class="s2">"Programa encerrado. Até a próxima!"</span>
</code></pre></div></div>

<p>O código completo fica assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">puts</span> <span class="s2">"Programa que converte dias, horas ou minutos em segundos."</span>

<span class="kp">loop</span> <span class="k">do</span>
  <span class="c1"># Menu de opções</span>
  <span class="n">opcao</span> <span class="o">=</span> <span class="kp">nil</span>

  <span class="k">while</span> <span class="n">opcao</span><span class="p">.</span><span class="nf">nil?</span> <span class="o">||</span> <span class="o">!</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">].</span><span class="nf">include?</span><span class="p">(</span><span class="n">opcao</span><span class="p">)</span>
    <span class="nb">puts</span> <span class="s2">""</span>
    <span class="nb">puts</span> <span class="s2">"Escolha qual informação você deseja converter"</span>
    <span class="nb">puts</span> <span class="s2">"1 - Converter dias em segundos"</span>
    <span class="nb">puts</span> <span class="s2">"2 - Converter horas em segundos"</span>
    <span class="nb">puts</span> <span class="s2">"3 - Converter minutos em segundos"</span>
    <span class="nb">print</span> <span class="s2">"Digite sua opção: "</span>

    <span class="n">opcao</span> <span class="o">=</span> <span class="no">Integer</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span> <span class="k">rescue</span> <span class="kp">nil</span>

    <span class="k">if</span> <span class="n">opcao</span><span class="p">.</span><span class="nf">nil?</span> <span class="o">||</span> <span class="o">!</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">].</span><span class="nf">include?</span><span class="p">(</span><span class="n">opcao</span><span class="p">)</span>
      <span class="nb">puts</span> <span class="s2">"Opção inválida! Escolha 1, 2 ou 3."</span>
      <span class="n">opcao</span> <span class="o">=</span> <span class="kp">nil</span>
    <span class="k">end</span>
  <span class="k">end</span>

  <span class="c1"># Entrada do valor conforme a opção escolhida</span>
  <span class="k">case</span> <span class="n">opcao</span>
  <span class="k">when</span> <span class="mi">1</span>
    <span class="n">valor</span> <span class="o">=</span> <span class="kp">nil</span>

    <span class="k">while</span> <span class="n">valor</span><span class="p">.</span><span class="nf">nil?</span> <span class="o">||</span> <span class="n">valor</span> <span class="o">&lt;</span> <span class="mi">1</span> <span class="o">||</span> <span class="n">valor</span> <span class="o">&gt;</span> <span class="mi">365</span>
      <span class="nb">print</span> <span class="s2">"Digite quantos dias você deseja converter para segundos: "</span>
      <span class="n">valor</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span> <span class="k">rescue</span> <span class="kp">nil</span>

      <span class="k">if</span> <span class="n">valor</span><span class="p">.</span><span class="nf">nil?</span> <span class="o">||</span> <span class="n">valor</span> <span class="o">&lt;</span> <span class="mi">1</span> <span class="o">||</span> <span class="n">valor</span> <span class="o">&gt;</span> <span class="mi">365</span>
        <span class="nb">puts</span> <span class="s2">"Essa quantidade de dias é inválida! Por favor, insira um número entre 1 e 365."</span>
      <span class="k">end</span>
    <span class="k">end</span>

    <span class="n">segundos</span> <span class="o">=</span> <span class="p">(</span><span class="n">valor</span> <span class="o">*</span> <span class="mi">24</span> <span class="o">*</span> <span class="mi">60</span> <span class="o">*</span> <span class="mi">60</span><span class="p">).</span><span class="nf">round</span>
    <span class="nb">puts</span> <span class="s2">"</span><span class="si">#{</span><span class="n">valor</span><span class="si">}</span><span class="s2"> dia(s) equivalem a </span><span class="si">#{</span><span class="n">segundos</span><span class="si">}</span><span class="s2"> segundos."</span>
  <span class="k">when</span> <span class="mi">2</span>
    <span class="n">valor</span> <span class="o">=</span> <span class="kp">nil</span>

    <span class="k">while</span> <span class="n">valor</span><span class="p">.</span><span class="nf">nil?</span> <span class="o">||</span> <span class="n">valor</span> <span class="o">&lt;=</span> <span class="mi">0</span>
      <span class="nb">print</span> <span class="s2">"Digite a quantidade de horas: "</span>
      <span class="n">valor</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span> <span class="k">rescue</span> <span class="kp">nil</span>

      <span class="k">if</span> <span class="n">valor</span><span class="p">.</span><span class="nf">nil?</span> <span class="o">||</span> <span class="n">valor</span> <span class="o">&lt;=</span> <span class="mi">0</span>
        <span class="nb">puts</span> <span class="s2">"Essa quantidade de horas é inválida! Por favor, insira um número maior que zero."</span>
      <span class="k">end</span>
    <span class="k">end</span>

    <span class="n">segundos</span> <span class="o">=</span> <span class="p">(</span><span class="n">valor</span> <span class="o">*</span> <span class="mi">60</span> <span class="o">*</span> <span class="mi">60</span><span class="p">).</span><span class="nf">round</span>
    <span class="nb">puts</span> <span class="s2">"</span><span class="si">#{</span><span class="n">valor</span><span class="si">}</span><span class="s2"> hora(s) equivalem a </span><span class="si">#{</span><span class="n">segundos</span><span class="si">}</span><span class="s2"> segundos."</span>
  <span class="k">when</span> <span class="mi">3</span>
    <span class="n">valor</span> <span class="o">=</span> <span class="kp">nil</span>

    <span class="k">while</span> <span class="n">valor</span><span class="p">.</span><span class="nf">nil?</span> <span class="o">||</span> <span class="n">valor</span> <span class="o">&lt;=</span> <span class="mi">0</span>
      <span class="nb">print</span> <span class="s2">"Digite a quantidade de minutos: "</span>
      <span class="n">valor</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span> <span class="k">rescue</span> <span class="kp">nil</span>

      <span class="k">if</span> <span class="n">valor</span><span class="p">.</span><span class="nf">nil?</span> <span class="o">||</span> <span class="n">valor</span> <span class="o">&lt;=</span> <span class="mi">0</span>
        <span class="nb">puts</span> <span class="s2">"Essa quantidade de minutos é inválida! Por favor, insira um número maior que zero."</span>
      <span class="k">end</span>
    <span class="k">end</span>

    <span class="n">segundos</span> <span class="o">=</span> <span class="p">(</span><span class="n">valor</span> <span class="o">*</span> <span class="mi">60</span><span class="p">).</span><span class="nf">round</span>
    <span class="nb">puts</span> <span class="s2">"</span><span class="si">#{</span><span class="n">valor</span><span class="si">}</span><span class="s2"> minuto(s) equivalem a </span><span class="si">#{</span><span class="n">segundos</span><span class="si">}</span><span class="s2"> segundos."</span>
  <span class="k">end</span>

  <span class="c1"># Pergunta se deseja continuar</span>
  <span class="nb">puts</span> <span class="s2">""</span>
  <span class="n">resposta</span> <span class="o">=</span> <span class="kp">nil</span>

  <span class="k">while</span> <span class="n">resposta</span> <span class="o">!=</span> <span class="s2">"s"</span> <span class="o">&amp;&amp;</span> <span class="n">resposta</span> <span class="o">!=</span> <span class="s2">"n"</span>
    <span class="nb">print</span> <span class="s2">"Deseja fazer outra conversão? (s para sim ou n para não): "</span>
    <span class="n">resposta</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">.</span><span class="nf">downcase</span>

    <span class="k">if</span> <span class="n">resposta</span> <span class="o">!=</span> <span class="s2">"s"</span> <span class="o">&amp;&amp;</span> <span class="n">resposta</span> <span class="o">!=</span> <span class="s2">"n"</span>
      <span class="nb">puts</span> <span class="s2">"Resposta inválida! Por favor, digite 's' para sim ou 'n' para não."</span>
    <span class="k">end</span>
  <span class="k">end</span>

  <span class="k">break</span> <span class="k">if</span> <span class="n">resposta</span> <span class="o">==</span> <span class="s2">"n"</span>
<span class="k">end</span>

<span class="nb">puts</span> <span class="s2">"Programa encerrado. Até a próxima!"</span>

</code></pre></div></div>

<h3 id="programa-para-cadastrar-pessoas">Programa para cadastrar pessoas</h3>
<hr />

<p>Crie um pequeno sistema para cadastrar pessoas com nome, idade. Guarde as informações em um array de hashes. Após os cadastros, mostre a lista completa.</p>

<p>Exemplo:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">[{</span> <span class="ss">nome: </span><span class="s2">"João"</span><span class="p">,</span> <span class="ss">idade: </span><span class="mi">20</span> <span class="p">},</span> <span class="p">{</span> <span class="ss">nome: </span><span class="s2">"Ana"</span><span class="p">,</span> <span class="ss">idade: </span><span class="mi">25</span> <span class="p">}]</span>
</code></pre></div></div>

<h4 id="como-fazer-10">Como fazer?</h4>

<p>Vamos começar criando um array chamado <code class="language-plaintext highlighter-rouge">pessoas</code>, lembrando que um array é uma lista que segue uma ordem. Imagine ele como se fosse uma caixa vazia onde vamos guardar fichas de cadastro. Cada ficha terá o nome e a idade de uma pessoa. Por enquanto, a caixa está vazia.</p>

<p>Vamos também apresentar o programa e deixar uma linha em branco antes de pedir os dados para cadastrar.</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pessoas</span> <span class="o">=</span> <span class="p">[]</span>  <span class="c1"># Array que vai guardar os dados</span>

<span class="nb">puts</span> <span class="s2">"Programa para cadastrar pessoas"</span>
<span class="nb">puts</span> <span class="s2">""</span>
</code></pre></div></div>

<p>Agora, como o texto não deu detalhes de como quer que o sistema seja criado, existem várias formas de continuar o programa:</p>

<ul>
  <li>Podemos perguntar quantas pessoas serão cadastradas e executar um laço de repetição, como o <code class="language-plaintext highlighter-rouge">times</code> ou <code class="language-plaintext highlighter-rouge">for</code>, para pedir os dados até chegar no total de pessoas.</li>
  <li>Podemos definir um número máximo de pessoas que poderão ser cadastradas e impedir que o sistema cadastre novas pessoas quando atingir este número.</li>
  <li>Podemos assumir que não sabemos o número de pessoas que devem ser cadastradas e deixar o sistema fazer cadastros até que quem esteja cadastrando digite algo como <code class="language-plaintext highlighter-rouge">‘sair’</code>, assim podemos usar laços como o <code class="language-plaintext highlighter-rouge">loop</code> ou <code class="language-plaintext highlighter-rouge">while</code> para controlar o fluxo.</li>
</ul>

<p>Nesses casos nós não vamos pela implementação ou código mais simples, vamos pela alternativa que cobre o maior número de possibilidades. Então vamos assumir que não sabemos quantas pessoas serão cadastradas e vamos preparar o sistema para isso.</p>

<p>Vamos usar um <strong>loop infinito</strong>, que executará até que um <code class="language-plaintext highlighter-rouge">break</code> o interrompa com alguma condição.</p>

<p>Tudo que estiver entre <code class="language-plaintext highlighter-rouge">loop do</code> e o <code class="language-plaintext highlighter-rouge">end</code> correspondente será executado repetidamente. A palavra <code class="language-plaintext highlighter-rouge">do</code> marca o início do bloco.</p>

<p>Dentro desse loop vamos fazer tudo, pedir o nome, a idade, ler, validar, tratar erros e guardar o que estiver correto para exibir no final do programa.</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kp">loop</span> <span class="k">do</span>

<span class="k">end</span>
</code></pre></div></div>

<p>Primeiramente vamos pedir o nome que será cadastrado, informar que a palavra <code class="language-plaintext highlighter-rouge">‘sair’</code> pode ser usada para encerrar o programa, ler a entrada digitada e definir o <code class="language-plaintext highlighter-rouge">break</code> com a condição de parada que encerrará o <code class="language-plaintext highlighter-rouge">loop</code>, neste caso a condição é a palavra <code class="language-plaintext highlighter-rouge">‘sair’</code> ser digitada.</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="nb">print</span> <span class="s2">"Digite o nome da pessoa (ou 'sair' para encerrar): "</span>
  <span class="n">nome</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span> <span class="k">rescue</span> <span class="kp">nil</span>

  <span class="k">break</span> <span class="k">if</span> <span class="n">nome</span><span class="o">&amp;</span><span class="p">.</span><span class="nf">downcase</span> <span class="o">==</span> <span class="s2">"sair"</span>
</code></pre></div></div>

<p>Com <code class="language-plaintext highlighter-rouge">break if nome&amp;.downcase == "sair"</code> estamos dizendo: se o nome, após ser convertido para minúsculas, for igual a <code class="language-plaintext highlighter-rouge">"sair"</code>, interrompa o <code class="language-plaintext highlighter-rouge">loop</code>.</p>

<ul>
  <li>Com <code class="language-plaintext highlighter-rouge">nome&amp;.downcase</code>: O texto é convertido para letras minúsculas. Isso é muito bom porque assim o sistema vai aceitar, <code class="language-plaintext highlighter-rouge">"SAIR"</code>, <code class="language-plaintext highlighter-rouge">"Sair"</code> ou <code class="language-plaintext highlighter-rouge">"sAiR"</code> não importa, todas as formas de escrever serão tratadas como <code class="language-plaintext highlighter-rouge">"sair"</code>.</li>
  <li>Mas, e esse <code class="language-plaintext highlighter-rouge">&amp;</code> em <code class="language-plaintext highlighter-rouge">nome&amp;.downcase</code> o que é e o que ele faz?
    <ul>
      <li>Esse operador (<code class="language-plaintext highlighter-rouge">&amp;</code>) é chamado de <strong>safe navigation operator</strong> (operador de navegação segura em Português). Ele funciona assim: “se o <code class="language-plaintext highlighter-rouge">nome</code> não for <code class="language-plaintext highlighter-rouge">nil</code>, converta ele para minúsculas; mas se o nome for <code class="language-plaintext highlighter-rouge">nil</code>, não faça nada e retorne <code class="language-plaintext highlighter-rouge">nil</code>”.</li>
      <li>Tentar chamar o <code class="language-plaintext highlighter-rouge">.downcase</code> em alguma coisa que seja <code class="language-plaintext highlighter-rouge">nil</code> causaria um erro. Este operador vai a verificação antes e já evita que o erro aconteça.</li>
    </ul>
  </li>
</ul>

<p>Agora precisamos validar o nome. Não queremos aceitar nomes vazios, nomes que sejam só espaços em branco ou nomes que tenham apenas números. Afinal, ninguém se chama <code class="language-plaintext highlighter-rouge">"123"</code> ou <code class="language-plaintext highlighter-rouge">"   "</code>, certo? Então precisamos evitar que nomes assim consigam avançar no nosso código.</p>

<p>Como fazemos isso? Assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="k">if</span> <span class="n">nome</span><span class="p">.</span><span class="nf">nil?</span> <span class="o">||</span> <span class="n">nome</span><span class="p">.</span><span class="nf">strip</span><span class="p">.</span><span class="nf">empty?</span> <span class="o">||</span> <span class="n">nome</span><span class="p">.</span><span class="nf">delete</span><span class="p">(</span><span class="s2">"0-9 "</span><span class="p">).</span><span class="nf">empty?</span>
    <span class="nb">puts</span> <span class="s2">"Nome inválido. Tente novamente."</span>
    <span class="k">next</span>
  <span class="k">end</span>
</code></pre></div></div>

<p>O que estamos fazendo aqui?</p>

<p>Aqui testamos três condições com o operador <code class="language-plaintext highlighter-rouge">||</code>, onde se alguma for verdadeira, o nome é inválido:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">nome.nil?</code>: verifica se o nome é <code class="language-plaintext highlighter-rouge">nil</code>.</li>
  <li><code class="language-plaintext highlighter-rouge">nome.strip.empty?</code>: O método <code class="language-plaintext highlighter-rouge">strip</code> elimina os espaços em branco do começo e do fim do texto. Em seguida, <code class="language-plaintext highlighter-rouge">empty?</code> verifica se, após essa remoção, o texto ainda está vazio. Dessa forma, se a pessoa digitar apenas espaços em branco, o método irá detectar.</li>
  <li><code class="language-plaintext highlighter-rouge">nome.delete("0-9 ").empty?</code>: O método <code class="language-plaintext highlighter-rouge">delete</code> remove dígitos de 0 a 9 e espaços em branco do texto. Se o resultado for vazio, o que é verificado com o <code class="language-plaintext highlighter-rouge">empty?</code>, isso significa que o nome continha apenas números ou espaços, o que o tornam inválido.</li>
</ul>

<p>Se o nome for inválido, exibimos uma mensagem para a pessoa e usamos <code class="language-plaintext highlighter-rouge">next</code>. O <code class="language-plaintext highlighter-rouge">next</code> é como dizer: “pule o resto deste ciclo e volte para o começo do <code class="language-plaintext highlighter-rouge">loop</code>”. Ou seja, o programa vai pedir o nome de novo sem continuar para a parte da idade.</p>

<p>Se o nome for válido, o programa continua e agora vamos pedir a idade:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="nb">print</span> <span class="s2">"Digite a idade de </span><span class="si">#{</span><span class="n">nome</span><span class="si">}</span><span class="s2">: "</span>
  <span class="n">idade</span> <span class="o">=</span> <span class="no">Integer</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span> <span class="k">rescue</span> <span class="kp">nil</span>
</code></pre></div></div>

<p>Usamos <code class="language-plaintext highlighter-rouge">print</code> novamente para que a pessoa digite na mesma linha da pergunta. Repare que usamos <code class="language-plaintext highlighter-rouge">#{nome}</code> dentro da string, isso é a <strong>interpolação de strings</strong> do Ruby, ela coloca o valor da variável <code class="language-plaintext highlighter-rouge">nome</code> diretamente no meio do texto.</p>

<p>Para ler a idade, usamos <code class="language-plaintext highlighter-rouge">Integer(gets.chomp)</code>. O <code class="language-plaintext highlighter-rouge">gets.chomp</code> lê o que foi digitado e remove a quebra de linha, como já vimos. Mas dessa vez precisamos transformar esse texto em um número inteiro, porque a idade não é um texto, é um número. O método <code class="language-plaintext highlighter-rouge">Integer()</code> faz exatamente isso: tenta converter o texto para um número inteiro.</p>

<p>E se a pessoa digitar algo que não é um número, como <code class="language-plaintext highlighter-rouge">"abc"</code>? O <code class="language-plaintext highlighter-rouge">Integer()</code> vai dar erro. Mas como temos o <code class="language-plaintext highlighter-rouge">rescue nil</code> ali, em vez de o programa quebrar, ele simplesmente coloca <code class="language-plaintext highlighter-rouge">nil</code> na variável <code class="language-plaintext highlighter-rouge">idade</code>. Mesma lógica que usamos antes com o nome.</p>

<p>Agora vamos fazer as validações da idade:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="k">if</span> <span class="n">idade</span><span class="p">.</span><span class="nf">nil?</span> <span class="o">||</span> <span class="n">idade</span> <span class="o">&lt;=</span> <span class="mi">0</span> <span class="o">||</span> <span class="n">idade</span> <span class="o">&gt;</span> <span class="mi">120</span>
    <span class="nb">puts</span> <span class="s2">"Idade inválida. Tente novamente."</span>
    <span class="k">next</span>
  <span class="k">end</span>
</code></pre></div></div>

<p>Aqui também estamos fazendo três validações:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">idade.nil?</code>: se a conversão falhou (a pessoa digitou algo que não é um número), <code class="language-plaintext highlighter-rouge">idade</code> será <code class="language-plaintext highlighter-rouge">nil</code>. Aqui estamos verificando isso.</li>
  <li><code class="language-plaintext highlighter-rouge">idade &lt;= 0</code>: idade precisa ser um número positivo. Ninguém tem 0 anos ou idade negativa, por isso precisamos fazer essa validação no nosso cadastro.</li>
  <li><code class="language-plaintext highlighter-rouge">idade &gt; 120</code>: aqui estamos colocando um limite máximo para a idade inserida, 120 é um limite razoável. Se alguém digitar <code class="language-plaintext highlighter-rouge">999</code> ou <code class="language-plaintext highlighter-rouge">5000</code>, o sistema vai recusar.</li>
</ul>

<p>Se qualquer uma dessas condições for verdadeira, o programa exibe a mensagem de erro e volta ao início do <code class="language-plaintext highlighter-rouge">loop</code> com o <code class="language-plaintext highlighter-rouge">next</code>, pedindo para inserir a idade novamente.</p>

<p>Se tudo estiver certo, tanto o nome quanto a idade, finalmente vamos guardar os dados:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="n">pessoas</span> <span class="o">&lt;&lt;</span> <span class="p">{</span> <span class="ss">nome: </span><span class="n">nome</span><span class="p">,</span> <span class="ss">idade: </span><span class="n">idade</span> <span class="p">}</span>
  <span class="nb">puts</span> <span class="s2">"</span><span class="si">#{</span><span class="n">nome</span><span class="si">}</span><span class="s2"> cadastrada com sucesso!"</span>
  <span class="nb">puts</span> <span class="s2">""</span>
</code></pre></div></div>

<p>Aqui estamos usando o operador <code class="language-plaintext highlighter-rouge">&lt;&lt;</code> para adicionar ao final do array <code class="language-plaintext highlighter-rouge">pessoas</code> o <strong>hash</strong>: <code class="language-plaintext highlighter-rouge">{ nome: nome, idade: idade }</code>.</p>

<p>Pensa assim: <code class="language-plaintext highlighter-rouge">pessoas</code> é uma <strong>caixa de sapatos (</strong><code class="language-plaintext highlighter-rouge">array</code><strong>)</strong> onde você guarda as fichas de cadastro com as informações das pessoas cadastradas. O operador <code class="language-plaintext highlighter-rouge">&lt;&lt;</code> é o gesto de <strong>enfiar uma ficha nova</strong> dentro da caixa.</p>

<p>E a ficha nova é o hash: <code class="language-plaintext highlighter-rouge">{ nome: nome, idade: idade }</code>. Um hash é como uma ficha de cadastro de verdade, ele guarda informações em pares de <strong>chave e valor</strong>. Aqui temos duas chaves:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">nome:</code> com o valor sendo o nome que a pessoa digitou.</li>
  <li><code class="language-plaintext highlighter-rouge">idade:</code> com o valor sendo a idade que a pessoa digitou.</li>
</ul>

<p>Então, se cadastramos “Ana” com 25 anos, o array <code class="language-plaintext highlighter-rouge">pessoas</code> ficaria assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">[{</span> <span class="ss">nome: </span><span class="s2">"Ana"</span><span class="p">,</span> <span class="ss">idade: </span><span class="mi">25</span> <span class="p">}]</span>
</code></pre></div></div>

<p>Se depois cadastramos “João” com 30 anos, o array <code class="language-plaintext highlighter-rouge">pessoas</code> ficaria assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">[{</span> <span class="ss">nome: </span><span class="s2">"Ana"</span><span class="p">,</span> <span class="ss">idade: </span><span class="mi">25</span> <span class="p">},</span> <span class="p">{</span> <span class="ss">nome: </span><span class="s2">"João"</span><span class="p">,</span> <span class="ss">idade: </span><span class="mi">30</span> <span class="p">}]</span>
</code></pre></div></div>

<p>Cada hash é uma ficha, e o array é a caixa que guarda todas elas, em ordem.</p>

<p>Depois de guardar, exibimos uma mensagem de sucesso do cadastro e uma linha em branco para organizar visualmente a saída no terminal.</p>

<p>E o <code class="language-plaintext highlighter-rouge">loop</code> continua rodando, pedindo novos nomes e idades, até que a pessoa digite <code class="language-plaintext highlighter-rouge">"sair"</code>.</p>

<p>Quando a palavra <code class="language-plaintext highlighter-rouge">"sair"</code> é digitada, o <code class="language-plaintext highlighter-rouge">break</code> interrompe o <code class="language-plaintext highlighter-rouge">loop</code> e o programa segue para a parte final: exibir todas as pessoas que foram cadastradas.</p>

<p>Usamos:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">puts</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">Pessoas cadastradas:"</span>
<span class="n">pessoas</span><span class="p">.</span><span class="nf">each_with_index</span> <span class="k">do</span> <span class="o">|</span><span class="n">pessoa</span><span class="p">,</span> <span class="n">index</span><span class="o">|</span>
  <span class="nb">puts</span> <span class="s2">"</span><span class="si">#{</span><span class="n">index</span> <span class="o">+</span> <span class="mi">1</span><span class="si">}</span><span class="s2">. </span><span class="si">#{</span><span class="n">pessoa</span><span class="p">[</span><span class="ss">:nome</span><span class="p">]</span><span class="si">}</span><span class="s2"> - </span><span class="si">#{</span><span class="n">pessoa</span><span class="p">[</span><span class="ss">:idade</span><span class="p">]</span><span class="si">}</span><span class="s2"> anos"</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Onde:</p>

<p>O <code class="language-plaintext highlighter-rouge">\n</code> no início do <code class="language-plaintext highlighter-rouge">puts</code> adiciona uma linha em branco antes do título, só para deixar a saída mais organizada.</p>

<p>Depois usamos o método <code class="language-plaintext highlighter-rouge">each_with_index</code>. Ele percorre cada elemento do array <code class="language-plaintext highlighter-rouge">pessoas</code> e, para cada um, nos dá duas coisas:</p>

<p><code class="language-plaintext highlighter-rouge">pessoa</code>: o hash com os dados da pessoa atual (por exemplo, <code class="language-plaintext highlighter-rouge">{ nome: "Ana", idade: 25 }</code>).</p>

<p><code class="language-plaintext highlighter-rouge">index</code>: a posição dessa pessoa no array, começando do 0 (0, 1, 2, 3, e assim por diante…).</p>

<p>Como listas para humanos costumam começar do 1 e não do 0, usamos <code class="language-plaintext highlighter-rouge">index + 1</code> para exibir a numeração de forma mais natural.</p>

<p>Para acessar os valores dentro do hash, usamos <code class="language-plaintext highlighter-rouge">pessoa[:nome]</code> e <code class="language-plaintext highlighter-rouge">pessoa[:idade]</code>. Os dois pontos antes da palavra (<code class="language-plaintext highlighter-rouge">:nome</code>, <code class="language-plaintext highlighter-rouge">:idade</code>) indicam que estamos acessando uma chave do tipo <strong>símbolo</strong> (symbol) no hash.</p>

<p>Se cadastramos Ana (25 anos) e João (30 anos), a saída final será:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="no">Pessoas</span> <span class="ss">cadastradas:
</span><span class="mi">1</span><span class="o">.</span> <span class="no">Ana</span> <span class="o">-</span> <span class="mi">25</span> <span class="n">anos</span>
<span class="mi">2</span><span class="o">.</span> <span class="no">João</span> <span class="o">-</span> <span class="mi">30</span> <span class="n">anos</span>
</code></pre></div></div>

<p>E assim o programa encerra, mostrando todos os cadastros feitos durante a execução.</p>

<p>O código completo fica assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pessoas</span> <span class="o">=</span> <span class="p">[]</span>  <span class="c1"># Array que vai guardar os dados</span>

<span class="nb">puts</span> <span class="s2">"Programa para cadastrar pessoas"</span>
<span class="nb">puts</span> <span class="s2">""</span>

<span class="kp">loop</span> <span class="k">do</span>
  <span class="nb">print</span> <span class="s2">"Digite o nome da pessoa (ou 'sair' para encerrar): "</span>
  <span class="n">nome</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span> <span class="k">rescue</span> <span class="kp">nil</span>

  <span class="k">break</span> <span class="k">if</span> <span class="n">nome</span><span class="o">&amp;</span><span class="p">.</span><span class="nf">downcase</span> <span class="o">==</span> <span class="s2">"sair"</span>

  <span class="k">if</span> <span class="n">nome</span><span class="p">.</span><span class="nf">nil?</span> <span class="o">||</span> <span class="n">nome</span><span class="p">.</span><span class="nf">strip</span><span class="p">.</span><span class="nf">empty?</span> <span class="o">||</span> <span class="n">nome</span><span class="p">.</span><span class="nf">delete</span><span class="p">(</span><span class="s2">"0-9 "</span><span class="p">).</span><span class="nf">empty?</span>
    <span class="nb">puts</span> <span class="s2">"Nome inválido. Tente novamente."</span>
    <span class="k">next</span>
  <span class="k">end</span>

  <span class="nb">print</span> <span class="s2">"Digite a idade de </span><span class="si">#{</span><span class="n">nome</span><span class="si">}</span><span class="s2">: "</span>
  <span class="n">idade</span> <span class="o">=</span> <span class="no">Integer</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span> <span class="k">rescue</span> <span class="kp">nil</span>

  <span class="k">if</span> <span class="n">idade</span><span class="p">.</span><span class="nf">nil?</span> <span class="o">||</span> <span class="n">idade</span> <span class="o">&lt;=</span> <span class="mi">0</span> <span class="o">||</span> <span class="n">idade</span> <span class="o">&gt;</span> <span class="mi">120</span>
    <span class="nb">puts</span> <span class="s2">"Idade inválida. Tente novamente."</span>
    <span class="k">next</span>
  <span class="k">end</span>

  <span class="n">pessoas</span> <span class="o">&lt;&lt;</span> <span class="p">{</span> <span class="ss">nome: </span><span class="n">nome</span><span class="p">,</span> <span class="ss">idade: </span><span class="n">idade</span> <span class="p">}</span>
  <span class="nb">puts</span> <span class="s2">"</span><span class="si">#{</span><span class="n">nome</span><span class="si">}</span><span class="s2"> cadastrada com sucesso!"</span>
  <span class="nb">puts</span> <span class="s2">""</span>
<span class="k">end</span>

<span class="nb">puts</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">Pessoas cadastradas:"</span>
<span class="n">pessoas</span><span class="p">.</span><span class="nf">each_with_index</span> <span class="k">do</span> <span class="o">|</span><span class="n">pessoa</span><span class="p">,</span> <span class="n">index</span><span class="o">|</span>
  <span class="nb">puts</span> <span class="s2">"</span><span class="si">#{</span><span class="n">index</span> <span class="o">+</span> <span class="mi">1</span><span class="si">}</span><span class="s2">. </span><span class="si">#{</span><span class="n">pessoa</span><span class="p">[</span><span class="ss">:nome</span><span class="p">]</span><span class="si">}</span><span class="s2"> - </span><span class="si">#{</span><span class="n">pessoa</span><span class="p">[</span><span class="ss">:idade</span><span class="p">]</span><span class="si">}</span><span class="s2"> anos"</span>
<span class="k">end</span>
</code></pre></div></div>

<h3 id="programa-jogo-da-forca-básico">Programa jogo da forca básico</h3>
<hr />

<p>O computador sorteia uma palavra de uma lista e exibe apenas traços no lugar de cada letra. A pessoa tenta adivinhar a palavra digitando uma letra por vez. O programa aceita apenas letras válidas, impede que a mesma letra seja tentada mais de uma vez e avisa quando a letra está ou não está na palavra.</p>

<p>A pessoa tem 6 tentativas. Quando restam 3 ou menos, uma dica é exibida. Ao final de cada rodada, o programa informa se a pessoa ganhou ou perdeu, exibe o placar e pergunta se ela quer jogar novamente.</p>

<h4 id="como-fazer-11">Como fazer?</h4>

<p>Vamos dividir o problema em quatro partes:</p>

<ul>
  <li><strong>Parte 1:</strong> Configuração inicial dos dados e variáveis do jogo</li>
  <li><strong>Parte 2:</strong> O laço externo, que controla se a pessoa quer jogar mais uma rodada</li>
  <li><strong>Parte 3:</strong> O laço interno, que é a rodada em si</li>
  <li><strong>Parte 4:</strong> Encerramento e placar final</li>
</ul>

<p><strong>Parte 1: Configuração inicial</strong></p>

<p>Começamos definindo a lista de palavras do jogo. Um <code class="language-plaintext highlighter-rouge">array</code> é ideal para isso:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">palavras</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"abacaxi"</span><span class="p">,</span> <span class="s2">"elefante"</span><span class="p">,</span> <span class="s2">"programacao"</span><span class="p">,</span> <span class="s2">"computador"</span><span class="p">,</span> <span class="s2">"teclado"</span><span class="p">,</span> <span class="s2">"borboleta"</span><span class="p">,</span> <span class="s2">"chocolate"</span><span class="p">,</span> <span class="s2">"universo"</span><span class="p">]</span>
</code></pre></div></div>

<p>Note que todas as palavras estão em minúsculo e sem acentos. Isso facilita a comparação com as letras digitadas pela pessoa mais adiante, evitando problemas de acentuação.</p>

<p>Definimos o número máximo de tentativas em uma variável:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">max_tentativas</span> <span class="o">=</span> <span class="mi">6</span>
</code></pre></div></div>

<p>Usar uma variável em vez de escrever o número <code class="language-plaintext highlighter-rouge">6</code> diretamente no código é uma boa prática: se quisermos mudar o limite de tentativas no futuro, basta alterar em um único lugar.</p>

<p>Agora precisamos das dicas. Cada dica está associada a uma palavra específica, um relacionamento claro de <strong>chave e valor</strong>, ideal para um <code class="language-plaintext highlighter-rouge">hash</code>. Aqui usamos a notação com <code class="language-plaintext highlighter-rouge">=&gt;</code> (chamada de <em>hash rocket</em>) porque as chaves são strings:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">dicas</span> <span class="o">=</span> <span class="p">{</span>
  <span class="s2">"abacaxi"</span> <span class="o">=&gt;</span> <span class="s2">"É uma fruta tropical"</span><span class="p">,</span>
  <span class="s2">"elefante"</span> <span class="o">=&gt;</span> <span class="s2">"É o maior animal terrestre"</span><span class="p">,</span>
  <span class="s2">"programacao"</span> <span class="o">=&gt;</span> <span class="s2">"É o que estamos aprendendo agora"</span><span class="p">,</span>
  <span class="o">...</span>
<span class="p">}</span>
</code></pre></div></div>

<p>A chave é a palavra e o valor é a dica correspondente. Para buscar a dica de uma palavra específica, usaremos <code class="language-plaintext highlighter-rouge">dicas[palavra]</code> mais adiante.</p>

<p>Por fim, inicializamos os contadores de placar e exibimos a mensagem de boas-vindas:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">vitorias</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">derrotas</span> <span class="o">=</span> <span class="mi">0</span>

<span class="nb">puts</span> <span class="s2">"Receba as boas-vindas do Jogo da Forca!"</span>
<span class="nb">puts</span> <span class="s2">"Tente adivinhar a palavra secreta antes de esgotar suas tentativas."</span>
</code></pre></div></div>

<p><strong>Parte 2: O laço externo</strong></p>

<p>O laço externo controla se a pessoa quer jogar mais uma rodada. Usamos uma variável <code class="language-plaintext highlighter-rouge">jogar</code> iniciada como <code class="language-plaintext highlighter-rouge">true</code> para que o jogo comece imediatamente:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">jogar</span> <span class="o">=</span> <span class="kp">true</span>
<span class="k">while</span> <span class="n">jogar</span>
  <span class="o">...</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Enquanto <code class="language-plaintext highlighter-rouge">jogar</code> for <code class="language-plaintext highlighter-rouge">true</code>, o programa continua oferecendo novas rodadas. Ao final de cada uma, atualizamos <code class="language-plaintext highlighter-rouge">jogar</code> de acordo com a resposta da pessoa.</p>

<p>Dentro do <code class="language-plaintext highlighter-rouge">while jogar</code>, a primeira coisa é sortear uma palavra aleatória da lista usando o método <code class="language-plaintext highlighter-rouge">.sample</code>, que escolhe um elemento aleatório de um array:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">palavra</span> <span class="o">=</span> <span class="n">palavras</span><span class="p">.</span><span class="nf">sample</span>
</code></pre></div></div>

<p>A cada nova rodada, uma palavra diferente pode ser sorteada de forma imprevisível.</p>

<p>Depois inicializamos todas as variáveis que controlam o estado da rodada atual:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">letras_palavra</span> <span class="o">=</span> <span class="n">palavra</span><span class="p">.</span><span class="nf">chars</span>
<span class="n">letras_certas</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">letras_erradas</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">letras_tentadas</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">dica_exibida</span> <span class="o">=</span> <span class="kp">false</span>
<span class="n">rodada_ativa</span> <span class="o">=</span> <span class="kp">true</span>
</code></pre></div></div>

<p>Vamos entender cada uma:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">letras_palavra = palavra.chars</code>: O método <code class="language-plaintext highlighter-rouge">.chars</code> transforma a string em um array de caracteres. Por exemplo, <code class="language-plaintext highlighter-rouge">"gato".chars</code> vira <code class="language-plaintext highlighter-rouge">["g", "a", "t", "o"]</code>. Isso nos permite percorrer a palavra letra por letra.</li>
  <li><code class="language-plaintext highlighter-rouge">letras_certas = []</code>: Array vazio que vai guardar as letras que a pessoa acertou.</li>
  <li><code class="language-plaintext highlighter-rouge">letras_erradas = []</code>: Array vazio que vai guardar as letras erradas.</li>
  <li><code class="language-plaintext highlighter-rouge">letras_tentadas = []</code>: Array vazio que reúne todas as letras já tentadas nesta rodada, certas ou erradas. Serve para impedir que a pessoa repita uma letra.</li>
  <li><code class="language-plaintext highlighter-rouge">dica_exibida = false</code>: Uma variável “bandeira” (<em>flag</em>) que controla se a dica já foi mostrada. Queremos exibi-la apenas uma vez por rodada.</li>
  <li><code class="language-plaintext highlighter-rouge">rodada_ativa = true</code>: Outra variável “bandeira” que controla se a rodada ainda está em andamento. Quando a pessoa ganhar ou perder, ela vai para <code class="language-plaintext highlighter-rouge">false</code> e o laço interno se encerra.</li>
</ul>

<p><strong>Parte 3: O laço interno</strong></p>

<p>O laço interno roda enquanto a rodada estiver ativa:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">while</span> <span class="n">rodada_ativa</span>
  <span class="o">...</span>
<span class="k">end</span>
</code></pre></div></div>

<p>A primeira coisa dentro desse laço é construir e exibir a palavra com as letras descobertas e traços no lugar das restantes. Fazemos isso com o método <code class="language-plaintext highlighter-rouge">.map</code>:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">exibicao</span> <span class="o">=</span> <span class="n">letras_palavra</span><span class="p">.</span><span class="nf">map</span> <span class="p">{</span> <span class="o">|</span><span class="n">l</span><span class="o">|</span> <span class="n">letras_certas</span><span class="p">.</span><span class="nf">include?</span><span class="p">(</span><span class="n">l</span><span class="p">)</span> <span class="p">?</span> <span class="n">l</span> <span class="p">:</span> <span class="s2">"_"</span> <span class="p">}.</span><span class="nf">join</span><span class="p">(</span><span class="s2">" "</span><span class="p">)</span>
</code></pre></div></div>

<p>Essa linha tem algumas partes novas. Vamos destrinchá-la:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">letras_palavra.map { |l| ... }</code>: O <code class="language-plaintext highlighter-rouge">.map</code> percorre cada elemento do array <code class="language-plaintext highlighter-rouge">letras_palavra</code> e transforma cada letra em outra coisa. Para cada letra <code class="language-plaintext highlighter-rouge">l</code>, o bloco <code class="language-plaintext highlighter-rouge">{ |l| ... }</code> decide o que colocar no lugar.</li>
  <li><code class="language-plaintext highlighter-rouge">letras_certas.include?(l) ? l : "_"</code>: Essa é uma <strong>expressão ternária</strong>, uma forma compacta de escrever um <code class="language-plaintext highlighter-rouge">if/else</code> em linha única. Ela funciona assim:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">letras_certas.include?(l)</code> — “a letra <code class="language-plaintext highlighter-rouge">l</code> está na lista de letras certas?”</li>
      <li><code class="language-plaintext highlighter-rouge">?</code> — “se sim…”</li>
      <li><code class="language-plaintext highlighter-rouge">l</code> — “…deixe a letra aparecer”</li>
      <li><code class="language-plaintext highlighter-rouge">:</code> — “se não…”</li>
      <li><code class="language-plaintext highlighter-rouge">"_"</code> — “…coloque um traço”</li>
    </ul>
  </li>
  <li><code class="language-plaintext highlighter-rouge">.join(" ")</code>: Após o <code class="language-plaintext highlighter-rouge">.map</code> transformar o array, o <code class="language-plaintext highlighter-rouge">.join(" ")</code> junta todos os elementos em uma única string, separando cada um por um espaço. Assim <code class="language-plaintext highlighter-rouge">["_", "a", "_", "_"]</code> vira <code class="language-plaintext highlighter-rouge">"_ a _ _"</code>.</li>
</ul>

<p>Depois exibimos o estado atual da rodada:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">tentativas_restantes</span> <span class="o">=</span> <span class="n">max_tentativas</span> <span class="o">-</span> <span class="n">letras_erradas</span><span class="p">.</span><span class="nf">size</span>
<span class="nb">puts</span> <span class="s2">""</span>
<span class="nb">puts</span> <span class="s2">"Palavra: </span><span class="si">#{</span><span class="n">exibicao</span><span class="si">}</span><span class="s2">"</span>
<span class="nb">puts</span> <span class="s2">"Letras erradas: </span><span class="si">#{</span><span class="n">letras_erradas</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="s1">', '</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span> <span class="k">unless</span> <span class="n">letras_erradas</span><span class="p">.</span><span class="nf">empty?</span>
<span class="nb">puts</span> <span class="s2">"Tentativas restantes: </span><span class="si">#{</span><span class="n">tentativas_restantes</span><span class="si">}</span><span class="s2">"</span>
</code></pre></div></div>

<p>Note o uso de <code class="language-plaintext highlighter-rouge">unless</code> em <code class="language-plaintext highlighter-rouge">puts "Letras erradas: ..." unless letras_erradas.empty?</code>. O <code class="language-plaintext highlighter-rouge">unless</code> é o oposto do <code class="language-plaintext highlighter-rouge">if</code>: ele executa a instrução somente quando a condição é <strong>falsa</strong>. Aqui estamos dizendo “exiba as letras erradas, a não ser que o array esteja vazio”. Isso evita mostrar uma linha “Letras erradas:” sem nada logo nas primeiras tentativas.</p>

<p>Depois verificamos se a pessoa ganhou. Quando não há mais nenhum <code class="language-plaintext highlighter-rouge">"_"</code> na exibição, todas as letras foram descobertas:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">unless</span> <span class="n">exibicao</span><span class="p">.</span><span class="nf">include?</span><span class="p">(</span><span class="s2">"_"</span><span class="p">)</span>
  <span class="n">vitorias</span> <span class="o">+=</span> <span class="mi">1</span>
  <span class="nb">puts</span> <span class="s2">"Parabéns! Você descobriu a palavra: </span><span class="si">#{</span><span class="n">palavra</span><span class="si">}</span><span class="s2">!"</span>
  <span class="n">rodada_ativa</span> <span class="o">=</span> <span class="kp">false</span>
  <span class="k">next</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Se não há <code class="language-plaintext highlighter-rouge">"_"</code> na <code class="language-plaintext highlighter-rouge">exibicao</code>, a pessoa ganhou: somamos 1 às vitórias, exibimos a mensagem e definimos <code class="language-plaintext highlighter-rouge">rodada_ativa = false</code>. O <code class="language-plaintext highlighter-rouge">next</code> pula para a próxima iteração do <code class="language-plaintext highlighter-rouge">while rodada_ativa</code>, que vai verificar a condição novamente. Como agora é <code class="language-plaintext highlighter-rouge">false</code>, o laço interno encerra.</p>

<p>Em seguida verificamos se a pessoa perdeu:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="n">tentativas_restantes</span> <span class="o">&lt;=</span> <span class="mi">0</span>
  <span class="n">derrotas</span> <span class="o">+=</span> <span class="mi">1</span>
  <span class="nb">puts</span> <span class="s2">"Você perdeu! A palavra era: </span><span class="si">#{</span><span class="n">palavra</span><span class="si">}</span><span class="s2">."</span>
  <span class="n">rodada_ativa</span> <span class="o">=</span> <span class="kp">false</span>
  <span class="k">next</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Se as tentativas chegaram a zero, a lógica é a mesma: somamos 1 às derrotas, exibimos a mensagem e encerramos a rodada com <code class="language-plaintext highlighter-rouge">rodada_ativa = false</code> e <code class="language-plaintext highlighter-rouge">next</code>.</p>

<p>Agora verificamos se é hora de exibir a dica. Queremos mostrá-la apenas uma vez, quando restam 3 ou menos tentativas:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="o">!</span><span class="n">dica_exibida</span> <span class="o">&amp;&amp;</span> <span class="n">tentativas_restantes</span> <span class="o">&lt;=</span> <span class="mi">3</span>
  <span class="nb">puts</span> <span class="s2">"Dica: </span><span class="si">#{</span><span class="n">dicas</span><span class="p">[</span><span class="n">palavra</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span>
  <span class="n">dica_exibida</span> <span class="o">=</span> <span class="kp">true</span>
<span class="k">end</span>
</code></pre></div></div>

<p>As duas condições precisam ser verdadeiras ao mesmo tempo (<code class="language-plaintext highlighter-rouge">&amp;&amp;</code>):</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">!dica_exibida</code>: a dica ainda não foi exibida. O <code class="language-plaintext highlighter-rouge">!</code> inverte o valor: se <code class="language-plaintext highlighter-rouge">dica_exibida</code> é <code class="language-plaintext highlighter-rouge">false</code>, então <code class="language-plaintext highlighter-rouge">!dica_exibida</code> é <code class="language-plaintext highlighter-rouge">true</code>.</li>
  <li><code class="language-plaintext highlighter-rouge">tentativas_restantes &lt;= 3</code>: restam 3 ou menos tentativas.</li>
</ul>

<p>Quando exibimos a dica, marcamos <code class="language-plaintext highlighter-rouge">dica_exibida = true</code> para que ela não apareça novamente nas próximas iterações da mesma rodada.</p>

<p>Agora vem o bloco de leitura e validação da letra. Precisamos garantir que a entrada seja uma única letra do alfabeto e que ainda não tenha sido tentada:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">letra</span> <span class="o">=</span> <span class="kp">nil</span>

<span class="k">while</span> <span class="n">letra</span><span class="p">.</span><span class="nf">nil?</span>
  <span class="nb">print</span> <span class="s2">"Digite uma letra: "</span>
  <span class="n">entrada</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">.</span><span class="nf">downcase</span>

  <span class="k">unless</span> <span class="p">(</span><span class="s2">"a"</span><span class="o">..</span><span class="s2">"z"</span><span class="p">).</span><span class="nf">include?</span><span class="p">(</span><span class="n">entrada</span><span class="p">)</span>
    <span class="nb">puts</span> <span class="s2">"Entrada inválida! Digite apenas uma letra."</span>
    <span class="k">next</span>
  <span class="k">end</span>

  <span class="k">if</span> <span class="n">letras_tentadas</span><span class="p">.</span><span class="nf">include?</span><span class="p">(</span><span class="n">entrada</span><span class="p">)</span>
    <span class="nb">puts</span> <span class="s2">"Você já tentou essa letra! Tente outra."</span>
    <span class="k">next</span>
  <span class="k">end</span>

  <span class="n">letra</span> <span class="o">=</span> <span class="n">entrada</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Iniciamos <code class="language-plaintext highlighter-rouge">letra</code> como <code class="language-plaintext highlighter-rouge">nil</code> e usamos <code class="language-plaintext highlighter-rouge">while letra.nil?</code> para repetir enquanto não tivermos uma entrada válida.</p>

<p>Dentro do laço:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">gets.chomp.downcase</code>: lê a entrada, remove o <code class="language-plaintext highlighter-rouge">Enter</code> e converte para minúsculo. Assim <code class="language-plaintext highlighter-rouge">"A"</code> e <code class="language-plaintext highlighter-rouge">"a"</code> são tratados da mesma forma.</li>
  <li><code class="language-plaintext highlighter-rouge">("a".."z").include?(entrada)</code>: O intervalo <code class="language-plaintext highlighter-rouge">("a".."z")</code> representa todas as letras do alfabeto de “a” até “z”. O <code class="language-plaintext highlighter-rouge">.include?</code> verifica se o que foi digitado está dentro desse intervalo. Se a pessoa digitou um número, um espaço ou mais de uma letra, a condição falha e o programa informa o erro.</li>
  <li><code class="language-plaintext highlighter-rouge">letras_tentadas.include?(entrada)</code>: verifica se essa letra já foi tentada nesta rodada.</li>
</ul>

<p>Só quando a entrada passa pelas duas verificações ela é atribuída à variável <code class="language-plaintext highlighter-rouge">letra</code>, encerrando o <code class="language-plaintext highlighter-rouge">while letra.nil?</code>.</p>

<p>Por fim, verificamos se a letra está na palavra e atualizamos os arrays:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">letras_tentadas</span> <span class="o">&lt;&lt;</span> <span class="n">letra</span>
<span class="k">if</span> <span class="n">palavra</span><span class="p">.</span><span class="nf">include?</span><span class="p">(</span><span class="n">letra</span><span class="p">)</span>
  <span class="n">letras_certas</span> <span class="o">&lt;&lt;</span> <span class="n">letra</span>
  <span class="nb">puts</span> <span class="s2">"Boa! A letra '</span><span class="si">#{</span><span class="n">letra</span><span class="si">}</span><span class="s2">' está na palavra."</span>
<span class="k">else</span>
  <span class="n">letras_erradas</span> <span class="o">&lt;&lt;</span> <span class="n">letra</span>
  <span class="nb">puts</span> <span class="s2">"A letra '</span><span class="si">#{</span><span class="n">letra</span><span class="si">}</span><span class="s2">' não está na palavra."</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Independentemente de acerto ou erro, sempre adicionamos a letra em <code class="language-plaintext highlighter-rouge">letras_tentadas</code> para que não possa ser tentada novamente. Se acertou, vai também para <code class="language-plaintext highlighter-rouge">letras_certas</code>; se errou, vai para <code class="language-plaintext highlighter-rouge">letras_erradas</code>.</p>

<p><strong>Parte 4: Encerramento da rodada</strong></p>

<p>Após o laço interno terminar, exibimos o placar parcial e perguntamos se a pessoa quer jogar de novo:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">puts</span> <span class="s2">""</span>
<span class="nb">puts</span> <span class="s2">"Placar: </span><span class="si">#{</span><span class="n">vitorias</span><span class="si">}</span><span class="s2"> vitória(s) | </span><span class="si">#{</span><span class="n">derrotas</span><span class="si">}</span><span class="s2"> derrota(s)"</span>

<span class="n">resposta</span> <span class="o">=</span> <span class="kp">nil</span>

<span class="k">while</span> <span class="n">resposta</span> <span class="o">!=</span> <span class="s2">"s"</span> <span class="o">&amp;&amp;</span> <span class="n">resposta</span> <span class="o">!=</span> <span class="s2">"n"</span>
  <span class="nb">puts</span> <span class="s2">""</span>
  <span class="nb">print</span> <span class="s2">"Deseja jogar novamente? (s para sim ou n para não): "</span>
  <span class="n">resposta</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">.</span><span class="nf">downcase</span>
  <span class="nb">puts</span> <span class="s2">"Resposta inválida! Por favor, digite 's' para sim ou 'n' para não."</span> <span class="k">unless</span> <span class="n">resposta</span> <span class="o">==</span> <span class="s2">"s"</span> <span class="o">||</span> <span class="n">resposta</span> <span class="o">==</span> <span class="s2">"n"</span>
<span class="k">end</span>

<span class="n">jogar</span> <span class="o">=</span> <span class="n">resposta</span> <span class="o">==</span> <span class="s2">"s"</span>
</code></pre></div></div>

<p>A linha <code class="language-plaintext highlighter-rouge">jogar = resposta == "s"</code> é uma atribuição direta: a expressão <code class="language-plaintext highlighter-rouge">resposta == "s"</code> retorna <code class="language-plaintext highlighter-rouge">true</code> se a resposta for “s” e <code class="language-plaintext highlighter-rouge">false</code> se for “n”. Esse valor vai direto para a variável <code class="language-plaintext highlighter-rouge">jogar</code>. Se <code class="language-plaintext highlighter-rouge">jogar</code> for <code class="language-plaintext highlighter-rouge">false</code>, o <code class="language-plaintext highlighter-rouge">while jogar</code> do laço externo não se repete e o programa avança para o placar final.</p>

<p>Ao sair do laço externo, exibimos o placar final e encerramos:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">puts</span> <span class="s2">""</span>
<span class="nb">puts</span> <span class="s2">"Placar final: </span><span class="si">#{</span><span class="n">vitorias</span><span class="si">}</span><span class="s2"> vitória(s) | </span><span class="si">#{</span><span class="n">derrotas</span><span class="si">}</span><span class="s2"> derrota(s)"</span>
<span class="nb">puts</span> <span class="s2">"Obrigado por jogar! Até a próxima!"</span>
</code></pre></div></div>

<p>O código do jogo da forca completo fica assim:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">palavras</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"abacaxi"</span><span class="p">,</span> <span class="s2">"elefante"</span><span class="p">,</span> <span class="s2">"programacao"</span><span class="p">,</span> <span class="s2">"computador"</span><span class="p">,</span> <span class="s2">"teclado"</span><span class="p">,</span> <span class="s2">"borboleta"</span><span class="p">,</span> <span class="s2">"chocolate"</span><span class="p">,</span> <span class="s2">"universo"</span><span class="p">]</span>
<span class="n">max_tentativas</span> <span class="o">=</span> <span class="mi">6</span>

<span class="n">dicas</span> <span class="o">=</span> <span class="p">{</span>
  <span class="s2">"abacaxi"</span> <span class="o">=&gt;</span> <span class="s2">"É uma fruta tropical"</span><span class="p">,</span>
  <span class="s2">"elefante"</span> <span class="o">=&gt;</span> <span class="s2">"É o maior animal terrestre"</span><span class="p">,</span>
  <span class="s2">"programacao"</span> <span class="o">=&gt;</span> <span class="s2">"É o que estamos aprendendo agora"</span><span class="p">,</span>
  <span class="s2">"computador"</span> <span class="o">=&gt;</span> <span class="s2">"Máquina que você está usando"</span><span class="p">,</span>
  <span class="s2">"teclado"</span> <span class="o">=&gt;</span> <span class="s2">"Periférico usado para digitar"</span><span class="p">,</span>
  <span class="s2">"borboleta"</span> <span class="o">=&gt;</span> <span class="s2">"Inseto com asas coloridas"</span><span class="p">,</span>
  <span class="s2">"chocolate"</span> <span class="o">=&gt;</span> <span class="s2">"Doce feito de cacau"</span><span class="p">,</span>
  <span class="s2">"universo"</span> <span class="o">=&gt;</span> <span class="s2">"Tudo que existe no espaço"</span>
<span class="p">}</span>

<span class="n">vitorias</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">derrotas</span> <span class="o">=</span> <span class="mi">0</span>

<span class="nb">puts</span> <span class="s2">"Receba as boas-vindas do Jogo da Forca!"</span>
<span class="nb">puts</span> <span class="s2">"Tente adivinhar a palavra secreta antes de esgotar suas tentativas."</span>

<span class="n">jogar</span> <span class="o">=</span> <span class="kp">true</span>
<span class="k">while</span> <span class="n">jogar</span>
  <span class="n">palavra</span> <span class="o">=</span> <span class="n">palavras</span><span class="p">.</span><span class="nf">sample</span>
  <span class="n">letras_palavra</span> <span class="o">=</span> <span class="n">palavra</span><span class="p">.</span><span class="nf">chars</span>
  <span class="n">letras_certas</span> <span class="o">=</span> <span class="p">[]</span>
  <span class="n">letras_erradas</span> <span class="o">=</span> <span class="p">[]</span>
  <span class="n">letras_tentadas</span> <span class="o">=</span> <span class="p">[]</span>
  <span class="n">dica_exibida</span> <span class="o">=</span> <span class="kp">false</span>
  <span class="n">rodada_ativa</span> <span class="o">=</span> <span class="kp">true</span>

  <span class="k">while</span> <span class="n">rodada_ativa</span>
    <span class="c1"># Exibe a palavra com as letras descobertas</span>
    <span class="n">exibicao</span> <span class="o">=</span> <span class="n">letras_palavra</span><span class="p">.</span><span class="nf">map</span> <span class="p">{</span> <span class="o">|</span><span class="n">l</span><span class="o">|</span> <span class="n">letras_certas</span><span class="p">.</span><span class="nf">include?</span><span class="p">(</span><span class="n">l</span><span class="p">)</span> <span class="p">?</span> <span class="n">l</span> <span class="p">:</span> <span class="s2">"_"</span> <span class="p">}.</span><span class="nf">join</span><span class="p">(</span><span class="s2">" "</span><span class="p">)</span>
    <span class="n">tentativas_restantes</span> <span class="o">=</span> <span class="n">max_tentativas</span> <span class="o">-</span> <span class="n">letras_erradas</span><span class="p">.</span><span class="nf">size</span>
    <span class="nb">puts</span> <span class="s2">""</span>
    <span class="nb">puts</span> <span class="s2">"Palavra: </span><span class="si">#{</span><span class="n">exibicao</span><span class="si">}</span><span class="s2">"</span>
    <span class="nb">puts</span> <span class="s2">"Letras erradas: </span><span class="si">#{</span><span class="n">letras_erradas</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="s1">', '</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span> <span class="k">unless</span> <span class="n">letras_erradas</span><span class="p">.</span><span class="nf">empty?</span>
    <span class="nb">puts</span> <span class="s2">"Tentativas restantes: </span><span class="si">#{</span><span class="n">tentativas_restantes</span><span class="si">}</span><span class="s2">"</span>

    <span class="c1"># Verifica se ganhou</span>
    <span class="k">unless</span> <span class="n">exibicao</span><span class="p">.</span><span class="nf">include?</span><span class="p">(</span><span class="s2">"_"</span><span class="p">)</span>
      <span class="n">vitorias</span> <span class="o">+=</span> <span class="mi">1</span>
      <span class="nb">puts</span> <span class="s2">"Parabéns! Você descobriu a palavra: </span><span class="si">#{</span><span class="n">palavra</span><span class="si">}</span><span class="s2">!"</span>
      <span class="n">rodada_ativa</span> <span class="o">=</span> <span class="kp">false</span>
      <span class="k">next</span>
    <span class="k">end</span>

    <span class="c1"># Verifica se perdeu</span>
    <span class="k">if</span> <span class="n">tentativas_restantes</span> <span class="o">&lt;=</span> <span class="mi">0</span>
      <span class="n">derrotas</span> <span class="o">+=</span> <span class="mi">1</span>
      <span class="nb">puts</span> <span class="s2">"Você perdeu! A palavra era: </span><span class="si">#{</span><span class="n">palavra</span><span class="si">}</span><span class="s2">."</span>
      <span class="n">rodada_ativa</span> <span class="o">=</span> <span class="kp">false</span>
      <span class="k">next</span>
    <span class="k">end</span>

    <span class="c1"># Exibe dica quando restam 3 tentativas ou menos</span>
    <span class="k">if</span> <span class="o">!</span><span class="n">dica_exibida</span> <span class="o">&amp;&amp;</span> <span class="n">tentativas_restantes</span> <span class="o">&lt;=</span> <span class="mi">3</span>
      <span class="nb">puts</span> <span class="s2">"Dica: </span><span class="si">#{</span><span class="n">dicas</span><span class="p">[</span><span class="n">palavra</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span>
      <span class="n">dica_exibida</span> <span class="o">=</span> <span class="kp">true</span>
    <span class="k">end</span>

    <span class="c1"># Entrada do jogador</span>
    <span class="n">letra</span> <span class="o">=</span> <span class="kp">nil</span>

    <span class="k">while</span> <span class="n">letra</span><span class="p">.</span><span class="nf">nil?</span>
      <span class="nb">print</span> <span class="s2">"Digite uma letra: "</span>
      <span class="n">entrada</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">.</span><span class="nf">downcase</span>

      <span class="k">unless</span> <span class="p">(</span><span class="s2">"a"</span><span class="o">..</span><span class="s2">"z"</span><span class="p">).</span><span class="nf">include?</span><span class="p">(</span><span class="n">entrada</span><span class="p">)</span>
        <span class="nb">puts</span> <span class="s2">"Entrada inválida! Digite apenas uma letra."</span>
        <span class="k">next</span>
      <span class="k">end</span>

      <span class="k">if</span> <span class="n">letras_tentadas</span><span class="p">.</span><span class="nf">include?</span><span class="p">(</span><span class="n">entrada</span><span class="p">)</span>
        <span class="nb">puts</span> <span class="s2">"Você já tentou essa letra! Tente outra."</span>
        <span class="k">next</span>
      <span class="k">end</span>

      <span class="n">letra</span> <span class="o">=</span> <span class="n">entrada</span>
    <span class="k">end</span>

    <span class="c1"># Verifica se a letra está na palavra</span>
    <span class="n">letras_tentadas</span> <span class="o">&lt;&lt;</span> <span class="n">letra</span>
    <span class="k">if</span> <span class="n">palavra</span><span class="p">.</span><span class="nf">include?</span><span class="p">(</span><span class="n">letra</span><span class="p">)</span>
      <span class="n">letras_certas</span> <span class="o">&lt;&lt;</span> <span class="n">letra</span>
      <span class="nb">puts</span> <span class="s2">"Boa! A letra '</span><span class="si">#{</span><span class="n">letra</span><span class="si">}</span><span class="s2">' está na palavra."</span>
    <span class="k">else</span>
      <span class="n">letras_erradas</span> <span class="o">&lt;&lt;</span> <span class="n">letra</span>
      <span class="nb">puts</span> <span class="s2">"A letra '</span><span class="si">#{</span><span class="n">letra</span><span class="si">}</span><span class="s2">' não está na palavra."</span>
    <span class="k">end</span>
  <span class="k">end</span>

  <span class="nb">puts</span> <span class="s2">""</span>
  <span class="nb">puts</span> <span class="s2">"Placar: </span><span class="si">#{</span><span class="n">vitorias</span><span class="si">}</span><span class="s2"> vitória(s) | </span><span class="si">#{</span><span class="n">derrotas</span><span class="si">}</span><span class="s2"> derrota(s)"</span>

  <span class="c1"># Pergunta se deseja jogar novamente</span>
  <span class="n">resposta</span> <span class="o">=</span> <span class="kp">nil</span>

  <span class="k">while</span> <span class="n">resposta</span> <span class="o">!=</span> <span class="s2">"s"</span> <span class="o">&amp;&amp;</span> <span class="n">resposta</span> <span class="o">!=</span> <span class="s2">"n"</span>
    <span class="nb">puts</span> <span class="s2">""</span>
    <span class="nb">print</span> <span class="s2">"Deseja jogar novamente? (s para sim ou n para não): "</span>
    <span class="n">resposta</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">.</span><span class="nf">downcase</span>
    <span class="nb">puts</span> <span class="s2">"Resposta inválida! Por favor, digite 's' para sim ou 'n' para não."</span> <span class="k">unless</span> <span class="n">resposta</span> <span class="o">==</span> <span class="s2">"s"</span> <span class="o">||</span> <span class="n">resposta</span> <span class="o">==</span> <span class="s2">"n"</span>
  <span class="k">end</span>

  <span class="n">jogar</span> <span class="o">=</span> <span class="n">resposta</span> <span class="o">==</span> <span class="s2">"s"</span>
<span class="k">end</span>

<span class="nb">puts</span> <span class="s2">""</span>
<span class="nb">puts</span> <span class="s2">"Placar final: </span><span class="si">#{</span><span class="n">vitorias</span><span class="si">}</span><span class="s2"> vitória(s) | </span><span class="si">#{</span><span class="n">derrotas</span><span class="si">}</span><span class="s2"> derrota(s)"</span>
<span class="nb">puts</span> <span class="s2">"Obrigado por jogar! Até a próxima!"</span>
</code></pre></div></div>

<h2 id="resumo">Resumo</h2>
<hr />

<p>Neste artigo, praticamos os conceitos fundamentais da programação em Ruby por meio de doze exercícios organizados em três níveis de dificuldade.</p>

<p>No <strong>nível básico</strong>, criamos programas curtos para exercitar os conceitos mais essenciais. Escrevemos uma saudação personalizada usando variáveis, <code class="language-plaintext highlighter-rouge">puts</code>, <code class="language-plaintext highlighter-rouge">print</code>, <code class="language-plaintext highlighter-rouge">gets.chomp</code> e interpolação de strings. Calculamos a idade aproximada de uma pessoa a partir do ano de nascimento, aplicando validação de entrada com <code class="language-plaintext highlighter-rouge">while</code>, <code class="language-plaintext highlighter-rouge">rescue</code> e <code class="language-plaintext highlighter-rouge">Time.now.year</code>. E verificamos se um número é par ou ímpar usando o operador de módulo <code class="language-plaintext highlighter-rouge">%</code> e uma estrutura <code class="language-plaintext highlighter-rouge">if/else</code>.</p>

<p>No <strong>nível intermediário</strong>, os exercícios passaram a combinar estruturas de repetição com lógica mais elaborada. Geramos a tabuada de um número com <code class="language-plaintext highlighter-rouge">for</code>, <code class="language-plaintext highlighter-rouge">while</code> e <code class="language-plaintext highlighter-rouge">each</code>. Contamos vogais em uma frase usando <code class="language-plaintext highlighter-rouge">each_char</code> e corrigindo acentos com o método <code class="language-plaintext highlighter-rouge">tr</code>. Verificamos se um número é primo com a técnica da variável “bandeira” (<em>flag</em>) e o comando <code class="language-plaintext highlighter-rouge">break</code>. Somamos uma quantidade variável de números usando o método <code class="language-plaintext highlighter-rouge">times</code>, acumuladores e tratamento de erros com <code class="language-plaintext highlighter-rouge">begin/rescue</code>. Calculamos a sequência de Fibonacci, entendendo como a ordem de atualização das variáveis define o próximo termo. E criamos um jogo de adivinhação de número secreto com <code class="language-plaintext highlighter-rouge">rand</code>, <code class="language-plaintext highlighter-rouge">while</code>, <code class="language-plaintext highlighter-rouge">next</code> e <code class="language-plaintext highlighter-rouge">break</code>.</p>

<p>No <strong>nível avançado</strong>, os desafios exigiram pensar no programa como um sistema completo. Construímos um conversor de dias, horas ou minutos em segundos, com menu de opções usando <code class="language-plaintext highlighter-rouge">case/when</code> e um <code class="language-plaintext highlighter-rouge">loop</code> externo para permitir múltiplas conversões na mesma execução. Criamos um sistema de cadastro de pessoas que armazena os dados em um array de hashes e exibe a lista ao final com <code class="language-plaintext highlighter-rouge">each_with_index</code>. E implementamos um jogo da forca, combinando <code class="language-plaintext highlighter-rouge">.sample</code>, <code class="language-plaintext highlighter-rouge">.chars</code>, <code class="language-plaintext highlighter-rouge">.map</code>, expressão ternária, <code class="language-plaintext highlighter-rouge">.join</code> e variáveis “bandeira” para controlar o estado de cada rodada.</p>

<p>A prática continua sendo a forma mais eficaz de fixar o que foi aprendido. A cada novo programa escrito, mesmo que com erros, o raciocínio lógico vai ficando mais natural e a leitura de código mais fluida. Nenhum desses doze programas é o jeito único e definitivo de resolver o problema: são pontos de partida para explorar, modificar e melhorar.</p>]]></content><author><name>Louise Suelen</name></author><category term="Programação" /><category term="programação" /><category term="tecnologia" /><summary type="html"><![CDATA[Chegou a hora de praticar todo o conhecimento adquirido na série de posts sobre introdução à programação! Neste artigo, você encontrará uma variedade de exercícios para colocar em prática o que aprendeu.]]></summary></entry><entry xml:lang="pt-BR"><title type="html">Introdução à Programação: Estruturas de Repetição em Ruby</title><link href="https://pcdnaescola.com.br/introducao-a-programacao-estruturas-de-repeticao-em-ruby/" rel="alternate" type="text/html" title="Introdução à Programação: Estruturas de Repetição em Ruby" /><published>2025-10-12T13:00:00+00:00</published><updated>2025-10-12T13:00:00+00:00</updated><id>https://pcdnaescola.com.br/introducao-a-programacao-estruturas-de-repeticao-em-ruby</id><content type="html" xml:base="https://pcdnaescola.com.br/introducao-a-programacao-estruturas-de-repeticao-em-ruby/"><![CDATA[<div class="text-center">
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://imagedelivery.net/Ruw4waFkOelbXULIoE-oQg/72672341-de1e-43f7-f4d9-f92e5f53c200/public" alt="" loading="lazy" aria-hidden="true" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

</div>

<h2 id="apresentacao">Apresentação</h2>
<hr />

<p>A partir de agora os programas que estão sendo desenvolvidos ganharão novas capacidades. Vamos pensar na pergunta: Como fazer um programa executar uma tarefa várias vezes sem precisar escrever o mesmo código várias vezes?</p>

<p>A resposta para essa pergunta está nas estruturas de repetição, elas servem para executar um mesmo trecho de código várias vezes, até que uma condição seja atendida (ou enquanto essa condição for verdadeira ou falsa, dependendo do tipo de estrutura usada).</p>

<p>Em outras palavras, você pode repetir o mesmo trecho de código quantas vezes forem necessárias, sem precisar escrever o código repetidamente. Para isso você cria uma estrutura de repetição que vai controlar quantas vezes o código será executado. Esse controle vai depender se a condição definida na estrutura de repetição for atendida ou não.</p>

<p>Enquanto a condição não for atendida, seja ela verdadeira ou falsa, o código dentro da estrutura de repetição continuará sendo executado por várias vezes automaticamente.</p>

<p>Imagine que você precisa lavar 50 pratos. Você não escreveria um manual de instruções dizendo:</p>

<ul>
  <li>Lave o prato 1</li>
  <li>lave o prato 2</li>
  <li>lave o prato 3…</li>
</ul>

<p>Assim vai até o prato 50. Isso seria muito cansativo e improdutivo (improdutivo é o mesmo que não produzir nada, ou seja, perder tempo).</p>

<p>Se você tivesse uma estrutura de repetição, você poderia dizer algo como:</p>

<ul>
  <li>Enquanto houver pratos sujos, lave o próximo prato.</li>
  <li>Para cada prato sujo, lave o prato.</li>
</ul>

<p>Estruturas de repetição são apenas formas de dizer ao computador: “Não pare ainda, continue trabalhando até que tal coisa aconteça”.</p>

<p><strong>Observação</strong>: As estruturas de repetição também são chamadas de laços de repetição ou loops, com frequência até maior do que o termo estruturas de repetição. Então, se encontrar esses termos, saiba que eles significam a mesma coisa.</p>

<h2 id="tipos-de-lacos-de-repeticao-em-ruby">Tipos de laços de repetição em Ruby</h2>
<hr />

<p>No Ruby, existem dois tipos principais de laços:</p>

<ul>
  <li>Os que se repetem enquanto uma condição for verdadeira ou falsa.</li>
  <li>Os que se repetem para cada item de uma coleção (como um array ou um hash).</li>
</ul>

<figure class="text-center">
    <figcaption>Tipos de laços de repetição em Ruby</figcaption>
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://imagedelivery.net/Ruw4waFkOelbXULIoE-oQg/d609c24d-19d0-4b93-c7bf-b5a5c8ac2e00/public" alt="" loading="lazy" aria-hidden="true" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

    <figcaption class="visually-hidden">
    A imagem é uma ilustração em estilo de lousa, dividida em duas partes, que compara dois tipos de estruturas de repetição na programação. Na parte esquerda, com o título "REPETE ENQUANTO CONDIÇÃO (VERDADEIRA/FALSA)", uma esteira rolante transporta caixas de papelão com a palavra "AÇÃO" escrita nelas. Ao lado da esteira, uma mão robótica mantém um interruptor na posição "ON", o que mantém uma lâmpada acesa. Isso ilustra um laço de repetição, que executa uma ação repetidamente enquanto uma condição é verdadeira.
    </figcaption>
    <figcaption class="visually-hidden">
    Na parte direita, com o título "REPETE PARA CADA ITEM DA COLEÇÃO", outro braço robótico pega frutas de uma caixa de madeira rotulada como "COLEÇÃO" e as coloca em uma esteira que as leva para uma máquina para serem processadas. Isso ilustra um laço de repetição, que executa uma ação para cada item em uma coleção seja essa coleção um array ou um hash.
    </figcaption>
</figure>

<p>Explicando melhor cada um desses tipos de laços:</p>

<ol>
  <li><strong>Laços que se repetem enquanto uma condição for verdadeira ou falsa</strong>: Esses laços fazem o mesmo comando várias vezes, desde que uma regra seja seguida. Por exemplo, dá para pedir ao usuário um número e só parar quando ele colocar um número correto.
    <ul>
      <li><strong>Exemplos desses laços são</strong>: <code class="text-white-50 text-light">while</code> e <code class="text-white-50 text-light">until</code>.</li>
    </ul>
  </li>
  <li><strong>Laços que se repetem para cada item de uma coleção</strong>: Esses laços passam por todos os elementos de um grupo, como uma lista ou tabela, e fazem uma tarefa para cada um. Por exemplo, você pode usar um laço para mostrar cada nome de uma lista de nomes.
    <ul>
      <li><strong>Exemplos desses laços são</strong>: <code class="text-white-50 text-light">for</code> e <code class="text-white-50 text-light">each</code>.</li>
    </ul>
  </li>
</ol>

<h2 id="laco-while">Laço while</h2>
<hr />

<p>O laço <code class="text-white-50 text-light">while</code> é o laço mais intuitivo. Ele funciona com base em uma condição verdadeira. Enquanto a condição for verdadeira, o código dentro do laço será executado repetidamente.</p>

<h3 id="sintaxe-do-laco-while">Sintaxe do laço while</h3>
<hr />

<p>A sintaxe básica do laço <code class="text-white-50 text-light">while</code> é a seguinte:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>

<span class="k">while</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">5</span>
  <span class="nb">puts</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span>
  <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">end</span>
</code></pre></div></div>

<p>O que estamos fazendo aqui é:</p>

<p><code class="text-white-50 text-light">i = 0</code></p>

<p>Cria uma variável chamada <code class="text-white-50 text-light">i</code> e atribui o valor 0 a ela. Em programação, é muito comum usar a variável <code class="text-white-50 text-light">i</code> para contar quantas vezes um laço foi executado.</p>

<p>O nome da variável <code class="text-white-50 text-light">i</code> vem de “index” (índice, em inglês) ou “iterador” (que é algo que itera, ou seja, que repete uma ação várias vezes). A variável <code class="text-white-50 text-light">i</code> será usada para controlar quantas vezes o laço será executado.</p>

<p><code class="text-white-50 text-light">while i &lt; 5</code></p>

<p>Inicia a estrutura de repetição. O computador vai fazer a pergunta: “O valor de i é menor que 5?” por várias vezes. Enquanto a resposta for “sim” (ou seja, enquanto a condição for verdadeira), o código dentro do laço será executado.</p>

<p>Como <code class="text-white-50 text-light">i</code> foi inicializado com 0, a condição <code class="text-white-50 text-light">i &lt; 5</code> é verdadeira, então o código dentro do laço será executado pela primeira vez.</p>

<p><code class="text-white-50 text-light">puts i+1</code></p>

<p>Exibe o valor de <code class="text-white-50 text-light">i + 1</code> na tela. Na primeira vez que o laço é executado, <code class="text-white-50 text-light">i</code> é 0, então o que será exibido é 1.</p>

<p>Em computação, a contagem começa do 0. Por isso, se colocar apenas <code class="text-white-50 text-light">puts i</code>, a saída será:</p>

<p>0</p>

<p>1</p>

<p>2</p>

<p>3</p>

<p>4</p>

<p>Que são cinco números, mas começam do 0.</p>

<p>Mas, na contagem humana, a maioria das pessoas começa a contar do 1. Por isso, somamos 1 ao valor de <code class="text-white-50 text-light">i</code> para exibir os números de 1 a 5.</p>

<p>Ao fazer <code class="text-white-50 text-light">puts i+1</code>, você não altera o valor da variável <code class="text-white-50 text-light">i</code> na memória, você apenas exibe o valor dela somado a 1.</p>

<p>Quando <code class="text-white-50 text-light">i</code> é 0, imprime 1.</p>

<p>Quando <code class="text-white-50 text-light">i</code> é 4, imprime 5.</p>

<p><code class="text-white-50 text-light">i += 1</code></p>

<p>Essa linha é responsável por aumentar o valor da variável <code class="text-white-50 text-light">i</code> em 1 a cada vez que o laço é executado. É uma forma abreviada de escrever <code class="text-white-50 text-light">i = i + 1</code>.</p>

<p>A linha atualiza a variável de controle para avançar o laço. É uma linha muito importante, a mais importante, para evitar que o programa trave e que o laço entre no que é conhecido como “loop infinito”. O loop infinito acontece quando a condição do laço nunca se torna falsa, fazendo com que o laço continue executando para sempre.</p>

<p>Se o valor de <code class="text-white-50 text-light">i</code> não for aumentado, ele continuará valendo 0 para sempre. Quando o código voltar para a linha <code class="text-white-50 text-light">while i &lt; 5</code>, a pergunta “O valor de i é menor que 5?” continuará sendo respondida com “sim”, e o laço nunca terminará. O programa ficaria preso nesse laço para sempre, travando o computador.</p>

<p>Ao fazer <code class="text-white-50 text-light">i += 1</code> (ou <code class="text-white-50 text-light">i = i + 1</code>), o valor de <code class="text-white-50 text-light">i</code> aumenta a cada vez que o laço é executado. Quando for executado a primeira vez, <code class="text-white-50 text-light">i</code> será 1. Na segunda vez, <code class="text-white-50 text-light">i</code> será 2, na terceira vez, <code class="text-white-50 text-light">i</code> será 3, na quarta vez, <code class="text-white-50 text-light">i</code> será 4, e na quinta vez, <code class="text-white-50 text-light">i</code> será 5.</p>

<p>Então quando o código voltar para a linha <code class="text-white-50 text-light">while i &lt; 5</code> pela sexta vez, a pergunta “O valor de i é menor que 5?” será respondida com “não”, e o laço terminará.</p>

<p><code class="text-white-50 text-light">end</code></p>

<p>Finaliza o laço <code class="text-white-50 text-light">while</code>. Tudo que estiver entre <code class="text-white-50 text-light">while</code> e <code class="text-white-50 text-light">end</code> faz parte do laço e será executado repetidamente enquanto a condição for verdadeira.</p>

<h3 id="cuidado-ao-usar-menor-e-menor-ou-igual">Cuidado ao usar &lt; e &lt;=</h3>
<hr />

<p>Em programação, é importante entender a diferença entre os operadores <code class="text-white-50 text-light">&lt;</code> (menor que) e <code class="text-white-50 text-light">&lt;=</code> (menor ou igual a).</p>

<p>Isso é ainda mais importante na hora de escrever as condições dos laços de repetição, para evitar erros que podem fazer o programa não funcionar como esperado.</p>

<p>Por exemplo, considere o seguinte código:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>

<span class="k">while</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="mi">5</span>
  <span class="nb">puts</span> <span class="n">i</span>
  <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Nesse caso, o laço <code class="text-white-50 text-light">while</code> continuará executando enquanto <code class="text-white-50 text-light">i</code> for menor ou igual a 5. Isso significa que o laço será executado quando <code class="text-white-50 text-light">i</code> for 0, 1, 2, 3, 4 e também quando for 5 dando um total de 6 execuções.</p>

<p>Se você quiser que o laço execute apenas 5 vezes, deve usar o operador <code class="text-white-50 text-light">&lt;</code> (menor que) em vez de <code class="text-white-50 text-light">&lt;=</code> (menor ou igual a).</p>

<p>Essa diferença pode parecer pequena, mas é muito, muito importante para garantir que o programa funcione corretamente.</p>

<h3 id="executar-pelo-menos-uma-vez-com-begin-end-while">Executar pelo menos uma vez com begin…end while</h3>
<hr />

<p>Existem situações em que você quer que o código dentro do laço seja executado pelo menos uma vez, mesmo que a condição inicial seja falsa. Para isso, você pode usar a estrutura <code class="text-white-50 text-light">begin...end while</code>.</p>

<p>Por exemplo, vamos criar um menu simples que será exibido pelo menos uma vez, e continuará sendo exibido enquanto o usuário não escolher a opção de sair:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">opcao</span> <span class="o">=</span> <span class="s2">""</span>

<span class="k">begin</span>
  <span class="nb">puts</span> <span class="s2">"Menu:"</span>
  <span class="nb">puts</span> <span class="s2">"1. Opção 1"</span>
  <span class="nb">puts</span> <span class="s2">"2. Opção 2"</span>
  <span class="nb">puts</span> <span class="s2">"3. Sair"</span>
  <span class="n">opcao</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span>
<span class="k">end</span> <span class="k">while</span> <span class="n">opcao</span> <span class="o">!=</span> <span class="s2">"3"</span>
</code></pre></div></div>

<p>Aqui, o menu será exibido pelo menos uma vez, e continuará sendo exibido enquanto a pessoa não digitar “3” para sair.</p>

<h2 id="laco-until">Laço until</h2>
<hr />

<p>O laço <code class="text-white-50 text-light">until</code> é o oposto do laço <code class="text-white-50 text-light">while</code>. Ele executa o código dentro do laço enquanto a condição for falsa. Quando a condição se torna verdadeira, o laço termina.</p>

<h3 id="sintaxe-do-laco-until">Sintaxe do laço until</h3>
<hr />

<p>A sintaxe básica do laço <code class="text-white-50 text-light">until</code> é a seguinte:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">bateria</span> <span class="o">=</span> <span class="mi">0</span>

<span class="c1"># Tradução: ATÉ QUE a bateria seja 100...</span>
<span class="k">until</span> <span class="n">bateria</span> <span class="o">==</span> <span class="mi">100</span> <span class="k">do</span>
  <span class="nb">puts</span> <span class="s2">"Carregando... </span><span class="si">#{</span><span class="n">bateria</span><span class="si">}</span><span class="s2">%"</span>
  <span class="n">bateria</span> <span class="o">+=</span> <span class="mi">10</span>
<span class="k">end</span>

<span class="nb">puts</span> <span class="s2">"Carga completa! Bateria em </span><span class="si">#{</span><span class="n">bateria</span><span class="si">}</span><span class="s2">%"</span>
</code></pre></div></div>

<p>O que estamos fazendo aqui é:</p>

<p><code class="text-white-50 text-light">bateria = 0</code></p>

<p>Cria uma variável chamada <code class="text-white-50 text-light">bateria</code> e atribui o valor 0 a ela. Essa variável será usada para simular o nível de carga da bateria.</p>

<p><code class="text-white-50 text-light">until bateria == 100 do</code></p>

<p>Inicia a estrutura de repetição. O computador vai fazer a pergunta: “O valor de bateria é igual a 100?” por várias vezes. Enquanto a resposta for “não” (ou seja, enquanto a condição for falsa), o código dentro do laço será executado.</p>

<p>Como <code class="text-white-50 text-light">bateria</code> foi inicializado com 0, a condição <code class="text-white-50 text-light">bateria == 100</code> é falsa, então o código dentro do laço será executado pela primeira vez.</p>

<p><code class="text-white-50 text-light">puts "Carregando... #{bateria}%"</code></p>

<p>Exibe o nível atual de carga da bateria na tela. Na primeira vez que o laço é executado, <code class="text-white-50 text-light">bateria</code> é 0, então o que será exibido é “Carregando… 0%”.</p>

<p><code class="text-white-50 text-light">bateria += 10</code></p>

<p>Essa linha é responsável por aumentar o valor da variável <code class="text-white-50 text-light">bateria</code> em 10 a cada vez que o laço é executado. É uma forma abreviada de escrever <code class="text-white-50 text-light">bateria = bateria + 10</code>.</p>

<p>Ao fazer <code class="text-white-50 text-light">bateria += 10</code> (ou <code class="text-white-50 text-light">bateria = bateria + 10</code>), o valor de <code class="text-white-50 text-light">bateria</code> aumenta a cada vez que o laço é executado. Quando for executado a primeira vez, <code class="text-white-50 text-light">bateria</code> será 10. Na segunda vez, <code class="text-white-50 text-light">bateria</code> será 20, na terceira vez, <code class="text-white-50 text-light">bateria</code> será 30, na quarta vez, <code class="text-white-50 text-light">bateria</code> será 40, e assim por diante, até chegar a 100.</p>

<p><code class="text-white-50 text-light">end</code></p>

<p>Finaliza o laço <code class="text-white-50 text-light">until</code>. Tudo que estiver entre <code class="text-white-50 text-light">until</code> e <code class="text-white-50 text-light">end</code> faz parte do laço e será executado repetidamente enquanto a condição for falsa.</p>

<p><code class="text-white-50 text-light">puts "Carga completa! Bateria em #{bateria}%"</code></p>

<p>Exibe uma mensagem indicando que a carga da bateria está completa, mostrando o valor final da variável <code class="text-white-50 text-light">bateria</code>, que será 100 quando o laço terminar.</p>

<h3 id="exemplos-com-until">Exemplos com until</h3>
<hr />

<p>Observe os seguintes códigos que utilizam o laço <code class="text-white-50 text-light">until</code>:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>

<span class="k">until</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">3</span>
  <span class="nb">puts</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span>
  <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">end</span>
</code></pre></div></div>

<p><br /></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>

<span class="k">until</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="mi">3</span>
  <span class="nb">puts</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span>
  <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">end</span>
</code></pre></div></div>

<p><br /></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>

<span class="k">until</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">3</span>
  <span class="nb">puts</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span>
  <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">end</span>
</code></pre></div></div>

<p>O que vai acontecer em cada um desses códigos? Vamos analisar cada um deles:</p>

<ol>
  <li>
    <p>Em <code class="text-white-50 text-light">until i == 3</code>, o laço continuará executando enquanto <code class="text-white-50 text-light">i</code> não for igual a 3 (ou seja, enquanto a condição for falsa). Portanto, ele imprimirá os números 1, 2 e 3 na tela por causa do <code class="text-white-50 text-light">puts i+1</code>.</p>
  </li>
  <li>
    <p>Em <code class="text-white-50 text-light">until i &lt;= 3</code>, nada será mostrado na tela. Isso porque a condição <code class="text-white-50 text-light">i &lt;= 3</code> já é verdadeira desde o início (pois <code class="text-white-50 text-light">i</code> começa em 0 e 0 é menor que 3). Como a condição já começou verdadeira e o laço <code class="text-white-50 text-light">until</code> só executa enquanto a condição for falsa, o código dentro do laço nunca será executado.</p>
  </li>
  <li>
    <p>O mesmo vai acontecer em <code class="text-white-50 text-light">until i &lt; 3</code>. A condição <code class="text-white-50 text-light">i &lt; 3</code> já é verdadeira desde o início (pois <code class="text-white-50 text-light">i</code> começa em 0 e 0 é menor que 3). Portanto, o código dentro do laço nunca será executado, e nada será mostrado na tela.</p>
  </li>
</ol>

<h2 id="dica-sobre-while-e-until">Dica sobre while e until</h2>
<hr />

<p>Use o laço <code class="text-white-50 text-light">while</code> quando quiser que o código seja executado enquanto uma condição for verdadeira até que ela se torne falsa.</p>

<p>Já o laço <code class="text-white-50 text-light">until</code> deve ser usado quando quiser que o código seja executado enquanto uma condição for falsa até que ela se torne verdadeira.</p>

<p>Para qualquer laço, não apenas <code class="text-white-50 text-light">while</code> e <code class="text-white-50 text-light">until</code>, o mais importante é ter certeza que a condição que você criou para o laço vai mudar em algum momento, para evitar que o laço entre em um loop infinito. Sempre atualize a variável de controle dentro do laço para garantir que a condição será eventualmente atendida e o laço terminará.</p>

<p>Sempre respeite a lógica do seu programa na hora de definir as condições dos laços. Por exemplo, na hora de definir seus operadores lógicos (<code class="text-white-50 text-light">&lt;</code>, <code class="text-white-50 text-light">&lt;=</code>, <code class="text-white-50 text-light">==</code>, etc.), escolha o operador que faz sentido para o que você quer alcançar com o laço.</p>

<h2 id="laco-for">Laço for</h2>
<hr />

<p>O laço <code class="text-white-50 text-light">for</code> serve para passar por todos os itens de uma coleção (lista) de elementos, como um array ou range (intervalo de números). Para cada item dessa coleção (lista), o código que está dentro do laço é executado.</p>

<h3 id="sintaxe-do-laco-for">Sintaxe do laço for</h3>
<hr />

<p>A sintaxe básica do laço <code class="text-white-50 text-light">for</code> é a seguinte:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">idades</span> <span class="o">=</span> <span class="p">[</span><span class="mi">10</span><span class="p">,</span> <span class="mi">22</span><span class="p">,</span> <span class="mi">35</span><span class="p">,</span> <span class="mi">46</span><span class="p">,</span> <span class="mi">57</span><span class="p">]</span>
<span class="n">nomes</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"Ana"</span><span class="p">,</span> <span class="s2">"Bruno"</span><span class="p">,</span> <span class="s2">"Carla"</span><span class="p">,</span> <span class="s2">"Daniel"</span><span class="p">,</span> <span class="s2">"Eva"</span><span class="p">]</span>
<span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>

<span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="mi">4</span>
  <span class="nb">puts</span> <span class="s2">"</span><span class="si">#{</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="si">}</span><span class="s2">ª execução do laço for."</span>
  <span class="nb">puts</span> <span class="s2">"</span><span class="si">#{</span><span class="n">nomes</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="si">}</span><span class="s2"> tem </span><span class="si">#{</span><span class="n">idades</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="si">}</span><span class="s2"> anos."</span>
<span class="k">end</span>
</code></pre></div></div>

<p>O que estamos fazendo aqui é um exemplo clássico de iteração (repetição) sobre dois arrays (listas) ao mesmo tempo, usando o laço <code class="text-white-50 text-light">for</code>.</p>

<p>Primeiro <code class="text-white-50 text-light">idades = [10, 22, 35, 46, 57]</code> cria um array chamado <code class="text-white-50 text-light">idades</code> que contém cinco números representando idades.</p>

<p>Depois <code class="text-white-50 text-light">nomes = ["Ana", "Bruno", "Carla", "Daniel", "Eva"]</code> cria outro array chamado <code class="text-white-50 text-light">nomes</code> que contém cinco strings representando nomes.</p>

<p>Imagine esses dois arrays como duas listas paralelas, duas colunas em uma tabela do Excel, onde o primeiro nome corresponde à primeira idade, o segundo nome à segunda idade, e assim por diante.</p>

<p>As colunas estão alinhadas, ou seja, a informação que está na primeira posição de um array corresponde à informação que está na primeira posição do outro array. Como em uma tabela:</p>

<p class="small text-light mb-2" id="tabela-1-ajuda">Observacao: em telas pequenas, deslize horizontalmente para ler todas as colunas da tabela.</p>
<div class="table-responsive">
<table class="table table-bordered table-striped table-hover table-dark text-white border-secondary" aria-describedby="tabela-1-ajuda"><caption class="visually-hidden">Tabela que associa os nomes às idades dos arrays.</caption>
  <thead class="table-dark">
    <tr>
      <th scope="col">Nome</th>
      <th scope="col">Idade</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td scope="row">Ana</td>
      <td scope="row">10</td>
    </tr>
    <tr>
      <td scope="row">Bruno</td>
      <td scope="row">22</td>
    </tr>
    <tr>
      <td scope="row">Carla</td>
      <td scope="row">35</td>
    </tr>
    <tr>
      <td scope="row">Daniel</td>
      <td scope="row">46</td>
    </tr>
    <tr>
      <td scope="row">Eva</td>
      <td scope="row">57</td>
    </tr>
  </tbody>
</table>
</div>

<p>Então o laço <code class="text-white-50 text-light">for i in 0..4</code> inicia a estrutura de repetição.</p>

<p><code class="text-white-50 text-light">for i in 0..4</code></p>

<p>É como dizer ao computador:</p>

<p>“Para a nossa variável contadora <code class="text-white-50 text-light">i</code> (que é como nosso dedo nossa maneira de apontar) repita os comandos do código abaixo começando com <code class="text-white-50 text-light">i = 0</code> e terminando com <code class="text-white-50 text-light">i = 4</code>. A cada vez que o laço for executado o <code class="text-white-50 text-light">i</code> deve mudar de valor e o código do laço deve ser executado de novo.”</p>

<p>O que o computador entende é:</p>

<p>“Vou executar o código a seguir 5 vezes. Na primeira vez, o <code class="text-white-50 text-light">i</code> vale 0. Na segunda vez o <code class="text-white-50 text-light">i</code>, vale 1. Na terceira vez o <code class="text-white-50 text-light">i</code> vale 2. Na quarta vez o <code class="text-white-50 text-light">i</code> vale 3. Na quinta e última vez o <code class="text-white-50 text-light">i</code> vale 4.”</p>

<p>Então dentro do laço de repetição, temos dois comandos puts. O primeiro comando:</p>

<p><code class="text-white-50 text-light">puts "#{i+1}ª execução do laço for."</code></p>

<p>Exibe na tela a mensagem indicando qual é a execução atual do laço, somando 1 ao valor de <code class="text-white-50 text-light">i</code> para começar a contagem do 1.</p>

<p>Quando o <code class="text-white-50 text-light">i</code> for 0, exibirá “1ª execução do laço for.”</p>

<p>Quando o <code class="text-white-50 text-light">i</code> for 1, exibirá “2ª execução do laço for.”</p>

<p>E assim por diante, até a 5ª execução. Isso é apenas para ficar bonito na tela, não altera os dados das listas.</p>

<p>Já o segundo comando:</p>

<p><code class="text-white-50 text-light">puts "#{nomes[i]} tem #{idades[i]} anos."</code></p>

<p>Exibe na tela o nome e a idade correspondentes, usando o valor de <code class="text-white-50 text-light">i</code> para acessar os elementos corretos em cada array.</p>

<p>Por exemplo, quando <code class="text-white-50 text-light">i</code> for 0, ele acessa <code class="text-white-50 text-light">nomes[0]</code> (que é “Ana”) e <code class="text-white-50 text-light">idades[0]</code> (que é 10), exibindo “Ana tem 10 anos.”</p>

<p>A simulação completa desse laço <code class="text-white-50 text-light">for</code> resultará no seguinte:</p>

<p class="small text-light mb-2" id="tabela-2-ajuda">Observacao: em telas pequenas, deslize horizontalmente para ler todas as colunas da tabela.</p>
<div class="table-responsive">
<table class="table table-bordered table-striped table-hover table-dark text-white border-secondary" aria-describedby="tabela-2-ajuda"><caption class="visually-hidden">Tabela que mostra as saídas do laço for para cada valor de i.</caption>
  <thead class="table-dark">
    <tr>
      <th scope="col">Número de execução do laço</th>
      <th scope="col">Cálculo</th>
      <th scope="col">Saída exibida</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td scope="row">1ª execução (i = 0)</td>
      <td scope="row">Cálculo: i+1 vira 1. Acesso: nomes[0] é Ana, idades[0] é 10.</td>
      <td scope="row">1ª execução do laço for. Ana tem 10 anos.</td>
    </tr>
    <tr>
      <td scope="row">2ª execução (i = 1)</td>
      <td scope="row">Cálculo: i+1 vira 2. Acesso: nomes[1] é Bruno, idades[1] é 22.</td>
      <td scope="row">2ª execução do laço for. Bruno tem 22 anos.</td>
    </tr>
    <tr>
      <td scope="row">3ª execução (i = 2)</td>
      <td scope="row">Cálculo: i+1 vira 3. Acesso: nomes[2] é Carla, idades[2] é 35.</td>
      <td scope="row">3ª execução do laço for. Carla tem 35 anos.</td>
    </tr>
    <tr>
      <td scope="row">4ª execução (i = 3)</td>
      <td scope="row">Cálculo: i+1 vira 4. Acesso: nomes[3] é Daniel, idades[3] é 46.</td>
      <td scope="row">4ª execução do laço for. Daniel tem 46 anos.</td>
    </tr>
    <tr>
      <td scope="row">5ª execução (i = 4)</td>
      <td scope="row">Cálculo: i+1 vira 5. Acesso: nomes[4] é Eva, idades[4] é 57.</td>
      <td scope="row">5ª execução do laço for. Eva tem 57 anos.</td>
    </tr>
  </tbody>
</table>
</div>

<h3 id="usando-for-com-arrays-diretamente">Usando for com arrays diretamente</h3>
<hr />

<p>Se você não precisar conectar dois arrays (listas) diferentes, pode usar o laço <code class="text-white-50 text-light">for</code> diretamente com um array.</p>

<p>Veja o exemplo abaixo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">idades</span> <span class="o">=</span> <span class="p">[</span><span class="mi">10</span><span class="p">,</span> <span class="mi">22</span><span class="p">,</span> <span class="mi">35</span><span class="p">,</span> <span class="mi">46</span><span class="p">,</span> <span class="mi">57</span><span class="p">]</span>

<span class="c1"># para cada idade na lista de idades faça:</span>
<span class="k">for</span> <span class="n">idade</span> <span class="k">in</span> <span class="n">idades</span>
  <span class="nb">puts</span> <span class="s2">"Idade: </span><span class="si">#{</span><span class="n">idade</span><span class="si">}</span><span class="s2"> anos."</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Aqui, você não se preocupa em saber “onde” o item está (posição 0, 1, 2…), você só quer saber “o que” é o item.</p>

<p>Neste caso, a leitura do código é muito natural: “Para cada valor que estiver dentro da lista <code class="text-white-50 text-light">idades</code>, chame esse valor temporariamente de <code class="text-white-50 text-light">idade</code> e execute o código”.</p>

<p>A variável <code class="text-white-50 text-light">idade</code> (no singular) é criada automaticamente pelo laço. Ela serve como uma “gaveta temporária” que guarda um valor diferente a cada volta do laço.</p>

<p><strong>Comparando com uma playlist de música:</strong></p>

<ul>
  <li><strong>Usando índice (i) como foi feito antes:</strong> É como dizer “Toque a música da faixa 1”, depois “Toque a música da faixa 2”. Você precisa saber o número da faixa para escolher a música.</li>
  <li><strong>Usando o array diretamente (este exemplo):</strong> É como apertar o botão “Próxima”. Você não precisa saber qual é o número da faixa, apenas ouve a música que está tocando agora e passa para a seguinte automaticamente.</li>
</ul>

<h3 id="usando-for-com-ranges">Usando for com ranges</h3>
<hr />

<p>O <code class="text-white-50 text-light">Range</code> (intervalo) é um tipo de dado no Ruby que representa uma sequência de valores, geralmente números. É muito útil quando você quer repetir alguma coisa um número específico de vezes, mas não tem uma lista pronta.</p>

<p>A sintaxe é muito simples: você coloca o valor inicial, dois pontos (<code class="text-white-50 text-light">..</code>) e o valor final.</p>

<p>Observe o exemplo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Vai contar de 1 até 5</span>
<span class="k">for</span> <span class="n">numero</span> <span class="k">in</span> <span class="mi">1</span><span class="o">..</span><span class="mi">5</span>
  <span class="nb">puts</span> <span class="s2">"Contando: </span><span class="si">#{</span><span class="n">numero</span><span class="si">}</span><span class="s2">"</span>
<span class="k">end</span>
</code></pre></div></div>

<p>A saída será:</p>

<p>Contando: 1</p>

<p>Contando: 2</p>

<p>Contando: 3</p>

<p>Contando: 4</p>

<p>Contando: 5</p>

<h3 id="diferenca-entre-dois-pontos-e-tres-pontos">Diferença entre dois pontos (..) e três pontos (…)</h3>
<hr />

<p>Existe um detalhe importante nos intervalos do Ruby:</p>

<ul>
  <li><code class="text-white-50 text-light">1..5</code> <strong>(dois pontos):</strong> Inclui o último número. Vai de 1 até 5 (1, 2, 3, 4, 5).</li>
  <li><code class="text-white-50 text-light">1...5</code> <strong>(três pontos):</strong> Exclui o último número. Vai de 1 até quase 5 (1, 2, 3, 4).</li>
</ul>

<p>Exemplo com três pontos:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Vai contar de 1 até 4 (o 5 fica de fora)</span>
<span class="k">for</span> <span class="n">numero</span> <span class="k">in</span> <span class="mi">1</span><span class="o">...</span><span class="mi">5</span>
  <span class="nb">puts</span> <span class="s2">"Contando: </span><span class="si">#{</span><span class="n">numero</span><span class="si">}</span><span class="s2">"</span>
<span class="k">end</span>
</code></pre></div></div>

<p>A saída será:</p>

<p>Contando: 1</p>

<p>Contando: 2</p>

<p>Contando: 3</p>

<p>Contando: 4</p>

<p>Isso é útil quando você quer evitar ultrapassar um limite específico.</p>

<h2 id="laco-each">Laço each</h2>
<hr />

<p>O laço <code class="text-white-50 text-light">each</code> é a forma mais utilizada e “rubista” de fazer repetições em coleções. Enquanto o <code class="text-white-50 text-light">for</code> é comum em muitas linguagens de programação (como C, Java, Python), o <code class="text-white-50 text-light">each</code> é mais específico do Ruby e é preferido pela comunidade Ruby por ser mais elegante (para a comunidade Ruby, “elegante” significa “bonito e eficiente”).</p>

<p>A palavra “each” significa “cada”. A leitura é: “Para cada item da coleção, faça isso”.</p>

<p>A estrutura <code class="text-white-50 text-light">each</code> é diferente do <code class="text-white-50 text-light">for</code>. Aqui, o laço é um método que pertence as coleções (“array”, “range”, “hash”).</p>

<p>Devemos lembrar do que já foi dito em outros artigos: <strong>método = ação de um objeto.</strong></p>

<p>Ou seja, o <code class="text-white-50 text-light">each</code> é uma ação dos arrays (listas), ranges (intervalos) e hashes (tabelas) que faz o seguinte: “Para cada item da coleção, execute o código que está dentro do bloco.”</p>

<p>No caso do <code class="text-white-50 text-light">for</code>, o laço é uma estrutura de controle da linguagem Ruby. As coleções estão lá paradas e o laço <code class="text-white-50 text-light">for</code> passa por elas executando o código dentro do laço para cada item da coleção.</p>

<p>No caso do <code class="text-white-50 text-light">each</code>, as coleções (arrays, ranges, hashes) têm o método <code class="text-white-50 text-light">each</code> que faz o trabalho de passar por cada item da coleção e executar o código dentro do bloco. Ou seja, é a própria coleção (que é um objeto) que executa a ação de iterar (repetir) o código para cada um dos seus itens.</p>

<ul>
  <li>
    <p><strong>for</strong>: Estrutura de controle da linguagem Ruby que itera sobre coleções.</p>
  </li>
  <li>
    <p><strong>each</strong>: Método dos objetos coleção (arrays, ranges, hashes) que itera sobre seus próprios itens.</p>
  </li>
</ul>

<h3 id="sintaxe-do-laco-each">Sintaxe do laço each</h3>
<hr />

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">nomes</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"Ana"</span><span class="p">,</span> <span class="s2">"Bruno"</span><span class="p">,</span> <span class="s2">"Carla"</span><span class="p">]</span>

<span class="n">nomes</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">nome</span><span class="o">|</span>
  <span class="nb">puts</span> <span class="s2">"Olá, </span><span class="si">#{</span><span class="n">nome</span><span class="si">}</span><span class="s2">!"</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Vamos entender as partes dessa estrutura:</p>

<ol>
  <li>
    <p><code class="text-white-50 text-light">nomes.each</code>: Você pega a lista (<code class="text-white-50 text-light">nomes</code>) e chama o método <code class="text-white-50 text-light">.each</code> (ponto each). É como dar uma ordem para a lista: “Lista, para cada item seu, faça…”</p>
  </li>
  <li>
    <p><code class="text-white-50 text-light">do ... end</code>: Isso define um <strong>bloco</strong> de código. Tudo que estiver entre o <code class="text-white-50 text-light">do</code> e o <code class="text-white-50 text-light">end</code> será executado para cada item.</p>
  </li>
  <li>
    <p><code class="text-white-50 text-light">|nome|</code>: As barras verticais (pipes) funcionam como a “gaveta temporária”. O Ruby pega o item atual da lista e o coloca dentro da variável que você escreveu entre as barras. Você pode dar qualquer nome para essa variável (como <code class="text-white-50 text-light">|pessoa|</code>, <code class="text-white-50 text-light">|item|</code>, <code class="text-white-50 text-light">|x|</code>).</p>
  </li>
  <li>
    <p><code class="text-white-50 text-light">puts "Olá, #{nome}!"</code>: Esse é o código que será executado para cada item. Aqui, ele exibe uma saudação personalizada usando o nome atual da lista.</p>
  </li>
</ol>

<p>A saída desse código será:</p>

<p>Olá, Ana!</p>

<p>Olá, Bruno!</p>

<p>Olá, Carla!</p>

<h3 id="sintaxe-de-uma-linha">Sintaxe de uma linha (Blocos Inline)</h3>
<hr />

<p>Uma das características mais amadas do Ruby é a capacidade de escrever códigos concisos (conciso é o mesmo que breve ou resumido). Se o código dentro do bloco for curto (apenas uma linha), você pode substituir o <code class="text-white-50 text-light">do...end</code> por chaves <code class="text-white-50 text-light">{ ... }</code>.</p>

<p>Veja como fica o exemplo anterior em uma única linha:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">nomes</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"Ana"</span><span class="p">,</span> <span class="s2">"Bruno"</span><span class="p">,</span> <span class="s2">"Carla"</span><span class="p">]</span>

<span class="n">nomes</span><span class="p">.</span><span class="nf">each</span> <span class="p">{</span> <span class="o">|</span><span class="n">nome</span><span class="o">|</span> <span class="nb">puts</span> <span class="s2">"Olá, </span><span class="si">#{</span><span class="n">nome</span><span class="si">}</span><span class="s2">!"</span> <span class="p">}</span>
</code></pre></div></div>

<p>O resultado é exatamente o mesmo, mas economiza espaço vertical na tela. Mas, cuidado para não exagerar! Se o código dentro do bloco for muito longo, é melhor usar o formato com <code class="text-white-50 text-light">do...end</code> para manter a legibilidade.</p>

<h3 id="usando-each-com-hashes">Usando each com Hashes</h3>
<hr />

<p>O <code class="text-white-50 text-light">each</code> é poderoso porque funciona em qualquer coleção. Nos Hashes (que são como dicionários com chave e valor), o bloco recebe duas variáveis: uma para a chave e outra para o valor.</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Criando um Hash com produtos e preços</span>
<span class="n">produtos</span> <span class="o">=</span> <span class="p">{</span> <span class="s2">"Camiseta"</span> <span class="o">=&gt;</span> <span class="mf">29.90</span><span class="p">,</span> <span class="s2">"Calça"</span> <span class="o">=&gt;</span> <span class="mf">89.90</span><span class="p">,</span> <span class="s2">"Meia"</span> <span class="o">=&gt;</span> <span class="mf">9.90</span> <span class="p">}</span>

<span class="n">produtos</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">produto</span><span class="p">,</span> <span class="n">preco</span><span class="o">|</span>
  <span class="nb">puts</span> <span class="s2">"O item </span><span class="si">#{</span><span class="n">produto</span><span class="si">}</span><span class="s2"> custa R$ </span><span class="si">#{</span><span class="n">preco</span><span class="si">}</span><span class="s2">"</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Observe que usamos <code class="text-white-50 text-light">|produto, preco|</code> entre as barras verticais. O Ruby entende automaticamente que o primeiro item é a chave (nome do produto) e o segundo item é o valor (preço do produto).</p>

<h3 id="e-se-eu-precisar-do-indice">E se eu precisar do índice? (each_with_index)</h3>
<hr />

<p>Às vezes, quando você está passando por cada item de uma lista (iterando) usando o <code class="text-white-50 text-light">each</code> no Ruby, pode querer saber em que lugar aquele item está, ou seja, seu número na lista (índice). Para isso, existe o método <code class="text-white-50 text-light">each_with_index</code>, que mostra o índice de cada item enquanto você percorre a coleção seja ela um array ou um hash.</p>

<p>O exemplo a seguir mostra como usar o <code class="text-white-50 text-light">each_with_index</code> com um array:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">frutas</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"Maçã"</span><span class="p">,</span> <span class="s2">"Banana"</span><span class="p">,</span> <span class="s2">"Cereja"</span><span class="p">]</span>

<span class="n">frutas</span><span class="p">.</span><span class="nf">each_with_index</span> <span class="k">do</span> <span class="o">|</span><span class="n">fruta</span><span class="p">,</span> <span class="n">indice</span><span class="o">|</span>
  <span class="nb">puts</span> <span class="s2">"</span><span class="si">#{</span><span class="n">indice</span> <span class="o">+</span> <span class="mi">1</span><span class="si">}</span><span class="s2">: </span><span class="si">#{</span><span class="n">fruta</span><span class="si">}</span><span class="s2">"</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Aqui, o bloco recebe dois parâmetros (<code class="text-white-50 text-light">|fruta, indice|</code>): o nome da fruta e seu índice na lista. Note que somamos 1 ao índice para começar a contagem do 1, já que os índices em programação começam do 0.</p>

<p>A saída será:</p>

<p>1: Maçã</p>

<p>2: Banana</p>

<p>3: Cereja</p>

<p>Você também pode usar o <code class="text-white-50 text-light">each_with_index</code> com hashes. Veja o exemplo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pessoas</span> <span class="o">=</span> <span class="p">{</span> <span class="s2">"Ana"</span> <span class="o">=&gt;</span> <span class="mi">25</span><span class="p">,</span> <span class="s2">"Bruno"</span> <span class="o">=&gt;</span> <span class="mi">30</span><span class="p">,</span> <span class="s2">"Carla"</span> <span class="o">=&gt;</span> <span class="mi">28</span> <span class="p">}</span>

<span class="n">pessoas</span><span class="p">.</span><span class="nf">each_with_index</span> <span class="k">do</span> <span class="o">|</span><span class="p">(</span><span class="n">nome</span><span class="p">,</span> <span class="n">idade</span><span class="p">),</span> <span class="n">indice</span><span class="o">|</span>
  <span class="nb">puts</span> <span class="s2">"</span><span class="si">#{</span><span class="n">indice</span> <span class="o">+</span> <span class="mi">1</span><span class="si">}</span><span class="s2">: </span><span class="si">#{</span><span class="n">nome</span><span class="si">}</span><span class="s2"> tem </span><span class="si">#{</span><span class="n">idade</span><span class="si">}</span><span class="s2"> anos."</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Neste caso, o bloco recebe uma tupla, tupla é um grupo de valores, nesse caso o grupo de valores é o nome, a idade e o índice. A saída será:</p>

<p>1: Ana tem 25 anos.</p>

<p>2: Bruno tem 30 anos.</p>

<p>3: Carla tem 28 anos.</p>

<p>Então, o <code class="text-white-50 text-light">each_with_index</code> é uma ferramenta muito útil quando você precisa tanto do valor quanto da posição do item na coleção enquanto itera sobre ela.</p>

<h2 id="laco-times">Laço times</h2>
<hr />

<p>Esse é um método exclusivo dos números inteiros (<code class="text-white-50 text-light">Integer</code>) no Ruby. É a maneira mais fácil de dizer “Repita isso X vezes”. Não precisa criar uma variável para contar, como <code class="text-white-50 text-light">i = 0</code>.</p>

<p>Como funciona? Você pega um número inteiro e chama o método <code class="text-white-50 text-light">times</code> nele, passando um bloco de código que será executado esse número de vezes.</p>

<h3 id="sintaxe-do-laco-times">Sintaxe do laço times</h3>
<hr />

<p>Exemplo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="mi">5</span><span class="p">.</span><span class="nf">times</span> <span class="k">do</span> <span class="o">|</span><span class="n">i</span><span class="o">|</span>
  <span class="nb">puts</span> <span class="s2">"Esta é a execução número </span><span class="si">#{</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="si">}</span><span class="s2">"</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Aqui, o número <code class="text-white-50 text-light">5</code> indica que o bloco de código dentro do <code class="text-white-50 text-light">do...end</code> será executado 5 vezes. A variável <code class="text-white-50 text-light">i</code> dentro das barras verticais (<code class="text-white-50 text-light">|i|</code>) representa o índice da execução atual, começando do 0, é apenas para mostrar qual é a execução atual.</p>

<p>A saída será:</p>

<p>Esta é a execução número 1</p>

<p>Esta é a execução número 2</p>

<p>Esta é a execução número 3</p>

<p>Esta é a execução número 4</p>

<p>Esta é a execução número 5</p>

<p>Outro exemplo com <code class="text-white-50 text-light">times</code>:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="mi">3</span><span class="p">.</span><span class="nf">times</span> <span class="p">{</span> <span class="nb">puts</span> <span class="s2">"Repetindo esta mensagem!"</span> <span class="p">}</span>
</code></pre></div></div>

<p>Aqui, o bloco de código é simples e cabe em uma única linha, então usamos as chaves <code class="text-white-50 text-light">{ ... }</code> para definir o bloco. A mensagem “Repetindo esta mensagem!” será exibida 3 vezes.</p>

<p>Use o <code class="text-white-50 text-light">times</code> quando você souber exatamente o número de repetições necessárias e não estiver percorrendo uma lista complexa.</p>

<h2 id="lacos-de-repeticao-em-uma-frase">Laços de repetição em uma frase</h2>
<hr />

<p class="small text-light mb-2" id="tabela-3-ajuda">Observacao: em telas pequenas, deslize horizontalmente para ler todas as colunas da tabela.</p>
<div class="table-responsive">

<table class="table table-bordered table-striped table-hover table-dark text-white border-secondary" aria-describedby="tabela-3-ajuda"><caption class="visually-hidden">Tabela resumo dos laços de repetição em Ruby.</caption>
  <thead class="table-dark">
    <tr>
      <th scope="col">Laço</th>
      <th scope="col">Frase para lembrar</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td scope="row"><code class="text-white-50 text-light">while</code></td>
      <td scope="row">"Enquanto for verdade... faça isso."</td>
    </tr>
    <tr>
      <td scope="row"><code class="text-white-50 text-light">until</code></td>
      <td scope="row">"Até que seja verdade... faça isso."</td>
    </tr>
    <tr>
      <td scope="row"><code class="text-white-50 text-light">for</code></td>
      <td scope="row">"Para cada item na lista... faça isso."</td>
    </tr>
    <tr>
      <td scope="row"><code class="text-white-50 text-light">each</code></td>
      <td scope="row">"Para cada item nessa lista... faça isso."</td>
    </tr>
    <tr>
      <td scope="row"><code class="text-white-50 text-light">times</code></td>
      <td scope="row">"Repita isso X vezes."</td>
    </tr>
  </tbody>
</table>
</div>

<h2 id="refazendo-exercicios-de-artigos-anteriores">Refazendo exercícios de artigos anteriores</h2>
<hr />

<p>Agora que os laços de repetição foram apresentados, serão refeitos alguns exercícios dos artigos anteriores, mas dessa vez utilizando laços de repetição para resolver os problemas.</p>

<p>Assim será possível ver como os laços de repetição podem facilitar a resolução de problemas que envolvem tarefas repetitivas.</p>

<h3 id="otimizando-o-menu-de-pagamento">Otimizando o menu de pagamento</h3>
<hr />

<p>No exercício original, se a pessoa digitasse uma opção inválida, o programa apenas dizia “Opção inválida” e encerrava. Com o <code class="text-white-50 text-light">while</code>, podemos obrigar a pessoa a ficar no menu até escolher uma opção correta.</p>

<p>Código atualizado:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">preco</span> <span class="o">=</span> <span class="mf">0.0</span>
<span class="n">opcao</span> <span class="o">=</span> <span class="mi">0</span>

<span class="nb">print</span> <span class="s2">"Digite o preço normal do produto: "</span>
<span class="n">preco</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="c1"># Otimização: O programa fica preso aqui ENQUANTO a opção for inválida</span>
<span class="c1"># (menor que 1 OU maior que 4)</span>
<span class="k">while</span> <span class="n">opcao</span> <span class="o">&lt;</span> <span class="mi">1</span> <span class="o">||</span> <span class="n">opcao</span> <span class="o">&gt;</span> <span class="mi">4</span>
  <span class="nb">puts</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">--- Escolha a condição de pagamento ---"</span>
  <span class="nb">puts</span> <span class="s2">"1 - À vista em dinheiro (10% de desconto)"</span>
  <span class="nb">puts</span> <span class="s2">"2 - À vista no cartão (15% de desconto)"</span>
  <span class="nb">puts</span> <span class="s2">"3 - Em duas vezes (sem juros)"</span>
  <span class="nb">puts</span> <span class="s2">"4 - Em duas vezes (10% de juros)"</span>
  <span class="nb">print</span> <span class="s2">"Escolha uma opção: "</span>
  
  <span class="n">opcao</span> <span class="o">=</span> <span class="no">Integer</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span> <span class="k">rescue</span> <span class="mi">0</span> <span class="c1"># 'rescue 0' evita erro se digitar letras</span>
  
  <span class="k">if</span> <span class="n">opcao</span> <span class="o">&lt;</span> <span class="mi">1</span> <span class="o">||</span> <span class="n">opcao</span> <span class="o">&gt;</span> <span class="mi">4</span>
    <span class="nb">puts</span> <span class="s2">"Opção inválida! Tente novamente."</span>
  <span class="k">end</span>
<span class="k">end</span>

<span class="c1"># Daqui para baixo, sabemos que a opção é válida (1, 2, 3 ou 4)</span>
<span class="k">case</span> <span class="n">opcao</span>
<span class="k">when</span> <span class="mi">1</span>
  <span class="nb">puts</span> <span class="s2">"Valor final: R$ </span><span class="si">#{</span><span class="p">(</span><span class="n">preco</span> <span class="o">*</span> <span class="mf">0.90</span><span class="p">).</span><span class="nf">round</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span>
<span class="k">when</span> <span class="mi">2</span>
  <span class="nb">puts</span> <span class="s2">"Valor final: R$ </span><span class="si">#{</span><span class="p">(</span><span class="n">preco</span> <span class="o">*</span> <span class="mf">0.85</span><span class="p">).</span><span class="nf">round</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span>
<span class="k">when</span> <span class="mi">3</span>
  <span class="nb">puts</span> <span class="s2">"Valor final: R$ </span><span class="si">#{</span><span class="n">preco</span><span class="p">.</span><span class="nf">round</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="s2"> (2x de R$ </span><span class="si">#{</span><span class="p">(</span><span class="n">preco</span><span class="o">/</span><span class="mi">2</span><span class="p">).</span><span class="nf">round</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="s2">)"</span>
<span class="k">when</span> <span class="mi">4</span>
  <span class="n">total</span> <span class="o">=</span> <span class="n">preco</span> <span class="o">*</span> <span class="mf">1.10</span>
  <span class="nb">puts</span> <span class="s2">"Valor final: R$ </span><span class="si">#{</span><span class="n">total</span><span class="p">.</span><span class="nf">round</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="s2"> (2x de R$ </span><span class="si">#{</span><span class="p">(</span><span class="n">total</span><span class="o">/</span><span class="mi">2</span><span class="p">).</span><span class="nf">round</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="s2">)"</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Aqui, o laço <code class="text-white-50 text-light">while</code> mantém o programa no menu de pagamento até que a pessoa escolha uma opção válida (1, 2, 3 ou 4). Se a opção for inválida, ele exibe uma mensagem e pede para tentar novamente.</p>

<p><strong>Entendendo o</strong> <code class="text-white-50 text-light">rescue 0</code><strong>:</strong></p>

<p>No código acima, usamos <code class="text-white-50 text-light">Integer(gets.chomp) rescue 0</code>. Isso serve para tratar erros de digitação.</p>

<ul>
  <li>Se a pessoa digitar um número (exemplo: “3”), o <code class="text-white-50 text-light">Integer</code> converte para o número 3.</li>
  <li>Se a pessoa digitar uma letra (exemplo: “a”), o <code class="text-white-50 text-light">Integer</code> normalmente daria um erro e fecharia o programa.</li>
  <li>O <code class="text-white-50 text-light">rescue 0</code> diz ao Ruby: “Se der erro ao tentar converter, não feche o programa. Em vez disso, use o valor 0”.</li>
  <li>Como 0 é uma opção inválida no nosso menu (que vai de 1 a 4), o laço <code class="text-white-50 text-light">while</code> continua rodando e pede a pessoa para escolher a opção novamente.</li>
</ul>

<h3 id="validando-dados-do-emprestimo">Validando dados do empréstimo</h3>
<hr />

<p>No exercício de empréstimo original, verificamos idade e renda uma única vez. Aqui, vamos usar o <code class="text-white-50 text-light">until</code> para garantir que a renda informada seja válida (maior que zero). O <code class="text-white-50 text-light">until</code> é ótimo para ler como “Faça isso ATÉ QUE a condição seja satisfeita”.</p>

<p>Código atualizado:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">renda</span> <span class="o">=</span> <span class="mf">0.0</span>

<span class="nb">print</span> <span class="s2">"Digite sua idade: "</span>
<span class="n">idade</span> <span class="o">=</span> <span class="no">Integer</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="c1"># Otimização: Repete a pergunta ATÉ QUE a renda seja maior que 0</span>
<span class="k">until</span> <span class="n">renda</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="k">do</span>
  <span class="nb">print</span> <span class="s2">"Digite sua renda mensal (deve ser maior que zero): "</span>
  <span class="n">renda</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span> <span class="k">rescue</span> <span class="mf">0.0</span>
  
  <span class="k">if</span> <span class="n">renda</span> <span class="o">&lt;=</span> <span class="mi">0</span>
    <span class="nb">puts</span> <span class="s2">"Valor inválido. Por favor, informe uma renda real."</span>
  <span class="k">end</span>
<span class="k">end</span>

<span class="c1"># Restante da lógica simplificada para o exemplo</span>
<span class="nb">print</span> <span class="s2">"Digite o valor do empréstimo: "</span>
<span class="n">valor_emprestimo</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="k">if</span> <span class="n">valor_emprestimo</span> <span class="o">&gt;</span> <span class="p">(</span><span class="n">renda</span> <span class="o">*</span> <span class="mi">15</span><span class="p">)</span> <span class="o">||</span> <span class="n">idade</span> <span class="o">&lt;</span> <span class="mi">18</span>
  <span class="nb">puts</span> <span class="s2">"Empréstimo Negado."</span>
<span class="k">else</span>
  <span class="nb">puts</span> <span class="s2">"Empréstimo Pré-Aprovado! (Sujeito a análise de crédito)."</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Aqui, o laço <code class="text-white-50 text-light">until</code> mantém o programa pedindo a renda até que a pessoa informe um valor maior que zero. Se a renda for inválida (menor ou igual a zero), ele exibe uma mensagem e pede para tentar novamente.</p>

<p>Também usamos <code class="text-white-50 text-light">rescue 0.0</code> para evitar erros se a pessoa digitar algo que não seja um número.</p>

<h3 id="ordenando-numeros-dinamicamente">Ordenando números dinamicamente</h3>
<hr />

<p>O exercício original pedia 3 números usando variáveis soltas (n1, n2, n3). E se fossem 10 números? Com .times coletamos os dados e com .each mostramos o resultado.</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numeros</span> <span class="o">=</span> <span class="p">[]</span>

<span class="nb">puts</span> <span class="s2">"Vamos ordenar 3 números!"</span>

<span class="c1"># Otimização 1: .times para repetir a coleta de dados 3 vezes</span>
<span class="mi">3</span><span class="p">.</span><span class="nf">times</span> <span class="k">do</span> <span class="o">|</span><span class="n">indice</span><span class="o">|</span>
  <span class="nb">print</span> <span class="s2">"Digite o </span><span class="si">#{</span><span class="n">indice</span> <span class="o">+</span> <span class="mi">1</span><span class="si">}</span><span class="s2">º número: "</span>
  <span class="n">valor</span> <span class="o">=</span> <span class="no">Integer</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>
  <span class="n">numeros</span> <span class="o">&lt;&lt;</span> <span class="n">valor</span> <span class="c1"># Adiciona na lista</span>
<span class="k">end</span>

<span class="c1"># Ordena e inverte</span>
<span class="n">numeros</span><span class="p">.</span><span class="nf">sort!</span><span class="p">.</span><span class="nf">reverse!</span>

<span class="nb">puts</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">Números em ordem decrescente:"</span>

<span class="c1"># Otimização 2: .each para imprimir, não importa se são 3 ou 100 números</span>
<span class="n">numeros</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">numero</span><span class="o">|</span>
  <span class="nb">puts</span> <span class="s2">"-&gt; </span><span class="si">#{</span><span class="n">numero</span><span class="si">}</span><span class="s2">"</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Aqui, usamos <code class="text-white-50 text-light">.times</code> para coletar os números dinamicamente, sem precisar criar várias variáveis. Depois, usamos <code class="text-white-50 text-light">.each</code> para exibir os números ordenados, o que funciona para qualquer quantidade de números na lista.</p>

<h3 id="media-escolar">Média Escolar</h3>
<hr />

<p>Apesar do <code class="text-white-50 text-light">.each</code> ser preferido em Ruby, o <code class="text-white-50 text-light">for</code> pode ser usado para iterar (que é passar por cada item) sobre uma lista de notas. Vamos adaptar o exercício de média para calcular a média de uma lista de notas. Essa lista de notas agora será passada pela pessoa e guardada em, um array.</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">notas</span> <span class="o">=</span> <span class="p">[]</span>

<span class="nb">puts</span> <span class="s2">"Digite as notas dos alunos (digite 'sair' para terminar):"</span>

<span class="k">while</span> <span class="kp">true</span>
  <span class="nb">print</span> <span class="s2">"Nota: "</span>
  <span class="n">entrada</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span>
  <span class="k">break</span> <span class="k">if</span> <span class="n">entrada</span><span class="p">.</span><span class="nf">downcase</span> <span class="o">==</span> <span class="s1">'sair'</span> <span class="c1"># Sai do loop se a pessoa digitar 'sair'</span>
  
  <span class="n">nota</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="n">entrada</span><span class="p">)</span> <span class="k">rescue</span> <span class="kp">nil</span>
  <span class="k">if</span> <span class="n">nota</span> <span class="o">&amp;&amp;</span> <span class="n">nota</span> <span class="o">&gt;=</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">nota</span> <span class="o">&lt;=</span> <span class="mi">10</span>
    <span class="n">notas</span> <span class="o">&lt;&lt;</span> <span class="n">nota</span> <span class="c1"># Adiciona a nota ao array</span>
  <span class="k">else</span>
    <span class="nb">puts</span> <span class="s2">"Nota inválida! Digite um número entre 0 e 10."</span>
  <span class="k">end</span>
<span class="k">end</span>

<span class="k">if</span> <span class="n">notas</span><span class="p">.</span><span class="nf">empty?</span>
  <span class="nb">puts</span> <span class="s2">"Nenhuma nota foi informada."</span>
<span class="k">else</span>
  <span class="n">soma</span> <span class="o">=</span> <span class="mf">0.0</span>
  <span class="c1"># Usando for para iterar sobre as notas</span>
  <span class="k">for</span> <span class="n">nota</span> <span class="k">in</span> <span class="n">notas</span>
    <span class="n">soma</span> <span class="o">+=</span> <span class="n">nota</span>
    <span class="nb">puts</span> <span class="s2">"Adicionando </span><span class="si">#{</span><span class="n">nota</span><span class="si">}</span><span class="s2">, soma atual: </span><span class="si">#{</span><span class="n">soma</span><span class="si">}</span><span class="s2">"</span>
  <span class="k">end</span>
  
  <span class="n">media</span> <span class="o">=</span> <span class="n">soma</span> <span class="o">/</span> <span class="n">notas</span><span class="p">.</span><span class="nf">length</span>
  <span class="nb">puts</span> <span class="s2">"A média das notas é: </span><span class="si">#{</span><span class="n">media</span><span class="p">.</span><span class="nf">round</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span>

  <span class="c1"># Verificando aprovação</span>
  <span class="k">if</span> <span class="n">media</span> <span class="o">&gt;=</span> <span class="mi">7</span>
    <span class="nb">puts</span> <span class="s2">"Aluno aprovado!"</span>
  <span class="k">else</span>
    <span class="nb">puts</span> <span class="s2">"Aluno reprovado! Pois ficou com média abaixo de 7."</span>
  <span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Aqui, usamos um laço <code class="text-white-50 text-light">while true</code> para permitir que a pessoa digite várias notas até que ela decida sair digitando “sair”. As notas válidas (entre 0 e 10) são armazenadas em um array chamado <code class="text-white-50 text-light">notas</code>.</p>

<p>Depois, usamos um laço <code class="text-white-50 text-light">for</code> para iterar sobre cada nota no array, somando-as para calcular a média. Finalmente, verificamos se o aluno foi aprovado ou reprovado com base na média calculada.</p>

<h2 id="resumo">Resumo</h2>
<hr />

<p>Neste artigo, aprendemos sobre as estruturas de repetição (ou laços) em Ruby. Elas servem para fazer o computador repetir uma tarefa sem você precisar copiar e colar o mesmo código várias vezes.</p>

<p>Primeiro, vimos os laços que dependem de uma condição:</p>
<ul>
  <li>O <code class="text-white-50 text-light">while</code>: repete o código <strong>enquanto</strong> a condição for verdadeira.</li>
  <li>O <code class="text-white-50 text-light">until</code>: repete o código <strong>até que</strong> a condição fique verdadeira (ou seja, ele roda enquanto a condição ainda é falsa).</li>
</ul>

<p>Depois, vimos os laços que passam por uma coleção (uma lista de itens como ranges, arrays ou hashes):</p>

<ul>
  <li>O <code class="text-white-50 text-light">for</code>: percorre uma sequência, como um intervalo de números (<code class="text-white-50 text-light">range</code>) ou uma lista (<code class="text-white-50 text-light">array</code>).</li>
  <li>O <code class="text-white-50 text-light">each</code>: é o jeito mais comum no Ruby para percorrer itens de uma coleção (<code class="text-white-50 text-light">array</code>, <code class="text-white-50 text-light">hash</code>, etc.). Também vimos o <code class="text-white-50 text-light">each_with_index</code>, que mostra a posição (índice) junto com o item.</li>
  <li>O <code class="text-white-50 text-light">times</code>: repete uma ação um número <strong>exato</strong> de vezes.</li>
</ul>

<p>Para fechar, os exercícios mostraram por que laços são tão úteis no dia a dia:</p>
<ol>
  <li><strong>Programas mais “pacientes”:</strong> dá para pedir a mesma informação até a pessoa digitar certo, em vez de o programa encerrar no primeiro erro.</li>
  <li><strong>Trabalhar com vários dados:</strong> em vez de usar muitas variáveis soltas, você pode guardar tudo em um <code class="text-white-50 text-light">array</code> e repetir a lógica quantas vezes precisar.</li>
  <li><strong>Automatizar tarefas:</strong> laços ajudam a repetir passos que seguem um padrão, economizando tempo e deixando o código mais organizado.</li>
</ol>

<p>Em resumo, as estruturas de repetição servem para resolver problemas sem se repetir código, essas estruturas são muito poderosas e essenciais para qualquer programa. Claro que, nenhuma dessas estruturas é uma bala de prata que resolve todos os problemas, é preciso saber quando e como usar cada uma delas para tirar o máximo proveito.</p>

<p>Além disso, fortalecer nossa lógica de programação é fundamental para escrever condições de parada corretas e eficientes, evitando loops infinitos que podem travar o programa. Por isso de agora em diante, haverá muitos exercícios práticos para fixar esses conceitos.</p>]]></content><author><name>Louise Suelen</name></author><category term="Programação" /><category term="programação" /><category term="tecnologia" /><summary type="html"><![CDATA[Neste artigo, serão exploradas as estruturas de repetição em Ruby, incluindo 'while', 'for' e 'each', com exemplos práticos para facilitar o entendimento.]]></summary></entry><entry xml:lang="pt-BR"><title type="html">Introdução à Programação: Expressões Condicionais em Ruby - Parte II</title><link href="https://pcdnaescola.com.br/introducao-a-programacao-expressoes-condicionais-em-ruby-parte-ii/" rel="alternate" type="text/html" title="Introdução à Programação: Expressões Condicionais em Ruby - Parte II" /><published>2025-09-22T13:00:00+00:00</published><updated>2025-09-22T13:00:00+00:00</updated><id>https://pcdnaescola.com.br/introducao-a-programacao-expressoes-condicionais-em-ruby-parte-ii</id><content type="html" xml:base="https://pcdnaescola.com.br/introducao-a-programacao-expressoes-condicionais-em-ruby-parte-ii/"><![CDATA[<div class="text-center">
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://imagedelivery.net/Ruw4waFkOelbXULIoE-oQg/b0b695bd-ae05-4be1-5692-5131de200100/public" alt="" loading="lazy" aria-hidden="true" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

</div>

<h2 id="apresentacao">Apresentação</h2>
<hr />

<p>No artigo anterior, foram apresentadas formas de tomar decisões no código. Aprendemos a usar os comandos <code class="text-white-50 text-light">if</code>, <code class="text-white-50 text-light">else</code> e <code class="text-white-50 text-light">elsif</code> para escolher caminhos diferentes no programa, com base em comparações e operadores lógicos.</p>

<p>Também vimos como usar operadores de comparação, como <code class="text-white-50 text-light">==</code>, <code class="text-white-50 text-light">!=</code>, <code class="text-white-50 text-light">&gt;</code>, <code class="text-white-50 text-light">&lt;</code>, <code class="text-white-50 text-light">&gt;=</code> e <code class="text-white-50 text-light">&lt;=</code>. Fizemos um exemplo que valida estados brasileiros, usando Hashes, mexendo em textos e mostrando como o comando return é importante para parar o código quando encontramos algum dado errado.</p>

<p>Agora continuaremos estudando as expressões condicionais focando em duas estruturas muito úteis: o <code class="text-white-50 text-light">unless</code> e o <code class="text-white-50 text-light">case</code> para expandir nossas possibilidades de controle de fluxo no código. Vamos conhecer essas estruturas e fazer exercícios com todas as estruturas condicionais que aprendemos até agora para fixar o conteúdo.</p>

<h2 id="unless">Unless</h2>
<hr />

<p>Até agora, sempre que queríamos verificar algo, pensávamos de forma positiva: “Se isso for verdade, faça aquilo”. Mas, na linguagem humana, muitas vezes pensamos no negativo ou em exceções.</p>

<p>Por exemplo: “Não saia de casa a menos que pare de chover” ou “Vou trabalhar, a não ser que seja feriado”.</p>

<p>Ruby é uma linguagem desenhada para ser próxima da linguagem humana. Por isso, ela nos oferece o <code class="text-white-50 text-light">unless</code> (que seria o nosso “a menos que” ou “a não ser que”).</p>

<p>O <code class="text-white-50 text-light">unless</code> é o oposto exato do <code class="text-white-50 text-light">if</code>. Enquanto o <code class="text-white-50 text-light">if</code> executa o código se a condição for verdadeira, o <code class="text-white-50 text-light">unless</code> executa o código se a condição for falsa.</p>

<p>Pense nele como um “Se não…”.</p>

<p>Muitas vezes, quando estamos aprendendo, fazemos algo assim:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">bloqueado</span> <span class="o">=</span> <span class="kp">false</span>

<span class="k">if</span> <span class="o">!</span><span class="n">bloqueado</span>
  <span class="nb">puts</span> <span class="s2">"Acesso permitido!"</span>
<span class="k">end</span>
</code></pre></div></div>

<p>No código acima, estamos dizendo: “Se NÃO estiver bloqueado”. O símbolo <code class="text-white-50 text-light">!</code> inverte a lógica. Funciona? Sim. Mas ler “Se não bloqueado” exige uma pequena ginástica mental.</p>

<p>Com <code class="text-white-50 text-light">unless</code>, o código fica mais natural:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">bloqueado</span> <span class="o">=</span> <span class="kp">false</span>

<span class="k">unless</span> <span class="n">bloqueado</span>
  <span class="nb">puts</span> <span class="s2">"Acesso permitido!"</span>
<span class="k">end</span>
</code></pre></div></div>

<p>A leitura flui melhor: “A menos que esteja bloqueado, imprima acesso permitido”.</p>

<p>A regra de ouro é: Use <code class="text-white-50 text-light">unless</code> quando você quer executar uma ação apenas se a condição for falsa. Se você precisar usar um <code class="text-white-50 text-light">else</code> junto com o <code class="text-white-50 text-light">unless</code>, geralmente é melhor voltar para o <code class="text-white-50 text-light">if</code>, pois “a menos que isso, senão aquilo” começa a ficar confuso.</p>

<p>Imagine que você está processando um cadastro e quer avisar se o campo nome estiver vazio.</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">nome</span> <span class="o">=</span> <span class="s2">""</span>
<span class="nb">puts</span> <span class="s2">"Atenção: O nome não pode ser vazio"</span> <span class="k">if</span> <span class="n">nome</span><span class="p">.</span><span class="nf">empty?</span>
</code></pre></div></div>

<p>Na linha <code class="text-white-50 text-light">if nome.empty?</code>, estamos dizendo: “Se o nome estiver vazio, imprima a mensagem de atenção”.</p>

<p>O <code class="text-white-50 text-light">empty?</code> é um método que verifica se a string está vazia. Se estiver, ele retorna <code class="text-white-50 text-light">true</code>, e a mensagem será exibida. Então explicando cada parte da linha:</p>

<ul>
  <li><code class="text-white-50 text-light">puts</code>: Comando para imprimir algo na tela.</li>
  <li><code class="text-white-50 text-light">"Atenção: O nome não pode ser vazio"</code>: A mensagem que queremos mostrar.</li>
  <li><code class="text-white-50 text-light">if</code>: Inicia a condição de verificação (“se”).</li>
  <li><code class="text-white-50 text-light">nome.empty?</code>: Verifica se a variável <code class="text-white-50 text-light">nome</code> está vazia. Se estiver vazia, a condição é verdadeira, e a mensagem será impressa. <code class="text-white-50 text-light">empty?</code> é um método que retorna <code class="text-white-50 text-light">true</code> se a string estiver vazia e <code class="text-white-50 text-light">false</code> caso contrário.</li>
  <li>O ponto de interrogação no final de <code class="text-white-50 text-light">empty?</code> indica que é um método que retorna um valor booleano (verdadeiro ou falso).</li>
</ul>

<p>Ok, podemos fazer desse jeito como foi feito acima, mas podemos usar o <code class="text-white-50 text-light">unless</code> da mesma forma.</p>

<pre class="bg-dark text-light p-3"><code class="language-rubyruby">nome = ""
puts "Atenção: O nome não pode ser vazio" unless !nome.empty?
</code></pre>

<p>Aqui, usamos <code class="text-white-50 text-light">unless</code> para dizer: “A menos que o nome NÃO esteja vazio, imprima a mensagem”. A dupla negação pode ser confusa, então é importante usar <code class="text-white-50 text-light">unless</code> apenas quando fizer sentido.</p>

<h3 id="exemplo-unless">Exemplo com Unless</h3>
<hr />

<p>Vamos criar um exemplo simples usando <code class="text-white-50 text-light">unless</code> para verificar se um usuário tem permissão para acessar uma área restrita.</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 1. Definição da senha correta (simulando um banco de dados)</span>
<span class="n">senha_correta</span> <span class="o">=</span> <span class="s2">"ruby123"</span>

<span class="c1"># 2. Entrada do usuário</span>
<span class="nb">puts</span> <span class="s2">"--- Sistema de Login v1.0 ---"</span>
<span class="nb">print</span> <span class="s2">"Digite sua senha: "</span>
<span class="n">senha_digitada</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span> <span class="c1"># .chomp remove a quebra de linha</span>

<span class="c1"># 3. Estrutura Unless (A Lógica)</span>
<span class="c1"># "A menos que a senha digitada seja igual à correta..."</span>
<span class="k">unless</span> <span class="n">senha_digitada</span> <span class="o">==</span> <span class="n">senha_correta</span>
  <span class="nb">puts</span> <span class="s2">"ERRO: Acesso negado! Senha incorreta."</span>
<span class="k">else</span>
  <span class="c1"># Se o unless for falso (ou seja, as senhas SÃO iguais), cai aqui</span>
  <span class="nb">puts</span> <span class="s2">"SUCESSO: Bem-vindo ao sistema!"</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Neste exemplo, usamos <code class="text-white-50 text-light">unless</code> para verificar se a senha digitada pelo usuário é diferente da senha correta. Se for diferente, exibimos uma mensagem de erro. Caso contrário, damos as boas-vindas ao usuário.</p>

<h2 id="case">Case</h2>
<hr />

<p>Outra estrutura condicional muito útil em Ruby é o <code class="text-white-50 text-light">case</code>. Ele é ideal quando precisamos comparar uma variável com vários valores possíveis. Ele funciona como uma série de <code class="text-white-50 text-light">if</code> e <code class="text-white-50 text-light">elsif</code>, mas de uma forma mais organizada, fácil de ler, entender e manter.</p>

<p>A sintaxe (forma de escrever) básica do <code class="text-white-50 text-light">case</code> é a seguinte:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">case</span> <span class="n">expressão</span>
<span class="k">when</span> <span class="n">valor1</span>
  <span class="c1"># Código a ser executado se expressão == valor1</span>
<span class="k">when</span> <span class="n">valor2</span>
  <span class="c1"># Código a ser executado se expressão == valor2</span>
<span class="k">else</span>
  <span class="c1"># Código a ser executado se nenhum dos valores corresponder</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Aqui, a <code class="text-white-50 text-light">expressão</code> é avaliada uma vez, e seu valor é comparado com cada <code class="text-white-50 text-light">valor</code> listado após os <code class="text-white-50 text-light">when</code>. Se houver uma correspondência, o código associado a esse <code class="text-white-50 text-light">when</code> é executado. Se nenhum valor corresponder, o código dentro do <code class="text-white-50 text-light">else</code> será executado (se houver um).</p>

<p>Esse <code class="text-white-50 text-light">when</code> funciona como um “se for igual a” ele significa “se a expressão for igual a esse valor”.</p>

<h3 id="exemplo-case">Exemplo com Case</h3>
<hr />

<p>Vamos criar um exemplo usando <code class="text-white-50 text-light">case</code> para determinar a categoria de um produto com base no seu código.</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 1. Definição do Hash com os códigos e categorias</span>
<span class="n">categorias</span> <span class="o">=</span> <span class="p">{</span>
  <span class="s2">"A1"</span> <span class="o">=&gt;</span> <span class="s2">"Eletrônicos"</span><span class="p">,</span>
  <span class="s2">"B2"</span> <span class="o">=&gt;</span> <span class="s2">"Roupas"</span><span class="p">,</span>
  <span class="s2">"C3"</span> <span class="o">=&gt;</span> <span class="s2">"Alimentos"</span><span class="p">,</span>
  <span class="s2">"D4"</span> <span class="o">=&gt;</span> <span class="s2">"Livros"</span>
<span class="p">}</span>

<span class="c1"># 2. Entrada do usuário</span>
<span class="nb">print</span> <span class="s2">"Digite o código do produto: "</span>
<span class="n">codigo_produto</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">.</span><span class="nf">upcase</span> <span class="c1"># .upcase para garantir maiúsculas</span>

<span class="c1"># 3. Estrutura Case (A Lógica)</span>

<span class="k">case</span> <span class="n">codigo_produto</span>
<span class="k">when</span> <span class="s2">"A1"</span>
  <span class="nb">puts</span> <span class="s2">"O código </span><span class="si">#{</span><span class="n">codigo_produto</span><span class="si">}</span><span class="s2"> pertence à categoria: </span><span class="si">#{</span><span class="n">categorias</span><span class="p">[</span><span class="n">codigo_produto</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span>
<span class="k">when</span> <span class="s2">"B2"</span>
  <span class="nb">puts</span> <span class="s2">"O código </span><span class="si">#{</span><span class="n">codigo_produto</span><span class="si">}</span><span class="s2"> pertence à categoria: </span><span class="si">#{</span><span class="n">categorias</span><span class="p">[</span><span class="n">codigo_produto</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span>
<span class="k">when</span> <span class="s2">"C3"</span>
  <span class="nb">puts</span> <span class="s2">"O código </span><span class="si">#{</span><span class="n">codigo_produto</span><span class="si">}</span><span class="s2"> pertence à categoria: </span><span class="si">#{</span><span class="n">categorias</span><span class="p">[</span><span class="n">codigo_produto</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span>
<span class="k">when</span> <span class="s2">"D4"</span>
  <span class="nb">puts</span> <span class="s2">"O código </span><span class="si">#{</span><span class="n">codigo_produto</span><span class="si">}</span><span class="s2"> pertence à categoria: </span><span class="si">#{</span><span class="n">categorias</span><span class="p">[</span><span class="n">codigo_produto</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span>
<span class="k">else</span>
  <span class="nb">puts</span> <span class="s2">"Código inválido! Nenhuma categoria de produto encontrada."</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Neste exemplo, usamos o <code class="text-white-50 text-light">case</code> para comparar o código do produto digitado pelo usuário com vários códigos possíveis. Dependendo do código, exibimos a categoria correspondente. Se o código não corresponder a nenhum dos valores listados, exibimos uma mensagem de código inválido.</p>

<p>Quando usar o <code class="text-white-50 text-light">case</code> é bom? Use o <code class="text-white-50 text-light">case</code> quando você tiver uma variável ou expressão que precisa ser comparada com vários valores diferentes.</p>

<p>Ele bom para:</p>

<ul>
  <li>Menus de opções</li>
  <li>Categorias</li>
  <li>Estados ou status</li>
  <li>Qualquer situação onde múltiplas comparações são necessárias</li>
</ul>

<p>Mas, desde que a quantidade de possibilidades para essas comparações não seja muito grande e complexa. Ela precisa ser limitada para manter a legibilidade do código. No futuro aprenderemos a lidar com os casos maiores de complexidade.</p>

<h2 id="exercicios-praticos">Exercícios Práticos</h2>
<hr />

<p>Agora que aprendemos sobre <code class="text-white-50 text-light">unless</code> e <code class="text-white-50 text-light">case</code>, é hora de praticar. Vamos fazer uma lista de exercícios que envolvem todas as estruturas condicionais que aprendemos até agora.</p>

<h3 id="exercicio-1">Exercício 1</h3>
<hr />

<p>Faça um algoritmo que leia os valores A, B, C e imprima na tela se a soma de A + B é menor que C.</p>

<p>Resposta:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="no">A</span> <span class="o">=</span> <span class="mf">0.0</span>
<span class="no">B</span> <span class="o">=</span> <span class="mf">0.0</span>
<span class="no">C</span> <span class="o">=</span> <span class="mf">0.0</span>

<span class="nb">print</span> <span class="s2">"Digite o valor de A: "</span>
<span class="no">A</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="nb">print</span> <span class="s2">"Digite o valor de B: "</span>
<span class="no">B</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="nb">print</span> <span class="s2">"Digite o valor de C: "</span>
<span class="no">C</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="k">if</span> <span class="no">A</span> <span class="o">+</span> <span class="no">B</span> <span class="o">&lt;</span> <span class="no">C</span>
  <span class="nb">puts</span> <span class="s2">"A soma de A + B = </span><span class="si">#{</span><span class="no">A</span> <span class="o">+</span> <span class="no">B</span><span class="si">}</span><span class="s2"> é menor que C = </span><span class="si">#{</span><span class="no">C</span><span class="si">}</span><span class="s2">."</span>
<span class="k">else</span>
  <span class="nb">puts</span> <span class="s2">"A soma de A + B = </span><span class="si">#{</span><span class="no">A</span> <span class="o">+</span> <span class="no">B</span><span class="si">}</span><span class="s2"> é maior ou igual a C = </span><span class="si">#{</span><span class="no">C</span><span class="si">}</span><span class="s2">."</span>
<span class="k">end</span>
</code></pre></div></div>

<h3 id="exercicio-2">Exercício 2</h3>
<hr />

<p>Peça dois números inteiros (vamos chamá-los de A e B).</p>

<ul>
  <li>Se eles forem iguais, some os dois.</li>
  <li>Se forem diferentes, multiplique o A pelo B. No final, guarde o resultado numa variável chamada “C” e mostre esse valor na tela.</li>
</ul>

<p>Resposta:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">print</span> <span class="s2">"Digite o valor de A: "</span>
<span class="no">A</span> <span class="o">=</span> <span class="no">Integer</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="nb">print</span> <span class="s2">"Digite o valor de B: "</span>
<span class="no">B</span> <span class="o">=</span> <span class="no">Integer</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="k">if</span> <span class="no">A</span> <span class="o">==</span> <span class="no">B</span>
  <span class="no">C</span> <span class="o">=</span> <span class="no">A</span> <span class="o">+</span> <span class="no">B</span>
<span class="k">else</span>
  <span class="no">C</span> <span class="o">=</span> <span class="no">A</span> <span class="o">*</span> <span class="no">B</span>
<span class="k">end</span>

<span class="nb">puts</span> <span class="s2">"O resultado é: </span><span class="si">#{</span><span class="no">C</span><span class="si">}</span><span class="s2">"</span>
</code></pre></div></div>

<h3 id="exercicio-3">Exercício 3</h3>
<hr />

<p>Pegue um número qualquer:</p>

<ul>
  <li>Se ele for positivo, calcule o dobro dele (vezes 2).</li>
  <li>Se ele for negativo, calcule o triplo dele (vezes 3). Mostre o resultado da conta.</li>
</ul>

<p>Resposta:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">print</span> <span class="s2">"Digite um número: "</span>
<span class="n">numero</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="k">if</span> <span class="n">numero</span> <span class="o">&gt;</span> <span class="mi">0</span>
  <span class="n">resultado</span> <span class="o">=</span> <span class="n">numero</span> <span class="o">*</span> <span class="mi">2</span>
<span class="k">elsif</span> <span class="n">numero</span> <span class="o">&lt;</span> <span class="mi">0</span>
  <span class="n">resultado</span> <span class="o">=</span> <span class="n">numero</span> <span class="o">*</span> <span class="mi">3</span>
<span class="k">else</span>
  <span class="n">resultado</span> <span class="o">=</span> <span class="n">numero</span>
<span class="k">end</span>

<span class="nb">puts</span> <span class="s2">"O resultado é: </span><span class="si">#{</span><span class="n">resultado</span><span class="si">}</span><span class="s2">"</span>
</code></pre></div></div>

<h3 id="exercicio-4">Exercício 4</h3>
<hr />

<p>Peça três números inteiros que sejam diferentes uns dos outros. Depois, mostre esses três números organizados em ordem decrescente (do maior para o menor).</p>

<p>Resposta:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">n1</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">n2</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">n3</span> <span class="o">=</span> <span class="mi">0</span>

<span class="n">numeros</span> <span class="o">=</span> <span class="p">[]</span>

<span class="nb">print</span> <span class="s2">"Digite o primeiro número: "</span>
<span class="n">n1</span> <span class="o">=</span> <span class="no">Integer</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="n">numeros</span> <span class="o">&lt;&lt;</span> <span class="n">n1</span>

<span class="nb">print</span> <span class="s2">"Digite o segundo número: "</span>
<span class="n">n2</span> <span class="o">=</span> <span class="no">Integer</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="n">numeros</span> <span class="o">&lt;&lt;</span> <span class="n">n2</span>

<span class="nb">print</span> <span class="s2">"Digite o terceiro número: "</span>
<span class="n">n3</span> <span class="o">=</span> <span class="no">Integer</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="n">numeros</span> <span class="o">&lt;&lt;</span> <span class="n">n3</span>

<span class="n">numeros</span><span class="p">.</span><span class="nf">sort!</span><span class="p">.</span><span class="nf">reverse!</span>

<span class="nb">puts</span> <span class="s2">"Números em ordem decrescente: </span><span class="si">#{</span><span class="n">numeros</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="s1">', '</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span>
</code></pre></div></div>

<h3 id="exercicio-5">Exercício 5</h3>
<hr />

<p>Peça a altura e o sexo de uma pessoa para calcular o peso ideal dela usando estas regras:</p>

<ul>
  <li>Para pessoas biologicamente do sexo masculino: (72.7 × altura) − 58</li>
  <li>Para pessoas biologicamente do sexo feminino: (62.1 × altura) − 44.7</li>
</ul>

<p>Depois mostre o peso ideal calculado na tela.</p>

<p>Resposta:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">print</span> <span class="s2">"Digite sua altura em metros (ex: 1.75): "</span>
<span class="n">altura</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="nb">print</span> <span class="s2">"Digite seu sexo biológico (M/F): "</span>
<span class="n">sexo</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">.</span><span class="nf">upcase</span>

<span class="k">case</span> <span class="n">sexo</span>
<span class="k">when</span> <span class="s2">"M"</span>
  <span class="n">peso_ideal</span> <span class="o">=</span> <span class="p">(</span><span class="mf">72.7</span> <span class="o">*</span> <span class="n">altura</span><span class="p">)</span> <span class="o">-</span> <span class="mi">58</span>
<span class="k">when</span> <span class="s2">"F"</span>
  <span class="n">peso_ideal</span> <span class="o">=</span> <span class="p">(</span><span class="mf">62.1</span> <span class="o">*</span> <span class="n">altura</span><span class="p">)</span> <span class="o">-</span> <span class="mf">44.7</span>
<span class="k">else</span>
  <span class="nb">puts</span> <span class="s2">"Dados inseridos inválidos. Fim do programa."</span>
  <span class="nb">exit</span>
<span class="k">end</span>

<span class="nb">puts</span> <span class="s2">"Você é biologicamente do sexo </span><span class="si">#{</span><span class="n">sexo</span> <span class="o">==</span> <span class="s1">'M'</span> <span class="p">?</span> <span class="s1">'masculino'</span> <span class="p">:</span> <span class="s1">'feminino'</span><span class="si">}</span><span class="s2"> e seu peso ideal é: </span><span class="si">#{</span><span class="n">peso_ideal</span><span class="p">.</span><span class="nf">round</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="s2"> kg."</span>
</code></pre></div></div>

<h3 id="exercicio-6">Exercício 6</h3>
<hr />

<p>Calcule o Índice de Massa Corporal usando a fórmula: IMC = peso ÷ (altura × altura). Depois, verifique onde o resultado se encaixa e mostre a condição da pessoa:</p>

<ul>
  <li>Menor que 18,5: Abaixo do peso</li>
  <li>Entre 18,5 e 24,9: Peso normal</li>
  <li>Entre 25,0 e 29,9: Sobrepeso</li>
  <li>Entre 30,0 e 34,9: Obesidade grau I</li>
  <li>Entre 35,0 e 39,9: Obesidade grau II</li>
  <li>Maior que 40,0: Obesidade grau III</li>
</ul>

<p>Resposta:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">print</span> <span class="s2">"Digite seu peso em kg: "</span>
<span class="n">peso</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="nb">print</span> <span class="s2">"Digite sua altura em metros (ex: 1.75): "</span>
<span class="n">altura</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="n">imc</span> <span class="o">=</span> <span class="n">peso</span> <span class="o">/</span> <span class="p">(</span><span class="n">altura</span> <span class="o">*</span> <span class="n">altura</span><span class="p">)</span>

<span class="k">case</span> <span class="n">imc</span>
<span class="k">when</span> <span class="mi">0</span><span class="o">...</span><span class="mf">18.5</span>
  <span class="n">condicao</span> <span class="o">=</span> <span class="s2">"Abaixo do peso"</span>
<span class="k">when</span> <span class="mf">18.5</span><span class="o">..</span><span class="mf">24.9</span>
  <span class="n">condicao</span> <span class="o">=</span> <span class="s2">"Peso normal"</span>
<span class="k">when</span> <span class="mf">25.0</span><span class="o">..</span><span class="mf">29.9</span>
  <span class="n">condicao</span> <span class="o">=</span> <span class="s2">"Sobrepeso"</span>
<span class="k">when</span> <span class="mf">30.0</span><span class="o">..</span><span class="mf">34.9</span>
  <span class="n">condicao</span> <span class="o">=</span> <span class="s2">"Obesidade grau I"</span>
<span class="k">when</span> <span class="mf">35.0</span><span class="o">..</span><span class="mf">39.9</span>
  <span class="n">condicao</span> <span class="o">=</span> <span class="s2">"Obesidade grau II"</span>
<span class="k">when</span> <span class="mf">40.0</span><span class="o">..</span><span class="no">Float</span><span class="o">::</span><span class="no">INFINITY</span>
  <span class="n">condicao</span> <span class="o">=</span> <span class="s2">"Obesidade grau III"</span>
<span class="k">else</span>
  <span class="n">condicao</span> <span class="o">=</span> <span class="s2">"Dados inválidos"</span>
<span class="k">end</span>

<span class="nb">puts</span> <span class="s2">"Seu IMC é </span><span class="si">#{</span><span class="n">imc</span><span class="p">.</span><span class="nf">round</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="s2"> e você está classificado como: </span><span class="si">#{</span><span class="n">condicao</span><span class="si">}</span><span class="s2">."</span>
</code></pre></div></div>

<h3 id="exercicio-7">Exercício 7</h3>
<hr />

<p>Elabore um algoritmo que calcule o que deve ser pago por um produto, considerando o preço normal de etiqueta e a escolha da condição de pagamento. Utilize os códigos a seguir para ler qual a condição de pagamento escolhida e efetuar o cálculo adequado:</p>

<ul>
  <li><strong>Código 1</strong>: À vista em dinheiro ou cheque, recebe 10% de desconto.</li>
  <li><strong>Código 2</strong>: À vista no cartão de crédito, recebe 15% de desconto.</li>
  <li><strong>Código 3</strong>: Em duas vezes, preço normal de etiqueta sem juros.</li>
  <li><strong>Código 4</strong>: Em duas vezes, preço normal de etiqueta mais juros de 10%.</li>
</ul>

<p>Resposta:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">print</span> <span class="s2">"Digite o preço normal do produto: "</span>
<span class="n">preco</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="nb">puts</span> <span class="s2">"Escolha a condição de pagamento:"</span>
<span class="nb">puts</span> <span class="s2">"1 - À vista em dinheiro ou cheque (10% de desconto)"</span>
<span class="nb">puts</span> <span class="s2">"2 - À vista no cartão de crédito (15% de desconto)"</span>
<span class="nb">puts</span> <span class="s2">"3 - Em duas vezes (preço normal sem juros)"</span>
<span class="nb">puts</span> <span class="s2">"4 - Em duas vezes (preço normal mais 10% de juros)"</span>
<span class="nb">print</span> <span class="s2">"Opção: "</span>
<span class="n">opcao</span> <span class="o">=</span> <span class="no">Integer</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="k">case</span> <span class="n">opcao</span>
<span class="k">when</span> <span class="mi">1</span>
  <span class="n">valor_final</span> <span class="o">=</span> <span class="n">preco</span> <span class="o">*</span> <span class="mf">0.90</span>
  <span class="nb">puts</span> <span class="s2">"Valor a pagar: R$ </span><span class="si">#{</span><span class="n">valor_final</span><span class="p">.</span><span class="nf">round</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="s2"> (10% de desconto)"</span>
<span class="k">when</span> <span class="mi">2</span>
  <span class="n">valor_final</span> <span class="o">=</span> <span class="n">preco</span> <span class="o">*</span> <span class="mf">0.85</span>
  <span class="nb">puts</span> <span class="s2">"Valor a pagar: R$ </span><span class="si">#{</span><span class="n">valor_final</span><span class="p">.</span><span class="nf">round</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="s2"> (15% de desconto)"</span>
<span class="k">when</span> <span class="mi">3</span>
  <span class="n">valor_final</span> <span class="o">=</span> <span class="n">preco</span>
  <span class="n">parcela</span> <span class="o">=</span> <span class="n">valor_final</span> <span class="o">/</span> <span class="mi">2</span>
  <span class="nb">puts</span> <span class="s2">"Valor a pagar: R$ </span><span class="si">#{</span><span class="n">valor_final</span><span class="p">.</span><span class="nf">round</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="s2"> (Sem juros)"</span>
  <span class="nb">puts</span> <span class="s2">"2 parcelas de R$ </span><span class="si">#{</span><span class="n">parcela</span><span class="p">.</span><span class="nf">round</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span>
<span class="k">when</span> <span class="mi">4</span>
  <span class="n">valor_final</span> <span class="o">=</span> <span class="n">preco</span> <span class="o">*</span> <span class="mf">1.10</span>
  <span class="n">parcela</span> <span class="o">=</span> <span class="n">valor_final</span> <span class="o">/</span> <span class="mi">2</span>
  <span class="nb">puts</span> <span class="s2">"Valor a pagar: R$ </span><span class="si">#{</span><span class="n">valor_final</span><span class="p">.</span><span class="nf">round</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="s2"> (10% de juros)"</span>
  <span class="nb">puts</span> <span class="s2">"2 parcelas de R$ </span><span class="si">#{</span><span class="n">parcela</span><span class="p">.</span><span class="nf">round</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span>
<span class="k">else</span>
  <span class="nb">puts</span> <span class="s2">"Opção inválida."</span>
<span class="k">end</span>
</code></pre></div></div>

<h3 id="exercicio-8">Exercício 8</h3>
<hr />

<p>Escreva um algoritmo que leia o número de identificação, as 3 notas obtidas por um aluno nas 3 verificações e a média dos exercícios que fazem parte da avaliação, e calcule a média de aproveitamento, usando a fórmula:</p>

<p>MA = (Nota1 + Nota2 × 2 + Nota3 × 3 + ME) ÷ 7</p>

<p>A atribuição dos conceitos obedece as regras abaixo. O algoritmo deve escrever o número do aluno, suas notas, a média dos exercícios, a média de aproveitamento, o conceito correspondente e a mensagem ‘Aprovado’ se o conceito for A, B ou C, e ‘Reprovado’ se o conceito for D ou E.</p>

<ul>
  <li><strong>Média de aproveitamento maior ou igual a 90</strong>: Conceito A.</li>
  <li><strong>Média de aproveitamento maior ou igual a 75 e menor que 90</strong>: Conceito B.</li>
  <li><strong>Média de aproveitamento maior ou igual a 60 e menor que 75</strong>: Conceito C.</li>
  <li><strong>Média de aproveitamento maior ou igual a 40 e menor que 60</strong>: Conceito D.</li>
  <li><strong>Média de aproveitamento menor que 40</strong>: Conceito E.</li>
</ul>

<p>Resposta:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">print</span> <span class="s2">"Digite o número de identificação do aluno: "</span>
<span class="n">id_aluno</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span>

<span class="nb">print</span> <span class="s2">"Digite a nota 1: "</span>
<span class="n">nota1</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="nb">print</span> <span class="s2">"Digite a nota 2: "</span>
<span class="n">nota2</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="nb">print</span> <span class="s2">"Digite a nota 3: "</span>
<span class="n">nota3</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="nb">print</span> <span class="s2">"Digite a média dos exercícios (ME): "</span>
<span class="n">me</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="n">ma</span> <span class="o">=</span> <span class="p">(</span><span class="n">nota1</span> <span class="o">+</span> <span class="p">(</span><span class="n">nota2</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="n">nota3</span> <span class="o">*</span> <span class="mi">3</span><span class="p">)</span> <span class="o">+</span> <span class="n">me</span><span class="p">)</span> <span class="o">/</span> <span class="mi">7</span>

<span class="k">if</span> <span class="n">ma</span> <span class="o">&gt;=</span> <span class="mi">90</span>
  <span class="n">conceito</span> <span class="o">=</span> <span class="s2">"A"</span>
<span class="k">elsif</span> <span class="n">ma</span> <span class="o">&gt;=</span> <span class="mi">75</span>
  <span class="n">conceito</span> <span class="o">=</span> <span class="s2">"B"</span>
<span class="k">elsif</span> <span class="n">ma</span> <span class="o">&gt;=</span> <span class="mi">60</span>
  <span class="n">conceito</span> <span class="o">=</span> <span class="s2">"C"</span>
<span class="k">elsif</span> <span class="n">ma</span> <span class="o">&gt;=</span> <span class="mi">40</span>
  <span class="n">conceito</span> <span class="o">=</span> <span class="s2">"D"</span>
<span class="k">else</span>
  <span class="n">conceito</span> <span class="o">=</span> <span class="s2">"E"</span>
<span class="k">end</span>

<span class="k">case</span> <span class="n">conceito</span>
<span class="k">when</span> <span class="s2">"A"</span><span class="p">,</span> <span class="s2">"B"</span><span class="p">,</span> <span class="s2">"C"</span>
  <span class="n">situacao</span> <span class="o">=</span> <span class="s2">"Aprovado"</span>
<span class="k">else</span>
  <span class="n">situacao</span> <span class="o">=</span> <span class="s2">"Reprovado"</span>
<span class="k">end</span>

<span class="nb">puts</span> <span class="s2">"--- Boletim ---"</span>
<span class="nb">puts</span> <span class="s2">"Aluno ID: </span><span class="si">#{</span><span class="n">id_aluno</span><span class="si">}</span><span class="s2">"</span>
<span class="nb">puts</span> <span class="s2">"Notas: </span><span class="si">#{</span><span class="n">nota1</span><span class="si">}</span><span class="s2">, </span><span class="si">#{</span><span class="n">nota2</span><span class="si">}</span><span class="s2">, </span><span class="si">#{</span><span class="n">nota3</span><span class="si">}</span><span class="s2">"</span>
<span class="nb">puts</span> <span class="s2">"Média dos Exercícios: </span><span class="si">#{</span><span class="n">me</span><span class="si">}</span><span class="s2">"</span>
<span class="nb">puts</span> <span class="s2">"Média de Aproveitamento: </span><span class="si">#{</span><span class="n">ma</span><span class="p">.</span><span class="nf">round</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span>
<span class="nb">puts</span> <span class="s2">"Conceito: </span><span class="si">#{</span><span class="n">conceito</span><span class="si">}</span><span class="s2">"</span>
<span class="nb">puts</span> <span class="s2">"Situação: </span><span class="si">#{</span><span class="n">situacao</span><span class="si">}</span><span class="s2">"</span>
</code></pre></div></div>

<h3 id="exercicio-9">Exercício 9</h3>
<hr />

<p>Elabore um algoritmo para aprovar um empréstimo bancário. O programa deve ler a idade do cliente, a renda mensal, o valor do empréstimo solicitado, se o cliente possui restrições no CPF (Sim/Não) e o nível de relacionamento com o banco (1 - Bronze, 2 - Prata, 3 - Ouro).</p>

<p>As regras para aprovação são:</p>

<ol>
  <li><strong>Restrição</strong>: O empréstimo só pode ser analisado <strong>a menos que</strong> o cliente tenha restrições no CPF. Se tiver restrição, o pedido deve ser negado imediatamente.</li>
  <li><strong>Validação Básica</strong>:
    <ul>
      <li>Se a idade for menor que 18 anos, o pedido é negado.</li>
      <li>Se o valor do empréstimo for maior que 15 vezes a renda mensal, o pedido é negado.</li>
    </ul>
  </li>
  <li><strong>Taxa de Juros</strong>: Se aprovado, a taxa de juros depende do nível de relacionamento:
    <ul>
      <li><strong>Bronze</strong>: 10% de juros.</li>
      <li><strong>Prata</strong>: 5% de juros.</li>
      <li><strong>Ouro</strong>: Isento de juros (0%).</li>
    </ul>
  </li>
</ol>

<p>Resposta:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">print</span> <span class="s2">"Digite sua idade: "</span>
<span class="n">idade</span> <span class="o">=</span> <span class="no">Integer</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="nb">print</span> <span class="s2">"Digite sua renda mensal: "</span>
<span class="n">renda</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="nb">print</span> <span class="s2">"Digite o valor do empréstimo solicitado: "</span>
<span class="n">valor_emprestimo</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="nb">print</span> <span class="s2">"Possui restrição no CPF? (S/N): "</span>
<span class="n">texto_restricao</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">.</span><span class="nf">upcase</span>

<span class="k">if</span> <span class="n">texto_restricao</span> <span class="o">==</span> <span class="s2">"S"</span>
  <span class="n">restricao</span> <span class="o">=</span> <span class="kp">true</span>
<span class="k">elsif</span> <span class="n">texto_restricao</span> <span class="o">==</span> <span class="s2">"N"</span>
  <span class="n">restricao</span> <span class="o">=</span> <span class="kp">false</span>
<span class="k">else</span>
  <span class="nb">puts</span> <span class="s2">"Dado inválido. O programa será encerrado."</span>
  <span class="nb">exit</span>
<span class="k">end</span>

<span class="nb">puts</span> <span class="s2">"Nível de relacionamento:"</span>
<span class="nb">puts</span> <span class="s2">"1 - Bronze"</span>
<span class="nb">puts</span> <span class="s2">"2 - Prata"</span>
<span class="nb">puts</span> <span class="s2">"3 - Ouro"</span>
<span class="nb">print</span> <span class="s2">"Escolha o nível: "</span>
<span class="n">entrada_nivel</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span>

<span class="k">if</span> <span class="n">entrada_nivel</span> <span class="o">==</span> <span class="s2">"1"</span>
  <span class="n">nivel</span> <span class="o">=</span> <span class="mi">1</span>
<span class="k">elsif</span> <span class="n">entrada_nivel</span> <span class="o">==</span> <span class="s2">"2"</span>
  <span class="n">nivel</span> <span class="o">=</span> <span class="mi">2</span>
<span class="k">elsif</span> <span class="n">entrada_nivel</span> <span class="o">==</span> <span class="s2">"3"</span>
  <span class="n">nivel</span> <span class="o">=</span> <span class="mi">3</span>
<span class="k">else</span>
  <span class="nb">puts</span> <span class="s2">"Nível inválido. O programa será encerrado."</span>
  <span class="nb">exit</span>
<span class="k">end</span>

<span class="n">aprovado</span> <span class="o">=</span> <span class="kp">false</span>
<span class="n">motivo</span> <span class="o">=</span> <span class="s2">""</span>

<span class="c1"># "A menos que tenha restrição..." (Se NÃO tiver restrição, entra no bloco)</span>
<span class="k">unless</span> <span class="n">restricao</span>
  <span class="k">if</span> <span class="n">idade</span> <span class="o">&lt;</span> <span class="mi">18</span>
    <span class="n">motivo</span> <span class="o">=</span> <span class="s2">"Cliente menor de idade"</span>
  <span class="k">elsif</span> <span class="n">valor_emprestimo</span> <span class="o">&gt;</span> <span class="p">(</span><span class="n">renda</span> <span class="o">*</span> <span class="mi">15</span><span class="p">)</span>
    <span class="n">motivo</span> <span class="o">=</span> <span class="s2">"Valor solicitado excede o limite de 15x a renda"</span>
  <span class="k">else</span>
    <span class="n">aprovado</span> <span class="o">=</span> <span class="kp">true</span>
  <span class="k">end</span>
<span class="k">else</span>
  <span class="n">motivo</span> <span class="o">=</span> <span class="s2">"Cliente possui restrição no CPF"</span>
<span class="k">end</span>

<span class="k">if</span> <span class="n">aprovado</span>
  <span class="k">case</span> <span class="n">nivel</span>
  <span class="k">when</span> <span class="mi">1</span> <span class="c1"># Bronze</span>
    <span class="n">taxa</span> <span class="o">=</span> <span class="mf">0.10</span>
  <span class="k">when</span> <span class="mi">2</span> <span class="c1"># Prata</span>
    <span class="n">taxa</span> <span class="o">=</span> <span class="mf">0.05</span>
  <span class="k">when</span> <span class="mi">3</span> <span class="c1"># Ouro</span>
    <span class="n">taxa</span> <span class="o">=</span> <span class="mf">0.0</span>
  <span class="k">else</span>
    <span class="n">taxa</span> <span class="o">=</span> <span class="mf">0.10</span> <span class="c1"># Padrão para opção inválida</span>
  <span class="k">end</span>
  
  <span class="n">valor_final</span> <span class="o">=</span> <span class="n">valor_emprestimo</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">+</span> <span class="n">taxa</span><span class="p">)</span>
  <span class="nb">puts</span> <span class="s2">"--- Resultado ---"</span>
  <span class="nb">puts</span> <span class="s2">"Empréstimo Aprovado!"</span>
  <span class="nb">puts</span> <span class="s2">"Taxa de juros aplicada: </span><span class="si">#{</span><span class="p">(</span><span class="n">taxa</span> <span class="o">*</span> <span class="mi">100</span><span class="p">).</span><span class="nf">to_i</span><span class="si">}</span><span class="s2">%"</span>
  <span class="nb">puts</span> <span class="s2">"Valor total a pagar: R$ </span><span class="si">#{</span><span class="n">valor_final</span><span class="p">.</span><span class="nf">round</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span>
<span class="k">else</span>
  <span class="nb">puts</span> <span class="s2">"--- Resultado ---"</span>
  <span class="nb">puts</span> <span class="s2">"Empréstimo Negado."</span>
  <span class="nb">puts</span> <span class="s2">"Motivo: </span><span class="si">#{</span><span class="n">motivo</span><span class="si">}</span><span class="s2">"</span>
<span class="k">end</span>
</code></pre></div></div>

<h2 id="comentarios-sobre-os-exercicios">Comentários sobre os Exercícios</h2>
<hr />

<p>Vamos analisar cada exercício com calma para entender o que o código está fazendo.</p>

<h3 id="comentario-exercicio-1">Comentário sobre o Exercício 1</h3>
<hr />

<p>Neste exercício, a ideia era pedir para o computador ler três números (que chamamos de A, B e C) e depois verificar se a soma dos dois primeiros (A e B) é menor do que o terceiro (C).</p>

<ul>
  <li><code class="text-white-50 text-light">A = 0.0</code>, <code class="text-white-50 text-light">B = 0.0</code>, <code class="text-white-50 text-light">C = 0.0</code>: Criamos as variáveis A, B e C já com um valor inicial de 0.0. Isso serve para dizer ao computador que elas vão guardar números decimais (com vírgula).</li>
  <li><code class="text-white-50 text-light">A = Float(gets.chomp)</code>: O comando <code class="text-white-50 text-light">gets</code> pega o que foi digitado no teclado. O <code class="text-white-50 text-light">chomp</code> serve para limpar a tecla “Enter” que fica no final quando confirmamos a digitação. O <code class="text-white-50 text-light">Float()</code> transforma esse texto em um número decimal, para podermos fazer contas com ele.</li>
  <li><code class="text-white-50 text-light">if A + B &lt; C</code>: Aqui o computador verifica: “A soma de A mais B é menor que C?”.</li>
  <li><code class="text-white-50 text-light">puts</code>: Mostra o resultado na tela. O símbolo <code class="text-white-50 text-light">#{}</code> serve para colocar o valor da variável dentro do texto.</li>
</ul>

<p>Usamos <code class="text-white-50 text-light">Float</code> (número decimal) em vez de <code class="text-white-50 text-light">Integer</code> (número inteiro) para que o programa funcione mesmo se alguém digitar valores quebrados, como 2.5.</p>

<h3 id="comentario-exercicio-2">Comentário sobre o Exercício 2</h3>
<hr />

<p>A proposta aqui era comparar dois números. Se eles fossem iguais, deveríamos somar um ao outro. Se fossem diferentes, deveríamos multiplicar um pelo outro.</p>

<p><strong>Análise Linha a Linha:</strong></p>

<ul>
  <li><code class="text-white-50 text-light">Integer(gets.chomp)</code>: Transforma o que foi digitado em um número inteiro (sem vírgula), pois o exercício pedia números inteiros.</li>
  <li><code class="text-white-50 text-light">if A == B</code>: O sinal <code class="text-white-50 text-light">==</code> serve para comparar. O computador pergunta: “O valor de A é igual ao valor de B?”. Se for sim, ele executa a linha de baixo.</li>
  <li><code class="text-white-50 text-light">C = A + B</code>: Soma os valores e guarda o resultado na variável C.</li>
  <li><code class="text-white-50 text-light">else</code>: Significa “senão”. Ou seja, se A não for igual a B, o computador executa o que está aqui dentro.</li>
  <li><code class="text-white-50 text-light">C = A * B</code>: Multiplica os valores.</li>
</ul>

<p><strong>Variável Auxiliar C</strong>: Note que guardamos o resultado em C e só usamos o comando <code class="text-white-50 text-light">puts</code> uma vez no final. Isso evita repetir código desnecessariamente.</p>

<h3 id="comentario-exercicio-3">Comentário sobre o Exercício 3</h3>
<hr />

<p>Precisávamos pegar um número e fazer uma verificação. Se ele fosse maior que zero (positivo), o resultado seria o dobro dele. Se fosse menor que zero (negativo), o resultado seria o triplo.</p>

<p><strong>Análise Linha a Linha:</strong></p>

<ul>
  <li><code class="text-white-50 text-light">if numero &gt; 0</code>: Verifica se o número é maior que zero.</li>
  <li><code class="text-white-50 text-light">elsif numero &lt; 0</code>: Verifica se o número é menor que zero.</li>
  <li><code class="text-white-50 text-light">else</code>: Se não é maior nem menor que zero, só pode ser o próprio zero. Nesse caso, o resultado continua sendo zero.</li>
</ul>

<p><strong>O caso do Zero</strong>: O código lida bem com o zero. Se tivéssemos feito de qualquer jeito, poderíamos acabar multiplicando o zero sem querer, mas aqui ele cai no <code class="text-white-50 text-light">else</code> e fica inalterado.</p>

<h3 id="comentario-exercicio-4">Comentário sobre o Exercício 4</h3>
<hr />

<p>A missão era colocar três números em ordem, do maior para o menor (ordem decrescente).</p>

<p><strong>Análise Linha a Linha:</strong></p>

<ul>
  <li><code class="text-white-50 text-light">numeros = []</code>: Criamos uma lista vazia. Imagine uma lista (Array) como uma caixa onde podemos guardar vários valores juntos, um depois do outro.</li>
  <li><code class="text-white-50 text-light">numeros &lt;&lt; n1</code>: O símbolo <code class="text-white-50 text-light">&lt;&lt;</code> coloca o valor dentro da nossa lista. Fazemos isso com os três números.</li>
  <li><code class="text-white-50 text-light">numeros.sort!.reverse!</code>: Aqui usamos dois comandos poderosos do Ruby.
    <ul>
      <li><code class="text-white-50 text-light">.sort!</code>: Organiza a lista do menor para o maior.</li>
      <li><code class="text-white-50 text-light">.reverse!</code>: Inverte a lista, ficando do maior para o menor.</li>
    </ul>
  </li>
  <li><code class="text-white-50 text-light">.join(', ')</code>: Junta todos os números da lista em um texto só, separando por vírgula, para mostrar na tela.</li>
</ul>

<p><strong>Facilidade das Listas</strong>: Usar uma lista (Array) é muito mais fácil do que tentar comparar cada número com o outro usando vários <code class="text-white-50 text-light">if</code>. O Ruby já tem ferramentas prontas para ordenar listas.</p>

<h3 id="comentario-exercicio-5">Comentário sobre o Exercício 5</h3>
<hr />

<p>O exercício pedia para calcular o peso ideal usando duas informações: a altura e o sexo biológico da pessoa.</p>

<p><strong>Análise Linha a Linha:</strong></p>

<ul>
  <li><code class="text-white-50 text-light">gets.chomp.upcase</code>: O <code class="text-white-50 text-light">upcase</code> transforma o texto digitado em letras maiúsculas. Assim, se a pessoa digitar “m” minúsculo, o programa entende como “M” maiúsculo e funciona corretamente.</li>
  <li><code class="text-white-50 text-light">case sexo</code>: Inicia uma verificação de casos. É como dizer “No caso da variável sexo ser…”.</li>
  <li><code class="text-white-50 text-light">when "M"</code> e <code class="text-white-50 text-light">when "F"</code>: Verifica se é “M” ou “F”. Dependendo da letra, usa a fórmula matemática correta para cada caso.</li>
  <li><code class="text-white-50 text-light">exit</code>: Se a pessoa digitar uma letra que não seja M ou F, o programa avisa e encerra (sai) imediatamente, para não fazer contas erradas.</li>
</ul>

<p><strong>case vs if</strong>: Quando queremos verificar se uma variável é igual a várias coisas diferentes (é igual a M? é igual a F?), usar o <code class="text-white-50 text-light">case</code> deixa o texto mais limpo e fácil de ler do que usar vários <code class="text-white-50 text-light">if</code>.</p>

<h3 id="comentario-exercicio-6">Comentário sobre o Exercício 6</h3>
<hr />

<p>Aqui calculamos o Índice de Massa Corporal (IMC) e depois verificamos em qual categoria de peso esse valor se encaixa.</p>

<p><strong>Análise Linha a Linha:</strong></p>

<ul>
  <li><code class="text-white-50 text-light">imc = peso / (altura * altura)</code>: Faz a conta matemática do IMC.</li>
  <li><code class="text-white-50 text-light">case imc</code>: Vamos analisar o valor do IMC.</li>
  <li><code class="text-white-50 text-light">when 18.5..24.9</code>: O Ruby permite verificar se um número está dentro de um intervalo. Os dois pontos <code class="text-white-50 text-light">..</code> significam “de 18.5 até 24.9”. Isso facilita muito a leitura.</li>
  <li><code class="text-white-50 text-light">when 40.0..Float::INFINITY</code>: Verifica se o valor vai de 40 até o infinito (qualquer valor acima de 40).</li>
</ul>

<p><strong>Intervalos (Ranges)</strong>: Escrever <code class="text-white-50 text-light">18.5..24.9</code> é muito mais simples do que escrever “se for maior ou igual a 18.5 E menor ou igual a 24.9”.</p>

<h3 id="comentario-exercicio-7">Comentário sobre o Exercício 7</h3>
<hr />

<p>A ideia era calcular o valor final de uma compra dependendo de como a pessoa escolheu pagar (à vista, parcelado, etc).</p>

<p><strong>Análise Linha a Linha:</strong></p>

<ul>
  <li><strong>Menu de Opções</strong>: Primeiro mostramos as opções (1, 2, 3, 4) na tela.</li>
  <li><code class="text-white-50 text-light">when 1</code>: Se escolher 1, multiplicamos por 0.90 (que é o mesmo que dar 10% de desconto).</li>
  <li><code class="text-white-50 text-light">when 3</code>: Se escolher 3, apenas dividimos o preço por 2, sem juros nem desconto.</li>
  <li><code class="text-white-50 text-light">when 4</code>: Se escolher 4, multiplicamos por 1.10 (aumenta 10%, ou seja, juros) e depois dividimos pelas parcelas.</li>
</ul>

<p><strong>Organização</strong>: Cada opção de pagamento tem seu próprio bloco de código. Se amanhã a loja mudar a regra dos juros, basta mexer apenas no bloco da opção 4, sem bagunçar o resto.</p>

<h3 id="comentario-exercicio-8">Comentário sobre o Exercício 8</h3>
<hr />

<p>Precisávamos calcular uma média de notas, mas algumas notas valiam mais que as outras (média ponderada). Depois, transformamos essa nota numérica em um conceito de letra (A, B, C, D ou E).</p>

<p><strong>Análise Linha a Linha:</strong></p>

<ul>
  <li><strong>Cálculo da Média</strong>: Usamos parênteses para garantir que as multiplicações aconteçam antes da soma, seguindo as regras da matemática.</li>
  <li><strong>if/elsif para Conceito</strong>: O código verifica as notas da maior para a menor. Primeiro vê se é maior que 90. Se não for, vê se é maior que 75, e assim por diante.</li>
  <li><code class="text-white-50 text-light">case conceito</code>:
    <ul>
      <li><code class="text-white-50 text-light">when "A", "B", "C"</code>: A vírgula funciona como um “OU”. Se o conceito for A, OU B, OU C, a pessoa está aprovada.</li>
    </ul>
  </li>
</ul>

<p><strong>Passo a passo</strong>: Primeiro calculamos o número, depois transformamos em letra, e por fim decidimos se aprovou ou não. Fazer uma coisa de cada vez deixa o programa mais organizado.</p>

<h3 id="comentario-exercicio-9">Comentário sobre o Exercício 9</h3>
<hr />

<p>Este foi o exercício mais complexo. Precisávamos decidir se um empréstimo seria aprovado ou não, seguindo várias regras sobre idade, renda e restrições no nome.</p>

<p><strong>Análise Linha a Linha:</strong></p>

<ul>
  <li><strong>Sim ou Não</strong>: Primeiro transformamos a resposta “S” ou “N” em verdadeiro (<code class="text-white-50 text-light">true</code>) ou falso (<code class="text-white-50 text-light">false</code>). Isso ajuda o computador a tomar decisões lógicas depois.</li>
  <li><code class="text-white-50 text-light">unless restricao</code>: O <code class="text-white-50 text-light">unless</code> funciona como um “a não ser que”. Podemos ler como: “Faça isso, a não ser que a pessoa tenha restrição”.
    <ul>
      <li>Se tiver restrição, ele pula toda a análise e vai direto para a parte de negar o empréstimo.</li>
      <li>Se não tiver restrição, ele entra no bloco para verificar idade e renda.</li>
    </ul>
  </li>
  <li><strong>Decisão e Cálculo</strong>: Usamos uma variável chamada <code class="text-white-50 text-light">aprovado</code> para marcar se deu tudo certo. Só no final, se estiver aprovado, é que calculamos os juros baseados no nível do cliente (Bronze, Prata ou Ouro).</li>
</ul>

<p><strong>Portão de Entrada</strong>: O <code class="text-white-50 text-light">unless</code> serviu como um segurança na porta. Se tiver problema no CPF, nem adianta olhar o resto (idade, renda), o pedido já é barrado logo no início.</p>

<h2 id="resumo">Resumo</h2>
<hr />

<p>Neste artigo, expandimos nosso conhecimento sobre como fazer o computador tomar decisões. Além das estruturas básicas que já conhecíamos (<code class="text-white-50 text-light">if</code>, <code class="text-white-50 text-light">else</code> e <code class="text-white-50 text-light">elsif</code>), aprendemos duas novas ferramentas muito poderosas:</p>

<p><strong>Unless (A menos que)</strong>: É como um “se não”. Em vez de pensar “se isso for verdade, faça aquilo”, pensamos “a menos que isso seja verdade, faça aquilo”. É útil quando queremos focar nas exceções ou quando a lógica negativa faz mais sentido na linguagem humana.</p>

<p><strong>Case (Caso)</strong>: Uma forma muito organizada de verificar várias possibilidades para uma mesma variável. Em vez de escrever vários <code class="text-white-50 text-light">if</code> e <code class="text-white-50 text-light">elsif</code>, usamos <code class="text-white-50 text-light">when</code> para cada opção. É perfeito para menus, categorias ou qualquer situação onde temos muitas comparações de igualdade. No <code class="text-white-50 text-light">when</code>, vimos que os <code class="text-white-50 text-light">..</code> (dois pontos) ajudam a definir intervalos de valores, ou seja, “de valor X até valor Y”.</p>

<p>Através de nove exercícios práticos, vimos como essas estruturas funcionam em situações do dia a dia: desde comparações simples entre números até sistemas complexos como análise de empréstimos bancários. Cada exercício nos ensinou algo diferente sobre como organizar a lógica do programa.</p>

<p>Também vimos que existem várias formas de resolver o mesmo problema. Podemos usar <code class="text-white-50 text-light">if</code> com negação (<code class="text-white-50 text-light">!</code>) ou usar <code class="text-white-50 text-light">unless</code>. Podemos fazer vários <code class="text-white-50 text-light">elsif</code> ou organizar tudo num <code class="text-white-50 text-light">case</code>. A escolha depende de qual forma deixa o código mais organizado, legível e fácil de manter.</p>

<p>Quando programamos além de calcular o quanto nosso código custa ao computador, precisamos pensar também em como ele será entendido por outras pessoas programadoras (ou para o nosso “eu” do futuro). Código limpo e bem estruturado é tão importante quanto código que funciona corretamente, pois se a gente precisar voltar nele depois, vai agradecer por ter construído um bom código desde o início.</p>]]></content><author><name>Louise Suelen</name></author><category term="Programação" /><category term="programação" /><category term="tecnologia" /><summary type="html"><![CDATA[Neste artigo, continuamos nossa exploração das expressões condicionais em Ruby, focando em estruturas como 'case', 'unless' e fazendo vários exercícios práticos com todas as estruturas condicionais aprendidas.]]></summary></entry><entry xml:lang="pt-BR"><title type="html">Introdução à Programação: Expressões Condicionais em Ruby</title><link href="https://pcdnaescola.com.br/introducao-a-programacao-expressoes-condicionais-em-ruby/" rel="alternate" type="text/html" title="Introdução à Programação: Expressões Condicionais em Ruby" /><published>2025-09-20T13:00:00+00:00</published><updated>2025-09-20T13:00:00+00:00</updated><id>https://pcdnaescola.com.br/introducao-a-programacao-expressoes-condicionais-em-ruby</id><content type="html" xml:base="https://pcdnaescola.com.br/introducao-a-programacao-expressoes-condicionais-em-ruby/"><![CDATA[<div class="text-center">
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn6fzxw5n9y8qmjyny44v.png" alt="" loading="lazy" aria-hidden="true" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

</div>

<h2 id="apresentacao">Apresentação</h2>
<hr />

<p>No artigo anterior, explicamos que um programa feito em Ruby pode conversar com o mundo fora dele usando entrada e saída de dados, também chamado de I/O (imput e output no Inglês). Existem três caminhos principais para essa comunicação:</p>

<ul>
  <li><strong>STDIN</strong>:
    <ul>
      <li>O STDIN é como a “porta de entrada”, onde o programa recebe informações da pessoa que está usando ele.</li>
    </ul>
  </li>
  <li><strong>STDOUT</strong>:
    <ul>
      <li>O STDOUT é a “saída normal”, onde o programa mostra mensagens na tela para a pessoa.</li>
    </ul>
  </li>
  <li><strong>STDERR</strong>:
    <ul>
      <li>Já o STDERR serve para mostrar mensagens de erro quando acontece algum problema.</li>
    </ul>
  </li>
</ul>

<p>Falamos também sobre os comandos <code class="text-white-50 text-light">puts</code> e <code class="text-white-50 text-light">print</code>, que servem para mostrar mensagens no terminal. O <code class="text-white-50 text-light">puts</code> sempre pula para a linha de baixo depois de mostrar a mensagem, enquanto o <code class="text-white-50 text-light">print</code> continua na mesma linha.</p>

<p>Aprendemos a usar o <code class="text-white-50 text-light">gets</code> para pegar o que o usuário digita, o <code class="text-white-50 text-light">chomp</code> para tirar a quebra de linha desse texto e a guardar tudo em variáveis.</p>

<p>No final, criamos um programinha simples: ele pede para a pessoa digitar o nome, a turma, a disciplina e três notas. Depois, transforma as notas de texto para número usando <code class="text-white-50 text-light">Float()</code>, calcula a média e diz se a pessoa passou ou não.</p>

<p>Também observamos que, se tentarmos transformar em número alguma coisa que não é número, o Ruby vai dar erro.</p>

<p>No programa de cálculo de notas, ao digitar as letras <strong>abdcefg</strong> no campo da terceira nota, o sistema apresentou uma falha e exibiu uma mensagem informando que não foi possível converter o texto em número.</p>

<p>A execução do programa resultou na seguinte saída:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">parallels</span><span class="vi">@ubuntu</span><span class="ss">:~</span><span class="o">/</span><span class="n">curso</span><span class="o">-</span><span class="n">ruby</span><span class="err">$</span> <span class="n">ruby</span> <span class="mo">01</span><span class="o">-</span><span class="n">calcula</span><span class="o">-</span><span class="n">media</span><span class="p">.</span><span class="nf">rb</span>
<span class="no">Qual</span> <span class="n">é</span> <span class="n">seu</span> <span class="n">nome?</span> <span class="no">Louise</span>
<span class="no">Qual</span> <span class="n">é</span> <span class="n">a</span> <span class="n">sua</span> <span class="n">turma?</span> <span class="mi">7</span><span class="n">º</span> <span class="no">B</span>
<span class="no">Qual</span> <span class="n">disciplina</span> <span class="n">está</span> <span class="n">sendo</span> <span class="n">avaliada?</span> <span class="no">Matemática</span>
<span class="no">Digite</span> <span class="n">a</span> <span class="n">primeira</span> <span class="ss">nota: </span><span class="mf">9.7</span>
<span class="no">Digite</span> <span class="n">a</span> <span class="n">segunda</span> <span class="ss">nota: </span><span class="mf">2.1</span>
<span class="no">Digite</span> <span class="n">a</span> <span class="n">terceira</span> <span class="ss">nota: </span><span class="n">abdcefg</span>
<span class="o">&lt;</span><span class="n">internal</span><span class="ss">:kernel</span><span class="o">&gt;</span><span class="p">:</span><span class="mi">214</span><span class="ss">:in</span> <span class="sb">`Float': invalid value for Float(): "abdcefg" (ArgumentError)
        from 01-calcula-media.rb:26:in `</span><span class="o">&lt;</span><span class="n">main</span><span class="o">&gt;</span><span class="err">'</span>
<span class="n">parallels</span><span class="vi">@ubuntu</span><span class="ss">:~</span><span class="o">/</span><span class="n">curso</span><span class="o">-</span><span class="n">ruby</span><span class="err">$</span>
</code></pre></div></div>

<p>Isso aconteceu porque o programa tentou aplicar a função <code class="text-white-50 text-light">Float()</code> em informações que não eram números (eram letras), isso tornou impossível continuar com o processamento e com a execução do programa.</p>

<p>Mas, e se quisermos evitar que o programa pare por causa desse erro? Como fazer? Como podemos avisar o usuário que ele digitou algo errado e pedir para tentar de novo?</p>

<p>É aí que entram as expressões condicionais. Elas são fundamentais para tomar decisões dentro do código. Com elas, conseguimos verificar se o valor digitado pela pessoa é mesmo um número antes de tentar convertê-lo. Se for um número, tudo bem, o programa continua. Se não for, podemos mostrar uma mensagem de erro amigável e pedir para a pessoa digitar novamente.</p>

<p>Esse não é o único caso em que podemos usar as expressões condicionais. Elas servem, por exemplo, para fazer o programa tomar decisões diferentes de acordo com o que a pessoa escolher, checar se uma senha está certa, controlar quem pode acessar algo ou até mudar a forma como o programa funciona, dependendo do que acontece.</p>

<p>Portanto, adquirir conhecimento sobre essas estruturas torna o código mais robusto e dinâmico, permitindo o tratamento eficiente de situações inesperadas de maneira objetiva. Vamos explorar como usar essas expressões condicionais em Ruby para melhorar nossos programas.</p>

<h2 id="o-que-sao-expressoes-condicionais">O que são expressões condicionais</h2>
<hr />

<p>Uma expressão condicional é uma expressão que será usada para tomar uma decisão. Em outras palavras, é uma forma de dizer ao programa:</p>

<ul>
  <li>Se alguma condição for verdadeira, faça uma coisa;</li>
  <li>caso contrário, faça outra coisa (ou não faça nada).</li>
</ul>

<p>No dia a dia, nós fazemos isso o tempo todo:</p>

<ul>
  <li>Se estiver chovendo, leve o guarda-chuva.</li>
  <li>Se a nota for 7 ou mais, a pessoa passa.</li>
  <li>Se a senha estiver certa, pode entrar; se não, não pode.</li>
</ul>

<p>No código, essas decisões são implementadas (construídas) usando estruturas como <code class="text-white-50 text-light">if</code>, <code class="text-white-50 text-light">else</code>, <code class="text-white-50 text-light">elsif</code> e, em alguns casos, <code class="text-white-50 text-light">case</code>.</p>

<p>O ponto principal é: expressões condicionais são baseadas em condições que podem ser verdadeiras ou falsas. Essas condições são avaliadas pelo programa, e dependendo do resultado (verdadeiro ou falso), o programa decide o que fazer a seguir.</p>

<p>Normalmente, as expressões condicionais são construídas usando:</p>

<ul>
  <li>Operadores de comparação:
    <ul>
      <li><code class="text-white-50 text-light">==</code> (igual a),</li>
      <li><code class="text-white-50 text-light">!=</code> (diferente de),</li>
      <li><code class="text-white-50 text-light">&gt;</code> (maior que),</li>
      <li><code class="text-white-50 text-light">&lt;</code> (menor que),</li>
      <li><code class="text-white-50 text-light">&gt;=</code> (maior ou igual a),</li>
      <li><code class="text-white-50 text-light">&lt;=</code> (menor ou igual a).</li>
    </ul>
  </li>
  <li>Operadores lógicos:
    <ul>
      <li><code class="text-white-50 text-light">&amp;&amp;</code> (e),</li>
      <li><code class="text-white-50 text-light">||</code> (ou),</li>
      <li><code class="text-white-50 text-light">!</code> (não).</li>
    </ul>
  </li>
  <li>Combinação de variáveis:
    <ul>
      <li><code class="text-white-50 text-light">idade &gt;= 18</code> (verifica se a idade é maior ou igual a 18),</li>
      <li><code class="text-white-50 text-light">senha == "segredo"</code> (verifica se a senha é igual a “segredo”),</li>
      <li>E muito mais.</li>
    </ul>
  </li>
</ul>

<h2 id="operadores-de-comparacao-e-logicos">Operadores de comparação e lógicos</h2>
<hr />

<p>Para montar as condições, usadas nas expressões condicionais, utilizamos operadores de comparação e operadores lógicos.</p>

<h3 id="operadores-de-comparacao">Operadores de comparação</h3>
<hr />

<p>São usados para comparar dois valores. O resultado dessas comparações é sempre um valor booleano: <code class="text-white-50 text-light">true</code> (verdadeiro) ou <code class="text-white-50 text-light">false</code> (falso).</p>

<p>São usados para comparar dois valores:</p>

<ul>
  <li><code class="text-white-50 text-light">==</code> : Verifica se dois valores são iguais.</li>
  <li><code class="text-white-50 text-light">!=</code> : Verifica se dois valores são diferentes.</li>
  <li><code class="text-white-50 text-light">&gt;</code> : Verifica se o valor da esquerda é maior que o da direita.</li>
  <li><code class="text-white-50 text-light">&lt;</code> : Verifica se o valor da esquerda é menor que o da direita.</li>
  <li><code class="text-white-50 text-light">&gt;=</code> : Verifica se o valor da esquerda é maior ou igual ao da direita.</li>
  <li><code class="text-white-50 text-light">&lt;=</code> : Verifica se o valor da esquerda é menor ou igual ao da direita.</li>
</ul>

<p><strong>Observação</strong>: quando usamos <code class="text-white-50 text-light">&lt;=</code> ou <code class="text-white-50 text-light">&gt;=</code>, valores iguais também fazem a condição ser verdadeira. Por exemplo: <code class="text-white-50 text-light">5 &lt;= 5</code> retorna <code class="text-white-50 text-light">true</code>, assim como <code class="text-white-50 text-light">5 &gt;= 5</code> também retorna <code class="text-white-50 text-light">true</code>.</p>

<p>Isso acontece porque o símbolo <code class="text-white-50 text-light">=</code> indica “igual a”, então, nesses casos, estamos verificando se o valor é menor ou igual (ou maior ou igual) ao outro valor. Se os valores já forem iguais, a condição será verdadeira.</p>

<p>Vamos ver alguns exemplos de como esses operadores funcionam:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="mi">5</span> <span class="o">==</span> <span class="mi">5</span>      <span class="c1"># true</span>
<span class="mi">5</span> <span class="o">!=</span> <span class="mi">3</span>      <span class="c1"># true</span>
<span class="mi">10</span> <span class="o">&gt;</span> <span class="mi">7</span>      <span class="c1"># true</span>
<span class="mi">2</span> <span class="o">&lt;</span> <span class="mi">1</span>       <span class="c1"># false</span>
<span class="mi">7</span> <span class="o">&gt;=</span> <span class="mi">7</span>      <span class="c1"># true</span>
<span class="mi">3</span> <span class="o">&lt;=</span> <span class="mi">2</span>      <span class="c1"># false</span>
</code></pre></div></div>

<p>Aqui, usamos os operadores de comparação para verificar se os números são iguais, diferentes, maiores ou menores. O resultado de cada comparação é um valor booleano: <code class="text-white-50 text-light">true</code> ou <code class="text-white-50 text-light">false</code>.</p>

<p>Também podemos comparar textos (strings):</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s2">"Ruby"</span> <span class="o">==</span> <span class="s2">"Ruby"</span>    <span class="c1"># true</span>
<span class="s2">"Ruby"</span> <span class="o">==</span> <span class="s2">"ruby"</span>    <span class="c1"># false (maiúsculas e minúsculas fazem diferença)</span>
<span class="s2">"ana"</span> <span class="o">!=</span> <span class="s2">"joão"</span>     <span class="c1"># true</span>
<span class="s2">"ana"</span> <span class="o">!=</span> <span class="s2">"ana"</span>      <span class="c1"># false</span>
</code></pre></div></div>

<p>O que foi feito aqui foi comparar os textos para ver se são iguais ou diferentes, levando em conta as letras maiúsculas e minúsculas, pois na computação, “Ruby” e “ruby” são considerados diferentes por que letras maiúsculas e minúsculas são tratadas como diferentes pelo computador. Para entender mais sobre isso leia a série de artigos sobre <a href="https://pcdnaescola.com.br/artigos#categoria-computa%C3%A7%C3%A3o-para-iniciantes" target="_blank" class="text-break" rel="noopener">Computação para Iniciantes</a>.</p>

<h3 id="operadores-logicos">Operadores lógicos</h3>
<hr />

<p>Os operadores lógicos são usados para combinar várias condições em uma única expressão condicional. Eles também retornam valores booleanos: <code class="text-white-50 text-light">true</code> (verdadeiro) ou <code class="text-white-50 text-light">false</code> (falso).</p>

<p>Eles permitem combinar mais de uma condição:</p>

<ul>
  <li><code class="text-white-50 text-light">&amp;&amp;</code> (E lógico): Retorna <code class="text-white-50 text-light">true</code> se ambas as condições forem verdadeiras.</li>
  <li><code class="text-white-50 text-light">||</code> (OU lógico): Retorna <code class="text-white-50 text-light">true</code> se pelo menos uma das condições for verdadeira.</li>
  <li><code class="text-white-50 text-light">!</code> (NÃO lógico): Inverte o valor da condição (se for <code class="text-white-50 text-light">true</code>, torna-se <code class="text-white-50 text-light">false</code> e vice-versa).</li>
</ul>

<p>Vamos aos exemplos:</p>

<p>Imagine que precisamos verificar se uma pessoa é maior de idade e se tem carteira de motorista para poder dirigir um carro. Podemos usar os operadores lógicos para combinar essas duas condições.</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">idade</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">tem_carteira</span> <span class="o">=</span> <span class="kp">false</span>
<span class="n">resposta</span> <span class="o">=</span> <span class="s2">""</span>
<span class="n">pode_dirigir</span> <span class="o">=</span> <span class="kp">false</span>

<span class="c1"># Vamos pedir os dados para a pessoa</span>

<span class="nb">print</span> <span class="s2">"Digite sua idade: "</span>
<span class="n">idade</span> <span class="o">=</span> <span class="no">Integer</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="nb">print</span> <span class="s2">"Você tem carteira de motorista? (sim / não): "</span>
<span class="n">resposta</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">.</span><span class="nf">downcase</span>

<span class="n">pode_dirigir</span> <span class="o">=</span> <span class="p">(</span><span class="n">idade</span> <span class="o">&gt;=</span> <span class="mi">18</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">resposta</span> <span class="o">==</span> <span class="s2">"sim"</span><span class="p">)</span>

<span class="nb">puts</span> <span class="s2">"Pode dirigir? </span><span class="si">#{</span><span class="n">pode_dirigir</span> <span class="p">?</span> <span class="s1">'Sim'</span> <span class="p">:</span> <span class="s1">'Não'</span><span class="si">}</span><span class="s2">"</span>
</code></pre></div></div>

<p>Aqui, usamos o operador <code class="text-white-50 text-light">&amp;&amp;</code> para verificar se a pessoa é maior de idade (<code class="text-white-50 text-light">idade &gt;= 18</code>) <strong>e</strong> se ela tem carteira de motorista (<code class="text-white-50 text-light">resposta == "sim"</code>). A variável <code class="text-white-50 text-light">pode_dirigir</code> só será <code class="text-white-50 text-light">true</code> se ambas as condições forem verdadeiras.</p>

<p><strong>Observação</strong>: Lembrando que o <code class="text-white-50 text-light">downcase</code> usado em <code class="text-white-50 text-light">resposta = gets.chomp.downcase</code> serve para transformar qualquer resposta em letras minúsculas, assim, tanto “Sim” quanto “sim” ou “SIM” serão tratados da mesma forma.</p>

<p>A saída da execução do programa foi a seguinte:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">parallels</span><span class="vi">@ubuntu</span><span class="ss">:~</span><span class="o">/</span><span class="n">curso</span><span class="o">-</span><span class="n">ruby</span><span class="err">$</span> <span class="n">ruby</span> <span class="mo">02</span><span class="o">-</span><span class="n">pode</span><span class="o">-</span><span class="n">dirigir</span><span class="p">.</span><span class="nf">rb</span> 
<span class="no">Digite</span> <span class="n">sua</span> <span class="ss">idade: </span><span class="mi">20</span>
<span class="no">Você</span> <span class="n">tem</span> <span class="n">carteira</span> <span class="n">de</span> <span class="n">motorista?</span> <span class="p">(</span><span class="n">sim</span> <span class="o">/</span> <span class="n">não</span><span class="p">):</span> <span class="no">Não</span>
<span class="no">Pode</span> <span class="n">dirigir?</span> <span class="no">Não</span>
<span class="n">parallels</span><span class="vi">@ubuntu</span><span class="ss">:~</span><span class="o">/</span><span class="n">curso</span><span class="o">-</span><span class="n">ruby</span><span class="err">$</span> <span class="n">ruby</span> <span class="mo">02</span><span class="o">-</span><span class="n">pode</span><span class="o">-</span><span class="n">dirigir</span><span class="p">.</span><span class="nf">rb</span> 
<span class="no">Digite</span> <span class="n">sua</span> <span class="ss">idade: </span><span class="mi">30</span>
<span class="no">Você</span> <span class="n">tem</span> <span class="n">carteira</span> <span class="n">de</span> <span class="n">motorista?</span> <span class="p">(</span><span class="n">sim</span> <span class="o">/</span> <span class="n">não</span><span class="p">):</span> <span class="no">Sim</span>
<span class="no">Pode</span> <span class="n">dirigir?</span> <span class="no">Sim</span>
<span class="n">parallels</span><span class="vi">@ubuntu</span><span class="ss">:~</span><span class="o">/</span><span class="n">curso</span><span class="o">-</span><span class="n">ruby</span><span class="err">$</span> <span class="n">ruby</span> <span class="mo">02</span><span class="o">-</span><span class="n">pode</span><span class="o">-</span><span class="n">dirigir</span><span class="p">.</span><span class="nf">rb</span> 
<span class="no">Digite</span> <span class="n">sua</span> <span class="ss">idade: </span><span class="mi">17</span>
<span class="no">Você</span> <span class="n">tem</span> <span class="n">carteira</span> <span class="n">de</span> <span class="n">motorista?</span> <span class="p">(</span><span class="n">sim</span> <span class="o">/</span> <span class="n">não</span><span class="p">):</span> <span class="no">Sim</span>
<span class="no">Pode</span> <span class="n">dirigir?</span> <span class="no">Não</span>
<span class="n">parallels</span><span class="vi">@ubuntu</span><span class="ss">:~</span><span class="o">/</span><span class="n">curso</span><span class="o">-</span><span class="n">ruby</span><span class="err">$</span> 
</code></pre></div></div>

<p>Neste exemplo, a pessoa só pode dirigir se for maior de idade <strong>e</strong> tiver carteira de motorista. Se qualquer uma dessas condições for falsa, a resposta para a pergunta “Pode dirigir?” será “Não”.</p>

<p>Agora para demonstrar o uso do operador <code class="text-white-50 text-light">||</code>, vamos criar um exemplo onde uma loja abre de segunda a sexta-feira e fecha nos finais de semana. Queremos verificar se a loja está aberta em um determinado dia.</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">dia_da_semana</span> <span class="o">=</span> <span class="s2">""</span>
<span class="n">loja_aberta</span> <span class="o">=</span> <span class="kp">false</span>

<span class="nb">print</span> <span class="s2">"Digite o dia da semana: "</span>
<span class="n">dia_da_semana</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">.</span><span class="nf">downcase</span>

<span class="n">loja_aberta</span> <span class="o">=</span> <span class="p">(</span><span class="n">dia_da_semana</span> <span class="o">==</span> <span class="s2">"segunda-feira"</span><span class="p">)</span> <span class="o">||</span> <span class="p">(</span><span class="n">dia_da_semana</span> <span class="o">==</span> <span class="s2">"terça-feira"</span><span class="p">)</span> <span class="o">||</span> <span class="p">(</span><span class="n">dia_da_semana</span> <span class="o">==</span> <span class="s2">"quarta-feira"</span><span class="p">)</span> <span class="o">||</span> <span class="p">(</span><span class="n">dia_da_semana</span> <span class="o">==</span> <span class="s2">"quinta-feira"</span><span class="p">)</span> <span class="o">||</span> <span class="p">(</span><span class="n">dia_da_semana</span> <span class="o">==</span> <span class="s2">"sexta-feira"</span><span class="p">)</span>

<span class="nb">puts</span> <span class="s2">"A loja está aberta? </span><span class="si">#{</span><span class="n">loja_aberta</span> <span class="p">?</span> <span class="s1">'Sim'</span> <span class="p">:</span> <span class="s1">'Não'</span><span class="si">}</span><span class="s2">"</span>
</code></pre></div></div>

<p>Aqui, usamos o operador <code class="text-white-50 text-light">||</code> para verificar se o dia da semana é qualquer um dos dias úteis (segunda a sexta-feira). A variável <code class="text-white-50 text-light">loja_aberta</code> será <code class="text-white-50 text-light">true</code> se o dia for qualquer um desses dias, caso contrário, será <code class="text-white-50 text-light">false</code> (final de semana).</p>

<p>A saída da execução do programa foi a seguinte:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">parallels</span><span class="vi">@ubuntu</span><span class="ss">:~</span><span class="o">/</span><span class="n">curso</span><span class="o">-</span><span class="n">ruby</span><span class="err">$</span> <span class="n">ruby</span> <span class="mo">03</span><span class="o">-</span><span class="n">ver</span><span class="o">-</span><span class="n">se</span><span class="o">-</span><span class="n">loja</span><span class="o">-</span><span class="n">esta</span><span class="o">-</span><span class="n">aberta</span><span class="p">.</span><span class="nf">rb</span> 
<span class="no">Digite</span> <span class="n">o</span> <span class="n">dia</span> <span class="n">da</span> <span class="ss">semana: </span><span class="no">Domingo</span>
<span class="no">A</span> <span class="n">loja</span> <span class="n">está</span> <span class="n">aberta?</span> <span class="no">Não</span>
<span class="n">parallels</span><span class="vi">@ubuntu</span><span class="ss">:~</span><span class="o">/</span><span class="n">curso</span><span class="o">-</span><span class="n">ruby</span><span class="err">$</span> <span class="n">ruby</span> <span class="mo">03</span><span class="o">-</span><span class="n">ver</span><span class="o">-</span><span class="n">se</span><span class="o">-</span><span class="n">loja</span><span class="o">-</span><span class="n">esta</span><span class="o">-</span><span class="n">aberta</span><span class="p">.</span><span class="nf">rb</span> 
<span class="no">Digite</span> <span class="n">o</span> <span class="n">dia</span> <span class="n">da</span> <span class="ss">semana: </span><span class="n">segunda</span><span class="o">-</span><span class="n">feira</span>
<span class="no">A</span> <span class="n">loja</span> <span class="n">está</span> <span class="n">aberta?</span> <span class="no">Sim</span>
<span class="n">parallels</span><span class="vi">@ubuntu</span><span class="ss">:~</span><span class="o">/</span><span class="n">curso</span><span class="o">-</span><span class="n">ruby</span><span class="err">$</span> <span class="n">ruby</span> <span class="mo">03</span><span class="o">-</span><span class="n">ver</span><span class="o">-</span><span class="n">se</span><span class="o">-</span><span class="n">loja</span><span class="o">-</span><span class="n">esta</span><span class="o">-</span><span class="n">aberta</span><span class="p">.</span><span class="nf">rb</span> 
<span class="no">Digite</span> <span class="n">o</span> <span class="n">dia</span> <span class="n">da</span> <span class="ss">semana: </span><span class="n">terça</span><span class="o">-</span><span class="n">feira</span>	
<span class="no">A</span> <span class="n">loja</span> <span class="n">está</span> <span class="n">aberta?</span> <span class="no">Sim</span>
<span class="n">parallels</span><span class="vi">@ubuntu</span><span class="ss">:~</span><span class="o">/</span><span class="n">curso</span><span class="o">-</span><span class="n">ruby</span><span class="err">$</span> <span class="n">ruby</span> <span class="mo">03</span><span class="o">-</span><span class="n">ver</span><span class="o">-</span><span class="n">se</span><span class="o">-</span><span class="n">loja</span><span class="o">-</span><span class="n">esta</span><span class="o">-</span><span class="n">aberta</span><span class="p">.</span><span class="nf">rb</span> 
<span class="no">Digite</span> <span class="n">o</span> <span class="n">dia</span> <span class="n">da</span> <span class="ss">semana: </span><span class="n">sexta</span><span class="o">-</span><span class="n">feira</span>
<span class="no">A</span> <span class="n">loja</span> <span class="n">está</span> <span class="n">aberta?</span> <span class="no">Sim</span>
<span class="n">parallels</span><span class="vi">@ubuntu</span><span class="ss">:~</span><span class="o">/</span><span class="n">curso</span><span class="o">-</span><span class="n">ruby</span><span class="err">$</span> <span class="n">ruby</span> <span class="mo">03</span><span class="o">-</span><span class="n">ver</span><span class="o">-</span><span class="n">se</span><span class="o">-</span><span class="n">loja</span><span class="o">-</span><span class="n">esta</span><span class="o">-</span><span class="n">aberta</span><span class="p">.</span><span class="nf">rb</span> 
<span class="no">Digite</span> <span class="n">o</span> <span class="n">dia</span> <span class="n">da</span> <span class="ss">semana: </span><span class="no">Sábado</span>
<span class="no">A</span> <span class="n">loja</span> <span class="n">está</span> <span class="n">aberta?</span> <span class="no">Não</span>
<span class="n">parallels</span><span class="vi">@ubuntu</span><span class="ss">:~</span><span class="o">/</span><span class="n">curso</span><span class="o">-</span><span class="n">ruby</span><span class="err">$</span> 
</code></pre></div></div>

<p>Neste exemplo, a loja só estará aberta se o dia da semana for qualquer um dos dias úteis (segunda a sexta-feira). Se for sábado ou domingo, a resposta para a pergunta “A loja está aberta?” será “Não”.</p>

<p>Agora vamos ver um exemplo do uso do operador <code class="text-white-50 text-light">!</code>. Suponha que queremos fazer um passeio somente se não estiver chovendo.</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">esta_chovendo</span> <span class="o">=</span> <span class="kp">false</span>
<span class="n">pode_fazer_passeio</span> <span class="o">=</span> <span class="kp">false</span>
<span class="n">resposta</span> <span class="o">=</span> <span class="s2">""</span>

<span class="nb">print</span> <span class="s2">"Está chovendo? (sim / não): "</span>
<span class="n">resposta</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">.</span><span class="nf">downcase</span>

<span class="n">esta_chovendo</span> <span class="o">=</span> <span class="p">(</span><span class="n">resposta</span> <span class="o">==</span> <span class="s2">"sim"</span><span class="p">)</span>
<span class="n">pode_fazer_passeio</span> <span class="o">=</span> <span class="o">!</span><span class="n">esta_chovendo</span>

<span class="nb">puts</span> <span class="s2">"Pode fazer o passeio? </span><span class="si">#{</span><span class="n">pode_fazer_passeio</span> <span class="p">?</span> <span class="s1">'Sim'</span> <span class="p">:</span> <span class="s1">'Não'</span><span class="si">}</span><span class="s2">"</span>
</code></pre></div></div>

<p>Aqui vamos explicar com mais calma o que foi feito, vamos prestar atenção nesse trecho do código:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">esta_chovendo</span> <span class="o">=</span> <span class="p">(</span><span class="n">resposta</span> <span class="o">==</span> <span class="s2">"sim"</span><span class="p">)</span>
<span class="n">pode_fazer_passeio</span> <span class="o">=</span> <span class="o">!</span><span class="n">esta_chovendo</span>
</code></pre></div></div>

<p>Na primeira linha, estamos verificando se a resposta da pessoa é “sim”. Se for, a variável <code class="text-white-50 text-light">esta_chovendo</code> será <code class="text-white-50 text-light">true</code>, indicando que está chovendo. Se a resposta for “não”, a variável será <code class="text-white-50 text-light">false</code>.</p>

<p>Na segunda linha, usamos o operador <code class="text-white-50 text-light">!</code> para inverter o valor de <code class="text-white-50 text-light">esta_chovendo</code>. Isso significa que:</p>

<ul>
  <li>Se <code class="text-white-50 text-light">esta_chovendo</code> for <code class="text-white-50 text-light">true</code> (ou seja, está chovendo), então <code class="text-white-50 text-light">pode_fazer_passeio</code> será <code class="text-white-50 text-light">false</code> (não pode fazer o passeio).</li>
  <li>Se <code class="text-white-50 text-light">esta_chovendo</code> for <code class="text-white-50 text-light">false</code> (ou seja, não está chovendo), então <code class="text-white-50 text-light">pode_fazer_passeio</code> será <code class="text-white-50 text-light">true</code> (pode fazer o passeio).</li>
  <li>Por isso que a variável <code class="text-white-50 text-light">pode_fazer_passeio</code> recebe a negação de <code class="text-white-50 text-light">esta_chovendo</code>. Porque queremos que o passeio seja possível somente quando não estiver chovendo.</li>
  <li>Então se tem chuva não tem passeio! Se não tem chuva, aí sim pode rolar o passeio!</li>
</ul>

<p>Em resumo o programa verifica se está chovendo e decide se a pessoa pode fazer o passeio com base nessa informação. Depois mostra a resposta na tela usando o comando <code class="text-white-50 text-light">puts</code>.</p>

<p>Explicando o:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">puts</span> <span class="s2">"Pode fazer o passeio? </span><span class="si">#{</span><span class="n">pode_fazer_passeio</span> <span class="p">?</span> <span class="s1">'Sim'</span> <span class="p">:</span> <span class="s1">'Não'</span><span class="si">}</span><span class="s2">"</span>
</code></pre></div></div>

<p>Aqui, usamos o operador ternário <code class="text-white-50 text-light">? :</code> para decidir o que mostrar na mensagem. Se <code class="text-white-50 text-light">pode_fazer_passeio</code> for <code class="text-white-50 text-light">true</code>, mostramos “Sim”; se for <code class="text-white-50 text-light">false</code>, mostramos “Não”.</p>

<p>Lembrando que o operador ternário serve para escolher entre dois valores usando uma única linha. Você usa quando quer responder a perguntas do tipo:</p>

<p>“Se isso for verdadeiro, devolva tal coisa; senão, devolva outra.”</p>

<p>A estrutura sempre vai ser:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">condição</span> <span class="p">?</span> <span class="n">valor_se_verdadeiro</span> <span class="p">:</span> <span class="n">valor_se_falso</span>
</code></pre></div></div>

<p>E ele sempre vai retornar um valor. No nosso caso, ele retorna “Sim” ou “Não” dependendo do valor de <code class="text-white-50 text-light">pode_fazer_passeio</code>.</p>

<p>Com isso, já temos o suficiente para construir condições simples em Ruby.</p>

<p>Mas, e se quisermos fazer algo mais complexo, com várias condições diferentes? Se eu quiser retornar não apenas “Sim” ou “Não”, mas também comandos diferentes dependendo do caso? Para isso, existem as estruturas condicionais completas, que serão apresentadas adiante neste artigo.</p>

<h2 id="conhecendo-o-if">Conhecendo o if</h2>
<hr />

<p>O <code class="text-white-50 text-light">if</code> é a forma mais simples de fazer uma escolha em Ruby. Ele serve para executar um pedaço de código só quando uma condição for verdadeira. A estrutura básica do <code class="text-white-50 text-light">if</code> é a seguinte:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="n">condicao</span>
  <span class="c1"># comandos que serão executados se a condição for verdadeira</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Aqui, se a <code class="text-white-50 text-light">condicao</code> for verdadeira (ou seja, se ela resultar em <code class="text-white-50 text-light">true</code>), os comandos dentro do bloco <code class="text-white-50 text-light">if</code> serão executados. Se a condição for falsa (resultar em <code class="text-white-50 text-light">false</code>), o programa simplesmente pula esses comandos e continua a execução após o <code class="text-white-50 text-light">end</code>.</p>

<p>Vamos refazer o exemplo do programa que verifica se a loja está aberta, mas agora usando o <code class="text-white-50 text-light">if</code>:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">dias_uteis</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"segunda-feira"</span><span class="p">,</span> <span class="s2">"terca-feira"</span><span class="p">,</span> <span class="s2">"quarta-feira"</span><span class="p">,</span> <span class="s2">"quinta-feira"</span><span class="p">,</span> <span class="s2">"sexta-feira"</span><span class="p">]</span>
<span class="n">final_de_semana</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"sabado"</span><span class="p">,</span> <span class="s2">"domingo"</span><span class="p">]</span>
<span class="n">abreviacao_dias</span> <span class="o">=</span> <span class="p">{</span>
  <span class="s2">"segunda"</span> <span class="o">=&gt;</span> <span class="s2">"segunda-feira"</span><span class="p">,</span>
  <span class="s2">"terça"</span> <span class="o">=&gt;</span> <span class="s2">"terca-feira"</span><span class="p">,</span>
  <span class="s2">"quarta"</span> <span class="o">=&gt;</span> <span class="s2">"quarta-feira"</span><span class="p">,</span>
  <span class="s2">"quinta"</span> <span class="o">=&gt;</span> <span class="s2">"quinta-feira"</span><span class="p">,</span>
  <span class="s2">"sexta"</span> <span class="o">=&gt;</span> <span class="s2">"sexta-feira"</span><span class="p">,</span>
<span class="p">}</span>

<span class="nb">print</span> <span class="s2">"Digite o dia da semana: "</span>
<span class="n">dia_da_semana</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">.</span><span class="nf">downcase</span>

<span class="k">if</span> <span class="n">dias_uteis</span><span class="p">.</span><span class="nf">include?</span><span class="p">(</span><span class="n">dia_da_semana</span><span class="p">)</span> <span class="o">||</span> <span class="n">abreviacao_dias</span><span class="p">.</span><span class="nf">key?</span><span class="p">(</span><span class="n">dia_da_semana</span><span class="p">)</span>
  <span class="nb">puts</span> <span class="s2">"A loja está aberta!"</span>
<span class="k">end</span>

<span class="k">if</span> <span class="n">final_de_semana</span><span class="p">.</span><span class="nf">include?</span><span class="p">(</span><span class="n">dia_da_semana</span><span class="p">)</span>
  <span class="nb">puts</span> <span class="s2">"A loja está fechada!"</span>
<span class="k">end</span>

<span class="k">if</span> <span class="o">!</span><span class="n">dias_uteis</span><span class="p">.</span><span class="nf">include?</span><span class="p">(</span><span class="n">dia_da_semana</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">final_de_semana</span><span class="p">.</span><span class="nf">include?</span><span class="p">(</span><span class="n">dia_da_semana</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">abreviacao_dias</span><span class="p">.</span><span class="nf">key?</span><span class="p">(</span><span class="n">dia_da_semana</span><span class="p">)</span>
  <span class="nb">puts</span> <span class="s2">"Você digitou </span><span class="si">#{</span><span class="n">dia_da_semana</span><span class="si">}</span><span class="s2">, que não é um dia válido da semana."</span>
  <span class="nb">puts</span> <span class="s2">"dias válidos são: </span><span class="si">#{</span><span class="p">(</span><span class="n">dias_uteis</span> <span class="o">+</span> <span class="n">final_de_semana</span><span class="p">).</span><span class="nf">join</span><span class="p">(</span><span class="s1">', '</span><span class="p">)</span><span class="si">}</span><span class="s2"> ou suas abreviações: </span><span class="si">#{</span><span class="n">abreviacao_dias</span><span class="p">.</span><span class="nf">keys</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="s1">', '</span><span class="p">)</span><span class="si">}</span><span class="s2">."</span>
  <span class="nb">puts</span> <span class="s2">"Programa encerrado."</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Muita coisa né? Mas vamos explicar com calma o que foi feito linha por linha!</p>

<p>Primeiramente ao invés de criar uma variável para cada dia da semana, criamos duas listas (arrays) para armazenar os dias úteis e os finais de semana. Também criamos um dicionário (hash) para armazenar as abreviações dos dias da semana.</p>

<p>Perceba pela forma de escrever que:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">dias_uteis</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"segunda-feira"</span><span class="p">,</span> <span class="s2">"terca-feira"</span><span class="p">,</span> <span class="s2">"quarta-feira"</span><span class="p">,</span> <span class="s2">"quinta-feira"</span><span class="p">,</span> <span class="s2">"sexta-feira"</span><span class="p">]</span>
<span class="n">final_de_semana</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"sabado"</span><span class="p">,</span> <span class="s2">"domingo"</span><span class="p">]</span>
</code></pre></div></div>

<p>São listas (arrays) que armazenam os dias úteis e os finais de semana. Enquanto que:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">abreviacao_dias</span> <span class="o">=</span> <span class="p">{</span>
  <span class="s2">"segunda"</span> <span class="o">=&gt;</span> <span class="s2">"segunda-feira"</span><span class="p">,</span>
  <span class="s2">"terça"</span> <span class="o">=&gt;</span> <span class="s2">"terca-feira"</span><span class="p">,</span>
  <span class="s2">"quarta"</span> <span class="o">=&gt;</span> <span class="s2">"quarta-feira"</span><span class="p">,</span>
  <span class="s2">"quinta"</span> <span class="o">=&gt;</span> <span class="s2">"quinta-feira"</span><span class="p">,</span>
  <span class="s2">"sexta"</span> <span class="o">=&gt;</span> <span class="s2">"sexta-feira"</span><span class="p">,</span>
<span class="p">}</span>
</code></pre></div></div>

<p>É um hash (dicionário) que mapeia as abreviações dos dias da semana para seus nomes completos as abreviações se tornam símbolos para os nomes.</p>

<p>Estamos usando essas estruturas para facilitar a verificação dos dias da semana.</p>

<p>Depois, pedimos para a pessoa digitar o dia da semana e armazenamos essa informação na variável <code class="text-white-50 text-light">dia_da_semana</code>.</p>

<p>Em seguida, usamos três estruturas <code class="text-white-50 text-light">if</code> para verificar se o dia digitado é um dia útil, um final de semana ou um dia inválido.</p>

<ul>
  <li>
    <p>No primeiro <code class="text-white-50 text-light">if</code>, verificamos se o dia digitado está na lista de dias úteis ou se é uma abreviação válida. Se for, mostramos a mensagem “A loja está aberta!”.</p>
  </li>
  <li>
    <p>No segundo <code class="text-white-50 text-light">if</code>, verificamos se o dia digitado está na lista de finais de semana. Se for, mostramos a mensagem “A loja está fechada!”.</p>
  </li>
  <li>
    <p>No terceiro <code class="text-white-50 text-light">if</code>, verificamos se o dia digitado não está em nenhuma das listas nem nas abreviações. Se for, mostramos uma mensagem informando que o dia digitado não é válido.</p>
  </li>
</ul>

<h3 id="o-que-e-esse-include">O que é esse .include?</h3>
<hr />

<p>O método <code class="text-white-50 text-light">include?</code> é usado para verificar se um determinado elemento está presente em uma lista (array) ou em uma string. Ele retorna <code class="text-white-50 text-light">true</code> se o elemento for encontrado e <code class="text-white-50 text-light">false</code> caso contrário.</p>

<p>Então estamos perguntando no código:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="n">dias_uteis</span><span class="p">.</span><span class="nf">include?</span><span class="p">(</span><span class="n">dia_da_semana</span><span class="p">)</span> <span class="o">||</span> <span class="n">abreviacao_dias</span><span class="p">.</span><span class="nf">key?</span><span class="p">(</span><span class="n">dia_da_semana</span><span class="p">)</span>
</code></pre></div></div>

<p>Se o valor armazenado em <code class="text-white-50 text-light">dia_da_semana</code> está presente na lista <code class="text-white-50 text-light">dias_uteis</code> ou se é uma chave válida no hash <code class="text-white-50 text-light">abreviacao_dias</code>.</p>

<p>Se a resposta for sim (ou seja, se o dia digitado for um dia útil ou uma abreviação válida), o código dentro do bloco <code class="text-white-50 text-light">if</code> será executado, mostrando a mensagem “A loja está aberta!”.</p>

<h3 id="vamos-praticar-mais-um-pouco-com-o-if">Vamos praticar mais um pouco com o if</h3>
<hr />

<p>Vamos criar um programa que:</p>

<ul>
  <li>Pede a pessoa para digitar o Estado do Brasil onde ela mora;</li>
  <li>Verifica se o Estado digitado é válido (está na lista dos 26 Estados brasileiros mais o Distrito Federal);</li>
  <li>Se a pessoa digitar a sigla do Estado (duas letras), o programa deve reconhecer e aceitar também desde que a sigla seja correta. Exemplo: SP para São Paulo, RJ para Rio de Janeiro, MG para Minas Gerais, etc;</li>
  <li>Se o Estado ou a sigla for válido, o programa deve mostrar uma mensagem dizendo “Você mora em [Nome do Estado] na Região [Nome da Região]”;</li>
  <li>Se o Estado ou a sigla for inválido, o programa deve mostrar uma mensagem dizendo “Estado inválido. Fim do programa.”</li>
</ul>

<p>Antes de escrever o código vamos organizar o nosso pensamento de como o programa deve ser. Vamos montar o famoso “teste de mesa” para planejar o que deve ser feito.</p>

<p>Teste de mesa é uma técnica usada para simular a execução de um programa ou algoritmo, passo a passo, sem realmente rodar o código. É uma forma de planejar e entender como o programa deve funcionar antes de escrevê-lo.</p>

<p>O que precisamos fazer:</p>

<div class="mermaid text-center" aria-hidden="true">
flowchart TD
    A[Início do Programa] --&gt; B[Pedir para digitar o Estado ou a sigla]
    B --&gt; C[Verificar se o Estado ou a sigla é válido]
    C --&gt; D{Estado ou sigla válido?}
    D --&gt;|Sim| E[Mostrar mensagem com o nome do Estado e Região]
    D --&gt;|Não| F[Mostrar mensagem de Estado inválido]
    E --&gt; G[Fim do Programa]
    F --&gt; G[Fim do Programa]
</div>

<ol class="visually-hidden">
    <li>Início do Programa</li>
    <li>Pedir para digitar o Estado ou a sigla</li>
    <li>Verificar se o Estado ou a sigla é válido</li>
    <li>Estado ou sigla válido?
        <ul>
            <li>Se sim: Mostrar mensagem com o nome do Estado e Região</li>
            <li>Se não: Mostrar mensagem de Estado inválido</li>
        </ul>
    </li>
    <li>Fim do Programa</li>
</ol>

<p>Agora que entendemos o fluxo das ações, vamos simular alguns casos de teste para garantir que estamos cobrindo todas as possibilidades de eventos que podem acontecer durante a execução do programa.</p>

<p><strong>Caso 1: A pessoa digita a sigla correta do Estado (exemplo: “SP” para São Paulo)</strong></p>

<p>Passos:</p>

<ul>
  <li>
    <p>Programa pede estado.</p>
  </li>
  <li>
    <p>A pessoa digita “SP”.</p>
  </li>
  <li>
    <p>O programa vê que “SP” está no hash siglas.</p>
  </li>
  <li>
    <p>Ele converte “SP” para “São Paulo”.</p>
  </li>
  <li>
    <p>Procura “São Paulo” no hash regioes e acha “Sudeste”.</p>
  </li>
  <li>
    <p>Mostra: Você mora em São Paulo na Região Sudeste</p>
  </li>
</ul>

<p><strong>Caso 2: A pessoa digita o nome completo do Estado corretamente (exemplo: “Bahia”)</strong></p>

<p>Passos:</p>

<ul>
  <li>
    <p>A pessoa digita “Bahia”.</p>
  </li>
  <li>
    <p>O programa procura “Bahia” direto no hash regioes porque é o nome completo então não precisa converter nada.</p>
  </li>
  <li>
    <p>Acha.</p>
  </li>
  <li>
    <p>Região = “Nordeste”.</p>
  </li>
  <li>
    <p>Mostra: Você mora em Bahia na Região Nordeste</p>
  </li>
</ul>

<p><strong>Caso 3: A pessoa digita uma sigla inválida (exemplo: “XX”)</strong></p>

<p>Passos:</p>

<ul>
  <li>A pessoa digita “XX”.</li>
  <li>O programa vê que “XX” não está no hash siglas.</li>
  <li>Não acha o nome do Estado.</li>
  <li>Mostra: Estado inválido. Fim do programa.</li>
</ul>

<p><strong>Caso 4: A pessoa digita um nome de Estado inválido (exemplo: “Atlantida”)</strong></p>

<p>Passos:</p>

<ul>
  <li>A pessoa digita “Atlantida”.</li>
  <li>O programa procura “Atlantida” no hash regioes.</li>
  <li>Não acha.</li>
  <li>Mostra: Estado inválido. Fim do programa.</li>
</ul>

<p>Para que serve essas simulações? Não são perca de tempo? De forma alguma! Elas ajudam a entender o fluxo do programa, identificar possíveis erros e garantir que todas as situações sejam tratadas corretamente antes de começar a escrever o código.</p>

<p>Pode parecer que o mais importante na hora de programar é decorar como escrever o código, mas na verdade o mais importante é entender o problema que você está tentando resolver e planejar como fazer isso de forma eficiente. Ou seja, você deve desenvolver a sua lógica de programação e não apenas decorar comandos.</p>

<p>Dito isso, vamos ao código do programa:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Hash que mapeia siglas para nomes completos dos Estados</span>
<span class="n">siglas_para_estados</span> <span class="o">=</span> <span class="p">{</span>
  <span class="s2">"AC"</span> <span class="o">=&gt;</span> <span class="s2">"Acre"</span><span class="p">,</span> <span class="s2">"AL"</span> <span class="o">=&gt;</span> <span class="s2">"Alagoas"</span><span class="p">,</span> <span class="s2">"AP"</span> <span class="o">=&gt;</span> <span class="s2">"Amapá"</span><span class="p">,</span> <span class="s2">"AM"</span> <span class="o">=&gt;</span> <span class="s2">"Amazonas"</span><span class="p">,</span>
  <span class="s2">"BA"</span> <span class="o">=&gt;</span> <span class="s2">"Bahia"</span><span class="p">,</span> <span class="s2">"CE"</span> <span class="o">=&gt;</span> <span class="s2">"Ceará"</span><span class="p">,</span> <span class="s2">"DF"</span> <span class="o">=&gt;</span> <span class="s2">"Distrito Federal"</span><span class="p">,</span>
  <span class="s2">"ES"</span> <span class="o">=&gt;</span> <span class="s2">"Espírito Santo"</span><span class="p">,</span> <span class="s2">"GO"</span> <span class="o">=&gt;</span> <span class="s2">"Goiás"</span><span class="p">,</span> <span class="s2">"MA"</span> <span class="o">=&gt;</span> <span class="s2">"Maranhão"</span><span class="p">,</span>
  <span class="s2">"MT"</span> <span class="o">=&gt;</span> <span class="s2">"Mato Grosso"</span><span class="p">,</span> <span class="s2">"MS"</span> <span class="o">=&gt;</span> <span class="s2">"Mato Grosso do Sul"</span><span class="p">,</span>
  <span class="s2">"MG"</span> <span class="o">=&gt;</span> <span class="s2">"Minas Gerais"</span><span class="p">,</span> <span class="s2">"PA"</span> <span class="o">=&gt;</span> <span class="s2">"Pará"</span><span class="p">,</span> <span class="s2">"PB"</span> <span class="o">=&gt;</span> <span class="s2">"Paraíba"</span><span class="p">,</span>
  <span class="s2">"PR"</span> <span class="o">=&gt;</span> <span class="s2">"Paraná"</span><span class="p">,</span> <span class="s2">"PE"</span> <span class="o">=&gt;</span> <span class="s2">"Pernambuco"</span><span class="p">,</span> <span class="s2">"PI"</span> <span class="o">=&gt;</span> <span class="s2">"Piauí"</span><span class="p">,</span>
  <span class="s2">"RJ"</span> <span class="o">=&gt;</span> <span class="s2">"Rio de Janeiro"</span><span class="p">,</span> <span class="s2">"RN"</span> <span class="o">=&gt;</span> <span class="s2">"Rio Grande do Norte"</span><span class="p">,</span>
  <span class="s2">"RS"</span> <span class="o">=&gt;</span> <span class="s2">"Rio Grande do Sul"</span><span class="p">,</span> <span class="s2">"RO"</span> <span class="o">=&gt;</span> <span class="s2">"Rondônia"</span><span class="p">,</span> <span class="s2">"RR"</span> <span class="o">=&gt;</span> <span class="s2">"Roraima"</span><span class="p">,</span>
  <span class="s2">"SC"</span> <span class="o">=&gt;</span> <span class="s2">"Santa Catarina"</span><span class="p">,</span> <span class="s2">"SP"</span> <span class="o">=&gt;</span> <span class="s2">"São Paulo"</span><span class="p">,</span> <span class="s2">"SE"</span> <span class="o">=&gt;</span> <span class="s2">"Sergipe"</span><span class="p">,</span>
  <span class="s2">"TO"</span> <span class="o">=&gt;</span> <span class="s2">"Tocantins"</span>
<span class="p">}</span>

<span class="c1"># Hash que mapeia nome do Estado para sua respectiva Região</span>
<span class="n">estados_para_regioes</span> <span class="o">=</span> <span class="p">{</span>
  <span class="s2">"Acre"</span> <span class="o">=&gt;</span> <span class="s2">"Norte"</span><span class="p">,</span> <span class="s2">"Amapá"</span> <span class="o">=&gt;</span> <span class="s2">"Norte"</span><span class="p">,</span> <span class="s2">"Amazonas"</span> <span class="o">=&gt;</span> <span class="s2">"Norte"</span><span class="p">,</span>
  <span class="s2">"Pará"</span> <span class="o">=&gt;</span> <span class="s2">"Norte"</span><span class="p">,</span> <span class="s2">"Rondônia"</span> <span class="o">=&gt;</span> <span class="s2">"Norte"</span><span class="p">,</span> <span class="s2">"Roraima"</span> <span class="o">=&gt;</span> <span class="s2">"Norte"</span><span class="p">,</span>
  <span class="s2">"Tocantins"</span> <span class="o">=&gt;</span> <span class="s2">"Norte"</span><span class="p">,</span>

  <span class="s2">"Alagoas"</span> <span class="o">=&gt;</span> <span class="s2">"Nordeste"</span><span class="p">,</span> <span class="s2">"Bahia"</span> <span class="o">=&gt;</span> <span class="s2">"Nordeste"</span><span class="p">,</span> <span class="s2">"Ceará"</span> <span class="o">=&gt;</span> <span class="s2">"Nordeste"</span><span class="p">,</span>
  <span class="s2">"Maranhão"</span> <span class="o">=&gt;</span> <span class="s2">"Nordeste"</span><span class="p">,</span> <span class="s2">"Paraíba"</span> <span class="o">=&gt;</span> <span class="s2">"Nordeste"</span><span class="p">,</span> <span class="s2">"Pernambuco"</span> <span class="o">=&gt;</span> <span class="s2">"Nordeste"</span><span class="p">,</span>
  <span class="s2">"Piauí"</span> <span class="o">=&gt;</span> <span class="s2">"Nordeste"</span><span class="p">,</span> <span class="s2">"Rio Grande do Norte"</span> <span class="o">=&gt;</span> <span class="s2">"Nordeste"</span><span class="p">,</span>
  <span class="s2">"Sergipe"</span> <span class="o">=&gt;</span> <span class="s2">"Nordeste"</span><span class="p">,</span>

  <span class="s2">"Espírito Santo"</span> <span class="o">=&gt;</span> <span class="s2">"Sudeste"</span><span class="p">,</span>
  <span class="s2">"Minas Gerais"</span> <span class="o">=&gt;</span> <span class="s2">"Sudeste"</span><span class="p">,</span>
  <span class="s2">"Rio de Janeiro"</span> <span class="o">=&gt;</span> <span class="s2">"Sudeste"</span><span class="p">,</span>
  <span class="s2">"São Paulo"</span> <span class="o">=&gt;</span> <span class="s2">"Sudeste"</span><span class="p">,</span>

  <span class="s2">"Paraná"</span> <span class="o">=&gt;</span> <span class="s2">"Sul"</span><span class="p">,</span> <span class="s2">"Rio Grande do Sul"</span> <span class="o">=&gt;</span> <span class="s2">"Sul"</span><span class="p">,</span> <span class="s2">"Santa Catarina"</span> <span class="o">=&gt;</span> <span class="s2">"Sul"</span><span class="p">,</span>

  <span class="s2">"Goiás"</span> <span class="o">=&gt;</span> <span class="s2">"Centro-Oeste"</span><span class="p">,</span> <span class="s2">"Mato Grosso"</span> <span class="o">=&gt;</span> <span class="s2">"Centro-Oeste"</span><span class="p">,</span>
  <span class="s2">"Mato Grosso do Sul"</span> <span class="o">=&gt;</span> <span class="s2">"Centro-Oeste"</span><span class="p">,</span>
  <span class="s2">"Distrito Federal"</span> <span class="o">=&gt;</span> <span class="s2">"Centro-Oeste"</span>
<span class="p">}</span>

<span class="nb">print</span> <span class="s2">"Digite o nome do Estado ou a sigla: "</span>
<span class="n">estado_digitado</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span>

<span class="c1"># Tratamento da entrada</span>
<span class="n">estado_digitado_maiusculo</span> <span class="o">=</span> <span class="n">estado_digitado</span><span class="p">.</span><span class="nf">upcase</span>
<span class="n">estado_digitado_formatado</span> <span class="o">=</span> <span class="n">estado_digitado</span><span class="p">.</span><span class="nf">split</span><span class="p">.</span><span class="nf">map</span><span class="p">(</span><span class="o">&amp;</span><span class="ss">:capitalize</span><span class="p">).</span><span class="nf">join</span><span class="p">(</span><span class="s2">" "</span><span class="p">)</span>

<span class="n">estado_valido</span> <span class="o">=</span> <span class="kp">nil</span>

<span class="c1"># 1. Verificar se é sigla (ex.: "SP")</span>
<span class="k">if</span> <span class="n">siglas_para_estados</span><span class="p">.</span><span class="nf">key?</span><span class="p">(</span><span class="n">estado_digitado_maiusculo</span><span class="p">)</span>
  <span class="n">estado_valido</span> <span class="o">=</span> <span class="n">siglas_para_estados</span><span class="p">[</span><span class="n">estado_digitado_maiusculo</span><span class="p">]</span>
<span class="k">end</span>

<span class="c1"># 2. Verificar se é nome completo (ex.: "Bahia")</span>
<span class="k">if</span> <span class="n">estados_para_regioes</span><span class="p">.</span><span class="nf">key?</span><span class="p">(</span><span class="n">estado_digitado_formatado</span><span class="p">)</span>
  <span class="n">estado_valido</span> <span class="o">=</span> <span class="n">estado_digitado_formatado</span>
<span class="k">end</span>

<span class="c1"># 3. Se nenhum deles for encontrado → inválido</span>
<span class="k">if</span> <span class="n">estado_valido</span><span class="p">.</span><span class="nf">nil?</span>
  <span class="nb">puts</span> <span class="s2">"Estado inválido. Fim do programa."</span>
<span class="k">end</span>

<span class="c1"># 4. Se for válido, mostrar região</span>
<span class="k">if</span> <span class="o">!</span><span class="n">estado_valido</span><span class="p">.</span><span class="nf">nil?</span>
  <span class="n">regiao</span> <span class="o">=</span> <span class="n">estados_para_regioes</span><span class="p">[</span><span class="n">estado_valido</span><span class="p">]</span>
  <span class="nb">puts</span> <span class="s2">"Você mora em </span><span class="si">#{</span><span class="n">estado_valido</span><span class="si">}</span><span class="s2"> na Região </span><span class="si">#{</span><span class="n">regiao</span><span class="si">}</span><span class="s2">"</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Agora parece que ficou complexo demais né? Mas calma que vamos explicar tudo linha por linha!</p>

<p><strong>1. Hash de siglas para nomes de Estados</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Hash que mapeia siglas para nomes completos dos Estados</span>
<span class="n">siglas_para_estados</span> <span class="o">=</span> <span class="p">{</span>
  <span class="s2">"AC"</span> <span class="o">=&gt;</span> <span class="s2">"Acre"</span><span class="p">,</span> <span class="s2">"AL"</span> <span class="o">=&gt;</span> <span class="s2">"Alagoas"</span><span class="p">,</span> <span class="s2">"AP"</span> <span class="o">=&gt;</span> <span class="s2">"Amapá"</span><span class="p">,</span> <span class="s2">"AM"</span> <span class="o">=&gt;</span> <span class="s2">"Amazonas"</span><span class="p">,</span>
  <span class="s2">"BA"</span> <span class="o">=&gt;</span> <span class="s2">"Bahia"</span><span class="p">,</span> <span class="s2">"CE"</span> <span class="o">=&gt;</span> <span class="s2">"Ceará"</span><span class="p">,</span> <span class="s2">"DF"</span> <span class="o">=&gt;</span> <span class="s2">"Distrito Federal"</span><span class="p">,</span>
  <span class="s2">"ES"</span> <span class="o">=&gt;</span> <span class="s2">"Espírito Santo"</span><span class="p">,</span> <span class="s2">"GO"</span> <span class="o">=&gt;</span> <span class="s2">"Goiás"</span><span class="p">,</span> <span class="s2">"MA"</span> <span class="o">=&gt;</span> <span class="s2">"Maranhão"</span><span class="p">,</span>
  <span class="s2">"MT"</span> <span class="o">=&gt;</span> <span class="s2">"Mato Grosso"</span><span class="p">,</span> <span class="s2">"MS"</span> <span class="o">=&gt;</span> <span class="s2">"Mato Grosso do Sul"</span><span class="p">,</span>
  <span class="s2">"MG"</span> <span class="o">=&gt;</span> <span class="s2">"Minas Gerais"</span><span class="p">,</span> <span class="s2">"PA"</span> <span class="o">=&gt;</span> <span class="s2">"Pará"</span><span class="p">,</span> <span class="s2">"PB"</span> <span class="o">=&gt;</span> <span class="s2">"Paraíba"</span><span class="p">,</span>
  <span class="s2">"PR"</span> <span class="o">=&gt;</span> <span class="s2">"Paraná"</span><span class="p">,</span> <span class="s2">"PE"</span> <span class="o">=&gt;</span> <span class="s2">"Pernambuco"</span><span class="p">,</span> <span class="s2">"PI"</span> <span class="o">=&gt;</span> <span class="s2">"Piauí"</span><span class="p">,</span>
  <span class="s2">"RJ"</span> <span class="o">=&gt;</span> <span class="s2">"Rio de Janeiro"</span><span class="p">,</span> <span class="s2">"RN"</span> <span class="o">=&gt;</span> <span class="s2">"Rio Grande do Norte"</span><span class="p">,</span>
  <span class="s2">"RS"</span> <span class="o">=&gt;</span> <span class="s2">"Rio Grande do Sul"</span><span class="p">,</span> <span class="s2">"RO"</span> <span class="o">=&gt;</span> <span class="s2">"Rondônia"</span><span class="p">,</span> <span class="s2">"RR"</span> <span class="o">=&gt;</span> <span class="s2">"Roraima"</span><span class="p">,</span>
  <span class="s2">"SC"</span> <span class="o">=&gt;</span> <span class="s2">"Santa Catarina"</span><span class="p">,</span> <span class="s2">"SP"</span> <span class="o">=&gt;</span> <span class="s2">"São Paulo"</span><span class="p">,</span> <span class="s2">"SE"</span> <span class="o">=&gt;</span> <span class="s2">"Sergipe"</span><span class="p">,</span>
  <span class="s2">"TO"</span> <span class="o">=&gt;</span> <span class="s2">"Tocantins"</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="text-white-50 text-light"># Hash que mapeia siglas para nomes completos dos Estados</code>:</p>

<ul>
  <li>Isso é um comentário. Comentários começam com # e não são executados pelo programa.</li>
  <li>Servem para explicar o que o código faz. Neste caso serve para dizer que este hash associa siglas (como ‘BA’) aos nomes completos (como ‘Bahia’).</li>
</ul>

<p><code class="text-white-50 text-light">siglas_para_estados = { ... }</code>:</p>

<ul>
  <li>Aqui o programa cria uma variável chamada <code class="text-white-50 text-light">siglas_para_estados</code>.</li>
  <li>O valor dessa variável é um hash (dicionário) que associa siglas de Estados aos seus nomes completos.</li>
  <li>Quando essa linha é executada, Ruby cria o hash completo na memória.</li>
  <li>Depois, sempre que o código precisar descobrir o nome do Estado a partir da sigla, vai olhar para esse hash usando algo como:</li>
</ul>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">siglas_para_estados</span><span class="p">[</span><span class="s2">"BA"</span><span class="p">]</span>  <span class="c1"># devolve "Bahia"</span>
</code></pre></div></div>

<p>As próximas linhas dentro das chaves <code class="text-white-50 text-light">{ ... }</code> representam os pares chave-valor do hash, onde cada chave é uma sigla de Estado e o valor correspondente é o nome completo do Estado. Exemplo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s2">"AC"</span> <span class="o">=&gt;</span> <span class="s2">"Acre"</span>
</code></pre></div></div>

<p><strong>2. Hash de Estado para Região</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Hash que mapeia nome do Estado para sua respectiva Região</span>
<span class="n">estados_para_regioes</span> <span class="o">=</span> <span class="p">{</span>
  <span class="s2">"Acre"</span> <span class="o">=&gt;</span> <span class="s2">"Norte"</span><span class="p">,</span> <span class="s2">"Amapá"</span> <span class="o">=&gt;</span> <span class="s2">"Norte"</span><span class="p">,</span> <span class="s2">"Amazonas"</span> <span class="o">=&gt;</span> <span class="s2">"Norte"</span><span class="p">,</span>
  <span class="s2">"Pará"</span> <span class="o">=&gt;</span> <span class="s2">"Norte"</span><span class="p">,</span> <span class="s2">"Rondônia"</span> <span class="o">=&gt;</span> <span class="s2">"Norte"</span><span class="p">,</span> <span class="s2">"Roraima"</span> <span class="o">=&gt;</span> <span class="s2">"Norte"</span><span class="p">,</span>
  <span class="s2">"Tocantins"</span> <span class="o">=&gt;</span> <span class="s2">"Norte"</span><span class="p">,</span>

  <span class="s2">"Alagoas"</span> <span class="o">=&gt;</span> <span class="s2">"Nordeste"</span><span class="p">,</span> <span class="s2">"Bahia"</span> <span class="o">=&gt;</span> <span class="s2">"Nordeste"</span><span class="p">,</span> <span class="s2">"Ceará"</span> <span class="o">=&gt;</span> <span class="s2">"Nordeste"</span><span class="p">,</span>
  <span class="s2">"Maranhão"</span> <span class="o">=&gt;</span> <span class="s2">"Nordeste"</span><span class="p">,</span> <span class="s2">"Paraíba"</span> <span class="o">=&gt;</span> <span class="s2">"Nordeste"</span><span class="p">,</span> <span class="s2">"Pernambuco"</span> <span class="o">=&gt;</span> <span class="s2">"Nordeste"</span><span class="p">,</span>
  <span class="s2">"Piauí"</span> <span class="o">=&gt;</span> <span class="s2">"Nordeste"</span><span class="p">,</span> <span class="s2">"Rio Grande do Norte"</span> <span class="o">=&gt;</span> <span class="s2">"Nordeste"</span><span class="p">,</span>
  <span class="s2">"Sergipe"</span> <span class="o">=&gt;</span> <span class="s2">"Nordeste"</span><span class="p">,</span>

  <span class="s2">"Espírito Santo"</span> <span class="o">=&gt;</span> <span class="s2">"Sudeste"</span><span class="p">,</span>
  <span class="s2">"Minas Gerais"</span> <span class="o">=&gt;</span> <span class="s2">"Sudeste"</span><span class="p">,</span>
  <span class="s2">"Rio de Janeiro"</span> <span class="o">=&gt;</span> <span class="s2">"Sudeste"</span><span class="p">,</span>
  <span class="s2">"São Paulo"</span> <span class="o">=&gt;</span> <span class="s2">"Sudeste"</span><span class="p">,</span>

  <span class="s2">"Paraná"</span> <span class="o">=&gt;</span> <span class="s2">"Sul"</span><span class="p">,</span> <span class="s2">"Rio Grande do Sul"</span> <span class="o">=&gt;</span> <span class="s2">"Sul"</span><span class="p">,</span> <span class="s2">"Santa Catarina"</span> <span class="o">=&gt;</span> <span class="s2">"Sul"</span><span class="p">,</span>

  <span class="s2">"Goiás"</span> <span class="o">=&gt;</span> <span class="s2">"Centro-Oeste"</span><span class="p">,</span> <span class="s2">"Mato Grosso"</span> <span class="o">=&gt;</span> <span class="s2">"Centro-Oeste"</span><span class="p">,</span>
  <span class="s2">"Mato Grosso do Sul"</span> <span class="o">=&gt;</span> <span class="s2">"Centro-Oeste"</span><span class="p">,</span>
  <span class="s2">"Distrito Federal"</span> <span class="o">=&gt;</span> <span class="s2">"Centro-Oeste"</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="text-white-50 text-light"># Hash que mapeia nome do Estado para sua respectiva Região</code>:</p>

<ul>
  <li>Outro comentário explicando que este hash associa nomes de Estados às suas regiões.</li>
</ul>

<p><code class="text-white-50 text-light">estados_para_regioes = { ... }</code>:</p>

<ul>
  <li>Cria uma variável chamada <code class="text-white-50 text-light">estados_para_regioes</code>.</li>
  <li>O valor é outro hash, mas agora:
    <ul>
      <li>As chaves são os nomes completos dos Estados.</li>
      <li>Os valores são as regiões correspondentes (Norte, Nordeste, Sudeste, Sul, Centro-Oeste).</li>
    </ul>
  </li>
  <li>Quando essa linha é executada, Ruby monta esse dicionário na memória.</li>
  <li>Mais tarde, quando tivermos o nome de um Estado válido, vamos perguntar:</li>
</ul>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">estados_para_regioes</span><span class="p">[</span><span class="s2">"Bahia"</span><span class="p">]</span>  <span class="c1"># devolve "Nordeste"</span>
</code></pre></div></div>

<p>Ou seja, dado o nome do Estado, conseguimos descobrir a região usando esse hash.</p>

<p><strong>3. Lendo a entrada da pessoa</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">print</span> <span class="s2">"Digite o nome do Estado ou a sigla: "</span>
<span class="n">estado_digitado</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span>
</code></pre></div></div>

<p><code class="text-white-50 text-light">print "Digite o nome do Estado ou a sigla: "</code>:</p>

<ul>
  <li><code class="text-white-50 text-light">print</code> escreve o texto “Digite o nome do Estado ou a sigla: “ na tela, sem pular linha depois.</li>
  <li>Ruby exibe o texto e o cursor fica esperando a pessoa digitar algo no teclado.</li>
</ul>

<p><code class="text-white-50 text-light">estado_digitado = gets.chomp</code>:</p>

<p><code class="text-white-50 text-light">gets</code> lê o que a pessoa digita até apertar <kbd>Enter</kbd>.</p>

<ul>
  <li>Isso inclui a quebra de linha (<code class="text-white-50 text-light">\n</code>) que acontece quando a pessoa aperta <kbd>Enter</kbd>.</li>
</ul>

<p><code class="text-white-50 text-light">chomp</code> remove essa quebra de linha do final.</p>

<ul>
  <li>Ou seja, fica só o texto digitado.</li>
  <li>O valor resultante (o texto digitado sem a quebra de linha) é armazenado na variável <code class="text-white-50 text-light">estado_digitado</code> para usarmos depois.</li>
  <li>Se a pessoa digitar BA → estado_digitado recebe “BA”.</li>
  <li>Se digitar Bahia → recebe “Bahia”.</li>
  <li>Se digitar rio de janeiro → recebe “rio de janeiro”.</li>
  <li>O fluxo é:
    <ul>
      <li>O programa pausa na função <code class="text-white-50 text-light">gets</code> esperando a digitação.</li>
      <li>Quando a pessoa aperta <kbd>Enter</kbd>, o texto digitado é capturado e armazenado na variável <code class="text-white-50 text-light">estado_digitado</code>.</li>
      <li>A função <code class="text-white-50 text-light">chomp</code> remove a quebra de linha do final do texto (o <code class="text-white-50 text-light">\n</code>).</li>
      <li>O valor final, sem a quebra de linha, fica armazenado em <code class="text-white-50 text-light">estado_digitado</code> para usarmos depois.</li>
    </ul>
  </li>
</ul>

<p><strong>4. Tratamento da entrada</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Tratamento da entrada</span>
<span class="n">estado_digitado_maiusculo</span> <span class="o">=</span> <span class="n">estado_digitado</span><span class="p">.</span><span class="nf">upcase</span>
<span class="n">estado_digitado_formatado</span> <span class="o">=</span> <span class="n">estado_digitado</span><span class="p">.</span><span class="nf">split</span><span class="p">.</span><span class="nf">map</span><span class="p">(</span><span class="o">&amp;</span><span class="ss">:capitalize</span><span class="p">).</span><span class="nf">join</span><span class="p">(</span><span class="s2">" "</span><span class="p">)</span>
</code></pre></div></div>

<p><code class="text-white-50 text-light"># Tratamento da entrada</code>:</p>

<ul>
  <li>Comentário explicando que agora vamos “preparar” a entrada para facilitar a validação.</li>
</ul>

<p><code class="text-white-50 text-light">estado_digitado_maiusculo = estado_digitado.upcase</code>:</p>

<ul>
  <li><code class="text-white-50 text-light">estado_digitado</code> é a string original digitada.</li>
  <li><code class="text-white-50 text-light">.upcase</code> converte toda a string para letras maiúsculas.
    <ul>
      <li>Exemplos:
        <ul>
          <li>“ba” vira “BA”</li>
          <li>“Ba” vira “BA”</li>
          <li>“BA” continua “BA”</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Ruby pega o conteúdo atual de <code class="text-white-50 text-light">estado_digitado</code>, aplica o método <code class="text-white-50 text-light">upcase</code> e armazena o resultado na nova variável <code class="text-white-50 text-light">estado_digitado_maiusculo</code>.</li>
  <li>Isso vai ser útil para comparar com as siglas, que estão todas em maiúsculas no hash.</li>
</ul>

<p><code class="text-white-50 text-light">estado_digitado_formatado = estado_digitado.split.map(&amp;:capitalize).join(" ")</code>:</p>

<p>Essa linha faz várias coisas conectadas então vamos dividir em partes.</p>

<p><code class="text-white-50 text-light">estado_digitado.split</code>:</p>

<p><code class="text-white-50 text-light">split</code> divide a string em palavras usando o espaço como separador, ou seja, cria uma lista (array) de palavras.</p>
<ul>
  <li>Exemplo: “rio de janeiro” vira [“rio”, “de”, “janeiro”] e “São Paulo” vira [“São”, “Paulo”].</li>
</ul>

<p><code class="text-white-50 text-light">.map(&amp;:capitalize)</code>:</p>
<ul>
  <li><code class="text-white-50 text-light">map</code> percorre cada item do array e aplica uma transformação, que transformação? Nesse caso é o <code class="text-white-50 text-light">capitalize</code>.</li>
  <li><code class="text-white-50 text-light">&amp;:capitalize é um atalho para dizer:
</code>    <ul>
      <li>“Aplique o método <code class="text-white-50 text-light">.capitalize</code> em cada palavra” e o <code class="text-white-50 text-light">capitalize</code> transforma a primeira letra da palavra em maiúscula e o resto em minúscula.</li>
    </ul>
  </li>
</ul>

<p>Depois disso, o array que antes era [“rio”, “de”, “janeiro”] vira [“Rio”, “De”, “Janeiro”].</p>

<p><code class="text-white-50 text-light">.join(" ")</code>:</p>
<ul>
  <li>Finalmente, <code class="text-white-50 text-light">join(" ")</code> pega o array de palavras transformadas e junta tudo de volta em uma única string, colocando um espaço entre cada palavra.</li>
  <li>Então [“Rio”, “De”, “Janeiro”] vira “Rio De Janeiro”.</li>
</ul>

<p>Então a linha <code class="text-white-50 text-light">estado_digitado_formatado = estado_digitado.split.map(&amp;:capitalize).join(" "):</code> quer dizer:</p>

<p>“Ei Ruby, pegue o que a pessoa digitou, que foi para dentro da variável <code class="text-white-50 text-light">estado_digitado</code>, divida em palavras usando o espaço como separador, transforme cada palavra para que a primeira letra fique maiúscula e o resto minúsculo, e depois junte tudo de volta em uma única string com espaços entre as palavras. Armazene esse resultado na variável <code class="text-white-50 text-light">estado_digitado_formatado</code>.”</p>

<p><strong>5. Preparando a variável de controle</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">estado_valido</span> <span class="o">=</span> <span class="kp">nil</span>
</code></pre></div></div>

<p>Aqui criamos a variável <code class="text-white-50 text-light">estado_valido</code> e inicializamos com <code class="text-white-50 text-light">nil</code> (que significa “nenhum valor”).</p>

<p>A ideia é: enquanto não tivermos certeza se o Estado digitado é válido, essa variável fica como <code class="text-white-50 text-light">nil</code>. Depois, se descobrirmos que é válido, vamos atribuir o nome do Estado a essa variável.</p>

<p>A partir de agora, as estruturas <code class="text-white-50 text-light">if</code> vão modificar essa variável dependendo do que for digitado.</p>

<p><strong>6. Verificar se é uma sigla</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 1. Verificar se é sigla (ex.: "SP")</span>
<span class="k">if</span> <span class="n">siglas_para_estados</span><span class="p">.</span><span class="nf">key?</span><span class="p">(</span><span class="n">estado_digitado_maiusculo</span><span class="p">)</span>
  <span class="n">estado_valido</span> <span class="o">=</span> <span class="n">siglas_para_estados</span><span class="p">[</span><span class="n">estado_digitado_maiusculo</span><span class="p">]</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Na linha <code class="text-white-50 text-light">if siglas_para_estados.key?(estado_digitado_maiusculo)</code>:</p>

<p><code class="text-white-50 text-light">siglas_para_estados.key?(...)</code> verifica se a chave (sigla) existe no hash <code class="text-white-50 text-light">siglas_para_estados</code>.</p>

<p>Por exemplo: se <code class="text-white-50 text-light">estado_digitado_maiusculo</code> for “SP”, essa verificação retorna <code class="text-white-50 text-light">true</code> porque “SP” é uma chave válida no hash. Mas, se for “XX”, retorna <code class="text-white-50 text-light">false</code> porque “XX” não está no hash.</p>

<p>Ruby pega o valor em <code class="text-white-50 text-light">estado_digitado_maiusculo</code>, pergunta ao hash <code class="text-white-50 text-light">siglas_para_estados</code> se essa chave existe usando o método <code class="text-white-50 text-light">key?</code>. Se existir, o bloco dentro do <code class="text-white-50 text-light">if</code> é executado, se não existir, o programa pula para o <code class="text-white-50 text-light">end</code> e continua a execução sem fazer nada que está dentro desse <code class="text-white-50 text-light">if</code>.</p>

<p>Na linha <code class="text-white-50 text-light">estado_valido = siglas_para_estados[estado_digitado_maiusculo]</code>:</p>

<p>O conteúdo só será executado se a condição do <code class="text-white-50 text-light">if</code> for verdadeira.</p>

<p><code class="text-white-50 text-light">siglas_para_estados[estado_digitado_maiusculo]</code> acessa o hash <code class="text-white-50 text-light">siglas_para_estados</code> usando a sigla digitada (em maiúsculas) como chave e retorna o nome completo do Estado correspondente.</p>

<p>Por exemplo, se <code class="text-white-50 text-light">estado_digitado_maiusculo</code> for “SP”, essa expressão retorna “São Paulo”.</p>

<p>Ou seja, <code class="text-white-50 text-light">estado_valido</code> passa a guardar o nome completo do Estado correspondente à sigla digitada.</p>

<p>Se a condição do <code class="text-white-50 text-light">if</code> for falsa (ou seja, se a sigla digitada não existir no hash), o bloco dentro do <code class="text-white-50 text-light">if</code> não será executado, e <code class="text-white-50 text-light">estado_valido</code> permanecerá como <code class="text-white-50 text-light">nil</code>.</p>

<p><strong>7. Verificar se é nome completo</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 2. Verificar se é nome completo (ex.: "Bahia")</span>
<span class="k">if</span> <span class="n">estados_para_regioes</span><span class="p">.</span><span class="nf">key?</span><span class="p">(</span><span class="n">estado_digitado_formatado</span><span class="p">)</span>
  <span class="n">estado_valido</span> <span class="o">=</span> <span class="n">estado_digitado_formatado</span>
<span class="k">end</span>
</code></pre></div></div>

<p>A linha <code class="text-white-50 text-light">if estados_para_regioes.key?(estado_digitado_formatado)</code>:</p>

<p>Pergunta ao hash <code class="text-white-50 text-light">estados_para_regioes</code> se esse texto formatado que foi digitado é o nome de um Estado válido.</p>

<p>Por exemplo:</p>

<ul>
  <li>Se for “Bahia”, vai receber <code class="text-white-50 text-light">true</code> porque “Bahia” é uma chave válida no hash.</li>
  <li>Se for “Narnia”, vai receber <code class="text-white-50 text-light">false</code> porque “Narnia” não está no hash então não é um Estado válido.</li>
</ul>

<p>Ruby pega o valor de <code class="text-white-50 text-light">estado_digitado_formatado</code>, pergunta ao hash <code class="text-white-50 text-light">estados_para_regioes</code> se essa chave existe usando o método <code class="text-white-50 text-light">key?</code>. Se existir, o bloco dentro do <code class="text-white-50 text-light">if</code> é executado, se não existir, o programa pula para o <code class="text-white-50 text-light">end</code> e continua a execução sem fazer nada que está dentro desse <code class="text-white-50 text-light">if</code>.</p>

<p>Na linha <code class="text-white-50 text-light">estado_valido = estado_digitado_formatado</code>:</p>

<p>Se a condição do <code class="text-white-50 text-light">if</code> for verdadeira (ou seja, se o nome do Estado digitado for válido), o bloco dentro do <code class="text-white-50 text-light">if</code> será executado.</p>

<p><code class="text-white-50 text-light">estado_valido = estado_digitado_formatado</code>: aqui se a pessoa digitou um nome completo de Estado válido, copiamos esse nome para <code class="text-white-50 text-light">estado_valido</code>.</p>

<p>Exemplo: se a pessoa digitou “Bahia”, então <code class="text-white-50 text-light">estado_valido</code> passa a ser “Bahia”.</p>

<p><strong>8. Tratando o caso inválido</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 3. Se nenhum deles for encontrado → inválido</span>
<span class="k">if</span> <span class="n">estado_valido</span><span class="p">.</span><span class="nf">nil?</span>
  <span class="nb">puts</span> <span class="s2">"Estado inválido. Fim do programa."</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Aqui verificamos se <code class="text-white-50 text-light">estado_valido</code> ainda é <code class="text-white-50 text-light">nil</code>.</p>

<p>A linha <code class="text-white-50 text-light">if estado_valido.nil?</code>:</p>

<p>Usamos o método <code class="text-white-50 text-light">nil?</code> para checar se a variável <code class="text-white-50 text-light">estado_valido</code> não recebeu nenhum valor válido (ou seja, se continua sendo <code class="text-white-50 text-light">nil</code>).</p>

<p>Se for <code class="text-white-50 text-light">nil</code>, significa que a pessoa digitou algo que não é uma sigla válida nem um nome de Estado válido.</p>

<p>Na linha <code class="text-white-50 text-light">puts "Estado inválido. Fim do programa."</code>: exibimos uma mensagem informando que o Estado digitado é inválido e que o programa será encerrado.</p>

<p><strong>9. Tratando o caso válido</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 4. Se for válido, mostrar região</span>
<span class="k">if</span> <span class="o">!</span><span class="n">estado_valido</span><span class="p">.</span><span class="nf">nil?</span>
  <span class="n">regiao</span> <span class="o">=</span> <span class="n">estados_para_regioes</span><span class="p">[</span><span class="n">estado_valido</span><span class="p">]</span>
  <span class="nb">puts</span> <span class="s2">"Você mora em </span><span class="si">#{</span><span class="n">estado_valido</span><span class="si">}</span><span class="s2"> na Região </span><span class="si">#{</span><span class="n">regiao</span><span class="si">}</span><span class="s2">"</span>
<span class="k">end</span>
</code></pre></div></div>

<p><code class="text-white-50 text-light">if !estado_valido.nil?</code>:</p>

<p>Aqui verificamos se <code class="text-white-50 text-light">estado_valido</code> não é <code class="text-white-50 text-light">nil</code>.</p>

<p>Usamos o operador <code class="text-white-50 text-light">!</code> para negar a condição, ou seja, estamos perguntando: “Será que <code class="text-white-50 text-light">estado_valido</code> tem um valor válido?”</p>

<p>Se <code class="text-white-50 text-light">estado_valido</code> não for <code class="text-white-50 text-light">nil</code>, significa que a pessoa digitou uma sigla ou nome de Estado válido.</p>

<p>Na linha <code class="text-white-50 text-light">regiao = estados_para_regioes[estado_valido]</code>:</p>

<p>Acessamos o hash <code class="text-white-50 text-light">estados_para_regioes</code> usando o nome do Estado armazenado em <code class="text-white-50 text-light">estado_valido</code> como chave para obter a região correspondente.</p>

<p>Por exemplo, se <code class="text-white-50 text-light">estado_valido</code> for “Bahia”, essa linha atribui “Nordeste” à variável <code class="text-white-50 text-light">regiao</code>.</p>

<p>Na linha <code class="text-white-50 text-light">puts "Você mora em #{estado_valido} na Região #{regiao}"</code>:</p>

<p>Exibimos uma mensagem informando o nome do Estado e a região correspondente, usando interpolação de strings para inserir os valores das variáveis <code class="text-white-50 text-light">estado_valido</code> e <code class="text-white-50 text-light">regiao</code> na mensagem.</p>

<p>Se a pessoa digitou “Bahia”, a mensagem exibida será: “Você mora em Bahia na Região Nordeste”.</p>

<p>Depois de analisar o programa inteiro, linha por linha, podemos dizer que ele cria dois hashes para mapear siglas e nomes de Estados às suas regiões, lê a entrada da pessoa, trata essa entrada para facilitar a validação, verifica se a entrada é uma sigla ou nome válido, e exibe a mensagem apropriada dependendo se o Estado é válido ou não.</p>

<h2 id="else-e-elseif">Else e Elseif</h2>
<hr />

<p>Muitas vezes queremos fazer verificações mais complexas, com várias condições diferentes.</p>

<p>Por exemplo:</p>

<ul>
  <li>Se uma condição for verdadeira, faça isso;</li>
  <li>se uma condição for falsa, faça aquilo.</li>
</ul>

<p>Para esses casos, além do <code class="text-white-50 text-light">if</code>, podemos usar o <code class="text-white-50 text-light">else</code> e o <code class="text-white-50 text-light">elsif</code>.</p>

<h3 id="else">else</h3>
<hr />

<p>O <code class="text-white-50 text-light">else</code> é usado para definir um bloco de código que será executado quando a condição do <code class="text-white-50 text-light">if</code> for falsa.</p>

<p>Estrutura:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="n">condicao</span>
  <span class="c1"># comandos se a condição for verdadeira</span>
<span class="k">else</span>
  <span class="c1"># comandos se a condição for falsa</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Exemplo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">media</span> <span class="o">=</span> <span class="mf">6.5</span>

<span class="k">if</span> <span class="n">media</span> <span class="o">&gt;=</span> <span class="mi">7</span>
  <span class="nb">puts</span> <span class="s2">"A pessoa está aprovada."</span>
<span class="k">else</span>
  <span class="nb">puts</span> <span class="s2">"A pessoa está reprovada."</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Aqui temos dois caminhos possíveis e sempre um deles será seguido.</p>

<ul>
  <li>Se a variável <code class="text-white-50 text-light">media</code> for maior ou igual a 7, o programa imprime “A pessoa está aprovada.”.</li>
  <li>Caso contrário, imprime “A pessoa está reprovada.”.</li>
</ul>

<h3 id="elsif">elsif</h3>
<hr />

<p>Às vezes não temos só duas opções, mas três ou mais. Por exemplo:</p>

<ul>
  <li>Média maior ou igual a 7 a pessoa está aprovada;</li>
  <li>Média entre 5 e 6.9 a pessoa está em recuperação;</li>
  <li>Média menor que 5 a pessoa está reprovada.</li>
</ul>

<p>Para esses casos, usamos o <code class="text-white-50 text-light">elsif</code> incluir condições adicionais.</p>

<p>Por exemplo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">media</span> <span class="o">=</span> <span class="mf">5.8</span>

<span class="k">if</span> <span class="n">media</span> <span class="o">&gt;=</span> <span class="mi">7</span>
  <span class="nb">puts</span> <span class="s2">"A pessoa está aprovada."</span>
<span class="k">elsif</span> <span class="n">media</span> <span class="o">&gt;=</span> <span class="mi">5</span>
  <span class="nb">puts</span> <span class="s2">"A pessoa está em recuperação."</span>
<span class="k">else</span>
  <span class="nb">puts</span> <span class="s2">"A pessoa está reprovada."</span>
<span class="k">end</span>
</code></pre></div></div>

<p><strong>Atenção: A ordem das condições é muito importante!</strong></p>

<p>Vamos entender melhor por que a ordem faz diferença:</p>

<p>No exemplo acima, o programa testa as condições na seguinte ordem:</p>

<ol>
  <li>Primeiro: verifica se a média é maior ou igual a 7 (aprovado)</li>
  <li>Segundo: verifica se a média é maior ou igual a 5 (recuperação)</li>
  <li>Terceiro: se nenhuma das anteriores for verdadeira, considera reprovado</li>
</ol>

<p>Essa ordem funciona corretamente porque o programa para de verificar assim que encontra uma condição verdadeira. Veja o que acontece com uma média de 8:</p>

<ul>
  <li>O programa testa: 8 &gt;= 7?
    <ul>
      <li><strong>Sim!</strong> então escreve na tela “A pessoa está aprovada.” e <strong>para</strong>.</li>
    </ul>
  </li>
  <li>Nem chega a testar se 8 &gt;= 5, porque já encontrou uma condição verdadeira.</li>
</ul>

<p>Agora vamos ver o que aconteceria se a ordem das condições fosse invertida:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">media</span> <span class="o">=</span> <span class="mi">8</span>

<span class="k">if</span> <span class="n">media</span> <span class="o">&gt;=</span> <span class="mi">5</span>  <span class="c1"># ERRADO! Testando recuperação primeiro</span>
  <span class="nb">puts</span> <span class="s2">"A pessoa está em recuperação."</span>
<span class="k">elsif</span> <span class="n">media</span> <span class="o">&gt;=</span> <span class="mi">7</span>
  <span class="nb">puts</span> <span class="s2">"A pessoa está aprovada."</span>
<span class="k">else</span>
  <span class="nb">puts</span> <span class="s2">"A pessoa está reprovada."</span>
<span class="k">end</span>
</code></pre></div></div>

<p>O que acontece agora com a média 8?</p>

<ul>
  <li>O programa testa: 8 &gt;= 5?
    <ul>
      <li><strong>Sim!</strong> então escreve na tela “A pessoa está em recuperação.” e <strong>para</strong>.</li>
    </ul>
  </li>
  <li>Ele não vai testar a segunda condição (8 &gt;= 7) porque já encontrou uma condição verdadeira na primeira verificação mesmo que a segunda também seja verdadeira.</li>
</ul>

<p>Resultado: uma pessoa com média 8 seria considerada em recuperação, quando deveria estar aprovada!</p>

<p>Isso acontece porque o programa sempre verifica as condições <strong>de cima para baixo</strong> e para na primeira que for verdadeira. Assim que encontra uma condição verdadeira, ele executa aquele bloco e pula todas as outras, mesmo que também sejam verdadeiras.</p>

<p>Por isso devemos organizar as condições do mais específico para o mais geral, garantindo que cada condição seja avaliada corretamente.</p>

<p>Neste caso, a ordem correta é:</p>

<ol>
  <li>Verificar se a média é maior ou igual a 7 (aprovado)</li>
  <li>Verificar se a média é maior ou igual a 5 (recuperação)</li>
  <li>Caso contrário, considerar reprovado</li>
</ol>

<p>Por isso, sempre que estiver usando múltiplas condições com <code class="text-white-50 text-light">if</code>, <code class="text-white-50 text-light">elsif</code> e <code class="text-white-50 text-light">else</code>, pense cuidadosamente na ordem em que as condições devem ser avaliadas para garantir que o programa funcione corretamente.</p>

<h2 id="refazendo-o-programa-dos-estados-com-else-e-elsif">Refazendo o programa dos Estados com Else e Elsif</h2>
<hr />

<p>Vamos reescrever o programa dos Estados usando <code class="text-white-50 text-light">else</code> e <code class="text-white-50 text-light">elsif</code> para simplificar a lógica de verificação.</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Hash que mapeia siglas para nomes completos dos Estados</span>
<span class="n">siglas_para_estados</span> <span class="o">=</span> <span class="p">{</span>
  <span class="s2">"AC"</span> <span class="o">=&gt;</span> <span class="s2">"Acre"</span><span class="p">,</span> <span class="s2">"AL"</span> <span class="o">=&gt;</span> <span class="s2">"Alagoas"</span><span class="p">,</span> <span class="s2">"AP"</span> <span class="o">=&gt;</span> <span class="s2">"Amapá"</span><span class="p">,</span> <span class="s2">"AM"</span> <span class="o">=&gt;</span> <span class="s2">"Amazonas"</span><span class="p">,</span>
  <span class="s2">"BA"</span> <span class="o">=&gt;</span> <span class="s2">"Bahia"</span><span class="p">,</span> <span class="s2">"CE"</span> <span class="o">=&gt;</span> <span class="s2">"Ceará"</span><span class="p">,</span> <span class="s2">"DF"</span> <span class="o">=&gt;</span> <span class="s2">"Distrito Federal"</span><span class="p">,</span>
  <span class="s2">"ES"</span> <span class="o">=&gt;</span> <span class="s2">"Espírito Santo"</span><span class="p">,</span> <span class="s2">"GO"</span> <span class="o">=&gt;</span> <span class="s2">"Goiás"</span><span class="p">,</span> <span class="s2">"MA"</span> <span class="o">=&gt;</span> <span class="s2">"Maranhão"</span><span class="p">,</span>
  <span class="s2">"MT"</span> <span class="o">=&gt;</span> <span class="s2">"Mato Grosso"</span><span class="p">,</span> <span class="s2">"MS"</span> <span class="o">=&gt;</span> <span class="s2">"Mato Grosso do Sul"</span><span class="p">,</span>
  <span class="s2">"MG"</span> <span class="o">=&gt;</span> <span class="s2">"Minas Gerais"</span><span class="p">,</span> <span class="s2">"PA"</span> <span class="o">=&gt;</span> <span class="s2">"Pará"</span><span class="p">,</span> <span class="s2">"PB"</span> <span class="o">=&gt;</span> <span class="s2">"Paraíba"</span><span class="p">,</span>
  <span class="s2">"PR"</span> <span class="o">=&gt;</span> <span class="s2">"Paraná"</span><span class="p">,</span> <span class="s2">"PE"</span> <span class="o">=&gt;</span> <span class="s2">"Pernambuco"</span><span class="p">,</span> <span class="s2">"PI"</span> <span class="o">=&gt;</span> <span class="s2">"Piauí"</span><span class="p">,</span>
  <span class="s2">"RJ"</span> <span class="o">=&gt;</span> <span class="s2">"Rio de Janeiro"</span><span class="p">,</span> <span class="s2">"RN"</span> <span class="o">=&gt;</span> <span class="s2">"Rio Grande do Norte"</span><span class="p">,</span>
  <span class="s2">"RS"</span> <span class="o">=&gt;</span> <span class="s2">"Rio Grande do Sul"</span><span class="p">,</span> <span class="s2">"RO"</span> <span class="o">=&gt;</span> <span class="s2">"Rondônia"</span><span class="p">,</span> <span class="s2">"RR"</span> <span class="o">=&gt;</span> <span class="s2">"Roraima"</span><span class="p">,</span>
  <span class="s2">"SC"</span> <span class="o">=&gt;</span> <span class="s2">"Santa Catarina"</span><span class="p">,</span> <span class="s2">"SP"</span> <span class="o">=&gt;</span> <span class="s2">"São Paulo"</span><span class="p">,</span> <span class="s2">"SE"</span> <span class="o">=&gt;</span> <span class="s2">"Sergipe"</span><span class="p">,</span>
  <span class="s2">"TO"</span> <span class="o">=&gt;</span> <span class="s2">"Tocantins"</span>
<span class="p">}</span>

<span class="c1"># Hash que mapeia nome do Estado para sua respectiva Região</span>
<span class="n">estados_para_regioes</span> <span class="o">=</span> <span class="p">{</span>
  <span class="s2">"Acre"</span> <span class="o">=&gt;</span> <span class="s2">"Norte"</span><span class="p">,</span> <span class="s2">"Amapá"</span> <span class="o">=&gt;</span> <span class="s2">"Norte"</span><span class="p">,</span> <span class="s2">"Amazonas"</span> <span class="o">=&gt;</span> <span class="s2">"Norte"</span><span class="p">,</span>
  <span class="s2">"Pará"</span> <span class="o">=&gt;</span> <span class="s2">"Norte"</span><span class="p">,</span> <span class="s2">"Rondônia"</span> <span class="o">=&gt;</span> <span class="s2">"Norte"</span><span class="p">,</span> <span class="s2">"Roraima"</span> <span class="o">=&gt;</span> <span class="s2">"Norte"</span><span class="p">,</span>
  <span class="s2">"Tocantins"</span> <span class="o">=&gt;</span> <span class="s2">"Norte"</span><span class="p">,</span>

  <span class="s2">"Alagoas"</span> <span class="o">=&gt;</span> <span class="s2">"Nordeste"</span><span class="p">,</span> <span class="s2">"Bahia"</span> <span class="o">=&gt;</span> <span class="s2">"Nordeste"</span><span class="p">,</span> <span class="s2">"Ceará"</span> <span class="o">=&gt;</span> <span class="s2">"Nordeste"</span><span class="p">,</span>
  <span class="s2">"Maranhão"</span> <span class="o">=&gt;</span> <span class="s2">"Nordeste"</span><span class="p">,</span> <span class="s2">"Paraíba"</span> <span class="o">=&gt;</span> <span class="s2">"Nordeste"</span><span class="p">,</span> <span class="s2">"Pernambuco"</span> <span class="o">=&gt;</span> <span class="s2">"Nordeste"</span><span class="p">,</span>
  <span class="s2">"Piauí"</span> <span class="o">=&gt;</span> <span class="s2">"Nordeste"</span><span class="p">,</span> <span class="s2">"Rio Grande do Norte"</span> <span class="o">=&gt;</span> <span class="s2">"Nordeste"</span><span class="p">,</span>
  <span class="s2">"Sergipe"</span> <span class="o">=&gt;</span> <span class="s2">"Nordeste"</span><span class="p">,</span>

  <span class="s2">"Espírito Santo"</span> <span class="o">=&gt;</span> <span class="s2">"Sudeste"</span><span class="p">,</span>
  <span class="s2">"Minas Gerais"</span> <span class="o">=&gt;</span> <span class="s2">"Sudeste"</span><span class="p">,</span>
  <span class="s2">"Rio de Janeiro"</span> <span class="o">=&gt;</span> <span class="s2">"Sudeste"</span><span class="p">,</span>
  <span class="s2">"São Paulo"</span> <span class="o">=&gt;</span> <span class="s2">"Sudeste"</span><span class="p">,</span>

  <span class="s2">"Paraná"</span> <span class="o">=&gt;</span> <span class="s2">"Sul"</span><span class="p">,</span> <span class="s2">"Rio Grande do Sul"</span> <span class="o">=&gt;</span> <span class="s2">"Sul"</span><span class="p">,</span> <span class="s2">"Santa Catarina"</span> <span class="o">=&gt;</span> <span class="s2">"Sul"</span><span class="p">,</span>

  <span class="s2">"Goiás"</span> <span class="o">=&gt;</span> <span class="s2">"Centro-Oeste"</span><span class="p">,</span> <span class="s2">"Mato Grosso"</span> <span class="o">=&gt;</span> <span class="s2">"Centro-Oeste"</span><span class="p">,</span>
  <span class="s2">"Mato Grosso do Sul"</span> <span class="o">=&gt;</span> <span class="s2">"Centro-Oeste"</span><span class="p">,</span>
  <span class="s2">"Distrito Federal"</span> <span class="o">=&gt;</span> <span class="s2">"Centro-Oeste"</span>
<span class="p">}</span>

<span class="nb">print</span> <span class="s2">"Digite o nome do Estado ou a sigla: "</span>
<span class="n">estado_digitado</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span>

<span class="n">estado_digitado_maiusculo</span> <span class="o">=</span> <span class="n">estado_digitado</span><span class="p">.</span><span class="nf">upcase</span>
<span class="n">estado_digitado_formatado</span> <span class="o">=</span> <span class="n">estado_digitado</span><span class="p">.</span><span class="nf">split</span><span class="p">.</span><span class="nf">map</span><span class="p">(</span><span class="o">&amp;</span><span class="ss">:capitalize</span><span class="p">).</span><span class="nf">join</span><span class="p">(</span><span class="s2">" "</span><span class="p">)</span>

<span class="k">if</span> <span class="n">siglas_para_estados</span><span class="p">.</span><span class="nf">key?</span><span class="p">(</span><span class="n">estado_digitado_maiusculo</span><span class="p">)</span>
  <span class="n">estado_valido</span> <span class="o">=</span> <span class="n">siglas_para_estados</span><span class="p">[</span><span class="n">estado_digitado_maiusculo</span><span class="p">]</span>
<span class="k">elsif</span> <span class="n">estados_para_regioes</span><span class="p">.</span><span class="nf">key?</span><span class="p">(</span><span class="n">estado_digitado_formatado</span><span class="p">)</span>
  <span class="n">estado_valido</span> <span class="o">=</span> <span class="n">estado_digitado_formatado</span>
<span class="k">else</span>
  <span class="nb">puts</span> <span class="s2">"Estado inválido. Fim do programa."</span>
  <span class="k">return</span>
<span class="k">end</span>

<span class="n">regiao</span> <span class="o">=</span> <span class="n">estados_para_regioes</span><span class="p">[</span><span class="n">estado_valido</span><span class="p">]</span>
<span class="nb">puts</span> <span class="s2">"Você mora em </span><span class="si">#{</span><span class="n">estado_valido</span><span class="si">}</span><span class="s2"> na Região </span><span class="si">#{</span><span class="n">regiao</span><span class="si">}</span><span class="s2">"</span>
</code></pre></div></div>

<p>Aqui, usamos <code class="text-white-50 text-light">elsif</code> para verificar se o nome completo do Estado é válido, e <code class="text-white-50 text-light">else</code> para tratar o caso inválido.</p>

<p>Quando a entrada é válida, o programa continua para buscar a região e exibir a mensagem final. Se for inválida, exibe a mensagem de erro e encerra o programa imediatamente com <code class="text-white-50 text-light">return</code>.</p>

<h3 id="quais-as-diferencas-dessa-versao-para-a-anterior">Quais as diferenças dessa versão para a anterior?</h3>
<hr />

<p>As duas versões fazem a mesma coisa: elas tentam descobrir se a pessoa digitou o nome de um estado ou a sigla dele, e depois mostram a região desse estado.</p>

<p>Mas as duas versões organizam o raciocínio de um jeito diferente.</p>

<p>A primeira versão do código usa vários <code class="text-white-50 text-light">if</code> separados para verificar cada possibilidade (se é sigla, se é nome completo, se é inválido, se é válido). Cada verificação é independente, e o programa vai passando por todas elas.</p>

<p>Ou seja, são 4 verificações separadas:</p>

<ol>
  <li>Verifica se é sigla;</li>
  <li>Verifica se é nome completo;</li>
  <li>Verifica se é inválido;</li>
  <li>Verifica se é válido.</li>
</ol>

<p>Assim, o código funciona, só que fica maior. E às vezes pode ser um pouco mais difícil de entender, porque você precisa acompanhar várias verificações diferentes. Além disso, mesmo quando a entrada é inválida, o programa ainda passa por todas as verificações antes de chegar na mensagem de erro.</p>

<p>É como fazer várias perguntas soltas, em vez de colocá-las numa ordem clara.</p>

<p>A segunda versão do código usa <code class="text-white-50 text-light">elsif</code> e <code class="text-white-50 text-light">else</code> para organizar as verificações de forma mais estruturada.</p>

<p>Isso significa que o código decide tudo dentro de um único bloco, seguindo uma ordem:</p>

<ol>
  <li>Primeiro, verifica se é sigla;</li>
  <li>Se não for sigla, verifica se é nome completo;</li>
  <li>Se não for nenhum dos dois, considera inválido.</li>
</ol>

<p>Esse bloco resolve tudo de uma vez só, e assim que encontra uma condição verdadeira, ele executa aquele bloco e pula o resto.</p>

<p>Assim, o código fica mais compacto e fácil de entender, porque você vê claramente as três possibilidades (sigla, nome completo, inválido) organizadas numa sequência lógica.</p>

<p>Não tem verificações repetidas ou independentes, tudo está dentro de um único fluxo de decisão. Se o que foi digitado for inválido , o programa para imediatamente e não faz mais nada por causa do <code class="text-white-50 text-light">return</code>.</p>

<p>É como uma fila organizada: cada pergunta leva para a próxima ou encerra o processo.</p>

<h3 id="mas-o-que-e-esse-return">Mas, o que é esse <code class="text-white-50 text-light">return</code>?</h3>
<hr />

<p>O <code class="text-white-50 text-light">return</code> é um comando que diz: “Pare o que você está fazendo e saia daqui agora.”</p>

<p>Ele encerra imediatamente a execução do método ou do programa onde está sendo usado. Mesmo que haja código depois, nada mais será executado.</p>

<p>No nosso exemplo, usamos o <code class="text-white-50 text-light">return</code> dentro do bloco <code class="text-white-50 text-light">else</code> que trata o caso de entrada inválida. Ou seja, se a pessoa digitar algo que não é uma sigla nem um nome de Estado válido, o programa exibe a mensagem de erro e depois para imediatamente a execução com o <code class="text-white-50 text-light">return</code>.</p>

<h3 id="por-que-usar-return-e-bom">Por que usar <code class="text-white-50 text-light">return</code> é bom?</h3>
<hr />

<p>Usar <code class="text-white-50 text-light">return</code> é bom porque evita que o programa continue executando código desnecessário depois de detectar um erro ou uma condição que não faça sentido seguir testeando.</p>

<p>No nosso caso, se o estado é inválido, não faz sentido continuar rodando o resto do código. Aí o <code class="text-white-50 text-light">return</code> ajuda a parar tudo ali mesmo, economizando tempo e recursos.</p>

<p>Ele também impede que informações incorretas sejam usadas, já que o programa não tenta mais acessar dados ou fazer cálculos baseados numa entrada inválida.</p>

<p>Além disso, o uso do <code class="text-white-50 text-light">return</code> torna o código mais claro. Quem lê o programa entende rapidamente que, se chegar naquele ponto, o programa deve parar ali mesmo, sem continuar. Isso ajuda a evitar confusões sobre o que o programa deve fazer em casos de erro.</p>

<p>Em resumo, o <code class="text-white-50 text-light">return</code> é uma ferramenta útil para controlar o fluxo do programa, especialmente em situações onde continuar a execução não faz sentido ou pode causar problemas.</p>

<h2 id="resumo">Resumo</h2>
<hr />

<p>Neste artigo, exploramos as expressões condicionais em Ruby, estruturas fundamentais para tomar decisões no código e validar entradas de dados. Começamos relembrando conceitos de I/O (entrada e saída) apresentados no artigo anterior, onde vimos como o programa se comunica através de STDIN, STDOUT e STDERR.</p>

<p>Aprendemos o que são expressões condicionais e como elas permitem ao programa tomar decisões baseadas em condições verdadeiras ou falsas, utilizando operadores de comparação (<code class="text-white-50 text-light">==</code>, <code class="text-white-50 text-light">!=</code>, <code class="text-white-50 text-light">&gt;</code>, <code class="text-white-50 text-light">&lt;</code>, <code class="text-white-50 text-light">&gt;=</code>, <code class="text-white-50 text-light">&lt;=</code>) e operadores lógicos (<code class="text-white-50 text-light">&amp;&amp;</code>, <code class="text-white-50 text-light">||</code>, <code class="text-white-50 text-light">!</code>) para construir condições.</p>

<p>Exploramos a estrutura <code class="text-white-50 text-light">if</code>, a forma mais básica de criar condições, que executa um bloco de código apenas quando uma condição é verdadeira. Vimos exemplos práticos, como verificar se uma loja está aberta em determinado dia da semana e validar se uma pessoa pode dirigir baseado na idade e posse de carteira.</p>

<p>Avançamos para estruturas mais complexas com <code class="text-white-50 text-light">else</code> e <code class="text-white-50 text-light">elsif</code>, que permitem tratar múltiplas condições de forma organizada. Aprendemos que a ordem das condições é crucial: devemos sempre verificar do mais específico para o mais geral, pois o programa para na primeira condição verdadeira encontrada.</p>

<p>Desenvolvemos um programa completo para validar Estados brasileiros, utilizando hashes (dicionários) para mapear siglas e nomes de Estados às suas regiões. Este exemplo demonstrou conceitos importantes como manipulação de strings com métodos como <code class="text-white-50 text-light">upcase</code>, <code class="text-white-50 text-light">split</code>, <code class="text-white-50 text-light">capitalize</code> e <code class="text-white-50 text-light">join</code>, além do uso de <code class="text-white-50 text-light">include?</code> e <code class="text-white-50 text-light">key?</code> para verificar a presença de elementos em arrays e hashes.</p>

<p>Também conhecemos o comando <code class="text-white-50 text-light">return</code>, que permite encerrar a execução do programa imediatamente quando necessário, evitando processamento desnecessário após detectar erros ou condições inválidas.</p>

<p>Por fim, enfatizamos a importância do planejamento antes da codificação através de testes de mesa e fluxogramas, ressaltando que desenvolver lógica de programação é mais importante do que decorar sintaxe. As expressões condicionais tornam o código mais robusto e dinâmico, permitindo tratamento eficiente de situações inesperadas e criando programas mais inteligentes e responsivos.</p>

<p>Como já havia comentado, acredito que aprender programação é como aprender um novo idioma. A pessoa não vai decorar todas as palavras e regras gramaticais de uma vez só antes de tentar dar um “Bom dia” ou “Como você está?” na língua nova. Ela vai aprendendo aos poucos, praticando, errando, corrigindo e melhorando com o tempo.</p>

<p>Por isso segui colocando novos elementos no meio dos códigos apresentados como o <code class="text-white-50 text-light">return</code> ou os métodos de string, mesmo que não tenha feito uma apresentação “formal” e detalhada deles. A ideia é ir apresentando esses elementos no contexto de uso, para que a pessoa vá se familiarizando com eles aos poucos.</p>

<p>De novo, essa não é a forma mais confortável de aprender, porque quebra a linearidade (“primeiro aprenda isso, depois aquilo”), mas acredito que é a forma mais próxima do aprendizado real de uma língua, que é o objetivo final aqui: aprender a programar de verdade, não só decorar sintaxe.</p>

<p>Com todo respeito, parece uma “bosta” isso, eu sei. Mas, pelo menos quem sobreviver a essa “bosta” vai sair sem esse maldito medo de errar ou tentar qualquer coisa nova como se estivesse pisando em ovos o tempo todo. Eu sou assim, só agora entendi que esse medo todo é resultado de anos de linearidade (“primeiro aprenda isso, depois aquilo”) na escola e cursos que fiz. É melhor, na minha visão, quebrar esse medo agora e “criar casca” (resiliência) do que ficar preso nesse ciclo de medo para sempre.</p>]]></content><author><name>Louise Suelen</name></author><category term="Programação" /><category term="programação" /><category term="tecnologia" /><summary type="html"><![CDATA[Neste artigo, vamos aprender a usar expressões condicionais em Ruby para tomar decisões no código e validar entradas de dados nos programas.]]></summary></entry><entry xml:lang="pt-BR"><title type="html">Introdução à Programação: Entrada e Saída de Dados em Ruby</title><link href="https://pcdnaescola.com.br/introducao-a-programacao-entrada-e-saida-de-dados-em-ruby/" rel="alternate" type="text/html" title="Introdução à Programação: Entrada e Saída de Dados em Ruby" /><published>2025-09-19T13:00:00+00:00</published><updated>2025-09-19T13:00:00+00:00</updated><id>https://pcdnaescola.com.br/introducao-a-programacao-entrada-e-saida-de-dados-em-ruby</id><content type="html" xml:base="https://pcdnaescola.com.br/introducao-a-programacao-entrada-e-saida-de-dados-em-ruby/"><![CDATA[<div class="text-center">
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://miro.medium.com/v2/resize:fit:1400/1*PMcPZ8mOKFRiGHWiIjjDvg.png" alt="" loading="lazy" aria-hidden="true" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

</div>

<h2 id="apresentacao">Apresentação</h2>
<hr />

<p>Até esse momento estamos inserindo dados nas variáveis, nas estruturas dos programas e etc., mas tudo isso está sendo feito diretamente no código. Ou seja, nós estamos alterando o código para mudar os dados, pré-definindo valores e não permitindo que esses dados sejam inseridos durante a execução do programa.</p>

<p>Mas como fazer para que a pessoa possa inserir dados durante a execução do programa? É aí que entram os comandos de entrada e saída de dados.</p>

<p>Entrada e saída (I/O, de Input/Output) são a forma como um programa conversa com o “mundo externo”.</p>

<ul>
  <li>
    <p><strong>Entrada (Input)</strong>: é o processo de receber dados da pessoa por algum dispositivo de entrada, como o teclado, mouse, touchscreen, etc. Também pode acontecer ao receber dados de arquivos, bancos de dados, sensores e por aí vai. Todas as formas que as pessoas ou sistemas tem para fornecer dados ao programa são consideradas entradas.</p>
  </li>
  <li>
    <p><strong>Saída (Output)</strong>: é o processo de enviar dados do programa para algum dispositivo de saída, como a tela do computador, impressora, alto-falantes, etc. Também pode acontecer ao salvar dados em arquivos, bancos de dados, ou enviar informações para outros sistemas. Todas as formas que o programa tem para comunicar informações para as pessoas ou outros sistemas são consideradas saídas.</p>
  </li>
</ul>

<p>Por exemplo, quando você digita algo no teclado, está fornecendo uma entrada para o programa. Quando o programa exibe uma mensagem na tela, está realizando uma saída.</p>

<p>Por isso é tão importante entender como funcionam os comandos de entrada e saída de dados em Ruby, para que possamos criar programas interativos e dinâmicos.</p>

<h2 id="streams-padrao">Streams padrão: STDIN, STDOUT e STDERR</h2>
<hr />

<p>Antes de aprender os comandos de Ruby que recebem e exibem informações, é importante entender como o programa se comunica com o ambiente fora dele, ou seja, como ele recebe dados e como ele envia respostas.</p>

<p>Para isso, Ruby (assim como quase todas as linguagens) utiliza um sistema chamado streams.</p>

<h3 id="o-que-sao-streams">O que são streams?</h3>
<hr />

<p>Em português, podemos entender stream como um fluxo de dados, algo que está “correndo” de um lugar para outro, como um rio. Esses fluxos são caminhos pelos quais a informação passa:</p>

<ul>
  <li>A informação pode entrar no programa (como quando a pessoa digita algo no teclado).</li>
  <li>A informação pode sair do programa (como quando o programa mostra alguma coisa na tela).</li>
  <li>A informação pode ser uma mensagem de erro, que também sai do programa, mas de um jeito separado.</li>
</ul>

<p>Esses caminhos já existem automaticamente quando você executa um programa Ruby no terminal. Por isso, chamamos eles de streams padrão.</p>

<p>Ruby possui três streams padrão.</p>

<h3 id="stdin-standard-input">STDIN: Standard Input (Em português: Entrada Padrão)</h3>
<hr />

<p>O STDIN é o fluxo de entrada, ou seja, por onde o programa recebe informações de fora. Na prática, quando você digita algo no teclado e aperta Enter, esse texto não vai “direto” para o Ruby. Ele passa pelo STDIN, que entrega esse texto ao programa.</p>

<p>Quando um comando para capturar informações é usado quem está trabalhando por trás dos panos é o STDIN.</p>

<h3 id="stdout-standard-output">STDOUT: Standard Output (Em português: Saída Padrão)</h3>
<hr />

<p>O STDOUT é o fluxo de saída normal. É por onde o programa envia para fora aquilo que ele quer mostrar à pessoa usuária. Por exemplo, quando você usa o comando <code class="text-white-50 text-light">puts</code> para exibir uma mensagem na tela, essa mensagem é enviada pelo STDOUT.</p>

<p>Quando escrevemos:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">puts</span> <span class="s2">"Olá, mundo!"</span>
</code></pre></div></div>

<p>O Ruby envia a mensagem para o STDOUT, que por sua vez exibe no terminal.</p>

<p>É como se o programa dissesse: “Terminal, aqui está a mensagem que quero mostrar.”</p>

<h3 id="stderr-standard-error">STDERR: Standard Error (Em português: Erro Padrão)</h3>
<hr />

<p>O STDERR é o fluxo de saída de erros. Ele é usado para enviar mensagens de erro ou avisos quando algo dá errado no programa. Por exemplo, se você tentar dividir um número por zero, o Ruby vai gerar um erro e enviar essa mensagem pelo STDERR.</p>

<p>O STDERR é muito parecido com o STDOUT: também envia mensagens para o terminal. A diferença é que o STDERR é usado especificamente para erros, enquanto o STDOUT é usado para mensagens normais do programa.</p>

<p><strong>Mas por que separar?</strong></p>

<p>Porque isso permite que o terminal trate erros e saídas comuns de formas diferentes. Por exemplo, você pode redirecionar as mensagens de erro para um arquivo separado, enquanto mantém as mensagens normais na tela.</p>

<h3 id="em-outras-palavras">Em outras palavras</h3>
<hr />

<p>Imagine que um programa é como uma conversa:</p>

<ul>
  <li><strong>Saída (output)</strong> é quando o programa fala com a pessoa.</li>
  <li><strong>Entrada (input)</strong> é quando a pessoa responde ao programa.</li>
</ul>

<p>O Ruby precisa de comandos específicos para isso, e é aí que entram os comandos de entrada e saída de dados.</p>

<h2 id="como-o-ruby-mostra-mensagens-o-comando-puts">Como o Ruby mostra mensagens: o comando puts</h2>
<hr />

<p>Já conhecemos o comando <code class="text-white-50 text-light">puts</code>, ele mostra um texto na tela e pula para a linha de baixo depois de escrever.</p>

<p>Por exemplo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">puts</span> <span class="s2">"Olá, mundo!"</span>
<span class="nb">puts</span> <span class="s2">"Bem-vindo ao Ruby!"</span>
</code></pre></div></div>

<p>No terminal teremos algo como:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="no">Olá</span><span class="p">,</span> <span class="n">mundo!</span>
<span class="no">Bem</span><span class="o">-</span><span class="n">vindo</span> <span class="n">ao</span> <span class="no">Ruby</span><span class="o">!</span>
</code></pre></div></div>

<p>Observe que cada <code class="text-white-50 text-light">puts</code> escreve uma linha e pula para a próxima ficando um texto embaixo do outro.</p>

<h3 id="por-que-ele-pula-linha-sozinho">Por que ele pula linha sozinho?</h3>
<hr />

<p>Porque é assim que ele foi projetado. O nome <code class="text-white-50 text-light">puts</code> vem de “put string” (colocar string), e ele sempre adiciona uma nova linha após a string que você quer mostrar.</p>

<h2 id="comando-print">Comando print</h2>
<hr />

<p>Outro comando que podemos usar para mostrar mensagens na tela é o <code class="text-white-50 text-light">print</code>. Ele funciona de forma semelhante ao <code class="text-white-50 text-light">puts</code>, mas com uma diferença importante: ele não pula para a linha de baixo depois de escrever.</p>

<p>Por exemplo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">print</span> <span class="s2">"Olá, mundo! "</span>
<span class="nb">print</span> <span class="s2">"Bem-vindo ao Ruby!"</span>
</code></pre></div></div>

<p>No terminal teremos algo como:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="no">Olá</span><span class="p">,</span> <span class="n">mundo!</span> <span class="no">Bem</span><span class="o">-</span><span class="n">vindo</span> <span class="n">ao</span> <span class="no">Ruby</span><span class="o">!</span>
</code></pre></div></div>

<p>Observe que o <code class="text-white-50 text-light">print</code> escreve tudo na mesma linha, sem pular para a próxima.</p>

<p>Isso é muito usado para perguntas, porque deixa o cursor na mesma linha do texto da pergunta, facilitando a leitura.</p>

<h3 id="quando-usar-puts-ou-print">Quando usar puts ou print?</h3>
<hr />

<ul>
  <li>Use <code class="text-white-50 text-light">puts</code> quando quiser que a mensagem seja exibida e pule para a próxima linha automaticamente.</li>
  <li>Use <code class="text-white-50 text-light">print</code> quando quiser que a mensagem seja exibida sem pular para a próxima linha, permitindo que o cursor fique na mesma linha.</li>
</ul>

<h2 id="como-o-ruby-recebe-informacoes-o-comando-gets">Como o Ruby recebe informações: o comando gets</h2>
<hr />

<p>Agora que já sabemos como mostrar mensagens, vamos aprender a ler algo digitado pela pessoa usuária. Para isso, usamos o comando <code class="text-white-50 text-light">gets</code>.</p>

<p>O <code class="text-white-50 text-light">gets</code> lê uma linha de texto que a pessoa digita no teclado e retorna esse texto para o programa. Geralmente, usamos o <code class="text-white-50 text-light">gets</code> junto com uma variável para armazenar o que foi digitado.</p>

<p>Ele:</p>

<ol>
  <li>espera a pessoa digitar alguma coisa</li>
  <li>lê o texto</li>
  <li>devolve esse texto para o programa</li>
  <li>sempre inclui a tecla <kbd>Enter</kbd> no final, isso vira um <code class="text-white-50 text-light">\n</code> (quebra de linha) no texto retornado.</li>
</ol>

<p>O que isso quer dizer? Que se a pessoa digitar <code class="text-white-50 text-light">"Louise"</code> e apertar <kbd>Enter</kbd>, o <code class="text-white-50 text-light">gets</code> vai guardar o conteúdo <code class="text-white-50 text-light">"Louise\n"</code> (com a quebra de linha no final).</p>

<p>Por que isso acontece? Porque o <kbd>Enter</kbd> é necessário para indicar que a pessoa terminou de digitar e quer enviar o texto para o programa e o <code class="text-white-50 text-light">gets</code> captura tudo que foi digitado, incluindo essa quebra de linha criada pelo <kbd>Enter</kbd>.</p>

<h3 id="como-resolver-isso">Como resolver isso?</h3>
<hr />

<p>Para remover a quebra de linha que o <code class="text-white-50 text-light">gets</code> adiciona no final do texto, usamos o método <code class="text-white-50 text-light">chomp</code>.</p>

<p><code class="text-white-50 text-light">chomp</code> é um método que “corta” a última parte do texto, que no caso é a quebra de linha.</p>

<p>Lembrando que métodos são ações que os objetos podem fazer, já vimos isso no artigo anterior sobre tipos de dados. Então nesse caso, o objeto é a string retornada pelo <code class="text-white-50 text-light">gets</code> e o método é o <code class="text-white-50 text-light">chomp</code> que vai ter a ação de “cortar” (remover) a quebra de linha do final.</p>

<p>Com o uso do <code class="text-white-50 text-light">chomp</code>, a informação guardada na variável pelo <code class="text-white-50 text-light">gets</code> não terá mais a quebra de linha no final, ou seja, será exatamente o que a pessoa digitou, sem o <code class="text-white-50 text-light">\n</code> no final.</p>

<p>Como usar o <code class="text-white-50 text-light">gets</code> com o <code class="text-white-50 text-light">chomp</code>?</p>

<p>Para responder a essa pergunta, vamos criar um pequeno programa que pergunta o nome da pessoa e depois exibe uma mensagem personalizada.</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">print</span> <span class="s2">"Qual é o seu nome? "</span>
<span class="n">nome</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span>
<span class="nb">puts</span> <span class="s2">"Olá, </span><span class="si">#{</span><span class="n">nome</span><span class="si">}</span><span class="s2">! Receba as boas-vindas ao Ruby!"</span>
</code></pre></div></div>

<p>O que foi feito aqui?</p>

<p>Fizemos o seguinte:</p>

<ol>
  <li>Usamos o <code class="text-white-50 text-light">print</code> para perguntar o nome da pessoa, deixando o cursor na mesma linha.</li>
  <li>Usamos o <code class="text-white-50 text-light">gets.chomp</code> para ler o que a pessoa digitou e remover a quebra de linha.</li>
  <li>Armazenamos o nome digitado na variável <code class="text-white-50 text-light">nome</code>.</li>
  <li>Usamos o <code class="text-white-50 text-light">puts</code> para exibir uma mensagem personalizada usando o nome que foi digitado.</li>
</ol>

<p>Se você se lembrar da definição de método que foi apresentada no artigo <a href="https://pcdnaescola.com.br/introducao-a-programacao-tipos-de-dados-parte-ii/#o-que-e-um-metodo" target="_blank">Introdução à Programação: Tipos de Dados - Parte II</a>, vai se lembrar que a forma de usar um método é:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">objeto</span><span class="p">.</span><span class="nf">nome_do_metodo</span><span class="p">(</span><span class="n">argumentos_opcionais</span><span class="p">)</span>
</code></pre></div></div>

<p>Aqui, <code class="text-white-50 text-light">objeto</code> é o objeto que você quer que faça algo, <code class="text-white-50 text-light">nome_do_metodo</code> é o nome da ação que você quer que ele faça, e <code class="text-white-50 text-light">argumentos_opcionais</code> são informações extras que você pode passar para o método, se for preciso.</p>

<p>No caso do <code class="text-white-50 text-light">chomp</code>, o objeto é a string retornada pelo <code class="text-white-50 text-light">gets</code> (o texto que a pessoa digitou), o nome do método é <code class="text-white-50 text-light">chomp</code> e não precisamos passar nenhum argumento extra.</p>

<p>Por isso escrevemos:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span>
</code></pre></div></div>

<p>Isso significa: “Pegue o texto que a pessoa digitou (o objeto retornado pelo <code class="text-white-50 text-light">gets</code>) e aplique o método <code class="text-white-50 text-light">chomp</code> para remover a quebra de linha no final.”</p>

<p>E é assim que usamos o <code class="text-white-50 text-light">gets</code> junto com o <code class="text-white-50 text-light">chomp</code> para ler informações do usuário de forma limpa e sem quebras de linha indesejadas.</p>

<h2 id="dica-a-partir-de-agora-crie-seus-programas">Dica: a partir de agora crie seus programas</h2>
<hr />

<p>Até aqui muito do que estava sendo apresentado poderia ser testado diretamente no console interativo do Ruby (IRB).</p>

<p>Não é que isso não seja mais possível, mas a partir de agora, para que você possa praticar melhor e criar programas mais completos, é interessante que você comece a criar arquivos <code class="text-white-50 text-light">.rb</code> com seus códigos.</p>

<p>No artigo <a href="https://pcdnaescola.com.br/introducao-a-programacao-ola-mundo-em-ruby/#criando-uma-pasta-para-o-projeto" target="_blank">Introdução à Programação: Olá Mundo em Ruby</a> você encontra um passo a passo de como criar uma pasta para o seu projeto e criar arquivos <code class="text-white-50 text-light">.rb</code> para colocar seus códigos.</p>

<p>Dessa forma você poderá revisitar seus códigos sempre que quiser, além de criar uma linha do tempo dos seus aprendizados e da sua evolução na programação.</p>

<p>O IRB é ótimo para testes rápidos, mas criar arquivos <code class="text-white-50 text-light">.rb</code> vai te ajudar a desenvolver suas habilidades de programação de forma mais estruturada.</p>

<h2 id="criando-um-programa-com-o-conhecimento-aprendido-ate-aqui">Criando um programa com o conhecimento aprendido até aqui</h2>
<hr />

<p>Antes de avançar ainda mais, vamos criar um programa para trabalhar todos os conceitos que aprendemos até aqui.</p>

<p>Conceitos esses que estão sendo apresentados desde os artigos anteriores como:</p>

<ul>
  <li><a href="https://pcdnaescola.com.br/introducao-a-programacao-ola-mundo-em-ruby/" target="_blank">Introdução à Programação: Olá Mundo em Ruby</a></li>
  <li><a href="https://pcdnaescola.com.br/introducao-a-programacao-conhecendo-e-usando-o-irb/" target="_blank">Introdução à Programação: Conhecendo e Usando o IRB</a></li>
  <li><a href="https://pcdnaescola.com.br/introducao-a-programacao-tipos-de-dados/" target="_blank">Introdução à Programação: Tipos de Dados</a></li>
  <li><a href="https://pcdnaescola.com.br/introducao-a-programacao-tipos-de-dados-parte-ii/" target="_blank">Introdução à Programação: Tipos de Dados - Parte II</a></li>
</ul>

<p>O programa que vamos criar deve:</p>

<ol>
  <li>Perguntar o nome do estudante</li>
  <li>Perguntar a turma do estudante</li>
  <li>Perguntar a disciplina que está sendo avaliada</li>
  <li>Perguntar a primeira nota</li>
  <li>Perguntar a segunda nota</li>
  <li>Perguntar a terceira nota</li>
  <li>Calcular a média das notas</li>
  <li>Exibir uma mensagem personalizada com o nome, turma, disciplina, média do estudante e se ele foi aprovado ou reprovado (considerando a média mínima para aprovação como 7.0)</li>
</ol>

<p>Uma coisa boa é: Antes de começar a sair digitando o código, faça um rascunho do que você quer fazer, isso ajuda a organizar suas ideias e evita que você se perca no meio do caminho.</p>

<p>Vamos criar o arquivo <code class="text-white-50 text-light">01-calcula-media.rb</code> e colocar o seguinte código:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">nome</span> <span class="o">=</span> <span class="s2">""</span>
<span class="n">turma</span> <span class="o">=</span> <span class="s2">""</span>
<span class="n">disciplina</span> <span class="o">=</span> <span class="s2">""</span>
<span class="n">nota1</span> <span class="o">=</span> <span class="mf">0.0</span>
<span class="n">nota2</span> <span class="o">=</span> <span class="mf">0.0</span>
<span class="n">nota3</span> <span class="o">=</span> <span class="mf">0.0</span>
<span class="n">media</span> <span class="o">=</span> <span class="mf">0.0</span>
<span class="n">aprovado</span> <span class="o">=</span> <span class="kp">false</span>

<span class="nb">print</span> <span class="s2">"Qual é seu nome? "</span>
<span class="n">nome</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span>

<span class="nb">print</span> <span class="s2">"Qual é a sua turma? "</span>
<span class="n">turma</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span>

<span class="nb">print</span> <span class="s2">"Qual disciplina está sendo avaliada? "</span>
<span class="n">disciplina</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span>

<span class="nb">print</span> <span class="s2">"Digite a primeira nota: "</span>
<span class="n">nota1</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="nb">print</span> <span class="s2">"Digite a segunda nota: "</span>
<span class="n">nota2</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="nb">print</span> <span class="s2">"Digite a terceira nota: "</span>
<span class="n">nota3</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="n">media</span> <span class="o">=</span> <span class="p">(</span><span class="n">nota1</span> <span class="o">+</span> <span class="n">nota2</span> <span class="o">+</span> <span class="n">nota3</span><span class="p">)</span> <span class="o">/</span> <span class="mi">3</span>

<span class="n">aprovado</span> <span class="o">=</span>  <span class="n">media</span> <span class="o">&gt;=</span> <span class="mf">7.0</span>

<span class="nb">puts</span> <span class="s2">"Olá, </span><span class="si">#{</span><span class="n">nome</span><span class="si">}</span><span class="s2"> da turma </span><span class="si">#{</span><span class="n">turma</span><span class="si">}</span><span class="s2">!"</span>
<span class="nb">puts</span> <span class="s2">"A média final da disciplina </span><span class="si">#{</span><span class="n">disciplina</span><span class="si">}</span><span class="s2"> é </span><span class="si">#{</span><span class="n">media</span><span class="p">.</span><span class="nf">round</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="s2">."</span>

<span class="nb">puts</span> <span class="s2">"Sua situação é: </span><span class="si">#{</span><span class="n">aprovado</span> <span class="p">?</span> <span class="s1">'Aprovado'</span> <span class="p">:</span> <span class="s1">'Reprovado'</span><span class="si">}</span><span class="s2">."</span>
</code></pre></div></div>

<p>Depois salve e execute o programa no terminal com o comando:</p>

<div class="language-bash bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ruby 01-calcula-media.rb
</code></pre></div></div>

<h3 id="explicando-o-codigo">Explicando o código</h3>
<hr />

<p>Primeiramente declaramos todas as variáveis que vamos usar no programa e inicializamos elas com valores padrão.</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">nome</span> <span class="o">=</span> <span class="s2">""</span>
<span class="n">turma</span> <span class="o">=</span> <span class="s2">""</span>
<span class="n">disciplina</span> <span class="o">=</span> <span class="s2">""</span>
<span class="n">nota1</span> <span class="o">=</span> <span class="mf">0.0</span>
<span class="n">nota2</span> <span class="o">=</span> <span class="mf">0.0</span>
<span class="n">nota3</span> <span class="o">=</span> <span class="mf">0.0</span>
<span class="n">media</span> <span class="o">=</span> <span class="mf">0.0</span>
<span class="n">aprovado</span> <span class="o">=</span> <span class="kp">false</span>
</code></pre></div></div>

<p><strong>O que acontece aqui?</strong></p>

<ul>
  <li><code class="text-white-50 text-light">nome = ""</code>: Inicializa a variável nome como uma string vazia.</li>
  <li><code class="text-white-50 text-light">turma = ""</code>: Inicializa a variável turma como uma string vazia.</li>
  <li><code class="text-white-50 text-light">disciplina = ""</code>: Inicializa a variável disciplina como uma string vazia.</li>
  <li><code class="text-white-50 text-light">nota1, nota2, nota3 = 0.0</code>: Inicializa as variáveis de notas como números de ponto flutuante (decimais) com valor 0.</li>
  <li><code class="text-white-50 text-light">media = 0.0</code>: Inicializa a variável media como um número de ponto flutuante com valor 0.</li>
  <li><code class="text-white-50 text-light">aprovado = false</code>: Inicializa a variável aprovado como um valor booleano falso.</li>
</ul>

<p>Depois vem as entradas de dados (input) onde perguntamos as informações para a pessoa usuária e armazenamos nas variáveis correspondentes.</p>

<p>Perguntando o nome da pessoa:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">print</span> <span class="s2">"Qual é seu nome? "</span>
<span class="n">nome</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span>
</code></pre></div></div>

<p><strong>O que acontece aqui?</strong></p>

<ul>
  <li><code class="text-white-50 text-light">print "Qual é seu nome? "</code>: Exibe a pergunta na tela sem pular para a próxima linha. PS. ainda deixamos um espaço depois da interrogação para a resposta da pessoa não ficar grudada na pergunta.</li>
  <li><code class="text-white-50 text-light">nome = gets.chomp</code>: Lê a resposta digitada pela pessoa, remove a quebra de linha com <code class="text-white-50 text-light">chomp</code> e armazena o valor na variável <code class="text-white-50 text-light">nome</code>.</li>
</ul>

<p>Perguntando a turma da pessoa:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">print</span> <span class="s2">"Qual é a sua turma? "</span>
<span class="n">turma</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span>
</code></pre></div></div>

<p>Aqui acontece a mesma coisa que acontece na pergunta do nome, só que agora a resposta é armazenada na variável <code class="text-white-50 text-light">turma</code>.</p>

<p>Perguntando a disciplina que está sendo avaliada:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">print</span> <span class="s2">"Qual disciplina está sendo avaliada? "</span>
<span class="n">disciplina</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span>
</code></pre></div></div>

<p>Aqui acontece o mesmo que acontece nas perguntas anteriores, só que agora a resposta é armazenada na variável <code class="text-white-50 text-light">disciplina</code>.</p>

<h3 id="conversao-segura-de-tipo">Conversão segura de tipo</h3>
<hr />

<p>Depois passamos a perguntar as notas e a executar um processo chamado conversão segura de tipo. Isso porque o <code class="text-white-50 text-light">gets.chomp</code> sempre retorna uma string (texto), e como as notas são números decimais, precisamos converter essa string para o tipo numérico.</p>

<p>Mesmo que a pessoa digite:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="mf">7.5</span>
</code></pre></div></div>

<p>O Ruby vai entender isso como:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s2">"7.5"</span> <span class="p">(</span><span class="n">texto</span><span class="p">)</span>
</code></pre></div></div>

<p>E texto não pode ser somado nem dividido, então precisamos converter esse texto para um número de verdade.</p>

<p>Poderiamos usar o <code class="text-white-50 text-light">to_f</code> para fazer essa conversão, como foi mostrado no tópico de conversão entre tipos de dados no artigo <a href="https://pcdnaescola.com.br/introducao-a-programacao-tipos-de-dados-parte-ii/#conversao-entre-tipos-de-dados" target="_blank">Introdução à Programação: Tipos de Dados - Parte II</a>? Sim, poderiamos.</p>

<p><code class="text-white-50 text-light">.to_f</code> é uma forma rápida de converter um texto para float (número decimal), assim como existem o <code class="text-white-50 text-light">.to_i</code> para converter para inteiro. Mas, <code class="text-white-50 text-light">to_f</code> não é a melhor opção para esse caso. Ele tem um comportamento perigoso quando a pessoa digita algo errado.</p>

<p>Imagine que a pessoa digita texto ao invés de número, como por exemplo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s2">"abc"</span><span class="p">.</span><span class="nf">to_f</span>   <span class="c1"># vira 0.0</span>
<span class="s2">"banana"</span><span class="p">.</span><span class="nf">to_f</span> <span class="c1"># vira 0.0</span>
<span class="s2">"dez"</span><span class="p">.</span><span class="nf">to_f</span>    <span class="c1"># vira 0.0</span>
</code></pre></div></div>

<p>Ou seja, <code class="text-white-50 text-light">to_f</code> não gera um erro quando a conversão falha porque a pessoa digitou algo inválido, ele simplesmente converte tudo que é inválido para <code class="text-white-50 text-light">0.0</code>.</p>

<p>Se a pessoa digitar errado um texto, o programa não vai avisar, o programa não vai ser interrompido, ele vai continuar funcionando normalmente, mas a média calculada pode ficar errada porque uma ou mais notas podem ter sido convertidas para <code class="text-white-50 text-light">0.0</code>.</p>

<h3 id="continuando-a-explicacao-do-codigo">Continuando a explicação do código</h3>
<hr />

<p>Para evitar esse problema, usamos a função <code class="text-white-50 text-light">Float()</code> para fazer a conversão segura de tipo. Ela tenta converter o texto para número decimal, mas se a conversão falhar (porque a pessoa digitou algo inválido), ela gera um erro e interrompe o programa, avisando que algo está errado.</p>

<p>Por isso perguntamos as notas assim:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">print</span> <span class="s2">"Digite a primeira nota: "</span>
<span class="n">nota1</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="nb">print</span> <span class="s2">"Digite a segunda nota: "</span>
<span class="n">nota2</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>

<span class="nb">print</span> <span class="s2">"Digite a terceira nota: "</span>
<span class="n">nota3</span> <span class="o">=</span> <span class="no">Float</span><span class="p">(</span><span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">)</span>
</code></pre></div></div>

<p>Mostramos a pergunta com o <code class="text-white-50 text-light">print</code>, lemos a resposta com o <code class="text-white-50 text-light">gets.chomp</code> e convertemos para número decimal com o <code class="text-white-50 text-light">Float()</code>, armazenando o resultado nas variáveis <code class="text-white-50 text-light">nota1</code>, <code class="text-white-50 text-light">nota2</code> e <code class="text-white-50 text-light">nota3</code>.</p>

<p>Depois calculamos a média das notas:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">media</span> <span class="o">=</span> <span class="p">(</span><span class="n">nota1</span> <span class="o">+</span> <span class="n">nota2</span> <span class="o">+</span> <span class="n">nota3</span><span class="p">)</span> <span class="o">/</span> <span class="mi">3</span>
</code></pre></div></div>

<p>Aqui somamos as três notas e dividimos por 3 para obter a média, armazenando o resultado na variável <code class="text-white-50 text-light">media</code>.</p>

<p>Como na Matemática, a média é a soma dos valores dividida pela quantidade de valores e usamos parênteses para garantir que a soma seja feita antes da divisão.</p>

<p>Tudo em ponto flutuante (números decimais).</p>

<p>Depois verificamos se a pessoa foi aprovada ou reprovada:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">aprovado</span> <span class="o">=</span> <span class="n">media</span> <span class="o">&gt;=</span> <span class="mf">7.0</span>
</code></pre></div></div>

<p>Fazemos uma comparação para verificar se a média é maior ou igual a 7.0. O resultado dessa comparação (verdadeiro ou falso) é armazenado na variável <code class="text-white-50 text-light">aprovado</code>.</p>

<p>Por fim exibimos a mensagem personalizada com todas as informações:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">puts</span> <span class="s2">"Olá, </span><span class="si">#{</span><span class="n">nome</span><span class="si">}</span><span class="s2"> da turma </span><span class="si">#{</span><span class="n">turma</span><span class="si">}</span><span class="s2">!"</span>
</code></pre></div></div>

<p>Aqui <code class="text-white-50 text-light">#{nome}</code> e <code class="text-white-50 text-light">#{turma}</code> são interpolação de strings (ou seja, inserir o valor da variável dentro do texto) e nesse caso exibimos o nome e a turma da pessoa.</p>

<p><code class="text-white-50 text-light">puts</code> exibe a mensagem na tela e pula para a próxima linha.</p>

<p>Depois exibimos a média final da disciplina com arredondamento para 2 casas decimais:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">puts</span> <span class="s2">"A média final da disciplina </span><span class="si">#{</span><span class="n">disciplina</span><span class="si">}</span><span class="s2"> é </span><span class="si">#{</span><span class="n">media</span><span class="p">.</span><span class="nf">round</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="s2">."</span>
</code></pre></div></div>

<p><code class="text-white-50 text-light">media.round(2)</code> arredonda o valor da média para 2 casas decimais antes de exibir. Lembrando que <code class="text-white-50 text-light">round()</code> é um método que pode ser usado em números para arredondar o valor. O número dentro dos parênteses indica quantas casas decimais queremos manter.</p>

<p>Finalmente exibimos a situação de aprovação ou reprovação:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">puts</span> <span class="s2">"Sua situação é: </span><span class="si">#{</span><span class="n">aprovado</span> <span class="p">?</span> <span class="s1">'Aprovado'</span> <span class="p">:</span> <span class="s1">'Reprovado'</span><span class="si">}</span><span class="s2">."</span>
</code></pre></div></div>

<p>O que isso significa?</p>

<p>Aqui estamos usando um operador ternário para decidir o que exibir com base no valor da variável <code class="text-white-50 text-light">aprovado</code>.</p>

<p>Ou seja, se <code class="text-white-50 text-light">aprovado</code> for verdadeiro (<code class="text-white-50 text-light">true</code>), a mensagem exibida será “Aprovado”. Se for falso (<code class="text-white-50 text-light">false</code>), a mensagem exibida será “Reprovado”.</p>

<p><code class="text-white-50 text-light">#{aprovado ? 'Aprovado' : 'Reprovado'}</code> quer dizer: “Se a variável <code class="text-white-50 text-light">aprovado</code> for verdadeira, exiba ‘Aprovado’, caso contrário, exiba ‘Reprovado’.”</p>

<p>O ? é um operador ternário. Ternário significa que ele trabalha com três partes: uma condição, o que fazer se a condição for verdadeira, e o que fazer se a condição for falsa.</p>

<p>Observe bem:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#{aprovado ? 'Aprovado' : 'Reprovado'}</span>
</code></pre></div></div>

<p>Vamos parte por parte:</p>

<ul>
  <li><code class="text-white-50 text-light">aprovado</code>: é a condição que estamos verificando (se a pessoa foi aprovada ou não).</li>
  <li><code class="text-white-50 text-light">?</code>: indica o começo do operador ternário que é usado para fazer uma escolha baseada na condição (se aprovado for verdadeiro).</li>
  <li><code class="text-white-50 text-light">'Aprovado'</code>: é o valor que será retornado se a condição for verdadeira.</li>
  <li><code class="text-white-50 text-light">:</code>: separa o valor verdadeiro do valor falso.</li>
  <li><code class="text-white-50 text-light">'Reprovado'</code>: é o valor que será retornado se a condição for falsa.</li>
  <li>O resultado final é inserido na string que será exibida pelo <code class="text-white-50 text-light">puts</code>.</li>
</ul>

<p>Então se a pessoa tiver uma média maior ou igual a 7.0, a variável <code class="text-white-50 text-light">aprovado</code> será verdadeira, e a mensagem exibida será “Aprovado”. Caso contrário, a mensagem exibida será “Reprovado”.</p>

<p>É este o fluxo completo do programa, desde a entrada de dados até a saída de informações, passando pelo processamento dos dados (cálculo da média e verificação de aprovação).</p>

<h3 id="programa-em-execucao">Programa em execução</h3>
<hr />

<p>Aqui está um exemplo de como o programa se comporta quando executado:</p>

<div class="language-bash bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code>parallels@ubuntu:~/curso-ruby<span class="nv">$ </span>ruby 01-calcula-media.rb
Qual é seu nome? Louise
Qual é a sua turma? 7º B
Qual disciplina está sendo avaliada? Matemática
Digite a primeira nota: 5.3
Digite a segunda nota: 2.6
Digite a terceira nota: 8.1
Olá, Louise da turma 7º B!
A média final da disciplina Matemática é 5.33.
Sua situação é: Reprovado.
parallels@ubuntu:~/curso-ruby<span class="nv">$ </span>
</code></pre></div></div>

<p>Agora vamos inserir uma nota errada só para ver a conversão segura de tipo em ação:</p>

<div class="language-bash bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code>parallels@ubuntu:~/curso-ruby<span class="nv">$ </span>ruby 01-calcula-media.rb
Qual é seu nome? Louise
Qual é a sua turma? 7º B
Qual disciplina está sendo avaliada? Matemática
Digite a primeira nota: 9.7
Digite a segunda nota: 2.1
Digite a terceira nota: abdcefg
&lt;internal:kernel&gt;:214:in <span class="sb">`</span>Float<span class="s1">': invalid value for Float(): "abdcefg" (ArgumentError)
	from 01-calcula-media.rb:26:in `&lt;main&gt;'</span>
parallels@ubuntu:~/curso-ruby<span class="nv">$ </span>
</code></pre></div></div>

<p>Aqui a pessoa digitou <code class="text-white-50 text-light">abdcefg</code> como terceira nota, que não é um número válido. O programa gerou um erro e foi interrompido, avisando que o valor é inválido para conversão para Float. Haverá um momento em nossa série de artigos onde aprenderemos a lidar melhor com erros, mas por enquanto é importante entender que esse comportamento é desejado para evitar cálculos errados.</p>

<p>Agora vamos testar a condição de aprovação:</p>

<div class="language-bash bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code>parallels@ubuntu:~/curso-ruby<span class="nv">$ </span>ruby 01-calcula-media.rb
Qual é seu nome? Louise
Qual é a sua turma? 7º B
Qual disciplina está sendo avaliada? Matemática
Digite a primeira nota: 7.5
Digite a segunda nota: 8.1
Digite a terceira nota: 9.4
Olá, Louise da turma 7º B!
A média final da disciplina Matemática é 8.33.
Sua situação é: Aprovado.
parallels@ubuntu:~/curso-ruby<span class="nv">$ </span>
</code></pre></div></div>

<p>Aqui a pessoa teve uma média maior que 7.0, então a mensagem exibida indica que ela foi aprovada.</p>

<h2 id="resumo">Resumo</h2>
<hr />

<p>Neste artigo aprendemos sobre os conceitos de entrada e saída de dados em Ruby, entendendo como o programa interage com o usuário através dos comandos <code class="text-white-50 text-light">puts</code>, <code class="text-white-50 text-light">print</code> e <code class="text-white-50 text-light">gets</code>.</p>

<p>Também exploramos os streams padrão do Ruby: STDIN, STDOUT e STDERR, que são os canais pelos quais o programa recebe e envia informações.</p>

<p>Além disso, criamos um programa completo que pergunta informações ao usuário, calcula a média de notas e exibe uma mensagem personalizada com o resultado, aplicando conceitos como interpolação de strings, conversão segura de tipos e operadores ternários.</p>

<p>Claro que muitos desses conceitos serão revisitados e aprofundados em artigos futuros, mas o importante é conhecer o básico para começar a criar programas.</p>

<p>Você deve ter observado que foram apresentados conceitos que não foram falados nos artigos anteriores, como o operador ternário (<code class="text-white-50 text-light">?</code> e <code class="text-white-50 text-light">:</code>) e a conversão segura de tipos com a função <code class="text-white-50 text-light">Float()</code>. Eles foram apresentados somente no código na hora da construção do programa.</p>

<p>Por que isso foi feito assim? Não teria sido melhor seguir pelo caminho conhecido e usar recursos como o <code class="text-white-50 text-light">to_f</code> por exemplo? Não seria melhor, mas seria confortável e são coisas diferentes.</p>

<p>Em programação é muito comum as pessoas seguirem caminhos lineares (linear é quando tudo é apresentado de forma sequencial, um passo após o outro, sem grandes saltos ou desvios). Isso gera uma sensação de segurança, conforto e controle, a pessoa sente que está dominando o assunto.</p>

<p>No geral isso é muito bom, principalmente se o curso ou tutorial for pago, porque não gera frustrações e a pessoa sente que está evoluindo. Só que no longo prazo isso tem um efeito negativo do qual eu fui e sou vítima: o medo de errar.</p>

<p>Seguimos tantos caminhos lineares que quando nos deparamos com algo novo, diferente ou que foge do padrão, sentimos medo de errar, medo de não entender, medo de não conseguir seguir a trilha. Isso é uma verdadeira porcaria, porque programação é sobre resolver problemas, e para resolver problemas precisamos explorar o desconhecido, precisamos errar, precisamos experimentar.</p>

<p>Eu acredito que ninguém aprende a programar conhecendo tudo primeiro para depois tentar fazer algo. Aprendemos a programar fazendo, errando, tentando de novo, explorando o desconhecido.</p>

<p>É por isso que eu escolhi apresentar alguns conceitos novos no meio do caminho, para que você comece a se acostumar com a ideia de que programação é sobre explorar o desconhecido, é sobre errar e tentar de novo.</p>

<p>A quebra da previsibilidade (linearidade) é dolorosa, desconfortável e dá vontade de desistir, eu sei disso porque já passei por isso muitas vezes. Mas é um passo necessário para quem quer aprender a programar.</p>

<p>Quando aprendemos um idioma novo, não começamos decorando todas as regras gramaticais, conjugando todos os verbos e aprendendo todas as palavras. Começamos com o básico, erramos muito, falamos errado, escrevemos errado, mas aos poucos vamos pegando o jeito.</p>

<p>Como? PRATICANDO. Vamos praticando e conhecendo novas palavras e regras aos poucos, conforme precisamos delas.</p>

<p>É nisso que eu acredito, na prática, na experimentação, no erro como parte do processo de aprendizado. Então eu vou sim inserir coisas novas no meio do caminho, para que você comece a se acostumar com isso.</p>

<p>Nos próximos artigos vamos praticar ainda mais, adicionando novos conceitos, fazendo perguntas e criando programas cada vez mais interessantes.</p>]]></content><author><name>Louise Suelen</name></author><category term="Programação" /><category term="programação" /><category term="tecnologia" /><summary type="html"><![CDATA[Neste artigo vamos conhecer as maneiras que existem para inserir e capturar dados em Ruby usando comandos como puts, gets e outros conceitos que já conhecemos.]]></summary></entry><entry xml:lang="pt-BR"><title type="html">Introdução à Programação: Tipos de Dados - Parte II</title><link href="https://pcdnaescola.com.br/introducao-a-programacao-tipos-de-dados-parte-ii/" rel="alternate" type="text/html" title="Introdução à Programação: Tipos de Dados - Parte II" /><published>2025-09-17T13:00:00+00:00</published><updated>2025-09-17T13:00:00+00:00</updated><id>https://pcdnaescola.com.br/introducao-a-programacao-tipos-de-dados-parte-ii</id><content type="html" xml:base="https://pcdnaescola.com.br/introducao-a-programacao-tipos-de-dados-parte-ii/"><![CDATA[<div class="text-center">
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://ifrnead.github.io/rubynapratica/assets/images/tipos-dados.png" alt="" loading="lazy" aria-hidden="true" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

</div>

<h2 id="apresentacao">Apresentação</h2>
<hr />

<p>Até aqui já sabemos que:</p>

<ul>
  <li>
    <p><strong>Um programa</strong>: é um grupo de comandos que o computador segue um por um.</p>
  </li>
  <li>
    <p><strong>Linguagem de programação</strong>: é o jeito que nós usamos para escrever esses comandos. Ruby é um exemplo de linguagem de programação.</p>
  </li>
  <li>
    <p><strong>Código Ruby</strong>: quando escrevemos um código Ruby, estamos mostrando para o computador o que ele deve fazer com informações ou dados.</p>
  </li>
</ul>

<p>Um dado é qualquer coisa que o programa usa: pode ser um número, uma palavra, uma lista de itens, ou até uma resposta de “sim ou não”.</p>

<p>No Ruby, cada dado tem um tipo específico para armazenar e manipular essas informações corretamente mostrando ao computador o que é cada dado.</p>

<p>Exemplo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">idade</span> <span class="o">=</span> <span class="mi">30</span> 
<span class="n">nome</span>  <span class="o">=</span> <span class="s2">"Ana"</span>
</code></pre></div></div>

<p>Aqui:</p>

<ul>
  <li><strong>idade</strong> é um número inteiro (Integer) que guarda o dado numérico 30.</li>
  <li><strong>nome</strong> é um texto (String) que guarda a palavra “Ana”.</li>
</ul>

<p>Agora que recapitulamos os conceitos básicos, é importante também entender algumas palavras que vamos usar em todos os exemplos como: objeto, classe, instância e método, além do conceito de variável que já foi apresentado no artigo anterior. Essas definições vão ajudar a entender melhor o conteúdo.</p>

<p>Você não precisa aprender tudo sobre essas definições agora, mas é importante entender o básico para conseguir acompanhar quando falarmos dos tipos de dados de um jeito mais detalhado.</p>

<p>Dito isso, vamos às definições.</p>

<h2 id="definicoes-importantes">Definições Importantes</h2>
<hr />

<p>Vamos falar sobre:</p>

<ul>
  <li>Objetos</li>
  <li>Classes</li>
  <li>Instâncias</li>
  <li>Métodos</li>
  <li>Variáveis</li>
</ul>

<h3 id="o-que-e-um-objeto">O que é um objeto?</h3>
<hr />

<p>Em Ruby, tudo é objeto. Isso significa que cada pedaço de informação que você usa no seu programa é tratado como um objeto.</p>

<p>Um objeto é algo que o programa consegue usar, como um número, uma palavra, uma lista ou uma data, por exemplo. Cada objeto guarda dados e permite que a pessoa programadora faça tarefas com ele. Por exemplo, você pode ter um objeto que representa um número, e esse objeto pode fazer coisas como somar, subtrair ou comparar (se é maior, menor ou igual) a outros números.</p>

<h3 id="o-que-e-uma-classe">O que é uma classe?</h3>
<hr />

<p>A classe funciona como um modelo para criar objetos. Ela diz que tipo de coisa o objeto é, quais dados ele pode guardar e o que ele pode fazer.</p>

<p>Alguns exemplos de classes em Ruby são:</p>

<ul>
  <li><strong>Integer</strong>: classe dos números inteiros.</li>
  <li><strong>Float</strong>: classe dos números com ponto decimal (3.14).</li>
  <li><strong>String</strong>: classe dos textos.</li>
  <li><strong>Array</strong>: classe das listas.</li>
  <li><strong>Hash</strong>: classe das tabelas de chave/valor (como {nome: “Ana”, idade: 30}).</li>
</ul>

<p>Então na prática quando dizemos “tipo de dado”, estamos falando da classe, ou da forma, que faz esse objeto ser o que ele é. Por exemplo: Quando dizemos “tipo Integer”, estamos falando de um objeto criado pela classe Integer. Só de saber isso, já conseguimos imaginar que esse objeto vai guardar um número inteiro e que ele pode fazer operações matemáticas.</p>

<p>Ou seja, a classe define o que o objeto pode fazer e como ele se comporta, como um molde que cria objetos com características e comportamentos específicos. Assim como usamos moldes de “coelhinhos” para fazer vários coelhinhos de chocolate, usamos classes para criar vários objetos com as mesmas características.</p>

<blockquote class="bg-dark text-light rounded shadow-lg p-4 my-5 border-start border-4 border-primary">
  <p class="lead fst-italic lh-lg">Os tipos de dados nesse contexto são classes que definem como os objetos se comportam e o que eles podem fazer no programa em Ruby.</p>
  <footer class="text-light"><a href="https://ruby-doc.org/3.4.1/Class.html?utm_source=chatgpt.com" target="_blank" rel="noopener noreferrer">Documentação Ruby - Classe</a></footer>
</blockquote>

<p>Por exemplo:</p>

<ul>
  <li>Quando criamos um número inteiro, estamos criando um objeto da classe Integer.
    <ul>
      <li>Esse objeto pode fazer coisas como somar, subtrair, multiplicar e dividir.</li>
    </ul>
  </li>
  <li>Quando criamos um texto, estamos criando um objeto da classe String.
    <ul>
      <li>Esse objeto pode fazer coisas como juntar textos, contar letras e transformar tudo em maiúsculas ou minúsculas.</li>
    </ul>
  </li>
  <li>Quando criamos uma lista, estamos criando um objeto da classe Array.
    <ul>
      <li>Esse objeto pode fazer coisas como adicionar itens, remover itens e ordenar os itens.</li>
    </ul>
  </li>
</ul>

<p>E assim por diante.</p>

<h3 id="o-que-e-uma-instancia">O que é uma instância?</h3>
<hr />

<p>Uma instância é um objeto real que foi criado a partir de uma classe. Por exemplo, quando você cria um número inteiro como 5, você está criando uma instância da classe Integer.</p>

<p>Exemplos:</p>

<ul>
  <li>42 é uma instância (um objeto específico) da classe Integer.</li>
  <li>“Olá, mundo!” é uma instância da classe String.</li>
</ul>

<p>Isso pode ser testado no IRB usando um recurso chamado <code class="text-white-50 text-light">.class</code> que mostra a classe (tipo de dado), do objeto.</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">puts</span> <span class="mi">42</span><span class="p">.</span><span class="nf">class</span>
<span class="nb">puts</span> <span class="s2">"Olá, mundo!"</span><span class="p">.</span><span class="nf">class</span>
<span class="nb">puts</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">].</span><span class="nf">class</span>
</code></pre></div></div>

<p>A saída será:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="no">Integer</span>
<span class="no">String</span>
<span class="no">Array</span>
</code></pre></div></div>

<p><strong>Dica:</strong> Tente você mesmo no IRB! Experimente criar diferentes tipos de dados e use o <code class="text-white-50 text-light">.class</code> para ver a classe de cada um.</p>

<h3 id="o-que-e-um-metodo">O que é um método?</h3>
<hr />

<p>Um método é uma ação (uma tarefa) que podemos pedir para o objeto executar. Cada classe tem seus próprios métodos que dizem o que os objetos daquela classe podem fazer.</p>

<p>A estrutura básica é assim:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">objeto</span><span class="p">.</span><span class="nf">nome_do_metodo</span><span class="p">(</span><span class="n">argumentos_opcionais</span><span class="p">)</span>
</code></pre></div></div>

<p>Aqui, <code class="text-white-50 text-light">objeto</code> é o objeto que você quer que faça algo, <code class="text-white-50 text-light">nome_do_metodo</code> é o nome da ação que você quer que ele faça, e <code class="text-white-50 text-light">argumentos_opcionais</code> são informações extras que você pode passar para o método, se for preciso.</p>

<p>Vamos lembrar disso o tempo todo: método = ação de um objeto.</p>

<p>Exemplo de método:</p>

<p>Para um objeto da classe String (texto), temos o método <code class="text-white-50 text-light">upcase</code> que transforma todas as letras em maiúsculas:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">texto</span> <span class="o">=</span> <span class="s2">"olá"</span>
<span class="nb">puts</span> <span class="n">texto</span><span class="p">.</span><span class="nf">upcase</span>
</code></pre></div></div>

<p>A saída será:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="no">OLÁ</span>
</code></pre></div></div>

<p>De novo: <strong>método = ação de um objeto.</strong></p>

<p>Se nós fossemos um objeto, ações como se comunicar, comer e dormir seriam nossos métodos!</p>

<h3 id="o-que-e-uma-variavel">O que é uma variável?</h3>
<hr />

<p>Já foi dito no artigo anterior que variáveis são como “caixinhas” onde colocamos os dados que queremos usar. Elas têm nomes que usamos para lembrar o que está dentro delas.</p>

<p>Exemplo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">nome</span> <span class="o">=</span> <span class="s2">"João"</span>
<span class="n">idade</span> <span class="o">=</span> <span class="mi">25</span>
</code></pre></div></div>

<p>Aqui, <code class="text-white-50 text-light">nome</code> é uma variável que guarda o texto “João”, e <code class="text-white-50 text-light">idade</code> é uma variável que guarda o número 25. Ou seja, uma variável é um nome que você escolhe para guardar um valor ou uma informação, assim você pode usar esse valor depois no seu programa.</p>

<p>Essas são as definições básicas que precisamos entender para falar sobre os tipos de dados em Ruby de maneira mais profunda. Vamos explorar cada tipo de dado, suas características, capacidades e limitações, sempre lembrando dessas definições para facilitar o entendimento.</p>

<h2 id="numeros-inteiros-integer">Números inteiros – Integer</h2>
<hr />

<p>O que é um número inteiro? Esse conceito vem da matemática: são números sem partes decimais, o que quer dizer que eles não têm vírgulas ou pontos.</p>

<p>Os números inteiros podem ser:</p>

<ul>
  <li><strong>Positivos</strong>: 0, 1, 2, 3 e assim por diante.</li>
  <li><strong>Negativos</strong>: −1, −2, −3 e assim por diante.</li>
  <li><strong>Zero</strong>: 0 é considerado um número inteiro também.</li>
</ul>

<p>Esses números são usados todos os dias para:</p>

<ul>
  <li>Contar pessoas. Exemplo: “São 10 pessoas na sala.”</li>
  <li>Número de itens. Exemplo: “Tenho 5 maçãs.”</li>
  <li>Quantidade de vezes que algo acontece. Exemplo: “Ele correu 3 vezes hoje.”</li>
</ul>

<p>Em Ruby os números inteiros são representados pela classe <code class="text-white-50 text-light">Integer</code>. Todos esses números são objetos dessa classe.</p>

<p>Observe no IRB:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="mi">42</span><span class="p">.</span><span class="nf">class</span>   <span class="c1"># A saída será Integer</span>
<span class="o">-</span><span class="mi">7</span><span class="p">.</span><span class="nf">class</span>   <span class="c1"># A saída será Integer</span>
<span class="mi">0</span><span class="p">.</span><span class="nf">class</span>    <span class="c1"># A saída será Integer</span>
</code></pre></div></div>

<h3 id="como-criar-inteiros-em-ruby">Como criar inteiros em Ruby</h3>
<hr />

<p>Para criar números inteiros em Ruby podemos criar variáveis e dar (atribuir) valores inteiros a elas.</p>

<p>Exemplo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">idade</span> <span class="o">=</span> <span class="mi">25</span>
<span class="n">quantidade_de_livros</span> <span class="o">=</span> <span class="mi">10</span>
<span class="n">saldo_bancario</span> <span class="o">=</span> <span class="o">-</span><span class="mi">150</span>
</code></pre></div></div>

<p>Quando queremos usar um número grande, como 1.000.000, em Ruby podemos usar underline (_) para separar os milhares, facilitando a leitura.</p>

<p>Exemplo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">populacao</span> <span class="o">=</span> <span class="mi">1_000_000</span>   <span class="c1"># igual a 1000000, só que mais legível</span>
</code></pre></div></div>

<h3 id="fazendo-operacoes-com-inteiros">Fazendo operações com inteiros</h3>
<hr />

<p>No mundo da programação e da matemática, quando falamos em operações, estamos nos referindo a coisas como:</p>

<ul>
  <li>Adição</li>
  <li>Subtração</li>
  <li>Multiplicação</li>
  <li>Divisão</li>
  <li>Comparações (maior, menor, igual)</li>
  <li>E muito mais!</li>
</ul>

<p>Em Ruby todas essas operações matemáticas são métodos que podemos usar com objetos da classe <code class="text-white-50 text-light">Integer</code>. Isso quer dizer que as operações são ações que podemos pedir para os números realizarem.</p>

<p>Lembre-se: método = ação de um objeto.</p>

<p>Então nesse caso, os números inteiros (objetos da classe Integer) têm métodos que fazem essas operações matemáticas.</p>

<p>Os símbolos usados para essas operações são:</p>

<p class="small text-light mb-2" id="tabela-1-ajuda">Observacao: em telas pequenas, deslize horizontalmente para ler todas as colunas da tabela.</p>
<div class="table-responsive">
<table class="table table-bordered table-striped table-hover table-dark text-white border-secondary" aria-describedby="tabela-1-ajuda">  <caption class="visually-hidden">Tabela comparativa de símbolos matemáticos e seus equivalentes em Ruby</caption>
  <thead class="table-dark">
    <tr>
      <th scope="col" class="border-white">Operação matemática</th>
      <th scope="col" class="border-white">Símbolo na matemática</th>
      <th scope="col" class="border-white">Símbolo em Ruby</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th scope="row" class="border-white">Adição</th>
      <td class="border-white">+</td>
      <td class="border-white">+</td>
    </tr>
    <tr>
      <th scope="row" class="border-white">Subtração</th>
      <td class="border-white">&minus;</td>
      <td class="border-white">&minus;</td>
    </tr>
    <tr>
      <th scope="row" class="border-white">Multiplicação</th>
      <td class="border-white">&times;</td>
      <td class="border-white">*</td>
    </tr>
    <tr>
      <th scope="row" class="border-white">Divisão</th>
      <td class="border-white">&divide;</td>
      <td class="border-white">/</td>
    </tr>
    <tr>
      <th scope="row" class="border-white">Módulo (resto da divisão)</th>
      <td class="border-white">%</td>
      <td class="border-white">%</td>
    </tr>
    <tr>
      <th scope="row" class="border-white">Potenciação</th>
      <td class="border-white">^</td>
      <td class="border-white">**</td>
    </tr>
    <tr>
      <th scope="row" class="border-white">Comparação (maior que)</th>
      <td class="border-white">&gt;</td>
      <td class="border-white">&gt;</td>
    </tr>
    <tr>
      <th scope="row" class="border-white">Comparação (menor que)</th>
      <td class="border-white">&lt;</td>
      <td class="border-white">&lt;</td>
    </tr>
    <tr>
      <th scope="row" class="border-white">Comparação (maior ou igual a)</th>
      <td class="border-white">&ge;</td>
      <td class="border-white">&gt;=</td>
    </tr>
    <tr>
      <th scope="row" class="border-white">Comparação (menor ou igual a)</th>
      <td class="border-white">&le;</td>
      <td class="border-white">&lt;=</td>
    </tr>
    <tr>
      <th scope="row" class="border-white">Comparação (igual a)</th>
      <td class="border-white">=</td>
      <td class="border-white">==</td>
    </tr>
  </tbody>
</table>
</div>

<p><strong>Observação:</strong> Em Ruby, a comparação se algo é igual a outra coisa é feita com dois sinais de igual (==) e não com um só (=), isso acontece porque o sinal de igual sozinho (=) é usado para atribuir valores a variáveis, por exemplo: <code class="text-white-50 text-light">idade = 30</code> atribui o valor 30 à variável idade. Então se precisarmos comparar se a idade é igual a 30, usamos <code class="text-white-50 text-light">idade == 30</code>.</p>

<p>Com os exemplos práticos fica mais fácil de entender.</p>

<p>Vamos declarar duas variáveis com números inteiros e fazer algumas operações com elas:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">a</span> <span class="o">=</span> <span class="mi">10</span>
<span class="n">b</span> <span class="o">=</span> <span class="mi">5</span>

<span class="nb">puts</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span>        <span class="c1"># Adição: resultado será 15</span>
<span class="nb">puts</span> <span class="n">a</span> <span class="o">-</span> <span class="n">b</span>        <span class="c1"># Subtração: resultado será 5</span>
<span class="nb">puts</span> <span class="n">a</span> <span class="o">*</span> <span class="n">b</span>        <span class="c1"># Multiplicação: resultado será 50</span>
<span class="nb">puts</span> <span class="n">a</span> <span class="o">/</span> <span class="n">b</span>        <span class="c1"># Divisão: resultado será 2</span>
<span class="nb">puts</span> <span class="n">a</span> <span class="o">%</span> <span class="n">b</span>        <span class="c1"># Módulo (resto da divisão): resultado será 0</span>
<span class="nb">puts</span> <span class="n">a</span> <span class="o">**</span> <span class="mi">2</span>      <span class="c1"># Potenciação: resultado será 100</span>
<span class="nb">puts</span> <span class="n">a</span> <span class="o">&gt;</span> <span class="n">b</span>       <span class="c1"># Comparação (maior que): resultado será true</span>
<span class="nb">puts</span> <span class="n">a</span> <span class="o">&lt;</span> <span class="n">b</span>       <span class="c1"># Comparação (menor que): resultado será false</span>
<span class="nb">puts</span> <span class="n">a</span> <span class="o">&gt;=</span> <span class="mi">10</span>     <span class="c1"># Comparação (maior ou igual a): resultado será true</span>
<span class="nb">puts</span> <span class="n">b</span> <span class="o">&lt;=</span> <span class="mi">3</span>      <span class="c1"># Comparação (menor ou igual a): resultado será false</span>
<span class="nb">puts</span> <span class="n">a</span> <span class="o">==</span> <span class="mi">10</span>     <span class="c1"># Comparação (igual a): resultado será true</span>
</code></pre></div></div>

<h3 id="metodos-comuns-para-inteiros">Métodos comuns para inteiros</h3>
<hr />

<p>De novo lembrando: método = ação de um objeto.</p>

<p>Agora vamos conhecer alguns métodos que o Ruby já deixa prontos para usarmos com números inteiros (objetos da classe Integer).</p>

<p><strong>1 - método <code class="text-white-50 text-light">even?</code>: verifica se o número é par.</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numero</span> <span class="o">=</span> <span class="mi">4</span>
<span class="nb">puts</span> <span class="n">numero</span><span class="p">.</span><span class="nf">even?</span>   <span class="c1"># A saída será true</span>
</code></pre></div></div>

<p><strong>2 -  método <code class="text-white-50 text-light">odd?</code>: verifica se o número é ímpar.</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numero</span> <span class="o">=</span> <span class="mi">7</span>
<span class="nb">puts</span> <span class="n">numero</span><span class="p">.</span><span class="nf">odd?</span>    <span class="c1"># A saída será true</span>
</code></pre></div></div>

<p><strong>3 -  método <code class="text-white-50 text-light">next</code>: retorna o próximo número inteiro.</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numero</span> <span class="o">=</span> <span class="mi">10</span>
<span class="nb">puts</span> <span class="n">numero</span><span class="p">.</span><span class="nf">next</span>    <span class="c1"># A saída será 11</span>
</code></pre></div></div>

<p><strong>4 - método <code class="text-white-50 text-light">pred</code>: retorna o número inteiro anterior.</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numero</span> <span class="o">=</span> <span class="mi">10</span>
<span class="nb">puts</span> <span class="n">numero</span><span class="p">.</span><span class="nf">pred</span>    <span class="c1"># A saída será 9</span>
</code></pre></div></div>

<p><strong>5 - método <code class="text-white-50 text-light">abs</code>: retorna o valor absoluto do número (sem o sinal de negativo).</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numero</span> <span class="o">=</span> <span class="o">-</span><span class="mi">15</span>
<span class="nb">puts</span> <span class="n">numero</span><span class="p">.</span><span class="nf">abs</span>     <span class="c1"># A saída será 15</span>
</code></pre></div></div>

<p>Esses são apenas alguns exemplos de métodos que podemos usar com números inteiros em Ruby. Existem muitos outros métodos disponíveis que podem ajudar a realizar diversas tarefas com esses dados.</p>

<h2 id="numeros-com-virgula-float">Números com vírgula – Float</h2>
<hr />

<p>O que é um número com vírgula? Também conhecido como número decimal, é um número que tem uma parte fracionária, ou seja, uma parte depois da vírgula (ou ponto, dependendo do país).</p>

<p>Exemplos de números com vírgula:</p>

<ul>
  <li>3,14</li>
  <li>0,75</li>
  <li>−2,5</li>
  <li>100,0</li>
</ul>

<p>Esses números são usados para representar valores que não são inteiros, como:</p>

<ul>
  <li>Medidas. Exemplo: “A altura da pessoa é 1,75 metros.”</li>
  <li>Dinheiro. Exemplo: “O preço do produto é R$ 19,99.”</li>
  <li>Temperaturas. Exemplo: “A temperatura está em 23,5 graus Celsius.”</li>
  <li>E muito mais!</li>
</ul>

<p>Em Ruby, os números com vírgula são representados pela classe <code class="text-white-50 text-light">Float</code>. Todos esses números são objetos dessa classe.</p>

<p>Observe no IRB:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="mf">3.14</span><span class="p">.</span><span class="nf">class</span>   <span class="c1"># A saída será Float</span>
<span class="o">-</span><span class="mf">0.75</span><span class="p">.</span><span class="nf">class</span>  <span class="c1"># A saída será Float</span>
<span class="mf">0.0</span><span class="p">.</span><span class="nf">class</span>    <span class="c1"># A saída será Float</span>
</code></pre></div></div>

<h3 id="como-criar-numeros-com-virgula-em-ruby">Como criar números com vírgula em Ruby</h3>
<hr />

<p>Para criar números com vírgula em Ruby, usamos o ponto (.) como separador decimal, diferente do que usamos na escrita comum em português, onde usamos a vírgula (,).</p>

<p>Exemplo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">altura</span> <span class="o">=</span> <span class="mf">1.75</span>
<span class="n">preco</span> <span class="o">=</span> <span class="mf">19.99</span>
<span class="n">temperatura</span> <span class="o">=</span> <span class="o">-</span><span class="mf">2.5</span>
</code></pre></div></div>

<h3 id="fazendo-operacoes-com-numeros-com-virgula">Fazendo operações com números com vírgula</h3>
<hr />

<p>Assim como os números inteiros, os números com vírgula (objetos da classe Float) também têm métodos para fazer operações matemáticas.</p>

<p>Os símbolos usados para essas operações são os mesmos apresentados na tabela comparativa anterior.</p>

<p>Vamos declarar duas variáveis com números com vírgula e fazer algumas operações com elas:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">x</span> <span class="o">=</span> <span class="mf">5.5</span>
<span class="n">y</span> <span class="o">=</span> <span class="mf">2.0</span>

<span class="nb">puts</span> <span class="n">x</span> <span class="o">+</span> <span class="n">y</span>        <span class="c1"># Adição: resultado será 7.5</span>
<span class="nb">puts</span> <span class="n">x</span> <span class="o">-</span> <span class="n">y</span>        <span class="c1"># Subtração: resultado será 3.5</span>
<span class="nb">puts</span> <span class="n">x</span> <span class="o">*</span> <span class="n">y</span>        <span class="c1"># Multiplicação: resultado será 11.0</span>
<span class="nb">puts</span> <span class="n">x</span> <span class="o">/</span> <span class="n">y</span>        <span class="c1"># Divisão: resultado será 2.75</span>
<span class="nb">puts</span> <span class="n">x</span> <span class="o">%</span> <span class="n">y</span>        <span class="c1"># Módulo (resto da divisão): resultado será 1.5</span>
<span class="nb">puts</span> <span class="n">x</span> <span class="o">**</span> <span class="mi">2</span>      <span class="c1"># Potenciação: resultado será 30.25</span>
<span class="nb">puts</span> <span class="n">x</span> <span class="o">&gt;</span> <span class="n">y</span>       <span class="c1"># Comparação (maior que): resultado será true</span>
<span class="nb">puts</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="n">y</span>       <span class="c1"># Comparação (menor que): resultado será false</span>
<span class="nb">puts</span> <span class="n">x</span> <span class="o">&gt;=</span> <span class="mf">5.5</span>    <span class="c1"># Comparação (maior ou igual a): resultado será true</span>
<span class="nb">puts</span> <span class="n">y</span> <span class="o">&lt;=</span> <span class="mf">3.0</span>    <span class="c1"># Comparação (menor ou igual a): resultado será true</span>
<span class="nb">puts</span> <span class="n">x</span> <span class="o">==</span> <span class="mf">5.5</span>    <span class="c1"># Comparação (igual a): resultado será true</span>
</code></pre></div></div>

<h3 id="metodos-comuns-para-numeros-com-virgula">Métodos comuns para números com vírgula</h3>
<hr />

<p>De novo lembrando: método = ação de um objeto.</p>

<p>Alguns métodos disponíveis para números <code class="text-white-50 text-light">Float</code> em Ruby são:</p>

<p><strong>1 - método <code class="text-white-50 text-light">round</code>: arredonda o número para o inteiro mais próximo.</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numero</span> <span class="o">=</span> <span class="mf">3.6</span>

<span class="nb">puts</span> <span class="n">numero</span><span class="p">.</span><span class="nf">round</span>    <span class="c1"># A saída será 4</span>
</code></pre></div></div>

<p>Nesse método também é possível arredondar a parte decimal para um número específico de casas decimais, passando um argumento para o método.</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numero</span> <span class="o">=</span> <span class="mf">3.14159</span>

<span class="nb">puts</span> <span class="n">numero</span><span class="p">.</span><span class="nf">round</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>    <span class="c1"># A saída será 3.1</span>

<span class="nb">puts</span> <span class="n">numero</span><span class="p">.</span><span class="nf">round</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>    <span class="c1"># A saída será 3.14</span>

<span class="nb">puts</span> <span class="n">numero</span><span class="p">.</span><span class="nf">round</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>    <span class="c1"># A saída será 3.142</span>
</code></pre></div></div>

<p><strong>2 - método <code class="text-white-50 text-light">ceil</code>: arredonda o número para cima (para o próximo inteiro).</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numero</span> <span class="o">=</span> <span class="mf">4.2</span>
<span class="nb">puts</span> <span class="n">numero</span><span class="p">.</span><span class="nf">ceil</span>     <span class="c1"># A saída será 5</span>
</code></pre></div></div>

<p>Qual a diferença entre <code class="text-white-50 text-light">ceil</code> e <code class="text-white-50 text-light">round</code>?</p>

<ul>
  <li>O método <code class="text-white-50 text-light">round</code> arredonda para o inteiro mais próximo, seja para cima ou para baixo, dependendo do valor decimal.</li>
  <li>O método <code class="text-white-50 text-light">ceil</code> sempre arredonda para cima, independentemente do valor decimal.</li>
</ul>

<p>Por exemplo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numero1</span> <span class="o">=</span> <span class="mf">4.2</span>
<span class="n">numero2</span> <span class="o">=</span> <span class="mf">4.7</span>

<span class="nb">puts</span> <span class="n">numero1</span><span class="p">.</span><span class="nf">round</span>    <span class="c1"># A saída será 4</span>
<span class="nb">puts</span> <span class="n">numero2</span><span class="p">.</span><span class="nf">round</span>    <span class="c1"># A saída será 5</span>

<span class="nb">puts</span> <span class="n">numero1</span><span class="p">.</span><span class="nf">ceil</span>     <span class="c1"># A saída será 5</span>
<span class="nb">puts</span> <span class="n">numero2</span><span class="p">.</span><span class="nf">ceil</span>     <span class="c1"># A saída será 5</span>
</code></pre></div></div>

<p><strong>3 - método <code class="text-white-50 text-light">floor</code>: arredonda o número para baixo (para o inteiro anterior).</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numero</span> <span class="o">=</span> <span class="mf">4.8</span>
<span class="nb">puts</span> <span class="n">numero</span><span class="p">.</span><span class="nf">floor</span>    <span class="c1"># A saída será 4</span>
</code></pre></div></div>

<p>Números de ponto flutuante (Float) podem ter pequenas imprecisões. Isso acontece porque alguns números decimais não podem ser representados exatamente em binário, que é a forma como os computadores armazenam números. Por exemplo, a soma de 0.1 e 0.2 pode resultar em 0.30000000000000004 em vez de 0.3.</p>

<p>Para lidar com dinheiro em programas mais avançados por exemplo, é melhor usar outros tipos de número, como o BigDecimal. Mas, para quem está começando, basta saber que o tipo Float não é sempre exato e pode dar pequenos erros em algumas situações.</p>

<h2 id="textos-string">Textos – String</h2>
<hr />

<p>Uma string é um texto. É uma sequência de caracteres que pode incluir letras, números, espaços e símbolos.</p>

<p>Exemplos de strings:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="s2">"Olá, mundo!"</span>
<span class="s2">"12345"</span>
<span class="s2">"Ruby"</span>
<span class="s2">"Programação"</span>
<span class="s2">"@#%&amp;*()!"</span>
</code></pre></div></div>

<p>Todas essas sequências de caracteres são objetos da classe <code class="text-white-50 text-light">String</code> em Ruby.</p>

<h3 id="como-criar-strings-em-ruby">Como criar strings em Ruby</h3>
<hr />

<p>Para criar strings em Ruby, usamos aspas duplas (“ “) ou aspas simples (‘ ‘), geralmente, as aspas duplas são mais comuns. Precisamos colocar o texto entre aspas para que o Ruby entenda que aquilo é uma string e não um comando, uma variável ou outra coisa que estamos tentando inserir no programa.</p>

<p>Exemplo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">mensagem</span> <span class="o">=</span> <span class="s2">"Olá, mundo!"</span>
<span class="n">nome</span> <span class="o">=</span> <span class="s1">'Ana'</span>
<span class="n">vazio</span> <span class="o">=</span> <span class="s2">""</span>
</code></pre></div></div>

<p>Algo muito legal que podemos fazer com strings se chama interpolação. Interpolação é quando colocamos o valor de uma variável dentro de uma string, para que o valor daquela variável apareça no texto.</p>

<p>Para fazer isso usamos <code class="text-white-50 text-light">#{}</code> dentro de uma string com aspas duplas.</p>

<p>Exemplo de interpolação:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">nome</span> <span class="o">=</span> <span class="s2">"Louise"</span>
<span class="n">mensagem</span> <span class="o">=</span> <span class="s2">"Olá, </span><span class="si">#{</span><span class="n">nome</span><span class="si">}</span><span class="s2">! Seja bem-vinda."</span>

<span class="nb">puts</span> <span class="n">mensagem</span>   <span class="c1"># A saída será "Olá, Louise! Seja bem-vinda."</span>
</code></pre></div></div>

<p>Aqui o valor da variável <code class="text-white-50 text-light">nome</code> foi colocado dentro da string na variável <code class="text-white-50 text-light">mensagem</code> usando a interpolação.</p>

<h3 id="metodos-comuns-para-strings">Métodos comuns para strings</h3>
<hr />

<p>Alguns métodos comuns que podemos usar com strings em Ruby são:</p>

<p><strong>1 - método <code class="text-white-50 text-light">upcase</code>: transforma todas as letras da string em maiúsculas.</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">texto</span> <span class="o">=</span> <span class="s2">"olá, mundo!"</span>
<span class="nb">puts</span> <span class="n">texto</span><span class="p">.</span><span class="nf">upcase</span>    <span class="c1"># A saída será "OLÁ, MUNDO!"</span>
</code></pre></div></div>

<p><strong>2 - método <code class="text-white-50 text-light">downcase</code>: transforma todas as letras da string em minúsculas.</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">texto</span> <span class="o">=</span> <span class="s2">"OLÁ, MUNDO!"</span>
<span class="nb">puts</span> <span class="n">texto</span><span class="p">.</span><span class="nf">downcase</span>    <span class="c1"># A saída será "olá, mundo!"</span>
</code></pre></div></div>

<p><strong>3 - método <code class="text-white-50 text-light">length</code>: retorna o número de caracteres (incluindo espaços) na string.</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">texto</span> <span class="o">=</span> <span class="s2">"Olá"</span>
<span class="n">texto2</span> <span class="o">=</span> <span class="s2">"Oi, eu sou o Goku!"</span>

<span class="nb">puts</span> <span class="n">texto</span><span class="p">.</span><span class="nf">length</span>      <span class="c1"># A saída será 3</span>
<span class="nb">puts</span> <span class="n">texto2</span><span class="p">.</span><span class="nf">length</span>   <span class="c1"># A saída será 18</span>
</code></pre></div></div>

<p><strong>4 - método <code class="text-white-50 text-light">strip</code>: remove espaços em branco do início e do fim da string.</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">texto</span> <span class="o">=</span> <span class="s2">"   Olá, mundo!   "</span>
<span class="nb">puts</span> <span class="n">texto</span><span class="p">.</span><span class="nf">strip</span>    <span class="c1"># A saída será "Olá, mundo!"</span>
</code></pre></div></div>

<p><strong>5 - método <code class="text-white-50 text-light">gsub</code>: substitui todas as ocorrências de um texto por outro na string.</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">texto</span> <span class="o">=</span> <span class="s2">"O gato está no telhado."</span>
<span class="nb">puts</span> <span class="n">texto</span><span class="p">.</span><span class="nf">gsub</span><span class="p">(</span><span class="s2">"gato"</span><span class="p">,</span> <span class="s2">"cachorro"</span><span class="p">)</span>   <span class="c1"># A saída será "O cachorro está no telhado."</span>
</code></pre></div></div>

<h2 id="variaveis-booleanas-boolean">Variáveis booleanas – Boolean</h2>
<hr />

<p>Um booleano é um tipo de dado que só pode ter dois valores:</p>

<ul>
  <li><code class="text-white-50 text-light">true</code> (verdadeiro)</li>
  <li><code class="text-white-50 text-light">false</code> (falso)</li>
</ul>

<p>Esses valores são usados para representar condições ou respostas de “sim” ou “não” em programas e muitas vezes são usados para tomar decisões no código.</p>

<p>Ruby não tem uma classe específica chamada <code class="text-white-50 text-light">Boolean</code>, mas os valores <code class="text-white-50 text-light">true</code> e <code class="text-white-50 text-light">false</code> são objetos únicos.</p>

<ul>
  <li><code class="text-white-50 text-light">true</code> é um objeto único da classe <code class="text-white-50 text-light">TrueClass</code>.</li>
  <li><code class="text-white-50 text-light">false</code> é um objeto único da classe <code class="text-white-50 text-light">FalseClass</code>.</li>
</ul>

<h3 id="como-criar-variaveis-booleanas-em-ruby">Como criar variáveis booleanas em Ruby</h3>
<hr />

<p>Para criar variáveis booleanas em Ruby, simplesmente atribuímos os valores <code class="text-white-50 text-light">true</code> ou <code class="text-white-50 text-light">false</code> a uma variável.</p>

<p>Exemplo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">esta_chovendo</span> <span class="o">=</span> <span class="kp">true</span>
<span class="n">tem_luz</span> <span class="o">=</span> <span class="kp">false</span>
</code></pre></div></div>

<p>É possível também combinar valores booleanos usando ferramentas chamadas de operadores lógicos.</p>

<h3 id="operadores-logicos">Operadores lógicos</h3>
<hr />

<p>Os operadores lógicos são usados para combinar ou modificar valores booleanos. Por exemplo, podemos usar operadores lógicos para verificar se duas condições são verdadeiras ao mesmo tempo, ou se pelo menos uma delas é verdadeira.</p>

<p>Os principais operadores lógicos em Ruby são:</p>

<ul>
  <li><strong>AND lógico (<code class="text-white-50 text-light">&amp;&amp;</code>)</strong>: retorna <code class="text-white-50 text-light">true</code> se ambas as condições forem verdadeiras.</li>
  <li><strong>OR lógico (<code class="text-white-50 text-light">||</code>)</strong>: retorna <code class="text-white-50 text-light">true</code> se pelo menos uma das condições for verdadeira.</li>
  <li><strong>NOT lógico (<code class="text-white-50 text-light">!</code>)</strong>: inverte o valor booleano (de <code class="text-white-50 text-light">true</code> para <code class="text-white-50 text-light">false</code> e vice-versa).</li>
</ul>

<p>Exemplos:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">a</span> <span class="o">=</span> <span class="kp">true</span>
<span class="n">b</span> <span class="o">=</span> <span class="kp">false</span>

<span class="nb">puts</span> <span class="n">a</span> <span class="o">&amp;&amp;</span> <span class="n">b</span>    <span class="c1"># AND lógico: a saída será false</span>
<span class="nb">puts</span> <span class="n">a</span> <span class="o">||</span> <span class="n">b</span>    <span class="c1"># OR lógico: a saída será true</span>
<span class="nb">puts</span> <span class="o">!</span><span class="n">a</span>        <span class="c1"># NOT lógico: a saída será false</span>
<span class="nb">puts</span> <span class="o">!</span><span class="n">b</span>        <span class="c1"># NOT lógico: a saída será true</span>
</code></pre></div></div>

<p>Mas, para que serve isso na prática? Vamos ver um exemplo.</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Dados simulados do sistema</span>
<span class="n">usuario_correto</span> <span class="o">=</span> <span class="kp">true</span>          <span class="c1"># O nome do usuário está correto?</span>
<span class="n">senha_correta</span> <span class="o">=</span> <span class="kp">true</span>            <span class="c1"># A senha está correta?</span>
<span class="n">usuario_eh_admin</span> <span class="o">=</span> <span class="kp">false</span>        <span class="c1"># Essa pessoa tem permissão de administrador?</span>

<span class="c1"># Simulação de login básico</span>
<span class="n">login_valido</span> <span class="o">=</span> <span class="n">usuario_correto</span> <span class="o">&amp;&amp;</span> <span class="n">senha_correta</span>

<span class="c1"># Verificações usando operadores lógicos</span>
<span class="n">pode_acessar</span> <span class="o">=</span> <span class="n">login_valido</span> <span class="o">||</span> <span class="n">usuario_eh_admin</span>

<span class="c1"># Resultado da simulação</span>
<span class="nb">puts</span> <span class="s2">"Login válido? </span><span class="si">#{</span><span class="n">login_valido</span><span class="si">}</span><span class="s2">"</span>             <span class="c1"># Esperado: true</span>
<span class="nb">puts</span> <span class="s2">"É administrador? </span><span class="si">#{</span><span class="n">usuario_eh_admin</span><span class="si">}</span><span class="s2">"</span>      <span class="c1"># Esperado: false</span>
<span class="nb">puts</span> <span class="s2">"Pode acessar o sistema? </span><span class="si">#{</span><span class="n">pode_acessar</span><span class="si">}</span><span class="s2">"</span>   <span class="c1"># true se login for válido ou se for admin</span>
<span class="nb">puts</span> <span class="s2">"Acesso negado? </span><span class="si">#{</span><span class="o">!</span><span class="n">pode_acessar</span><span class="si">}</span><span class="s2">"</span>           <span class="c1"># true se não puder acessar</span>
</code></pre></div></div>

<p>O que foi feito aqui? O código simula um sistema de login simples. Ele verifica se o nome do usuário e a senha estão corretos usando o operador AND lógico (<code class="text-white-50 text-light">&amp;&amp;</code>). Se ambos estiverem corretos, o login é válido.</p>

<p>Para fazer este teste crie um programa Ruby com o código acima e execute-o no terminal. Observe os resultados e tente alterar os valores das variáveis <code class="text-white-50 text-light">usuario_correto</code>, <code class="text-white-50 text-light">senha_correta</code> e <code class="text-white-50 text-light">usuario_eh_admin</code> para ver como isso afeta o resultado final.</p>

<h2 id="listas-array">Listas – Array</h2>
<hr />

<p>Uma lista, ou array, é uma coleção ordenada de itens. Esses itens podem ser de qualquer tipo de dado, como números, textos, booleanos, ou até mesmo outros arrays.</p>

<p>Nós já usamos listas no nosso dia a dia, mesmo sem perceber. Por exemplo, uma lista de compras, uma lista de tarefas ou uma lista de contatos no celular.</p>

<p>Em Ruby as listas são representadas pela classe <code class="text-white-50 text-light">Array</code>. Todos os arrays são objetos dessa classe.</p>

<p>Observe no IRB:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">frutas</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"maçã"</span><span class="p">,</span> <span class="s2">"banana"</span><span class="p">,</span> <span class="s2">"laranja"</span><span class="p">]</span>
<span class="n">notas</span>  <span class="o">=</span> <span class="p">[</span><span class="mf">7.5</span><span class="p">,</span> <span class="mf">8.0</span><span class="p">,</span> <span class="mf">9.0</span><span class="p">]</span>
<span class="n">idades</span> <span class="o">=</span> <span class="p">[</span><span class="mi">25</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">22</span><span class="p">]</span>
<span class="nb">puts</span> <span class="n">frutas</span><span class="p">.</span><span class="nf">class</span>   <span class="c1"># A saída será Array</span>
<span class="nb">puts</span> <span class="n">notas</span><span class="p">.</span><span class="nf">class</span>    <span class="c1"># A saída será Array</span>
<span class="nb">puts</span> <span class="n">idades</span><span class="p">.</span><span class="nf">class</span>   <span class="c1"># A saída será Array</span>
</code></pre></div></div>

<h3 id="como-criar-listas-em-ruby">Como criar listas em Ruby</h3>
<hr />

<p>Para criar listas em Ruby, usamos colchetes <code class="text-white-50 text-light">[ ]</code> e separamos os itens com vírgulas.</p>

<p>Exemplo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numeros</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>                      <span class="c1"># array de inteiros</span>
<span class="n">frutas</span>  <span class="o">=</span> <span class="p">[</span><span class="s2">"maçã"</span><span class="p">,</span> <span class="s2">"banana"</span><span class="p">,</span> <span class="s2">"uva"</span><span class="p">]</span>      <span class="c1"># array de strings</span>
<span class="n">mistura</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="s2">"dois"</span><span class="p">,</span> <span class="ss">:tres</span><span class="p">,</span> <span class="mf">4.0</span><span class="p">]</span>        <span class="c1"># array misto</span>
<span class="n">vazio</span>   <span class="o">=</span> <span class="p">[]</span>                             <span class="c1"># array vazio</span>
</code></pre></div></div>

<h3 id="conhecendo-os-indices-das-listas">Conhecendo os índices das listas</h3>
<hr />

<p>Índices são as posições dos itens dentro de uma lista. Em Ruby, os índices começam do zero (0). Isso significa que o primeiro item da lista está na posição 0, o segundo item está na posição 1, o terceiro item está na posição 2, e assim por diante.</p>

<p>A função do índice é a mesma que um índice tem em um livro: ele ajuda a encontrar rapidamente onde algo está localizado.</p>

<p>Exemplo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">frutas</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"maçã"</span><span class="p">,</span> <span class="s2">"banana"</span><span class="p">,</span> <span class="s2">"laranja"</span><span class="p">]</span>

<span class="nb">puts</span> <span class="n">frutas</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>   <span class="c1"># A saída será "maçã" (primeiro item)</span>
<span class="nb">puts</span> <span class="n">frutas</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>   <span class="c1"># A saída será "banana" (segundo item)</span>
<span class="nb">puts</span> <span class="n">frutas</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>   <span class="c1"># A saída será "laranja" (terceiro item)</span>
</code></pre></div></div>

<p>Podemos usar índice positivo (do começo) ou negativo (do fim):</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">frutas</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"maçã"</span><span class="p">,</span> <span class="s2">"banana"</span><span class="p">,</span> <span class="s2">"laranja"</span><span class="p">]</span>

<span class="nb">puts</span> <span class="n">frutas</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>   <span class="c1"># A saída será "laranja" (último item)</span>
<span class="nb">puts</span> <span class="n">frutas</span><span class="p">[</span><span class="o">-</span><span class="mi">2</span><span class="p">]</span>   <span class="c1"># A saída será "banana" (penúltimo item)</span>
<span class="nb">puts</span> <span class="n">frutas</span><span class="p">[</span><span class="o">-</span><span class="mi">3</span><span class="p">]</span>   <span class="c1"># A saída será "maçã" (antepenúltimo item)</span>
</code></pre></div></div>

<h3 id="metodos-comuns-para-listas">Métodos comuns para listas</h3>
<hr />

<p>Alguns métodos comuns que podemos usar com listas (arrays) em Ruby são:</p>

<p><strong>1 - método <code class="text-white-50 text-light">push</code>: adiciona um item ao final da lista.</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">frutas</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"maçã"</span><span class="p">,</span> <span class="s2">"banana"</span><span class="p">]</span>

<span class="n">frutas</span><span class="p">.</span><span class="nf">push</span><span class="p">(</span><span class="s2">"laranja"</span><span class="p">)</span>

<span class="nb">puts</span> <span class="n">frutas</span><span class="p">.</span><span class="nf">inspect</span>    <span class="c1"># A saída será ["maçã", "banana", "laranja"]</span>
</code></pre></div></div>

<p>O método <code class="text-white-50 text-light">inspect</code> é usado aqui para mostrar o conteúdo completo do array.</p>

<p><strong>2 - método <code class="text-white-50 text-light">pop</code>: remove o último item da lista e o retorna.</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">frutas</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"maçã"</span><span class="p">,</span> <span class="s2">"banana"</span><span class="p">,</span> <span class="s2">"laranja"</span><span class="p">]</span>
<span class="n">ultima_fruta</span> <span class="o">=</span> <span class="n">frutas</span><span class="p">.</span><span class="nf">pop</span>
<span class="nb">puts</span> <span class="n">ultima_fruta</span>          <span class="c1"># A saída será "laranja"</span>
<span class="nb">puts</span> <span class="n">frutas</span><span class="p">.</span><span class="nf">inspect</span>        <span class="c1"># A saída será ["maçã", "banana"]</span>
</code></pre></div></div>

<p>O que foi feito aqui? O método <code class="text-white-50 text-light">pop</code> removeu o último item da lista (laranja) e o guardou na variável <code class="text-white-50 text-light">ultima_fruta</code>. Depois mostramos o valor dessa variável e o conteúdo atualizado da lista.</p>

<p><strong>3 - método <code class="text-white-50 text-light">length</code>: retorna o número de itens na lista.</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">frutas</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"maçã"</span><span class="p">,</span> <span class="s2">"banana"</span><span class="p">,</span> <span class="s2">"laranja"</span><span class="p">]</span>
<span class="nb">puts</span> <span class="n">frutas</span><span class="p">.</span><span class="nf">length</span>    <span class="c1"># A saída será 3</span>
</code></pre></div></div>

<p><strong>4 - método <code class="text-white-50 text-light">include?</code>: verifica se um item está presente na lista.</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">frutas</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"maçã"</span><span class="p">,</span> <span class="s2">"banana"</span><span class="p">,</span> <span class="s2">"laranja"</span><span class="p">]</span>
<span class="nb">puts</span> <span class="n">frutas</span><span class="p">.</span><span class="nf">include?</span><span class="p">(</span><span class="s2">"banana"</span><span class="p">)</span>   <span class="c1"># A saída será true</span>
<span class="nb">puts</span> <span class="n">frutas</span><span class="p">.</span><span class="nf">include?</span><span class="p">(</span><span class="s2">"uva"</span><span class="p">)</span>      <span class="c1"># A saída será false</span>
</code></pre></div></div>

<h2 id="tabelas-de-pares-hash">Tabelas de pares – Hash</h2>
<hr />

<p>Um hash é uma coleção de pares de chave-valor. Cada valor na coleção é associado a uma chave única, que é usada para acessar esse valor.</p>

<p>Por exemplo, em um dicionário, a palavra é a chave e a definição é o valor. Em um hash, podemos pensar em algo semelhante: a chave é como o “nome” do valor, e usamos essa chave para encontrar o valor correspondente.</p>

<p>Em Ruby, os hashes são representados pela classe <code class="text-white-50 text-light">Hash</code>. Todos os hashes são objetos dessa classe.</p>

<p>Observe no IRB:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pessoa</span> <span class="o">=</span> <span class="p">{</span> <span class="s2">"nome"</span> <span class="o">=&gt;</span> <span class="s2">"João"</span><span class="p">,</span> <span class="s2">"idade"</span> <span class="o">=&gt;</span> <span class="mi">30</span> <span class="p">}</span>
<span class="nb">puts</span> <span class="n">pessoa</span><span class="p">.</span><span class="nf">class</span>   <span class="c1"># A saída será Hash</span>
</code></pre></div></div>

<h3 id="como-criar-hashes-em-ruby">Como criar hashes em Ruby</h3>
<hr />

<p>Para criar hashes em Ruby, usamos chaves <code class="text-white-50 text-light">{ }</code> e associamos cada chave a um valor usando o símbolo <code class="text-white-50 text-light">=&gt; </code>.</p>

<p>Exemplo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pessoa</span> <span class="o">=</span> <span class="p">{</span> <span class="s2">"nome"</span> <span class="o">=&gt;</span> <span class="s2">"Ana"</span><span class="p">,</span> <span class="s2">"idade"</span> <span class="o">=&gt;</span> <span class="mi">25</span><span class="p">,</span> <span class="s2">" cidade"</span> <span class="o">=&gt;</span> <span class="s2">"São Paulo"</span> <span class="p">}</span>
</code></pre></div></div>

<h3 id="acessando-valores-em-hashes">Acessando valores em hashes</h3>
<hr />

<p>Para acessar um valor em um hash, usamos a chave correspondente entre colchetes <code class="text-white-50 text-light">[ ]</code>.</p>

<p>Exemplo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pessoa</span> <span class="o">=</span> <span class="p">{</span> <span class="s2">"nome"</span> <span class="o">=&gt;</span> <span class="s2">"Ana"</span><span class="p">,</span> <span class="s2">"idade"</span> <span class="o">=&gt;</span> <span class="mi">25</span><span class="p">,</span> <span class="s2">" cidade"</span> <span class="o">=&gt;</span> <span class="s2">"São Paulo"</span> <span class="p">}</span>
<span class="nb">puts</span> <span class="n">pessoa</span><span class="p">[</span><span class="s2">"nome"</span><span class="p">]</span>      <span class="c1"># A saída será "Ana"</span>
<span class="nb">puts</span> <span class="n">pessoa</span><span class="p">[</span><span class="s2">"idade"</span><span class="p">]</span>     <span class="c1"># A saída será 25</span>
<span class="nb">puts</span> <span class="n">pessoa</span><span class="p">[</span><span class="s2">"cidade"</span><span class="p">]</span>    <span class="c1"># A saída será "São Paulo"</span>
</code></pre></div></div>

<p>Como podemos alterar o valor associado a uma chave em um hash? Simplesmente atribuímos um novo valor àquela chave.</p>

<p>Exemplo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pessoa</span> <span class="o">=</span> <span class="p">{</span> <span class="s2">"nome"</span> <span class="o">=&gt;</span> <span class="s2">"Ana"</span><span class="p">,</span> <span class="s2">"idade"</span> <span class="o">=&gt;</span> <span class="mi">25</span><span class="p">,</span> <span class="s2">"cidade"</span> <span class="o">=&gt;</span> <span class="s2">"São Paulo"</span> <span class="p">}</span>
<span class="n">pessoa</span><span class="p">[</span><span class="s2">"idade"</span><span class="p">]</span> <span class="o">=</span> <span class="mi">26</span>
<span class="nb">puts</span> <span class="n">pessoa</span><span class="p">[</span><span class="s2">"idade"</span><span class="p">]</span>     <span class="c1"># A saída será 26</span>
</code></pre></div></div>

<h3 id="metodos-comuns-para-hashes">Métodos comuns para hashes</h3>
<hr />

<p>Alguns métodos comuns que podemos usar com hashes em Ruby são:</p>

<p><strong>1 - método <code class="text-white-50 text-light">keys</code>: retorna uma lista com todas as chaves do hash.</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pessoa</span> <span class="o">=</span> <span class="p">{</span> <span class="s2">"nome"</span> <span class="o">=&gt;</span> <span class="s2">"Ana"</span><span class="p">,</span> <span class="s2">"idade"</span> <span class="o">=&gt;</span> <span class="mi">25</span><span class="p">,</span> <span class="s2">"cidade"</span> <span class="o">=&gt;</span> <span class="s2">"São Paulo"</span> <span class="p">}</span>
<span class="nb">puts</span> <span class="n">pessoa</span><span class="p">.</span><span class="nf">keys</span><span class="p">.</span><span class="nf">inspect</span>    <span class="c1"># A saída será ["nome", "idade", "cidade"]</span>
</code></pre></div></div>

<p><strong>2 - método <code class="text-white-50 text-light">values</code>: retorna uma lista com todos os valores do hash.</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pessoa</span> <span class="o">=</span> <span class="p">{</span> <span class="s2">"nome"</span> <span class="o">=&gt;</span> <span class="s2">"Ana"</span><span class="p">,</span> <span class="s2">"idade"</span> <span class="o">=&gt;</span> <span class="mi">25</span><span class="p">,</span> <span class="s2">"cidade"</span> <span class="o">=&gt;</span> <span class="s2">"São Paulo"</span> <span class="p">}</span>
<span class="nb">puts</span> <span class="n">pessoa</span><span class="p">.</span><span class="nf">values</span><span class="p">.</span><span class="nf">inspect</span>    <span class="c1"># A saída será ["Ana", 25, "São Paulo"]</span>
</code></pre></div></div>

<p><strong>3 - método <code class="text-white-50 text-light">delete</code>: remove um par chave-valor do hash com base na chave fornecida.</strong></p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pessoa</span> <span class="o">=</span> <span class="p">{</span> <span class="s2">"nome"</span> <span class="o">=&gt;</span> <span class="s2">"Ana"</span><span class="p">,</span> <span class="s2">"idade"</span> <span class="o">=&gt;</span> <span class="mi">25</span><span class="p">,</span> <span class="s2">"cidade"</span> <span class="o">=&gt;</span> <span class="s2">"São Paulo"</span> <span class="p">}</span>
<span class="n">pessoa</span><span class="p">.</span><span class="nf">delete</span><span class="p">(</span><span class="s2">"idade"</span><span class="p">)</span>
<span class="nb">puts</span> <span class="n">pessoa</span><span class="p">.</span><span class="nf">inspect</span>    <span class="c1"># A saída será {"nome"=&gt;"Ana", "cidade"=&gt;"São Paulo"}</span>
</code></pre></div></div>

<h2 id="nada-nil-nilclass">Nada - nil / NilClass</h2>
<hr />

<p>Em Ruby, <code class="text-white-50 text-light">nil</code> é um valor especial que representa a ausência de um valor ou a falta de um objeto. É usado para indicar que algo não existe ou não foi definido.</p>

<p>Muitas vezes precisamos dizer “não tem valor aqui”.</p>

<p>Em Ruby, <code class="text-white-50 text-light">nil</code> é um objeto único da classe <code class="text-white-50 text-light">NilClass</code> que serve justamente para representar essa ausência de valor.</p>

<ul>
  <li><code class="text-white-50 text-light">nil</code> significa ausência de valor.</li>
  <li>Não é zero.</li>
  <li>Não é uma string vazia.</li>
  <li>Não é falso.</li>
  <li>É simplesmente nada.</li>
</ul>

<h3 id="como-usar-nil-em-ruby">Como usar nil em Ruby</h3>
<hr />

<p>Podemos usar <code class="text-white-50 text-light">nil</code> para inicializar variáveis que ainda não têm um valor definido.</p>

<p>Exemplo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">resultado</span> <span class="o">=</span> <span class="kp">nil</span>
<span class="nb">puts</span> <span class="n">resultado</span>    <span class="c1"># A saída será nil</span>
</code></pre></div></div>

<p>Ou podemos verificar se uma variável é <code class="text-white-50 text-light">nil</code> usando o método <code class="text-white-50 text-light">nil?</code>.</p>

<p>Exemplo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">nome</span> <span class="o">=</span> <span class="kp">nil</span>
<span class="n">nome</span><span class="p">.</span><span class="nf">nil?</span>   <span class="c1"># =&gt; true</span>

<span class="s2">"oi"</span><span class="p">.</span><span class="nf">nil?</span>   <span class="c1"># =&gt; false</span>
<span class="mi">0</span><span class="p">.</span><span class="nf">nil?</span>      <span class="c1"># =&gt; false</span>
<span class="s2">""</span><span class="p">.</span><span class="nf">nil?</span>     <span class="c1"># =&gt; false</span>

<span class="nb">puts</span> <span class="n">nome</span><span class="p">.</span><span class="nf">nil?</span>    <span class="c1"># A saída será true</span>
</code></pre></div></div>

<h2 id="simbolos-symbol">Símbolos – Symbol</h2>
<hr />

<p>Um símbolo é um tipo de dado em Ruby que representa um nome ou identificador. Símbolos são frequentemente usados como chaves em hashes ou para representar estados ou opções em programas.</p>

<p>Em Ruby, os símbolos são representados pela classe <code class="text-white-50 text-light">Symbol</code>. Todos os símbolos são objetos dessa classe.</p>

<h3 id="como-criar-simbolos-em-ruby">Como criar símbolos em Ruby</h3>
<hr />

<p>Para criar um símbolo em Ruby, usamos dois pontos (:) seguidos do nome do símbolo.</p>

<p>Exemplo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="ss">:nome</span>
<span class="ss">:idade</span>
<span class="ss">:cidade</span>
</code></pre></div></div>

<h3 id="usando-simbolos-em-hashes">Usando símbolos em hashes</h3>
<hr />

<p>Os símbolos são frequentemente usados como chaves em hashes, pois são mais eficientes em termos de memória e desempenho do que strings.</p>

<p>Para criar um hash com símbolos como chaves, usamos a seguinte sintaxe (sintaxe é a forma de escrever algo):</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">estado_sp</span> <span class="o">=</span> <span class="ss">:SP</span>
<span class="n">estado_rj</span> <span class="o">=</span> <span class="ss">:RJ</span>

<span class="n">endereco</span> <span class="o">=</span> <span class="p">{</span>
  <span class="ss">rua:    </span><span class="s2">"Av. Paulista"</span><span class="p">,</span>
  <span class="ss">numero: </span><span class="mi">1000</span><span class="p">,</span>
  <span class="ss">cidade: </span><span class="s2">"São Paulo"</span><span class="p">,</span>
  <span class="ss">uf:     :SP</span>
<span class="p">}</span>
</code></pre></div></div>

<p>No exemplo anterior , as chaves do hash <code class="text-white-50 text-light">endereco</code> são símbolos (:rua, :numero, :cidade, :uf). Para acessar os valores do hash, usamos os símbolos como chaves:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">puts</span> <span class="n">endereco</span><span class="p">[</span><span class="ss">:rua</span><span class="p">]</span>      <span class="c1"># A saída será "Av. Paulista"</span>
<span class="nb">puts</span> <span class="n">endereco</span><span class="p">[</span><span class="ss">:numero</span><span class="p">]</span>   <span class="c1"># A saída será 1000</span>
<span class="nb">puts</span> <span class="n">endereco</span><span class="p">[</span><span class="ss">:cidade</span><span class="p">]</span>   <span class="c1"># A saída será "São Paulo"</span>
<span class="nb">puts</span> <span class="n">endereco</span><span class="p">[</span><span class="ss">:uf</span><span class="p">]</span>       <span class="c1"># A saída será :SP</span>
</code></pre></div></div>

<p>Em outras palavras, símbolos são como etiquetas que usamos para identificar coisas em nosso código. Eles são leves e rápidos, o que os torna ideais para uso em situações onde precisamos de muitos identificadores únicos, como em hashes.</p>

<h3 id="diferenca-entre-simbolos-e-strings">Diferença entre símbolos e strings</h3>
<hr />

<ul>
  <li>Use String quando quiser trabalhar com palavras, frases ou qualquer texto que será mostrado para uma pessoa ou usado como mensagem, campo de formulário etc.</li>
  <li>Use Symbol quando precisar de um nome fixo para identificar algo no seu código, como:
    <ul>
      <li>chaves em tabelas (hashes),</li>
      <li>nomes de opções,</li>
      <li>estados.</li>
    </ul>
  </li>
</ul>

<p>Símbolos são mais eficientes em termos de memória e desempenho do que strings, especialmente quando usados repetidamente como identificadores.</p>

<h2 id="conversao-entre-tipos-de-dados">Converção entre tipos de dados</h2>
<hr />

<p>Às vezes, precisamos converter um tipo de dado em outro. Por exemplo, podemos querer transformar uma string que representa um número em um número inteiro para fazer cálculos com ele.</p>

<p>Em Ruby, podemos fazer conversões entre tipos de dados usando métodos específicos.</p>

<h3 id="convertendo-strings-em-numeros">Convertendo strings em números</h3>
<hr />

<p>Para converter uma string em um número inteiro, usamos o método <code class="text-white-50 text-light">to_i</code>.</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numero_string</span> <span class="o">=</span> <span class="s2">"42"</span>
<span class="n">numero_inteiro</span> <span class="o">=</span> <span class="n">numero_string</span><span class="p">.</span><span class="nf">to_i</span>
<span class="nb">puts</span> <span class="n">numero_inteiro</span>    <span class="c1"># A saída será 42</span>
<span class="nb">puts</span> <span class="n">numero_inteiro</span><span class="p">.</span><span class="nf">class</span>   <span class="c1"># A saída será Integer</span>
</code></pre></div></div>

<p>Para converter uma string em um número com vírgula (float), usamos o método <code class="text-white-50 text-light">to_f</code>.</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numero_string</span> <span class="o">=</span> <span class="s2">"3.14"</span>
<span class="n">numero_float</span> <span class="o">=</span> <span class="n">numero_string</span><span class="p">.</span><span class="nf">to_f</span>
<span class="nb">puts</span> <span class="n">numero_float</span>    <span class="c1"># A saída será 3.14</span>
<span class="nb">puts</span> <span class="n">numero_float</span><span class="p">.</span><span class="nf">class</span>   <span class="c1"># A saída será Float</span>
</code></pre></div></div>

<h3 id="convertendo-numeros-em-strings">Convertendo números em strings</h3>
<hr />

<p>Para converter um número inteiro em uma string, usamos o método <code class="text-white-50 text-light">to_s</code>.</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numero_inteiro</span> <span class="o">=</span> <span class="mi">42</span>
<span class="n">numero_string</span> <span class="o">=</span> <span class="n">numero_inteiro</span><span class="p">.</span><span class="nf">to_s</span>
<span class="nb">puts</span> <span class="n">numero_string</span>    <span class="c1"># A saída será "42"</span>
<span class="nb">puts</span> <span class="n">numero_string</span><span class="p">.</span><span class="nf">class</span>   <span class="c1"># A saída será String</span>
</code></pre></div></div>

<p>Para converter um número com vírgula (float) em uma string, também usamos o método <code class="text-white-50 text-light">to_s</code>.</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numero_float</span> <span class="o">=</span> <span class="mf">3.14</span>
<span class="n">numero_string</span> <span class="o">=</span> <span class="n">numero_float</span><span class="p">.</span><span class="nf">to_s</span>
<span class="nb">puts</span> <span class="n">numero_string</span>    <span class="c1"># A saída será "3.14"</span>
<span class="nb">puts</span> <span class="n">numero_string</span><span class="p">.</span><span class="nf">class</span>   <span class="c1"># A saída será String</span>
</code></pre></div></div>

<h3 id="convertendo-strings-em-simbolos">Convertendo strings em símbolos</h3>
<hr />

<p>Para converter uma string em um símbolo, usamos o método <code class="text-white-50 text-light">to_sym</code>.</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">texto</span> <span class="o">=</span> <span class="s2">"nome"</span>
<span class="n">simbolo</span> <span class="o">=</span> <span class="n">texto</span><span class="p">.</span><span class="nf">to_sym</span>
<span class="nb">puts</span> <span class="n">simbolo</span>    <span class="c1"># A saída será :nome</span>
<span class="nb">puts</span> <span class="n">simbolo</span><span class="p">.</span><span class="nf">class</span>   <span class="c1"># A saída será Symbol</span>
</code></pre></div></div>

<h3 id="convertendo-simbolos-em-strings">Convertendo símbolos em strings</h3>
<hr />

<p>Para converter um símbolo em uma string, usamos o método <code class="text-white-50 text-light">to_s</code>.</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">simbolo</span> <span class="o">=</span> <span class="ss">:idade</span>
<span class="n">texto</span> <span class="o">=</span> <span class="n">simbolo</span><span class="p">.</span><span class="nf">to_s</span>
<span class="nb">puts</span> <span class="n">texto</span>    <span class="c1"># A saída será "idade"</span>
<span class="nb">puts</span> <span class="n">texto</span><span class="p">.</span><span class="nf">class</span>   <span class="c1"># A saída será String</span>
</code></pre></div></div>

<h2 id="resumo">Resumo</h2>
<hr />

<p>Neste artigo, aprofundamos nosso conhecimento sobre tipos de dados em Ruby, explorando conceitos fundamentais e características específicas de cada tipo.</p>

<p>Começamos entendendo <strong>conceitos importantes</strong> como objetos, classes, instâncias, métodos e variáveis, que são a base para compreender como Ruby trabalha com dados. Aprendemos que em Ruby tudo é objeto e que cada tipo de dado é representado por uma classe específica.</p>

<p>Exploramos os <strong>tipos numéricos</strong>:</p>
<ul>
  <li><strong>Integer</strong>: números inteiros (positivos, negativos e zero) com operações matemáticas e métodos como <code class="text-white-50 text-light">even?</code>, <code class="text-white-50 text-light">odd?</code>, <code class="text-white-50 text-light">abs</code></li>
  <li><strong>Float</strong>: números com vírgula (decimais) com métodos para arredondamento como <code class="text-white-50 text-light">round</code>, <code class="text-white-50 text-light">ceil</code> e <code class="text-white-50 text-light">floor</code></li>
</ul>

<p>Conhecemos os <strong>tipos textuais e simbólicos</strong>:</p>
<ul>
  <li><strong>String</strong>: textos que podem ser manipulados com métodos como <code class="text-white-50 text-light">upcase</code>, <code class="text-white-50 text-light">downcase</code>, <code class="text-white-50 text-light">length</code>, <code class="text-white-50 text-light">strip</code> e <code class="text-white-50 text-light">gsub</code>, além da interpolação de variáveis</li>
  <li><strong>Symbol</strong>: identificadores eficientes usados principalmente como chaves em hashes</li>
</ul>

<p>Vimos os <strong>tipos de coleção</strong>:</p>
<ul>
  <li><strong>Array</strong>: listas ordenadas de itens acessados por índices, com métodos como <code class="text-white-50 text-light">push</code>, <code class="text-white-50 text-light">pop</code>, <code class="text-white-50 text-light">length</code> e <code class="text-white-50 text-light">include?</code></li>
  <li><strong>Hash</strong>: tabelas de pares chave-valor para organizar dados relacionados, com métodos como <code class="text-white-50 text-light">keys</code>, <code class="text-white-50 text-light">values</code> e <code class="text-white-50 text-light">delete</code></li>
</ul>

<p>Entendemos os <strong>tipos lógicos</strong>:</p>
<ul>
  <li><strong>Boolean</strong>: valores <code class="text-white-50 text-light">true</code> e <code class="text-white-50 text-light">false</code> usados em condições e decisões</li>
  <li><strong>Operadores lógicos</strong>: AND (<code class="text-white-50 text-light">&amp;&amp;</code>), OR (<code class="text-white-50 text-light">||</code>) e NOT (<code class="text-white-50 text-light">!</code>) para combinar condições</li>
  <li><strong>NilClass</strong>: o valor especial <code class="text-white-50 text-light">nil</code> que representa ausência de valor</li>
</ul>

<p>Por fim, aprendemos sobre <strong>conversão entre tipos</strong>, usando métodos como <code class="text-white-50 text-light">to_i</code>, <code class="text-white-50 text-light">to_f</code>, <code class="text-white-50 text-light">to_s</code> e <code class="text-white-50 text-light">to_sym</code> para transformar dados de um tipo em outro conforme necessário.</p>

<p>Cada tipo de dado tem suas características, capacidades e limitações específicas. Apesar de parecer muita informação no começo, com a prática você se familiarizará com esses conceitos e saberá quando e como usar cada tipo de dado em seus programas Ruby.</p>]]></content><author><name>Louise Suelen</name></author><category term="Programação" /><category term="programação" /><category term="tecnologia" /><summary type="html"><![CDATA[Neste artigo, vamos explorar ainda mais sobre os tipos de dados em programação, o objetivo agora é entender a fundo cada tipo, suas características, capacidades e limitações.]]></summary></entry><entry xml:lang="pt-BR"><title type="html">Introdução à Programação: Tipos de Dados</title><link href="https://pcdnaescola.com.br/introducao-a-programacao-tipos-de-dados/" rel="alternate" type="text/html" title="Introdução à Programação: Tipos de Dados" /><published>2025-09-15T13:00:00+00:00</published><updated>2025-09-15T13:00:00+00:00</updated><id>https://pcdnaescola.com.br/introducao-a-programacao-tipos-de-dados</id><content type="html" xml:base="https://pcdnaescola.com.br/introducao-a-programacao-tipos-de-dados/"><![CDATA[<div class="text-center">
    <figure class="custom-figure text-center my-5">
    <div class="figure-container position-relative d-inline-block">
        <div class="image-wrapper position-relative overflow-hidden shadow-lg">

            <img class="img-fluid" src="https://ifrnead.github.io/rubynapratica/assets/images/tipos-dados.png" alt="" loading="lazy" aria-hidden="true" />

            <div class="image-overlay position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center" aria-hidden="true">
                <div class="text-center">
                    <i class="material-icons text-white fs-1 mb-3 zoom-icon" aria-hidden="true">zoom_in</i>
                    <p class="text-white small mb-0 zoom-text">Clique para ampliar</p>
                </div>
            </div>
        </div>

        <div class="figure-decoration position-absolute bottom-0 start-50 translate-middle-x" aria-hidden="true">
            <div class="bg-primary rounded-pill shadow-sm accent-bar"></div>
        </div>
    </div>

    
</figure>

</div>

<h2 id="apresentacao">Apresentação</h2>
<hr />

<p>Um programa de computador existe para resolver problemas do dia a dia, organizando tarefas e informações. Para isso, quem desenvolve o software divide o problema em partes menores e cria um passo a passo, chamado de algoritmo, que orienta o computador sobre o que fazer, sempre pensando em como usar bem o tempo e a memória.</p>

<p>No centro de tudo estão os tipos de dados, que funcionam como uma “tradução” das informações do nosso mundo para a linguagem do computador. Eles transformam textos, números, datas e respostas de sim ou não em formatos que a máquina entende, ou seja, sequências de zeros e uns, chamadas de bits. É graças aos tipos de dados que o computador sabe se está lidando com números inteiros, números com casas decimais, textos, listas, datas ou informações do tipo verdadeiro/falso.</p>

<p>Cada tipo de dado permite operações específicas: números podem ser somados, textos podem ser concatenados (juntos), listas podem ser pesquisadas. Além disso, cada tipo ocupa um espaço diferente na memória. Normalmente, quando o programa recebe dados, tudo chega como texto; depois, esses dados precisam ser transformados para o tipo certo antes de serem usados. Ao apresentar o resultado, o processo é invertido, convertendo os dados para formatos compreensíveis, como texto, tabelas ou outros formatos que as pessoas conhecem.</p>

<p>Sem tipos de dados, seria fácil confundir números com textos, datas ficariam fora de ordem e valores vazios poderiam causar erros. Por isso, os tipos de dados tornam o funcionamento interno do computador possível, mais seguro e eficiente.</p>

<p>Por dentro, o computador é feito de peças muito pequenas chamadas transistores, que só conseguem representar dois estados: ligado ou desligado, isto é, zero ou um. Toda a informação é guardada como sequências desses bits. Os tipos de dados indicam ao computador como interpretar essas sequências, se são números, letras, imagens ou outros tipos de informação.</p>

<p>O computador tem partes principais: a CPU (o “cérebro”), a memória (onde os dados ficam temporariamente), dispositivos de armazenamento (como disco rígido ou SSD) e os aparelhos para entrada e saída de dados (teclado, mouse, tela, impressora). A CPU lê os dados da memória, faz operações e devolve os resultados. O modo como os dados são organizados influencia a rapidez e exatidão do computador.</p>

<p>No software, usamos tipos de dados para organizar e proteger a informação, evitando erros e tornando o código mais fácil de entender. Por exemplo, ao criar um programa, decidimos que “idade” é um número inteiro positivo (porque não faz sentido ter idade negativa), “nome” é um texto, “lista de compras” é uma lista de textos, e assim por diante. Isso impede confusões e facilita futuras alterações no programa.</p>

<p><strong>Dica:</strong> É muito importante ler a série de artigos sobre <a href="https://pcdnaescola.com.br/artigos#categoria-computa%C3%A7%C3%A3o-para-iniciantes" target="_blank" rel="noopener noreferrer">Computação para Iniciantes</a> para entender melhor tudo que está sendo apresentado aqui.</p>

<h2 id="como-as-linguagens-de-programacao-lidam-com-tipos-de-dados">Como as linguagens de programação lidam com tipos de dados</h2>
<hr />

<p>Nas linguagens de programação, existem dois estilos principais:</p>

<ul>
  <li>
    <p><strong>Tipagem Estática</strong>: Neste caso, o computador confere os tipos de dados antes de executar o programa (ou seja, ele verifica quais dados serão inteiros, textos, listas e outros), ajudando a evitar erros logo no começo.</p>
  </li>
  <li>
    <p><strong>Tipagem Dinâmica</strong>: Aqui, o computador só verifica os tipos de dados enquanto o programa está funcionando, ou seja, durante a execução. Isso quer dizer que os tipos podem mudar conforme o programa vai sendo executado, oferecendo mais flexibilidade, porém com maior risco de erros.</p>
  </li>
</ul>

<p>Algumas linguagens obrigam à conversão entre tipos; outras são mais flexíveis, mas podem causar erros inesperados.</p>

<ul>
  <li><strong>Exemplos de linguagens com tipagem estática</strong>:
    <ul>
      <li>C</li>
      <li>C++</li>
      <li>Java</li>
      <li>Rust</li>
      <li>Go</li>
      <li>TypeScript</li>
    </ul>
  </li>
  <li><strong>Exemplos de linguagens com tipagem dinâmica</strong>:
    <ul>
      <li>Python</li>
      <li>Ruby</li>
      <li>JavaScript</li>
      <li>PHP</li>
    </ul>
  </li>
</ul>

<p>Critérios como desempenho, segurança e facilidade de uso influenciam a escolha entre tipagem estática e dinâmica. Cada abordagem tem suas vantagens e desvantagens, e a escolha depende do tipo de projeto e das necessidades específicas.</p>

<h3 id="tipos-de-dados-em-ruby">Tipos de dados em Ruby</h3>
<hr />

<p>Ruby é uma linguagem de programação que funciona de forma dinâmica e baseada em objetos. Isso quer dizer que, quando você usa Ruby, tudo é considerado um objeto. Além disso, você não precisa se preocupar em dizer qual é o tipo de dado de cada coisa, porque o próprio Ruby descobre isso automaticamente, de acordo com o valor que você coloca.</p>

<p>Por exemplo:</p>

<ul>
  <li>Se você escreve <code class="text-white-50 text-light">idade = 25</code>, o Ruby entende que “idade” é um número inteiro.</li>
  <li>Se você escreve <code class="text-white-50 text-light">nome = "Ana"</code>, o Ruby entende que “nome” é um texto.</li>
  <li>Se você escreve <code class="text-white-50 text-light">altura = 1.75</code>, o Ruby entende que “altura” é um número com casas decimais.</li>
</ul>

<p>Veja os tipos de dados que mais aparecem em Ruby:</p>

<ul>
  <li>
    <p><strong>Números Inteiros (Integer)</strong>: São números sem parte decimal. Podem ser positivos ou negativos, como <code class="text-white-50 text-light">42</code> e <code class="text-white-50 text-light">-7</code>. Eles servem para contagens e cálculos que não precisam de parte decimal (parte decimal é a parte do número que vem depois do ponto ou vírgula).</p>
  </li>
  <li>
    <p><strong>Números com vírgula (Float ou Ponto Flutuante)</strong>: Permitem guardar números com vírgula, como <code class="text-white-50 text-light">3.14</code> e <code class="text-white-50 text-light">-1.001</code>. São úteis para medidas e valores que não são inteiros (que têm parte decimal), como <code class="text-white-50 text-light">2.000123</code>, <code class="text-white-50 text-light">123.0</code> e <code class="text-white-50 text-light">15.75</code>.</p>

    <p><strong>Por que chamam de “ponto flutuante”?</strong> Imagine que o computador guarda esses números como se fossem peças de lego que podem deslizar para a esquerda ou para a direita, conforme o tamanho do número. Por exemplo, para guardar <code class="text-white-50 text-light">0.000123</code>, ele “empurra” a vírgula (ou ponto) para frente até virar <code class="text-white-50 text-light">1.23</code>, lembrando depois quantos espaços empurrou. Assim, o lugar da vírgula (ou ponto) pode “flutuar” (mudar de posição), por isso o nome “ponto flutuante” ou “float”.</p>

    <p><strong>Na prática:</strong> Por causa desse jeito de guardar os números, às vezes as contas dão resultados com pequenas diferenças, como quando tentamos somar <code class="text-white-50 text-light">0.1 + 0.2</code> e o resultado aparece como <code class="text-white-50 text-light">0.30000000000000004</code>. Isso é normal e acontece em todos os computadores porque eles nem sempre conseguem representar todos os números decimais com perfeição. Por isso é importante estar atento a essas pequenas diferenças ao trabalhar com números de ponto flutuante, pois se precisamos de muita precisão, como em cálculos financeiros, devemos usar outras técnicas ou bibliotecas específicas para evitar esses erros.</p>
  </li>
  <li>
    <p><strong>Textos (Strings):</strong> São textos, ou seja, uma sequência de letras, números ou símbolos que não servem para cálculos e sim para representar informações. Exemplos: <code class="text-white-50 text-light">"Olá, Mundo!"</code> e <code class="text-white-50 text-light">"12345"</code>. Usamos strings (texto) para guardar nomes, frases e qualquer informação textual.</p>
  </li>
  <li>
    <p><strong>Verdadeiro ou falso (Boolean ou Booleano)</strong>: Neste tipo de dado só existem duas opções possíveis: verdadeiro (<code class="text-white-50 text-light">true</code>) ou falso (<code class="text-white-50 text-light">false</code>). Ideais para tomar decisões no código quando estiver programando.</p>
  </li>
</ul>

<p><strong>Uma aplicação prática dos booleanos:</strong> Imagine que você está criando um programa e nesse programa existe uma área só para pessoas cadastradas. Para permitir o acesso, você pode usar um booleano para verificar se a pessoa está cadastrada ou não. Se estiver cadastrada, o valor será <code class="text-white-50 text-light">true</code> (verdadeiro) e ela poderá entrar e acessar; se não estiver cadastrada, o valor será <code class="text-white-50 text-light">false</code> (falso) e o acesso será negado podendo exibir uma mensagem como “Acesso negado” ou “você não possui cadastro”. Assim, os booleanos ajudam a controlar o fluxo do programa com base em condições simples de verdadeiro ou falso.</p>

<ul>
  <li><strong>Listas (Arrays)</strong>: São listas que guardam vários valores juntos, como <code class="text-white-50 text-light">[1, 2, 3]</code> ou <code class="text-white-50 text-light">["maçã", "banana", "laranja"]</code>. Ajudam a organizar dados em sequência.</li>
</ul>

<p>O ideal é que os dados dentro de um array tenham relação entre si, ou seja, que façam parte do mesmo grupo ou categoria. Por exemplo, uma lista de frutas, uma lista de números inteiros ou uma lista de nomes de pessoas. Isso facilita o uso e a manipulação dos dados dentro do array.</p>

<ul>
  <li><strong>Tabelas de pares (Hashes)</strong>: Este tipo de dado guarda pares de informações, onde nós temos uma chave e um valor associado a essa chave. Por exemplo: <code class="text-white-50 text-light">{ "nome" =&gt; "João", "idade" =&gt; 30 }</code>. Aqui, “nome” e “idade” são as chaves, e “João” e 30 são os valores correspondentes. Hashes facilitam encontrar um valor usando a chave.</li>
</ul>

<p><strong>Entendendo melhor:</strong> Pense em um hash como uma mini agenda ou dicionário, onde você tem uma palavra (chave) e a definição ou informação relacionada a essa palavra (valor). Você pode procurar o valor usando a chave, assim como você procura o significado de uma palavra no dicionário. Por exemplo, em um hash que guarda informações de uma pessoa, você pode ter a chave <code class="text-white-50 text-light">"nome"</code> com o valor <code class="text-white-50 text-light">"Ana"</code>, e a chave <code class="text-white-50 text-light">"idade"</code> com o valor <code class="text-white-50 text-light">25</code>, além de outras informações como <code class="text-white-50 text-light">"cidade"</code> com o valor <code class="text-white-50 text-light">"São Paulo"</code>.</p>

<ul>
  <li><strong>Nada (Nil)</strong>: Mostra que não tem valor nenhum ali, está vazio. <code class="text-white-50 text-light">nil</code> significa “não tem nada”, não é a mesma coisa que zero ou um espaço em branco no texto.</li>
</ul>

<p><strong>Por que isso é importante:</strong> É preciso sempre lembrar que o computador não sabe de nada por conta própria, tudo precisa ser dito para ele, ele deve ser orientado porque ele não deduz, não advinha e não tem senso comum como nós humanos temos. Então assim como precisamos informar alguma informação, também precisamos informar quando não existe informação nenhuma.</p>

<ul>
  <li><strong>Símbolos (Symbols)</strong>: São parecidos com textos, mas são usados para representar nomes e servem para identificar coisas de forma única no código, coisas que não vão mudar. Siglas de Estados do Brasil, por exemplo, são bons usos para símbolos, como <code class="text-white-50 text-light">:SP</code> para São Paulo e <code class="text-white-50 text-light">:RJ</code> para Rio de Janeiro, pois essas siglas não mudam ou mudam muito dificilmente.</li>
</ul>

<h2 id="onde-as-informacoes-sao-guardadas">Onde as informações são guardadas?</h2>
<hr />

<p>Já vimos que os tipos de dados classificam as informações que usamos em nossos programas, mas onde essas informações são realmente guardadas? Como acontece essa classificação?</p>

<p>As informações nos programas são guardadas em variáveis. Variáveis são como “caixinhas” onde colocamos os dados que queremos usar. Cada variável tem um nome, e esse nome ajuda a identificar o que está guardado ali.</p>

<p>É a variável que vai ter o tipo de dado que a informação representa, seja um número, um texto, uma lista ou outro tipo.</p>

<p>Por exemplo, quando escrevemos:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">idade</span> <span class="o">=</span> <span class="mi">25</span>
<span class="n">nome</span> <span class="o">=</span> <span class="s2">"Ana"</span>
<span class="n">altura</span> <span class="o">=</span> <span class="mf">1.75</span>
</code></pre></div></div>

<p>Aqui o Ruby está criando três variáveis: “idade”, “nome” e “altura”. O Ruby automaticamente reconhece que “idade” é um número inteiro, “nome” é um texto e “altura” é um número com vírgula, pois lembrando que Ruby é uma linguagem de tipagem dinâmica, então ele identifica o tipo de dado com base no valor que colocamos na variável, neste caso 25, “Ana” e 1.75.</p>

<h3 id="por-que-precisamos-usar-variaveis">Por que precisamos usar variáveis?</h3>
<hr />

<p>Usar variáveis é muito importante para criar programas. Sem variáveis, seria como tentar fazer contas sem anotar os números, ou seja, tudo teria que ser feito de uma vez só, o que deixaria o código difícil de entender e de arrumar depois.</p>

<p>As variáveis servem para guardar informações na memória do computador enquanto o programa está funcionando. Assim, você pode ler, mudar ou usar esses valores quantas vezes quiser.</p>

<p>Cada variável ocupa um lugar na memória, que tem um número próprio (um endereço de memória como por exemplo 0x7ffee4bff6c8). Mas, em vez de decorar esses números, a gente dá nomes para as variáveis, como idade ou nome, tornando tudo mais fácil de entender.</p>

<p>Por exemplo, quando você escreve:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">idade</span> <span class="o">=</span> <span class="mi">25</span>
</code></pre></div></div>

<p>No Ruby, isso cria uma variável chamada idade e coloca nela o número 25. Esse valor fica guardado na memória. Depois, toda vez que você usar idade no programa, o Ruby vai buscar o número 25 que está guardado nesse lugar.</p>

<p>Por baixo dos panos, o Ruby busca o número 25 da variável idade em um endereço de memória específico que se parece com 0x7ffee4bff6c8, mas você não precisa se preocupar com isso, pois o Ruby cuida dessa parte para você.</p>

<h3 id="a-relacao-entre-nome-e-valor">A relação entre nome e valor</h3>
<hr />

<p>Em programação, uma variável funciona como um nome que damos para guardar alguma informação na memória do computador. Por exemplo, se criamos uma variável chamada “idade”, esse nome está ligado a um valor, como 25. Ou seja, “idade” é só o jeito de identificar e acessar esse valor que está guardado (o 25 nesse caso).</p>

<p>No computador, tudo isso acontece usando endereços de memória, que são como locais onde os dados ficam armazenados. Em linguagens como C e C++, dá para ver e trabalhar nesses endereços diretamente usando algo chamado ponteiro. Um ponteiro é uma variável especial que, em vez de guardar um valor como um número ou texto, guarda o endereço de outro valor na memória.</p>

<p>Isso mostra que, no final das contas, toda variável aponta para um lugar específico onde a informação está guardada. Já em linguagens mais novas, como Ruby ou Python, o próprio programa cuida de guardar, acessar e apagar esses valores na memória automaticamente. Assim, quem está programando não precisa se preocupar em controlar esses endereços diretamente, pois tudo é feito de forma simples e automática.</p>

<h3 id="possibilidade-de-usar-varias-vezes-a-variavel">Possibilidade de usar várias vezes a variável</h3>
<hr />

<p>As variáveis não servem só para guardar informações, mas também ajudam a deixar o código mais fácil de entender e reaproveitar. Em vez de escrever sempre os mesmos números ou nomes várias vezes no programa, você pode colocar esses valores em variáveis e usar quando precisar.</p>

<p>Por exemplo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">preco</span> <span class="o">=</span> <span class="mi">50</span> 
<span class="n">desconto</span> <span class="o">=</span> <span class="mf">0.1</span> 
<span class="n">preco_final</span> <span class="o">=</span> <span class="n">preco</span> <span class="o">-</span> <span class="p">(</span><span class="n">preco</span> <span class="o">*</span> <span class="n">desconto</span><span class="p">)</span>
</code></pre></div></div>

<p>Explicando linha por linha:</p>

<ul>
  <li>Na primeira linha, criamos uma variável chamada preco (que significa o preço de um produto) e colocamos nela o valor 50.</li>
  <li>Na segunda linha, criamos outra variável chamada desconto e colocamos nela o valor 0.1 (que representa 10% de desconto).</li>
  <li>Na terceira linha, criamos uma variável chamada preco_final (preço final) que calcula o preço final do produto aplicando o desconto.</li>
  <li><code class="text-white-50 text-light">preco - (preco * desconto)</code> significa que estamos pegando o valor do preço (que é 50) e subtraindo (fazendo uma conta de menos) o valor do desconto (que é 10% de 50, que vai dar 5). O resultado final será 45 e vai ser guardado na variável preco_final.</li>
</ul>

<p>A vantagem de usar variáveis é que, se você quiser mudar o preço ou o desconto, basta alterar o valor na variável uma vez só, e o resto do código vai funcionar corretamente sem precisar mudar nada mais nos cálculos ou em qualquer lugar no código onde essas variáveis são usadas. Isso torna o código mais fácil de manter e entender.</p>

<p>Além disso, fica simples saber o que cada valor significa, porque os nomes das variáveis ajudam a explicar o que está sendo guardado ali. Isso é diferente do que se tivessemos só os números soltos no código, que podem ser confusos e não explicam nada sobre o que cada um representa.</p>

<h3 id="por-que-nao-pode-usar-espacos-acentos-ou-simbolos-nos-nomes-das-variaveis">Por que não pode usar espaços, acentos ou símbolos nos nomes das variáveis?</h3>
<hr />

<p>Quando escrevemos código, o que parece ser apenas “texto comum” para a gente, na verdade é um monte de comandos que o computador precisa transformar em algo que ele entende. Quem faz essa transformação é um programa chamado interpretador (como no Ruby) ou compilador (em linguagens como C, Java, Go, entre outras).</p>

<p>Esses programas seguem regras bem certinhas, chamadas de gramática da linguagem (ou sintaxe), que dizem exatamente o que pode ou não pode ser usado. Por isso, o nome de uma variável, também chamado de identificador, precisa seguir essas regras para que o computador saiba onde ele começa e termina.</p>

<p>Por exemplo, se você tentar escrever:</p>
<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">idade</span> <span class="n">da</span> <span class="n">pessoa</span> <span class="o">=</span> <span class="mi">25</span> 
</code></pre></div></div>

<p>O Ruby não vai entender “idade da pessoa” como um nome só. O espaço faz ele pensar que “idade” é uma coisa, “da” é outra e “pessoa” outra, e aí dá erro porque ele entende que são três coisas diferentes tentando receber um valor só.</p>

<p>Isso também vale para acentos (tipo á, é, ç) e símbolos (@, #, !, -, ? etc.), porque esses sinais já têm funções próprias na linguagem.</p>

<p>Por isso, o interpretador não deixa usar esses caracteres nos nomes das variáveis, evitando confusão na hora de entender o código.</p>

<h3 id="uso-do-sublinhado-e-do-traco">Uso do sublinhado (_) e do traço (-)</h3>
<hr />

<p>Para separar palavras nos nomes das variáveis e deixar o código mais fácil de ler, foram criadas algumas formas padrão. O sublinhado (_) é muito usado porque a maioria das linguagens de programação aceita ele e normalmente ele não serve para outra coisa.</p>

<p>Exemplo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">idade_da_pessoa</span> <span class="o">=</span> <span class="mi">25</span>
<span class="n">nome_do_aluno</span> <span class="o">=</span> <span class="s2">"João"</span>
</code></pre></div></div>

<p>Assim, o interpretador entende que se trata de um nome só, mesmo tendo várias palavras.</p>

<p>Esse jeito de escrever nomes com sublinhado é chamado de <strong>snake_case</strong> (caso da cobra), porque lembra o formato de uma cobra se arrastando.</p>

<p>O traço (-), por outro lado, não é usado em nomes de variáveis na maioria das linguagens de programação, porque ele já tem outra função: representar a operação de subtração (de tirar um número do outro).</p>

<p>Exemplo:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">idade</span><span class="o">-</span><span class="n">da</span><span class="o">-</span><span class="n">pessoa</span> <span class="o">=</span> <span class="mi">25</span>
</code></pre></div></div>

<p>pode dar erro ou confusão. O traço só é usado em situações específicas, como nomes de arquivos (<code class="text-white-50 text-light">minha-imagem.png</code>) ou <code class="text-white-50 text-light">meu-arquivo.rb</code>.</p>

<p>Linguagens de programação como o <strong>Clojure</strong> permitem o uso do traço (hífen) em nomes de variáveis, mas isso é uma exceção e não a regra geral.</p>

<h3 id="jeitos-de-escrever-nomes-convencoes-de-nomenclatura">Jeitos de escrever nomes (convenções de nomenclatura)</h3>
<hr />

<p>Com o tempo, surgiram vários padrões para deixar o código mais organizado e fácil de entender. Os mais comuns são:</p>

<ul>
  <li><strong>snake_case</strong>: Usado em linguagens como Ruby, Python e C, utiliza o sublinhado (_) para separar as palavras.
    <ul>
      <li>Exemplo: <code class="text-white-50 text-light">idade_da_pessoa</code>, <code class="text-white-50 text-light">total_de_compras</code>.</li>
    </ul>
  </li>
  <li><strong>camelCase</strong>: Usado em linguagens como JavaScript, Java e C#, a primeira palavra começa com letra minúscula e as seguintes começam com letra maiúscula, sem espaços ou sublinhados.
    <ul>
      <li>Exemplo: <code class="text-white-50 text-light">idadeDaPessoa</code>, <code class="text-white-50 text-light">totalDeCompras</code>.</li>
    </ul>
  </li>
  <li><strong>PascalCase</strong>: Utilizado para nomes de classes e módulos, todas as palavras começam com letra maiúscula, sem espaços ou sublinhados.
    <ul>
      <li>Exemplo: <code class="text-white-50 text-light">PessoaCliente</code>, <code class="text-white-50 text-light">ContaBancaria</code>.</li>
    </ul>
  </li>
  <li><strong>kebab-case</strong>: Usa o traço (-) para separar as palavras. É comum em HTML, CSS e nomes de arquivos.
    <ul>
      <li>Exemplo: <code class="text-white-50 text-light">botao-enviar</code>, <code class="text-white-50 text-light">pagina-principal</code>.</li>
    </ul>
  </li>
</ul>

<p>Esses jeitos não são obrigatórios pelo interpretador, mas são boas práticas que as pessoas desenvolvedoras seguem para manter o código organizado e fácil de entender por outras pessoas (ou por elas mesmas no futuro). Seguir essas convenções ajuda a evitar confusões e torna o trabalho em equipe mais eficiente.</p>

<h2 id="praticando-os-tipos-de-dados-no-irb">Praticando os tipos de dados no IRB</h2>
<hr />

<p>Para tornar mais palpável (concreto e real) o que vimos até agora, vamos usar o IRB (Interactive Ruby) para experimentar os tipos de dados com as variáveis.</p>

<p>Vamos criar algumas variáveis:</p>

<ul>
  <li>nome_aluno = “Ana”</li>
  <li>idade_aluno = 10</li>
  <li>turma = “5º ano”</li>
  <li>nota_1 = 8.5</li>
  <li>nota_2 = 9.0</li>
  <li>nota_3 = 7.5</li>
  <li>nota_final = (nota_1 + nota_2 + nota_3) / 3</li>
</ul>

<p>E depois vamos mostrar na tela a mensagem com as informações do aluno. Esse processo no IRB ficaria assim:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">013</span><span class="o">&gt;</span> <span class="n">nome_aluno</span> <span class="o">=</span> <span class="s2">"Ana"</span>
<span class="o">=&gt;</span> <span class="s2">"Ana"</span>
<span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">014</span><span class="o">&gt;</span> <span class="n">idade_aluno</span> <span class="o">=</span> <span class="mi">10</span>
<span class="o">=&gt;</span> <span class="mi">10</span>
<span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">015</span><span class="o">&gt;</span> <span class="n">turma</span> <span class="o">=</span> <span class="s2">"5º ano B"</span>
<span class="o">=&gt;</span> <span class="s2">"5º ano B"</span>
<span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">016</span><span class="o">&gt;</span> <span class="n">nota_1</span> <span class="o">=</span> <span class="mf">8.5</span>
<span class="o">=&gt;</span> <span class="mf">8.5</span>
<span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">017</span><span class="o">&gt;</span> <span class="n">nota_2</span> <span class="o">=</span> <span class="mf">9.0</span>
<span class="o">=&gt;</span> <span class="mf">9.0</span>
<span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">01</span><span class="mi">8</span><span class="o">&gt;</span> <span class="n">nota_3</span> <span class="o">=</span> <span class="mf">7.5</span>
<span class="o">=&gt;</span> <span class="mf">7.5</span>
<span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">01</span><span class="mi">9</span><span class="o">&gt;</span> <span class="n">nota_final</span> <span class="o">=</span> <span class="p">(</span><span class="n">nota_1</span> <span class="o">+</span> <span class="n">nota_2</span> <span class="o">+</span> <span class="n">nota_3</span><span class="p">)</span> <span class="o">/</span> <span class="mi">3</span>
<span class="o">=&gt;</span> <span class="mf">8.333333333333334</span>
<span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">020</span><span class="o">&gt;</span> <span class="nb">puts</span> <span class="s2">"O aluno (a) </span><span class="si">#{</span><span class="n">nome_aluno</span><span class="si">}</span><span class="s2">, de </span><span class="si">#{</span><span class="n">idade_aluno</span><span class="si">}</span><span class="s2"> anos, da turma </span><span class="si">#{</span><span class="n">turma</span><span class="si">}</span><span class="s2">, teve a nota final </span><span class="si">#{</span><span class="n">nota_final</span><span class="p">.</span><span class="nf">round</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="si">}</span><span class="s2">."</span>
<span class="no">O</span> <span class="n">aluno</span> <span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="no">Ana</span><span class="p">,</span> <span class="n">de</span> <span class="mi">10</span> <span class="n">anos</span><span class="p">,</span> <span class="n">da</span> <span class="n">turma</span> <span class="mi">5</span><span class="n">º</span> <span class="n">ano</span> <span class="no">B</span><span class="p">,</span> <span class="n">teve</span> <span class="n">a</span> <span class="n">nota</span> <span class="n">final</span> <span class="mf">8.3</span><span class="p">.</span>
<span class="nf">=</span><span class="o">&gt;</span> <span class="kp">nil</span>
<span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">021</span><span class="o">&gt;</span> 
</code></pre></div></div>

<p>Explicando linha por linha do que foi feito no IRB:</p>

<ul>
  <li><code class="text-white-50 text-light">irb(main):013&gt; nome_aluno = "Ana"</code>
    <ul>
      <li>Criamos uma variável chamada <code class="text-white-50 text-light">nome_aluno</code> e colocamos nela o texto <code class="text-white-50 text-light">"Ana"</code>.</li>
    </ul>
  </li>
  <li><code class="text-white-50 text-light">irb(main):014&gt; idade_aluno = 10</code>
    <ul>
      <li>Criamos uma variável chamada <code class="text-white-50 text-light">idade_aluno</code> e colocamos nela o número <code class="text-white-50 text-light">10</code>.</li>
    </ul>
  </li>
  <li><code class="text-white-50 text-light">irb(main):015&gt; turma = "5º ano B"</code>
    <ul>
      <li>Criamos uma variável chamada <code class="text-white-50 text-light">turma</code> e colocamos nela o texto <code class="text-white-50 text-light">"5º ano B"</code>.</li>
    </ul>
  </li>
  <li><code class="text-white-50 text-light">irb(main):016&gt; nota_1 = 8.5</code>
    <ul>
      <li>Criamos uma variável chamada <code class="text-white-50 text-light">nota_1</code> e colocamos nela o número <code class="text-white-50 text-light">8.5</code>.</li>
    </ul>
  </li>
  <li><code class="text-white-50 text-light">irb(main):017&gt; nota_2 = 9.0</code>
    <ul>
      <li>Criamos uma variável chamada <code class="text-white-50 text-light">nota_2</code> e colocamos nela o número <code class="text-white-50 text-light">9.0</code>.</li>
    </ul>
  </li>
  <li><code class="text-white-50 text-light">irb(main):018&gt; nota_3 = 7.5</code>
    <ul>
      <li>Criamos uma variável chamada <code class="text-white-50 text-light">nota_3</code> e colocamos nela o número <code class="text-white-50 text-light">7.5</code>.</li>
    </ul>
  </li>
  <li><code class="text-white-50 text-light">irb(main):019&gt; nota_final = (nota_1 + nota_2 + nota_3) / 3</code>
    <ul>
      <li>Criamos uma variável chamada <code class="text-white-50 text-light">nota_final</code> que calcula a média das três notas somando <code class="text-white-50 text-light">nota_1</code> + <code class="text-white-50 text-light">nota_2</code> + <code class="text-white-50 text-light">nota_3</code> e dividindo o resultado por 3.</li>
    </ul>
  </li>
  <li><code class="text-white-50 text-light">irb(main):020&gt; puts "O aluno (a) #{nome_aluno}, de #{idade_aluno} anos, da turma #{turma}, teve a nota final #{nota_final.round(1)}."</code>
    <ul>
      <li>Aqui usamos o comando <code class="text-white-50 text-light">puts</code> para mostrar na tela uma mensagem que inclui o nome do aluno, a idade, a turma e a nota final arredondada para uma casa decimal.</li>
      <li><code class="text-white-50 text-light">"O aluno (a)</code> é o texto fixo que aparece na mensagem.</li>
      <li><code class="text-white-50 text-light">#{nome_aluno}</code> insere o valor da variável <code class="text-white-50 text-light">nome_aluno</code> na mensagem onde o <code class="text-white-50 text-light">#</code> serve para indicar que queremos colocar o valor da variável ali.</li>
      <li><code class="text-white-50 text-light">de #{idade_aluno} anos</code> insere o valor da variável <code class="text-white-50 text-light">idade_aluno</code>.</li>
      <li><code class="text-white-50 text-light">da turma #{turma}</code> insere o valor da variável <code class="text-white-50 text-light">turma</code>.</li>
      <li><code class="text-white-50 text-light">teve a nota final #{nota_final.round(1)}</code> quer dizer que vamos mostrar o valor da variável <code class="text-white-50 text-light">nota_final</code>, mas o <code class="text-white-50 text-light">.round(1)</code> serve para indicar que queremos arredondar (aproximar) esse número para uma casa decimal só (por exemplo, 8.3333 vira 8.3).</li>
      <li>Se a gente quisesse mostrar a nota final sem arredondar, poderíamos usar só <code class="text-white-50 text-light">#{nota_final}</code>, ou se quissesse arredondar para três casas decimais, usaríamos <code class="text-white-50 text-light">#{nota_final.round(3)}</code>.</li>
      <li>O resultado que aparece na tela é: <code class="text-white-50 text-light">O aluno (a) Ana, de 10 anos, da turma 5º ano B, teve a nota final 8.3.</code></li>
    </ul>
  </li>
</ul>

<h3 id="trabalhando-com-verdadeiro-ou-falso-booleanos-no-irb">Trabalhando com verdadeiro ou falso (booleanos) no IRB</h3>
<hr />

<p>Agora vamos ver como trabalhar com o tipo de dado booleano (verdadeiro ou falso) no IRB. Vamos criar uma variável que indica se o aluno foi aprovado ou não, considerando que a nota mínima para aprovação é 7.0.</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">021</span><span class="o">&gt;</span> <span class="n">nota_minima</span> <span class="o">=</span> <span class="mf">7.0</span>
<span class="o">=&gt;</span> <span class="mf">7.0</span>
</code></pre></div></div>

<p>Agora vamos criar uma variável chamada <code class="text-white-50 text-light">aprovado</code> que vai guardar um valor booleano (true ou false que é verdadeiro ou falso em inglês) dependendo se a <code class="text-white-50 text-light">nota_final</code> é maior ou igual à <code class="text-white-50 text-light">nota_minima</code>.</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">022</span><span class="o">&gt;</span> <span class="n">aprovado</span> <span class="o">=</span> <span class="n">nota_final</span> <span class="o">&gt;=</span> <span class="n">nota_minima</span>
<span class="o">=&gt;</span> <span class="kp">true</span>
</code></pre></div></div>

<p>Aqui, usamos o operador de comparação <code class="text-white-50 text-light">&gt;=</code> que significa “maior ou igual a”. Se a <code class="text-white-50 text-light">nota_final</code> for maior ou igual à <code class="text-white-50 text-light">nota_minima</code>, a variável <code class="text-white-50 text-light">aprovado</code> vai receber o valor <code class="text-white-50 text-light">true</code> (verdadeiro); caso contrário, vai receber <code class="text-white-50 text-light">false</code> (falso).</p>

<p>Neste caso, como a <code class="text-white-50 text-light">nota_final</code> é 8.3, que é maior que 7.0, a variável <code class="text-white-50 text-light">aprovado</code> recebe <code class="text-white-50 text-light">true</code> porque 8.3 é maior que 7.0.</p>

<p>Agora vamos mudar as notas para ver o que acontece quando o aluno não é aprovado. Vamos definir novas notas:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">023</span><span class="o">&gt;</span> <span class="n">nota_1</span> <span class="o">=</span> <span class="mf">4.5</span>
<span class="o">=&gt;</span> <span class="mf">4.5</span>
<span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">024</span><span class="o">&gt;</span> <span class="n">nota_2</span> <span class="o">=</span> <span class="mf">2.3</span>
<span class="o">=&gt;</span> <span class="mf">2.3</span>
<span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">025</span><span class="o">&gt;</span> <span class="n">nota_3</span> <span class="o">=</span> <span class="mf">1.2</span>
<span class="o">=&gt;</span> <span class="mf">1.2</span>
<span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">026</span><span class="o">&gt;</span> <span class="n">nota_final</span> <span class="o">=</span> <span class="p">(</span><span class="n">nota_1</span> <span class="o">+</span> <span class="n">nota_2</span> <span class="o">+</span> <span class="n">nota_3</span><span class="p">)</span> <span class="o">/</span> <span class="mi">3</span>
<span class="o">=&gt;</span> <span class="mf">2.6666666666666665</span>
<span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">027</span><span class="o">&gt;</span> <span class="nb">puts</span> <span class="s2">"O aluno (a) </span><span class="si">#{</span><span class="n">nome_aluno</span><span class="si">}</span><span class="s2">, de </span><span class="si">#{</span><span class="n">idade_aluno</span><span class="si">}</span><span class="s2"> anos, da turma </span><span class="si">#{</span><span class="n">turma</span><span class="si">}</span><span class="s2">, teve a nota final </span><span class="si">#{</span><span class="n">nota_final</span><span class="p">.</span><span class="nf">round</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="si">}</span><span class="s2">."</span>
<span class="no">O</span> <span class="n">aluno</span> <span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="no">Ana</span><span class="p">,</span> <span class="n">de</span> <span class="mi">10</span> <span class="n">anos</span><span class="p">,</span> <span class="n">da</span> <span class="n">turma</span> <span class="mi">5</span><span class="n">º</span> <span class="n">ano</span> <span class="no">B</span><span class="p">,</span> <span class="n">teve</span> <span class="n">a</span> <span class="n">nota</span> <span class="n">final</span> <span class="mf">2.7</span><span class="p">.</span>
<span class="nf">=</span><span class="o">&gt;</span> <span class="kp">nil</span>
<span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">02</span><span class="mi">8</span><span class="o">&gt;</span> <span class="n">aprovado</span> <span class="o">=</span> <span class="n">nota_final</span> <span class="o">&gt;=</span> <span class="n">nota_minima</span>
<span class="o">=&gt;</span> <span class="kp">false</span>
</code></pre></div></div>

<p>Aqui, depois de mudar as notas para valores mais baixos, a <code class="text-white-50 text-light">nota_final</code> ficou em 2.7, que é menor que a <code class="text-white-50 text-light">nota_minima</code> de 7.0. Por isso, quando verificamos se o aluno está aprovado com a linha <code class="text-white-50 text-light">aprovado = nota_final &gt;= nota_minima</code>, a variável <code class="text-white-50 text-light">aprovado</code> recebe o valor <code class="text-white-50 text-light">false</code> (falso), indicando que o aluno não foi aprovado.</p>

<h2 id="colocando-isso-em-um-programa-fora-do-irb">Colocando isso em um programa fora do IRB</h2>
<hr />

<p>Para gerar um histórico do que está sendo feito no IRB, podemos criar um arquivo chamado <code class="text-white-50 text-light">aula_tipos_dados.rb</code> e colocar todo o código que usamos no IRB lá dentro. Essa aula pode ficar na pasta <code class="text-white-50 text-light">projeto-ruby</code> que criamos anteriormente para colocar o programa <code class="text-white-50 text-light">ola_mundo.rb</code>.</p>

<p>Vamos criar o arquivo <code class="text-white-50 text-light">aula_tipos_dados.rb</code> com o comando:</p>

<div class="language-bash bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">touch </span>aula_tipos_dados.rb
</code></pre></div></div>

<p>Agora que temos o arquivo criado, vamos abrir ele no VS Code com o comando:</p>

<div class="language-bash bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code>code aula_tipos_dados.rb
</code></pre></div></div>

<p>Dentro do arquivo <code class="text-white-50 text-light">aula_tipos_dados.rb</code>, vamos colocar o seguinte código:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">nome_aluno</span> <span class="o">=</span> <span class="s2">"Ana"</span>
<span class="n">idade_aluno</span> <span class="o">=</span> <span class="mi">10</span>
<span class="n">turma</span> <span class="o">=</span> <span class="s2">"5º ano B"</span>
<span class="n">nota_1</span> <span class="o">=</span> <span class="mf">8.5</span>
<span class="n">nota_2</span> <span class="o">=</span> <span class="mf">9.0</span>
<span class="n">nota_3</span> <span class="o">=</span> <span class="mf">7.5</span>
<span class="n">nota_minima</span> <span class="o">=</span> <span class="mf">7.0</span>
<span class="n">nota_final</span> <span class="o">=</span> <span class="p">(</span><span class="n">nota_1</span> <span class="o">+</span> <span class="n">nota_2</span> <span class="o">+</span> <span class="n">nota_3</span><span class="p">)</span> <span class="o">/</span> <span class="mi">3</span>

<span class="nb">puts</span> <span class="s2">"O aluno (a) </span><span class="si">#{</span><span class="n">nome_aluno</span><span class="si">}</span><span class="s2">, de </span><span class="si">#{</span><span class="n">idade_aluno</span><span class="si">}</span><span class="s2"> anos, da turma </span><span class="si">#{</span><span class="n">turma</span><span class="si">}</span><span class="s2">, teve a nota final </span><span class="si">#{</span><span class="n">nota_final</span><span class="p">.</span><span class="nf">round</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="si">}</span><span class="s2">."</span>

<span class="n">aprovado</span> <span class="o">=</span> <span class="n">nota_final</span> <span class="o">&gt;=</span> <span class="n">nota_minima</span>
<span class="nb">puts</span> <span class="s2">"O aluno (a) </span><span class="si">#{</span><span class="n">nome_aluno</span><span class="si">}</span><span class="s2"> está aprovado? </span><span class="si">#{</span><span class="n">aprovado</span><span class="si">}</span><span class="s2">"</span>
</code></pre></div></div>

<p>Vamos salvar o arquivo e depois executar o programa no terminal com o comando:</p>

<div class="language-bash bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ruby aula_tipos_dados.rb
</code></pre></div></div>

<p>Teremos a seguinte saída no terminal:</p>

<div class="language-bash bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code>parallels@ubuntu:~/projeto-ruby<span class="nv">$ </span>ruby aula_tipos_dados.rb
O aluno <span class="o">(</span>a<span class="o">)</span> Ana, de 10 anos, da turma 5º ano B, teve a nota final 8.3.
O aluno <span class="o">(</span>a<span class="o">)</span> Ana está aprovado? <span class="nb">true
</span>parallels@ubuntu:~/projeto-ruby<span class="nv">$ </span>
</code></pre></div></div>

<p>Aqui, o programa mostra a mensagem com as informações do aluno e indica se ele está aprovado ou não, baseado na nota final calculada, neste caso retornando <code class="text-white-50 text-light">true</code> porque a nota final é maior que a nota mínima.</p>

<p>Vamos agora mudar as notas para valores mais baixos, como fizemos no IRB, para ver o que acontece quando o aluno não é aprovado. Vamos alterar as linhas das notas para:</p>

<div class="language-ruby bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">nota_1</span> <span class="o">=</span> <span class="mf">2.5</span>
<span class="n">nota_2</span> <span class="o">=</span> <span class="mf">3.0</span>
<span class="n">nota_3</span> <span class="o">=</span> <span class="mf">3.5</span>
</code></pre></div></div>

<p>Depois de fazer essa alteração, salvamos o arquivo e executamos novamente o programa com o comando <code class="text-white-50 text-light">ruby aula_tipos_dados.rb</code> no terminal. A saída será:</p>

<div class="language-bash bg-dark text-light p-3 highlighter-rouge"><div class="highlight"><pre class="highlight"><code>parallels@ubuntu:~/projeto-ruby<span class="nv">$ </span>ruby aula_tipos_dados.rb
O aluno <span class="o">(</span>a<span class="o">)</span> Ana, de 10 anos, da turma 5º ano B, teve a nota final 3.0.
O aluno <span class="o">(</span>a<span class="o">)</span> Ana está aprovado? <span class="nb">false
</span>parallels@ubuntu:~/projeto-ruby<span class="nv">$ </span>
</code></pre></div></div>

<p>Aqui, o programa mostra a mensagem com as informações do aluno e indica que ele não está aprovado, retornando <code class="text-white-50 text-light">false</code> porque a nota final é menor que a nota mínima.</p>

<p>Ou seja, conseguimos ver como os tipos de dados funcionam na prática, tanto no IRB quanto em um programa Ruby fora do IRB.</p>

<h2 id="resumo">Resumo</h2>
<hr />

<p>Neste artigo, exploramos os tipos de dados em Ruby, que são os elementos fundamentais para representar e organizar informações em nossos programas. Vimos que os tipos de dados funcionam como uma “tradução” entre as informações do nosso mundo e a linguagem do computador, transformando textos, números e outros dados em formatos que a máquina consegue entender e processar.</p>

<p>Aprendemos que existem duas abordagens principais nas linguagens de programação: a <strong>tipagem estática</strong> (onde os tipos são verificados antes da execução) e a <strong>tipagem dinâmica</strong> (onde os tipos são verificados durante a execução). O Ruby segue a tipagem dinâmica, identificando automaticamente o tipo de dado com base no valor que atribuímos à variável.</p>

<p>Conhecemos os principais tipos de dados em Ruby:</p>

<ul>
  <li><strong>Números Inteiros (Integer)</strong>: Para valores sem casas decimais, como contagens e cálculos simples</li>
  <li><strong>Números com vírgula (Float)</strong>: Para valores com casas decimais, úteis em medidas e cálculos precisos, entendendo o conceito de “ponto flutuante” e suas limitações</li>
  <li><strong>Textos (Strings)</strong>: Para representar informações textuais como nomes, frases e mensagens</li>
  <li><strong>Booleanos</strong>: Para valores de verdadeiro ou falso, essenciais para tomadas de decisão no programa</li>
  <li><strong>Listas (Arrays)</strong>: Para organizar múltiplos valores relacionados em sequência</li>
  <li><strong>Tabelas de pares (Hashes)</strong>: Para guardar informações em pares chave-valor, como um dicionário</li>
  <li><strong>Nada (Nil)</strong>: Para representar a ausência de valor, diferente de zero ou espaço vazio</li>
  <li><strong>Símbolos</strong>: Para identificar elementos únicos no código que não mudam</li>
</ul>

<p>Descobrimos onde as informações são guardadas através das <strong>variáveis</strong>, que funcionam como “caixinhas” nomeadas na memória do computador. Entendemos por que não podemos usar espaços, acentos ou símbolos nos nomes das variáveis devido às regras do interpretador, e como o sublinhado (_) nos ajuda a separar palavras nos nomes.</p>

<p>Exploramos as principais <strong>convenções de nomenclatura</strong>:</p>
<ul>
  <li><strong>snake_case</strong>: Usado em Ruby, Python e C</li>
  <li><strong>camelCase</strong>: Comum em JavaScript, Java e C#</li>
  <li><strong>PascalCase</strong>: Para nomes de classes e módulos</li>
  <li><strong>kebab-case</strong>: Para HTML, CSS e nomes de arquivos</li>
</ul>

<p>Por fim, colocamos tudo em prática usando o <strong>IRB (Interactive Ruby)</strong> e criando um programa Ruby fora do IRB. Criamos variáveis, calculamos médias e verificamos aprovações usando booleanos, tanto no ambiente interativo quanto em um arquivo Ruby.</p>

<p><strong>Dica</strong>: É possível observar que existem muitas coisas em inglês no código, como os nomes dos tipos de dados (Integer, Float, String, Boolean) e comandos (puts). Isso acontece porque a maioria das linguagens de programação foi criada em países de língua inglesa, então os termos técnicos e comandos são baseados nesse idioma. Mesmo programando em português, é comum usar esses termos em inglês, pois eles são universais na programação. Quanto mais código for lido e escrito, maior será a familiaridade (costume) com esses termos em inglês.</p>

<p>Na medida em que avançamos em nossa série de artigos vamos nos aprofundar mais em tipos de dados, variáveis e outros conceitos importantes da programação. De maneira gradual as coisas vão ficando mais claras e fáceis de entender.</p>]]></content><author><name>Louise Suelen</name></author><category term="Programação" /><category term="programação" /><category term="tecnologia" /><summary type="html"><![CDATA[Neste artigo, vamos explorar os tipos de dados em Ruby, suas características e como utilizá-los em nossos programas.]]></summary></entry></feed>