<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: João Pedro V</title>
    <description>The latest articles on DEV Community by João Pedro V (@joaopedrov0).</description>
    <link>https://dev.to/joaopedrov0</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F771534%2F9cbdf79c-a0a0-43c3-a9d5-99c01231ccfb.jpg</url>
      <title>DEV Community: João Pedro V</title>
      <link>https://dev.to/joaopedrov0</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joaopedrov0"/>
    <language>en</language>
    <item>
      <title>Herança</title>
      <dc:creator>João Pedro V</dc:creator>
      <pubDate>Mon, 01 Dec 2025 20:23:26 +0000</pubDate>
      <link>https://dev.to/joaopedrov0/heranca-2pna</link>
      <guid>https://dev.to/joaopedrov0/heranca-2pna</guid>
      <description>&lt;h2&gt;
  
  
  O que é herança?
&lt;/h2&gt;

&lt;p&gt;Herança é um relacionamento entre duas classes onde uma &lt;strong&gt;herda características da outra&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Lembra que a classe é uma definição de um "molde" que vamos usar na hora de criar um objeto? Então, é como se estivéssemos criando um novo molde que é uma &lt;strong&gt;extensão&lt;/strong&gt; do molde anterior.&lt;/p&gt;

&lt;p&gt;Tornando isso mais próximo da programação e se afastando um pouco da analogia de "moldes", imagine que você tenha duas classes, "Cliente" e "Funcionário". Nesse caso posso imaginar que os primeiros atributos que naturalmente começam a surgir na sua mente são coisas como "Nome", "CPF", e talvez "idade", certo? &lt;/p&gt;

&lt;p&gt;Você pode ter imaginado outras coisas como "cargo" para funcionário ou "endereço" para cliente.&lt;/p&gt;

&lt;p&gt;Mas agora começa a acontecer algo interessante se tentarmos escrever este código.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Funcionario&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;cpf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;cargo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;Funcionario&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;cpf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;cargo&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;cpf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cpf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;cargo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cargo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Cliente&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;cpf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;endereco&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;Cliente&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;cpf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;cargo&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;cpf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cpf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;endereco&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;endereco&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;


&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Funcionario&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Funcionario&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Claudio"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"123.456.678-90"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Gerente de vendas"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;Cliente&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Cliente&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Julia"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"098.876.543-21"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Pq. Carvalho Negro R. Alameda Imbuia 123"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note que temos três linhas &lt;strong&gt;duplicadas&lt;/strong&gt; nessas três classes, isso por que abstraímos todos os cargos na classe "funcionário", se os funcionários tivessem métodos e atributos distintos teríamos que criar uma classe pra cada um, aumentando ainda mais a duplicação de atributos.&lt;/p&gt;

&lt;p&gt;Existe uma forma mais elegante de resolver isso, que é através da &lt;strong&gt;herança&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Quando você começou a imaginar os atributos &lt;code&gt;nome&lt;/code&gt;, &lt;code&gt;cpf&lt;/code&gt; e &lt;code&gt;idade&lt;/code&gt; quando eu mencionei que iria implementar as classes &lt;code&gt;Funcionario&lt;/code&gt; e &lt;code&gt;Cliente&lt;/code&gt;, você sabia que isso era uma característica que eles tinham em comum.&lt;/p&gt;

&lt;p&gt;Mas a característica de um "Nome" não é algo característico de cliente e nem de funcionário, você sabia que ambos tinham um nome porque normalmente &lt;strong&gt;ambos são pessoas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Portanto, por serem pessoas, &lt;strong&gt;ambos herdam a característica de ter um nome&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;E é possível expressar isso na forma de código também, através da &lt;strong&gt;herança de classes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Podemos fazer classes herdarem métodos e atributos protegidos e públicos de outras classes através desse relacionamento, como no exemplo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;tipo_sanguineo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;respirar&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;" está respirando&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Funcionario&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Pessoa&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;cargo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Note que "cargo" é o único atributo declarado na classe Funcionario&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;trabalhar&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;" está trabalhando&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;cargo: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;cargo&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Pessoa&lt;/span&gt; &lt;span class="n"&gt;Rhanny&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;Rhanny&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;Rhanny&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Rhanny Gallahar"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;Rhanny&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tipo_sanguineo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"-O"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;Rhanny&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;respirar&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Chamando método da classe Pessoa&lt;/span&gt;

    &lt;span class="n"&gt;Funcionario&lt;/span&gt; &lt;span class="n"&gt;Emma&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;Emma&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Atribuição de valor a um atributo que é da classe Pessoa&lt;/span&gt;
    &lt;span class="n"&gt;Emma&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Emma Ayers"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;Emma&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tipo_sanguineo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"+A"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;Emma&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cargo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Mestra arcanista"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Atribuição de valor a um atributo da classe Funcionario&lt;/span&gt;
    &lt;span class="n"&gt;Emma&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;trabalhar&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Chamando método da classe Funcionario&lt;/span&gt;
    &lt;span class="n"&gt;Emma&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;respirar&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Chamando método da classe Pessoa&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acima eu ignorei a existência da classe &lt;code&gt;Cliente&lt;/code&gt; porque o foco aqui é o relacionamento entre as classes &lt;code&gt;Pessoa&lt;/code&gt; e &lt;code&gt;Funcionario&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Note no exemplo que apesar de &lt;code&gt;Emma&lt;/code&gt; ser um funcionário, e na definição da classe &lt;code&gt;Funcionario&lt;/code&gt; não ter nenhuma menção a um método &lt;code&gt;respirar()&lt;/code&gt;, é possível chamar o método &lt;code&gt;respirar()&lt;/code&gt; através dela.&lt;/p&gt;

&lt;p&gt;Isso acontece por conta da linha que cria a classe funcionário.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Criando a classe Pessoa&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;

&lt;span class="c1"&gt;// Criando a classe Funcionario de forma que ela herde tudo que for protegido e público da classe.&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Funcionario&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Pessoa&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Espero ter conseguido esclarecer o conceito de herança. Qualquer dúvida ou sugestão, pode deixar nos comentários ou entrar em contato comigo.&lt;/p&gt;

&lt;p&gt;Bons estudos ;)&lt;/p&gt;

</description>
      <category>computerscience</category>
      <category>cpp</category>
      <category>oop</category>
    </item>
    <item>
      <title>Diagrama de classes</title>
      <dc:creator>João Pedro V</dc:creator>
      <pubDate>Tue, 18 Nov 2025 01:24:31 +0000</pubDate>
      <link>https://dev.to/joaopedrov0/diagrama-de-classes-od3</link>
      <guid>https://dev.to/joaopedrov0/diagrama-de-classes-od3</guid>
      <description>&lt;h2&gt;
  
  
  O básico - Encapsulamento e tipos
&lt;/h2&gt;

&lt;p&gt;&lt;a href="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%2Fnwpqdoqrqjjyjeda4x0n.png" class="article-body-image-wrapper"&gt;&lt;img 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%2Fnwpqdoqrqjjyjeda4x0n.png" alt=" " width="800" height="816"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tomando este diagrama com uma única classe como base, podemos afirmar que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;NomeDaClasse&lt;/code&gt; é o nome da classe (uau)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;atributo1&lt;/code&gt; é um atributo &lt;strong&gt;público&lt;/strong&gt; do tipo &lt;strong&gt;inteiro&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;atributo2&lt;/code&gt; é um atributo &lt;strong&gt;privado&lt;/strong&gt; do tipo &lt;strong&gt;coleção de Real (float)&lt;/strong&gt;. (obs: note que eu disse &lt;strong&gt;COLEÇÃO&lt;/strong&gt;, generalizando mesmo, não cabe ao diagrama definir o tipo da coleção)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;atributo3&lt;/code&gt; é um atributo &lt;strong&gt;protegido&lt;/strong&gt; do tipo &lt;strong&gt;string&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;atributo4&lt;/code&gt; é um atributo &lt;strong&gt;público&lt;/strong&gt; e &lt;strong&gt;estático&lt;/strong&gt; do tipo &lt;strong&gt;boolean&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;metodo1()&lt;/code&gt; é um método &lt;strong&gt;público&lt;/strong&gt; sem retorno e sem parâmetros&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;metodo2()&lt;/code&gt; é um método &lt;strong&gt;privado&lt;/strong&gt; que recebe &lt;strong&gt;uma string&lt;/strong&gt; como parâmetro e retorna &lt;strong&gt;um Real&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;metodo3()&lt;/code&gt; é um método &lt;strong&gt;estático&lt;/strong&gt; e &lt;strong&gt;público&lt;/strong&gt; que não recebe &lt;strong&gt;nenhum parâmetro e nem retorna nada&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Especificamente sobre a notação de encapsulamento, e uma breve revisão do que cada um significa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Privado &lt;code&gt;-&lt;/code&gt; - Acessível no escopo da classe&lt;/li&gt;
&lt;li&gt;Protegido &lt;code&gt;#&lt;/code&gt; - Acessível no escopo da classe e descendentes&lt;/li&gt;
&lt;li&gt;Público &lt;code&gt;+&lt;/code&gt; - Acessível em qualquer escopo&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Relacionamentos
&lt;/h2&gt;

&lt;p&gt;"Relacionamentos" é o termo que usamos para descrever a forma como as classes se relacionam. Criativo, não? Por exemplo, você pode ter uma classe que instância um objeto de outra, ou que simplesmente usa algum método ou atributo dela, ou até mesmo classes herdando características umas das outras através de herança. A esmagadora maioria desses relacionamentos que você conseguir pensar, nós já definimos uma forma de ilustrar ele em um diagrama, sem precisar escrever o código pra explicar ele pra alguém.&lt;/p&gt;

&lt;p&gt;Vamos ver um pouco dessas notações agora.&lt;/p&gt;

&lt;h3&gt;
  
  
  Associação
&lt;/h3&gt;

&lt;p&gt;Usamos o termo &lt;strong&gt;associação&lt;/strong&gt; para descrever o relacionamento entre duas classes que se dá da seguinte forma: uma classe tem um &lt;strong&gt;atributo&lt;/strong&gt; do tipo de outra classe.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Processador&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;marca&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Computador&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="n"&gt;Processador&lt;/span&gt; &lt;span class="n"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="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%2Fppt03splcsykmvvyg092.png" class="article-body-image-wrapper"&gt;&lt;img 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%2Fppt03splcsykmvvyg092.png" alt=" " width="800" height="816"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note duas coisas importantes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Eu não escrevi &lt;code&gt;- cpu&lt;/code&gt; dentro de &lt;code&gt;Computador&lt;/code&gt;, o nome do atributo (quando é um atributo) fica na setinha.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A setinha está apontando de &lt;strong&gt;computador&lt;/strong&gt; para &lt;strong&gt;processador&lt;/strong&gt;, e não o contrário.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Importante&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Apesar de você não colocar &lt;code&gt;- cpu: Processador&lt;/code&gt; na definição dos atributos de &lt;code&gt;Computador&lt;/code&gt;, você deve colocar a classe como tipo dessa forma (&lt;code&gt;cpu: Processador&lt;/code&gt;) se e somente se ela for &lt;strong&gt;parâmetro&lt;/strong&gt; ou &lt;strong&gt;retorno&lt;/strong&gt; de algum método.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Também é possível definir a cardinalidade, da seguinte forma:&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Fi3s1tgj5g7i47x127dy1.png" class="article-body-image-wrapper"&gt;&lt;img 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%2Fi3s1tgj5g7i47x127dy1.png" alt=" " width="400" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;*&lt;/code&gt; significa que esperamos que um objeto de &lt;code&gt;Turma&lt;/code&gt; tenha uma quantidade de &lt;code&gt;Aluno&lt;/code&gt;. Essa quantidade pode variar de 0 a &lt;strong&gt;n&lt;/strong&gt; (é a mesma coisa que comentei anteriormente sobre &lt;strong&gt;coleção de objetos&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;Outra coisa importante de ressaltar, é que nós &lt;strong&gt;não colocamos&lt;/strong&gt; métodos &lt;em&gt;getters&lt;/em&gt; e &lt;em&gt;setters&lt;/em&gt; (&lt;code&gt;getNome(): String&lt;/code&gt;, &lt;code&gt;setIdade(int idade): void&lt;/code&gt;) no diagrama, &lt;strong&gt;já é de se esperar que as classes tenham esses métodos&lt;/strong&gt;, portanto acrescentá-los no diagrama &lt;strong&gt;apenas polui&lt;/strong&gt; visualmente e não nos trás nenhum benefício.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dependência
&lt;/h3&gt;

&lt;p&gt;Falamos em &lt;strong&gt;dependência&lt;/strong&gt; quando uma classe precisa &lt;strong&gt;conhecer&lt;/strong&gt; outra, pois precisa dela para a implementação de no mínimo um de seus métodos.&lt;/p&gt;

&lt;p&gt;Por exemplo, se um método de uma classe depende da existência de um outro objeto para ser implementado.&lt;/p&gt;

&lt;p&gt;[[falta exemplo]]&lt;/p&gt;

&lt;h3&gt;
  
  
  Herança
&lt;/h3&gt;

&lt;p&gt;Quando falamos em &lt;strong&gt;herança&lt;/strong&gt; estamos falando de uma classe &lt;strong&gt;base&lt;/strong&gt; que &lt;strong&gt;herda&lt;/strong&gt; características de uma classe &lt;strong&gt;derivada&lt;/strong&gt;. Como no seguinte exemplo:&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2F6l1bg2muofnc5zqeynjf.png" class="article-body-image-wrapper"&gt;&lt;img 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%2F6l1bg2muofnc5zqeynjf.png" alt=" " width="400" height="601"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Composição e Agregação
&lt;/h3&gt;

&lt;p&gt;Em associação vimos que podemos fazer uma classe ter outra como um &lt;strong&gt;atributo&lt;/strong&gt;. Entretanto, ficaram em aberto algumas questões. Quem cria o objeto? É ela mesma? É outra classe?&lt;/p&gt;

&lt;p&gt;Quando falamos em &lt;strong&gt;Agregação&lt;/strong&gt; e &lt;strong&gt;Composição&lt;/strong&gt;, estamos falando de um relacionamento onde uma classe pode até receber um objeto como atributo, entretanto, ela não é responsável pela criação desse objeto. Ao mesmo tempo que outra classe, essa sim é responsável pela criação.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Fi9cgbfu9pu3mn9tkm14r.png" class="article-body-image-wrapper"&gt;&lt;img 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%2Fi9cgbfu9pu3mn9tkm14r.png" alt=" " width="800" height="1010"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No exemplo, temos um objeto de &lt;code&gt;Seguro&lt;/code&gt; &lt;strong&gt;criado pela &lt;code&gt;Seguradora&lt;/code&gt;&lt;/strong&gt; e que é atribuído ao &lt;code&gt;Motorista&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;[[exemplo de código]]&lt;/p&gt;

&lt;p&gt;Todos as imagens de diagramas presentes neste artigo foram geradas com código através do &lt;a href="https://mermaid.js.org/syntax/classDiagram.html" rel="noopener noreferrer"&gt;Mermaid&lt;/a&gt;, quem tiver curiosidade em como fazer isso também, vejam a documentação.&lt;/p&gt;

</description>
      <category>softwareenginer</category>
    </item>
    <item>
      <title>Por que usar Softmax com Categorical Cross-Entropy para o problema da flor íris?</title>
      <dc:creator>João Pedro V</dc:creator>
      <pubDate>Sun, 16 Nov 2025 18:02:07 +0000</pubDate>
      <link>https://dev.to/joaopedrov0/por-que-usar-softmax-com-categorical-cross-entropy-para-o-problema-da-flor-iris-2i6j</link>
      <guid>https://dev.to/joaopedrov0/por-que-usar-softmax-com-categorical-cross-entropy-para-o-problema-da-flor-iris-2i6j</guid>
      <description>&lt;p&gt;Recentemente estava tentando fazer o clássico modelo de rede neural para identificar a espécie de uma flor entre três opções (iris dataset) só para fazer um "Hello World" no Keras e dar o primeiro passo.&lt;/p&gt;

&lt;p&gt;Entretanto, no meio do caminho tive alguns problemas que me levaram a pesquisar mais a fundo a diferença entre algumas funções de ativação e &lt;em&gt;loss functions&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Dado o contexto, meu objetivo aqui é só registrar o que eu encontrei enquanto estudava. Não sou especialista nesse assunto então não tome o que for dito aqui como verdade absoluta. Se você for experiente e notar algum erro em algo que eu disse, correções são bem vindas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Funções de ativação
&lt;/h2&gt;

&lt;p&gt;A primeira coisa que eu notei é que no Keras e em bibliotecas de redes neurais em geral, fala-se bastante de uma função de ativação que eu ouvi muito pouco antes de mexer com ele, a &lt;em&gt;softmax function&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Para entender melhor a diferença, vamos ver o que elas &lt;strong&gt;realmente&lt;/strong&gt; são.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sigmoid
&lt;/h3&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;σ(x)=11+ex
\sigma(x) = \frac{1}{1+e^x}
&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;σ&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;e&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;Antes eu tinha uma visão um pouco distorcida e superficial dessa função como algo que "comprime o número entre 0 e 1", apenas.&lt;/p&gt;

&lt;p&gt;Mas uma característica que eu não tinha reparado era que ela é boa para problemas de &lt;strong&gt;classificação binária&lt;/strong&gt; (duas classes), ou problemas de &lt;strong&gt;multiclasse independente&lt;/strong&gt;, onde você pode ter uma mesma entrada pertencendo a múltiplas classes.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Exemplo
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Classificação binária&lt;/strong&gt;: Paciente anêmico ou saudável. (Sim ou não)&lt;br&gt;
&lt;strong&gt;Classificação multiclasse&lt;/strong&gt;: Tem gato na foto, tem carro na foto, tem maçã na foto. (Pode ter um ou mais desses elementos na foto)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Eu não sei se é tecnicamente correto, mas o modelo mental que eu tenho para entender isso é que a função &lt;em&gt;Sigmoid&lt;/em&gt; é boa para responder "Sim" ou "Não", seja em um problema que realmente é de "Sim" ou "Não", seja pra um problema de multiclasse que precisa de um conjunto de "Sims" e "Nãos".&lt;/p&gt;

&lt;h3&gt;
  
  
  Softmax
&lt;/h3&gt;

&lt;p&gt;&lt;a href="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%2Fn3tet0snkxe8zhjzamda.png" class="article-body-image-wrapper"&gt;&lt;img 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%2Fn3tet0snkxe8zhjzamda.png" alt="Softmax Function"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A &lt;em&gt;Softmax&lt;/em&gt; tem uma característica interessante, a saída dela é uma distribuição de probabilidade que leva em consideração o quanto um valor representa em proporção com as outras saídas. Note que na fórmula ele representa como a divisão do valor pela somatória de toda a tupla, ou seja, ele diz &lt;strong&gt;o quanto aquele valor representa percentualmente em relação aos outros&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Se você entende esse conceito, fica claro que essa ativação lida melhor com uma classificação que espera uma única classe como saída, pois não avalia "sims" e "nãos" de forma individual, mas sim o quanto elas são "mais significativas" do que as outras.&lt;/p&gt;

