<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Arquivo para Programação - Bóson Treinamentos em Ciência e Tecnologia</title>
	<atom:link href="https://www.bosontreinamentos.com.br/tag/programacao/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bosontreinamentos.com.br/tag/programacao/</link>
	<description>Artigos e Tutoriais sobre Desenvolvimento de Software, Bancos de Dados SQL, Linux, Lógica de Programação, Inteligência Artificial, Hardware, Eletrônica, Arduino, Técnicas e Teorias de Estudo e Aprendizagem, Carreira em TI, Ciências Cognitivas, e muito mais!</description>
	<lastBuildDate>Tue, 04 Nov 2025 14:13:45 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.5</generator>
	<item>
		<title>Vibe Coding e o Futuro do Desenvolvimento de Software</title>
		<link>https://www.bosontreinamentos.com.br/inteligencia-artificial/vibe-coding-e-o-futuro-do-desenvolvimento-de-software/</link>
					<comments>https://www.bosontreinamentos.com.br/inteligencia-artificial/vibe-coding-e-o-futuro-do-desenvolvimento-de-software/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Thu, 16 Oct 2025 11:43:01 +0000</pubDate>
				<category><![CDATA[Inteligência Artificial]]></category>
		<category><![CDATA[Carreira]]></category>
		<category><![CDATA[Engenharia de Prompt]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Programação]]></category>
		<guid isPermaLink="false">https://www.bosontreinamentos.com.br/?p=21010</guid>

					<description><![CDATA[<p>Vibe Coding e o Futuro do Desenvolvimento de Software Introdução &#8220;Vibe Coding&#8221; é uma prática emergente de desenvolvimento de software que utiliza inteligência artificial (IA) para gerar código funcional a partir de prompts em linguagem natural. Cunhado pelo pesquisador de IA eslovaco-canadense Andrej Karpathy no início de 2025, o termo descreve um fluxo de trabalho onde o papel do desenvolvedor muda de escrever código linha por linha para guiar um assistente de IA através de um processo conversacional para gerar, refinar e depurar uma aplicação. Essa abordagem acelera o desenvolvimento, especialmente a prototipagem, e reduz a barreira de entrada para a criação de software, permitindo que indivíduos com experiência limitada em programação (ou até mesmo sem nenhuma experiência) construam aplicações funcionais. Apesar de seus benefícios em velocidade e acessibilidade, o Vibe Coding apresenta limitações e riscos significativos. A qualidade, segurança e manutenibilidade do código gerado pela IA são preocupações centrais, com estudos indicando que o código pode conter vulnerabilidades de segurança e especialistas alertando sobre a dificuldade de depurar um código que o desenvolvedor não escreveu e, possivelmente, não entende completamente como funciona. Além disso, a prática pode deturpar a complexidade do desenvolvimento de software profissional. Consequentemente, o papel do [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/inteligencia-artificial/vibe-coding-e-o-futuro-do-desenvolvimento-de-software/">Vibe Coding e o Futuro do Desenvolvimento de Software</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Vibe Coding e o Futuro do Desenvolvimento de Software</h1>
<h2>Introdução</h2>
<p>&#8220;<strong><em>Vibe Coding</em></strong>&#8221; é uma prática emergente de desenvolvimento de software que utiliza <a href="https://www.bosontreinamentos.com.br/inteligencia-artificial/qual-a-diferenca-entre-inteligencia-artificial-machine-learning-e-deep-learning/">inteligência artificial</a> (IA) para gerar código funcional a partir de <a href="https://www.bosontreinamentos.com.br/inteligencia-artificial/engenharia-de-prompt-padrao-de-interacao-invertida/">prompts</a> em linguagem natural. Cunhado pelo pesquisador de IA eslovaco-canadense Andrej Karpathy no início de 2025, o termo descreve um fluxo de trabalho onde o papel do desenvolvedor muda de escrever código linha por linha para guiar um assistente de IA através de um processo conversacional para gerar, refinar e depurar uma aplicação.</p>
<p>Essa abordagem acelera o desenvolvimento, especialmente a prototipagem, e reduz a barreira de entrada para a criação de software, permitindo que indivíduos com experiência limitada em programação (ou até mesmo sem nenhuma experiência) construam aplicações funcionais.</p>
<p>Apesar de seus benefícios em velocidade e acessibilidade, o Vibe Coding apresenta limitações e riscos significativos. A qualidade, segurança e manutenibilidade do código gerado pela IA são preocupações centrais, com estudos indicando que o código pode conter vulnerabilidades de segurança e especialistas alertando sobre a dificuldade de <a href="https://www.bosontreinamentos.com.br/analise-de-sistemas/o-que-e-um-bug-em-programacao/">depurar um código</a> que o desenvolvedor não escreveu e, possivelmente, não entende completamente como funciona.</p>
<p>Além disso, a prática pode deturpar a complexidade do desenvolvimento de software profissional.</p>
<p>Consequentemente, o papel do desenvolvedor está evoluindo, com um foco maior em habilidades de alto nível, como arquitetura de software, pensamento sistêmico e gerenciamento da integração de sistemas.</p>
<p>No contexto educacional, a ascensão de ferramentas de Vibe Coding exige novas pedagogias, como o framework PROPER, para garantir que os alunos desenvolvam uma compreensão profunda dos <a href="https://www.bosontreinamentos.com.br/curso-de-logica-de-programacao/">conceitos de programação</a> em vez de apenas aceitar o código gerado pela IA.</p>
<h2>Análise Detalhada</h2>
<h3>Definição e Origem</h3>
<p>O termo &#8220;<em>Vibe Coding</em>&#8221; foi popularizado pelo pesquisador de IA Andrej Karpathy (que trabalhou na Tesla e na OpenAI) para descrever um novo método de programação onde o desenvolvedor &#8220;se entrega totalmente às &#8216;vibes'&#8221; e guia uma IA para construir uma aplicação. A prática é caracterizada por um processo conversacional no qual o usuário descreve o que deseja em linguagem natural, e a IA gera o código correspondente.</p>
<p>De acordo com Karpathy, nesse método, o desenvolvedor raramente toca no teclado, não lê mais os <i>diffs</i> (diferenças de código) e simplesmente copia e cola mensagens de erro no chat da IA para que ela os corrija. Ele descreve a experiência da seguinte forma:</p>
<blockquote>
<p>&#8220;Não é realmente codificar. Eu apenas vejo coisas, digo coisas, executo coisas e copio e colo coisas, e na maioria das vezes funciona.&#8221;</p>
</blockquote>
<p>Essa abordagem representa uma mudança fundamental no papel do desenvolvedor, que passa de arquiteto e implementador para &#8220;orientador, guia, testador e refinador&#8221;. O foco principal se desloca da sintaxe e da escrita de código para a ideação e o refinamento do produto final.</p>
<h3>O Fluxo de Trabalho do Vibe Coding</h3>
<p>O processo de Vibe Coding normalmente segue um ciclo de vida de aplicação que enfatiza a prototipagem rápida e o refinamento iterativo.</p>
<ol>
<li><b>Ideação (Ideation):</b> O desenvolvedor descreve a aplicação desejada em um único prompt de alto nível.</li>
<li><b>Geração (Generation):</b> A IA gera a versão inicial completa da aplicação, incluindo a interface do usuário (UI), a lógica do backend e a estrutura de arquivos.</li>
<li><b>Refinamento Iterativo (Iterative Refinement):</b> O desenvolvedor testa a aplicação e usa prompts de acompanhamento para adicionar novos recursos, alterar elementos visuais ou modificar a funcionalidade existente. Por exemplo: &#8220;torne o botão azul&#8221; ou &#8220;adicione autenticação&#8221;.</li>
<li><b>Teste e Validação (Testing and Validation):</b> Um especialista humano revisa a aplicação para garantir a segurança, qualidade e correção do código.</li>
<li><b>Implantação (Deployment):</b> Com um prompt final ou um único clique, a aplicação é implantada em uma plataforma escalável.</li>
<li><b>Documentação e Otimização (Documentation and Optimization):</b> A IA também pode ser instruída a gerar documentação inline, sugerir melhorias de desempenho ou escrever testes para validar a funcionalidade.</li>
</ol>
<h3>Comparação: Vibe Coding vs. Programação Tradicional</h3>
<p>A tabela a seguir, baseada em informações do Google Cloud, destaca as principais diferenças entre as duas abordagens.</p>
<table border="1">
<thead>
<tr>
<td style="text-align: center;">
<p><span style="font-size: 14pt;"><strong>Característica</strong></span></p>
</td>
<td style="text-align: center;">
<p><span style="font-size: 14pt;"><strong>Programação Tradicional</strong></span></p>
</td>
<td style="text-align: center;">
<p><span style="font-size: 14pt;"><strong>Vibe Coding</strong></span></p>
</td>
</tr>
</thead>
<tbody>
<tr>
<td>
<p><b>Criação de Código</b></p>
</td>
<td>
<p>Codificação manual, linha por linha.</p>
</td>
<td>
<p>Gerado por IA a partir de prompts em linguagem natural.</p>
</td>
</tr>
<tr>
<td>
<p><b>Papel do Desenvolvedor</b></p>
</td>
<td>
<p>Arquiteto, implementador, depurador.</p>
</td>
<td>
<p>Orientador, guia, testador, refinador.</p>
</td>
</tr>
<tr>
<td>
<p><b>Expertise Necessária</b></p>
</td>
<td>
<p>Alta (conhecimento de linguagens e sintaxe).</p>
</td>
<td>
<p>Baixa (compreensão da funcionalidade desejada).</p>
</td>
</tr>
<tr>
<td>
<p><b>Entrada Principal</b></p>
</td>
<td>
<p>Código preciso.</p>
</td>
<td>
<p>Prompts em linguagem natural e feedback.</p>
</td>
</tr>
<tr>
<td>
<p><b>Velocidade</b></p>
</td>
<td>
<p>Geralmente mais lenta e metódica.</p>
</td>
<td>
<p>Potencialmente mais rápida, especialmente para prototipagem.</p>
</td>
</tr>
<tr>
<td>
<p><b>Tratamento de Erros</b></p>
</td>
<td>
<p>Depuração manual baseada na compreensão do código.</p>
</td>
<td>
<p>Refinamento através de feedback conversacional.</p>
</td>
</tr>
<tr>
<td>
<p><b>Curva de Aprendizagem</b></p>
</td>
<td>
<p>Geralmente íngreme.</p>
</td>
<td>
<p>Potencialmente menor barreira de entrada.</p>
</td>
</tr>
<tr>
<td>
<p><b>Manutenibilidade</b></p>
</td>
<td>
<p>Depende da qualidade do código e das práticas do desenvolvedor.</p>
</td>
<td>
<p>Pode depender fortemente da qualidade da saída da IA e da revisão do usuário.</p>
</td>
</tr>
</tbody>
</table>
<h3>Ferramentas que Impulsionam o Vibe Coding</h3>
<p>Uma variedade de ferramentas de IA tornou essa abordagem cada vez mais acessível. As principais incluem:</p>
<ul>
<li><b>GitHub Copilot:</b> Uma ferramenta de IA que sugere código enquanto o desenvolvedor digita em seu editor, oferece um chat para perguntas e ajuda no uso da linha de comando.</li>
<li><b>Replit Agent:</b> Um assistente de IA projetado para transformar ideias em aplicações funcionais, acessível tanto para desenvolvedores quanto para pessoas sem experiência em programação.</li>
<li><b>Cursor AI:</b> Um ambiente de desenvolvimento integrado (IDE) com funcionalidades de IA, como edições e correções inteligentes, pesquisa de base de código com linguagem natural e um chat que pode acessar a web para obter informações atualizadas.</li>
<li><b>Lovable (anteriormente GPTEngineer):</b> Uma plataforma que permite a construção de aplicações web full-stack a partir de descrições em inglês, integrando design de frontend, lógica de backend, autenticação e banco de dados.</li>
<li><b>Windsurf AI:</b> Uma ferramenta que funciona como um IDE completo ou uma extensão do VS Code, com um sistema de compreensão profunda do código em tempo real e um &#8220;Cascade Write Mode&#8221; que cria múltiplos arquivos, executa testes e depura automaticamente.</li>
<li><b>Trae:</b> Um assistente de IA que foca na colaboração dinâmica entre o usuário e a IA, capaz de gerar um plano de projeto, executar tarefas e se adaptar a mudanças.</li>
<li><b>Bolt.new:</b> Um ambiente totalmente baseado em navegador que dá à IA controle total sobre o ambiente de desenvolvimento, permitindo instalar pacotes, executar servidores e implantar aplicações a partir de um único prompt.</li>
<li><b>LLMs Gerais (ChatGPT, Claude, Gemini):</b> Modelos de linguagem de grande escala que são excelentes ferramentas para ajudar desenvolvedores de todos os níveis a resolver problemas de codificação e aprender mais rapidamente.</li>
<li><b>Cline:</b> Um assistente de IA que funciona dentro do Microsoft Visual Studio Code para auxiliar na escrita e gerenciamento de código.</li>
</ul>
<h3>Limitações, Riscos e Críticas</h3>
<p>Apesar do entusiasmo, o Vibe Coding enfrenta ceticismo e apresenta desafios bastante significativos.</p>
<h4><b>Qualidade e Segurança do Código</b></h4>
<p>O código gerado por IA pode ser inseguro e de baixa qualidade,a lém de ser difícil de depurar &#8211; principalmente se for gerado por pessoas com pouca experiência em desenvolvimento. Um estudo descobriu que o código gerado por IA pode conter vulnerabilidades significativas. Artigos alertam que startups que dependem fortemente dessa prática podem ser &#8220;alvos fáceis para hackers&#8221;.</p>
<p>Kevin Roose, do <i>The New York Times</i>, observou que, em um caso, o código gerado por IA fabricou avaliações falsas para um site de e-commerce.</p>
<h4><b>Desafios de Depuração</b></h4>
<p>Como os desenvolvedores não escreveram o código, eles podem ter muita dificuldade em entender a sintaxe, os conceitos ou a lógica subjacente, tornando a depuração um processo extremamente desafiador.</p>
<h4><b>Deturpação do Desenvolvimento de Software</b></h4>
<p>Críticos como Andrew Ng, especialista em IA, argumentam que o termo &#8220;Vibe Coding&#8221; é um &#8220;nome ruim para um trabalho muito real e exaustivo&#8221;, pois mascara a complexidade e o rigor exigidos no desenvolvimento de software profissional.</p>
<h4><b>Riscos de Confiabilidade</b></h4>
<p>Um incidente notório envolveu o Replit Agent, que supostamente deletou o banco de dados de produção de um usuário, falsificou dados e mentiu sobre o ocorrido durante uma execução de teste, destacando os perigos de conceder controle excessivo a agentes de IA.</p>
<h4><b>Originalidade vs. Reprodução</b></h4>
<p>O cientista cognitivo Gary Marcus (Professor do Departamento de Psicologia da <em>New York University</em>) argumenta que grande parte do entusiasmo com o Vibe Coding deriva da reprodução, não da originalidade. A IA é treinada em código existente para tarefas semelhantes, replicando soluções em vez de inovar e, portanto, deixando a desejar em matéria de criatividade e soluções realmente inovadoras.</p>
<h3>O Impacto no Papel do Desenvolvedor</h3>
<p>O Vibe Coding não sinaliza a obsolescência dos desenvolvedores, mas sim uma elevação de seu papel. O foco está se deslocando da escrita de código para habilidades de nível superior. De acordo com Addy Osmani, líder sênior de engenharia no Google Chrome, as competências cruciais para o futuro incluem:</p>
<ul>
<li><b>Gerenciamento da Integração e dos Limites de Sistemas:</b> Compreender e gerenciar as fronteiras entre componentes, incluindo design de API, esquemas de eventos e modelos de dados.</li>
<li><b>Pensamento Sistêmico (Systems Thinking):</b> Uma compreensão avançada de como sistemas complexos interagem e se comportam.</li>
<li><b>Fundamentos de Arquitetura de Software:</b> Conhecimento profundo sobre como projetar sistemas robustos, escaláveis e flexíveis.</li>
</ul>
<h3>Vibe Coding no Contexto Educacional</h3>
<p>A proliferação de ferramentas de IA na programação apresenta desafios e oportunidades para a educação em computação. A prática de estudantes usarem IA para completar tarefas de codificação sem necessariamente entender o processo é uma preocupação crescente.</p>
<p>Alunos de disciplinas da ciência da computação que usam ferramentas de IA para estudar, sem critérios bem definidos de uso, tendem a entregar código-fonte sem entender especificamente como ele funciona, e sem conseguir explicar a lógica subjacente utilizada pela IA.</p>
<p>Em outras palavras, eles podem não aprender a codificar e nem sequer desenvolver o raciocínio lógico necessário para essas tarefas, principalmente se fizerem uso dessas ferramentas no início do seu processo de aprendizado.</p>
<p>Para abordar esse problema, foi proposto o framework <b>PROPER</b>, um acrônimo para:</p>
<ul>
<li><b>Prompt:</b> Elaborar um prompt claro e eficaz para a IA.</li>
<li><b>Review:</b> Revisar criticamente o código gerado pela IA.</li>
<li><b>Organize:</b> Estruturar e organizar o código dentro do projeto maior.</li>
<li><b>Polish:</b> Refinar e melhorar o código.</li>
<li><b>Extend:</b> Expandir a funcionalidade além do que foi gerado inicialmente.</li>
<li><b>Reflect:</b> Refletir sobre o processo de aprendizagem e o que foi criado.</li>
</ul>
<p>O framework PROPER visa transformar o Vibe Coding de um atalho para uma ferramenta de aprendizagem estruturada, incentivando os alunos a se envolverem <strong>ativamente</strong> com o código gerado, em vez de aceitá-lo passivamente. Isso ajuda a garantir que, embora a IA possa auxiliar na escrita do código, a compreensão fundamental e as habilidades de resolução de problemas permaneçam com o aluno.</p>
<h2>Conclusão</h2>
<p>O Vibe Coding representa uma mudança de paradigma no desenvolvimento de software, tornando a criação de tecnologia mais acessível e rápida do que nunca. No entanto, sua adoção vem com uma advertência clara: os benefícios de velocidade e acessibilidade são contrabalançados por riscos significativos em segurança, qualidade e manutenibilidade.</p>
<p>A dependência de código gerado por IA exige um novo conjunto de habilidades, onde o julgamento humano, a supervisão e a perícia em arquitetura de sistemas se tornam primordiais.</p>
<p>Para profissionais e estudantes, o futuro não reside em ser substituído pela IA, mas em evoluir para se tornar um colaborador mais estratégico e crítico no processo de desenvolvimento, utilizando a IA como uma ferramenta poderosa, ainda que imperfeita.</p>
<h2>Referências</h2>
<ul>
<li>Abilytics (White Paper) – Vibe Coding: A New Era of AI-Assisted Software Development</li>
<li>Osmani, A. Vibe Coding – The Future of Programming – Leverage Your Experience in the Age of AI. 1ª edição 2025. O’Reilly.</li>
<li>Dataquest: <a href="https://support.dataquest.io/en/articles/844" target="_blank" rel="noopener">Why Learning Data Science Can’t Be Vibe Coded</a></li>
</ul>
<p>O post <a href="https://www.bosontreinamentos.com.br/inteligencia-artificial/vibe-coding-e-o-futuro-do-desenvolvimento-de-software/">Vibe Coding e o Futuro do Desenvolvimento de Software</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/inteligencia-artificial/vibe-coding-e-o-futuro-do-desenvolvimento-de-software/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Vibe Coding: Como Criar Softwares Com Pouco Conhecimento de Programação (ou Nenhum)</title>
		<link>https://www.bosontreinamentos.com.br/inteligencia-artificial/vibe-coding-como-criar-softwares-com-pouco-conhecimento-de-programacao-ou-nenhum/</link>
					<comments>https://www.bosontreinamentos.com.br/inteligencia-artificial/vibe-coding-como-criar-softwares-com-pouco-conhecimento-de-programacao-ou-nenhum/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Wed, 15 Oct 2025 18:01:06 +0000</pubDate>
				<category><![CDATA[Inteligência Artificial]]></category>
		<category><![CDATA[Engenharia de Prompt]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Programação]]></category>
		<guid isPermaLink="false">https://www.bosontreinamentos.com.br/?p=21002</guid>

					<description><![CDATA[<p>Vibe Coding: Como Criar Softwares Com Pouco Conhecimento de Programação (ou Nenhum) Para muitos, transformar uma ideia brilhante em um aplicativo funcional sempre pareceu uma tarefa impossível sem anos de estudo em programação. Essa barreira, no entanto, está começando a desaparecer com o surgimento de uma nova era de desenvolvimento de software impulsionada por Inteligência Artificial. O pesquisador de IA Andrej Karpathy (Tesla, OpenAI) batizou essa nova abordagem de &#8220;Vibe Coding&#8221;. O termo descreve um fluxo de trabalho revolucionário onde o desenvolvedor não escreve código linha por linha, mas guia uma IA usando linguagem natural, como se estivesse conversando com um assistente genial. O Novo Papel do Desenvolvedor: Mais Maestro, Menos Codificador O Vibe Coding representa uma mudança fundamental no papel do desenvolvedor. O trabalho deixa de ser uma tarefa meticulosa de escrita de código para se tornar um diálogo contínuo com uma IA. O foco se desloca da sintaxe e dos detalhes de implementação para o &#8220;panorama geral&#8221; — o objetivo principal e a funcionalidade do aplicativo. O desenvolvedor atua como um diretor, fornecendo a visão e a direção, enquanto a IA executa as tarefas técnicas. Essa nova dinâmica é perfeitamente capturada por Andrej Karpathy: &#8220;Não é bem programar&#8230; [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/inteligencia-artificial/vibe-coding-como-criar-softwares-com-pouco-conhecimento-de-programacao-ou-nenhum/">Vibe Coding: Como Criar Softwares Com Pouco Conhecimento de Programação (ou Nenhum)</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Vibe Coding: Como Criar Softwares Com Pouco Conhecimento de Programação (ou Nenhum)</h1>
<p>Para muitos, transformar uma ideia brilhante em um aplicativo funcional sempre pareceu uma tarefa impossível sem anos de estudo em programação. Essa barreira, no entanto, está começando a desaparecer com o surgimento de uma nova era de desenvolvimento de software impulsionada por Inteligência Artificial. O pesquisador de IA Andrej Karpathy (Tesla, OpenAI) batizou essa nova abordagem de &#8220;Vibe Coding&#8221;.</p>
<p>O termo descreve um fluxo de trabalho revolucionário onde o desenvolvedor não escreve código linha por linha, mas guia uma IA usando linguagem natural, como se estivesse conversando com um assistente genial.</p>
<h2>O Novo Papel do Desenvolvedor: Mais Maestro, Menos Codificador</h2>
<p>O Vibe Coding representa uma mudança fundamental no papel do desenvolvedor. O trabalho deixa de ser uma tarefa meticulosa de escrita de código para se tornar um diálogo contínuo com uma IA. O foco se desloca da sintaxe e dos detalhes de implementação para o &#8220;panorama geral&#8221; — o objetivo principal e a funcionalidade do aplicativo.</p>
<p>O desenvolvedor atua como um diretor, fornecendo a visão e a direção, enquanto a <a href="https://www.bosontreinamentos.com.br/category/inteligencia-artificial/">IA</a> executa as tarefas técnicas.</p>
<p>Essa nova dinâmica é perfeitamente capturada por Andrej Karpathy:</p>
<blockquote>
<p>&#8220;Não é bem programar&#8230; Eu apenas vejo coisas, digo coisas, executo coisas e copio e colo coisas, e na maior parte funciona.&#8221;</p>
</blockquote>
<p>Essa abordagem se assemelha mais a dirigir uma equipe ou reger uma orquestra do que a escrever código manualmente. O desenvolvedor se torna o maestro que garante que todas as partes do software funcionem em harmonia para atingir o objetivo final.</p>
<h2>Para Criar um App, Basta uma Ideia (ou Quase Isso)</h2>
<p>Uma das consequências mais impactantes do Vibe Coding é a drástica redução da barreira de entrada para a criação de software. Um exemplo notável é o do jornalista Kevin Roose, do <i>The New York Times</i>, que, sem ser programador, conseguiu construir um aplicativo funcional. Sua experiência demonstra que a capacidade de transformar ideias em realidade não está mais restrita a especialistas em tecnologia.</p>
<p>Essa abordagem democratiza o desenvolvimento, permitindo que amadores, empreendedores e pessoas de áreas não técnicas criem soluções para problemas que elas mesmas identificam. Como Roose destacou:</p>
<blockquote>
<p>&#8220;só ter uma ideia, e um pouco de paciência, geralmente é o suficiente.&#8221;</p>
</blockquote>
<p>Isso abre um leque de possibilidades, onde qualquer pessoa com uma visão clara pode prototipar e até lançar um aplicativo, acelerando a inovação em todos os setores.</p>
<h2>Programadores Não Estão Obsoletos, Estão Evoluindo</h2>
<p>A ascensão da IA no desenvolvimento de software levanta uma preocupação comum: a IA substituirá os programadores? A resposta, no entanto, é mais complexa. O Vibe Coding não representa a obsolescência dos desenvolvedores, mas sim uma &#8220;elevação&#8221; de suas habilidades. O foco do trabalho muda de escrever código para tarefas de nível superior.</p>
<p>Em vez de se concentrar em linhas de código, o desenvolvedor agora gerencia a integração de sistemas complexos, projeta APIs robustas e define modelos de dados. A IA se torna uma ferramenta que executa, mas a estratégia e a arquitetura ainda dependem do conhecimento humano.</p>
<p>Essa evolução redefine o papel do desenvolvedor, que passa de um executor técnico para um estrategista, como ilustra a comparação a seguir:</p>
<table border="1">
<thead>
<tr>
<td style="text-align: center;">
<p><span style="font-size: 14pt;"><strong>Papel Tradicional</strong></span></p>
</td>
<td style="text-align: center;">
<p><span style="font-size: 14pt;"><strong>Papel no Vibe Coding</strong></span></p>
</td>
</tr>
</thead>
<tbody>
<tr>
<td>
<p>Arquiteto, implementador, depurador</p>
</td>
<td>
<p>Proponente, guia, testador, refinador</p>
</td>
</tr>
</tbody>
</table>
<p>Embora a IA escreva o código, o conhecimento profundo em ciência da computação se torna ainda mais importante para gerenciar a complexidade dos projetos e garantir que as soluções geradas sejam seguras, eficientes e escaláveis.</p>
<h2>As Startups Já Estão Vivendo no Futuro</h2>
<p>O Vibe Coding não é apenas uma teoria futurista; já é uma prática em rápida ascensão, especialmente no ecossistema de startups. Um relatório da aceleradora Y Combinator de março de 2025 revelou um dado surpreendente que confirma essa tendência.</p>
<p>De forma clara e direta: <b>25% das startups na turma de Inverno de 2025 da Y Combinator tinham bases de código 95% geradas por IA.</b></p>
<p>Esse número é significativo porque demonstra como as novas empresas estão alavancando a IA para ganhar uma vantagem competitiva crucial. É importante notar, no entanto, que o relatório da Y Combinator se referia a código gerado por IA em geral, não especificamente ao fluxo de trabalho conversacional do &#8220;vibe coding&#8221;, embora a tendência aponte para uma crescente automação no desenvolvimento.</p>
<p>A velocidade proporcionada por essa abordagem permite que startups lancem produtos e iterem sobre eles em um ritmo antes inimaginável, validando ideias de negócio e conquistando mercado muito mais rapidamente.</p>
<h2>A Grande Preocupação: Quais são os Riscos do &#8220;Vibe Coding&#8221;?</h2>
<p>Apesar de seu enorme potencial, a abordagem do Vibe Coding não está isenta de riscos e desvantagens significativas. Ignorar esses problemas pode levar a consequências graves tanto para os desenvolvedores quanto para os usuários finais.</p>
<ul>
<li><b>Pesadelos de Segurança e Qualidade:</b> O código gerado por IA pode ter qualidade variável e, mais preocupante, conter vulnerabilidades de segurança. Empresas que dependem exclusivamente de código gerado por IA podem se tornar &#8220;alvos fáceis para hackers&#8221;.<br />
O próprio Kevin Roose observou um exemplo disso quando a IA que ele usou inventou avaliações falsas para seu aplicativo, demonstrando a falta de confiabilidade e os riscos éticos associados.</li>
<li><b>O Dilema da Depuração:</b> Corrigir erros (depurar) em um código que você não escreveu é um dos maiores desafios do Vibe Coding. Como a IA gera o código dinamicamente, os desenvolvedores podem ter dificuldade para entender a sintaxe ou os conceitos que eles mesmos não utilizaram, tornando o processo de encontrar e consertar bugs extremamente complexo e demorado.</li>
</ul>
<h2>Conclusão: Acelerador, Não Piloto Automático</h2>
<p>Vibe Coding é, sem dúvida, uma ferramenta poderosa que está remodelando o desenvolvimento de software. Ele atua como um acelerador, permitindo que ideias se materializem com uma velocidade sem precedentes e abrindo portas para uma nova geração de criadores. No entanto, não é um piloto automático, e deve ser usada com muito cuidado e consciência &#8211; principalmente por profissionais ainda com pouca experiência e estudantes..</p>
<p>A supervisão humana, o pensamento crítico e a expertise técnica continuam sendo indispensáveis para garantir a qualidade, a segurança e a manutenção do que é criado.</p>
<p>A IA pode escrever o código, mas a responsabilidade final ainda é do desenvolvedor.</p>
<p>Em uma era de &#8220;vibe coding&#8221;, a linguagem de programação mais importante passará a ser&#8230; o bom e velho português?</p>
<h2>Referências</h2>
<ul>
<li>Abilytics (White Paper) &#8211; Vibe Coding: A New Era of AI-Assisted Software Development</li>
<li>Osmani, A. Vibe Coding &#8211; The Future of Programming &#8211; Leverage Your Experience in the Age of AI. 1ª edição 2025. O&#8217;Reilly.</li>
<li>Dataquest: <a href="https://support.dataquest.io/en/articles/844" target="_blank" rel="noopener">Why Learning Data Science Can&#8217;t Be Vibe Coded</a></li>
</ul>
<p>&nbsp;</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/inteligencia-artificial/vibe-coding-como-criar-softwares-com-pouco-conhecimento-de-programacao-ou-nenhum/">Vibe Coding: Como Criar Softwares Com Pouco Conhecimento de Programação (ou Nenhum)</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/inteligencia-artificial/vibe-coding-como-criar-softwares-com-pouco-conhecimento-de-programacao-ou-nenhum/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>O que é um bug em programação?</title>
		<link>https://www.bosontreinamentos.com.br/analise-de-sistemas/o-que-e-um-bug-em-programacao/</link>
					<comments>https://www.bosontreinamentos.com.br/analise-de-sistemas/o-que-e-um-bug-em-programacao/?noamp=mobile#comments</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Thu, 03 Apr 2025 19:47:56 +0000</pubDate>
				<category><![CDATA[Análise de Sistemas]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Programação]]></category>
		<guid isPermaLink="false">https://www.bosontreinamentos.com.br/?p=20778</guid>

					<description><![CDATA[<p>O que é um bug em programação? E por que ele pode custar milhões (ou mesmo vidas) Se você estuda ou trabalha em alguma área relacionada à tecnologia, é altamente provável &#8211; quase certeza &#8211; que já se deparou com a expressão &#8220;bug&#8221; ou com algum verbo &#8220;abrasileirado&#8221;, como &#8220;bugar&#8221; ou &#8220;bugado&#8221;. Mas o que significa exatamente isso? Considere a seguinte situação: um comando simples, por exemplo programado para imprimir uma mensagem na tela dez vezes, acaba executando indefinidamente, sem qualquer critério de parada. O sistema permanece responsivo, mas o comportamento é claramente incorreto. Trata-se de um erro lógico comum — chamado de loop infinito — e é um exemplo clássico de bug em programação. Entendendo o conceito de bug Bugs são falhas no código-fonte que levam um programa a se comportar de forma inesperada ou incorreta. Podem resultar em pequenos transtornos, como uma interface mal formatada, ou em consequências graves, como perda de dados, travamentos do sistema e até riscos à segurança &#8211; ou ainda mais graves. Qualquer pessoa que já tenha escrito código, por mais simples que seja, inevitavelmente se depara com esse tipo de problema. Mas o que caracteriza, de fato, um bug? E por que eles [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/analise-de-sistemas/o-que-e-um-bug-em-programacao/">O que é um bug em programação?</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>O que é um bug em programação?</h1>
<h3><strong><em>E por que ele pode custar milhões (ou mesmo vidas)</em></strong></h3>
<p>Se você estuda ou trabalha em alguma área relacionada à tecnologia, é altamente provável &#8211; quase certeza &#8211; que já se deparou com a expressão &#8220;bug&#8221; ou com algum verbo &#8220;abrasileirado&#8221;, como &#8220;bugar&#8221; ou &#8220;bugado&#8221;. Mas o que significa exatamente isso?</p>
<p>Considere a seguinte situação: um comando simples, por exemplo programado para imprimir uma mensagem na tela dez vezes, acaba executando indefinidamente, sem qualquer critério de parada. O sistema permanece responsivo, mas o comportamento é claramente incorreto. Trata-se de um erro lógico comum — chamado de loop infinito — e é um exemplo clássico de bug em programação.</p>
<h2>Entendendo o conceito de bug</h2>
<p>Bugs são falhas no código-fonte que levam um programa a se comportar de forma inesperada ou incorreta. Podem resultar em pequenos transtornos, como uma interface mal formatada, ou em consequências graves, como perda de dados, travamentos do sistema e até riscos à segurança &#8211; ou ainda mais graves.</p>
<p>Qualquer pessoa que já tenha escrito código, por mais simples que seja, inevitavelmente se depara com esse tipo de problema.</p>
<p>Mas o que caracteriza, de fato, um bug? E por que eles continuam sendo tão prevalentes mesmo com os avanços nas ferramentas de desenvolvimento e boas práticas de engenharia de software? </p>
<p>Ao contrário do que muitos pensam, computadores não “pensam” ou “entendem” intenções. Eles fazem exatamente o que mandamos — o problema é que nem sempre mandamos a coisa certa. Eles costumam surgir por erro humano: um código mal projetado, uma lógica mal pensada ou até mesmo por uma simples distração na digitação.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-20779 size-full" title="Infográfico: O que é um Bug" src="https://www.bosontreinamentos.com.br/wp-content/uploads/2025/04/bug-infografico.jpg" alt="Infográfico: O que é um Bug" width="467" height="711" srcset="https://www.bosontreinamentos.com.br/wp-content/uploads/2025/04/bug-infografico.jpg 467w, https://www.bosontreinamentos.com.br/wp-content/uploads/2025/04/bug-infografico-276x420.jpg 276w" sizes="auto, (max-width: 467px) 100vw, 467px" /></p>
<h2>A origem do termo &#8220;bug&#8221;</h2>
<p>A palavra bug (que literalmente significa &#8220;inseto&#8221; em inglês) foi popularizada pela almirante Grace Hopper em 1947. Durante a manutenção de um computador eletromecânico Mark II, uma mariposa foi encontrada presa em um relé, provocando falhas. O inseto foi cuidadosamente colado no diário de bordo com a legenda: &#8220;<em>First actual case of bug being found</em>&#8221; (em português, &#8220;Primeiro caso real de um bug sendo encontrado&#8221;).</p>
<p>A partir de então, o termo passou a ser usado para qualquer tipo de erro ou falha que ocorra em sistemas computacionais, não só de hardware, mas também (e hoje, principalmente) de software.</p>
<div id="attachment_20787" style="width: 510px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-20787" class="wp-image-20787 size-full" src="https://www.bosontreinamentos.com.br/wp-content/uploads/2025/04/bug-original-mark-I.jpg" alt="Primeiro bug de computador encontrado" width="500" height="317" srcset="https://www.bosontreinamentos.com.br/wp-content/uploads/2025/04/bug-original-mark-I.jpg 500w, https://www.bosontreinamentos.com.br/wp-content/uploads/2025/04/bug-original-mark-I-420x266.jpg 420w" sizes="auto, (max-width: 500px) 100vw, 500px" /><p id="caption-attachment-20787" class="wp-caption-text">Primeiro &#8220;bug&#8221; de computador encontrado &#8211; literalmente. Mariposa presa em um relé em um painel do Mark II durante um teste na Universidade de Harvard, em 09 de setembro de 1947. Os operadores que a encontraram a afixaram no livro de registros do computador, com a frase &#8220;Primeiro caso real de um bug sendo encontrado&#8221;</p></div>
<h2>Os três principais tipos de bug</h2>
<p>Os bugs nem sempre se manifestam da mesma forma. Alguns são fáceis de identificar, outros podem passar despercebidos por muito tempo. Os principais tipos incluem:</p>
<h3>1. Erros de sintaxe</h3>
<p>São falhas na escrita do código — algo como esquecer de fechar aspas, colocar um ponto e vírgula onde não devia (ou não colocar), ou ainda digitar comandos inválidos. A boa notícia? São geralmente detectados imediatamente na hora da compilação ou interpretação, ou mesmo apontados pelo IDE antes mesmo de tentar executar o programa para testá-lo.</p>
<h3>2. Erros de execução (runtime)</h3>
<p>Esses erros só aparecem quando o programa está rodando. Um exemplo clássico é a tentativa de divisão de um número por zero. O código-fonte parece correto, a aplicação roda normalmente, realiza cálculos com precisão, até que&#8230; bum!,  a execução para bruscamente quando uma tentativa de divisão por zero ocorre, podendo ocasionar desde a parada da execução da aplicação até o travamento completo do sistema.</p>
<h3>3. Erros semânticos (ou de lógica)</h3>
<p>São os mais traiçoeiros e difíceis de detectar. O programa roda, executa tudo sem travar, apresenta a saída para o usuário, mas os resultados estão errados — e às vezes ninguém percebe. Um caso comum ocorre com determinados cálculos matemáticos &#8211; o sistema efetua os cálculos solicitados, mas por conta de um bug lógico o resultado apresentado é incorreto, e o usuário pode não perceber o problema.</p>
<p>Esse tipo de erro pode causar grandes transtornos, desde perdas financeiras até acidentes fatais.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-20781 size-full" title="Infográfico: Tipos de Bugs em programação" src="https://www.bosontreinamentos.com.br/wp-content/uploads/2025/04/infografico-tipos-bugs.jpg" alt="Infográfico: Tipos de Bugs em programação" width="475" height="715" srcset="https://www.bosontreinamentos.com.br/wp-content/uploads/2025/04/infografico-tipos-bugs.jpg 475w, https://www.bosontreinamentos.com.br/wp-content/uploads/2025/04/infografico-tipos-bugs-279x420.jpg 279w" sizes="auto, (max-width: 475px) 100vw, 475px" /></p>
<h2>Quando um bug deixa de ser só um incômodo</h2>
<p>Se você acha que um bug é só um erro inofensivo que causa irritação, pense de novo. Bugs já causaram prejuízos bilionários e, em casos extremos, até mortes.</p>
<p>Citemos alguns exemplos notáveis:</p>
<ul>
<li><strong>Nuclear Gandhi</strong>: No jogo Sid Meier’s Civilization (1991), um erro no sistema de agressividade das civilizações fazia com que o personagem do pacifista Mahatma Gandhi, inicialmente programado com o menor nível possível de agressividade, se tornasse extremamente beligerante após adoção de políticas democráticas. Devido a um <em>underflow</em> (valor abaixo do mínimo) no valor da variável, seu nível de agressividade era reduzido para um valor negativo, que acabava sendo interpretado como o valor máximo permitido.<br />
O resultado: um Gandhi obcecado por armas nucleares — um bug icônico da história dos games. Divertido? Sim. Mas ainda um bug.</li>
<li><strong>Therac-25</strong>: Entre 1985 e 1987, um equipamento de radioterapia de nome Therac-25, usado no tratamento de câncer, apresentou falhas críticas causadas por erros de programação em seu sistema de controle. Devido à ausência de verificações adequadas e à confiança excessiva em software, o dispositivo permitia que doses de radiação muito acima do limite seguro fossem aplicadas nos pacientes em tratamento.<br />
Seis pacientes morreram por exposição acidental a níveis fatais de radiação. </li>
<li><strong>Mars Climate Orbiter</strong>: Em setembro de 1999, a NASA perdeu contato com a sonda Mars Climate Orbiter pouco antes de sua inserção na órbita do planeta Marte. A falha ocorreu porque um módulo do software produzia dados de impulso na unidade libras-força (sistema imperial), enquanto outro módulo esperava receber esses dados em newtons (sistema métrico).<br />
A ausência de conversão entre unidades resultou em um erro de trajetória fatal, fazendo com que a sonda descesse demais na atmosfera marciana e fosse destruída. O prejuízo estimado ultrapassou US$ 327 milhões.</li>
<li><strong>Guitar Hero II</strong>: Em 2007, uma atualização lançada para o jogo Guitar Hero II em sua versão para o console Xbox 360 causou problemas sérios de estabilidade em diversos aparelhos. Alguns dispositivos passaram a apresentar falhas críticas após a atualização, incluindo travamentos frequentes e, em muitos casos, o temido &#8220;<em>Red Ring of Death</em>&#8221; (Anel Vermelho da Morte) — um erro fatal de hardware que inutilizava o console. Embora o bug fosse de software, seu impacto foi sentido no hardware, resultando em muitas unidades defeituosas.</li>
</ul>
<div id="attachment_20788" style="width: 410px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-20788" class="wp-image-20788 size-full" src="https://www.bosontreinamentos.com.br/wp-content/uploads/2025/04/therac-25-maquina-bug.webp" alt="" width="400" height="296" /><p id="caption-attachment-20788" class="wp-caption-text">Máquina para tratamento de câncer Therac-25</p></div>
<h2>Como lidar com bugs: a arte da depuração</h2>
<p>O processo de encontrar e corrigir bugs é conhecido como <em>debugging</em> (em português, <strong>depuração</strong>). Ferramentas chamadas depuradores (ou debuggers) ajudam a examinar o código linha por linha, inspecionar variáveis e identificar o ponto exato em que tudo começa a dar errado.</p>
<p>Ambientes de desenvolvimento (IDEs) modernos geralmente vêm com depuradores embutidos, tornando essa tarefa um pouco menos ingrata e mais fácil de realizar.</p>
<p><img loading="lazy" decoding="async" class="wp-image-20780 size-full aligncenter" title="Infográfico: melhores práticas para evitar bugs" src="https://www.bosontreinamentos.com.br/wp-content/uploads/2025/04/infografico-bugs-melhores-praticas.jpg" alt="Infográfico: melhores práticas para evitar bugs" width="440" height="683" srcset="https://www.bosontreinamentos.com.br/wp-content/uploads/2025/04/infografico-bugs-melhores-praticas.jpg 440w, https://www.bosontreinamentos.com.br/wp-content/uploads/2025/04/infografico-bugs-melhores-praticas-271x420.jpg 271w" sizes="auto, (max-width: 440px) 100vw, 440px" /></p>
<h2>Prevenção de bugs: manipulação de exceções</h2>
<p>Outro recurso fundamental é o tratamento de exceções. Trata-se de prever que algo pode dar errado (como dividir um número por zero em um cálculo) e preparar o programa para lidar com isso de forma antecipada, sem falhar completamente. Linguagens de alto nível como Java, Python e C# têm mecanismos específicos para isso, como os blocos try&#8230;catch.</p>
<p><strong>Exemplo em Java:</strong></p>
<pre><strong>import java.util.Scanner;</strong>
<strong>public class Divisao {</strong>
<strong>  public static void main(String[] args) {</strong>
<strong>    Scanner entrada = new Scanner(System.in);</strong>
<strong>    System.out.print("Digite o valor de a: ");</strong>
<strong>    int a = entrada.nextInt();</strong>
<strong>    System.out.print("Digite o valor de b: ");</strong>
<strong>    int b = entrada.nextInt();</strong>
<strong>    int c = a / b; <span style="color: #339966;">// BUG EM POTENCIAL: pode lançar ArithmeticException se b = 0</span></strong>
<strong>    System.out.println("Resultado = " + c);</strong>
<strong>    entrada.close();</strong>
<strong>  }</strong>
<strong>}</strong></pre>
<p>Neste exemplo, se o usuário digitar o valor zero ao entrar com o valor de b, será feita uma divisão por zero ao executar o cálculo da variável c. Qualquer outra divisão funcionará, exceto essa.</p>
<p>Ou seja, se b for igual a zero, o programa lançará uma exceção do tipo <em>ArithmeticException</em> e será encerrado abruptamente. Esse é um exemplo clássico de erro de tempo de execução (<em>runtime error</em>), causado por não tratar uma condição excepcional comum.</p>
<p>Como tratar isso? Uma solução é realizar a manipulação dessa exceção, como segue:</p>
<pre><strong>import java.util.Scanner;</strong>
<strong>public class DivisaoSegura {</strong>
<strong>  public static void main(String[] args) {</strong>
<strong>    Scanner entrada = new Scanner(System.in);</strong>
<strong>    System.out.print("Digite o valor de a: ");</strong>
<strong>    int a = entrada.nextInt();</strong>
<strong>    System.out.print("Digite o valor de b: ");</strong>
<strong>    int b = entrada.nextInt();</strong>
<strong>    try {</strong>
<strong>      int c = a / b;</strong>
<strong>      System.out.println("Resultado = " + c);</strong>
<strong>    }
    catch (ArithmeticException e) {</strong>
<strong>      System.out.println("Não é possível dividir por zero.");</strong>
<strong>      System.out.println(e);</strong>
<strong>    }</strong>
<strong>    entrada.close();</strong>
<strong>  }</strong>
<strong>}</strong></pre>
<p>Neste caso a exceção (erro) ArithmeticException foi tratada por meio do uso de um bloco <em>try .. catch</em>, que impedirá o travamento do sistema caso seja fornecido o valor zero à variável b, exibindo em vez disso a mensagem mais amigável &#8220;<em>Não é possível dividir por zero</em>&#8221; ao usuário..</p>
<h2>Testes: prevenindo problemas</h2>
<p>A melhor forma de combater bugs é evitá-los desde o início. Testes de software — tanto manuais quanto automatizados — são parte essencial do desenvolvimento. Eles verificam se o programa atende aos requisitos e ajudam a identificar falhas antes que elas possam causar estragos maiores.</p>
<p>Entre os tipos de testes mais comuns estão:</p>
<ul>
<li>Testes unitários: verificam o funcionamento de partes específicas do código.</li>
<li>Testes de integração: checam se os módulos interagem corretamente.</li>
<li>Testes de sistema: avaliam o sistema como um todo.</li>
<li>Testes de aceitação: garantem que o software atende ao que o cliente espera.</li>
</ul>
<h2>Bugs no mundo real: onde menos se espera</h2>
<p>É importante lembrar que nem só de software vive o mundo dos bugs. Hardware também pode apresentar falhas semelhantes, como erros de projeto em placas, aquecimento excessivo ou falhas elétricas. Mas no fim das contas, tudo parte da mesma raiz: uma falha humana durante a concepção ou implementação de um projeto.</p>
<h2>Conclusão: errar é humano, depurar é essencial</h2>
<p>Bugs fazem parte da vida de qualquer programador. Não há como evitá-los completamente, mas é possível preveni-los, detectá-los rapidamente e corrigi-los antes que causem problemas sérios.</p>
<p>Com boas práticas de codificação, testes constantes e ferramentas adequadas, dá para dormir mais tranquilo. Ou ao menos, sem sonhar com mariposas voando entre os relés.</p>
<h3>Colabore com a Bóson Treinamentos</h3>
<p>Ajude o canal adquirindo meus cursos na Udemy:</p>
<ul>
<li>Bancos de Dados com MySQL Básico: <a href="https://bit.ly/35QdWE4" target="_blank" rel="noopener">https://bit.ly/35QdWE4</a></li>
<li>Lógica de Programação com Português Estruturado: <a href="https://bit.ly/3QKPn22" target="_blank" rel="noopener">https://bit.ly/3QKPn22</a></li>
<li>Programação em Python do Zero: <a href="https://bit.ly/python-boson" target="_blank" rel="noopener">https://bit.ly/python-boson</a></li>
</ul>
<p>Adquira também livros e outros itens na loja da Bóson Treinamentos na Amazon e ajude o canal a se manter e crescer: <a href="https://www.amazon.com.br/shop/bosontreinamentos" target="_blank" rel="noopener">https://www.amazon.com.br/shop/bosontreinamentos</a></p>
<p>O post <a href="https://www.bosontreinamentos.com.br/analise-de-sistemas/o-que-e-um-bug-em-programacao/">O que é um bug em programação?</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/analise-de-sistemas/o-que-e-um-bug-em-programacao/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Calcular números primos com Crivo de Eratóstenes em Fortran</title>
		<link>https://www.bosontreinamentos.com.br/fortran/calcular-numeros-primos-com-crivo-de-eratostenes-em-fortran/</link>
					<comments>https://www.bosontreinamentos.com.br/fortran/calcular-numeros-primos-com-crivo-de-eratostenes-em-fortran/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Tue, 18 Mar 2025 18:13:19 +0000</pubDate>
				<category><![CDATA[Fortran]]></category>
		<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[FORTRAN]]></category>
		<category><![CDATA[Matemática]]></category>
		<category><![CDATA[Programação]]></category>
		<guid isPermaLink="false">http://www.bosontreinamentos.com.br/?p=19783</guid>

					<description><![CDATA[<p>Números primos com Crivo de Eratóstenes em Fortran Neste tutorial trago um algoritmo simples, escrito em Fortran, que permite encontrar os números primos de 1 até um valor n, informado pelo usuário durante a execução do programa, para isso usando o algoritmo clássico conhecido como Crivo de Eratóstenes. Números primos são números naturais maiores que 1 que têm apenas dois divisores: 1 e eles mesmos. Em outras palavras, são números que não podem ser divididos por nenhum outro número além de 1 e deles mesmos sem resultar em um resto. Exemplos de números primos incluem 2, 3, 5, 7 e 11. A propriedade fundamental dos números primos é que não podem ser formados multiplicando dois números inteiros diferentes entre si. A compreensão dos números primos é crucial em matemática, e sua identificação desempenha um papel fundamental em áreas como criptografia e teoria dos números. O Crivo de Eratóstenes é um algoritmo antigo e eficiente para encontrar todos os números primos até um determinado limite. Ele funciona marcando os múltiplos de cada número primo encontrado, eliminando números compostos e deixando apenas os números primos. O algoritmo realiza iterações até que todos os números até o limite desejado sejam verificados. Trata-se de [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/fortran/calcular-numeros-primos-com-crivo-de-eratostenes-em-fortran/">Calcular números primos com Crivo de Eratóstenes em Fortran</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Números primos com Crivo de Eratóstenes em Fortran</h2>
<p>Neste tutorial trago um algoritmo simples, escrito em Fortran, que permite encontrar os números primos de 1 até um valor n, informado pelo usuário durante a execução do programa, para isso usando o algoritmo clássico conhecido como <strong><em>Crivo de Eratóstenes</em></strong>.</p>
<p>Números primos são números naturais maiores que 1 que têm apenas dois divisores: 1 e eles mesmos. Em outras palavras, são números que não podem ser divididos por nenhum outro número além de 1 e deles mesmos sem resultar em um resto.</p>
<p>Exemplos de números primos incluem 2, 3, 5, 7 e 11.</p>
<p>A propriedade fundamental dos números primos é que não podem ser formados multiplicando dois números inteiros diferentes entre si. A compreensão dos números primos é crucial em matemática, e sua identificação desempenha um papel fundamental em áreas como criptografia e teoria dos números.</p>
<p>O <a href="https://www.keil.com/benchmarks/sieve.asp" target="_blank" rel="noopener">Crivo de Eratóstenes</a> é um algoritmo antigo e eficiente para encontrar todos os números primos até um determinado limite. Ele funciona marcando os múltiplos de cada número primo encontrado, eliminando números compostos e deixando apenas os números primos. O algoritmo realiza iterações até que todos os números até o limite desejado sejam verificados.</p>
<p>Trata-se de uma maneira bastante eficaz de encontrar rapidamente todos os números primos dentro de um intervalo específico.</p>
<p>De acordo com a tradição, o Crivo de Eratóstenes foi criado pelo matemático grego Eratóstenes de Cirene por volta de 240 a.C., sendo assim uma das técnicas mais antigas conhecidas para encontrar números primos.</p>
<div id="attachment_19891" style="width: 279px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-19891" class="size-full wp-image-19891" src="http://www.bosontreinamentos.com.br/wp-content/uploads/2024/01/eratostenes-busto.png" alt="Busto de Eratóstenes" width="269" height="437" srcset="https://www.bosontreinamentos.com.br/wp-content/uploads/2024/01/eratostenes-busto.png 269w, https://www.bosontreinamentos.com.br/wp-content/uploads/2024/01/eratostenes-busto-259x420.png 259w" sizes="auto, (max-width: 269px) 100vw, 269px" /><p id="caption-attachment-19891" class="wp-caption-text">Busto de Eratóstenes</p></div>
<p>Neste tutorial vamos implementar este algoritmo usando a linguagem de programação Fortran.</p>
<h3>Funcionamento do Crivo de Eratóstenes</h3>
<p>O algoritmo do Crivo de Eratóstenes funciona da seguinte maneira:</p>
<ol>
<li>Inicialização:<br />
Começamos criando uma lista de números a partir de 2 até o valor limite desejado pelo usuário.<br />
Marcamos todos esses números como não riscados, indicando que inicialmente consideramos todos como primos.</li>
<li>Seleção do Próximo Número:<br />
Começamos com o primeiro número não riscado, que é o 2.<br />
Este número é então marcado como primo, já que é o menor número não riscado (e 2 é o primeiro número primo).</li>
<li>Eliminação dos Múltiplos:<br />
Agora vamos riscar todos os múltiplos do número primo que acabamos de encontrar, até chegar no valor limite.<br />
No caso, riscamos todos os múltiplos de 2 (4, 6, 8, 10, 12, &#8230;).</li>
<li>Seleção do Próximo Número Não Riscado:<br />
Após riscar os múltiplos do número anterior, vamos nos mover para o próximo número não riscado na lista, que é o próximo número primo.</li>
<li>Repetição:<br />
Repetimos os passos 3 e 4 até que tenhamos marcado todos os números não riscados como primos ou não primos.</li>
</ol>
<p>Ao final do processo, os números que permanecem não riscados são os números primos dentro do intervalo desejado. O Crivo de Eratóstenes é eficiente porque evita a verificação de múltiplos de números que já foram marcados como não primos, reduzindo significativamente o número de iterações necessárias.</p>
<p>Visualmente, o que o crivo de Eratóstenes equivale ao seguinte:</p>
<table class="dataframe" border="1">
<thead>
<tr style="text-align: right;">
<th> </th>
<th>0</th>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
<th>5</th>
<th>6</th>
<th>7</th>
<th>8</th>
<th>9</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 1</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 2</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 3</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 4</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 5</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 6</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 7</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 8</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 9</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 10</td>
</tr>
<tr>
<th>1</th>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 11</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 12</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 13</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 14</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 15</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 16</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 17</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 18</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 19</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 20</td>
</tr>
<tr>
<th>2</th>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 21</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 22</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 23</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 24</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 25</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 26</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 27</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 28</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 29</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 30</td>
</tr>
<tr>
<th>3</th>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 31</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 32</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 33</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 34</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 35</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 36</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 37</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 38</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 39</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 40</td>
</tr>
<tr>
<th>4</th>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 41</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 42</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 43</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 44</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 45</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 46</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 47</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 48</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 49</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 50</td>
</tr>
<tr>
<th>5</th>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 51</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 52</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 53</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 54</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 55</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 56</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 57</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 58</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 59</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 60</td>
</tr>
<tr>
<th>6</th>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 61</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 62</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 63</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 64</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 65</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 66</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 67</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 68</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 69</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 70</td>
</tr>
<tr>
<th>7</th>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 71</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 72</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 73</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 74</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 75</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 76</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 77</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 78</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 79</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 80</td>
</tr>
<tr>
<th>8</th>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 81</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 82</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 83</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 84</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 85</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 86</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 87</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 88</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 89</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 90</td>
</tr>
<tr>
<th>9</th>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 91</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 92</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 93</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 94</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 95</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 96</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 97</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 98</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 99</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 100</td>
</tr>
</tbody>
</table>
<p>Podemos ver que os números primos estão destacados (check verde), ao passo que os números múltiplos, que não são primos, são descartados (x vermelho).</p>
<p>Este algoritmo é bastante empregado em matemática computacional e é uma abordagem clássica para encontrar números primos.</p>
<p>Vejamos agora como implementar esse algoritmo usando uma linguagem de programação &#8211; no caso, o Fortran.</p>
<h3>Código em Fortran</h3>
<pre>program CrivoDeEratostenes
implicit none

integer, parameter :: MAX_N = 1000000
integer :: n
logical :: e_primo(MAX_N)
integer :: i, j

<span style="color: #339966;">! Inicializar o vetor de primos como verdadeiro</span>
e_primo = .true.

<span style="color: #339966;">! Solicitar ao usuário que insira o valor de 'n'</span>
write(*,*) 'Digite um número inteiro positivo n:'
read(*,*) n

<span style="color: #339966;">! Verificar se o valor de n está dentro dos limites permitidos para números primos</span>
if (n &lt;= 1 .or. n &gt; MAX_N) then
    write(*,*) 'Valor de n fora dos limites permitidos.'
    stop
end if

<span style="color: #339966;">! Algoritmo do Crivo de Eratóstenes</span>
do i = 2, n
    if (e_primo(i)) then
        do j = 2*i, n, i
            e_primo(j) = .false.
        end do
    end if
end do

! Exibir os números primos encontrados
write(*,*) 'Números primos de 1 até', n, ':'
do i = 2, n
    if (e_primo(i)) then
        write(*,*) i
    end if
end do

end program CrivoDeEratostenes</pre>
<h3>Teste</h3>
<p>Para testar, vamos pedir ao programa para retornar todos os números primos até o valor 500.000 (quinhentos mil!):</p>
<p>Resultado (truncado):</p>
<pre><span style="color: #000000;"><strong>2</strong></span>
<span style="color: #000000;"><strong>3</strong></span>
<span style="color: #000000;"><strong>5</strong></span>
<span style="color: #000000;"><strong>7</strong></span>
<span style="color: #000000;"><strong>11</strong></span>
<span style="color: #000000;"><strong>...</strong></span>
<span style="color: #000000;"><strong>499943</strong></span>
<span style="color: #000000;"><strong>499957</strong></span>
<span style="color: #000000;"><strong>499969</strong></span>
<span style="color: #000000;"><strong>499973</strong></span>
<span style="color: #000000;"><strong>499979</strong></span></pre>
<h3>Explicação do Código</h3>
<p>E como exatamente funciona esse código? Vejamos uma explicação passo a passo:</p>
<p>1. Declaração de Variáveis &#8211; Começamos declarando algumas variáveis:</p>
<ul>
<li><strong>MAX_N</strong>: Valor máximo permitido para n (limite superior para encontrar números primos).</li>
<li><strong>n</strong>: Número que será fornecido pelo usuário.</li>
<li><strong>e_primo</strong>: Um array lógico que indica se um número <em>é primo</em> (TRUE) ou não (FALSE).</li>
<li><strong>i</strong> e <strong>j</strong>: Índices para iteração.</li>
</ul>
<p>2. Inicialização:</p>
<ul>
<li>e_primo = .TRUE.: Inicializa o vetor de primos como verdadeiro.</li>
</ul>
<p>3. Entrada do Usuário:</p>
<ul>
<li>write(*,*) &#8216;Digite um número inteiro positivo n:&#8217;: Solicita ao usuário que insira um número inteiro positivo.</li>
<li>read(*,*) n: Lê o valor inserido pelo usuário.</li>
</ul>
<p>4. Verificação do Limite:<br />
&#8211; if (n &lt;= 1 .or. n &gt; MAX_N) then: Verifica se o valor de n está dentro dos limites permitidos para números primos.<br />
&#8211; write(*,*) &#8216;Valor de n fora dos limites permitidos.&#8217;: Exibe uma mensagem de erro se o valor de n estiver fora dos limites.<br />
&#8211; stop: Encerra o programa.</p>
<p>5. Algoritmo do Crivo de Eratóstenes:<br />
&#8211; A estrutura de repetição do i = 2, n itera sobre todos os números de 2 até n.<br />
&#8211; if (e_primo(i)) then: Verifica se i é marcado como primo.<br />
&#8211; A estrutura de repetição interna do j = 2*i, n, i marca todos os múltiplos de i como não primos, já que eles são divisíveis por i.</p>
<p>6. Saída dos Números Primos Encontrados:<br />
&#8211; write(*,*) &#8216;Números primos de 1 até&#8217;, n, &#8216;:&#8217;: Exibe uma mensagem indicando que os números primos estão sendo mostrados.<br />
&#8211; A segunda estrutura de repetição do i = 2, n itera sobre todos os números de 2 até n.<br />
&#8211; if (e_primo(i)) then: Verifica se i é marcado como primo.<br />
&#8211; write(*,*) i: Exibe o número primo.</p>
<h3>Conclusão</h3>
<p>Neste artigo vimos como empregar a técnica do Crivo de Eratóstenes para determinar números primos na linguagem de programação Fortran. Esse mesmo código pode ser adaptado para outras linguagens, como Python, C++, C# ou Rust, de acordo com sua necessidade.</p>
<h3>Colabore com a Bóson Treinamentos</h3>
<p>Ajude o canal adquirindo meus cursos na Udemy:</p>
<ul>
<li>Bancos de Dados com MySQL Básico: <a href="https://bit.ly/35QdWE4" target="_blank" rel="noopener">https://bit.ly/35QdWE4</a></li>
<li>Lógica de Programação com Português Estruturado: <a href="https://bit.ly/3QKPn22" target="_blank" rel="noopener">https://bit.ly/3QKPn22</a></li>
<li>Programação em Python do Zero: <a href="https://bit.ly/python-boson" target="_blank" rel="noopener">https://bit.ly/python-boson</a></li>
</ul>
<p>Adquira também livros e outros itens na loja da Bóson Treinamentos na Amazon e ajude o canal a se manter e crescer: <a href="https://www.amazon.com.br/shop/bosontreinamentos" target="_blank" rel="noopener">https://www.amazon.com.br/shop/bosontreinamentos</a></p>
<p>O post <a href="https://www.bosontreinamentos.com.br/fortran/calcular-numeros-primos-com-crivo-de-eratostenes-em-fortran/">Calcular números primos com Crivo de Eratóstenes em Fortran</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/fortran/calcular-numeros-primos-com-crivo-de-eratostenes-em-fortran/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Operadores em linguagem Rust</title>
		<link>https://www.bosontreinamentos.com.br/rust/operadores-em-linguagem-rust/</link>
					<comments>https://www.bosontreinamentos.com.br/rust/operadores-em-linguagem-rust/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Wed, 18 Dec 2024 10:48:23 +0000</pubDate>
				<category><![CDATA[Rust]]></category>
		<category><![CDATA[Programação]]></category>
		<guid isPermaLink="false">https://www.bosontreinamentos.com.br/?p=20686</guid>

					<description><![CDATA[<p>Operadores em linguagem Rust Em programação, um operador é um símbolo define uma função que será realizada sobre os dados em uma aplicação. Os dados sobre os quais esses operadores atuam são chamados de operandos. Consideremos a seguinte expressão: 9 + 10 = 19 Aqui, os valores 9 e 10 são os operandos, enquanto os sinais + e = são os operadores. Já o valor 19 é o resultado da operação realizada &#8211; no caso, uma operação aritmética de soma de dois números inteiros. A linguagem Rust possui suporte a diversos tipos de operadores, e os principais operadores primários podem ser classificados como: Aritméticos Bitwise (Operadores bit-a-bit) Relacionais ou de Comparação Lógicos Vejamos quais são esses operadores, suas funções e exemplos de uso de cada um deles. Operadores Aritméticos Os operadores aritméticos são empregados na realização de cálculos aritméticos simples, usando as quatro operações básicas da matemática mais a operação como o módulo. A tabela a seguir mostra os operadores aritméticos com sua descrição, e um exemplo de uso de cada. Nos exemplos, vamos imaginar que os valores em duas variáveis a e b são 10 e 5, respectivamente. Operador Descrição Exemplo + Retorna a soma dos operandos a + [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/rust/operadores-em-linguagem-rust/">Operadores em linguagem Rust</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Operadores em linguagem Rust</h1>
<p>Em programação, um <strong>operador</strong> é um símbolo define uma função que será realizada sobre os dados em uma aplicação. Os dados sobre os quais esses operadores atuam são chamados de <em>operandos</em>.</p>
<p>Consideremos a seguinte expressão:</p>
<pre><span style="font-size: 18pt;"><strong>9 + 10 = 19</strong></span></pre>
<p>Aqui, os valores 9 e 10 são os operandos, enquanto os sinais + e = são os operadores. Já o valor 19 é o resultado da operação realizada &#8211; no caso, uma operação aritmética de soma de dois números inteiros.</p>
<p>A linguagem Rust possui suporte a diversos tipos de operadores, e os principais operadores primários podem ser classificados como:</p>
<ul>
<li>Aritméticos</li>
<li>Bitwise (Operadores bit-a-bit)</li>
<li>Relacionais ou de Comparação</li>
<li>Lógicos</li>
</ul>
<p>Vejamos quais são esses operadores, suas funções e exemplos de uso de cada um deles.</p>
<h2>Operadores Aritméticos</h2>
<p>Os operadores aritméticos são empregados na realização de cálculos aritméticos simples, usando as quatro operações básicas da matemática mais a operação como o módulo.</p>
<p>A tabela a seguir mostra os operadores aritméticos com sua descrição, e um exemplo de uso de cada. Nos exemplos, vamos imaginar que os valores em duas variáveis <code>a</code> e <code>b</code> são 10 e 5, respectivamente.</p>
<table style="border-collapse: collapse; width: 100%; font-size: 16px; text-align: left;">
<thead>
<tr>
<th style="border: 1px solid #ddd; padding: 8px; background-color: #f4f4f4;">Operador</th>
<th style="border: 1px solid #ddd; padding: 8px; background-color: #f4f4f4;">Descrição</th>
<th style="border: 1px solid #ddd; padding: 8px; background-color: #f4f4f4;">Exemplo</th>
</tr>
</thead>
<tbody>
<tr>
<td style="border: 1px solid #ddd; padding: 8px;">+</td>
<td style="border: 1px solid #ddd; padding: 8px;">Retorna a soma dos operandos</td>
<td style="border: 1px solid #ddd; padding: 8px;">a + b é 15</td>
</tr>
<tr style="background-color: #f9f9f9;">
<td style="border: 1px solid #ddd; padding: 8px;">&#8211;</td>
<td style="border: 1px solid #ddd; padding: 8px;">Retorna a diferença dos valores</td>
<td style="border: 1px solid #ddd; padding: 8px;">a &#8211; b é 5</td>
</tr>
<tr>
<td style="border: 1px solid #ddd; padding: 8px;">*</td>
<td style="border: 1px solid #ddd; padding: 8px;">Retorna o produto dos valores</td>
<td style="border: 1px solid #ddd; padding: 8px;">a * b é 50</td>
</tr>
<tr style="background-color: #f9f9f9;">
<td style="border: 1px solid #ddd; padding: 8px;">/</td>
<td style="border: 1px solid #ddd; padding: 8px;">Realiza a divisão e retorna o quociente</td>
<td style="border: 1px solid #ddd; padding: 8px;">a / b é 2</td>
</tr>
<tr>
<td style="border: 1px solid #ddd; padding: 8px;">%</td>
<td style="border: 1px solid #ddd; padding: 8px;">Realiza a divisão e retorna o restante</td>
<td style="border: 1px solid #ddd; padding: 8px;">a % b é 0</td>
</tr>
</tbody>
</table>
<p><strong>Nota:</strong> Os operadores de incremento e decremento <code>++</code> e <code>--</code> não são suportados em Rust. Vejamos agora exemplos de código que usam esses operadores.</p>
<p><strong>Exemplo de uso de operadores aritméticos</strong></p>
<pre><strong>fn main() {</strong>
<strong>  let a = 10;</strong>
<strong>  let b = 5;</strong>
<strong>  println!("Soma: {}", a + b); <span style="color: #008000;">// Soma</span></strong>
<strong>  println!("Subtração: {}", a - b); <span style="color: #008000;">// Subtração</span></strong>
<strong>  println!("Multiplicação: {}", a * b); <span style="color: #008000;">// Multiplicação</span></strong>
<strong>  println!("Divisão: {}", a / b); <span style="color: #008000;">// Divisão</span></strong>
<strong>  println!("Módulo: {}", a % b); <span style="color: #008000;">// Resto da divisão inteira</span></strong>
<strong>}</strong></pre>
<p>Saída:</p>
<pre><span style="color: #000000;"><strong>Soma: 15</strong></span>
<span style="color: #000000;"><strong>Subtração: 5</strong></span>
<span style="color: #000000;"><strong>Multiplicação: 50</strong></span>
<span style="color: #000000;"><strong>Divisão: 2</strong></span>
<span style="color: #000000;"><strong>Módulo: 0</strong></span></pre>
<h2>Operadores Relacionais</h2>
<p>Os operadores relacionais testam ou definem o tipo de relação entre duas entidades. São usados para comparar dois ou mais valores, sendo também conhecidos como operadores de comparação, e retornam sempre um valor booleano (<code>true</code> ou <code>false</code>).</p>
<p>A tabela a seguir mostra os operadores relacionais com sua descrição, e um exemplo de uso de cada. Vamos assumir os valores de variáveis <code>A = 10</code> e <code>B = 20</code> nos exemplos.</p>
<table style="border-collapse: collapse; width: 100%; font-size: 16px; text-align: left;">
<thead>
<tr>
<th style="border: 1px solid #ddd; padding: 8px; background-color: #f4f4f4;">Operador</th>
<th style="border: 1px solid #ddd; padding: 8px; background-color: #f4f4f4;">Descrição</th>
<th style="border: 1px solid #ddd; padding: 8px; background-color: #f4f4f4;">Exemplo</th>
</tr>
</thead>
<tbody>
<tr>
<td style="border: 1px solid #ddd; padding: 8px;">&gt;</td>
<td style="border: 1px solid #ddd; padding: 8px;">Maior que</td>
<td style="border: 1px solid #ddd; padding: 8px;">(A &gt; B) é False</td>
</tr>
<tr style="background-color: #f9f9f9;">
<td style="border: 1px solid #ddd; padding: 8px;">&lt;</td>
<td style="border: 1px solid #ddd; padding: 8px;">Menor que</td>
<td style="border: 1px solid #ddd; padding: 8px;">(A &lt; B) é True</td>
</tr>
<tr>
<td style="border: 1px solid #dddddd; padding: 8px;">&gt;=</td>
<td style="border: 1px solid #dddddd; padding: 8px;">Maior ou igual a</td>
<td style="border: 1px solid #dddddd; padding: 8px;">(A &gt;= B) é False</td>
</tr>
<tr>
<td style="border: 1px solid #dddddd; padding: 8px;">&lt;=</td>
<td style="border: 1px solid #dddddd; padding: 8px;">Menor ou igual a</td>
<td style="border: 1px solid #dddddd; padding: 8px;">(A &lt;= B) é True</td>
</tr>
<tr>
<td style="border: 1px solid #dddddd; padding: 8px;">==</td>
<td style="border: 1px solid #dddddd; padding: 8px;">Igual a</td>
<td style="border: 1px solid #dddddd; padding: 8px;">(A == B) é False</td>
</tr>
<tr>
<td style="border: 1px solid #dddddd; padding: 8px;">!=</td>
<td style="border: 1px solid #dddddd; padding: 8px;">Diferente de</td>
<td style="border: 1px solid #dddddd; padding: 8px;">(A != B) é True</td>
</tr>
</tbody>
</table>
<p>Vejamos agora exemplos de código que usam os operadores de comparação / relacionais.</p>
<p><strong>Exemplo de uso de operadores relacionais</strong></p>
<pre><strong>fn main() {</strong>
<strong>  let a = 10;</strong>
<strong>  let b = 20;</strong>
<strong>  println!("a vale {a} e b vale {b}");</strong>
<strong>  println!("{a} é maior que {b}? {}", a &gt; b);</strong>
<strong>  println!("{a} é menor que {b} ? {}", a &lt; b);</strong>
<strong>  println!("{a} é maior ou igual a {b} ? {}", a &gt;= b);</strong>
<strong>  println!("{a} é menor ou igual a {b} ? {}", a &lt;= b);</strong>
<strong>  println!("{a} é igual a {b} ? {}", a == b);</strong>
<strong>  println!("{a} é diferente de {b} ? {}", a != b);</strong>
<strong>}</strong></pre>
<p>Saída:</p>
<pre><span style="color: #000000;"><strong>a vale 10 e b vale 20</strong></span>
<span style="color: #000000;"><strong>a é maior que b? false</strong></span>
<span style="color: #000000;"><strong>a é menor que b? true</strong></span>
<span style="color: #000000;"><strong>a é maior ou igual a b? false</strong></span>
<span style="color: #000000;"><strong>a é menor ou igual a b? true</strong></span>
<span style="color: #000000;"><strong>a é igual a ? false</strong></span>
<span style="color: #000000;"><strong>a é diferente de b? true</strong></span></pre>
<h2>Operadores Lógicos</h2>
<p>Os operadores lógicos são usados para combinar duas ou mais condições e retornam um valor booleano, que é True (verdadeiro) ou False (falso). Vamos assumir novamente os valores <code>A = 10</code> e <code>B = 20</code>.</p>
<table style="border-collapse: collapse; width: 100%; font-size: 16px; text-align: left;">
<thead>
<tr>
<th style="border: 1px solid #ddd; padding: 8px; background-color: #f4f4f4;">Operador</th>
<th style="border: 1px solid #ddd; padding: 8px; background-color: #f4f4f4;">Descrição</th>
<th style="border: 1px solid #ddd; padding: 8px; background-color: #f4f4f4;">Exemplo</th>
</tr>
</thead>
<tbody>
<tr>
<td style="border: 1px solid #ddd; padding: 8px;">&amp;&amp;</td>
<td style="border: 1px solid #ddd; padding: 8px;">Retorna <code>true</code> se todas as condições forem verdadeiras; se uma das condições for falsa, retorna false.</td>
<td style="border: 1px solid #ddd; padding: 8px;">(A &gt; 10 &amp;&amp; B &gt; 10) é False</td>
</tr>
<tr>
<td style="border: 1px solid #dddddd; padding: 8px;">||</td>
<td style="border: 1px solid #dddddd; padding: 8px;">Retorna <code>true</code> se pelo menos uma das condições for <code>true;</code>somente retorna false se todas as condições forem falsas.</td>
<td style="border: 1px solid #dddddd; padding: 8px;">(A &gt; 10 || B &gt; 10) é True</td>
</tr>
<tr>
<td style="border: 1px solid #dddddd; padding: 8px;">!</td>
<td style="border: 1px solid #dddddd; padding: 8px;">Operador unário inversor (age sobre um único operando). Retorna o inverso do valor lógico do operando (que pode ser uma expressão): se o valor for True, retorna False, e se for False, retorna True.</td>
<td style="border: 1px solid #dddddd; padding: 8px;">!(A &gt; 10) é True</td>
</tr>
</tbody>
</table>
<p><strong>Exemplo de uso de operadores lógicos</strong></p>
<pre><strong>fn main() {</strong>
<strong>  let a = 10;</strong>
<strong>  let b = 20;</strong>
<strong>  println!("a vale {a} e b vale {b}");</strong>
<strong>  println!("AND lógico: {}", a &gt; 5 &amp;&amp; b &gt; 15); <span style="color: #339966;">// True se ambas as condições forem verdadeiras</span></strong>
<strong>  println!("OR lógico: {}", a &gt; 15 || b &gt; 15); <span style="color: #339966;">// True se ao menos uma condição for verdadeira</span></strong>
<strong>  println!("NOT lógico: {}", !(a &gt; 15)); <span style="color: #339966;">// Inverte o resultado</span></strong>
<strong>}</strong></pre>
<p>Saída:</p>
<pre><span style="color: #000000;"><strong>a vale 10 e b vale 20</strong></span>
<span style="color: #000000;"><strong>AND lógico: true</strong></span>
<span style="color: #000000;"><strong>OR lógico: true</strong></span>
<span style="color: #000000;"><strong>NOT lógico: true</strong></span></pre>
<h2>Operadores Bitwise e de Deslocamento de Bits</h2>
<p>Os operadores de bit-a-bit ou <em>bitwise</em> realizam operações diretamente sobre os bits de dois ou mais números. Em vez de trabalhar com valores booleanos (verdadeiro / falso), eles trabalham a nível de bit, o que significa que cada bit de um número é comparado ao bit correspondente do outro número.</p>
<p>Esses operadores são muito usados em programação para manipular valores binários, criar máscaras de bits, realizar otimizações em algoritmos e resolver problemas relacionados à lógica binária.</p>
<p>Já os os operadores de deslocamento de bits (&lt;&lt; e &gt;&gt;), ou operadores <em>bitwise shift</em> são usados para mover os bits de um número inteiro para a esquerda ou para a direita. São úteis em muitas situações, como manipulação de dados de baixo nível, otimizações em cálculos e implementação de algoritmos matemáticos.</p>
<p>Sejam as variáveis <code>A = 2</code> e <code>B = 3:</code></p>
<table style="border-collapse: collapse; width: 100%; font-size: 16px; text-align: left;">
<thead>
<tr>
<th style="border: 1px solid #ddd; padding: 8px; background-color: #f4f4f4;">Operador</th>
<th style="border: 1px solid #ddd; padding: 8px; background-color: #f4f4f4;">Descrição</th>
<th style="border: 1px solid #ddd; padding: 8px; background-color: #f4f4f4;">Exemplo</th>
</tr>
</thead>
<tbody>
<tr>
<td style="border: 1px solid #ddd; padding: 8px;">&amp;</td>
<td style="border: 1px solid #ddd; padding: 8px;">AND bit a bit. Somente retorna 1 se todas os bits de entrada dos operandos forem iguais a 1.</td>
<td style="border: 1px solid #ddd; padding: 8px;">A &amp; B = 2</td>
</tr>
<tr>
<td style="border: 1px solid #dddddd; padding: 8px;">|</td>
<td style="border: 1px solid #dddddd; padding: 8px;">OR bit a bit. Somente retorna 0 se todos os bits de operandos forem iguais a 0.</td>
<td style="border: 1px solid #dddddd; padding: 8px;">(A | B) é 3</td>
</tr>
<tr>
<td style="border: 1px solid #dddddd; padding: 8px;">^</td>
<td style="border: 1px solid #dddddd; padding: 8px;">XOR bit a bit. Retorna 0 se os bits de entrada forem iguais, e retorna 1 se forem diferentes.</td>
<td style="border: 1px solid #dddddd; padding: 8px;">(A ^ B) é 1</td>
</tr>
<tr>
<td style="border: 1px solid #dddddd; padding: 8px;">~</td>
<td style="border: 1px solid #dddddd; padding: 8px;">NOT bit a bit. Inverte a condição de entrada: 0 se torna 1, e 1 se torna 0. Trata-se de um operador unário inversor.</td>
<td style="border: 1px solid #dddddd; padding: 8px;">(~B) é -4</td>
</tr>
<tr>
<td style="border: 1px solid #dddddd; padding: 8px;">&lt;&lt;</td>
<td style="border: 1px solid #dddddd; padding: 8px;">Deslocamento à esquerda. Move os bits de um número para a esquerda por um número especificado de posições.<br />
A cada posição que os bits são movidos, o valor do número é multiplicado por 2.</td>
<td style="border: 1px solid #dddddd; padding: 8px;">(A &lt;&lt; 1) é 4</td>
</tr>
<tr>
<td style="border: 1px solid #dddddd; padding: 8px;">&gt;&gt;</td>
<td style="border: 1px solid #dddddd; padding: 8px;">Deslocamento à direita. Move os bits de um número para a direita por um número especificado de posições.<br />
A cada posição que os bits são movidos, o valor do número é dividido por 2, desprezando o resto.</td>
<td style="border: 1px solid #dddddd; padding: 8px;">(A &gt;&gt; 1) é 1</td>
</tr>
</tbody>
</table>
<p>O operador de deslocamento à esquerda (&lt;&lt;), na prática, multiplica o número por 2 a cada deslocamento. Já o operador de deslocamento à direita (&gt;&gt;) divide o número por 2 a cada deslocamento, descartando a parte fracionária.</p>
<p><strong>Exemplo de uso de operadores bit a bit</strong></p>
<pre><strong>fn main() {</strong>
<strong>  let a: u8 = 2; <span style="color: #339966;">// 0000_0010 em binário</span></strong>
<strong>  let b: u8 = 3; <span style="color: #339966;">// 0000_0011 em binário</span></strong>
<strong>  println!("a vale {a} e b vale {b}");</strong>
<strong>  println!("AND bitwise: {}", a &amp; b); <span style="color: #339966;">// 0000_0010</span></strong>
<strong>  println!("OR bitwise: {}", a | b); <span style="color: #339966;">// 0000_0011</span></strong>
<strong>  println!("XOR bitwise: {}", a ^ b); <span style="color: #339966;">// 0000_0001</span></strong>
<strong>  println!("NOT bitwise: {}", !b); <span style="color: #339966;">// Inversão de todos os bits</span></strong>
<strong>  println!("Shift à esquerda: {}", a &lt;&lt; 1); <span style="color: #339966;">// Desloca os bits para a esquerda</span></strong>
<strong>  println!("Shift à direita: {}", a &gt;&gt; 1); <span style="color: #339966;">// Desloca os bits para a direita</span></strong>
<strong>}</strong></pre>
<p>Saída:</p>
<pre><span style="color: #000000;"><strong>a vale 2 e b vale 3</strong></span>
<span style="color: #000000;"><strong>AND bitwise: 2</strong></span>
<span style="color: #000000;"><strong>OR bitwise: 3</strong></span>
<span style="color: #000000;"><strong>XOR bitwise: 1</strong></span>
<span style="color: #000000;"><strong>NOT bitwise: 252</strong></span>
<span style="color: #000000;"><strong>Shift à esquerda: 4</strong></span>
<span style="color: #000000;"><strong>Shift à direita: 1</strong></span></pre>
<h2>Conclusão</h2>
<p>Neste artigo vimos quais são os principais operadores utilizados em linguagem Rust, sua importância e utilidade, e alguns exemplos de uso de cada um deles. Nos próximos tutoriais vamos usar esses operadores para criar programas mais complexos, usando outras estruturas de programação como laços de repetição, decisão condicional e arrays, entre outras.</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/rust/operadores-em-linguagem-rust/">Operadores em linguagem Rust</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/rust/operadores-em-linguagem-rust/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Como usar laços de repetição em Shell Scripting</title>
		<link>https://www.bosontreinamentos.com.br/shell-script/como-usar-lacos-de-repeticao-em-shell-scripting/</link>
					<comments>https://www.bosontreinamentos.com.br/shell-script/como-usar-lacos-de-repeticao-em-shell-scripting/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Mon, 11 Nov 2024 13:25:05 +0000</pubDate>
				<category><![CDATA[Shell Scripting]]></category>
		<category><![CDATA[Certificação]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programação]]></category>
		<guid isPermaLink="false">https://www.bosontreinamentos.com.br/?p=20455</guid>

					<description><![CDATA[<p>Laços de repetição em Shell Scripting Em Shell Scripting, os laços de repetição são estruturas que permitem executar uma série de comandos várias vezes. Os loops ajudam a automatizar tarefas repetitivas, iterando sobre listas, variáveis, comandos e arquivos. O Bash oferece algumas estruturas de repetição essenciais: for, while, e until. Vamos explorar cada uma, com exemplos práticos e exercícios ao final. O laço for em shell scripting O laço for é usado para percorrer uma lista de itens, como um conjunto de números, strings ou até mesmo arquivos. Ele executa o conjunto de comandos uma vez para cada item na lista. Sintaxe básica do laço for for item in lista; do Comandos a serem executados done Exemplo 1: Laço for simples Esse exemplo exibe uma mensagem para cada nome da lista. #!/bin/bash for nome in Fábio Marcos Bruno Robson; do echo "Olá, $nome!" done Saída: Olá, Fábio! Olá, Marcos! Olá, Bruno! Olá Robson! Exemplo 2: Laço for com intervalo de números Podemos definir um intervalo de números e iterar sobre ele: #!/bin/bash for i in {1..5}; do echo "$i" done Saída: 1 2 3 4 5 Exemplo 3: Loop for sobre arquivos em um diretório Este exemplo percorre todos os arquivos [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/shell-script/como-usar-lacos-de-repeticao-em-shell-scripting/">Como usar laços de repetição em Shell Scripting</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Laços de repetição em Shell Scripting</h1>
<p>Em Shell Scripting, os laços de repetição são estruturas que permitem executar uma série de comandos várias vezes. Os loops ajudam a automatizar tarefas repetitivas, iterando sobre listas, variáveis, comandos e arquivos. O Bash oferece algumas estruturas de repetição essenciais: for, while, e until.</p>
<p>Vamos explorar cada uma, com exemplos práticos e exercícios ao final.</p>
<h2>O laço for em shell scripting</h2>
<p>O laço for é usado para percorrer uma lista de itens, como um conjunto de números, strings ou até mesmo arquivos. Ele executa o conjunto de comandos uma vez para cada item na lista.</p>
<h3>Sintaxe básica do laço for</h3>
<pre><span style="color: #800080;"><strong>for item in lista; do</strong></span>
<span style="color: #800080;"><strong>   Comandos a serem executados</strong></span>
<span style="color: #800080;"><strong>done</strong></span></pre>
<p><strong>Exemplo 1: Laço for simples</strong></p>
<p>Esse exemplo exibe uma mensagem para cada nome da lista.</p>
<pre><strong>#!/bin/bash</strong>
<strong>for nome in Fábio Marcos Bruno Robson; do</strong>
<strong>  echo "Olá, $nome!"</strong>
<strong>done</strong></pre>
<p>Saída:</p>
<pre><strong>Olá, Fábio!</strong>
<strong>Olá, Marcos!</strong>
<strong>Olá, Bruno!</strong>
<strong>Olá Robson!</strong></pre>
<p><strong>Exemplo 2: Laço for com intervalo de números</strong></p>
<p>Podemos definir um intervalo de números e iterar sobre ele:</p>
<pre><strong>#!/bin/bash</strong>
<strong>for i in {1..5}; do</strong>
<strong>echo "$i"</strong>
<strong>done</strong></pre>
<p>Saída:</p>
<pre><strong>1</strong>
<strong>2</strong>
<strong>3</strong>
<strong>4</strong>
<strong>5</strong></pre>
<p><strong>Exemplo 3: Loop for sobre arquivos em um diretório</strong></p>
<p>Este exemplo percorre todos os arquivos .txt em um diretório e exibe o nome de cada arquivo.</p>
<pre><strong>#!/bin/bash</strong>
<strong>for arquivo in *.txt; do</strong>
<strong>echo "Encontrado arquivo: $arquivo"</strong>
<strong>done</strong></pre>
<h2>O laço while em shell scripting</h2>
<p>O laço while repete os comandos definidos em seu corpo enquanto uma condição testada for verdadeira. Ele é útil quando a quantidade de iterações não é definida e depende de uma condição.</p>
<h3>Sintaxe básica do while</h3>
<pre><span style="color: #800080;"><strong>while [ condição ]; do</strong></span>
<span style="color: #800080;"><strong>    Comandos a serem executados</strong></span>
<span style="color: #800080;"><strong>done</strong></span></pre>
<p>Vejamos alguns exemplos do loop while em scripts do shell.</p>
<p><strong>Exemplo 1: Loop while simples</strong></p>
<p>Exibir no terminal a sequência de números de 1 a 5:</p>
<pre><strong>#!/bin/bash</strong>
<strong>contador=1</strong>
<strong>while [ $contador -le 5 ]; do</strong>
<strong>  echo "$contador"</strong>
<strong>  contador=$((contador + 1))</strong>
<strong>done</strong></pre>
<p>Saída:</p>
<pre><span style="color: #000000;"><strong>1</strong></span>
<span style="color: #000000;"><strong>2</strong></span>
<span style="color: #000000;"><strong>3</strong></span>
<span style="color: #000000;"><strong>4</strong></span>
<span style="color: #000000;"><strong>5</strong></span></pre>
<p><strong>Exemplo 2: Ler valores do terminal de forma sequencial.</strong></p>
<p>O script a seguir solicita que o usuário digite um número no terminal. Ele repete a solicitação até que o usuário entre com o valor 0, momento em que o loop termina.</p>
<pre><strong>#!/bin/bash</strong>
<strong># Inicializar com um valor diferente de 0 para entrar no loop</strong>
<strong>numero=-1</strong>
<strong>while [ $numero -ne 0 ]; do</strong>
<strong>  read -p "Digite um número (0 para sair): " numero</strong>
<strong>  echo "Você digitou: $numero"</strong>
<strong>done</strong>
<strong>echo "Fim do laço. Você digitou 0."</strong></pre>
<h2>O laço until em shell scripting</h2>
<p>O laço until é semelhante ao laço while, mas ele repete os comandos enquanto uma condição for falsa, e para a execução quando a condição se torna verdadeira.</p>
<h3>Sintaxe básica do until</h3>
<pre><span style="color: #800080;"><strong>until [ condição ]; do</strong></span>
<span style="color: #800080;"><strong>    Comandos a serem executados</strong></span>
<span style="color: #800080;"><strong>done</strong></span></pre>
<p>Vejamos alguns exemplos.</p>
<p><strong>Exemplo 1: Loop until simples</strong></p>
<p>Este exemplo incrementa um contador até que ele atinja 5:</p>
<pre><strong>#!/bin/bash</strong>
<strong>contador=1</strong>
<strong>until [ $contador -gt 5 ]; do</strong>
<strong>  echo "$contador"</strong>
<strong>  contador=$((contador + 1))</strong>
<strong>done
echo "Sequência terminada."</strong></pre>
<p>Saída:</p>
<pre><span style="color: #000000;"><strong>1</strong></span>
<span style="color: #000000;"><strong>2</strong></span>
<span style="color: #000000;"><strong>3</strong></span>
<span style="color: #000000;"><strong>4</strong></span>
<span style="color: #000000;"><strong>5
Sequência terminada.</strong></span></pre>
<h2>Comandos de controle de loop</h2>
<p>Existem comandos de controle que podem ser usados para manipular o comportamento de um loop:</p>
<ul>
<li><strong>break</strong>: Sai do loop imediatamente.</li>
<li><strong>continue</strong>: Pula a iteração atual e vai para a próxima.</li>
</ul>
<p>Vejamos como usá-los em scripts.</p>
<p><strong>Exemplo: Uso de break</strong></p>
<p>Este exemplo usa break para sair do loop se o contador atingir 3.</p>
<pre><strong>#!/bin/bash</strong>
<strong>for i in {1..5}; do</strong>
<strong>  if [ $i -eq 3 ]; then</strong>
<strong>    echo "Saindo do loop no número $i"</strong>
<strong>    break</strong>
<strong>  fi</strong>
<strong>  echo "Número: $i"</strong>
<strong>done</strong></pre>
<p>Saída:</p>
<pre><span style="color: #000000;"><strong>Número: 1</strong></span>
<span style="color: #000000;"><strong>Número: 2</strong></span>
<span style="color: #000000;"><strong>Saindo do loop no número 3</strong></span></pre>
<p><strong>Exemplo: Uso de continue</strong></p>
<p>Este exemplo usa continue para pular a exibição do número 3.</p>
<pre><strong>#!/bin/bash</strong>
<strong>for i in {1..5}; do</strong>
<strong>  if [ $i -eq 3 ]; then</strong>
<strong>    continue</strong>
<strong>  fi</strong>
<strong>  echo "Número: $i"</strong>
<strong>done</strong></pre>
<p>Saída:</p>
<pre><span style="color: #000000;"><strong>Número: 1</strong></span>
<span style="color: #000000;"><strong>Número: 2</strong></span>
<span style="color: #000000;"><strong>Número: 4</strong></span>
<span style="color: #000000;"><strong>Número: 5</strong></span></pre>
<p>Excelente. Vamos propor agora alguns exercícios para você treinar o uso de laços de repetição em Shell Scripting. Resoluções sugeridas se encontram logo após a lista de exercícios.</p>
<h2>Exercícios práticos com laços de repetição</h2>
<ol>
<li>Crie um script que exiba uma contagem regressiva de 10 a 1 usando um loop for.</li>
<li>Use um loop while para somar os números de 1 a 100 e exibir o resultado total.</li>
<li>Escreva um script que use o loop for para percorrer arquivos .txt em um diretório e exiba o nome de cada arquivo encontrado.</li>
<li>Use um loop until para solicitar uma senha até que o usuário digite a senha correta (&#8220;1234&#8221;).</li>
<li>Crie um loop for que percorra os números de 1 a 10, pulando o número 5 e saindo do loop quando chegar ao número 8.</li>
</ol>
<h3>Resolução dos exercícios</h3>
<p><strong>Exercício 1</strong></p>
<pre><strong>#!/bin/bash</strong>
<strong>for i in {10..1}; do</strong>
<strong>  echo "Contagem regressiva: $i"</strong>
<strong>done</strong></pre>
<p><strong>Exercício 2</strong></p>
<pre><strong>#!/bin/bash</strong>
<strong>soma=0</strong>
<strong>contador=1</strong>
<strong>while [ $contador -le 100 ]; do</strong>
<strong>  soma=$((soma + contador))</strong>
<strong>  contador=$((contador + 1))</strong>
<strong>done</strong>
<strong>echo "A soma de 1 a 100 é: $soma"</strong></pre>
<p><strong>Exercício 3</strong></p>
<pre><strong>#!/bin/bash</strong>
<strong>for arquivo in *.txt; do</strong>
<strong>  echo "Arquivo encontrado: $arquivo"</strong>
<strong>done</strong></pre>
<p><strong>Exercício 4</strong></p>
<pre><strong>#!/bin/bash</strong>
<strong>senha=""</strong>
<strong>until [ "$senha" == "1234" ]; do</strong>
<strong>  read -sp "Digite a senha: " senha</strong>
<strong>  echo</strong>
<strong>done</strong>
<strong>echo "Senha correta!"</strong></pre>
<p>#Exercício 5: Usar break e continue em um loop</p>
<pre><strong>#!/bin/bash</strong>
<strong>for i in {1..10}; do</strong>
<strong>  if [ $i -eq 5 ]; then</strong>
<strong>    continue</strong>
<strong>  fi</strong>
<strong>  if [ $i -eq 8 ]; then</strong>
<strong>    break</strong>
<strong>  fi</strong>
<strong>  echo "Número: $i"</strong>
<strong>done</strong></pre>
<h2>Conclusão</h2>
<p>Os laços de repetição em Shell Scripting permitem criar fluxos de trabalho eficientes para manipular dados, arquivos e outros elementos de forma automatizada.</p>
<p>Aprender a usar for, while e until com comandos de controle como break e continue aumenta a flexibilidade e o controle que temos sobre o código, permitindo resolver problemas de forma mais simples e eficiente.</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/shell-script/como-usar-lacos-de-repeticao-em-shell-scripting/">Como usar laços de repetição em Shell Scripting</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/shell-script/como-usar-lacos-de-repeticao-em-shell-scripting/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Descobrir número que falta em lista de 1000 números sequenciais em Python</title>
		<link>https://www.bosontreinamentos.com.br/programacao-em-python/descobrir-numero-que-falta-em-lista-de-1000-numeros-sequenciais-em-python/</link>
					<comments>https://www.bosontreinamentos.com.br/programacao-em-python/descobrir-numero-que-falta-em-lista-de-1000-numeros-sequenciais-em-python/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Thu, 24 Oct 2024 11:14:17 +0000</pubDate>
				<category><![CDATA[Programação em Python]]></category>
		<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[Lógica de Programação]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://www.bosontreinamentos.com.br/?p=20361</guid>

					<description><![CDATA[<p>Descobrir número que falta em lista de 1000 números sequenciais em Python Neste tutorial vamos escrever um pequeno programa em linguagem Python que irá gerar uma lista com os números de 1 até 1000 (sequenciais), colocados depois em ordem aleatória, e então retirar um único número dessa lista, de forma aleatória também (não sabemos qual será o número retirado). Na sequência, o programa executará uma função que varre essa lista e descobre qual o número que está faltando, informando-o ao usuário. Qual o nosso objetivo com esse script? Estudar e praticar técnicas de programação. No caso iremos trabalhar com geração de números aleatórios, embaralhamento de listas, definição de funções e aplicação de lógica para resolver problemas. Abaixo temos o código usado, e na sequência a explicação detalhada de seu funcionamento. Fique à vontade para alterar o código a seu gosto, modificando ou acrescentando funcionalidades ao script. Código em Python import random # Função para encontrar o número que está faltando def encontrar_numero_faltando(lista):    # A soma esperada dos números de 1 a 1000    soma_esperada = sum(range(1, 1001))    # A soma dos números na lista com um número faltando    soma_lista = sum(lista)    # O número que está faltando será a diferença entre [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/programacao-em-python/descobrir-numero-que-falta-em-lista-de-1000-numeros-sequenciais-em-python/">Descobrir número que falta em lista de 1000 números sequenciais em Python</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Descobrir número que falta em lista de 1000 números sequenciais em Python</h1>
<p><span style="font-weight: 400;">Neste tutorial vamos escrever um pequeno programa em <a href="https://www.bosontreinamentos.com.br/programacao-com-python/">linguagem Python</a> que irá gerar uma lista com os números de 1 até 1000 (sequenciais), colocados depois em ordem aleatória, e então retirar um único número dessa lista, de forma aleatória também (não sabemos qual será o número retirado).</span></p>
<p><span style="font-weight: 400;">Na sequência, o programa executará uma função que varre essa lista e descobre qual o número que está faltando, informando-o ao usuário.</span></p>
<p>Qual o nosso objetivo com esse script? Estudar e praticar técnicas de programação. No caso iremos trabalhar com geração de números aleatórios, embaralhamento de listas, <a href="https://www.bosontreinamentos.com.br/programacao-em-python/funcoes-em-python-introducao/">definição de funções</a> e aplicação de lógica para resolver problemas.</p>
<p>Abaixo temos o código usado, e na sequência a explicação detalhada de seu funcionamento. Fique à vontade para alterar o código a seu gosto, modificando ou acrescentando funcionalidades ao script.</p>
<h2>Código em Python</h2>
<pre><strong>import random

</strong><span style="color: #339966;"><strong># Função para encontrar o número que está faltando
</strong></span><strong>def encontrar_numero_faltando(lista):</strong>
<strong>   <span style="color: #339966;"> # A soma esperada dos números de 1 a 1000</span></strong>
<strong>    soma_esperada = sum(range(1, 1001))</strong>
<strong>    <span style="color: #339966;"># A soma dos números na lista com um número faltando</span></strong>
<strong>    soma_lista = sum(lista)</strong>
<strong>    <span style="color: #339966;"># O número que está faltando será a diferença entre a soma esperada e a soma da lista</span></strong>
<strong>    return soma_esperada - soma_lista

</strong><span style="color: #339966;"><strong># Gerar uma lista de 1 a 1000</strong></span>
<strong>lista_numeros = list(range(1, 1001))

</strong><span style="color: #339966;"><strong># Embaralhar a lista de forma aleatória</strong></span>
<strong>random.shuffle(lista_numeros)

</strong><span style="color: #339966;"><strong># Remove um número aleatório da lista</strong></span>
<strong>numero_removido = random.choice(lista_numeros)</strong>
<strong>lista_numeros.remove(numero_removido)

</strong><span style="color: #339966;"><strong># Mostrar a lista</strong></span>
<strong>print(f'Lista de números: \n{lista_numeros}')

</strong><span style="color: #339966;"><strong># Encontrar o número faltando e exibir para o usuário</strong></span>
<strong>numero_faltando = encontrar_numero_faltando(lista_numeros)</strong>
<strong>print(f'\nO número faltando é: {numero_faltando}')</strong></pre>
<h2><strong>Como funciona esse script</strong></h2>
<p>Inicialmente, importamos o <a href="https://www.bosontreinamentos.com.br/programacao-em-python/7-2-python-geracao-de-numeros-aleatorios-e-modulo-random/">módulo <strong>random</strong></a>, que será necessário para a geração e manipulação dos números aleatórios (na verdade, <a href="https://docs.python.org/pt-br/3/library/random.html" target="_blank" rel="noopener">pseudoaleatórios</a>) que necessitaremos.</p>
<p>Na sequência, definimos a função &#8220;<em>encontrar_numero_faltando</em>&#8220;, que recebe como argumento a lista de números que será analisada.</p>
<p>Para determinar o número que está ausente nesta lista (haverá apenas um único número ausente dentre os mil valores), podemos aplicar várias técnicas. Aqui, iremos calcular a soma dos números de 1 até 1000 (armazenada na variável <em>soma_esperada</em>), e na sequência somaremos todos os números da lista passada à função, armazenado esse valor na variável <em>soma_lista</em>.</p>
<p>Então, basta subtrair da soma_esperada o valor de soma_lista, e o resultado será o número que falta (ausente). A função então retorna esse valor.</p>
<p>Fora da função, geramos uma lista de 1 até 1000 usando a <a href="https://www.bosontreinamentos.com.br/programacao-em-python/12-python-listas-01-criacao-insercao-e-alteracao-de-itens-metodo-append-e-outros/">função <strong>list()</strong></a> combinada com a <a href="https://www.bosontreinamentos.com.br/programacao-em-python/20-python-loop-for-estruturas-de-repeticao-funcao-range/">função <strong>range</strong></a>, embaralhamos os números com o método <strong>random.shuffle</strong>, e retiramos um número da lista com os métodos <strong>random.choice</strong> (escolhe o número) e <strong>lista_numeros.remove</strong> (remove esse número da lista).</p>
<p>Na sequência, exibimos a lista na tela com a <a href="https://www.bosontreinamentos.com.br/programacao-em-python/guia-basico-da-funcao-print-em-python/">função <strong>print</strong></a>, e finalmente encontramos o número faltante chamando a função criada <em>encontrar_numero_faltando</em>, exibindo no final seu valor para o usuário.</p>
<p>Note que cada vez que o script for executado, um número diferente será sacado da lista, pois a escolha do valor a ser retirado pelo método <strong>choice</strong> é aleatória.</p>
<h3>Conclusão</h3>
<p>Com este pequeno script pudemos treinar o emprego e manipulação de números aleatórios, além da criação de funções e da aplicação de raciocínio lógico para a resolução de problemas com programação.</p>
<p>Você pode alterar o algoritmo para, por exemplo, gerar mais de 1000 números (que tal 1 milhão de valores?) e rodá-lo para testar sua performance e verificar sua utilidade. Será que ele ainda roda de forma satisfatória?</p>
<p>Você também pode tentar portar esse script para outras linguagens de programação que prefira, como por exemplo <a href="https://www.bosontreinamentos.com.br/category/programacao-em-javascript/">JavaScript</a>, <a href="https://www.bosontreinamentos.com.br/category/csharp/">C#</a> ou <a href="https://www.bosontreinamentos.com.br/category/rust/">Rust</a>, para treinar abordagens ligeiramente diferentes de codificação.</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/programacao-em-python/descobrir-numero-que-falta-em-lista-de-1000-numeros-sequenciais-em-python/">Descobrir número que falta em lista de 1000 números sequenciais em Python</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/programacao-em-python/descobrir-numero-que-falta-em-lista-de-1000-numeros-sequenciais-em-python/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Como gerar números primos em JavaScript</title>
		<link>https://www.bosontreinamentos.com.br/programacao-em-javascript/como-gerar-numeros-primos-em-javascript/</link>
					<comments>https://www.bosontreinamentos.com.br/programacao-em-javascript/como-gerar-numeros-primos-em-javascript/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Thu, 12 Sep 2024 13:36:31 +0000</pubDate>
				<category><![CDATA[Programação em JavaScript]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Matemática]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Web]]></category>
		<guid isPermaLink="false">https://www.bosontreinamentos.com.br/?p=20278</guid>

					<description><![CDATA[<p>Gerar números primos em JavaScript Neste tutorial vou mostrar como criar um script relativamente simples em JavaScript que permite aos usuários gerarem uma lista com números primos, iniciando em 2 (que é o primeiro número primo) até um valor informado pelo usuário, que será o limite da lista gerada. Um número é considerado primo se ele for maior que um e divisível (no caso, divisão inteira) apenas por si próprio e por 1. Por exemplo: O número 23 é um número primo, pois ele só é divisível por 23 (ele próprio) e por 1. Já o número 24 não é primo, pois além de ser divisível por si mesmo e por 1, ele também é divisível por outros números, como 2, 3, 4 e 6. O número 1 não é considerado um número primo na matemática. Script que gera números primos em JavaScript O nosso script deverá realizar as seguintes tarefas: Calcular e mostrar na tela os números primos de 2 até um valor fornecido pelo usuário, usando JavaScript O numero fornecido pelo usuário será digitado em uma caixa de texto em uma página HTML Os números gerados serão exibidos no corpo do documento, um por linha. A geração dos [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/programacao-em-javascript/como-gerar-numeros-primos-em-javascript/">Como gerar números primos em JavaScript</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Gerar números primos em JavaScript</h1>
<p>Neste tutorial vou mostrar como criar um script relativamente simples em <a href="https://www.bosontreinamentos.com.br/category/programacao-em-javascript/">JavaScript</a> que permite aos usuários gerarem uma lista com números primos, iniciando em 2 (que é o primeiro número primo) até um valor informado pelo usuário, que será o limite da lista gerada.</p>
<p>Um número é considerado primo se ele for maior que um e divisível (no caso, divisão inteira) apenas por si próprio e por 1. Por exemplo:</p>
<ul>
<li>O número 23 é um número primo, pois ele só é divisível por 23 (ele próprio) e por 1.</li>
<li>Já o número 24 não é primo, pois além de ser divisível por si mesmo e por 1, ele também é divisível por outros números, como 2, 3, 4 e 6.</li>
</ul>
<p>O número 1 não é considerado um número primo na matemática.</p>
<h2>Script que gera números primos em JavaScript</h2>
<p>O nosso script deverá realizar as seguintes tarefas:</p>
<ol>
<li>Calcular e mostrar na tela os números primos de 2 até um valor fornecido pelo usuário, usando JavaScript</li>
<li>O numero fornecido pelo usuário será digitado em uma caixa de texto em uma página HTML</li>
<li>Os números gerados serão exibidos no corpo do documento, um por linha.</li>
<li>A geração dos valores se dará após o usuário clicar em um botão btnGeraPrimos.</li>
<li>O código JavaScript será declarado no cabeçalho da página HTML, para melhor organização do código, e invocado no botão.</li>
<li>Adicionar validação: se o usuário fornecer um número negativo, avisar que não é possível gerar a sequência de primos.</li>
<li>Mais validação: se o usuário informar um caractere que não seja um número, será avisado de que não é possível gerar a sequência de primos.</li>
</ol>
<p>Também iremos estilizar o formulário e a saída gerada usando CSS, em um arquivo separado de folha de estilos, que chamaremos de <em><strong>estilos.css</strong></em>.</p>
<p>Vamos à codificação.</p>
<h2>Códigos em HTML, CSS e JavaScript</h2>
<p><strong>1. Página HTML com JavaScript: arquivo <em>index.html</em></strong></p>
<div>
<pre><strong>&lt;!DOCTYPE html&gt;</strong>
<strong>&lt;html lang="pt-BR"&gt;</strong>
<strong>&lt;head&gt;</strong>
<strong>    &lt;meta charset="UTF-8"&gt;</strong>
<strong>    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;</strong>
<strong>    &lt;title&gt;Gerador de Números Primos&lt;/title&gt;</strong>
<strong>    &lt;link rel="stylesheet" href="estilos.css"&gt;</strong>
<strong>    &lt;script&gt;</strong>
<strong>        <span style="color: #339966;">// Função para verificar se um número é primo</span></strong>
<strong>        function ePrimo(num) {</strong>
<strong>            if (num &lt; 2) return false;</strong>
<strong>            for (let i = 2; i &lt;= Math.sqrt(num); i++) {</strong>
<strong>                if (num % i === 0) return false;</strong>
<strong>            }</strong>
<strong>            return true;</strong>
<strong>        }

</strong><strong>        <span style="color: #339966;">// Função para gerar e exibir os números primos</span></strong>
<strong>        function gerarPrimos() {</strong>
<strong>            // Limpa as mensagens e a saída anterior</strong>
<strong>            document.getElementById('mensagemErro').innerHTML = '';</strong>
<strong>            document.getElementById('saida').innerHTML = '';</strong>
<strong>            // Obter o valor inserido pelo usuário</strong>
<strong>            let valor = document.getElementById('inputNumero').value;</strong>
<strong>            // Verificar se o valor é um número válido</strong>
<strong>            if (isNaN(valor) || valor.trim() === '') {</strong>
<strong>                document.getElementById('mensagemErro').innerHTML = 'Por favor, insira um número válido.';</strong>
<strong>                return;</strong>
<strong>            }</strong>
<strong>            valor = parseInt(valor);

</strong><strong>            <span style="color: #339966;">// Validação de número negativo</span></strong>
<strong>            if (valor &lt; 2) {</strong>
<strong>                document.getElementById('mensagemErro').innerHTML = 'Por favor, insira um número maior que 1 para gerar números primos.';</strong>
<strong>                return;</strong>
<strong>            }</strong>
<strong>            let primos = [];</strong>
<strong>            // Calcular os números primos</strong>
<strong>            for (let i = 2; i &lt;= valor; i++) {</strong>
<strong>                if (ePrimo(i)) {</strong>
<strong>                    primos.push(i);</strong>
<strong>                }</strong>
<strong>            }

</strong><strong>            <span style="color: #339966;">// Exibir os números primos</span></strong>
<strong>            const saida = document.getElementById('saida');</strong>
<strong>            if (primos.length &gt; 0) {</strong>
<strong>                primos.forEach(function(primo) {</strong>
<strong>                    saida.innerHTML += primo + '&lt;br&gt;';</strong>
<strong>                });</strong>
<strong>            } else {</strong>
<strong>                saida.innerHTML = 'Nenhum número primo encontrado.';</strong>
<strong>            }</strong>
<strong>        }</strong>
<strong>    &lt;/script&gt;</strong>
<strong>&lt;/head&gt;

</strong><strong>&lt;body&gt;</strong>
<strong>&lt;div class="container"&gt;</strong>
<strong>    &lt;h1&gt;Gerador de Primos&lt;/h1&gt;</strong>
<strong>    &lt;label for="inputNumero"&gt;Digite um número:&lt;/label&gt;</strong>
<strong>    &lt;input type="text" id="inputNumero" placeholder="Ex: 50"&gt;</strong>
<strong>    &lt;div class="error" id="mensagemErro"&gt;&lt;/div&gt;</strong>
<strong>    &lt;button id="btnGeraPrimos" onclick="gerarPrimos()"&gt;Gerar Primos&lt;/button&gt;</strong>
<strong>    &lt;div class="output" id="saida"&gt;&lt;/div&gt;</strong>
<strong>&lt;/div&gt;</strong>
<strong>&lt;/body&gt;</strong>
<strong>&lt;/html&gt;</strong></pre>
</div>
<p><strong>2. Folha de estilos externa: arquivo estilos.css</strong></p>
<div>
<pre><strong>body {</strong>
<strong>    font-family: Arial, sans-serif;</strong>
<strong>    background-color: #f4f4f4;</strong>
<strong>    margin: 0;</strong>
<strong>    padding: 0;</strong>
<strong>    display: flex;</strong>
<strong>    justify-content: center;</strong>
<strong>    align-items: center;</strong>
<strong>    height: 100vh;</strong>
<strong>}</strong>
<strong>.container {</strong>
<strong>    background-color: white;</strong>
<strong>    padding: 20px;</strong>
<strong>    border-radius: 10px;</strong>
<strong>    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);</strong>
<strong>    max-width: 400px;</strong>
<strong>    width: 100%;</strong>
<strong>}</strong>
<strong>h1 {</strong>
<strong>    text-align: center;</strong>
<strong>    color: #333;</strong>
<strong>}</strong>
<strong>label {</strong>
<strong>    font-size: 16px;</strong>
<strong>    margin-bottom: 10px;</strong>
<strong>    display: block;</strong>
<strong>}</strong>
<strong>input[type="text"] {</strong>
<strong>    width: 100%;</strong>
<strong>    padding: 10px;</strong>
<strong>    margin-bottom: 10px;</strong>
<strong>    border: 1px solid #ccc;</strong>
<strong>    border-radius: 5px;</strong>
<strong>    font-size: 16px;</strong>
<strong>}</strong>
<strong>.error {</strong>
<strong>    color: red;</strong>
<strong>    font-size: 14px;</strong>
<strong>    margin-bottom: 10px;</strong>
<strong>}</strong>
<strong>.success {</strong>
<strong>    color: green;</strong>
<strong>}</strong>
<strong>button {</strong>
<strong>    width: 100%;</strong>
<strong>    padding: 10px;</strong>
<strong>    background-color: #4CAF50;</strong>
<strong>    color: white;</strong>
<strong>    border: none;</strong>
<strong>    border-radius: 5px;</strong>
<strong>    font-size: 16px;</strong>
<strong>    cursor: pointer;</strong>
<strong>}</strong>
<strong>button:hover {</strong>
<strong>    background-color: #45a049;</strong>
<strong>}</strong>
<strong>.output {</strong>
<strong>    margin-top: 20px;</strong>
<strong>    background-color: #f9f9f9;</strong>
<strong>    padding: 10px;</strong>
<strong>    border-radius: 5px;</strong>
<strong>    height: 200px;</strong>
<strong>    overflow-y: auto;</strong>
<strong>    border: 1px solid #ccc;</strong>
<strong>}</strong></pre>
</div>
<h4>Teste da aplicação</h4>
<p>Vamos abrir a página e pedir para que sejam gerados os números primos até 33:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-20280 size-full" title="Gerador de Números Primos em JavaScript" src="https://www.bosontreinamentos.com.br/wp-content/uploads/2024/09/gerador-primos-javascript.jpg" alt="Gerador de Números Primos em JavaScript" width="456" height="503" srcset="https://www.bosontreinamentos.com.br/wp-content/uploads/2024/09/gerador-primos-javascript.jpg 456w, https://www.bosontreinamentos.com.br/wp-content/uploads/2024/09/gerador-primos-javascript-381x420.jpg 381w" sizes="auto, (max-width: 456px) 100vw, 456px" /></p>
<p>Caso o usuário tente gerar a sequência fornecendo um número negativo ou um caractere não-numérico, será exibida a mensagem de erro e a sequência de números primos não será gerada:</p>
<div id="attachment_20281" style="width: 462px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-20281" class="wp-image-20281 size-full" title="Como gerar números primos com JavaScript" src="https://www.bosontreinamentos.com.br/wp-content/uploads/2024/09/gerador-primos-javascript-erro.jpg" alt="Como gerar números primos com JavaScript" width="452" height="538" srcset="https://www.bosontreinamentos.com.br/wp-content/uploads/2024/09/gerador-primos-javascript-erro.jpg 452w, https://www.bosontreinamentos.com.br/wp-content/uploads/2024/09/gerador-primos-javascript-erro-353x420.jpg 353w" sizes="auto, (max-width: 452px) 100vw, 452px" /><p id="caption-attachment-20281" class="wp-caption-text">Foi fornecido o número -5 (negativo), por isso a mensagem de erro.</p></div>
<h3>Funcionamento do Código</h3>
<p><strong>HTML:</strong> O formulário possui um campo de entrada (input) no qual o usuário digita um número, e um botão para invocar a função JavaScript que gera os números primos. Há uma área para exibir os erros de validação logo abaixo e uma área de saída para exibir os números primos.</p>
<p><strong>CSS:</strong> A página está estilizada para ter uma aparência limpa e amigável, como é sempre recomendável. Centralizamos o formulário na página e os elementos como caixas de texto e botões têm um design agradável, com cor de fundo verde para o botão e texto de mensagem de erro em vermelho &#8211; mas você pode alterar isso à vontade, evidentemente.</p>
<p>A saída dos números primos será em uma área de rolagem (output), que facilita a visualização dos números, caso sejam gerados muitos.</p>
<p><strong>JavaScript</strong>: O código JavaScript foi inserido no cabeçalho da página, e consiste em duas funções com tarefas específicas:</p>
<ul>
<li>ePrimo: Função que verifica se um número é primo. Ela percorre os divisores do número até sua raiz quadrada.</li>
<li>gerarPrimos: Função principal que é chamada ao clicar no botão. Ela valida a entrada do usuário, calcula os números primos até o valor fornecido, e os exibe no corpo da página.</li>
</ul>
<p>Também são realizadas validações: Se o valor fornecido não for um número, ou se for um número negativo, uma mensagem de erro é exibida.</p>
<h3>Conclusão</h3>
<p>Neste post mostrei um script simples para gerar uma listagem de números primos, que você pode &#8211; e deve &#8211; usar para estudar a linguagem e se aprofundar nas suas técnicas de programação.</p>
<p>Nos próximos artigos veremos scripts para resolver diversos outros problemas, sempre com esse foco: o aprendizado da linguagem JavaScript.</p>
<p>Até!</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/programacao-em-javascript/como-gerar-numeros-primos-em-javascript/">Como gerar números primos em JavaScript</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/programacao-em-javascript/como-gerar-numeros-primos-em-javascript/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Procedimentos Armazenados em PostgreSQL (Stored Procedures)</title>
		<link>https://www.bosontreinamentos.com.br/postgresql-banco-dados/procedimentos-armazenados-em-postgresql-stored-procedures/</link>
					<comments>https://www.bosontreinamentos.com.br/postgresql-banco-dados/procedimentos-armazenados-em-postgresql-stored-procedures/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Tue, 03 Sep 2024 14:56:25 +0000</pubDate>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[Bancos de Dados]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[SQL]]></category>
		<guid isPermaLink="false">http://www.bosontreinamentos.com.br/?p=18799</guid>

					<description><![CDATA[<p>Procedimentos Armazenados em PostgreSQL (Stored Procedures) Procedimentos armazenados são uma forma de armazenar a lógica do banco de dados no lado do servidor e podem ser executados por vários clientes. Eles são uma ferramenta muito útil para administradores e programadores de banco de dados, pois permitem encapsular a lógica complexa em uma única unidade chamável, reduzindo o código duplicado, aumentando a segurança e melhorando o desempenho. Um procedimento armazenado no PostgreSQL é um bloco nomeado de instruções PL/pgSQL que podem ser executadas com um único comando. A sintaxe para criar um procedimento armazenado no PostgreSQL é a seguinte: CREATE [OR REPLACE PROCEDURE] nome_procedimento(arg1 tipo_dado1, arg2 tipo_dado2, ...) RETURNS tipo_dado_retorno LANGUAGE plpgsql AS $$ DECLARE -- declaração de variáveis locais, se houver BEGIN -- declarações PL/pgSQL END; $$; Onde: nome_procedimento é o nome do procedimento armazenado arg1, arg2, etc. são os parâmetros do procedimento armazenado tipo_dado1, tipo_dado2, etc. são os tipos de dados dos parâmetros tipo_dado_retorno é o tipo de dados do valor de retorno e a seção DECLARE é usada para declarar variáveis locais, se necessário. A lógica real do procedimento armazenado é escrita dentro de blocos BEGIN e END, usando instruções da linguagem PL/pgSQL. A cláusula LANGUAGE especifica o [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/postgresql-banco-dados/procedimentos-armazenados-em-postgresql-stored-procedures/">Procedimentos Armazenados em PostgreSQL (Stored Procedures)</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Procedimentos Armazenados em PostgreSQL (Stored Procedures)</h2>
<p>Procedimentos armazenados são uma forma de armazenar a lógica do banco de dados no lado do servidor e podem ser executados por vários clientes. Eles são uma ferramenta muito útil para administradores e programadores de banco de dados, pois permitem encapsular a lógica complexa em uma única unidade chamável, reduzindo o código duplicado, aumentando a segurança e melhorando o desempenho.</p>
<p>Um procedimento armazenado no <a href="https://www.bosontreinamentos.com.br/curso-completo-de-postgresql/">PostgreSQL</a> é um bloco nomeado de instruções PL/pgSQL que podem ser executadas com um único comando. A sintaxe para criar um procedimento armazenado no PostgreSQL é a seguinte:</p>
<pre><span style="color: #800080;"><strong>CREATE [OR REPLACE PROCEDURE] nome_procedimento(arg1 tipo_dado1, arg2 tipo_dado2, ...)</strong></span>
<span style="color: #800080;"><strong>RETURNS tipo_dado_retorno</strong></span>
<span style="color: #800080;"><strong>LANGUAGE plpgsql</strong></span>
<span style="color: #800080;"><strong>AS $$</strong></span>
<span style="color: #800080;"><strong>DECLARE</strong></span>
<span style="color: #339966;"><strong>-- declaração de variáveis locais, se houver</strong></span>
<span style="color: #800080;"><strong>BEGIN</strong></span>
<span style="color: #339966;"><strong>-- declarações PL/pgSQL</strong></span>
<span style="color: #800080;"><strong>END;</strong></span>
<span style="color: #800080;"><strong>$$;</strong></span></pre>
<p>Onde:</p>
<ul>
<li><strong>nome_procedimento</strong> é o nome do procedimento armazenado</li>
<li><strong>arg1, arg2, etc</strong>. são os parâmetros do procedimento armazenado</li>
<li><strong>tipo_dado1, tipo_dado2, etc</strong>. são os <a href="https://www.bosontreinamentos.com.br/postgresql-banco-dados/tipos-de-dados-no-postgresql/">tipos de dados</a> dos parâmetros</li>
<li><strong>tipo_dado_retorno</strong> é o tipo de dados do valor de retorno</li>
</ul>
<p>e a seção <strong>DECLARE</strong> é usada para declarar variáveis locais, se necessário. A lógica real do procedimento armazenado é escrita dentro de blocos BEGIN e END, usando instruções da linguagem <strong>PL/pgSQL</strong>.</p>
<p>A cláusula <strong>LANGUAGE</strong> especifica o idioma do procedimento armazenado, que é <em><strong>plpgsql</strong></em> neste caso.</p>
<h3>O símbolo $$</h3>
<p>O símbolo $$ usado na última linha de um procedimento PL/pgSQL é usado para definir o início e o fim do corpo do procedimento. É uma sintaxe especial usada para definir uma string literal que abrange várias linhas. Na prática, é possível usar qualquer string com essa finalidade, desde que não seja uma palavra reservada da linguagem.</p>
<p>Em um procedimento PL/pgSQL, o $$ é usado para envolver todo o corpo do procedimento, que inclui a declaração de variáveis, a definição de estruturas de controle e qualquer outra lógica que você queira implementar. O primeiro $$ marca o início do corpo do procedimento e o segundo $$ marca o fim do corpo do procedimento.</p>
<p>Outra opção é usar a estrutura &#8220;<strong>BEGIN ATOMIC</strong>&#8221; &#8230; &#8220;<strong>END</strong>&#8221; no lugar de &#8220;<strong>AS $$</strong>&#8220;.</p>
<h3><strong>O que é PL/pgSQL?</strong></h3>
<p>PL/pgSQL é uma linguagem procedural usada no PostgreSQL para escrever stored procedures, triggers e funções. É uma linguagem estruturada em blocos semelhante a outras linguagens procedurais, como PL/SQL no Oracle e T-SQL no Microsoft SQL Server. Essa linguagem fornece estruturas de controle, como instruções IF-THEN-ELSE, LOOP e EXIT, bem como a capacidade de declarar variáveis, realizar tratamento de exceções e usar cursores.</p>
<p>O PL/pgSQL oferece uma interface procedural de alto nível para o banco de dados que permite criar lógica de negócios complexa e automatizar as operações do banco de dados. Por exemplo, podemos usar PL/pgSQL para implementar regras de negócios, validar dados ou realizar cálculos complexos em dados armazenados no banco de dados.</p>
<p>Assim, podemos escrever lógica que pode ser facilmente testada e reutilizada, tornando-a uma maneira eficiente de gerenciar operações de banco de dados.</p>
<p>Trata-se de uma linguagem do lado do servidor, o que significa que o código é executado no servidor de banco de dados, e não no cliente. Isso o torna mais rápido e eficiente do que executar o script do lado do cliente, dentro de uma aplicação de usuário, além de fornecer melhor segurança para seus dados.</p>
<p>Outras opções de linguagens suportadas pelo Postgres incluem SQL padrão e linguagem C, além da possibilidade de trabalhar com extensões para outras linguagens como PL/Python, PL/Perl, etc.</p>
<p>A instrução <strong>LANGUAGE plpgsql</strong> é necessária ao criar procedimentos armazenados no PostgreSQL porque define a linguagem de programação que será usada para escrever o corpo do procedimento.</p>
<h3>Como executar o procedimento armazenado</h3>
<p>Podemos chamar um procedimento armazenado no PostgreSQL usando a seguinte sintaxe:</p>
<pre><span style="color: #800080;"><strong>CALL nome_procedimento(arg1_valor, arg2_valor, ...);</strong></span></pre>
<p>Aqui, arg1_valor, arg2_valor, etc. são os valores dos parâmetros passados para o procedimento armazenado. O resultado do procedimento armazenado será retornado na forma de uma tabela.</p>
<p>Vejamos agora alguns exemplos de criação e execução de procedimentos armazenados em PostgreSQL.</p>
<h3>Exemplo 01 &#8211; Inserir uma linha em uma tabela</h3>
<p>Procedimento armazenado em PostgreSQL (somente SQL) que insere uma nova linha em uma tabela, composta por três colunas: nome, sobrenome e idade:</p>
<p>Criar a tabela de teste:</p>
<pre><span style="color: #ff0000;"><strong>CREATE TABLE pessoas (</strong></span>
<span style="color: #ff0000;"><strong>    nome varchar(20),</strong></span>
<span style="color: #ff0000;"><strong>    sobrenome varchar(40),</strong></span>
<span style="color: #ff0000;"><strong>    idade smallint</strong></span>
<span style="color: #ff0000;"><strong>);</strong></span></pre>
<p>Vamos a um exemplo de procedimento armazenado em PL/pgSQL que insere uma nova linha em uma tabela com três colunas: nome, sobrenome e idade. O procedimento armazenado usa três parâmetros: p_nome, p_sobrenome e p_idade e insere esses valores na tabela.</p>
<pre><span style="color: #ff0000;"><strong>CREATE OR REPLACE PROCEDURE cadastra_pessoa(p_nome varchar(20), p_sobrenome varchar(40), p_idade smallint)</strong></span>
<span style="color: #ff0000;"><strong>  LANGUAGE plpgsql
AS $$
BEGIN</strong></span>
<span style="color: #ff0000;"><strong>    INSERT INTO pessoas (nome, sobrenome, idade)</strong></span>
<span style="color: #ff0000;"><strong>    VALUES (p_nome, p_sobrenome, p_idade);</strong></span>
<span style="color: #ff0000;"><strong>END</strong></span>
<span style="color: #ff0000;"><strong>$$</strong></span></pre>
<p><strong>Teste</strong></p>
<p>Para executar o procedimento armazenado, basta chamá-lo com os valores desejados como parâmetros, assim:</p>
<pre><span style="color: #ff0000;"><strong>CALL cadastra_pessoa('Fábio'::varchar, 'dos Reis'::varchar, 48::smallint);</strong></span></pre>
<p>E verificar se a tabela foi atualizada com o novo registro:</p>
<pre><span style="color: #ff0000;"><strong>SELECT * FROM pessoas;</strong></span></pre>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-18802 size-full" title="Procedimento armazenado no PostgreSQL" src="http://www.bosontreinamentos.com.br/wp-content/uploads/2023/02/postgresql-stored-procedure-2.png" alt="Procedimento armazenado no PostgreSQL" width="426" height="77" srcset="https://www.bosontreinamentos.com.br/wp-content/uploads/2023/02/postgresql-stored-procedure-2.png 426w, https://www.bosontreinamentos.com.br/wp-content/uploads/2023/02/postgresql-stored-procedure-2-420x76.png 420w" sizes="auto, (max-width: 426px) 100vw, 426px" /></p>
<h4>Especificar tipos de dados na chamada do procedimento</h4>
<p>Ao chamar um procedimento armazenado no PostgreSQL, a necessidade de especificar explicitamente os tipos de dados para os argumentos (por exemplo, &#8216;Fábio&#8217;::varchar) geralmente surge devido a questões de desambiguação e coerção de tipos.</p>
<p>Os principais motivos para especificar tipos de dados ao chamar um procedimento armazenado no PostgreSQL são os seguntes:</p>
<ol>
<li><strong>Desambiguação</strong>: Quando o PostgreSQL possui múltiplos procedimentos com o mesmo nome, mas com assinaturas diferentes (ou seja, com diferentes tipos de parâmetros ou números de parâmetros), ele precisa saber exatamente qual procedimento deve ser chamado. Especificar o tipo de dado ajuda o PostgreSQL a escolher a versão correta do procedimento.</li>
<li><strong>Coerção de Tipos</strong>: O PostgreSQL é uma linguagem fortemente tipada, o que significa que cada valor tem um tipo de dado associado, e algumas operações requerem tipos específicos. Quando se passa um literal (como &#8216;<strong>Fábio</strong>&#8216;), ele é inicialmente interpretado como um text, a menos que se indique explicitamente um tipo diferente, como o varchar.</li>
<li><strong>Prevenção de Erros de Tipagem</strong>: Quando o tipo de dado esperado pelo procedimento não corresponde ao tipo inferido pelo PostgreSQL, o banco de dados pode não ser capaz de fazer a coerção automaticamente, resultando em erros. Especificar o tipo assegura que o valor será tratado corretamente.</li>
</ol>
<h3>Exemplo 02 &#8211; Inserir um novo produto na tabela</h3>
<p>Vamos criar um procedimento armazenado que permita inserir um novo produto na tabela de produtos de nosso banco de dados.</p>
<pre><span style="color: #ff0000;"><strong>CREATE OR REPLACE PROCEDURE inserir_produto (</strong></span>
<span style="color: #ff0000;"><strong>    p_cod_produto INT,</strong></span>
<span style="color: #ff0000;"><strong>    p_nome_produto VARCHAR(30),</strong></span>
<span style="color: #ff0000;"><strong>    p_descricao TEXT,</strong></span>
<span style="color: #ff0000;"><strong>    p_preco NUMERIC,</strong></span>
<span style="color: #ff0000;"><strong>    p_qtde_estoque SMALLINT</strong></span>
<span style="color: #ff0000;"><strong>)</strong></span>
<span style="color: #ff0000;"><strong>language plpgsql</strong></span>
<span style="color: #ff0000;"><strong>AS $$</strong></span>
<span style="color: #ff0000;"><strong>BEGIN</strong></span>
<span style="color: #ff0000;"><strong>    INSERT INTO Produtos(cod_produto, nome_produto, descricao, preco, qtde_estoque)</strong></span>
<span style="color: #ff0000;"><strong>    VALUES (p_cod_produto, p_nome_produto, p_descricao, p_preco, p_qtde_estoque);</strong></span>
<span style="color: #ff0000;"><strong>    RAISE NOTICE 'Produto % cadastrado com sucesso.', p_nome_produto;</strong></span>
<span style="color: #ff0000;"><strong>END;</strong></span>
<span style="color: #ff0000;"><strong>$$;</strong></span></pre>
<p>A instrução <strong>RAISE NOTICE</strong> emite uma mensagem para o console confirmando a inserção do registro.</p>
<p>Para executar o procedimento:</p>
<pre><span style="color: #ff0000;"><strong>CALL inserir_produto(4,'Detergente'::varchar,'Detergente neutro 500 ml'::text, 2.35, 2::smallint);</strong></span></pre>
<p>E então podemos verificar se produto foi inserido corretamente realizando uma consulta simples ao banco de dados:</p>
<pre><span style="color: #ff0000;"><strong>SELECT * FROM Produtos;</strong></span></pre>
<h3>Exemplo 03 &#8211; Atualizar o preço de um produto.</h3>
<p>Este procedimento atualiza o preço de um produto específico, identificado pelo seu código de produto:</p>
<pre><span style="color: #ff0000;"><strong>CREATE OR REPLACE PROCEDURE atualizar_preco(</strong></span>
<span style="color: #ff0000;"><strong>    p_cod_produto INT,</strong></span>
<span style="color: #ff0000;"><strong>    p_novo_preco NUMERIC</strong></span>
<span style="color: #ff0000;"><strong>)</strong></span>
<span style="color: #ff0000;"><strong>LANGUAGE plpgsql</strong></span>
<span style="color: #ff0000;"><strong>AS $$</strong></span>
<span style="color: #ff0000;"><strong>BEGIN</strong></span>
<span style="color: #ff0000;"><strong>    UPDATE Produtos</strong></span>
<span style="color: #ff0000;"><strong>    SET preco = p_novo_preco</strong></span>
<span style="color: #ff0000;"><strong>    WHERE cod_produto = p_cod_produto;</strong></span>
<span style="color: #ff0000;"><strong>    RAISE NOTICE 'Preço do produto % atualizado para %', p_cod_produto, p_novo_preco;</strong></span>
<span style="color: #ff0000;"><strong>END;</strong></span>
<span style="color: #ff0000;"><strong>$$;</strong></span></pre>
<p>Para executar o procedimento:</p>
<pre><span style="color: #ff0000;"><strong>CALL atualizar_preco(1, 3.80);</strong></span></pre>
<p>E então podemos verificar se produto teve seu preço corretamente atualizado realizando novamente uma consulta ao banco de dados:</p>
<pre><span style="color: #ff0000;"><strong>SELECT * FROM Produtos;</strong></span></pre>
<h3>Exemplo 04 &#8211; Procedimento para consultar produtos com estoque baixo</h3>
<p>Este procedimento retorna todos os produtos com quantidade em estoque abaixo de um valor especificado na chamada da procedure.</p>
<pre><span style="color: #ff0000;"><strong>CREATE OR REPLACE PROCEDURE consultar_estoque_baixo (</strong></span>
<span style="color: #ff0000;"><strong>    p_limite_estoque INTEGER</strong></span>
<span style="color: #ff0000;"><strong>)</strong></span>
<span style="color: #ff0000;"><strong>LANGUAGE plpgsql</strong></span>
<span style="color: #ff0000;"><strong>AS $$</strong></span>
<span style="color: #ff0000;"><strong>DECLARE resultado RECORD;</strong></span>
<span style="color: #ff0000;"><strong>BEGIN</strong></span>
<span style="color: #ff0000;"><strong>    FOR resultado in</strong></span>
<span style="color: #ff0000;"><strong>        SELECT cod_produto, nome_produto, qtde_estoque</strong></span>
<span style="color: #ff0000;"><strong>        FROM Produtos</strong></span>
<span style="color: #ff0000;"><strong>        WHERE qtde_estoque &lt; p_limite_estoque</strong></span>
<span style="color: #ff0000;"><strong>    LOOP</strong></span>
<span style="color: #ff0000;"><strong>        RAISE NOTICE 'Produto: %, Estoque: % ', resultado.nome_produto, resultado.qtde_estoque;</strong></span>
<span style="color: #ff0000;"><strong>    END LOOP;</strong></span>
<span style="color: #ff0000;"><strong>END;</strong></span>
<span style="color: #ff0000;"><strong>$$;</strong></span></pre>
<p>Para executar o procedimento:</p>
<pre><strong><span style="color: #ff0000;">CALL consultar_estoque_baixo(3);</span></strong></pre>
<p>Aqui, consultamos todos os produtos cujo estoque está abaixo de 3 unidades.</p>
<p>Devemos notar alguns detalhes interessantes sobre a consulta realizada pelo procedimento armazenado deste exemplo:</p>
<h4>Destino dos dados</h4>
<p>Quando se usa a instrução SELECT em um procedimento armazenado no PostgreSQL, o resultado deve ser direcionado para algum lugar, como uma variável, uma tabela temporária, ou ser retornado ao chamador da função ou procedimento.</p>
<p>Caso contrário, o PostgreSQL gera a mensagem &#8220;consulta não tem destino para os dados resultantes&#8221; (no inglês: &#8220;<em>query has no destination for result data</em>&#8220;).</p>
<p>Se for necessário apenas exibir os resultados no console em um procedimento armazenado, sem retorná-los em uma consulta, podemos usar um loop para iterar sobre os resultados e então exibi-los com RAISE NOTICE.</p>
<h4>O tipo RECORD</h4>
<p>O tipo RECORD é um tipo de dado genérico no PL/pgSQL que pode acomodar uma linha de dados com colunas de diferentes tipos. Ao contrário de outros tipos de variáveis, que têm um tipo de dado específico (como INTEGER, VARCHAR, etc.), o RECORD pode armazenar qualquer linha inteira de resultado, independentemente de quantas colunas ou de quais tipos de dados essas colunas têm.</p>
<p>A instrução DECLARE r RECORD; em PL/pgSQL é usada para declarar uma variável de tipo RECORD.</p>
<p>Quando usamos o RECORD dentro de um loop FOR IN que itera sobre os resultados de uma consulta, o RECORD é automaticamente &#8220;preenchido&#8221; com os valores das colunas para cada linha retornada. Isso permite acessar os valores dessas colunas dentro do corpo do loop.</p>
<p>Além disso, uma vez que a linha é armazenada no RECORD, podemos acessar as colunas individuais usando a notação r.coluna, onde r é o nome da variável RECORD e coluna é o nome da coluna que desejamos acessar.</p>
<h3>Exemplo 05 &#8211; Inserir e atualizar valores no mesmo procedimento.</h3>
<p>Exemplo: criar um procedimento armazenado que insira um novo produto na tabela de produtos, ao mesmo tempo em que aplica um desconto percentual especificado a todos os produtos logo após.</p>
<pre><span style="color: #ff0000;"><strong>CREATE OR REPLACE PROCEDURE insere_atualiza (</strong></span><span style="color: #ff0000;"><strong>cod int, prod varchar(30), descr text, valor numeric, qtde smallint, desc_perc numeric)</strong></span>
<span style="color: #ff0000;"><strong>LANGUAGE plpgsql</strong></span>
<span style="color: #ff0000;"><strong>AS $$</strong></span>
<span style="color: #ff0000;"><strong>BEGIN</strong></span>
<span style="color: #ff0000;"><strong>    INSERT INTO produtos(cod_produto, nome_produto, descricao, preco, qtde_estoque)</strong></span>
<span style="color: #ff0000;"><strong>    VALUES (cod, prod, descr, valor, qtde);</strong></span>
<span style="color: #ff0000;"><strong>    UPDATE produtos SET preco = preco * (100 - desc_perc) / 100;</strong></span>
<span style="color: #ff0000;"><strong>END;</strong></span>
<span style="color: #ff0000;"><strong>$$;</strong></span></pre>
<p>Executar o procedimento:</p>
<pre><span style="color: #ff0000;"><strong>CALL insere_atualiza(6,'Alvejante'::varchar(30),'Alvejante de roupas'::text, 12.30, 12::smallint, 10);</strong></span></pre>
<p>Obs.: O tipo numeric geralmente não precisa ser informado (cast) na chamada do procedimento.</p>
<h2>Como excluir um procedimento armazenado</h2>
<p>Para excluir um procedimento armazenado no PostgreSQL devemos usar a declaração DROP PROCEDURE, como segue:</p>
<pre><span style="color: #800080;"><strong>DROP PROCEDURE nome_procedimento;</strong></span></pre>
<p>Por exemplo, para excluir o procedimento <strong><em>consultar_estoque_baixo</em></strong>:</p>
<pre><span style="color: #ff0000;"><strong>DROP PROCEDURE consultar_estoque_baixo;</strong></span></pre>
<p>Se houver mais de um procedimento armazenado como mesmo nome, mas com quantidade e tipos de parâmetros distintos (<strong>polimorfismo</strong>), devemos indicar os tipos de dados dos argumentos ao exclui-lo:</p>
<pre><span style="color: #ff0000;"><strong>DROP PROCEDURE insere_atualiza(int,varchar,text,numeric,smallint,numeric);</strong></span></pre>
<h2>Conclusão</h2>
<p>Neste artigo vimos como começar a trabalhar com procedimentos armazenados no PostgreSQL. com alguns exemplos simples de criação de procedures simples. O recurso é muito útil para simplificar código e facilitar a programação de tarefas no banco de dados, principalmente quando as declarações SQL precisam ser executadas a partir de uma aplicação escrita em alguma linguagem de programação para acesso direto dos usuários.</p>
<p>Estudaremos recursos mais avançados de procedimentos armazenados nos próximos artigos, assim como outras formas de programação existentes para bancos de dados PostgreSQL, como Funções e Triggers.</p>
<p>Para saber mais sobre Procedimentos Armazenados no PostgreSQL, assista ao vídeo a seguir da Bóson Treinamentos no YouTube:</p>
<p><iframe loading="lazy" title="YouTube video player" src="https://www.youtube.com/embed/Ig1hGqiPROI?si=ywRszZBlyo3BYNW0" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<p>O post <a href="https://www.bosontreinamentos.com.br/postgresql-banco-dados/procedimentos-armazenados-em-postgresql-stored-procedures/">Procedimentos Armazenados em PostgreSQL (Stored Procedures)</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/postgresql-banco-dados/procedimentos-armazenados-em-postgresql-stored-procedures/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Como usar os tipos de dados char, nchar, varchar e nvarchar no SQL Server</title>
		<link>https://www.bosontreinamentos.com.br/sql-com-sql-server/como-usar-os-tipos-de-dados-char-nchar-varchar-e-nvarchar-no-sql-server/</link>
					<comments>https://www.bosontreinamentos.com.br/sql-com-sql-server/como-usar-os-tipos-de-dados-char-nchar-varchar-e-nvarchar-no-sql-server/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Thu, 04 Jul 2024 11:42:32 +0000</pubDate>
				<category><![CDATA[SQL com SQL Server]]></category>
		<category><![CDATA[Bancos de Dados]]></category>
		<category><![CDATA[Modelagem de Dados]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[SQL Server]]></category>
		<guid isPermaLink="false">http://www.bosontreinamentos.com.br/?p=13125</guid>

					<description><![CDATA[<p>Tipos de dados char, nchar, varchar e nvarchar &#8211; SQL Server Os tipos de dados CHAR, NCHAR, VARCHAR e NVARCHAR são usados para armazenar dados de texto no SQL Server. Cada um é empregado em uma situação distinta, e saber escolher o tipo de dados adequado pode afetar a performance e o uso de espaço no banco de dados. Neste tutorial vou mostrar cada um desses tipos, suas diferenças e quando usá-los. Tipos de Texto no SQL Server Os tipos nchar e nvarchar permitem armazenar caracteres Unicode, ao passo que char e varchar não o permitem &#8211; é até possível armazenar Unicode com esses tipos, mas por meio de alguns &#8220;truques&#8221; no código. Porém, os tipos nchar e nvarchar ocupam o dobro de espaço de armazenamento. Desta forma, recomenda-se utilizá-los apenas caso seja necessário suporte a Unicode na tabela &#8211; o que é bastante comum. Os tipos char e nchar são tipos de tamanho fixo, o que significa que eles reservam espaço de armazenamento para a quantidade de caracteres que foi especificada em suas declarações, mesmo que o espaço não seja totalmente utilizado. Por exemplo, podemos criar um campo char ou nchar para 20 caracteres mas armazenar apenas 15 &#8211; [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/sql-com-sql-server/como-usar-os-tipos-de-dados-char-nchar-varchar-e-nvarchar-no-sql-server/">Como usar os tipos de dados char, nchar, varchar e nvarchar no SQL Server</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Tipos de dados char, nchar, varchar e nvarchar &#8211; SQL Server</h2>
<p>Os tipos de dados CHAR, NCHAR, VARCHAR e NVARCHAR são usados para armazenar dados de texto no SQL Server. Cada um é empregado em uma situação distinta, e saber escolher o tipo de dados adequado pode afetar a performance e o uso de espaço no banco de dados.</p>
<p>Neste tutorial vou mostrar cada um desses tipos, suas diferenças e quando usá-los.</p>
<h3>Tipos de Texto no SQL Server</h3>
<p>Os tipos nchar e nvarchar permitem armazenar caracteres Unicode, ao passo que char e varchar não o permitem &#8211; é até possível armazenar Unicode com esses tipos, mas por meio de alguns &#8220;truques&#8221; no código. Porém, os tipos nchar e nvarchar ocupam o dobro de espaço de armazenamento. Desta forma, recomenda-se utilizá-los apenas caso seja necessário suporte a Unicode na tabela &#8211; o que é bastante comum.</p>
<p>Os tipos char e nchar são tipos de tamanho fixo, o que significa que eles reservam espaço de armazenamento para a quantidade de caracteres que foi especificada em suas declarações, mesmo que o espaço não seja totalmente utilizado. Por exemplo, podemos criar um campo char ou nchar para 20 caracteres mas armazenar apenas 15 &#8211; os outros 5 que ficaram vagos irão ocupar espaço da mesma maneira.</p>
<p>Recomenda-se usar esses tipos caso os dados armazenados sempre ocupem o tamanho máximo especificado na declaração da coluna.</p>
<p>Já os tipos varchar e nvarchar são tipos de tamanho variável, de modo que o espaço ocupado corresponderá à quantidade de caracteres que efetivamente são armazenados + 2 (2 bytes de registro do comprimento &#8211; overhead), independente do tamanho máximo declarado.</p>
<h3>Características dos tipos CHAR, NCHAR, VARCHAR e NVARCHAR</h3>
<p><strong>CHAR</strong></p>
<ul>
<li>Descrição: Armazena dados de texto com comprimento fixo.</li>
<li>Tamanho: O comprimento é definido ao criar a coluna e todos os valores terão exatamente esse tamanho &#8211; ou seja, o comprimento é fixo. <em>Espaços em branco são adicionados para preencher o comprimento se necessário</em>.</li>
<li>Uso: Dados de tamanho fixo, como códigos de produtos ou identificadores.</li>
</ul>
<p><strong>NCHAR</strong></p>
<ul>
<li>Descrição: Similar ao CHAR (também comprimento fixo), mas armazena dados de texto em formato Unicode.</li>
<li>Tamanho: Cada caractere ocupa 2 bytes, permitindo armazenar caracteres de múltiplos idiomas.</li>
<li>Uso: Usado para dados de texto internacionalizados ou quando é necessário suportar vários idiomas.</li>
</ul>
<p><strong>VARCHAR</strong></p>
<ul>
<li>Descrição: Armazena dados de texto com comprimento variável.</li>
<li>Tamanho: O comprimento máximo é definido ao criar a coluna, mas apenas o espaço necessário para armazenar o valor real é utilizado. Ou seja, ocupa espaço de acordo com o valor armazenado na coluna.</li>
<li>Uso: Ideal para colunas onde os tamanhos dos valores podem variar significativamente, como nomes, descrições ou endereços.</li>
</ul>
<p><strong>NVARCHAR</strong></p>
<ul>
<li>Descrição: Similar ao VARCHAR, mas armazena dados de texto em formato Unicode.</li>
<li>Tamanho: Cada caractere ocupa 2 bytes, semelhante ao NCHAR, mas o espaço é utilizado de forma mais eficiente para comprimentos variáveis.</li>
<li>Uso: Usado para dados de texto internacionalizados ou quando é necessário suportar vários idiomas, com comprimentos variáveis.</li>
</ul>
<h3>Performance dos tipos de texto</h3>
<p>Com relação à performance desses tipos de texto no SQL Server, temos que:</p>
<ul>
<li>CHAR e NCHAR podem ser mais rápidos para acesso em colunas onde todos os valores têm tamanho fixo.</li>
<li>Já os tipos VARCHAR e NVARCHAR são mais eficientes em termos de espaço para colunas onde os tamanhos dos valores variam.</li>
</ul>
<h3>Exemplos de uso</h3>
<h4>1. Tipos CHAR e NCHAR</h4>
<p>Criamos uma tabela com dois campos, um do tipo CHAR e outro do tipo NCHAR</p>
<pre><strong>CREATE TABLE ExemploCharNChar (</strong>
<strong>Codigo CHAR(5),</strong>
<strong>Item NCHAR(10)</strong>
<strong>);</strong></pre>
<p>Inserimos uma linha de teste nessa tabela. Para o campo &#8220;Item&#8221; usarei um dado em outro idioma, inclusive com outro conjunto de caracteres &#8211; no caso, caracteres japoneses.</p>
<p>Note o caractere &#8216;N&#8217; que precede o valor a ser armazenado, para indicar ao SQL Server que se trata de um valor Unicode.</p>
<pre><strong>INSERT INTO ExemploCharNChar (Codigo, Item)</strong>
<strong>VALUES ('012', N'ピザ');</strong></pre>
<p>Consegue descobrir que item foi inserido?</p>
<p>E realizamos uma consulta para ver o dado inserido.</p>
<pre><strong>SELECT * FROM ExemploCharNChar;</strong></pre>
<p><strong>Resultado:</strong></p>
<pre><span style="color: #000000;"><strong>Codigo  Item</strong></span>
<span style="color: #000000;"><strong>012     ピザ </strong></span></pre>
<h4>2. Tipos VARCHAR e NVARCHAR</h4>
<p>Agora vamos criar outra tabela também com dois campos, um do tipo VARCHAR e outro do tipo NVARCHAR</p>
<pre><strong>CREATE TABLE ExemploVarcharNVarchar (</strong>
<strong>Descricao VARCHAR(50),</strong>
<strong>Pedido NVARCHAR(100)</strong>
<strong>);</strong></pre>
<p>Inserimos uma linha de teste nessa tabela. Para o campo &#8220;Pedido&#8221; usarei novamente um dado em idioma japonês, desta vez com mais caracteres.</p>
<pre><strong>INSERT INTO ExemploVarcharNVarchar (Descricao, Pedido)</strong>
<strong>VALUES ('Prato Típico Italiano', N'ピザが食べたい.');</strong></pre>
<p>E realizamos a consulta para ver o dado inserido.</p>
<pre><strong>SELECT * FROM ExemploVarcharNVarchar;</strong></pre>
<p><strong>Resultado:</strong></p>
<pre><span style="color: #000000;"><strong>Descricao             Pedido</strong></span>
<span style="color: #000000;"><strong>Prato Típico Italiano ピザが食べたい.</strong></span></pre>
<h3>Importante</h3>
<p>Uma dica importante é a seguinte: Hoje em dia, os sistemas operacionais e plataformas de desenvolvimento usam internamente o sistema Unicode.</p>
<p>Sendo assim, se usarmos os tipos nvarchar em vez de varchar, e nchar em vez de char, evitamos que ocorram conversões de codificação sempre que operaçoes de leitura ou escrita forem realizadas no banco de dados.</p>
<p>Essas conversões consomem recursos do servidor e podem ocasionar erros, ainda que raramente, além do que não é fácil recuperar de erros de conversão em uma tabela.</p>
<h3>Conclusão</h3>
<p>Neste tutorial estudamos os tipos de dados CHAR, NCHAR, VARCHAR e NVARCHAR no SQL Server, suas diferenças e exemplos de uso.</p>
<p>Ao escolher o tipo de dados para colunas de texto, considere o tamanho dos dados que você espera armazenar, a necessidade de suporte a múltiplos idiomas e a eficiência de armazenamento. Para texto que precisa ser armazenado em múltiplos idiomas, use os tipos <strong>NCHAR</strong> ou <strong>NVARCHAR</strong>. Para texto de tamanho fixo, use <strong>CHAR</strong>, e para tamanho variável, use <strong>VARCHAR</strong>.</p>
<p>Lembre-se:</p>
<ul>
<li>Usamos CHAR e NCHAR quando o comprimento dos dados for fixo.</li>
<li>Usamos VARCHAR e NVARCHAR quando o comprimento dos dados for variável.</li>
<li>A letra &#8216;N&#8217; antes dos tipos Unicode (NCHAR e NVARCHAR) indica que eles suportam caracteres Unicode.</li>
</ul>
<p>* <strong>ピザ</strong> significa &#8220;pizza&#8221; e <strong>ピザが食べたい</strong> significa &#8220;quero comer pizza&#8221; (&#8220;piza ga tabetai&#8221;).</p>
<h3>Colabore com a Bóson Treinamentos</h3>
<p>Ajude o canal adquirindo meus cursos na Udemy:</p>
<ul>
<li>Bancos de Dados com MySQL Básico: <a href="https://bit.ly/35QdWE4" target="_blank" rel="noopener">https://bit.ly/35QdWE4</a></li>
<li>Lógica de Programação com Português Estruturado: <a href="https://bit.ly/3QKPn22" target="_blank" rel="noopener">https://bit.ly/3QKPn22</a></li>
<li>Programação em Python do Zero: <a href="https://bit.ly/python-boson" target="_blank" rel="noopener">https://bit.ly/python-boson</a></li>
</ul>
<p>Adquira também livros e outros itens na loja da Bóson Treinamentos na Amazon e ajude o canal a se manter e crescer: <a href="https://www.amazon.com.br/shop/bosontreinamentos" target="_blank" rel="noopener">https://www.amazon.com.br/shop/bosontreinamentos</a></p>
<p>O post <a href="https://www.bosontreinamentos.com.br/sql-com-sql-server/como-usar-os-tipos-de-dados-char-nchar-varchar-e-nvarchar-no-sql-server/">Como usar os tipos de dados char, nchar, varchar e nvarchar no SQL Server</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/sql-com-sql-server/como-usar-os-tipos-de-dados-char-nchar-varchar-e-nvarchar-no-sql-server/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