&lt;h2&gt;
  
  
  Loss Functions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Binary Cross-Entropy (BCE)
&lt;/h3&gt;

&lt;p&gt;A Binary Cross-Entropy, como o nome sugere, é uma loss function que funciona bem para situações de sim e não (duas classes), mesmo que múltiplos sims e nãos (múltiplas classes independentes).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Para problemas de "sim e não":&lt;/strong&gt;&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;BCE(y,y^​)=−[y∗log(y^)+(1−y)∗log(1−y^)]
BCE(y,ŷ​) = -[y * log(ŷ)+(1-y) * log(1-ŷ)]
&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;BCE&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;y&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="mord"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;​&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;−&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mord mathnormal"&gt;y&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;∗&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;l&lt;/span&gt;&lt;span class="mord mathnormal"&gt;o&lt;/span&gt;&lt;span class="mord mathnormal"&gt;g&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="mord"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;y&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;∗&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;l&lt;/span&gt;&lt;span class="mord mathnormal"&gt;o&lt;/span&gt;&lt;span class="mord mathnormal"&gt;g&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="mord"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Para problemas de múltiplos "sims e nãos":&lt;/strong&gt;&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;BCE(y,y^​)=−1C∑c=1C[yc∗log(y^c)+(1−yc)∗log(1−y^c)]
BCE(y,ŷ​) = -\frac{1}{C}\sum_{c=1}^C[y_c * log(ŷ_c)+(1-y_c) * log(1-ŷ_c)]
&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;BCE&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;y&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="mord"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;​&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;−&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;C&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mop op-limits"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;c&lt;/span&gt;&lt;span class="mrel mtight"&gt;=&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="mop op-symbol large-op"&gt;∑&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;C&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;y&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;∗&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;l&lt;/span&gt;&lt;span class="mord mathnormal"&gt;o&lt;/span&gt;&lt;span class="mord mathnormal"&gt;g&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="mord"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;y&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;∗&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;l&lt;/span&gt;&lt;span class="mord mathnormal"&gt;o&lt;/span&gt;&lt;span class="mord mathnormal"&gt;g&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="mord"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Nesse segundo caso, "C" é a quantidade de classes independentes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Como você deve estar imaginando, ela funciona melhor com a Sigmoid do que com a Softmax por tratarem a saída "da mesma forma" (como uma probabilidade independente).&lt;/p&gt;

&lt;h3&gt;
  
  
  Categorical Cross-Entropy (CCE)
&lt;/h3&gt;

&lt;p&gt;Em alguns casos, você tem 3 ou mais classes, mas só uma delas é a correta (que era meu caso no problema do dataset iris). Nessa situação, a chance de a entrada ser classificada como uma classe deveria interferir na chance de ela ser classificada como uma das &lt;strong&gt;outras classes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Faz sentido, não? Afinal nesse caso apenas uma classe pode estar correta, e se a chance de uma classe é alta, esperamos que as outras sejam baixas.&lt;/p&gt;

&lt;p&gt;Aqui tem um detalhe importante, especialmente quando estamos falando de código. Seu conjunto de resultados desejados deve estar de acordo com o que a loss function espera, e nesse caso você vai encontrar dois tipos diferentes, &lt;code&gt;CategoricalCrossEntropy&lt;/code&gt; e &lt;code&gt;SparceCategoricalCrossEntropy&lt;/code&gt;. A diferença principal é justamente o que ela espera como conjunto de saídas desejadas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;CategoricalCrossEntropy&lt;/code&gt;: Espera um conjunto de vetores "&lt;em&gt;one-hot&lt;/em&gt;", que é tipo um vetor com um valor para cada classe, só que todos os valores são 0 exceto o valor da classe esperada. (Ex: &lt;code&gt;[0, 0, 1]&lt;/code&gt; significa que espera-se que o resultado seja a terceira classe.)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SparseCategoricalCrossEntropy&lt;/code&gt;: Espera um número contendo o índice que representa a classe desejada. Pelo que eu vi os datasets do scikit normalmente usam esse modelo, e o dataset "iris" também era assim. (Ex: &lt;code&gt;2&lt;/code&gt; significa que espera-se que o resultado seja a terceira classe.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E por agora é isso. Espero que isso tenha ajudado a esclarecer a diferença dessas duas funções de perda e de ativação. Qualquer dúvida ou correção, deixem nos comentários.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>computerscience</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Matrizes</title>
      <dc:creator>João Pedro V</dc:creator>
      <pubDate>Wed, 11 Jun 2025 01:02:40 +0000</pubDate>
      <link>https://dev.to/joaopedrov0/matrizes-i6a</link>
      <guid>https://dev.to/joaopedrov0/matrizes-i6a</guid>
      <description>&lt;h1&gt;
  
  
  Matrizes
&lt;/h1&gt;

&lt;h2&gt;
  
  
  O que são matrizes?
&lt;/h2&gt;

&lt;p&gt;De forma mais rigorosa, podemos definir matrizes como um conjunto de números dispostos em uma quantidade &lt;em&gt;m&lt;/em&gt; de linhas e &lt;em&gt;n&lt;/em&gt; de colunas, podendo ser escrita com a seguinte simbologia:&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Simbologia para matrizes
&lt;/h3&gt;

&lt;p&gt;Am x n&lt;br&gt;
aij&lt;br&gt;
&lt;strong&gt;A&lt;/strong&gt; = Uma matriz qualquer&lt;br&gt;
&lt;strong&gt;m&lt;/strong&gt; = Quantidade de linhas&lt;br&gt;
&lt;strong&gt;n&lt;/strong&gt; = Quantidade de colunas&lt;br&gt;
&lt;strong&gt;a&lt;/strong&gt; = Um elemento qualquer dessa matriz&lt;br&gt;
&lt;strong&gt;i&lt;/strong&gt; = Linha onde se localiza um elemento&lt;br&gt;
&lt;strong&gt;j&lt;/strong&gt; = Coluna onde se localiza o elemento&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Classificação das matrizes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Matriz linha&lt;/li&gt;
&lt;li&gt;Matriz coluna&lt;/li&gt;
&lt;li&gt;Matriz quadrada&lt;/li&gt;
&lt;li&gt;Matriz nula&lt;/li&gt;
&lt;li&gt;Matriz identidade&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Matriz linha
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Conceito
&lt;/h4&gt;

&lt;p&gt;Chamamos de "matriz linha" qualquer matriz que tenha uma única linha. Ou seja, que possamos escrever ela da seguinte forma:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A1 x n&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Com essa escrita, simbolizamos uma matriz qualquer que tenha &lt;strong&gt;uma única linha com &lt;em&gt;n&lt;/em&gt; colunas&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Exemplos
&lt;/h4&gt;

&lt;p&gt;&lt;a href="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%2Ffd4sbb6fommsq4momepn.png" class="article-body-image-wrapper"&gt;&lt;img 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%2Ffd4sbb6fommsq4momepn.png" alt="Image description" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Matriz coluna
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Conceito
&lt;/h4&gt;

&lt;p&gt;Se a matriz linha era uma matriz com uma única linha e uma quantidade &lt;em&gt;n&lt;/em&gt; de colunas, a &lt;strong&gt;matriz coluna&lt;/strong&gt; é uma matriz com uma &lt;strong&gt;única coluna&lt;/strong&gt; e uma quantidade &lt;em&gt;m&lt;/em&gt; de linhas, podendo ser escrita da seguinte forma:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Am x 1&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Assim simbolizamos uma matriz de &lt;strong&gt;&lt;em&gt;m&lt;/em&gt; linhas&lt;/strong&gt; que possuí uma &lt;strong&gt;uma única coluna&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Exemplos
&lt;/h4&gt;

&lt;p&gt;&lt;a href="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%2Fuuq28aua25f4v6lcy2tm.png" class="article-body-image-wrapper"&gt;&lt;img 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%2Fuuq28aua25f4v6lcy2tm.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Matriz quadrada
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Conceito
&lt;/h4&gt;

&lt;p&gt;O conceito de matriz "quadrada" não está tão distante do quadrado que você conhece da geometria... Ela recebe esse nome pois representa matrizes com a mesma quantidade de linhas e colunas. Podemos simbolizar as matrizes quadradas dessa forma:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An x n&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Com essa simbologia, dizemos que a &lt;strong&gt;quantidade de linhas é igual a quantidade de colunas&lt;/strong&gt;, por isso usamos a mesma letra no lugar da quantidade de linhas e colunas.&lt;/p&gt;

&lt;h4&gt;
  
  
  Exemplos
&lt;/h4&gt;

&lt;p&gt;&lt;a href="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%2Fkxcm3waovexu8x6fbkte.png" class="article-body-image-wrapper"&gt;&lt;img 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%2Fkxcm3waovexu8x6fbkte.png" alt="Image description" width="800" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Diagonal principal e secundária
&lt;/h4&gt;

&lt;p&gt;Em matrizes quadradas temos o conceito de &lt;strong&gt;diagonais principais e secundarias&lt;/strong&gt;, que como o nome já diz, são as diagonais da matriz.&lt;/p&gt;

&lt;p&gt;No exemplo a seguir, marquei a diagonal &lt;strong&gt;principal de vermelho&lt;/strong&gt; e a diagonal &lt;strong&gt;secundária de verde&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Fitn5j61zrvu65kg6g5qo.png" class="article-body-image-wrapper"&gt;&lt;img 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%2Fitn5j61zrvu65kg6g5qo.png" alt="Image description" width="800" height="633"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nesse caso, poderíamos dizer que a diagonal &lt;strong&gt;principal é {2 1 -1}&lt;/strong&gt; enquanto a diagonal &lt;strong&gt;secundária é {1 1 12}&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Matriz nula
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Conceito
&lt;/h4&gt;

&lt;p&gt;Matriz nula é aquela que possui todos os elementos dela iguais a zero. Sim, é só isso. Aqui não importa a quantidade de linhas, colunas, partido político e nem tipo sanguíneo.&lt;/p&gt;

&lt;p&gt;Nesse caso a simbologia dela não importa pois pode ter qualquer quantidade de linhas e colunas.&lt;/p&gt;

&lt;h4&gt;
  
  
  Exemplos
&lt;/h4&gt;

&lt;p&gt;&lt;a href="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%2F3ubx52noe1l25ibgqsim.png" class="article-body-image-wrapper"&gt;&lt;img 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%2F3ubx52noe1l25ibgqsim.png" alt="Image description" width="800" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Lembrete
&lt;/h4&gt;

&lt;p&gt;Quando eu digo que a quantidade de linhas e colunas não importa, estou me referindo a uma situação em que queremos saber se ela é uma matriz nula ou não, ou seja, podemos ter uma matriz que é &lt;strong&gt;quadrada e nula&lt;/strong&gt;, por exemplo. Nesse caso a quantidade de linhas e colunas ainda importam pra afirmar que ela é quadrada, mas não pra afirmar que ela é nula.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Matriz identidade
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Conceito
&lt;/h4&gt;

&lt;p&gt;Chamamos de matriz identidade uma matriz cuja &lt;strong&gt;diagonal principal&lt;/strong&gt; é composta inteiramente por 1, e todo o resto é 0. Note que a diagonal principal é importante para definir uma matriz identidade, o que significa que todas as matrizes identidade são quadradas (porque só as quadradas tem diagonais principal e secundária 😉)&lt;/p&gt;

&lt;h4&gt;
  
  
  Exemplos
&lt;/h4&gt;

&lt;p&gt;&lt;a href="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%2F19f4a5x4fayb8t2gjijt.png" class="article-body-image-wrapper"&gt;&lt;img 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%2F19f4a5x4fayb8t2gjijt.png" alt="Image description" width="800" height="311"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Traço da matriz
&lt;/h2&gt;

&lt;p&gt;Chamamos de "traço de uma matriz" a soma de todos os elementos que estão na sua diagonal principal. Podemos simbolizar isso da seguinte forma:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;tr(A) = a11 + a22 + a33 + ... + ann&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Exemplo
&lt;/h3&gt;

&lt;p&gt;&lt;a href="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%2Fpmx59f5oljgzu2ieyumy.png" class="article-body-image-wrapper"&gt;&lt;img 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%2Fpmx59f5oljgzu2ieyumy.png" alt="Image description" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Lei de formação de uma matriz
&lt;/h2&gt;

&lt;p&gt;Podemos definir a lei de formação das matrizes como uma lei que relaciona os índices (posição) dos elementos com o seu valor.&lt;/p&gt;

&lt;p&gt;Por exemplo, se temos uma matriz A2 x 2 com a lei seguinte lei de formação:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;aij = i + 2j&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Podemos descobrir qualquer posição dessa matriz com essa lei de formação, inclusive mapear a matriz inteira, uma vez que todos os elementos respeitem essa lei.&lt;/p&gt;

&lt;p&gt;No exemplo acima, podemos descobrir como ficaria a matriz assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Fb21gn5waf43wg6jfwgih.png" class="article-body-image-wrapper"&gt;&lt;img 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%2Fb21gn5waf43wg6jfwgih.png" alt="Image description" width="800" height="944"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se ainda não ficou claro, lembre-se que cada posição na matriz está em uma &lt;strong&gt;linha &lt;em&gt;i&lt;/em&gt;&lt;/strong&gt; e uma &lt;strong&gt;coluna &lt;em&gt;j&lt;/em&gt;&lt;/strong&gt;. Tudo que a lei de formação faz é relacionar o valor que vai ficar naquela posição com essas posições.&lt;/p&gt;

&lt;p&gt;Pra "fazer a conta" bastaria substituir os valores de &lt;em&gt;i&lt;/em&gt; e &lt;em&gt;j&lt;/em&gt; para a posição desejada na lei de formação.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Por exemplo, na posição a12 estamos procurando um elemento na &lt;strong&gt;primeira linha&lt;/strong&gt; e &lt;strong&gt;segunda coluna&lt;/strong&gt;, ou seja: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;i&lt;/em&gt; = 1&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;j&lt;/em&gt; = 2&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Portanto se substituirmos na lei de formação, chegamos nessa conta aqui:&lt;/p&gt;

&lt;p&gt;a12 = 1 + 2 . 2&lt;/p&gt;

&lt;p&gt;Portanto: a12 = 5&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Igualdade entre matrizes
&lt;/h2&gt;

&lt;p&gt;Podemos dizer que duas matrizes são &lt;strong&gt;iguais&lt;/strong&gt; quando elas tem a mesma quantidade de linhas, colunas, e todos os elementos são iguais (tanto em valor quanto em posição).&lt;/p&gt;

&lt;h2&gt;
  
  
  Operações entre matrizes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Adição&lt;/li&gt;
&lt;li&gt;Subtração&lt;/li&gt;
&lt;li&gt;Produto entre &lt;strong&gt;um número e uma matriz&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Produto entre matrizes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Adição e subtração
&lt;/h3&gt;

&lt;p&gt;A soma e subtração de matrizes é bem simples, e se faz literalmente somando ou subtraindo um elemento em uma posição de uma matriz&lt;/p&gt;

&lt;h4&gt;
  
  
  Exemplo
&lt;/h4&gt;

&lt;p&gt;&lt;a href="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%2Fw4bt7rdaqkedw06iipqe.png" class="article-body-image-wrapper"&gt;&lt;img 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%2Fw4bt7rdaqkedw06iipqe.png" alt="Image description" width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Produto entre um número e uma matriz
&lt;/h3&gt;

&lt;p&gt;O produto entre um número e uma matriz de ordem qualquer (também chamado por produto de uma matriz por um escalar) é calculado simplesmente multiplicando cada posição da matriz pelo valor.&lt;/p&gt;

&lt;h4&gt;
  
  
  Exemplo
&lt;/h4&gt;

&lt;p&gt;&lt;a href="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%2Ftcrb6i6fcuxb0nwsjuyj.png" class="article-body-image-wrapper"&gt;&lt;img 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%2Ftcrb6i6fcuxb0nwsjuyj.png" alt="Image description" width="800" height="327"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Produto entre matrizes
&lt;/h3&gt;

&lt;p&gt;Para entender o &lt;strong&gt;produto entre matrizes&lt;/strong&gt;, precisamos entender a motivação inicial da criação da teoria das matrizes, que era resolver &lt;strong&gt;sistemas lineares&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Observe o seguinte sistema genérico:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;ax + by = K&lt;/em&gt;&lt;br&gt;
&lt;em&gt;cx + dy = J&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Agora observe a notação matricial desse sistema genérico (a escrita dele na forma de matriz)&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2F74gox7re00208stfugqd.png" class="article-body-image-wrapper"&gt;&lt;img 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%2F74gox7re00208stfugqd.png" alt="Image description" width="800" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dessa forma, para que a notação continue fazendo sentido para o propósito que foi criada, vamos multiplicar &lt;strong&gt;cada linha da primeira matriz&lt;/strong&gt; com &lt;strong&gt;cada coluna da segunda matriz&lt;/strong&gt;, dessa forma:&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Fqlsnbouif8v70uxa3lig.png" class="article-body-image-wrapper"&gt;&lt;img 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%2Fqlsnbouif8v70uxa3lig.png" alt="Image description" width="800" height="287"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com esse exemplo genérico, é possível concluir que nem toda matriz que você tentar multiplicar vai ter um resultado, elas precisam cumprir com alguns requisitos antes disso, para que sejam &lt;strong&gt;compatíveis com a multiplicação&lt;/strong&gt;. Sendo esses requisitos que a quantidade de &lt;strong&gt;colunas&lt;/strong&gt; da &lt;strong&gt;primeira&lt;/strong&gt; matriz deve ser compatível com a quantidade de &lt;strong&gt;linhas&lt;/strong&gt; da &lt;strong&gt;segunda&lt;/strong&gt; matriz.&lt;/p&gt;

&lt;h4&gt;
  
  
  Exemplo
&lt;/h4&gt;

&lt;p&gt;&lt;a href="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%2F6m49gby438k431c3w2gf.png" class="article-body-image-wrapper"&gt;&lt;img 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%2F6m49gby438k431c3w2gf.png" alt="Image description" width="800" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O exemplo acima se fosse escrito como sistema seria dessa forma:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;1.3 + 4.2 = 11&lt;/em&gt;&lt;br&gt;
&lt;em&gt;9.3 + 3.2 = 33&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Propriedades da multiplicação de matrizes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Associativa&lt;/li&gt;
&lt;li&gt;Distributiva&lt;/li&gt;
&lt;li&gt;Não comutativa&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Associativa
&lt;/h3&gt;

&lt;p&gt;Dada uma sequência de multiplicações de matrizes, a ordem que você vai &lt;strong&gt;resolver&lt;/strong&gt; elas não importa (não significa que você pode trocar elas de lugar)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Dadas as matrizes Am x n, Bn x p e Cp x q, podemos afirmar que:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;A . B . C = A . (B . C) = (A . B) . C&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Distributiva
&lt;/h3&gt;

&lt;p&gt;Essa propriedade diz que você pode fazer algo semelhante a "colocar em evidência" também com a multiplicação de matrizes, desde que você &lt;strong&gt;respeite a ordem das multiplicações&lt;/strong&gt; (próxima propriedade)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Dadas as matrizes Am x n, Bm x n e Cn x p, podemos afirmar que:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;(A + B) . C = A . C + B . C&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Não comutativa
&lt;/h3&gt;

&lt;p&gt;Essa propriedade representa o que foi reforçado na descrição das propriedades anteriores, que a ordem de "qual vai multiplicar por qual" &lt;strong&gt;importa no contexto de matrizes&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Dadas quaisquer matrizes que seja possível fazer uma multiplicação entre elas, podemos afirmar que:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;A . B ≠ B . A&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Tipos de matrizes
&lt;/h2&gt;

&lt;p&gt;Agora que vimos as operações com matrizes e algumas de suas propriedades, podemos conhecer algumas matrizes que tem características interessantes relacionadas a essas propriedades.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Matriz identidade&lt;/li&gt;
&lt;li&gt;Matriz transposta&lt;/li&gt;
&lt;li&gt;Matriz simétrica&lt;/li&gt;
&lt;li&gt;Matriz antissimétrica&lt;/li&gt;
&lt;li&gt;Matriz inversa&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Matriz identidade (sim, denovo)
&lt;/h3&gt;

&lt;p&gt;Você já sabe que a matriz identidade tem a diagonal principal preenchida com "1" e todo o resto com "0". O motivo de a matriz identidade aparecer aqui mais uma vez é que ela é uma matriz considerada como &lt;strong&gt;elemento neutro&lt;/strong&gt; em uma multiplicação entre matrizes, ou seja, qualquer matriz multiplicada por uma identidade é igual a ela mesma, consequentemente essa é uma exceção em que a comutativa acaba funcionando meio que sem querer 😅.&lt;/p&gt;

&lt;p&gt;Podemos afirmar que para uma matriz quadrada qualquer &lt;em&gt;An x n&lt;/em&gt; temos que:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;A . In = In . A = A&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Matriz transposta
&lt;/h3&gt;

&lt;p&gt;Dada uma matriz qualquer, para descobrir sua transposta basta transformar todas as linhas em colunas, e vice versa.&lt;/p&gt;

&lt;p&gt;É como se a matriz girasse em torno do que seria a diagonal principal dela (e eu digo "seria" porque é possível obter uma transposta de uma matriz não quadrada, e o conceito de "diagonal" só existe nas matrizes quadradas).&lt;/p&gt;

&lt;p&gt;Observe o exemplo a seguir:&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Fiuncnl292mfzpnclbuxw.png" class="article-body-image-wrapper"&gt;&lt;img 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%2Fiuncnl292mfzpnclbuxw.png" alt="Image description" width="800" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Propriedades de uma transposta
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;(A&lt;sup&gt;t&lt;/sup&gt;)&lt;sup&gt;t&lt;/sup&gt; = A&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;(A + B)&lt;sup&gt;t&lt;/sup&gt; = A&lt;sup&gt;t&lt;/sup&gt; + B&lt;sup&gt;t&lt;/sup&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;(A . B)&lt;sup&gt;t&lt;/sup&gt; = B&lt;sup&gt;t&lt;/sup&gt; . A&lt;sup&gt;t&lt;/sup&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;∀ k ∈ R, (k . A)&lt;sup&gt;t&lt;/sup&gt; = k . A&lt;sup&gt;t&lt;/sup&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Não se assuste com esse último...
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;Caso você não tenha entendido o que essa última propriedade quer dizer, ela só diz que para qualquer número dentro do conjunto dos reais, se você multiplicar uma matriz por um número e depois pegar a transposta do resultado, vai dar o mesmo resultado de se você tivesse pegado a transposta da matriz antes de multiplicar.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Matriz simétrica
&lt;/h3&gt;

&lt;p&gt;Podemos dizer que uma matriz simétrica qualquer matriz quadrada que a transposta seja igual a ela mesma, como no exemplo abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2F3bcvbdq5y5cixsyrtiiu.png" class="article-body-image-wrapper"&gt;&lt;img 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%2F3bcvbdq5y5cixsyrtiiu.png" alt="Image description" width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Matriz antissimétrica
&lt;/h3&gt;

&lt;p&gt;Ao contrário do que você pode estar imaginando agora, a matriz antissimétrica não é simplesmente uma matriz "não-simétrica", na verdade visualmente ela é até que parecida com uma matriz simétrica, mas com um pequeno detalhe.&lt;/p&gt;

&lt;p&gt;Quando você pega a transposta de uma matriz antissimétrica, é como se você &lt;strong&gt;invertesse&lt;/strong&gt; os sinais de todos os elementos da matriz.&lt;/p&gt;

&lt;p&gt;Porém pra única diferença da transposta ser o sinal dos elementos, precisamos que ela tenha a mesma quantidade de linhas e colunas (ou seja, que ela seja quadrada).&lt;/p&gt;

&lt;p&gt;Além disso, lembra que quando nós vimos a matriz transposta, percebemos que a diagonal não mudava? Se a diagonal não muda, então não podemos dizer que o sinal dela vai mudar. Ou seja, precisamos de um número que não esteja sujeito a alterações de sinal, como por exemplo, &lt;strong&gt;o número zero&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Podemos ter como exemplo a seguinte matriz antissimétrica:&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Flp4iwgnjwive4h6dcdni.png" class="article-body-image-wrapper"&gt;&lt;img 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%2Flp4iwgnjwive4h6dcdni.png" alt="Image description" width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Vendo de outra forma...
&lt;/h4&gt;

&lt;p&gt;Outra forma de interpretar a matriz antissimétrica com base no que você entendeu sobre a matriz simétrica, é pensar que se na matriz simétrica nós podíamos dizer que:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;A&lt;sup&gt;t&lt;/sup&gt; = A&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Na matriz antissimétrica dizemos que:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;A&lt;sup&gt;t&lt;/sup&gt; = -A&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Talvez com essa outra visão fique mais claro o porque do nome "antissimétrica"&lt;/p&gt;


&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Matriz inversa
&lt;/h3&gt;

&lt;p&gt;Você sabe qual é o &lt;strong&gt;inverso de 2&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;Se você respondeu -2, o seu pensamento está quase certo, porém na matemática as palavras &lt;strong&gt;"oposto"&lt;/strong&gt; e &lt;strong&gt;"inverso"&lt;/strong&gt; tem significados significantemente diferentes.&lt;/p&gt;

&lt;p&gt;Quando dizemos o &lt;strong&gt;oposto&lt;/strong&gt; de um número, estamos nos referindo a ele com o &lt;strong&gt;sinal oposto&lt;/strong&gt;, ou seja:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;O oposto de &lt;strong&gt;2&lt;/strong&gt; é &lt;strong&gt;-2&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Quando dizemos o &lt;strong&gt;inverso&lt;/strong&gt; de um número, estamos nos referindo a um número cujo produto dele pelo seu inverso, resulta em um &lt;strong&gt;elemento neutro&lt;/strong&gt;, ou seja:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;O inverso de &lt;strong&gt;2&lt;/strong&gt; é &lt;strong&gt;½&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;De modo simplificado, podemos dizer que o termo &lt;strong&gt;"oposto"&lt;/strong&gt; esta relacionado com &lt;strong&gt;soma&lt;/strong&gt; e o termo &lt;strong&gt;"inverso"&lt;/strong&gt; com multiplicação.&lt;/p&gt;

&lt;p&gt;Se você analisar, vai notar que ambos estão relacionados ao &lt;strong&gt;elemento neutro&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  O que é "elemento neutro"?
&lt;/h4&gt;

&lt;p&gt;Elemento neutro é um elemento que &lt;strong&gt;não faz diferença&lt;/strong&gt; em uma operação, por exemplo:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;2 + 0 = 2&lt;/em&gt;&lt;br&gt;
&lt;em&gt;4 + 0 = 4&lt;/em&gt;&lt;br&gt;
&lt;em&gt;5 + 0 + 0 + 0 + 0 = 5&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Perceba que não importa o quanto nós somamos, o &lt;strong&gt;zero não faz diferença&lt;/strong&gt; nenhuma no resultado da operação de &lt;strong&gt;soma&lt;/strong&gt;.&lt;br&gt;
Pois é, por conta disso nós dizemos que o zero é um &lt;strong&gt;elemento neutro&lt;/strong&gt; na operação de soma.&lt;br&gt;
Mas o conceito de elemento neutro também se aplica a multiplicações, só que ele não pode ser zero, pois o zero &lt;strong&gt;altera&lt;/strong&gt; o resultado de uma multiplicação.&lt;br&gt;
Então o que seria um elemento neutro em uma multiplicação? Simples, &lt;strong&gt;o número 1&lt;/strong&gt;, observe:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;2 . 1 = 2&lt;/em&gt;&lt;br&gt;
&lt;em&gt;4 . 1 = 4&lt;/em&gt;&lt;br&gt;
&lt;em&gt;5 . 1 . 1 . 1 . 1 = 5&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Assim como o &lt;strong&gt;zero não altera somas&lt;/strong&gt;, o &lt;strong&gt;um não altera multiplicações&lt;/strong&gt;, por isso chamamos esses números de elementos neutros para essas operações.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Zero" é elemento neutro de &lt;strong&gt;somas&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;"Um" é elemento neutro de &lt;strong&gt;multiplicações&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/blockquote&gt;

&lt;p&gt;Certo, mas como relacionamos o &lt;strong&gt;elemento neutro&lt;/strong&gt; com os conceitos de números &lt;strong&gt;opostos&lt;/strong&gt; e &lt;strong&gt;inversos&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;Podemos dizer que &lt;em&gt;-2&lt;/em&gt; é o &lt;strong&gt;oposto&lt;/strong&gt; de &lt;em&gt;2&lt;/em&gt; porque se nós &lt;strong&gt;somarmos&lt;/strong&gt; os dois valores, vamos obter o elemento neutro de uma &lt;strong&gt;soma&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;-2 + 2 = 0&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Um conceito semelhante pode ser aplicado na multiplicação.&lt;/p&gt;

&lt;p&gt;Podemos dizer que &lt;em&gt;½&lt;/em&gt; é o &lt;strong&gt;inverso&lt;/strong&gt; de &lt;em&gt;2&lt;/em&gt; porque se nós &lt;strong&gt;multiplicarmos&lt;/strong&gt; os dois valores, vamos obter o elemento neutro de uma &lt;strong&gt;multiplicação&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Voltando para matrizes...&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nas matrizes, podemos dizer que uma matriz &lt;em&gt;A&lt;/em&gt; é inversa de uma matriz &lt;em&gt;B&lt;/em&gt; se a multiplicação de &lt;em&gt;A . B&lt;/em&gt; resultar no &lt;strong&gt;elemento neutro de uma multiplicação de matrizes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Você lembra qual é o elemento neutro da multiplicação de matrizes? Ela foi mencionada umas duas vezes aqui já...&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2F3eqyq6crt8899mcmijhu.png" class="article-body-image-wrapper"&gt;&lt;img 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%2F3eqyq6crt8899mcmijhu.png" alt="Image description" width="800" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sim, como já mencionado antes, o &lt;strong&gt;elemento neutro de uma multiplicação de matrizes&lt;/strong&gt; é a &lt;strong&gt;matriz identidade&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ou seja, se dizemos que um número multiplicado pelo seu inverso resulta em 1, que é o elemento neutro de uma multiplicação, podemos dizer também que &lt;strong&gt;uma matriz multiplicada pelo seu inverso resulta em uma matriz identidade&lt;/strong&gt;, que é o elemento neutro da operação de multiplicação de matrizes.&lt;/p&gt;

&lt;p&gt;Certo, entendemos o que são as matrizes inversas, mas como descobrir elas?&lt;/p&gt;

&lt;p&gt;Bom, para é só ter em mente que você vai multiplicar a matriz que você quer descobrir a inversa por uma matriz que &lt;strong&gt;você não sabe qual é&lt;/strong&gt;, ou seja, preenchendo ela com incógnitas que você vai descobrir quais são depois.&lt;/p&gt;

&lt;p&gt;Depois de terminar a multiplicação, cada posição da matriz vai ter uma equação que você sabe a resposta que deve dar (o necessário pra matriz resultante ser uma matriz identidade).&lt;/p&gt;

&lt;h4&gt;
  
  
  Exemplo
&lt;/h4&gt;

&lt;p&gt;&lt;a href="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%2F1gxd8hzst3euw00odhg4.png" class="article-body-image-wrapper"&gt;&lt;img 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%2F1gxd8hzst3euw00odhg4.png" alt="Image description" width="800" height="557"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Se você entendeu todo o processo mas ficou com dúvida em como aquelas equações chegaram na matriz resultante (como resolver elas), sua dúvida não é sobre matrizes, mas sim sobre a &lt;strong&gt;resolução de sistemas&lt;/strong&gt;. O que importa por agora é que você entenda todo o processo e, caso necessário, consiga calcular matrizes inversas depois de revisar a resolução de sistemas.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Obrigado!
&lt;/h2&gt;

&lt;p&gt;Muito obrigado por ter acompanhado até aqui, espero muito que esse conteúdo tenha te ajudado de alguma forma.&lt;/p&gt;

&lt;p&gt;Qualquer dúvida, sugestão ou correção que você tiver, não deixe de colocar nos comentários! Esse material está sujeito a melhorias, então as sugestões serão muito bem vindas! Ou então talvez alguma dúvida específica que você tenha que eu possa responder complementando esse material... Existem muitas possibilidades, mas não deixe de perguntar!&lt;/p&gt;

</description>
      <category>math</category>
      <category>matrix</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Polimorfismo</title>
      <dc:creator>João Pedro V</dc:creator>
      <pubDate>Wed, 19 Mar 2025 19:26:06 +0000</pubDate>
      <link>https://dev.to/joaopedrov0/polimorfismo-24bi</link>
      <guid>https://dev.to/joaopedrov0/polimorfismo-24bi</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Boas vindas! Hoje pretendo escrever um pouco sobre polimorfismo, um assunto que não era pra ser tão complicado, mas que começou a parecer algo nebuloso pela popularidade de linguagens que acabam fazendo algumas coisas "por debaixo dos panos", de modo implícito, as vezes dificultando o entendimento de alguns conceitos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Aprendizado X Eficiência
&lt;/h3&gt;

&lt;p&gt;É inegável que no processo de construção de software, usar uma linguagem como &lt;strong&gt;Python&lt;/strong&gt; pode facilitar bastante o desenvolvimento, fazendo você ganhar bastante tempo e tirando barreiras desnecessárias na hora de criar um &lt;strong&gt;projeto real&lt;/strong&gt;. Entretanto, existem alguns conceitos fundamentais de entender sobre programação, que acabam sendo "escondidos" por linguagens como Python para ganhar &lt;strong&gt;produtividade&lt;/strong&gt; e conseguir ter um &lt;strong&gt;código fonte mais fácil de ler&lt;/strong&gt;. Por esse motivo, muitas vezes para o &lt;strong&gt;aprendizado&lt;/strong&gt; pode ser um divisor de águas a escolha de uma linguagem que "esconde menos detalhes", uma vez que isso te deixa mais "a par" do que está acontecendo, sem muita abstração.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é Polimorfismo
&lt;/h2&gt;

&lt;p&gt;De forma resumida, o Polimorfismo é um princípio que permite invocar métodos de subclasses através de uma classe mãe (superclasse).&lt;/p&gt;

&lt;h2&gt;
  
  
  Explicação
&lt;/h2&gt;

&lt;p&gt;Para entender o polimorfismo &lt;strong&gt;de verdade&lt;/strong&gt;, é necessário conhecer alguns outros conceitos antes, como o conceito de &lt;strong&gt;herança&lt;/strong&gt;, e o conceito de &lt;strong&gt;ponteiros&lt;/strong&gt;, além de outros conceitos que vou apresentar aqui, como o &lt;strong&gt;fatiamento de objeto&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Para começar, observe o código abaixo escrito em C++ &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Observação: Não se prenda tanto à sintaxe de C++ caso você não esteja habituado, no momento que estou escrevendo esse material eu também não estou completamente habituado com a linguagem, entretanto, achei ela a ideal para ilustrar o conceito de Polimorfismo. Ainda que você não programe em C++, você deve ser capaz de entender o suficiente o que está acontecendo para acompanhar a explicação.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Base&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"I am a Base method."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Derivative&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Base&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"I am a Derivative method."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;


&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Base&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;baseObject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Base&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="n"&gt;baseObject&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma breve explicação do que está acontecendo aqui. Nós iniciamos o código com &lt;code&gt;#include &amp;lt;iostream&amp;gt;&lt;/code&gt;, isso inclui ao nosso ambiente bibliotecas com objetos padrão de Entrada e Saída (Input/Output ou I/O, por isso o "io"). Fizemos isso para termos disponível o &lt;code&gt;cout&lt;/code&gt; (C Output).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Se ficou interessado(a) você pode encontrar mais sobre a biblioteca &lt;code&gt;iostream&lt;/code&gt; &lt;a href="https://cplusplus.com/reference/iostream/" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;. Ou então mais sobre o &lt;code&gt;cout&lt;/code&gt; &lt;a href="https://cplusplus.com/reference/iostream/cout/" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Depois disso criamos duas classes, uma classe &lt;code&gt;Base&lt;/code&gt; e uma classe &lt;code&gt;Derivative&lt;/code&gt; (derivada) que &lt;strong&gt;deriva&lt;/strong&gt; da classe &lt;code&gt;Base&lt;/code&gt; (ou &lt;strong&gt;herda&lt;/strong&gt;, se você preferir dizer assim).&lt;/p&gt;

&lt;p&gt;Ambas as classes tem um mesmo método público chamado &lt;code&gt;method()&lt;/code&gt; que diz de qual classe que o método pertence.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Do Python ao C++
&lt;/h3&gt;

&lt;p&gt;Se você está tendo dificuldades para acompanhar a explicação por conta da sintaxe do C++, e você está habituado(a) com Python, eu vou tentar esclarecer um pouco as coisas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;class Derivative: public Base&lt;/code&gt; seria o equivalente de &lt;code&gt;class Derivative(Base)&lt;/code&gt; em Python.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;std::cout&amp;lt;&amp;lt;"Hello World"&lt;/code&gt; seria o equivalente de &lt;code&gt;print("Hello World")&lt;/code&gt; em Python&lt;/li&gt;
&lt;li&gt;O &lt;code&gt;void&lt;/code&gt; na frente da declaração dos métodos significa que a função não retorna nada. Em C++ precisamos definir na declaração da função o tipo de dado que ela vai retornar, e &lt;em&gt;void&lt;/em&gt; caso ela não retorne nada (a &lt;code&gt;main()&lt;/code&gt; do nosso exemplo, retorna 0, por isso declaramos ela com &lt;em&gt;int&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Agora na nossa função &lt;code&gt;main()&lt;/code&gt;, nós criamos um ponteiro do tipo &lt;code&gt;Base&lt;/code&gt; que aponta para uma região de memória onde nós alocamos e ocupamos com um objeto da classe &lt;code&gt;Base&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Quando compilamos e executamos o código, temos o seguinte resultado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I am a Base method.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Até então tudo faz sentido, temos um objeto de &lt;code&gt;Base&lt;/code&gt; chamando o método da classe &lt;code&gt;Base&lt;/code&gt;, tudo certo!&lt;/p&gt;

&lt;p&gt;Se trocarmos a classe para &lt;code&gt;Derivative&lt;/code&gt;, o resultado deve ser diferente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Derivative&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;derivativeObject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Derivative&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="n"&gt;derivativeObject&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Observação: Eu estou mostrando apenas o recorte do código referente a função &lt;code&gt;main()&lt;/code&gt;, para não poluir a visualização, se em algum momento eu alterar alguma parte do restante do código, vou exibir o que foi alterado, como aqui eu só mexi na função &lt;code&gt;main&lt;/code&gt;, estou exibindo apenas ela, assuma que todo o resto do código está igual estava da última vez que eu mostrei.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O resultado dessa vez é o seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I am a Derivative method.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perfeito, criamos um objeto de &lt;code&gt;Base&lt;/code&gt; e o método que ele chamou foi da classe &lt;code&gt;Base&lt;/code&gt;, depois criamos um objeto de &lt;code&gt;Derivative&lt;/code&gt; e o método que ele chamou foi da classe &lt;code&gt;Derivative&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Mas, o que acontece se fizermos o seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Base&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;derivativeObject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Derivative&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="n"&gt;derivativeObject&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A única alteração que eu fiz foi no &lt;strong&gt;tipo do ponteiro&lt;/strong&gt; &lt;code&gt;derivativeObject&lt;/code&gt; para &lt;code&gt;Base&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Agora temos um problema... O tipo do ponteiro diz que ele aponta pra um objeto de &lt;code&gt;Base&lt;/code&gt;, porém, o que colocamos na memória foi um objeto de &lt;code&gt;Derivative&lt;/code&gt;. E agora?&lt;/p&gt;

&lt;p&gt;Apesar do ponteiro estar declarado como do tipo &lt;code&gt;Base&lt;/code&gt;, o que realmente está salvo na memória é um objeto de &lt;code&gt;Derivative&lt;/code&gt;, portanto quando chamarmos o método, vai ser o método da classe &lt;code&gt;Derivative&lt;/code&gt;, certo?&lt;/p&gt;

&lt;p&gt;Errado! O resultado é esse:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I am a Base method.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mas por que?
&lt;/h3&gt;

&lt;p&gt;Bom, para entender o que está acontecendo aqui, precisamos entender um pouco do que está acontecendo na &lt;strong&gt;memória&lt;/strong&gt; durante a execução do nosso programa.&lt;/p&gt;

&lt;p&gt;Quando nós criamos um objeto de &lt;code&gt;Derivative&lt;/code&gt; e chamamos o seu método &lt;code&gt;method()&lt;/code&gt;, temos o resultado do método de &lt;code&gt;Derivative&lt;/code&gt;, como já era esperado. Entretanto, isso não aconteceu porque nós trocamos um método pelo outro, &lt;strong&gt;ambos&lt;/strong&gt; foram salvos na memória.&lt;/p&gt;

&lt;p&gt;Mas você pode se perguntar por que raios ele dá preferência ao método de &lt;code&gt;Derivative&lt;/code&gt; se o método de &lt;code&gt;Base&lt;/code&gt; existe, é acessível e tem o mesmo nome, e isso acontece pois ele vai procurar executar a função disponível no escopo mais específico possível. Ele procura o método &lt;code&gt;method()&lt;/code&gt; na classe &lt;code&gt;Derivative&lt;/code&gt;, se encontrar ele executa, se não encontrar ele procura na classe mãe &lt;code&gt;Base&lt;/code&gt;, se encontrar ele executa, se não encontrar ele retorna um erro pois você chamou um método que não existe.&lt;/p&gt;

&lt;p&gt;Com isso tudo eu quero chegar no ponto de que ambos estão na memória, tanto as coisas da classe &lt;code&gt;Base&lt;/code&gt; quanto da &lt;code&gt;Derivative&lt;/code&gt; estão gravadas em sequência na memória.&lt;/p&gt;

&lt;p&gt;Só que antes, eu tinha definido o ponteiro do tipo &lt;code&gt;Derivative&lt;/code&gt;, e agora defini do tipo &lt;code&gt;Base&lt;/code&gt;, o que fez com que ele interpretasse meu objeto como do tipo &lt;code&gt;Base&lt;/code&gt;, mesmo sendo do tipo &lt;code&gt;Derivative&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Ué, mas se tem o objeto &lt;code&gt;Derivative&lt;/code&gt; na memória, por que o ponteiro &lt;em&gt;finge&lt;/em&gt; que ele só tem as coisas de &lt;code&gt;Base&lt;/code&gt;?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Na verdade ele não finge, nós é que enganamos ele quando dissemos que se tratava de um objeto de &lt;code&gt;Base&lt;/code&gt;. Vou criar um exemplo que vai deixar isso mais claro.&lt;/p&gt;

&lt;p&gt;Na memória, nós só temos um grande caos de &lt;em&gt;zeros&lt;/em&gt; e &lt;em&gt;ums&lt;/em&gt;, o ponteiro só consegue recuperar esses dados porque ele sabe onde começar e onde parar.&lt;/p&gt;

&lt;p&gt;No exemplo a seguir, ignore todos os números.&lt;/p&gt;

&lt;p&gt;Vamos imaginar que a classe &lt;code&gt;Base&lt;/code&gt; tem os dados &lt;strong&gt;aba&lt;/strong&gt;, e a classe &lt;code&gt;Derivative&lt;/code&gt; herda de &lt;code&gt;Base&lt;/code&gt; e tem os dados próprios &lt;strong&gt;cate&lt;/strong&gt;, juntas elas formam a palavra &lt;strong&gt;abacate&lt;/strong&gt;, pois na memória primeiro serão criadas as coisas da classe mãe (aba) e depois da classe filha (cate). Então no meio da memória teríamos algo parecido com isso:&lt;/p&gt;

&lt;p&gt;9 8 7 3 2 &lt;strong&gt;a b a c a t e&lt;/strong&gt; 8 9 2 3 7 2 8 3&lt;/p&gt;

&lt;p&gt;Nosso "abacate" começa na sexta posição dessa sequência, e tem 7 letras, com essa informação sabemos onde a classe &lt;code&gt;Derivative&lt;/code&gt; começa (na sexta posição) e onde ela termina (depois de 7 letras).&lt;/p&gt;

&lt;p&gt;Porém, se &lt;code&gt;Derivative&lt;/code&gt; tem 7 letras, ao contrário de &lt;code&gt;Base&lt;/code&gt;, que nesse nosso exemplo tem apenas 3 letras.&lt;/p&gt;

&lt;p&gt;Se o ponteiro, sabendo que nossos dados começam na &lt;strong&gt;sexta posição&lt;/strong&gt;, achar que se trata de um objeto de &lt;code&gt;Base&lt;/code&gt;, ele só vai pegar as três primeiras letras "&lt;strong&gt;aba&lt;/strong&gt;".&lt;/p&gt;

&lt;p&gt;Note que o "&lt;strong&gt;cate&lt;/strong&gt;" continua existindo, entretanto, nosso ponteiro acha que nosso objeto tem apenas 3 letras, então ele para quando chega na terceira, fazendo &lt;strong&gt;parecer&lt;/strong&gt; que "&lt;strong&gt;cate&lt;/strong&gt;" não existe.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;E o que isso tem a ver com o exemplo anterior?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vamos trocar o "abacate" pelo nosso objeto &lt;code&gt;Derivative&lt;/code&gt; com o método &lt;code&gt;method()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Você já entendeu que &lt;code&gt;Derivative&lt;/code&gt; tem as coisas tanto de &lt;code&gt;Base&lt;/code&gt; como de &lt;code&gt;Derivative&lt;/code&gt;, e que elas estão gravadas em sequência na memória.&lt;/p&gt;

&lt;p&gt;Só falta conectar isso com o nosso exemplo do "&lt;strong&gt;abacate&lt;/strong&gt;".&lt;/p&gt;

&lt;p&gt;Vamos retomar o código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Base&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;derivativeObject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Derivative&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="n"&gt;derivativeObject&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse código, estamos gravando na memória um objeto de &lt;code&gt;Derivative&lt;/code&gt;, e estamos colocando um ponteiro apontando pra essa região da memória, porém estamos dizendo para o nosso ponteiro que se trata de um objeto de &lt;code&gt;Base&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Fkwt4hovltgz812fgbrmm.png" class="article-body-image-wrapper"&gt;&lt;img 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%2Fkwt4hovltgz812fgbrmm.png" alt="Image description" width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como ilustrado na imagem acima, temos as coisas de &lt;code&gt;Base&lt;/code&gt; em um objeto de &lt;code&gt;Base&lt;/code&gt;, e ambas as coisas de &lt;code&gt;Base&lt;/code&gt; e &lt;code&gt;Derivative&lt;/code&gt; no objeto de &lt;code&gt;Derivative&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Se nós dissermos para o nosso ponteiro que se trata de um objeto de &lt;code&gt;Base&lt;/code&gt;, ele vai ver qual é o tamanho de um objeto dessa classe, e vai, partindo da posição que ele sabe qual é, ler os dados até onde teoricamente acabaria um objeto com o tamanho de um objeto de &lt;code&gt;Base&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Lembra que no exemplo do abacate, nossa superclasse tinha só as letras "aba"? É exatamente o que está acontecendo agora, estamos dizendo para o ponteiro que o objeto é menor do que ele realmente é, então ele está lendo apenas uma parte desse objeto.&lt;/p&gt;

&lt;p&gt;Esse conceito é o que chamamos de &lt;strong&gt;fatiamento de objeto&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ok, mas e o Polimorfismo?
&lt;/h2&gt;

&lt;p&gt;Você entendeu como funciona os ponteiros e entendeu como que o jeito que eles funcionam causa o &lt;strong&gt;fatiamento de objeto&lt;/strong&gt;. Agora, como isso se conecta com o Polimorfismo?&lt;/p&gt;

&lt;p&gt;No Polimorfismo, podemos dizer a grosso modo que queremos fazer o inverso da &lt;strong&gt;herança&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Se na &lt;strong&gt;herança&lt;/strong&gt; nós queremos, através de um objeto de uma classe filha, usar um método de uma classe mãe, no &lt;strong&gt;polimorfismo&lt;/strong&gt; queremos ser capazes de, &lt;strong&gt;através da classe mãe, acessar um método da classe filha&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;E como fazemos isso?&lt;/p&gt;

&lt;h2&gt;
  
  
  Tabela Virtual
&lt;/h2&gt;

&lt;p&gt;O compilador do C++ tem um mecanismo que permite saber qual foi o objeto alocado no espaço de memória, ainda que isso discorde do tipo do ponteiro. Por enquanto assuma apenas que esse mecanismo existe, caso queira saber mais, você pode encontrar um artigo sobre a tabela virtual &lt;a href="https://www.learncpp.com/cpp-tutorial/the-virtual-table/" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Desse modo, podemos marcar métodos como virtuais, fazendo com que o método seja chamado como uma classe derivada.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Base&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// alternar o "virtual" alterna o resultado&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"I am a Base method."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Derivative&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Base&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"I am a Derivative method."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;


&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Base&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;derivativeObject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Derivative&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="n"&gt;derivativeObject&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E o resultado é esse:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I am a Derivative method.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Observe que eu inclui a palavra-chave &lt;code&gt;virtual&lt;/code&gt; no método da classe &lt;code&gt;Base&lt;/code&gt;. Quando eu faço isso, todas as classes que herdarem essa classe vão ter esse método marcado como virtual, ainda que ele seja sobrescrito.&lt;/p&gt;

&lt;p&gt;Na prática, o que acontece é o seguinte quando nós chamamos o método &lt;code&gt;method()&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O compilador verifica se esse método existe, confirmando que ele existe na classe Base.&lt;/li&gt;
&lt;li&gt;O compilador verifica que se trata de um método virtual, e através da &lt;strong&gt;tabela virtual&lt;/strong&gt;, descobre que foi alocado um objeto de &lt;code&gt;Derivative&lt;/code&gt;, &lt;strong&gt;mesmo que o ponteiro diga que é de &lt;code&gt;Base&lt;/code&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;O compilador passa a tratar esse objeto como um objeto da subclasse &lt;code&gt;Derivative&lt;/code&gt;, como está na memória, para chamar o método de &lt;code&gt;Derivative&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Entendi, mas pra que serve isso?
&lt;/h2&gt;

&lt;p&gt;Existem várias utilidades para o Polimorfismo, dentre elas, a implementação do &lt;strong&gt;Princípio Aberto-Fechado&lt;/strong&gt; do &lt;strong&gt;SOLID&lt;/strong&gt; pode ser feita através dele.&lt;/p&gt;

&lt;p&gt;Mas não precisamos nos limitar a isso. Lembra quando eu disse que, se o ponteiro diz que é um objeto de &lt;code&gt;Base&lt;/code&gt;, ele não vai saber que tem mais coisas (coisas de &lt;code&gt;Derivative&lt;/code&gt;) ali? Isso faz com que ele não possa ler esses dados, mas também faz com que ele não possa apagar, uma vez que ele acredita não fazer parte do objeto.&lt;/p&gt;

&lt;p&gt;E se tentarmos apagar um objeto de &lt;code&gt;Derivative&lt;/code&gt; chamando ele de &lt;code&gt;Base&lt;/code&gt;, o que vai acontecer é que só vamos apagar o conteúdo dele que for correspondente a classe &lt;code&gt;Base&lt;/code&gt;, o resto vai continuar na memória, e pior, &lt;strong&gt;o programa não sabe disso&lt;/strong&gt;. O único nessa história que sabe onde ficava o objeto que nós apagamos é o &lt;strong&gt;ponteiro&lt;/strong&gt;, e ele não apagou a parte exclusiva de &lt;code&gt;Derivative&lt;/code&gt;, pois ele acredita que essa parte não existe.&lt;/p&gt;

&lt;h2&gt;
  
  
  E é isso!
&lt;/h2&gt;

&lt;p&gt;Espero que você tenha conseguido compreender o conceito de Polimorfismo. Se ficou alguma dúvida pode deixar nos comentários, ou se conseguir, entrar em contato comigo.&lt;/p&gt;

&lt;p&gt;Bons estudos, e até mais o/&lt;/p&gt;

</description>
      <category>programming</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Redes</title>
      <dc:creator>João Pedro V</dc:creator>
      <pubDate>Thu, 20 Feb 2025 11:25:10 +0000</pubDate>
      <link>https://dev.to/joaopedrov0/redes-1dc4</link>
      <guid>https://dev.to/joaopedrov0/redes-1dc4</guid>
      <description>&lt;h2&gt;
  
  
  Classificação de redes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Proximity&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;PAN&lt;/li&gt;
&lt;li&gt;LAN&lt;/li&gt;
&lt;li&gt;CAN (incomum)&lt;/li&gt;
&lt;li&gt;MAN&lt;/li&gt;
&lt;li&gt;WAN&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Proximity&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Redes para comunicações muito próximas fisicamente, como para cartões de aproximação por exemplo.&lt;/p&gt;

&lt;p&gt;Exemplos de rede de proximidade:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NFC (Pagamento por aproximação)&lt;/li&gt;
&lt;li&gt;RFID (Crachás, estoques)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  PAN (Personal Area Network)
&lt;/h3&gt;

&lt;p&gt;Redes para um mesmo ambiente pessoal.&lt;/p&gt;

&lt;p&gt;Um exemplo comum desse tipo de rede no dia a dia são os fones de ouvido sem fio (Bluetooth)&lt;/p&gt;

&lt;h3&gt;
  
  
  LAN (Local Area Network)
&lt;/h3&gt;

&lt;p&gt;Rede para um ambiente maior, como uma casa, apartamento, uma escola, etc.&lt;/p&gt;

&lt;p&gt;Normalmente de 1m a 1km de distância&lt;/p&gt;

&lt;p&gt;O exemplo mais comum de LAN é o Wi-Fi&lt;/p&gt;

&lt;h3&gt;
  
  
  CAN (Campus Area Network)
&lt;/h3&gt;

&lt;p&gt;Rede composta de pelomenos duas redes locais. Comum em locais como Universidades ou Hospitais&lt;/p&gt;

&lt;h3&gt;
  
  
  MAN (Metropolitan Area Network)
&lt;/h3&gt;

&lt;p&gt;Rede que abrange a área de uma cidade.&lt;/p&gt;

&lt;h3&gt;
  
  
  WAN (Wide Area Network)
&lt;/h3&gt;

&lt;p&gt;Grande área de extensão, superando o tamanho de uma cidade.&lt;/p&gt;

&lt;p&gt;A internet é um exemplo de WAN&lt;/p&gt;

&lt;h2&gt;
  
  
  Hub e Switch
&lt;/h2&gt;

&lt;p&gt;Ambos são dispositivos com a função de conectar vários computadores em uma rede. Porém, o Hub envia a mensagem a todos os computadores conectados na rede, posteriormente retornando uma resposta de todos eles para quem enviou a mensagem. Já o Switch faz com que apenas o destinatário da mensagem receba e responda a mensagem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Topologias de Rede
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Topologia em Anel
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Topologia em Barramento
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Topologia em Estrela
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Topologia em Malha (mesh)
&lt;/h3&gt;

</description>
      <category>network</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Algoritmos de Ordenação</title>
      <dc:creator>João Pedro V</dc:creator>
      <pubDate>Fri, 04 Oct 2024 12:45:21 +0000</pubDate>
      <link>https://dev.to/joaopedrov0/algoritmos-de-ordenacao-24oo</link>
      <guid>https://dev.to/joaopedrov0/algoritmos-de-ordenacao-24oo</guid>
      <description>&lt;h2&gt;
  
  
  Ordenação
&lt;/h2&gt;

&lt;p&gt;Nesta seção vamos estudar alguns algoritmos de Ordenação, úteis para, por exemplo, viabilizar a &lt;strong&gt;Pesquisa Binária&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Vale ressaltar que você pode usar estes algoritmos com qualquer lista que conhenha qualquer tipo de dado que você seja capaz de estabelecer uma ordem de alguma forma. Apesar disso, para fins didáticos e de facilitar o entendimento de cada algoritmo, foi utilizado números e na ordem crescente.&lt;/p&gt;

&lt;p&gt;Outro detalhe importante é que os algoritmos de ordenação trabalham bastante com as comparações de maior e menor, o que já funciona perfeitamente para números. Caso você queira ordenar outro tipo de dado, como uma string, pode usar a ordem alfabética para isso, ou então alguma tabela como unicode ou ASCII dependendo no que você estiver trabalhando.&lt;/p&gt;

&lt;p&gt;Também vale dizer que aqui não vai ter código de fato em nenhuma linguagem, apenas uma sintaxe genérica para representação de listas, escolhi fazer dessa forma pois o objetivo não é dar o passo a passo de como fazer cada tipo de algoritmo de ordenação, e sim fazer você entender a lógica por trás deles, pra aí sim você poder pensar em como implementar ele com a ferramenta e dados que você tiver em mãos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Selection Sort (Ordenação por Seleção)
&lt;/h3&gt;

&lt;p&gt;No &lt;em&gt;Selection Sort&lt;/em&gt;, é feita uma ordenação com base na busca do primeiro ou último termo de uma lista. A ideia é que, posição a posição, você identifique qual elemento deve estar ali.&lt;/p&gt;

&lt;p&gt;Por exemplo, considere que você tenha uma lista de 10 números, do 1 ao 10 de modo desordenado, e queira ordena-la de modo crescente. Nesse caso, você vai procurar pelo menor número da lista (no nosso caso, o número 1) e trocá-lo de posição com o primeiro item da lista.&lt;/p&gt;

&lt;p&gt;Depois de posicionado o primeiro elemento da forma correta, você parte então para a segunda posição, e procura na lista, considerando do segundo elemento pra frente apenas, qual o menor elemento daquela lista (no nosso caso, o número 2).&lt;/p&gt;

&lt;p&gt;Para deixar mais claro como isso acontece, considere que a lista hipotética mencionada anteriormente seja essa aqui:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[2, 3, 10, 9, 8, 4, 1, 5, 7, 6]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Quando identificarmos que o primeiro elemento deve ser o 1 (pois estamos ordenando de forma &lt;strong&gt;crescente&lt;/strong&gt; e o menor número da lista é o 1), podemos trocar ele de lugar com o atual primeiro elemento da lista, dessa forma:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[1, 3, 10, 9, 8, 4, 2, 5, 7, 6]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Sucessivamente, vamos continuar fazendo isso até que a lista inteira esteja ordenada:&lt;/p&gt;

&lt;p&gt;Procurando o segundo termo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[1, 2, 10, 9, 8, 4, 3, 5, 7, 6]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Procurando o terceiro termo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[1, 2, 3, 9, 8, 4, 10, 5, 7, 6]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Procurando o quarto termo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[1, 2, 3, 4, 8, 9, 10, 5, 7, 6]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Procurando o quinto termo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[1, 2, 3, 4, 5, 9, 10, 8, 7, 6]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Procurando o sexto termo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[1, 2, 3, 4, 5, 6, 10, 8, 7, 9]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Procurando o sétimo termo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[1, 2, 3, 4, 5, 6, 7, 8, 10, 9]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Note que agora estamos procurando pelo oitavo elemento da lista, porém ele já está no seu devido lugar. Caso isso não tenha ficado claro, o que acontecerá aqui será que ele vai permanecer no mesmo lugar. Seria tipo trocar de posição com a exata posição em que ele está, entende? Por isso ele se mantém na posição correta&lt;/p&gt;

&lt;p&gt;Procurando o oitavo termo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[1, 2, 3, 4, 5, 6, 7, 8, 10, 9]&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sim, durante essa iteração do nosso algoritmo, a lista permanecerá igual.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Procurando o nono termo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Por fim, invertidas as últimas duas posições, temos a lista devidamente ordenada, de modo crescente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Insertion Sort (Ordenação por Inserção)
&lt;/h3&gt;

&lt;p&gt;A &lt;em&gt;Insertion Sort&lt;/em&gt; busca partir de uma lista menor, e ir inserindo os novos elementos na sua posição correta, já de forma ordenada.&lt;/p&gt;

&lt;p&gt;Por exemplo, observe a seguinte lista que queremos ordenar de forma crescente:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[3, 5, 2, 5, 9, 7, 8]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Nesse caso, podemos olhar para os dois primeiros elementos e notar que eles já estão ordenados de forma crescente, portanto, não precisamos mexer neles.&lt;/p&gt;

&lt;p&gt;Lista atual: &lt;code&gt;[3, 5]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Agora, vamos &lt;strong&gt;inserir&lt;/strong&gt; o próximo elemento já na sua posição correta. No caso nosso elemento é o 2&lt;/p&gt;

&lt;p&gt;Começando ali pelo 5, podemos comparar com o 2 e concluir que o 5 é maior que o 2, portanto, o 2 deve vir antes.&lt;/p&gt;

&lt;p&gt;Comparando agora com o próximo elemento, concluímos que 3 também é maior que 2, portanto, nosso novo elemento acabou sendo inserido no início da nossa lista.&lt;/p&gt;

&lt;p&gt;Lista atual: &lt;code&gt;[2, 3, 5]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Agora, vamos adicionar o 5 à nossa nova lista ordenada.&lt;/p&gt;

&lt;p&gt;Como 5 não é maior do que 5, já encontramos a posição ideal para ele. (Aqui no caso estamos verificando se o elemento novo é &lt;strong&gt;maior&lt;/strong&gt; que o atual, mas se você fizer o contrário, e na hora de verificar, checar se ele é &lt;strong&gt;menor&lt;/strong&gt;, você chegaria na mesma resposta, a diferença é que ele perceberia que 5 não é menor que 5, e passaria pra próxima comparação, quando ele percebesse que o número é menor do que 5, aí sim ele iria inserir na nova lista.)&lt;/p&gt;

&lt;p&gt;Lista atual: &lt;code&gt;[2, 3, 5, 5]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;A partir daqui é só seguir nesse mesmo processo até chegar no final da lista e nossa nova lista ter a mesma quantidade de elementos que a original.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bubble Sort (Ordenação por Bolha)
&lt;/h3&gt;

&lt;p&gt;O &lt;em&gt;Bubble Sort&lt;/em&gt; consiste em basicamente percorrer uma lista analizando em pares os elementos consecutivos e invertendo-os de posição caso estejam em ordem errada, e repetir o processo até que toda a lista esteja ordenada.&lt;/p&gt;

&lt;p&gt;Do ponto de vista de quem vai desenvolver o algoritmo, basicamente se cria um laço de repetição que vai analizar os elementos &lt;code&gt;lista[i]&lt;/code&gt; e &lt;code&gt;lista[i+1]&lt;/code&gt; e invertê-los caso necessário (Por exemplo, em uma ordem crescente, você inverteria os elemntos se &lt;code&gt;lista[i]&lt;/code&gt; fosse maior que &lt;code&gt;lista[i+1]&lt;/code&gt;)&lt;/p&gt;

&lt;h3&gt;
  
  
  Merge Sort (Ordenação por Mesclagem)
&lt;/h3&gt;

&lt;p&gt;O &lt;em&gt;Merge Sort&lt;/em&gt; divide a lista e as sublistas resultantes ao meio até que cada parte tenha apenas 1 elemento. Depois disso, essas sublistas são mescladas aos poucos de forma ordenada até voltar ao tamanho da lista original&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;lista[0]&lt;/th&gt;
&lt;th&gt;lista[1]&lt;/th&gt;
&lt;th&gt;lista[2]&lt;/th&gt;
&lt;th&gt;lista[3]&lt;/th&gt;
&lt;th&gt;lista[4]&lt;/th&gt;
&lt;th&gt;lista[5]&lt;/th&gt;
&lt;th&gt;lista[6]&lt;/th&gt;
&lt;th&gt;lista[7]&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Esta lista será dividida em 2, e as listas resultantes também, até que reste apenas 1 elemento por lista.&lt;/p&gt;

&lt;p&gt;Nesse caso, nós vamos ter 3 "graus" de sublistas, ou seja, vamos dividir ao meio 3 vezes até que tenha apenas 1 elemento por lista.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;1° Sublista de Grau 3&lt;/th&gt;
&lt;th&gt;2° Sublista de Grau 3&lt;/th&gt;
&lt;th&gt;3° Sublista de Grau 3&lt;/th&gt;
&lt;th&gt;4° Sublista de Grau 3&lt;/th&gt;
&lt;th&gt;5° Sublista de Grau 3&lt;/th&gt;
&lt;th&gt;6° Sublista de Grau 3&lt;/th&gt;
&lt;th&gt;7° Sublista de Grau 3&lt;/th&gt;
&lt;th&gt;8° Sublista de Grau 3&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;[5]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[6]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[3]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[1]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[4]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[8]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[7]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[2]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;No momento de mergear (mesclar) as sublistas de grau 3, vamos adicioná-las às sublistas de grau 2 de modo ordenado, assim teremos estas 4 sublistas de grau 2:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;1° Sublista de Grau 2&lt;/th&gt;
&lt;th&gt;2° Sublista de Grau 2&lt;/th&gt;
&lt;th&gt;3° Sublista de Grau 2&lt;/th&gt;
&lt;th&gt;4° Sublista de Grau 2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;[5, 6]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[1, 3]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[4, 8]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[2, 7]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Observação: O termo "grau" de sublista não é algo que realmente existe, estou usando esse termo só para fins de explicação, eu criei esse conceito para facilitar o entendimento.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Depois disso, vamos mesclar essas sublistas resultantes, também de forma ordenada:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;1° Sublista de Grau 1&lt;/th&gt;
&lt;th&gt;2° Sublista de Grau 1&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;[1, 3, 5, 6]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[2, 4, 7, 8]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Por fim, vamos mesclar essas últimas duas sublistas e ter novamente uma lista com o tamanho original, 8 elementos.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Lista Ordenada&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;[1, 2, 3, 4, 5, 6, 7, 8]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Quick Sort (Ordenação Rápida)
&lt;/h3&gt;

&lt;p&gt;Semelhante a &lt;em&gt;Merge Sort&lt;/em&gt;, a &lt;em&gt;Quick Sort&lt;/em&gt; também usa uma divisão "ao meio" das listas e sublistas porém a diferença é que na ordenação rápida escolhe-se um pivô e posiciona-o no "centro" de uma nova lista onde os itens que devem vir antes dele são posicionados antes, e os que deveriam vir depois, são posicionados depois.&lt;/p&gt;

&lt;p&gt;Por exemplo, vamos supor que precisemos ordenar uma lista desordenada com números de 1 a 10. Nesse método, se nosso pivô for 5 e nós quisermos ordenar a lista de modo crescente, todos os valores menores que cinco deverão vir antes do 5, e os elementos maiores, depois.&lt;/p&gt;

&lt;p&gt;Note que não há necessidade de ordenar os elementos durante essa nova posição deles, pois depois de feita essa divisão e redisposição dos elementos, um novo pivô será escolhido para cada sublista e esse processo se repetirá recursivamente até que sobre apenas 1 elemento em cada sublista, nesse caso, já estariam ordenados corretamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  E é isso!
&lt;/h2&gt;

&lt;p&gt;Espero que esse conteúdo tenha te ajudado a entender melhor os algoritmos de ordenação! Qualquer dúvida, sugestão ou correção que você tenha, sinta-se a vontade para deixar nos comentários ;)&lt;/p&gt;

&lt;p&gt;Créditos da imagem de cover: &lt;a href="https://www.pexels.com/pt-br/foto/fotografia-de-close-up-de-lapis-de-cor-743986/" rel="noopener noreferrer"&gt;Foto de Jess Bailey Designs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>computerscience</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>Lógica Matemática</title>
      <dc:creator>João Pedro V</dc:creator>
      <pubDate>Thu, 25 Jul 2024 20:26:14 +0000</pubDate>
      <link>https://dev.to/joaopedrov0/logica-matematica-4153</link>
      <guid>https://dev.to/joaopedrov0/logica-matematica-4153</guid>
      <description>&lt;h1&gt;
  
  
  O Conceito de Proposição
&lt;/h1&gt;

&lt;p&gt;Uma proposição é uma afirmação na qual seja possível atribuir um sentido lógico a ela.&lt;/p&gt;

&lt;p&gt;Alguns exemplos de proposições são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jorge é feliz&lt;/li&gt;
&lt;li&gt;O céu é vermelho&lt;/li&gt;
&lt;li&gt;A terra é plana&lt;/li&gt;
&lt;li&gt;5 &amp;gt; 10&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Você pode ter notado que, com exceção da primeira proposição, as outras três estão incorretas, se você teve esse pensamento para alguma das afirmações anteriores, perfeito! Você acabou de atribuir um valor lógico à uma proposição.&lt;/p&gt;

&lt;p&gt;Como dito anteriormente, uma proposição é uma afirmação que você pode atribuir um valor lógico (ou seja, verdadeiro ou falso).&lt;/p&gt;

&lt;p&gt;O que você acabou de fazer foi atribuir o valor lógico "falso" para uma das proposições anteriores. Receber o valor lógico "falso" não é algo negativo nesse caso, só queremos saber se ela é uma proposição ou não. A afirmação "Jorge é feliz" por exemplo, é uma proposição pois você pode atribuir o valor lógico "verdadeiro", concordando que Jorge realmente é feliz, ou "falso", discordando do que foi dito. O que realmente importa aqui é o fato de você poder afirmar ou negar essa afirmação.&lt;/p&gt;

&lt;p&gt;Parece bem abrangente né? Mas nem tudo é uma proposição, existem algumas sentenças que não podem ser consideradas uma proposição pelo motivo de não ser possível atribuir um valor lógico à elas, como por exemplo sentenças exclamativas, imperativas e interrogativas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sentenças Exclamativas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Uau!&lt;/li&gt;
&lt;li&gt;Parabéns!&lt;/li&gt;
&lt;li&gt;Obrigado!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sentenças Imperativas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pegue o livro.&lt;/li&gt;
&lt;li&gt;Coma uma maçã.&lt;/li&gt;
&lt;li&gt;Receba o presente.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sentenças Interrogativas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Parece abrangente?&lt;/li&gt;
&lt;li&gt;Qual a cor do céu?&lt;/li&gt;
&lt;li&gt;Quantas estrelas tem no espaço?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Além disso, existe também alguns princípios que as proposições devem seguir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Princípio da identidade
&lt;/h2&gt;

&lt;p&gt;Esse princípio afirma que uma proposição é igual a ela mesma, uma proposição verdadeira é verdadeira e uma proposição falsa é falsa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Princípio da não-contradição
&lt;/h2&gt;

&lt;p&gt;Esse princípio diz que uma proposição não pode ser verdadeira e falsa ao mesmo tempo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Princípio do Terceiro Excluído
&lt;/h2&gt;

&lt;p&gt;Esse princípio diz que uma proposição só poderá ser verdadeira ou falsa, não havendo uma terceira possibilidade.&lt;/p&gt;

&lt;p&gt;Além dos princípios e do conceito base, também é importante saber da existência de diferentes tipos de proposição, como as &lt;strong&gt;proposições simples e compostas&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proposições simples
&lt;/h2&gt;

&lt;p&gt;Essas proposições são singulares e não acompanham outra proposição na  mesma sentença. Normalmente usa-se letras minúsculas para se referenciar a estas preposições.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proposições compostas
&lt;/h2&gt;

&lt;p&gt;Essa categoria de proposição é composta de no mínimo duas proposições conectadas entre si, com algum dos operadores lógicos que veremos a seguir, formando uma única sentença. Para esse tipo de sentença, normalmente usa-se letras maiúsculas para referenciá-las.&lt;/p&gt;

&lt;h1&gt;
  
  
  Entendendo a Tabela-Verdade
&lt;/h1&gt;

&lt;p&gt;Na Lógica Matemática, trabalhamos com a análise de proposições, normalmente compostas e a relação entre elas de acordo com os operadores que as conectam.&lt;/p&gt;

&lt;p&gt;Uma tabela-verdade é literalmente uma tabela onde se coloca todas as combinações de valores lógicos possíveis para as proposições, para analisá-las mais atentamente, e assim, conseguir compreender mais sobre o que está acontecendo. Isso vai ficar mais claro quando conhecermos os operadores lógicos.&lt;/p&gt;

&lt;p&gt;Exemplos de tabela verdade:&lt;/p&gt;

&lt;p&gt;Tabela-verdade com uma proposição&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;p&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;V &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Tabela-verdade com duas proposições&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;p&lt;/th&gt;
&lt;th&gt;q&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;V &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Tabela-verdade com três proposições&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;p&lt;/th&gt;
&lt;th&gt;q&lt;/th&gt;
&lt;th&gt;r&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;V &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Você pode ter notado que a quantidade de linhas da tabela dobra quando você acrescenta uma nova proposição. Isso acontece pelo cálculo de possibilidades, que nesse caso, são duas, "verdadeiro" ou "falso". Sendo assim, toda vez que você acrescenta uma nova proposição, é como se estivesse multiplicando a quantidade de possibilidades por 2.&lt;/p&gt;

&lt;p&gt;Para uma definição mais formal, a tabela verdade sempre terá 2ⁿ linhas, sendo &lt;em&gt;n&lt;/em&gt; a quantidade de proposições.&lt;/p&gt;

&lt;h1&gt;
  
  
  Operadores Lógicos e Ordem de Prioridade
&lt;/h1&gt;

&lt;p&gt;Assim como na matemática convencional, a Lógica Matemática na qual vamos tratar aqui contém operadores próprios tal qual sua respectiva ordem de prioridade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operadores Lógicos
&lt;/h2&gt;

&lt;p&gt;Para os exemplos a seguir, considere "p" e "q" como proposições simples.&lt;/p&gt;

&lt;h3&gt;
  
  
  Negação
&lt;/h3&gt;

&lt;p&gt;O operador de negação inverte o valor lógico da proposição.&lt;/p&gt;

&lt;p&gt;Normalmente conhecido como o "não" lógico.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;p&lt;/th&gt;
&lt;th&gt;¬p&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;V &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;~&lt;/strong&gt;&lt;em&gt;p&lt;/em&gt; = &lt;strong&gt;'&lt;/strong&gt;&lt;em&gt;p&lt;/em&gt; = &lt;strong&gt;¬&lt;/strong&gt;&lt;em&gt;p&lt;/em&gt; = &lt;strong&gt;não&lt;/strong&gt; &lt;em&gt;p&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Símbolo do operador: &lt;code&gt;~&lt;/code&gt; ou &lt;code&gt;'&lt;/code&gt; ou &lt;code&gt;¬&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Conjunção
&lt;/h3&gt;

&lt;p&gt;Normalmente conhecido como o "e" lógico.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;p&lt;/th&gt;
&lt;th&gt;q&lt;/th&gt;
&lt;th&gt;p ⋀ q&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;V &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;O operador de conjunção retorna verdadeiro se ambas as proposições forem verdadeiras e falso em qualquer outro caso.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;p&lt;/em&gt; &lt;strong&gt;⋀&lt;/strong&gt; &lt;em&gt;q&lt;/em&gt; = &lt;em&gt;p&lt;/em&gt; &lt;strong&gt;e&lt;/strong&gt; &lt;em&gt;q&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Símbolo do operador: &lt;code&gt;⋀&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Disjunção
&lt;/h3&gt;

&lt;p&gt;Normalmente conhecido como o "ou" lógico.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;p&lt;/th&gt;
&lt;th&gt;q&lt;/th&gt;
&lt;th&gt;p ⋁ q&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;V &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;O operador de disjunção retorna verdadeiro se ao menos uma das proposições forem verdadeiras, retornando falso apenas quando ambas são falsas.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;p&lt;/em&gt; &lt;strong&gt;⋁&lt;/strong&gt; &lt;em&gt;q&lt;/em&gt; = &lt;em&gt;p&lt;/em&gt; &lt;strong&gt;ou&lt;/strong&gt; &lt;em&gt;q&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Símbolo do operador: &lt;code&gt;⋁&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Disjunção Exclusiva
&lt;/h3&gt;

&lt;p&gt;Normalmente conhecido como o "ou exclusivo".&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;p&lt;/th&gt;
&lt;th&gt;q&lt;/th&gt;
&lt;th&gt;p ⊻ q&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;V &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A disjunção exclusiva retorna verdadeiro somente se uma &lt;strong&gt;ou&lt;/strong&gt; outra proposição for verdadeira. Caso ambas sejam verdadeiras ou ambas sejam falsas, ele retorna falso.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;p&lt;/em&gt; &lt;strong&gt;⊻&lt;/strong&gt; &lt;em&gt;q&lt;/em&gt; = &lt;strong&gt;ou&lt;/strong&gt; &lt;em&gt;p&lt;/em&gt; &lt;strong&gt;ou&lt;/strong&gt; &lt;em&gt;q&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Símbolo do operador: &lt;code&gt;⊻&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Condicional
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;p&lt;/th&gt;
&lt;th&gt;q&lt;/th&gt;
&lt;th&gt;p → q&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;V &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Normalmente conhecido como o "então" lógico.&lt;/p&gt;

&lt;p&gt;A condicional retorna verdadeiro ao menos que a &lt;strong&gt;primeira&lt;/strong&gt; proposição seja &lt;strong&gt;verdadeira&lt;/strong&gt; e a &lt;strong&gt;segunda&lt;/strong&gt; seja &lt;strong&gt;falsa&lt;/strong&gt;, portanto, nota-se que &lt;strong&gt;a ordem importa&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;p&lt;/em&gt; &lt;strong&gt;→&lt;/strong&gt; &lt;em&gt;q&lt;/em&gt; = &lt;strong&gt;se&lt;/strong&gt; &lt;em&gt;p&lt;/em&gt; &lt;strong&gt;então&lt;/strong&gt; &lt;em&gt;q&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Símbolo do operador: &lt;code&gt;→&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Bicondicional
&lt;/h3&gt;

&lt;p&gt;Normalmente conhecido como o "se e somente se".&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;p&lt;/th&gt;
&lt;th&gt;q&lt;/th&gt;
&lt;th&gt;p ↔ q&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;V &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A bicondicional retorna verdadeiro caso ambas as proposições tenham o mesmo valor lógico e falso caso contrário.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;p&lt;/em&gt; &lt;strong&gt;↔&lt;/strong&gt; &lt;em&gt;q&lt;/em&gt; = &lt;em&gt;p&lt;/em&gt; &lt;strong&gt;se e somente se&lt;/strong&gt; &lt;em&gt;q&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Símbolo do operador: &lt;code&gt;↔&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Ordem de Prioridade
&lt;/h2&gt;

&lt;p&gt;Assim como na matemática "comum", que as operações devem seguir uma ordem (multiplicações precedem as adições, por exemplo), quando você vai resolver operações lógicas, você deve seguir uma ordem de precedência das operações, e a ordem é a seguinte:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Negação&lt;/li&gt;
&lt;li&gt;Conjunção e Disjunção, na ordem em que aparecem da esquerda pra direita&lt;/li&gt;
&lt;li&gt;Condicional&lt;/li&gt;
&lt;li&gt;Bicondicional&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Classificação das proposições compostas
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Tautologia
&lt;/h2&gt;

&lt;p&gt;Temos uma tautologia quando uma proposição composta &lt;strong&gt;sempre retorna verdadeiro&lt;/strong&gt;, independente das suas proposições simples.&lt;/p&gt;

&lt;p&gt;Observe um exemplo de tautologia:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;p&lt;/th&gt;
&lt;th&gt;~p&lt;/th&gt;
&lt;th&gt;p ⋁ ~p&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;V &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;No exemplo, estamos usando o operador de disjunção para unir as proposições &lt;em&gt;p&lt;/em&gt; e &lt;em&gt;~p&lt;/em&gt; ("não" &lt;em&gt;p&lt;/em&gt;), porém, o operador "ou" retorna verdadeiro sempre que ao menos um dos valores seja verdadeiro, e estamos usando ele para unir duas proposições que &lt;strong&gt;sempre&lt;/strong&gt; serão opostas, portanto sempre haverá uma proposição verdadeira, resultando em "verdadeiro" sempre.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contradição
&lt;/h2&gt;

&lt;p&gt;Temos uma contradição quando acontece o exato oposto do que acontece na tautologia, isto é, a proposição composta &lt;strong&gt;sempre retorna falso&lt;/strong&gt;, independente das proposições simples envolvidas.&lt;/p&gt;

&lt;p&gt;Uma forma simples de exemplificar uma contradição, é com o mesmo exemplo anterior porém aplicado com uma conjunção ao invés de uma disjunção. Observe o exemplo abaixo:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;p&lt;/th&gt;
&lt;th&gt;~p&lt;/th&gt;
&lt;th&gt;p ⋀ ~p&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;V &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;No exemplo acima, temos uma proposição formada por duas proposições simples inversas, isto é, uma sempre terá o valor lógico oposto ao da outra. Lembrando que a conjunção sempre retornará falso quando ao menos uma das proposições forem falsas, e considerando que os valores no exemplo &lt;strong&gt;sempre&lt;/strong&gt; serão opostos, isso sempre retornará falso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contingência
&lt;/h2&gt;

&lt;p&gt;Diferente das outras duas classificações explicadas anteriormente, temos uma contingência quando o que a proposição retornará depende do valor lógico atribuído às proposições simples relacionadas a ela. Observe dois exemplos de contingência abaixo, usando os mesmos operadores usados nos exemplos anteriores:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;p&lt;/th&gt;
&lt;th&gt;q&lt;/th&gt;
&lt;th&gt;p ⋀ q&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;V &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;p&lt;/th&gt;
&lt;th&gt;q&lt;/th&gt;
&lt;th&gt;p ⋁ q&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;V &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;td&gt; V &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;td&gt; F &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Só uma última consideração
&lt;/h2&gt;

&lt;p&gt;Por questões de simplicidade, foram usadas duas proposições apenas nos exemplos de contingência, mas isso não é obrigatório. É possível ter uma tautologia ou uma contradição com duas ou mais proposições simples envolvidas.&lt;/p&gt;

&lt;h1&gt;
  
  
  Postulados, Propriedades e Teoremas da álgebra de Boole
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Em breve...&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Teorema de Morgan
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Em breve...&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Equivalência e Implicação Lógica (⇔⇒)
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Implicação Lógica
&lt;/h2&gt;

&lt;p&gt;Dizemos que há uma implicação lógica quando a relação de condição aplicada entre duas proposições resulta em uma tautologia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Equivalência Lógica
&lt;/h2&gt;

&lt;p&gt;Dizemos que há uma equivalência lógica quando as tabelas-verdade de duas proposições são idênticas&lt;/p&gt;

</description>
      <category>computerscience</category>
      <category>math</category>
    </item>
    <item>
      <title>Conjuntos</title>
      <dc:creator>João Pedro V</dc:creator>
      <pubDate>Fri, 19 Jul 2024 01:00:12 +0000</pubDate>
      <link>https://dev.to/joaopedrov0/conjuntos-1pik</link>
      <guid>https://dev.to/joaopedrov0/conjuntos-1pik</guid>
      <description>&lt;h1&gt;
  
  
  Conceito
&lt;/h1&gt;

&lt;p&gt;Conjuntos são uma coleção de elementos. Esses elementos podem ser diversas coisas. Pode ser um conjunto de livros, alunos, conchas do mar, pedras, etc.&lt;/p&gt;

&lt;p&gt;Na matemática, que é o nosso foco aqui, conjuntos podem incluir desde números até mesmo outros conjuntos, além de não precisarem ser finitos ou ter elementos todos do mesmo tipo.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conjuntos da matemática
&lt;/h1&gt;

&lt;p&gt;Existem 6 conjuntos numéricos relevantes para nós nesse momento, são eles os &lt;strong&gt;Naturais&lt;/strong&gt;, &lt;strong&gt;Inteiros&lt;/strong&gt;, &lt;strong&gt;Racionais&lt;/strong&gt;, &lt;strong&gt;Irracionais&lt;/strong&gt;, &lt;strong&gt;Reais&lt;/strong&gt; e &lt;strong&gt;Complexos&lt;/strong&gt; (ou Imaginários).&lt;/p&gt;

&lt;h1&gt;
  
  
  Notação
&lt;/h1&gt;

&lt;p&gt;Como forma de padronizar a escrita dos conjuntos e facilitar a compreensão, ou seja, deixar claro quando estamos tratando de um conjunto, foi criado a simbologia das &lt;strong&gt;chaves&lt;/strong&gt; &lt;code&gt;{}&lt;/code&gt; que deve sempre estar envolvendo o conjunto, demarcando que se trata de um. Além das letras maiúsculas, a denotação de conjuntos é feita usando letras &lt;strong&gt;maiúsculas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Observe abaixo um conjunto de vogais:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;V = {a, e, i, o, u}&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Notação de conjuntos a partir de regras
&lt;/h2&gt;

&lt;p&gt;Existe uma notação para definir um conjunto de elementos a partir de ume regra:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;A = {f(x) | &amp;lt;universo&amp;gt;, &amp;lt;condições&amp;gt;}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Nesse caso, essa regra diz que o conjunto A contém todos os valores f(x) dados os valores de x contidos no universo que respeitem as condições.&lt;/p&gt;

&lt;h1&gt;
  
  
  Cardinalidade
&lt;/h1&gt;

&lt;p&gt;"Cardinalidade" é o nome que se dá para a quantidade de elementos do conjunto, caso ele seja um conjunto finito.&lt;/p&gt;

&lt;p&gt;A notação para se explicitar que se trata do cardeal do conjunto é &lt;code&gt;n(A)&lt;/code&gt;, onde "A" é o conjunto referido.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cardinalidade Zero ou Conjunto Vazio
&lt;/h2&gt;

&lt;p&gt;Um conjunto vazio é um conjunto que não contém nenhum elemento dentro dele, porém isso não nega sua existência. Um conjunto não precisa ter itens dentro dele para existir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Notação do conjunto vazio
&lt;/h3&gt;

&lt;p&gt;O conjunto vazio é denotado como ∅. E atenção, essa &lt;strong&gt;não é a denotação do vazio&lt;/strong&gt;, mas sim de um &lt;strong&gt;conjunto vazio&lt;/strong&gt;. Para entender a diferença, observe o seguinte exemplo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;n(∅) = 0&lt;/code&gt;&lt;br&gt;
&lt;code&gt;n({∅}) = 1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Isso ocorre pois, no primeiro exemplo queremos saber a quantidade de itens dentro de um &lt;strong&gt;conjunto vazio&lt;/strong&gt;, que no caso, não tem nada lá, ou seja, 0 elementos, como no segundo exemplo trata-se de um &lt;strong&gt;conjunto contendo um conjunto vazio&lt;/strong&gt;, ele tem um elemento dentro dele, que é o próprio conjunto vazio.&lt;/p&gt;

&lt;h1&gt;
  
  
  Subconjuntos e Igualdade
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Subconjuntos
&lt;/h2&gt;

&lt;p&gt;Temos um subconjunto quando todos os elementos de um conjunto estão dentro de outro conjunto.&lt;/p&gt;

&lt;p&gt;O símbolo que usamos para notação de subconjuntos é o "contido": &lt;code&gt;⊂&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Observe os exemplos abaixo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;A ⊂ B&lt;/code&gt; (A está contido em B)&lt;br&gt;
&lt;code&gt;{1, 2, 3, 4} ⊂ {1, 2, 3, 4, 5, 6, 7, 8}&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Igualdade
&lt;/h2&gt;

&lt;p&gt;Podemos dizer que há igualdade entre A e B se &lt;code&gt;A ⊂ B&lt;/code&gt; e &lt;code&gt;B ⊂ A&lt;/code&gt; forem verdadeiros.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conjunto das Partes
&lt;/h1&gt;

&lt;p&gt;O conjunto das partes &lt;code&gt;P(A)&lt;/code&gt; de um conjunto A é outro conjunto contendo todos os possíveis subconjuntosas diretamente ligados a A, o que significa que não considera elementos de conjuntos contidos em A. As combinações devem incluir o conjunto inteiro e um conjunto vazio, pois são subconjuntos de A.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;P({2, 3, 4}) = {∅, {2}, {3}, {4}, {2, 3}, {2, 4}, {3, 4}, {2, 3, 4}}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;P(∅) = {∅}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;P({2}) = {∅, {2}}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;A quantidade de itens no conjunto das partes de um conjunto é igual a 2 elevado a quantidade de itens contidos no conjunto. Portanto, um conjunto vazio terá um item (2⁰ = 1), com 1 item terá 2 itens e por ai vai.&lt;/p&gt;

&lt;h1&gt;
  
  
  Produto Cartesiano
&lt;/h1&gt;

&lt;p&gt;O Produto Cartesiano é um conjunto de pares ordenados com elementos do primeiro e do segundo conjuntos, combinados em pares, tendo todos os elementos do primeiro conjunto combinados com todos os elementos do segundo conjunto.&lt;/p&gt;

&lt;p&gt;O Produto Cartesiano entre dois conjuntos A e B (AxB) pode ser descrito da seguinte forma, considerando que A = {2, 3, 4} e B = {5, 6}&lt;/p&gt;

&lt;p&gt;&lt;code&gt;AxB = {(2,5), (2,6), (3,5), (3,6), (4,5), (4,6)}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;A quantidade de itens no Produto Cartesiano de dois conjuntos é igual ao produto do cardinal desses dois conjuntos. Em palavras mais simples, a quantidade de elementos que você vai obter no final é igual ao resultado de você multiplicar a quantidade de itens que tem nos dois.&lt;/p&gt;

&lt;h1&gt;
  
  
  União
&lt;/h1&gt;

&lt;p&gt;A união de A e B (A⋃B) é igual a todos os elementos que tem em A ou em B.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{2, 3} ⋃ {4, 5} = {2, 3, 4, 5}&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Interseção
&lt;/h1&gt;

&lt;p&gt;A interseção entre A e B (A⋂B) é um conjunto que tem apenas os elementos que ambos os conjuntos têm em comum, podendo também ser um conjunto vazio no caso de não terem nada em comum (Conjuntos disjuntos).&lt;/p&gt;

&lt;h1&gt;
  
  
  Diferença
&lt;/h1&gt;

&lt;p&gt;Semelhante ao conceito de subtração, a diferença entre dois conjuntos é o que o primeiro conjunto tem que o segundo não tem.&lt;/p&gt;

&lt;p&gt;Dessa forma: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;{2, 3, 4, 5, 6} - {3, 4, 5} = {2, 6}&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Curiosidade
&lt;/h3&gt;

&lt;p&gt;Uma outra forma de ver diferença, seria a interseção do primeiro conjunto com o complemento do segundo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Complemento
&lt;/h1&gt;

&lt;p&gt;O complemento de A (Ᾱ) é igual a diferença entre o universo de discurso e A (U-A).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Ᾱ = U-A&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Considerando os Naturais como universo de discurso&lt;br&gt;
&lt;code&gt;-{2, 3} = {0, 1, 4, 5, 6, 7, 8, 9...}&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Universo é o ambiente que estamos considerando como o "todo".&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Conjuntos numéricos
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Números Naturais (N)
&lt;/h2&gt;

&lt;p&gt;O conjunto dos números naturais é o conjunto que abrange todos os números inteiros não negativos. (Ou seja, de 0 até infinito)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Números inteiros são números sem parte decimal.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Números Inteiros (Z)
&lt;/h2&gt;

&lt;p&gt;O conjunto dos inteiros abrange todos os inteiros, tanto positivos quanto negativos, assim como o zero.&lt;/p&gt;

&lt;h2&gt;
  
  
  Números Racionais (Q)
&lt;/h2&gt;

&lt;p&gt;O conjunto dos racionais abrange todos os números que podem ser escritos na forma de uma fração de inteiros. Lembrando que o denominador não pode ser zero.&lt;/p&gt;

&lt;h2&gt;
  
  
  Números Irracionais (I)
&lt;/h2&gt;

&lt;p&gt;O conjunto dos irracionais abrange todos os números que não podem ser escritos na forma de uma fração de inteiros. Outra definição seria um número decimal não periódico com infinitas casas decimais, isto é, infinitos números depois da vírgula sem nenhum padrão.&lt;/p&gt;

&lt;h2&gt;
  
  
  Números Reais (R)
&lt;/h2&gt;

&lt;p&gt;O conjunto dos reais abrange a união dos Racionais e Irracionais.&lt;/p&gt;

&lt;h2&gt;
  
  
  Números Imaginários (C)
&lt;/h2&gt;

&lt;p&gt;O conjunto dos imaginários abrange o conjunto dos reais e também inclui números complexos, como por exemplo √-1, que não tem solução dentro do conjunto dos Reais. Raiz quadrada de -1 também é comumente chamada de "i".&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;N é subconjunto de Z&lt;br&gt;
Z é subconjunto de Q&lt;br&gt;
Q e I são subconjuntos de R&lt;br&gt;
R é subconjunto de C&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  E é isso!
&lt;/h1&gt;

&lt;p&gt;Espero que tenham entendido, e sinta-se a vontade para deixar qualquer sugestão, dúvida ou correção nos comentários.&lt;/p&gt;

</description>
      <category>math</category>
    </item>
    <item>
      <title>Introdução à Sistemas de Memória</title>
      <dc:creator>João Pedro V</dc:creator>
      <pubDate>Thu, 11 Jul 2024 23:32:55 +0000</pubDate>
      <link>https://dev.to/joaopedrov0/introducao-a-sistemas-de-memoria-25i</link>
      <guid>https://dev.to/joaopedrov0/introducao-a-sistemas-de-memoria-25i</guid>
      <description>&lt;h1&gt;
  
  
  Conceito de Memória
&lt;/h1&gt;

&lt;p&gt;Uma das funções primordiais de um computador é a capacidade que ele tem de armazenar dados, seja de curto, médio ou longo prazo. Para cada uma dessas escalas de tempo, existem diferentes tipos de memórias que podem ser usadas.&lt;/p&gt;

&lt;h1&gt;
  
  
  Características da memória
&lt;/h1&gt;

&lt;p&gt;Como mencionado anteriormente, diferentes tipos de memórias se adaptam a diferentes tempos de armazenamento de dados. Para que essa adaptação seja possível, algumas características dessas tecnologias de armazenamento variam, como localização, método de acesso, tipo físico, dentre outros.&lt;/p&gt;

&lt;h2&gt;
  
  
  Localização
&lt;/h2&gt;

&lt;p&gt;Existem diferentes localizações de memória que variam a forma com que ela se comunica com o computador.&lt;/p&gt;

&lt;h3&gt;
  
  
  Interna
&lt;/h3&gt;

&lt;p&gt;A memória interna é diretamente acessível à Unidade Central de Processamento (CPU). Exemplos de memória interna são a Memória Principal, Registradores, Memória Cache, etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  Externa
&lt;/h3&gt;

&lt;p&gt;A memória externa consiste em dispositivos periféricos ao computador, que não estão diretamente acessíveis à CPU, mas sim indiretamente através dos controladores de E/S (Entrada e Saída)&lt;/p&gt;

&lt;h2&gt;
  
  
  Método de acesso
&lt;/h2&gt;

&lt;p&gt;Diferentes tipos de memória tem diferentes meios de acessar os dados gravados nela.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sequencial
&lt;/h3&gt;

&lt;p&gt;No &lt;strong&gt;Método de Acesso Sequencial (ou Serial)&lt;/strong&gt;, os dados são acessados em sequência, um atrás do outro, na ordem em que são gravados. Isso faz com que seu tempo de acesso varie, dependendo da posição do dado que se quer ler, uma vez que ele não é capaz de pular diretamente para a posição do dado desejado.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Freb47dnpktxrwevjuzfy.jpg" class="article-body-image-wrapper"&gt;&lt;img 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%2Freb47dnpktxrwevjuzfy.jpg" alt="Image description" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Direto
&lt;/h3&gt;

&lt;p&gt;O &lt;strong&gt;Método de Acesso Direto&lt;/strong&gt; é feito com um salto até o &lt;strong&gt;bloco de registros&lt;/strong&gt; onde está o registro desejado, onde é realizado uma &lt;strong&gt;pesquisa sequencial&lt;/strong&gt; logo em seguida para encontrar o registro em questão.&lt;/p&gt;

&lt;p&gt;As divisões são de &lt;strong&gt;blocos com endereço único&lt;/strong&gt; e o dispositivo de leitura e escrita é o mesmo. O tempo de acesso é variável.&lt;/p&gt;

&lt;p&gt;Um exemplo de dispositivo de armazenamento que utiliza esse método é uma &lt;strong&gt;Unidade de Disco Rígido&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Fiajbj7tsisyidv9zbb9s.jpg" class="article-body-image-wrapper"&gt;&lt;img 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%2Fiajbj7tsisyidv9zbb9s.jpg" alt="Image description" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Aleatório
&lt;/h3&gt;

&lt;p&gt;O &lt;strong&gt;Método de Acesso Aleatório&lt;/strong&gt; é feito diretamente no &lt;strong&gt;registro&lt;/strong&gt; por meio do endereço do mesmo. Os mecanismos de leitura e escrita são separados e o acesso é feito diretamente no endereço, sem ter que percorrer outros endereços nem logicamente quanto fisicamente, por conta disso, o tempo de acesso é &lt;strong&gt;constante&lt;/strong&gt;, independente de onde esteja o endereço desejado.&lt;/p&gt;

&lt;p&gt;Um exemplo de dispositivo que utiliza do &lt;strong&gt;Método de Acesso Aleatório&lt;/strong&gt; é a &lt;strong&gt;Memória Principal&lt;/strong&gt;, ou &lt;strong&gt;Memória RAM&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2F78se4ljqa35s08ffsdan.jpg" class="article-body-image-wrapper"&gt;&lt;img 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%2F78se4ljqa35s08ffsdan.jpg" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Associativo
&lt;/h3&gt;

&lt;p&gt;O &lt;strong&gt;Método de Acesso Associativo&lt;/strong&gt; é feito diretamente no registro e através de um sistema de endereçamento próprio baseado na identificação de padrões de bits. O tempo de acesso é constante.&lt;/p&gt;

&lt;p&gt;Um exemplo de dispositivo que usa esse método é a &lt;strong&gt;Memória Cache&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unidade de transferência
&lt;/h2&gt;

&lt;p&gt;Os dados podem estar gravados, sendo lidos ou escritos de diferentes formas, dentre elas, podem ser &lt;strong&gt;"Palavras"&lt;/strong&gt; ou &lt;strong&gt;"Blocos"&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Palavra
&lt;/h3&gt;

&lt;p&gt;Palavra é a unidade natural em que se organiza a memória no computador. Ela tem um tamanho fixo que depende da máquina e varia entre potências (mais comum) ou múltiplos de 2 (Por exemplo: 8, 16, 32, 64, 128) e representa a quantidade de dados que podem ser lidos/escritos de uma só vez.&lt;/p&gt;

&lt;p&gt;Um computador de 32 bits teria, por exemplo, 4 bytes (32 bits) por palavra, e é essa a unidade fixa que o processador usa para se comunicar e também que é usada para se comunicar com ele.&lt;/p&gt;

&lt;p&gt;Instruções de programa podem exigir uma ou mais palavras.&lt;/p&gt;

&lt;h4&gt;
  
  
  Endereçamento da Memória Principal
&lt;/h4&gt;

&lt;p&gt;O tamanho da palavra também serve para determinar os endereços da Memória Principal, sendo o tamanho da Palavra em &lt;strong&gt;bits&lt;/strong&gt; a potência de 2 que resultará na quantidade de endereços disponíveis. Isso ocorre porque o endereço normalmente deve poder ser representado com uma palavra, que representa 2ⁿ possibilidades de endereços, considerando &lt;em&gt;n&lt;/em&gt; como o tamanho da palavra.&lt;/p&gt;

&lt;p&gt;Esses endereços são usados para guardar e identificar dados da Memória Principal. Isso significa que a RAM vai ser de 2ⁿ? Não, mas seu máximo teórico sim.&lt;/p&gt;

&lt;p&gt;Pra deixar isso mais claro, imagine que você tenha um computador de 32 bits. 2³² bits são 4GB, ou seja, você tem um &lt;strong&gt;máximo teórico&lt;/strong&gt; de 4GB de RAM no computador. Isso significa que o computador tem 4GB de RAM? Não, a ênfase no termo "máximo teórico" foi por conta que o processador tem endereços suficientes para suportar essa quantidade de memória, mas não significa que ele terá tudo isso disponível. Se você colocar 2GB de RAM nesse computador, a memória RAM seria esgotada antes mesmo de preencher todos os endereços disponíveis (o que não significa que não funcionaria), e caso você colocasse 8GB de RAM, o computador ignoraria os outros 4GB e consideraria só os 4 primeiros, pois ele não consegue representar os endereços restantes com 32 bits de palavra.&lt;/p&gt;

&lt;h4&gt;
  
  
  Barramento
&lt;/h4&gt;

&lt;p&gt;O Barramento (também chamado de &lt;em&gt;Bus&lt;/em&gt;) é uma coleção de fios paralelos, normalmente impressos diretamente no PCB que transportam dados, endereços e sinais de controle. Eles conectam, por exemplo, a &lt;strong&gt;Memória Interna&lt;/strong&gt; com a &lt;strong&gt;Unidade Central de Processamento (CPU)&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bloco
&lt;/h3&gt;

&lt;p&gt;Blocos são conjuntos de bits maiores do que uma palavra e que, muitas vezes, contém ou podem conter múltiplas palavras.&lt;/p&gt;

&lt;p&gt;Existem dois casos de bons exemplos de blocos. O armazenamento em dispositivos de &lt;strong&gt;Memória Externa&lt;/strong&gt; costumam ser organizados em blocos, como em Unidades de Disco, onde os blocos recebem endereços únicos e guardam dados dentro deles. Além disso a divisão da &lt;strong&gt;Memória Interna&lt;/strong&gt; e organização da &lt;strong&gt;Memória Cache&lt;/strong&gt; também tem &lt;strong&gt;relação&lt;/strong&gt; com essa estrutura.&lt;/p&gt;

&lt;h2&gt;
  
  
  Capacidade
&lt;/h2&gt;

&lt;p&gt;Uma característica importante das memórias é a sua capacidade de armazenar dados em relação com o tamanho da palavra.&lt;/p&gt;

&lt;p&gt;A ordem de grandeza da capacidade da &lt;strong&gt;Memória Interna&lt;/strong&gt; costuma variar entre KB e GB, sendo os valores mais baixos para Registradores e Memória Cache enquanto os valores mais altos para Memória Principal (RAM).&lt;/p&gt;

&lt;p&gt;Já na &lt;strong&gt;Memória Externa&lt;/strong&gt;, o comum é ver capacidades da ordem de grandeza de MB, GB, ou até mesmo TB que tem barateado muito ultimamente.&lt;/p&gt;

&lt;p&gt;O motivo dessa diferença de capacidade entre as memórias é bem simples: custo.&lt;/p&gt;

&lt;p&gt;As memórias que precisam se comunicar mais com o processador são mais rápidas mas também são mais caras, portanto não é viável e nem necessário uma Memória Cache de 2TB, por exemplo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Desempenho
&lt;/h2&gt;

&lt;p&gt;Existem algumas variáveis dentre os tipos de memória que podem ser levados em conta para comparar seus desempenhos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tempo de acesso
&lt;/h3&gt;

&lt;p&gt;Tempo que dura a localização, leitura ou escrita de um dado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tempo de ciclo
&lt;/h3&gt;

&lt;p&gt;O tempo de ciclo é o tempo de acesso somado ao tempo necessário para fazer o restante dos processos de um ciclo, até estar apto a iniciar outro processo de acesso de memória.&lt;/p&gt;

&lt;h3&gt;
  
  
  Taxa de transferência
&lt;/h3&gt;

&lt;p&gt;Quantidade de &lt;strong&gt;dados transferidos em função do tempo&lt;/strong&gt;, como por exemplo "Mbps" (Megabits por segundo), usado para demonstrar a taxa de transferência de downloads.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tipo físico
&lt;/h2&gt;

&lt;p&gt;Existem diferentes tipos físicos de memória e que são mais empregados em alguns tipos específicos de memórias.&lt;/p&gt;

&lt;h3&gt;
  
  
  Semicondutor
&lt;/h3&gt;

&lt;p&gt;Semicondutores são os tipos físicos mais usados atualmente em memórias internas, a Memória Principal (RAM), por exemplo, funciona a base de semicondutores.&lt;/p&gt;

&lt;h3&gt;
  
  
  Magnético
&lt;/h3&gt;

&lt;p&gt;Um exemplo de memória que utiliza de superfície magnética por exemplo é a Unidade de Disco, que move um braço que modifica a magnetização da superfície do disco para gerar um padrão de "magnetizado" e "não-magnetizado" de grosso modo, criando um padrão legível como os 0 e 1 que representam os dados.&lt;/p&gt;

&lt;h3&gt;
  
  
  Óptico
&lt;/h3&gt;

&lt;p&gt;A superfície óptica é um material que pode ser queimado por um laser no processo de gravação de dados, e essas "queimaduras" poderão ser posteriormente lidas por um laser de alta precisão. Esse é o exemplo da gravação de memória em CDs e DVDs&lt;/p&gt;

&lt;h2&gt;
  
  
  Características físicas
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Persistência de dados (Volátil / Não Volátil)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Memória Volátil
&lt;/h4&gt;

&lt;p&gt;A memória volátil é a memória que &lt;strong&gt;mantém os dados apenas enquanto o dispositivo está sendo energizado&lt;/strong&gt;. Ao desligar o computador por exemplo, o que estava armazenado em memória volátil é perdido. Um exemplo de memória volátil é a memória RAM (memória principal)&lt;/p&gt;

&lt;h4&gt;
  
  
  Memória não-volátil
&lt;/h4&gt;

&lt;p&gt;A memória não volátil é a memória que &lt;strong&gt;mantém os dados mesmo quando não está sendo energizado&lt;/strong&gt;, mantendo assim os dados quando o computador é desligado. Um exemplo de memória não volátil são os HDs e SSDs, ou seja, em grande parte memórias externas são não voláteis.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apagável / Não apagável
&lt;/h3&gt;

&lt;p&gt;Existem diferentes tipos de memória que variam sua capacidade de modificação do conteúdo. Algumas memórias, por exemplo, servem apenas para leitura.&lt;/p&gt;

&lt;h4&gt;
  
  
  Read Only Memory (ROM)
&lt;/h4&gt;

&lt;p&gt;Memória apenas de leitura, não permite gravação.&lt;/p&gt;

&lt;h4&gt;
  
  
  Memória principalmente de leitura
&lt;/h4&gt;

&lt;p&gt;Memórias que &lt;strong&gt;permitem gravação&lt;/strong&gt;, porém são &lt;strong&gt;mais usadas para leitura&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Memória de leitura e gravação
&lt;/h4&gt;

&lt;p&gt;Memórias que permitem &lt;strong&gt;leitura&lt;/strong&gt; e &lt;strong&gt;gravação&lt;/strong&gt; de dados.&lt;/p&gt;

&lt;h1&gt;
  
  
  Hierarquia de Memória
&lt;/h1&gt;

&lt;p&gt;&lt;a href="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%2Feeebp6tfhmq4lmz8ykmq.png" class="article-body-image-wrapper"&gt;&lt;img 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%2Feeebp6tfhmq4lmz8ykmq.png" alt="Imagem de pirâmide hierárquica de memória" width="474" height="212"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hierarquia de memória:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Registradores&lt;/li&gt;
&lt;li&gt;Cache L1&lt;/li&gt;
&lt;li&gt;Cache L2&lt;/li&gt;
&lt;li&gt;Memória Principal&lt;/li&gt;
&lt;li&gt;Cache de Disco&lt;/li&gt;
&lt;li&gt;Disco magnético&lt;/li&gt;
&lt;li&gt;Disco óptico&lt;/li&gt;
&lt;li&gt;Fita magnética&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Quanto maior o nível (mais próximo do 1) da memória na hierarquia, menor tende a ser a capacidade (por conta do alto custo de capacidade) e mais rápida ela é, do mesmo modo que quanto menor o nível (mais próximo do 8), maior a capacidade e menor a velocidade. Da mesma forma, quanto maior o nível na hierarquia, maior a frequência de comunicação dela com a CPU e vice-versa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Princípio da Inclusão
&lt;/h2&gt;

&lt;p&gt;De acordo com a hierarquia demonstrada anteriormente, o &lt;strong&gt;Princípio da Inclusão&lt;/strong&gt; diz que o conteúdo de uma memória de maior nível (mais próximo do 1) deve estar incluso em uma memória de menor nível (mais próximo do 8).&lt;/p&gt;

&lt;h2&gt;
  
  
  Princípio da Coerência
&lt;/h2&gt;

&lt;p&gt;Ainda relacionado à hierarquia anteriormente mencionada, o &lt;strong&gt;Princípio da Coerência&lt;/strong&gt; diz que o conteúdo copiado em memórias de diferentes níveis (Princípio da Inclusão) devem ser consistentes. Por exemplo, deve ter uma consistência entre um dado que, do &lt;strong&gt;disco magnético&lt;/strong&gt; passou para a &lt;strong&gt;memória principal&lt;/strong&gt; e depois para o &lt;strong&gt;Cache L1&lt;/strong&gt;, todos essas cópias de dados devem ser consistentes entre si.&lt;/p&gt;

&lt;h2&gt;
  
  
  Localidade de Referência
&lt;/h2&gt;

&lt;p&gt;Durante a execução de um programa, as referências de memórias pelo processador para instruções e dados tendem a se agrupar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Localidade Temporal
&lt;/h3&gt;

&lt;p&gt;O Princípio da Localidade Temporal diz que endereços de memória acessados, &lt;strong&gt;tendem&lt;/strong&gt; a serem acessados novamente em um curto intervalo de tempo.&lt;/p&gt;

&lt;p&gt;Por exemplo, o uso de variáveis temporárias, laços de repetição, etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  Localidade Espacial
&lt;/h3&gt;

&lt;p&gt;O Princípio da Localidade Espacial diz que conteúdos com endereços de memória próximos tendem a serem acessados em intervalos de tempo semelhantes. Por exemplo, considere que um endereço hipotético A está ao lado do endereço B. Quando o endereço A for acessado, a tendência é que B seja acessado em breve.&lt;/p&gt;

&lt;p&gt;Por exemplo arrays, strings e outras estruturas sequenciais.&lt;/p&gt;

&lt;h2&gt;
  
  
  Acertos e falhas
&lt;/h2&gt;

&lt;p&gt;O conceito de acertos e falhas faz referência ao resultado de uma busca na memória.&lt;/p&gt;

&lt;h3&gt;
  
  
  Acerto (hit)
&lt;/h3&gt;

&lt;p&gt;Um acerto acontece quando se encontra o dado desejado no endereço de memória.&lt;/p&gt;

&lt;h3&gt;
  
  
  Falha (fault)
&lt;/h3&gt;

&lt;p&gt;Uma falha acontece quando não se encontra o dado desejado no endereço de memória.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ou seja, se você faz uma busca em um endereço qualquer "x", caso o dado que você queira realmente estava em x, você tem um acerto, caso contrário, você tem uma falha.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Taxa de acerto e de falha
&lt;/h3&gt;

&lt;p&gt;A taxa de acerto e de falha é calculada pela quantidade de acertos/falhas que você tem por acessos/tentativas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tempo de Acerto
&lt;/h3&gt;

&lt;p&gt;Tempo de acerto é o tempo que o computador leva para, dado uma tentativa de acesso, determinar se foi um acerto ou uma falha.&lt;/p&gt;

&lt;h3&gt;
  
  
  Penalidade por Falha
&lt;/h3&gt;

&lt;p&gt;Tempo necessário para substituir um bloco de memória pelo bloco de nível superior que contém o dado desejado, contando com o tempo de envio ao processador.&lt;/p&gt;

&lt;h1&gt;
  
  
  Princípios da Memória Cache
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Origem
&lt;/h2&gt;

&lt;p&gt;A memória cache foi criada como um intermediário entre a CPU e a Memória Principal para acelerar o processamento de dados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Funcionamento
&lt;/h2&gt;

&lt;p&gt;A memória cache tem uma cópia de alguns dados da memória principal, sendo assim, quando o processador precisa de uma palavra da memória, ele primeiro verifica se essa palavra está no cache, pois caso esteja, o acesso pode ser feito de forma mais rápida, uma vez que a memória cache é mais rápida que a memória principal.&lt;br&gt;
Caso a palavra não esteja na cache, o bloco com a palavra requerida é transferido para a cache, e então para o processador, porém o tempo de acesso se torna maior pois é necessário que se acesse a Memória Principal.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O acesso a Memória Principal retorna um bloco à Memória Cache pois pelo &lt;strong&gt;Princípio da Localidade&lt;/strong&gt;, trazer um bloco à cache aumenta a chance da próxima palavra que o processador precisar estar na cache, acelerando o processo de busca.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Mapeamento da Memória Principal
&lt;/h2&gt;

&lt;p&gt;A Memória Principal é composta de 2ⁿ palavras onde cada palavra tem um endereço distinto de &lt;em&gt;n&lt;/em&gt; bits.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Um sistema de 64 bits teria uma Memória Principal de 2⁶⁴ palavras, com cada palavra tendo um endereço único de 64 bits&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Além disso, a Memória Principal ainda seria dividida em blocos de tamanho fixo com uma quantidade &lt;em&gt;K&lt;/em&gt; de palavras por bloco.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mapeamento da Memória Cache
&lt;/h2&gt;

&lt;p&gt;A Memória Cache é composta de uma quantidade &lt;em&gt;m&lt;/em&gt; de blocos, chamados de &lt;strong&gt;linhas&lt;/strong&gt;, sendo cada linha composta de &lt;em&gt;K&lt;/em&gt; palavras, bits de controle e uma tag de alguns bits que indica o bloco a qual pertence os dados que estão armazenados na linha &lt;/p&gt;

&lt;h1&gt;
  
  
  É isso!
&lt;/h1&gt;

&lt;p&gt;Espero que tenham conseguido entender as explicações, e caso você tenha alguma dúvida, sugestão ou correção para fazer, sinta-se a vontade para deixar nos comentários.&lt;br&gt;
Bons estudos ;)&lt;/p&gt;

</description>
      <category>computerscience</category>
      <category>architecture</category>
    </item>
    <item>
      <title>#4 Operadores - Entendendo o JavaScript</title>
      <dc:creator>João Pedro V</dc:creator>
      <pubDate>Thu, 18 Apr 2024 01:56:25 +0000</pubDate>
      <link>https://dev.to/joaopedrov0/4-operadores-entendendo-o-javascript-20hm</link>
      <guid>https://dev.to/joaopedrov0/4-operadores-entendendo-o-javascript-20hm</guid>
      <description>&lt;h2&gt;
  
  
  O que são operadores?
&lt;/h2&gt;

&lt;p&gt;Operadores são símbolos usados para fazer algumas coisas com os dados das variáveis. Com operadores é possível por exemplo, fazer somas, comparações, atribuições, e muito mais.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que são importantes?
&lt;/h2&gt;

&lt;p&gt;Os operadores fazem parte da etapa mencionada no post anterior de "processar os dados", parte essencial de qualquer algoritmo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tipos de operadores
&lt;/h2&gt;

&lt;p&gt;Existem vários tipos de operadores que cumprem diferentes funções, vou explicar alguns deles a seguir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Operadores aritméticos
&lt;/h3&gt;

&lt;p&gt;Os operadores aritméticos são usados para fazer operações matemáticas, como somas, subtrações, multiplicações, etc.&lt;br&gt;
Observe alguns deles e em seguida alguns exemplos&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Soma: &lt;code&gt;+&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Subtração: &lt;code&gt;-&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Multiplicação: &lt;code&gt;*&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Divisão: &lt;code&gt;/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Resto da divisão: &lt;code&gt;%&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Potência: &lt;code&gt;**&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Diferente de algumas linguagens, o JavaScript tem um operador que é capaz de fazer operações de potenciação nativamente.&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 5&lt;/span&gt;
&lt;span class="nx"&gt;sumTest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="c1"&gt;// Atribuir o resultado de uma operação à uma variável&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sumTest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 7&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sumTest&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 2&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 6&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 5&lt;/span&gt;

&lt;span class="c1"&gt;// Resto da divisão é o que sobraria de uma divisão inteira.&lt;/span&gt;
&lt;span class="c1"&gt;// Por exemplo, 10 / 3 = 3.3333...&lt;/span&gt;
&lt;span class="c1"&gt;// Nesse caso, a divisão inteira seria apenas 3&lt;/span&gt;
&lt;span class="c1"&gt;// Porém 3 * 3 resulta em 9 e não em 10, esse 1 que falta é o resto da divisão&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 1&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 16&lt;/span&gt;
&lt;span class="c1"&gt;// 2**4 é equivalente a 2⁴&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Operadores de atribuição
&lt;/h3&gt;

&lt;p&gt;Os operadores de atribuição servem para interagir com a forma de atribuir valores à variáveis. O mais simples deles é o &lt;code&gt;=&lt;/code&gt;, que já usamos diversas vezes anteriormente. Porém, é possível combinar o operador de atribuição com operadores aritméticos para fazer novas atribuições a valores que já tem uma variável, observe o exemplo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="c1"&gt;// Ele está pegando o valor de "num", somando 4 e atribuindo o resultado à "num" novamente&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 7&lt;/span&gt;

&lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;*=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 14&lt;/span&gt;

&lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;/=&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui está uma lista de alguns dos operadores de atribuição que podem ser usados:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;+=&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-=&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;*=&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/=&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%=&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;**=&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Operadores de incremento
&lt;/h3&gt;

&lt;p&gt;Operadores de incremento são semelhantes aos operadores de atribuição combinado com operadores aritméticos, porém, eles são mais simples servem apenas com soma e subtração, e apenas de um em um. Para usar um operador de incremento, basta acrescentar &lt;code&gt;++&lt;/code&gt; (incremento) ou &lt;code&gt;--&lt;/code&gt; (decremento) na frente do nome da variável.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 3&lt;/span&gt;
&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 4&lt;/span&gt;
&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 6&lt;/span&gt;
&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Operadores relacionais
&lt;/h3&gt;

&lt;p&gt;Os operadores relacionais são usados para comparar (relacionar) dois valores da forma desejada e, por fim, devolvem um valor booleano.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Maior: &lt;code&gt;&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Menor: &lt;code&gt;&amp;lt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Maior ou igual: &lt;code&gt;&amp;gt;=&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Menor ou igual: &lt;code&gt;&amp;lt;=&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Igual: &lt;code&gt;==&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Diferente: &lt;code&gt;!=&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Igualdade restrita: &lt;code&gt;===&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Diferença restrita &lt;code&gt;!==&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Observe alguns exemplos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Retorna "false"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Retorna "true"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Retorna "false"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Retorna "true"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Retorna "true"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Retorna "false"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Retorna "false"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Retorna "true"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Retorna "false"&lt;/span&gt;

&lt;span class="c1"&gt;// Nesses últimos 2 exemplos eu usei a diferença e igualdade &lt;/span&gt;
&lt;span class="c1"&gt;// restritas, para demonstrar que a igualdade e diferença simples &lt;/span&gt;
&lt;span class="c1"&gt;// "releva" o fato de o tipo da variável é diferente e leva&lt;/span&gt;
&lt;span class="c1"&gt;// em consideração o conteúdo. Enquanto a diferença e&lt;/span&gt;
&lt;span class="c1"&gt;// igualdade restrita levam o tipo do valor em consideração.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Atenção, o "igual" como operador relacional (&lt;code&gt;==&lt;/code&gt;) é diferente do "igual" como operador de atribuição (&lt;code&gt;=&lt;/code&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Operadores lógicos
&lt;/h3&gt;

&lt;p&gt;Os operadores lógicos são usados para relacionar valores usados em operadores relacionais. Alguns desses operadores são o &lt;strong&gt;and&lt;/strong&gt;, o &lt;strong&gt;or&lt;/strong&gt; e o &lt;strong&gt;not&lt;/strong&gt;, representando respectivamente, &lt;strong&gt;conjunção&lt;/strong&gt;, &lt;strong&gt;disjunção&lt;/strong&gt; e &lt;strong&gt;negação&lt;/strong&gt;.&lt;br&gt;
Os operadores lógicos interagem com &lt;strong&gt;valores booleanos&lt;/strong&gt;, e como mencionado anteriormente, operadores relacionais retornam valores booleanos, por isso eles funcionam bem juntos.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Negação: &lt;code&gt;!&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Conjunção: &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Disjunção: &lt;code&gt;||&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Negação
&lt;/h4&gt;

&lt;p&gt;O operador lógico de negação (not) inverte o valor booleano de um valor, transformando "true" em "false" e vice-versa.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;!p = "Não p"&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;
  
  
  Conjunção
&lt;/h4&gt;

&lt;p&gt;O operador lógico de conjunção (and) devolve &lt;code&gt;true&lt;/code&gt; se ambas as proposições são verdadeiras e &lt;code&gt;false&lt;/code&gt; em qualquer outra situação&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;p &amp;amp;&amp;amp; q = "p e q"&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;
  
  
  Disjunção
&lt;/h4&gt;

&lt;p&gt;O operador lógico de disjunção (or) devolve &lt;code&gt;true&lt;/code&gt; se um dos valores for verdadeiro ou se ambos forem. Devolve &lt;code&gt;false&lt;/code&gt; caso ambos forem falsos.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;p || q = "p ou q"&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Retorna "false"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Retorna "true"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Retorna "true"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Retorna "false"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Retorna "false"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Retorna "false"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Retorna "true"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Retorna "true"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Retorna "true"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Retorna "false"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Um conselho
&lt;/h2&gt;

&lt;p&gt;A partir daqui, eu recomendo que você comece a se perguntar coisas sobre os assuntos que está aprendendo e, não apenas analisar os exemplos que eu deixo aqui, como também ir atrás de fazer seus próprios testes, buscando suas próprias respostas pra suas perguntas! Teste tudo que quiser, seja curioso(a).&lt;/p&gt;

&lt;h2&gt;
  
  
  Deixe seu feedback!
&lt;/h2&gt;

&lt;p&gt;Espero que tenham entendido e caso tenham alguma dúvida, sugestão ou correção, não deixem de colocar nos comentários, responderei assim que possível.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>#3 Tipos de Variáveis - Entendendo o JavaScript</title>
      <dc:creator>João Pedro V</dc:creator>
      <pubDate>Wed, 17 Apr 2024 16:26:45 +0000</pubDate>
      <link>https://dev.to/joaopedrov0/3-tipos-de-variaveis-entendendo-o-javascript-2h0f</link>
      <guid>https://dev.to/joaopedrov0/3-tipos-de-variaveis-entendendo-o-javascript-2h0f</guid>
      <description>&lt;h2&gt;
  
  
  O que são Tipos de Variáveis?
&lt;/h2&gt;

&lt;p&gt;No post anterior, expliquei sobre o conceito de variáveis.&lt;br&gt;
Lembra o conceito de guardar informações? É essencial ter em mente que você vai trabalhar com a &lt;strong&gt;entrada&lt;/strong&gt; de dados que serão &lt;strong&gt;processados&lt;/strong&gt; e, posteriormente, resultarão em uma &lt;strong&gt;saída&lt;/strong&gt;.&lt;br&gt;
Esses conceitos de entrada, processamento e saída são essenciais na programação e posso abordar futuramente em um outro post com um pouco mais de aprofundamento.&lt;br&gt;
Mas por agora, o que você precisa saber é que esse &lt;strong&gt;processamento&lt;/strong&gt; envolve o que você quer &lt;strong&gt;fazer&lt;/strong&gt; com esses dados para conseguir o resultado desejado. Por exemplo, vamos supor que você queira um programa que receba duas variáveis e some elas, devolvendo o resultado. Se você inserir 2 e 3, o resultado esperado é 5, certo? Mas o que você acha que acontece se inserir "dois" e "três" como valores de entrada? Você precisa saber o tipo de dado que você está lidando para que tudo ocorra como o planejado, isso vai ficar mais claro com o tempo.&lt;/p&gt;
&lt;h2&gt;
  
  
  Quais são os tipos de variáveis?
&lt;/h2&gt;

&lt;p&gt;O JavaScript tem três tipos &lt;strong&gt;primitivos&lt;/strong&gt; de variáveis, que são os tipos mais básicos de variáveis, são eles &lt;strong&gt;String&lt;/strong&gt;, &lt;strong&gt;Number&lt;/strong&gt; e &lt;strong&gt;Boolean&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  String
&lt;/h3&gt;

&lt;p&gt;Strings são um tipo de variável usado para guardar texto, cadeias de caracteres. Normalmente strings são demarcadas por aspas simples ou duplas, ou crase, possibilitando o uso de &lt;strong&gt;template strings&lt;/strong&gt;, mas isso não é assunto pra agora.&lt;/p&gt;
&lt;h3&gt;
  
  
  Number
&lt;/h3&gt;

&lt;p&gt;De modo bem intuitivo, variáveis do tipo Number guardam números, que podem ser o que chamamos de &lt;strong&gt;inteiro&lt;/strong&gt; ou &lt;strong&gt;float&lt;/strong&gt;.&lt;/p&gt;
&lt;h4&gt;
  
  
  Inteiro (Integer ou int)
&lt;/h4&gt;

&lt;p&gt;Números inteiros são, da mesma forma que na matemática, números que vão desde o infinito negativo até o infinito positivo, sem casas decimais.&lt;/p&gt;
&lt;h4&gt;
  
  
  Ponto Flutuante (Float)
&lt;/h4&gt;

&lt;p&gt;Nós chamamos de Float, ou número com &lt;strong&gt;ponto flutuante&lt;/strong&gt; números com casas decimais, ainda que nulas (igual a 0).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O nome "Ponto Flutuante" se refere ao modo que essas variáveis são guardadas no binário do computador, posso fazer um post sobre esse assunto futuramente.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Boolean
&lt;/h3&gt;

&lt;p&gt;Variáveis do tipo Boolean guardam apenas dois valores, verdadeiro ou falso.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O termo "Boolean" ou "Booleano" se refere a &lt;strong&gt;George Boole&lt;/strong&gt;, criador da álgebra booleana que futuramente foi essencial para o avanço da computação. Essa forma "nova" de fazer contas se baseia apenas na existência de proposições &lt;strong&gt;verdadeiras&lt;/strong&gt; ou &lt;strong&gt;falsas&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  &lt;code&gt;undefined&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Esse tipo é algo bem específico e não acho necessário você tentar entender por agora, mas quero que você saiba que ele existe. "undefined" é usado para se referir a valores "não definidos". Por exemplo, se você declarar uma variável mas não atribuir nenhum valor à ela, como eu disse no post anterior que é possível fazer, caso tente exibir ela, "undefined" será exibido no lugar uma vez que você não atribuiu nenhum valor àquela variável.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;exemplo&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;exemplo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// undefined&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Function e Object
&lt;/h3&gt;

&lt;p&gt;Esses não são tipos primitivos do JavaScript, pois não são usados para guardar variáveis &lt;strong&gt;simples&lt;/strong&gt;, mas sim estruturas mais complexas como &lt;strong&gt;objetos&lt;/strong&gt;, &lt;strong&gt;arrays&lt;/strong&gt; e &lt;strong&gt;funções&lt;/strong&gt;, como veremos futuramente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como definir o tipo da variável?
&lt;/h2&gt;

&lt;p&gt;O JavaScript é uma linguagem de &lt;strong&gt;tipagem dinâmica fraca&lt;/strong&gt;, vou explicar brevemente o que isso significa.&lt;/p&gt;

&lt;h3&gt;
  
  
  "Tipagem"
&lt;/h3&gt;

&lt;p&gt;O estilo de tipagem é algo que pode variar de linguagem pra linguagem e ele diz como a que você está trabalhando lida com tipagem, podendo ela variar entre &lt;strong&gt;estática&lt;/strong&gt; e &lt;strong&gt;dinâmica&lt;/strong&gt;, assim como podem ser &lt;strong&gt;fortemente&lt;/strong&gt; tipadas ou &lt;strong&gt;fracamente&lt;/strong&gt; tipadas.&lt;/p&gt;

&lt;h3&gt;
  
  
  "Dinâmica"
&lt;/h3&gt;

&lt;p&gt;A tipificação &lt;strong&gt;dinâmica&lt;/strong&gt; permite que o tipo da variável seja alterado depois da variável ser declarada. Além disso, não é necessário que o programador defina o tipo da variável na sua declaração, a própria linguagem é capaz de fazer isso.&lt;/p&gt;

&lt;h3&gt;
  
  
  "Fraca"
&lt;/h3&gt;

&lt;p&gt;A tipagem &lt;strong&gt;fraca&lt;/strong&gt; permite que sejam feitas operações entre tipos diferentes sem que o programador converta a linguagem de um tipo para outro, desde que isso seja ao menos possível.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resumindo
&lt;/h3&gt;

&lt;p&gt;No JavaScript você não precisa fazer esse processo de dizer o tipo da variável, uma vez que, vendo o valor armazenado na variável, o JavaScript é capaz de dizer qual o tipo adequado para essa variável.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;exemploNumero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;34&lt;/span&gt; &lt;span class="c1"&gt;// Number integer&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;exemploTexto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Trinta e quatro ☕&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="c1"&gt;// String&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;exemploBooleano&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="c1"&gt;// Boolean&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Como saber o tipo de uma variável?
&lt;/h2&gt;

&lt;p&gt;Para finalizar, já que o JavaScript não requer que fique explícito o tipo de uma variável, vou apresentar uma forma de você descobrir isso.&lt;/p&gt;

&lt;h3&gt;
  
  
  Função &lt;code&gt;typeof()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;A função &lt;code&gt;typeof()&lt;/code&gt; &lt;strong&gt;recebe&lt;/strong&gt; uma variável (dentro dos parênteses) e retorna o tipo dela, vamos testar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;exemploNumero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;34&lt;/span&gt; &lt;span class="c1"&gt;// Number integer&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;exemploTexto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Trinta e quatro ☕&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="c1"&gt;// String&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;exemploBooleano&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="c1"&gt;// Boolean&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;exemploNumero&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;// "number"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;exemploTexto&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;// "string"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;exemploBooleano&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;// "boolean"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Deixe seu feedback!
&lt;/h2&gt;

&lt;p&gt;Por hoje é isso, espero que tenham entendido e se tiverem qualquer dúvida, sugestão ou correção, fiquem à vontade para deixar nos comentários que eu respondo assim que possível.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
