<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1390797061973650137</id><updated>2012-02-16T22:51:53.736-02:00</updated><category term='Redes'/><category term='C#'/><category term='Mobile'/><category term='Visual Studio'/><category term='off-topic'/><category term='Estrutura de Dados'/><category term='iPhone'/><category term='Contato'/><category term='Arquitetura'/><category term='Powershell'/><category term='VSTF'/><category term='TFS'/><category term='C/C++'/><category term='SQL Server'/><category term='MONO'/><category term='Configuração'/><category term='EF'/><category term='Eventos'/><category term='IIS'/><category term='XNA'/><category term='Silverlight'/><category term='Portfólio'/><category term='ASP.NET'/><category term='.NET'/><title type='text'>Eduardo Spaki</title><subtitle type='html'>Arquitetando e desenvolvendo</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default?start-index=101&amp;max-results=100'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>115</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-4007754641751947117</id><published>2011-11-16T15:30:00.000-02:00</published><updated>2011-11-16T15:30:02.527-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Powershell'/><title type='text'>FTP + Powershell</title><content type='html'>&lt;p&gt;Bem, como já relatado em outros posts, é possível utilizar classes do &lt;a href="http://www.microsoft.com/net/" target="_blank"&gt;.NET Framework&lt;/a&gt; no &lt;a href="http://technet.microsoft.com/pt-br/library/bb978526.aspx" target="_blank"&gt;Powershell&lt;/a&gt;. Com isso em mente, podemos utilizar uma simples requisição com um WebRequest para estabelecer conexão com um servidor FTP.&lt;/p&gt;  &lt;p&gt;Vejamos esse exemplo de como copiar um diretório (seus arquivos e subpastas) para um servidor FTP (mantendo a mesma estrutura).&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="1"&gt;function DoLogFTP($tamanhoBytes, $fullName)       &lt;br /&gt;{        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if($tamanhoBytes -eq $null)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font size="1"&gt;&amp;#160;&amp;#160;&amp;#160; $tamanho = $tamanhoBytes/1024;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $unidade = &amp;quot;KB&amp;quot;;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if($tamanho -ge 1024.0)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $tamanho = $tamanho/1024;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $unidade = &amp;quot;MB&amp;quot;;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $mensagem = [string]::Format(&amp;quot;FTP: copiando ({0:0.00} {1}) '{2}' ... &amp;quot;, $tamanho, $unidade, $fullName);&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font size="1"&gt;&amp;#160;&amp;#160;&amp;#160; Write-Host $mensagem;       &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font size="1"&gt;function InstanciarFTPClient([string] $enderecoFTP, [string] $ftpUser, [string] $ftpPassword)       &lt;br /&gt;{        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $ftp = [System.Net.WebRequest]::Create($enderecoFTP);&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $ftp.Credentials = New-Object System.Net.NetworkCredential($ftpUser, $ftpPassword);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return $ftp;        &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font size="1"&gt;function CriarDiretorioFTP([string] $enderecoFTP, [string] $ftpUser, [string] $ftpPassword, [string] $nomeDoDiretorio)       &lt;br /&gt;{        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $ftp = InstanciarFTPClient ($enderecoFTP+$nomeDoDiretorio) $ftpUser $ftpPassword;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $ftp.Method = [System.Net.WebRequestMethods+FTP]::MakeDirectory;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $ftp.GetResponse();        &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font size="1"&gt;function EnviarDiretorioViaFTP([string] $diretorioOrigem, [string] $enderecoFTP, [string] $ftpUser, [string] $ftpPassword)       &lt;br /&gt;{        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; # -&amp;gt; Define um nome do diretório que será criado no servidor FTP.        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $nomeDoDiretorio = $diretorioOrigem.Substring($diretorioOrigem.LastIndexOf('\') + 1, $diretorioOrigem.Length - $diretorioOrigem.LastIndexOf('\') - 1) #(Get-Item $diretorioOrigem).Name; #(New-Object System.IO.DirectoryInfo $diretorioOrigem).Name;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $nomeDoDiretorio += (Get-Date).ToString(&amp;quot; - dd-MM-yyyy - HH-mm-ss&amp;quot;);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $global:diretorioCriadoNoServidor = $nomeDoDiretorio;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; CriarDiretorioFTP $enderecoFTP $ftpUser $ftpPassword $nomeDoDiretorio;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font size="1"&gt;&amp;#160;&amp;#160;&amp;#160; $diretorioFTP += $enderecoFTP + $nomeDoDiretorio + &amp;quot;/&amp;quot;;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $itensDoDiretorio = Get-ChildItem $diretorioOrigem -recurse;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font size="1"&gt;&amp;#160;&amp;#160;&amp;#160; foreach($item in $itensDoDiretorio)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $nomeItem = [System.IO.Path]::GetFullPath($item.FullName).SubString($diretorioOrigem.Length + 1);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DoLogFTP $item.Length $item.FullName;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ($item.Attributes -eq &amp;quot;Directory&amp;quot;)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CriarDiretorioFTP $diretorioFTP $ftpUser $ftpPassword $nomeItem;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; continue;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $ftp = InstanciarFTPClient ($diretorioFTP+$nomeItem) $ftpUser $ftpPassword;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $ftp.Method = [System.Net.WebRequestMethods+FTP]::UploadFile        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $ftp.KeepAlive = $false;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $ftp.UseBinary = $true ;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $ftp.UsePassive = $false;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $responseStream = $ftp.GetRequestStream();&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $bytesFile = [System.IO.File]::ReadAllBytes($item.FullName);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $responseStream.Write($bytesFile, 0, $bytesFile.Length);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $responseStream.Close();        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $responseStream.Dispose();        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;}        &lt;br /&gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Espero que tenham gostado da dica! &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-winkingsmile" alt="Winking smile" src="http://lh3.ggpht.com/-1rrrS6r8_6I/TsLTGpOeIAI/AAAAAAAABHQ/ib1IYhDgF10/wlEmoticon-winkingsmile%25255B2%25255D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-4007754641751947117?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/4007754641751947117/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=4007754641751947117&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/4007754641751947117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/4007754641751947117'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2011/11/ftp-powershell.html' title='FTP + Powershell'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-1rrrS6r8_6I/TsLTGpOeIAI/AAAAAAAABHQ/ib1IYhDgF10/s72-c/wlEmoticon-winkingsmile%25255B2%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-2951903744285107170</id><published>2011-11-15T18:31:00.001-02:00</published><updated>2011-11-15T18:32:45.310-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>Twitter + Silverlight ou WPF</title><content type='html'>&lt;p&gt;Vamos fazer um cliente de Twitter???&lt;/p&gt;  &lt;p&gt;Vamos! &lt;/p&gt;  &lt;p&gt;Ebaaa... &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-BNqui9Ak4tk/TsLMC13UUYI/AAAAAAAABFY/GjHgy7NwgzQ/s1600-h/image%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-U_IN8ZBpNgs/TsLMDXtArCI/AAAAAAAABFg/Sz1HPc_77Bk/image_thumb%25255B1%25255D.png?imgmax=800" width="185" height="201" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ok ok, comemorações a parte vamos iniciar.&lt;/p&gt;  &lt;p&gt;A ideia aqui é usar a API do Twitter, fazendo simples requisições web, e aproveitar o potencial do XAML, a linguagem de interface por trás do Silverlight (inclusive do Windows Phone) e do WPF.&lt;/p&gt;  &lt;p&gt;Então crie uma aplicação utilizando uma dessas tecnologias chamada de “MeuClienteDeTwitter”.&lt;/p&gt;  &lt;p&gt;No exemplo foi utilizado WPF. Nossa UI ficará da seguinte maneira:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-hVr-4d5zcA8/TsLMD2NdhoI/AAAAAAAABFo/jEO2aB2DwB4/s1600-h/clip_image002%25255B5%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://lh3.ggpht.com/-g47LncGVV3U/TsLMEjLuvQI/AAAAAAAABFw/hPliqKBItiw/clip_image002_thumb%25255B2%25255D.jpg?imgmax=800" width="592" height="480" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;No “.xaml” principal/inicial (no caso do WPF o “MainWindow.xaml”), desenhe uma tela, arrastando os controles da Toolbox para a tela, com os seguintes controles:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;TextBlock&lt;/strong&gt;: Ao topo servindo de título para a aplicação. Altere a propriedade “&lt;u&gt;Text&lt;/u&gt;” (para definir o valor do mesmo) e as propriedades de fonte, para deixar esse texto mais destacado. Esse controle funciona como uma Label do ASP.NET ou Windows Forms.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;TextBox&lt;/strong&gt;: Caixa de texto editável. Defina o nome dela como “txtUsuario”, acompanhe na imagem a seguir:      &lt;br /&gt;&lt;a href="http://lh6.ggpht.com/-bP1hqIwmYGY/TsLMFG_b_GI/AAAAAAAABF4/296LmVhRAR0/s1600-h/clip_image004%25255B6%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://lh5.ggpht.com/-CxyXfmKnLFk/TsLMFjWUN1I/AAAAAAAABGA/LF1Fcdgs82c/clip_image004_thumb%25255B3%25255D.jpg?imgmax=800" width="510" height="170" /&gt;&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Button&lt;/strong&gt;: Botão para fazer a requisição e listar os tweets do usuário informado. Defina seu nome como “btnCarregar”.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;ListBox&lt;/strong&gt;: Lista de itens. Montaremos um layout para os itens que listaremos. Por hora nomeie-o como “lstConteudo”, e deixe seu fundo transparente, como na imagem abaixo:      &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/-WV50toYUB0I/TsLMF3SSmZI/AAAAAAAABGI/M9YV4CxDkTM/s1600-h/clip_image006%25255B5%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://lh5.ggpht.com/-bPDxyOEQmYo/TsLMGfrxE9I/AAAAAAAABGQ/SN_WmTxceEU/clip_image006_thumb%25255B2%25255D.jpg?imgmax=800" width="229" height="480" /&gt;&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Curiosidade: O controle Label existe tanto no WPF como no Silverlight. Mas ele é um ContentControl, o que significa que ele pode conter “qualquer coisa” dentro delae não ficando limitado somente a texto puro e simples. Podemos adicionar um vídeo e imagem dentro da mesma Label, por exemplo. Como nesse exemplo queremos apenas texto para o título, optei pelo TextBlock.&lt;/p&gt;  &lt;p&gt;Uma coisa importante quando definimos layout de telas com XAML é ficar atento ao painel de layout. Pois todos os controles são aninhados e organizados em um ou mais painéis. Há vários painéis, cada um com uma forma de organizar o layout diferente. Nesse caso, todos esses controles ficam dentro de uma Grid. &lt;/p&gt;  &lt;p&gt;Essa Grid “não tem nada haver” com as conhecidas “DataGrids”, que montam tabelas com linhas e colunas proveniente de uma coleção de dados. &lt;/p&gt;  &lt;p&gt;A Grid do XAML é um painel que se orienta por distancia das margens. Por exemplo: se colocarmos um botão em uma Grid, e definirmos ele com uma margem de 20 pixels na esquerda e 20 pixels na direita, não interessa o tamanho da janela ou o quanto ela for redimensionada, o controle se adaptará para manter a distancia das margens, sempre em 20 pixels próximo as bordas laterais.&lt;/p&gt;  &lt;p&gt;A Grid pode ser dividida, criando bordas internas. Nesse exemplo, foi definida uma borda logo abaixo do botão e do campo de texto, para separar a ListBox dos demais controles. Assim, após colocar a ListBox na parte inferior, defini as margens dela como zero para todos os lados, logo ela acompanhará o tamanho da janela tanto em largura como em altura.&lt;/p&gt;  &lt;p&gt;Bem, o intuito aqui não é ficar discutindo sobre esses painéis, em outra oportunidade eu falo mais dos mesmos.&lt;/p&gt;  &lt;p&gt;Vejamos como ficou o XAML então:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="1"&gt;&amp;lt;Window x:Class=&amp;quot;MeuClienteDeTwitter.MainWindow&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns=&amp;quot;&lt;/font&gt;&lt;a href="http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;"&gt;&lt;font size="1"&gt;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;/font&gt;&lt;/a&gt;      &lt;br /&gt;&lt;font size="1"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns:x=&amp;quot;&lt;/font&gt;&lt;a href="http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;"&gt;&lt;font size="1"&gt;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;/font&gt;&lt;/a&gt;      &lt;br /&gt;&lt;font size="1"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Title=&amp;quot;MainWindow&amp;quot; Height=&amp;quot;484&amp;quot; Width=&amp;quot;385&amp;quot;&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!--Definindo o fundo em gradiente da janela--&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Window.Background&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;LinearGradientBrush EndPoint=&amp;quot;1,0.5&amp;quot; StartPoint=&amp;quot;0,0.5&amp;quot;&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;GradientStop Color=&amp;quot;LightBlue&amp;quot; Offset=&amp;quot;0&amp;quot; /&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;GradientStop Color=&amp;quot;White&amp;quot; Offset=&amp;quot;1&amp;quot; /&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/LinearGradientBrush&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Window.Background&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Grid&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!--Definindo as linhas da grid para o layout.         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; O &amp;quot;*&amp;quot; representa o tamanho que sobrar da jenala,        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; após utilizar os 80 da linha de cima--&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Grid.RowDefinitions&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;RowDefinition Height=&amp;quot;80&amp;quot; /&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;RowDefinition Height=&amp;quot;*&amp;quot; /&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Grid.RowDefinitions&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Label Content=&amp;quot;Meu Cliente de Twitter&amp;quot; Height=&amp;quot;28&amp;quot; HorizontalAlignment=&amp;quot;Left&amp;quot; Margin=&amp;quot;12,12,0,0&amp;quot; Name=&amp;quot;label1&amp;quot; VerticalAlignment=&amp;quot;Top&amp;quot; FontWeight=&amp;quot;Bold&amp;quot; FontSize=&amp;quot;16&amp;quot; FontFamily=&amp;quot;Verdana&amp;quot; /&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;TextBox Height=&amp;quot;23&amp;quot; HorizontalAlignment=&amp;quot;Left&amp;quot; Margin=&amp;quot;12,46,0,0&amp;quot; Name=&amp;quot;txtUsuario&amp;quot; VerticalAlignment=&amp;quot;Top&amp;quot; Width=&amp;quot;213&amp;quot; /&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Button Content=&amp;quot;Carregar o Twitter&amp;quot; Height=&amp;quot;23&amp;quot; HorizontalAlignment=&amp;quot;Left&amp;quot; Margin=&amp;quot;231,46,0,0&amp;quot; Name=&amp;quot;btnCarregar&amp;quot; VerticalAlignment=&amp;quot;Top&amp;quot; Width=&amp;quot;124&amp;quot; Click=&amp;quot;btnCarregar_Click&amp;quot; /&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ListBox Grid.Row=&amp;quot;1&amp;quot; Name=&amp;quot;lstConteudo&amp;quot; BorderBrush=&amp;quot;{x:Null}&amp;quot; Background=&amp;quot;{x:Null}&amp;quot;&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!--Template que define o layout de cada item da ListBox--&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ListBox.ItemTemplate&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;DataTemplate&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!--Perceba que foi utilizado um outro painel para definir o layout--&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;StackPanel Orientation=&amp;quot;Horizontal&amp;quot; Height=&amp;quot;132&amp;quot;&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Image Source=&amp;quot;{Binding UrlFoto}&amp;quot; Height=&amp;quot;73&amp;quot; Width=&amp;quot;73&amp;quot; VerticalAlignment=&amp;quot;Top&amp;quot; Margin=&amp;quot;0,10,8,0&amp;quot; /&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;StackPanel Width=&amp;quot;370&amp;quot;&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;TextBlock Text=&amp;quot;{Binding Usuario}&amp;quot; Foreground=&amp;quot;#FFC8AB14&amp;quot; FontSize=&amp;quot;28&amp;quot;/&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;TextBlock Text=&amp;quot;{Binding Conteudo}&amp;quot; TextWrapping=&amp;quot;Wrap&amp;quot; FontSize=&amp;quot;23&amp;quot;/&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/StackPanel&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/StackPanel&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/DataTemplate&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/ListBox.ItemTemplate&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/ListBox&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Grid&amp;gt;        &lt;br /&gt;&amp;lt;/Window&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Para fazer o fundo em gradiente, utilizamos o LinearGradientBrush com duas cores definidas para a Janela.&lt;/p&gt;  &lt;p&gt;A primeira linha da Grid, que separa a ListBox dos demais controles do “cabeçalho”, tem 80 pixels de altura, o restante, definido como “*”, fica para a segunda linha que é onde está a ListBox.&lt;/p&gt;  &lt;p&gt;Agora vem uma parte importante, a definição do layout dos itens que forem carregados no ListBox. Para isso temos que criar um painel de Layout, dentro do template de dados da ListBox.&lt;/p&gt;  &lt;p&gt;Nesse caso o painel de layout utilizado foi o StackPanel, ou painel empilhador. Ele empilha os controles, um sobre o outro, seja na vertical ou na horizontal.&lt;/p&gt;  &lt;p&gt;Dentro desse painel, colocamos um controle Image, para exibir a foto do usuário, com altura e largura de 73 pixels. Colocamos também dois TextBlock, um para o nome do usuário, com fonte um pouco maior, e outro para o tweet em si, com a quebra de linha ativada (propriedade “TextWrapping=&amp;quot;Wrap&amp;quot;”).&lt;/p&gt;  &lt;p&gt;Uma outra curiosidade: se você vem do desenvolvimento Windows Forms e quer uma maneira de organizar layout semelhante aos “bons e velhos” formulários, opte pelo painel chamado Canvas.&lt;/p&gt;  &lt;p&gt;Ao analisar o XAML uma coisa deve estar te deixando cmo a pulga atrás da orelha: O que são aqueles “bindings”.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-c3k44VxICwM/TsLMHbRPFmI/AAAAAAAABGY/-aivUyMwC3s/s1600-h/image%25255B7%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-Tl2kqMPoAmE/TsLMH7M4VlI/AAAAAAAABGg/swCHKvCrFJ8/image_thumb%25255B3%25255D.png?imgmax=800" width="145" height="88" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;O pessoal do ASP.NET deve até desconfiar.&lt;/p&gt;  &lt;p&gt;Bem, os bindings são definições de vinculo. Ou seja, nesse caso, passaremos uma lista de objetos para o ListBox. Esses objetos serão do tipo &lt;u&gt;ItemTwitter&lt;/u&gt;, que criaremos mais adiante. Ou melhor, vamos cria-lo agora. Clique com o botão direito no projeto &amp;gt; Add &amp;gt; Class. Veja na imagem abaixo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-P8wfqEYWe_E/TsLMIeZUdxI/AAAAAAAABGo/DBmvQuzsMJs/s1600-h/clip_image008%25255B5%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="clip_image008" border="0" alt="clip_image008" src="http://lh6.ggpht.com/-Rn-kZ1REdXY/TsLMI6IAWDI/AAAAAAAABGw/QIStLkesG2Q/clip_image008_thumb%25255B2%25255D.jpg?imgmax=800" width="640" height="352" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;O nome dela será “ItemTwitter”, o código fonte está abaixo:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="1"&gt;namespace MeuClienteDeTwitter       &lt;br /&gt;{        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class ItemTwitter        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public string UrlFoto { get; set; }        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public string Usuario { get; set; }        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public string Conteudo { get; set; }        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Basicamente três propriedades string estão definidas.&lt;/p&gt;  &lt;p&gt;Voltando ao binding, quando passarmos para o ListBox uma lista do tipo ItemTwitter, para cada objeto da lista será criado um item no ListBox. Mas como vincular o layout com as informações dos itens da lista? Definindo um binding no controle e propriedade desejados. No caso da foto, colocaremos no controle Image, na propriedade &lt;u&gt;Source&lt;/u&gt; (pois vincularemos a URL da foto do usuário). Nos TextBlocks a propriedade de vinculo será a &lt;u&gt;Text&lt;/u&gt;.&lt;/p&gt;  &lt;p&gt;No futuro falarei especificamente de binding.&lt;/p&gt;  &lt;p&gt;Faltou definir a codificação para tudo funcionar. Então volte para o modo de desing e dê um duplo click no botão, assim será criado o evento click do mesmo.&lt;/p&gt;  &lt;p&gt;Em seu click definiremos o seguinte código:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="1"&gt;using System;       &lt;br /&gt;using System.Linq;        &lt;br /&gt;using System.Net;        &lt;br /&gt;using System.Windows;        &lt;br /&gt;using System.Xml.Linq;        &lt;br /&gt;&amp;#160; &lt;br /&gt;namespace MeuClienteDeTwitter        &lt;br /&gt;{        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public partial class MainWindow : Window        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public MainWindow()        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; InitializeComponent();        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Método do evento de click do botão para carregar os tweets.        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private void btnCarregar_Click(object sender, RoutedEventArgs e)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Criamos um objeto que fará uma requisição web para a API do Twitter.        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var requisicao = new WebClient();        &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Concatenando o nome do usuário digitado na txtUsuario na URL da API do Twitter.        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var url = string.Format(&amp;quot;&lt;/font&gt;&lt;a href="http://api.twitter.com/1/statuses/user_timeline.xml?screen_name={0}&amp;quot;"&gt;&lt;font size="1"&gt;http://api.twitter.com/1/statuses/user_timeline.xml?screen_name={0}&amp;quot;&lt;/font&gt;&lt;/a&gt;&lt;font size="1"&gt;, txtUsuario.Text);       &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /*        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -&amp;gt; Faremos a requisição web de forma assincrona, ou seja,        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * a requisição é disparada a aplicação não ficará travada até ela responder.        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * Mas quando ela responder, deve responder para a aplicação com um evento.        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * Então temos que definir o evento que ela responderá &amp;quot;requisicao_DownloadStringCompleted&amp;quot;.        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * Agora podemos fazer a requisição assincrona, passando a URL da API, atravéz da classe URI.        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; */        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; requisicao.DownloadStringCompleted += new DownloadStringCompletedEventHandler(requisicao_DownloadStringCompleted);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; requisicao.DownloadStringAsync(new Uri(url));        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; void requisicao_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Todo o retorno do prossessamento da requisição virá na variável &amp;quot;e&amp;quot;.        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Verificamos se houve algum erro.        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (e.Error != null)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return;        &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; o Retorno da requisição é um XML. Teste no seu navegador para averiguar.        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Então fazemos um parse nele para utilizar o LINQ.        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var tweets = XElement.Parse(e.Result);        &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Usando o LINQ, tranformamos os nós do XML em uma lista de objetos &amp;quot;ItemTwitter&amp;quot;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var results = from tweet in tweets.Descendants(&amp;quot;status&amp;quot;)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select new ItemTwitter        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; UrlFoto= tweet.Element(&amp;quot;user&amp;quot;).Element(&amp;quot;profile_image_url&amp;quot;).Value,        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Conteudo = tweet.Element(&amp;quot;text&amp;quot;).Value,        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Usuario = tweet.Element(&amp;quot;user&amp;quot;).Element(&amp;quot;screen_name&amp;quot;).Value        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; };        &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Alimenta a ListBox.        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lstConteudo.ItemsSource = results.ToList();        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Percebam que a API do Twitter nada mais é do que uma chamada HTTP que retorna um XML. Faça o teste no seu Navegador. &lt;/p&gt;  &lt;p&gt;Após isso, utilizamos o LINQ para criar objetos, a partir do XML, e com eles alimentamos a ListBox, e está pronto nosso leitor de Tweets.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-V9AvPZeCtdo/TsLMJkZbGkI/AAAAAAAABG4/exghh_3cb5I/s1600-h/image%25255B10%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-VSrX8PortO4/TsLMKUrIkaI/AAAAAAAABHA/66xxzJ2PhNI/image_thumb%25255B4%25255D.png?imgmax=800" width="492" height="615" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;É praticamente a mesma coisa fazer essa App em Silverlight, inclusive coloca-la dentro de seu Windows Phone, veja aqui o Scott Gu fazendo isso:   &lt;br /&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/03/18/building-a-windows-phone-7-twitter-application-using-silverlight.aspx"&gt;http://weblogs.asp.net/scottgu/archive/2010/03/18/building-a-windows-phone-7-twitter-application-using-silverlight.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Espero que tenham gostado. &lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Alegre" src="http://lh4.ggpht.com/-O_hhmUKhII0/TsLMKy8S53I/AAAAAAAABHI/LQaE2Yb_NsY/wlEmoticon-smile%25255B2%25255D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-2951903744285107170?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/2951903744285107170/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=2951903744285107170&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/2951903744285107170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/2951903744285107170'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2011/11/vamos-fazer-um-cliente-de-twitter-vamos.html' title='Twitter + Silverlight ou WPF'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-U_IN8ZBpNgs/TsLMDXtArCI/AAAAAAAABFg/Sz1HPc_77Bk/s72-c/image_thumb%25255B1%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-9131417759352874311</id><published>2011-09-26T10:20:00.000-03:00</published><updated>2011-09-26T10:20:00.629-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Powershell'/><title type='text'>Arquivos de Texto com Powershell</title><content type='html'>&lt;p&gt;&lt;a href="http://lh5.ggpht.com/-yij-9LHsI34/Tn_RSqkLOkI/AAAAAAAABEo/c9JbZ8iGXy4/s1600-h/image%25255B2%25255D.png" target="_blank"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-OQAwkqx2iHE/Tn_RTMvrbOI/AAAAAAAABEs/UCdWhfHnRWw/image_thumb.png?imgmax=800" width="240" height="207" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Rapidinho irei demonstrar como é fácil manipular arquivos de texto com &lt;a href="http://technet.microsoft.com/pt-br/library/bb978526.aspx" target="_blank"&gt;Powershell&lt;/a&gt;, veja o código:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;#region Manipulação de arquivos texto&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; function LerTxt([string] $caminhoArquivo)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(Test-Path $caminhoArquivo)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return Get-Content $caminhoArquivo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; function EscreverTxt($caminhoArquivo, $conteudo)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; New-Item $caminhoArquivo -type file -Force;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Add-Content $caminhoArquivo $conteudo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p&gt;#endregion     &lt;br /&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;A única observação é que o código para gerar um arquivo de texto é recriado com o “new-item –force”. Caso desejem apenas adicionar conteúdo, desconsiderem essa linha.&lt;/p&gt;  &lt;p&gt;Por hora fica essa dica &lt;em&gt;the flash&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-Uk55unjkE1A/Tn_RTg8EyyI/AAAAAAAABEw/8tNJB95eDTM/s1600-h/image%25255B8%25255D.png" target="_blank"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-1uapAVy1Ewc/Tn_RUKxBCAI/AAAAAAAABE0/bN--RlEXKlU/image_thumb%25255B2%25255D.png?imgmax=800" width="240" height="148" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-9131417759352874311?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/9131417759352874311/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=9131417759352874311&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/9131417759352874311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/9131417759352874311'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2011/09/arquivos-de-texto-com-powershell.html' title='Arquivos de Texto com Powershell'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-OQAwkqx2iHE/Tn_RTMvrbOI/AAAAAAAABEs/UCdWhfHnRWw/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-296979538653355825</id><published>2011-09-09T22:00:00.000-03:00</published><updated>2011-09-09T22:00:04.537-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Powershell'/><title type='text'>Mandando e-mail com Powershell</title><content type='html'>&lt;p&gt;&lt;a href="http://lh4.ggpht.com/-Qnc0yiZWzFQ/Tmpcu2LWDII/AAAAAAAABEI/tiNIRFmz1_Q/s1600-h/image%25255B2%25255D.png" target="_blank"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-dn2G1p_DazE/Tmpcvrm8CZI/AAAAAAAABEM/maed0qF2U-A/image_thumb.png?imgmax=800" width="240" height="156" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Quer algo mais cômodo do que você automatizar rotinas nos servidores e receber um aviso, status ou até mesmo log das operações no seu e-mail!? &lt;/p&gt;  &lt;p&gt;Seu chefe desconfia que as rotinas estão rodando nos servidores? Coloque ele na cópia dos e-mails &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-winkingsmile" alt="Winking smile" src="http://lh4.ggpht.com/-W-ZiFvBYjt4/TmpcwEL58AI/AAAAAAAABEQ/o9tIr6373PY/wlEmoticon-winkingsmile%25255B2%25255D.png?imgmax=800" /&gt;! (Like a boss)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-YAYudcY4KQY/TmpcwgvitNI/AAAAAAAABEU/NsCESwUkg18/s1600-h/image%25255B5%25255D.png" target="_blank"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-OelhtbncQLY/TmpcxOKSXJI/AAAAAAAABEY/alGjU0P_Mx0/image_thumb%25255B1%25255D.png?imgmax=800" width="238" height="240" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ok, então fica registrado aqui uma função &lt;a href="http://technet.microsoft.com/pt-br/library/bb978526.aspx" target="_blank"&gt;Powershell&lt;/a&gt; para envio de e-mails.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;function SendMail([string] $smtpServer, [string] $smtpUser, [string] $smtpPassword, [string] $to, [string] $title, [string] $body)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; # -&amp;gt; Instancia um cliente SMTP.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $smtp = new-object System.Net.Mail.SmtpClient;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; # -&amp;gt; Host do servidor SMTP.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $smtp.Host = $smtpServer;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; # -&amp;gt; Autenticação no servidor SMTP.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $smtp.Credentials = New-Object System.Net.NetworkCredential($smtpUser, $smtpPassword);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; # -&amp;gt; Instancia uma mensagem de e-mail.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $message = New-Object System.Net.Mail.MailMessage;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; # -&amp;gt; Formata a mensagem para receber HTML.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $message.IsBodyhtml = $true;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $message.Body = $body;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $message.Subject = $title;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; # -&amp;gt; Define o endereço de origem como o usuário que autenticou no servidor SMTP.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $message.From = New-Object System.Net.Mail.MailAddress $smtpUser;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; # -&amp;gt; Quebra os endereços de destino de acordo com as separações (&amp;quot;;&amp;quot;).      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $toItems = $to.Split(&amp;quot;;&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; foreach($toItem in $toItems)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; # -&amp;gt; Adiciona os e-mails válidos de destino.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if($toItem -ne $null -and $toItem.Trim() -ne &amp;quot;&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $toAdress = New-Object System.Net.Mail.MailAddress $toItem;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $message.To.Add($toAdress);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; # -&amp;gt; Envia o e-mail.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $smtp.Send($message);      &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Sem mais complicações, como já &lt;a href="http://eduardospaki.blogspot.com/2011/09/manipulando-iis-com-powershell.html" target="_blank"&gt;citei&lt;/a&gt; em outras oportunidades, o Powershell dispõe do poder das classes .NET. Então bata usá-las para essa tarefa &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-openmouthedsmile" alt="Open-mouthed smile" src="http://lh6.ggpht.com/-T_PsvGNkSTQ/TmpcxpGlYEI/AAAAAAAABEc/26lfvxUrkag/wlEmoticon-openmouthedsmile%25255B2%25255D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;p&gt;Be happy!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-296979538653355825?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/296979538653355825/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=296979538653355825&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/296979538653355825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/296979538653355825'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2011/09/mandando-e-mail-com-powershell.html' title='Mandando e-mail com Powershell'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-dn2G1p_DazE/Tmpcvrm8CZI/AAAAAAAABEM/maed0qF2U-A/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-6182566389747636756</id><published>2011-09-08T18:51:00.001-03:00</published><updated>2011-09-08T18:51:32.374-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>Arranjo, Combinação e Permutação</title><content type='html'>&lt;p&gt;&lt;a href="http://lh6.ggpht.com/-fn0c35z5XzE/Tmk4x1iBWAI/AAAAAAAABDU/-P3svTDFikY/s1600-h/image%25255B2%25255D.png" target="_blank"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-pgub00el1tk/Tmk4yse8fgI/AAAAAAAABDY/QxkJC0K1ktk/image_thumb.png?imgmax=800" width="240" height="187" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Essas três palavrinhas fazem parte de clássicos da computação e matemática. então resolvi explicá-las e demonstrar com a linguagem C.&lt;/p&gt;  &lt;p&gt;Arranjo: são grupos sem repetição, ou seja, se eu tenho os elementos 1, 2 e 3, eu posso agrupá-los em dupla (conjuntos de dois elementos) para formar os seguintes números: 12, 13, 21, 23, 31, 32.&lt;/p&gt;  &lt;p&gt;O arranjo é a base da Combinação e da permutação. Sua fórmula é descrita assim:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;A n,p = n!/(n-p)!&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-O1k6FKE-tk0/Tmk4y7MyV5I/AAAAAAAABDc/cIORqy_fjr0/s1600-h/image%25255B5%25255D.png" target="_blank"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-QnxaermY6OA/Tmk4zXZ3wxI/AAAAAAAABDg/hY-mJHKMNa4/image_thumb%25255B1%25255D.png?imgmax=800" width="119" height="46" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Onde “n” é o quantidade de elementos e “p” o tamanho do grupo.&lt;/p&gt;  &lt;p&gt;No exemplo mencionado temos 3 elementos (quantidade) colocados em par (tamanho do grupo = 2).&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;A 3,2 = 3!/(3-2)! = 3.2.1/1! = &lt;strong&gt;6&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Agora que já entendemos a base, vamos para o próximo, a Combinação. &lt;/p&gt;  &lt;p&gt;Combinação: é um Arranjo onde deveremos ignoramos os grupos que contenha os mesmo elementos, independente da ordem. &lt;/p&gt;  &lt;p&gt;No exemplo do Arranjo, nós consideramos conjuntos distintos os números 12 e 21, porque numericamente são diferentes. &lt;/p&gt;  &lt;p&gt;Mas imagine o caso onde temos um João e uma Maria. Tanto faz se o conjunto é (João, Maria) ou (Maria, João), pois formam o mesmo casamento &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://lh6.ggpht.com/-UGh6kbxYgHQ/Tmk4zglGuoI/AAAAAAAABDk/QYa3tQqqusg/wlEmoticon-smile%25255B2%25255D.png?imgmax=800" /&gt;. Então essa é a Combinação: Arranjos que desconsideramos demais conjuntos que contenham o mesmo elemento independente da ordem.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;C n,p = A n,p/p! = n!/p!(n-p)!&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-Phe6R0DrXVk/Tmk41uicj0I/AAAAAAAABDo/MrRbjYTnUnY/s1600-h/image%25255B8%25255D.png" target="_blank"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-iG9ot4w9xZI/Tmk42IH797I/AAAAAAAABDs/DPy7si3By60/image_thumb%25255B2%25255D.png?imgmax=800" width="171" height="44" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Percebam que é possível compor a fórmula da Combinação se baseando na fórmula do Arranjo.&lt;/p&gt;  &lt;p&gt;Vamos ver um exemplo: Qual a quantidade de duplas possíveis com as pessoas Adriana, Xenofreuda e Tonha.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;C 3,2 = 3!/2!(3-2)! = 3.2.1/2.1.1! = 3&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;E finalmente a Permutação. &lt;/p&gt;  &lt;p&gt;Permutação: Arranjos onde a quantidade de elementos é igual ao tamanho do grupo, utilizado muito em anagramas. Anagramas são as variações possíveis de se fazer com as letras de uma palavra, por exemplo a palavra “mel”: mle, lme, lem, eml, elm.&lt;/p&gt;  &lt;p&gt;Sua formula é um simples fatorial:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;P n = n!&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-NUOwoeqmPQc/Tmk42cdIKPI/AAAAAAAABDw/ft9gR2M5jNI/s1600-h/image%25255B11%25255D.png" target="_blank"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-aQFUQ2UHKWk/Tmk42xYYl0I/AAAAAAAABD0/RLwsavfL_Ys/image_thumb%25255B3%25255D.png?imgmax=800" width="64" height="23" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para o exemplo:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;P 3 = 3! = 3.2.1 = 6&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Uma vez que entendemos a teoria, vamos colocá-la na pratica dentro da computação com a linguagem C. &lt;/p&gt;  &lt;p&gt;Para isso, usei conceitos de &lt;a href="http://eduardospaki.blogspot.com/2010/06/explicando-recursividade.html" target="_blank"&gt;Recursividade e Números Fatoriais&lt;/a&gt;.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;// -&amp;gt; Para poder usar o &amp;quot;wcout&amp;quot; e o cout     &lt;br /&gt;#include&amp;lt;iostream&amp;gt;      &lt;br /&gt;using namespace std;&lt;/p&gt;    &lt;p&gt;long double CalcularFatorial(int numero)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if(numero &amp;lt; 2)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return numero;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; return numero * CalcularFatorial(numero - 1);     &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;long double CalcularArranjo(int quantidadeElementos, int tamanhoGrupo)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return CalcularFatorial(quantidadeElementos)/CalcularFatorial(quantidadeElementos - tamanhoGrupo);      &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;long double CalcularCombinacao(int quantidadeElementos, int tamanhoGrupo)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return CalcularArranjo(quantidadeElementos, tamanhoGrupo)/CalcularFatorial(tamanhoGrupo);      &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;long double CalcularPermutacao(int quantidadeElementos)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return CalcularFatorial(quantidadeElementos);      &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;void main()     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; setlocale(LC_ALL, &amp;quot;Portuguese&amp;quot;); // -&amp;gt; Permitir acentos.&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; while(true)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Limpa a tela.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; system(&amp;quot;cls&amp;quot;);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Monta o menu de opções.     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wcout &amp;lt;&amp;lt; &amp;quot;Qual operação deseja realizar?&amp;quot; &amp;lt;&amp;lt; endl;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wcout &amp;lt;&amp;lt; &amp;quot;\t1-) Fatorial&amp;quot; &amp;lt;&amp;lt; endl;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wcout &amp;lt;&amp;lt; &amp;quot;\t2-) Arranjo&amp;quot; &amp;lt;&amp;lt; endl;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wcout &amp;lt;&amp;lt; &amp;quot;\t3-) Combinação&amp;quot; &amp;lt;&amp;lt; endl;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wcout &amp;lt;&amp;lt; &amp;quot;\t4-) Permutação&amp;quot; &amp;lt;&amp;lt; endl;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wcout &amp;lt;&amp;lt; &amp;quot;\t5-) Sair&amp;quot; &amp;lt;&amp;lt; endl;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wcout &amp;lt;&amp;lt; &amp;quot;\tOpção: &amp;quot;;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int opcao, quantidadeElementos, tamanhoGrupo;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; long double resultado;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;%i&amp;quot;, &amp;amp;opcao);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; switch (opcao)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case 1:      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wcout &amp;lt;&amp;lt; &amp;quot;Infome um número para calcular seu fatorial: &amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;%i&amp;quot;, &amp;amp;quantidadeElementos);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; resultado = CalcularFatorial(quantidadeElementos);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case 2:      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wcout &amp;lt;&amp;lt; &amp;quot;Cálculo de Arranjo&amp;quot; &amp;lt;&amp;lt; endl;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wcout &amp;lt;&amp;lt; &amp;quot;Infome a quantidade de elementos: &amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;%i&amp;quot;, &amp;amp;quantidadeElementos);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wcout &amp;lt;&amp;lt; &amp;quot;Infome o tamanho do grupo: &amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;%i&amp;quot;, &amp;amp;tamanhoGrupo);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; resultado = CalcularArranjo(quantidadeElementos, tamanhoGrupo);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case 3:      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wcout &amp;lt;&amp;lt; &amp;quot;Cálculo de Combinação&amp;quot; &amp;lt;&amp;lt; endl;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wcout &amp;lt;&amp;lt; &amp;quot;Infome a quantidade de elementos: &amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;%i&amp;quot;, &amp;amp;quantidadeElementos);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wcout &amp;lt;&amp;lt; &amp;quot;Infome o tamanho do grupo: &amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;%i&amp;quot;, &amp;amp;tamanhoGrupo);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; resultado = CalcularCombinacao(quantidadeElementos, tamanhoGrupo);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case 4:      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wcout &amp;lt;&amp;lt; &amp;quot;Cálculo de Permutação&amp;quot; &amp;lt;&amp;lt; endl;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wcout &amp;lt;&amp;lt; &amp;quot;Infome a quantidade de elementos: &amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;%i&amp;quot;, &amp;amp;quantidadeElementos);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; resultado = CalcularPermutacao(quantidadeElementos);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(opcao &amp;gt; 4) // -&amp;gt; Encerra a aplicação     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wcout &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; &amp;quot;Resultado: &amp;quot; &amp;lt;&amp;lt; resultado &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; endl;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wcout &amp;lt;&amp;lt; &amp;quot;Pressione enter para continuar...&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fflush(stdin);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; getchar();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; wcout &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; &amp;quot;Fim!&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /*fflush(stdin);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; getchar();*/      &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Percebam que, como vimos na teoria, é possível aproveitar o Arranjo para compor a formula da Combinação, e fiz exatamente isso na função &lt;em&gt;CalcularCombinacao()&lt;/em&gt;. &lt;/p&gt;  &lt;p&gt;Outro ponto é que, para os resultados eu tive que apelar para o tipo &lt;em&gt;long double&lt;/em&gt; (96 bits), pois quando falamos em fatoriais, os números podem crescer freneticamente.&lt;/p&gt;  &lt;p&gt;Acompanhe alguns testes:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-wyoLQh_WohM/Tmk43YIm-aI/AAAAAAAABD4/S9unPffgiCw/s1600-h/image%25255B14%25255D.png" target="_blank"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-EYuszHhlBS8/Tmk435jU93I/AAAAAAAABD8/p8rW6c7dnNg/image_thumb%25255B4%25255D.png?imgmax=800" width="240" height="121" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-cgAUGOhoMew/Tmk44AGr6iI/AAAAAAAABEA/C4NOXg772Hg/s1600-h/image%25255B17%25255D.png" target="_blank"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-Al-2k6dUlmk/Tmk44tc5y0I/AAAAAAAABEE/c-dbQuQ5Cbs/image_thumb%25255B5%25255D.png?imgmax=800" width="240" height="121" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;É isso daí pessoal.&lt;/p&gt;  &lt;p&gt;Já calcularam qual o números de combinações possíveis de maquiagem de maquiagem da sua namorada, mulher ou enrolada? &lt;/p&gt;  &lt;p&gt;Você irá se surpreender O.o&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-6182566389747636756?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/6182566389747636756/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=6182566389747636756&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/6182566389747636756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/6182566389747636756'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2011/09/arranjo-combinacao-e-permutacao.html' title='Arranjo, Combinação e Permutação'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-pgub00el1tk/Tmk4yse8fgI/AAAAAAAABDY/QxkJC0K1ktk/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-2642551344059070657</id><published>2011-09-07T21:24:00.001-03:00</published><updated>2011-09-07T21:24:54.319-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><category scheme='http://www.blogger.com/atom/ns#' term='Powershell'/><title type='text'>Manipulando IIS com Powershell</title><content type='html'>&lt;p align="center"&gt;&lt;a href="http://lh6.ggpht.com/-EkHWAzW7wJ8/TmgLOSic8pI/AAAAAAAABCo/MNKGkmRSo6w/s1600-h/image%25255B4%25255D.png" target="_blank"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-gp-lLk2bI8M/TmgLO7CEMEI/AAAAAAAABCs/sKizacCZkEM/image_thumb%25255B2%25255D.png?imgmax=800" width="240" height="170" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ultimamente tenho trabalhado bastante com &lt;strike&gt;Powerhell&lt;/strike&gt; &lt;a href="http://technet.microsoft.com/pt-br/library/bb978526.aspx" target="_blank"&gt;Powershell&lt;/a&gt; devido a uma consultoria no módulo de Build do &lt;a href="http://msdn.microsoft.com/en-US/vstudio/ff637362" target="_blank"&gt;TFS&lt;/a&gt;. O legal desse módulo é que você pode interagir com scripts Powershell e variáveis do &lt;a href="http://msdn.microsoft.com/pt-br/library/aa480214.aspx" target="_blank"&gt;Work Flow&lt;/a&gt; que o TFS utiliza durante um build. &lt;/p&gt;  &lt;p&gt;O Powershell é muito poderoso, isso se deve ao fato dele usufruir das classes .NET, utilizar o Windows Remote Management (&lt;a href="http://msdn.microsoft.com/en-us/library/aa384426(v=vs.85).aspx" target="_blank"&gt;WinRM&lt;/a&gt;) para execução remota de scripts, e comandos nativos das versões mais atuais do prompt, como o &lt;a href="http://technet.microsoft.com/en-us/library/cc733145(WS.10).aspx" target="_blank"&gt;ROBOCOPY&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-I9GV_cE7tYw/TmgLP7EG64I/AAAAAAAABCw/0AIGRor5r8U/s1600-h/image%25255B9%25255D.png" target="_blank"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-L06lBZPajik/TmgLQvHt4QI/AAAAAAAABC0/8UZMkofvcXk/image_thumb%25255B5%25255D.png?imgmax=800" width="240" height="180" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Assim como no .NET, nós podemos instalar módulos adicionais, e até mesmo importar os já instalados. No caso do IIS devemos importar o módulo “WebAdministration” . Então segue alguns scripts para manipulação do IIS.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Import-Module WebAdministration;&lt;/p&gt;    &lt;p&gt;#region Manipulação do IIS     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; function PararPool([string] $poolName)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Stop-WebAppPool -Name $poolName;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; function IniciarPool([string] $poolName)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Start-WebAppPool -Name $poolName;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; function PararSite([string] $siteName)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $site = GetSite $siteName;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $site.Stop();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; function IniciarSite([string] $siteName)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $site = GetSite $siteName;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $site.Start();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; function GetSite($siteName)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $site = Get-Item IIS://Sites/$siteName -ErrorAction SilentlyContinue;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return $site;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; function GetDirectorySite($site)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (Get-Item IIS://Sites/$site).PhysicalPath;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; function GetPoolSite($site)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $objSite = Get-Item IIS://Sites/$site;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return $objSite.ApplicationPool;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; function CriarSite([string] $siteName, [string] $caminho)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; New-Item IIS:\AppPools\$siteName;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; New-Item IIS:\Sites\$siteName -bindings @{protocol=&amp;quot;http&amp;quot;;bindingInformation=&amp;quot;:80:$siteName&amp;quot;} -physicalPath $caminho;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set-ItemProperty IIS:\Sites\$siteName -name applicationPool -value $siteName;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;#endregion&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Os scripts foram testados no IIS 7 e 7.5.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-8X7WD0e1p4g/TmgLRelrcUI/AAAAAAAABC4/qqVgDD-nK3U/s1600-h/image%25255B12%25255D.png" target="_blank"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-YzRgT4ykCRo/TmgLSIHS4HI/AAAAAAAABC8/19u1ZH9yFCM/image_thumb%25255B6%25255D.png?imgmax=800" width="240" height="174" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;É lógico que existem mil e uma maneiras de &lt;strike&gt;preparar neston&lt;/strike&gt; atingir um objetivo. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-TtGPkjcuJtg/TmgLS9VaTrI/AAAAAAAABDA/e-5_9hYwxxY/s1600-h/image%25255B15%25255D.png" target="_blank"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-0af-zxkPEqM/TmgLTzI014I/AAAAAAAABDE/vO0zpnMzbgk/image_thumb%25255B7%25255D.png?imgmax=800" width="240" height="240" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;É possível utilizar o Active Directory Service Interfaces (&lt;a href="http://msdn.microsoft.com/en-us/library/aa772170(v=vs.85).aspx" target="_blank"&gt;ADSI&lt;/a&gt;), ou até mesmo o Windows Management Instrumentation (&lt;a href="http://msdn.microsoft.com/en-us/library/aa394582(v=vs.85).aspx" target="_blank"&gt;WMI&lt;/a&gt;). Acompanhe como reciclaríamos um determinado pool do IIS com o ADSI:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;function ReciclarPool([string] $server, [string] $poolName)     &lt;br /&gt;{&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ([adsi]&amp;quot;IIS://$server/W3SVC/AppPools/$poolName&amp;quot;).Recycle();      &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Uma última dica por hora, para editar e depurar scripts powershell, estou usando o programa &lt;a href="http://powergui.org/" target="_blank"&gt;PowerGUI&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-QgKe7LdBePo/TmgLUR0PQVI/AAAAAAAABDI/iCvCYYwYwM0/s1600-h/image%25255B18%25255D.png" target="_blank"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-4q3cNhfeX-g/TmgLUzf3MvI/AAAAAAAABDM/uLpMTM6SlCE/image_thumb%25255B8%25255D.png?imgmax=800" width="240" height="147" /&gt;&lt;/a&gt;&lt;/p&gt;          &lt;p&gt;É isso daí pessoal. Por hora é só, espero que tenham gostado! &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://lh5.ggpht.com/-TnGDe1PrNZA/TmgLVOrYKcI/AAAAAAAABDQ/368pdHn6ka4/wlEmoticon-smile%25255B2%25255D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-2642551344059070657?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/2642551344059070657/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=2642551344059070657&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/2642551344059070657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/2642551344059070657'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2011/09/manipulando-iis-com-powershell.html' title='Manipulando IIS com Powershell'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-gp-lLk2bI8M/TmgLO7CEMEI/AAAAAAAABCs/sKizacCZkEM/s72-c/image_thumb%25255B2%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-1517248306750906072</id><published>2011-08-03T19:52:00.001-03:00</published><updated>2011-08-04T19:29:16.204-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Configuração'/><title type='text'>Deletar arquivo do dia anterior</title><content type='html'>&lt;p&gt;&lt;a href="http://lh5.ggpht.com/-qEl7tWdFC_Y/TjnRJkCx6gI/AAAAAAAABBk/CVG1ubZ4IKQ/s1600-h/pinky-e-cerebro%25255B3%25255D.jpg" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="pinky-e-cerebro" alt="pinky-e-cerebro" src="http://lh3.ggpht.com/-7JnxWRhugMY/TjnRKGwdm6I/AAAAAAAABBo/UAyPdeSy3Tw/pinky-e-cerebro_thumb%25255B1%25255D.jpg?imgmax=800" width="170" height="197" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Dica rápida…&lt;/p&gt;  &lt;p&gt;A alguns dias dias atrás a equipe de desenvolvimento com a qual estava trabalhando decidiu persistir o Viewstate do ASP.NET no HD do servidor.&lt;/p&gt;  &lt;p&gt;Após implantar as configurações, rotinas e afins, ficou a dúvida se as rotinas de exclusão dos viewstates antigos estava funcionando corretamente. &lt;/p&gt;  &lt;p&gt;Um desenvolvedor deu a ideia de criar um .exe que excluísse os arquivos do dia anterior. Logo pensei: que mania de desenvolvedor de achar que o mundo pode ser resolvido com um .exe. (Falo isso com toda a autoridade de ser um desenvolvedor também!)&lt;/p&gt;  &lt;p&gt;Então eu intervi, dizendo que apenas persistissem, e eu agendaria uma tarefa no servidor Windows para apagar os viewstates do dia anterior.&lt;/p&gt;  &lt;p&gt;Mas… #comofaz?&lt;/p&gt;  &lt;p&gt;Como estou trabalhando bastante com Poweshell ultimamente, pensei que não seria difícil desenvolver um script assim.&lt;/p&gt;  &lt;p&gt;Após pesquisar um pouco descobri o comando &amp;quot;forfiles&amp;quot; do prompt do Windows mesmo. Essa belezinha lista arquivos, podendo aplicar alguns filtros. O filtro para os dias é o parametro &amp;quot;D&amp;quot;, onde nesse caso, defini –1, veja:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-qeHUMpHJB0U/TjnRKrbhIMI/AAAAAAAABBs/sCO3R21ahJY/s1600-h/image%25255B7%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh6.ggpht.com/-IBccWFNvj7U/TjnRLCCM4HI/AAAAAAAABBw/ClZQf20gtnI/image_thumb%25255B3%25255D.png?imgmax=800" width="385" height="197" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;#Maravawonderfull, listei os arquivos, mas e agora, como deletá-los? Já pensou que agonia, colocá-los em variáveis&amp;#160; de script basic/bat!? &lt;/p&gt;  &lt;p&gt;#Esgurmita!&lt;/p&gt;  &lt;p&gt;Puxei um help do comando e loco descobri que havia como passar um comando para aplicar a cada item listado.&lt;/p&gt;  &lt;p&gt;Com mais alguns parâmetros consegui gerar um .bat e agendar no Windows a rotina para executá-lo diariamente:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;forfiles /P &amp;quot;C:\Users\Spoky\AppData\Local\Temp&amp;quot; /S /M *.txt /D -1 /C &amp;quot;cmd /c del @file&amp;quot;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Onde:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;P: Diretório da da listagem. &lt;/li&gt;    &lt;li&gt;S: Busca recursiva pelos diretórios a dentro. &lt;/li&gt;    &lt;li&gt;M: Aplica a máscara *.txt. &lt;/li&gt;    &lt;li&gt;D: Data da modificação. &lt;/li&gt;    &lt;li&gt;C: Aplica algum comando para cada resultado da listagem. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Então #FicaDica &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-winkingsmile" alt="Smiley piscando" src="http://lh4.ggpht.com/-QUTcuVvk_qk/TjnRLQoVE4I/AAAAAAAABB0/_b7bWXMqxuw/wlEmoticon-winkingsmile%25255B2%25255D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-1517248306750906072?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/1517248306750906072/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=1517248306750906072&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/1517248306750906072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/1517248306750906072'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2011/08/deletar-arquivo-do-dia-anterior.html' title='Deletar arquivo do dia anterior'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-7JnxWRhugMY/TjnRKGwdm6I/AAAAAAAABBo/UAyPdeSy3Tw/s72-c/pinky-e-cerebro_thumb%25255B1%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-1857947692263711006</id><published>2011-07-25T21:24:00.001-03:00</published><updated>2011-07-25T21:24:25.324-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><title type='text'>Auditoria no TFS - PT II</title><content type='html'>&lt;p&gt;Antes de continuar com as dicas de auditoria, gostaria de ratificar que a dica prestada no post &amp;quot;&lt;a href="http://eduardospaki.blogspot.com/2011/07/auditoria-no-tfs-pt-i.html" target="_blank"&gt;Auditoria no TFS - PT I&lt;/a&gt;&amp;quot; só é possível usando o &lt;a href="http://visualstudiogallery.msdn.microsoft.com/c255a1e4-04ba-4f68-8f4e-cd473d6b971f/" target="_blank"&gt;TFS Power Tools&lt;/a&gt;, um conjunto de ferramentas que aprimoram a experiência e interação com o &lt;a href="http://msdn.microsoft.com/en-US/vstudio/ff637362" target="_blank"&gt;TFS&lt;/a&gt;. Valeu &lt;a href="http://twitter.com/wsilva81" target="_blank"&gt;@wsilva81&lt;/a&gt; por ter me lembrado desse detalhe.&lt;/p&gt;  &lt;p&gt;E aqui vai mais uma dica de outra ferramenta que auxilia na auditoria do TFS. É o &lt;a href="http://visualstudiogallery.msdn.microsoft.com/582dd43e-e8be-48fc-9763-bf13bac66cc2?SRC=VSIDE" target="_blank"&gt;TFS Membership Visualizer&lt;/a&gt;. Ele monta um gráfico, baseado no &lt;a href="http://blogs.msdn.com/b/jennifer/archive/2010/05/11/visual-studio-2010-how-to-understand-your-code-using-dependency-graphs-sequence-diagrams-and-the-architecture-explorer.aspx" target="_blank"&gt;gráfico de dependência&lt;/a&gt; do Visual Studio 2010, com informações de Team Projects de uma collection. É possível adicionar o plug-in no Visual Studio como nas imagens abaixo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-uolNA9gcxpU/Ti4JFbTyx-I/AAAAAAAAA_w/SSVWQBmM8Zs/s1600-h/10%25255B3%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="10" alt="10" src="http://lh5.ggpht.com/-j97_kgyicFk/Ti4JGPY2-vI/AAAAAAAAA_0/7qa1wjzbYIg/10_thumb%25255B1%25255D.png?imgmax=800" width="263" height="179" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-kBXiqP53swQ/Ti4JGxFWihI/AAAAAAAAA_4/soMj6xvBMps/s1600-h/11%25255B3%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="11" alt="11" src="http://lh6.ggpht.com/-tINPgGG1Ieo/Ti4JHU3KrYI/AAAAAAAAA_8/4w-a7YCdaQ8/11_thumb%25255B1%25255D.png?imgmax=800" width="373" height="99" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Após instalado, siga os seguintes passos para gerar o gráfico:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-J6fdPvO_HF4/Ti4JH7FgTMI/AAAAAAAABAA/ppqvFqEwYCY/s1600-h/1%25255B4%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="1" alt="1" src="http://lh5.ggpht.com/-sVp3jCx5YHg/Ti4JIskcNfI/AAAAAAAABAE/OuiGjW5NLGw/1_thumb%25255B2%25255D.png?imgmax=800" width="385" height="69" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-Qz5F6f6eaJM/Ti4JJMGBxxI/AAAAAAAABAI/S9EFPPS_SQQ/s1600-h/2%25255B4%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="2" alt="2" src="http://lh5.ggpht.com/-HmMydZIhA_8/Ti4JJ5OnO9I/AAAAAAAABAM/jIGY7LcAjx4/2_thumb%25255B2%25255D.png?imgmax=800" width="370" height="97" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-qV7WIUM-gy8/Ti4JKSzdLWI/AAAAAAAABAQ/QxRDUbOznqc/s1600-h/3%25255B4%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="3" alt="3" src="http://lh6.ggpht.com/-Q8-DNC78DdA/Ti4JLYe6BAI/AAAAAAAABAU/kjxt4tdEGvU/3_thumb%25255B2%25255D.png?imgmax=800" width="467" height="293" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-8UIWlykiIxs/Ti4JLzGeUmI/AAAAAAAABAY/MRvlRtOzvNw/s1600-h/4%25255B3%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="4" alt="4" src="http://lh6.ggpht.com/-1jDDk3Ovmz4/Ti4JMr0J3YI/AAAAAAAABAc/jQXKOe8_U60/4_thumb%25255B1%25255D.png?imgmax=800" width="468" height="120" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Assim obtemos o seguinte resultado:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-lACbT-yLAms/Ti4JNE4rfwI/AAAAAAAABAg/D7MU8IUelQs/s1600-h/5%25255B4%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="5" alt="5" src="http://lh4.ggpht.com/-tD_HXb4LlkQ/Ti4JNrMDneI/AAAAAAAABAk/sj589sTdsZM/5_thumb%25255B2%25255D.png?imgmax=800" width="554" height="281" /&gt;&lt;/a&gt;&lt;/p&gt;      &lt;p&gt;Quem merece atenção no gráfico são as imagens roxas, que indicam os logins e grupos que tem acesso aos Team Projects. Mas também auxiliam em outras situações para visualização da collection, team projects, source controls etc.&lt;/p&gt;  &lt;p&gt;#FicaDica &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-winkingsmile" alt="Smiley piscando" src="http://lh5.ggpht.com/-avEZ2ZWyOf4/Ti4JN0abpdI/AAAAAAAABAo/R70iPtIBGnA/wlEmoticon-winkingsmile%25255B2%25255D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-1857947692263711006?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/1857947692263711006/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=1857947692263711006&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/1857947692263711006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/1857947692263711006'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2011/07/auditoria-no-tfs-pt-ii.html' title='Auditoria no TFS - PT II'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-j97_kgyicFk/Ti4JGPY2-vI/AAAAAAAAA_0/7qa1wjzbYIg/s72-c/10_thumb%25255B1%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-4400144133116124812</id><published>2011-07-23T18:30:00.000-03:00</published><updated>2011-07-23T18:30:00.462-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Transformation de web.config</title><content type='html'>&lt;p&gt;&lt;a href="http://lh4.ggpht.com/-eBPminSPO78/TisqgqECCUI/AAAAAAAAA-E/FhxvhokLo5c/s1600-h/ultimate_bumblebee%25255B3%25255D.jpg" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="ultimate_bumblebee" alt="ultimate_bumblebee" src="http://lh5.ggpht.com/-flZoLicsrE8/Tisqg9LyKFI/AAAAAAAAA-I/L-_F74SEkpA/ultimate_bumblebee_thumb%25255B1%25255D.jpg?imgmax=800" width="223" height="223" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Transformation de arquivos de configuração é uma feature que surgiu com o Visual Studio de 2010. São arquivos de configurações que complementam o arquivo de configuração original. Esse complemento pode ser a adição, remoção e a transformação de tags do arquivo original.&lt;/p&gt;  &lt;p&gt;Esses complementos são bem vindos quando precisamos gerar builds para ambientes distintos. Se sua empresa trabalha com cenários de testes, homologação, produção, etc… Pode gerar um transformation para cada um desses cenários, alterando a tag de connection string com o banco de dados por exemplo.&lt;/p&gt;  &lt;p&gt;Ao criarmos um projeto web no Visual Studio, temos de cara as configurações de debug e release.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-Wy9M4zpo3oo/TisqhcTi2XI/AAAAAAAAA-M/UKu9SXNvQV8/s1600-h/1%25255B3%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="1" alt="1" src="http://lh5.ggpht.com/-OiZDkz4A8Yk/Tisqh98yexI/AAAAAAAAA-Q/pjo3D4GtsI4/1_thumb%25255B1%25255D.png?imgmax=800" width="168" height="210" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ao abrir o arquivo de release, podemos ver que, diferentemente do web.config, o web.&lt;strong&gt;release&lt;/strong&gt;.config &lt;strong&gt;não&lt;/strong&gt; tem tantas tags, apenas instruções para as transformações das tags desejadas.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-1JiML3vq7pM/TisqiGHoMNI/AAAAAAAAA-U/Un58TIEv21M/s1600-h/2%25255B3%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="2" alt="2" src="http://lh6.ggpht.com/-WJV4BxeyYeg/TisqigxM0xI/AAAAAAAAA-Y/ZVKaGX67KhQ/2_thumb%25255B1%25255D.png?imgmax=800" width="558" height="152" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para criamos mais uma variação do web.config, primeiro criamos um cenário:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-tAb1n0tVUXY/TisqjHyFJ4I/AAAAAAAAA-c/XD5G7hK7LO0/s1600-h/3%25255B3%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="3" alt="3" src="http://lh5.ggpht.com/-1ibkgVX6AYM/TisqjryjlDI/AAAAAAAAA-g/Lcnrh4nNezE/3_thumb%25255B1%25255D.png?imgmax=800" width="250" height="202" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-2nfIE0QBTf4/TisqkPpYeZI/AAAAAAAAA-k/6_g-mVvCXf4/s1600-h/4%25255B3%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="4" alt="4" src="http://lh3.ggpht.com/-aFjLRgOzev4/TisqkjsVCAI/AAAAAAAAA-o/QMiPJrjPvYM/4_thumb%25255B1%25255D.png?imgmax=800" width="295" height="168" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Durante a criação definiremos o nome do ambiente, e também podemos definir se ele se baseará em um ambiente existente.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-KnyXUGJBMKg/TisqlKcLJYI/AAAAAAAAA-s/_EpRt3sFvCU/s1600-h/5%25255B3%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="5" alt="5" src="http://lh5.ggpht.com/-X2PZmIDyFSE/Tisqllf3ldI/AAAAAAAAA-w/CuqIOpueol8/5_thumb%25255B1%25255D.png?imgmax=800" width="317" height="169" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Com o ambiente criado, podemos adicionar o arquivo de configuração desse ambiente.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-fevuixr8XT8/Tisql6RhkmI/AAAAAAAAA-0/D06RAQrk1Mo/s1600-h/6%25255B3%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="6" alt="6" src="http://lh5.ggpht.com/-Sp5OzApOvHM/TisqmWM4mMI/AAAAAAAAA-4/yIT0ELABjTg/6_thumb%25255B1%25255D.png?imgmax=800" width="226" height="311" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-lnSvd39E7CE/TisqmzNJkbI/AAAAAAAAA-8/PF4sillEnZk/s1600-h/7%25255B3%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="7" alt="7" src="http://lh6.ggpht.com/-yvx6zOR2a3U/TisqnG8-1aI/AAAAAAAAA_A/r1QW7KDs_hA/7_thumb%25255B1%25255D.png?imgmax=800" width="183" height="76" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Vamos abrir o arquivo original e adicionarmos algumas configurações.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-F0bYGQHOFkI/TisqnhrkbmI/AAAAAAAAA_E/LitCBQ2YD0M/s1600-h/8%25255B3%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="8" alt="8" src="http://lh4.ggpht.com/-jKyAdjpP-Sc/TisqoVsDTfI/AAAAAAAAA_I/wXHg8W6f9oQ/8_thumb%25255B1%25255D.png?imgmax=800" width="532" height="267" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Observe a origem do web.config original. Ele já veio com connection string, e adicionei duas &amp;quot;appSettings&amp;quot;.&lt;/p&gt;  &lt;p&gt;Agora, definiremos o arquivo web.&lt;strong&gt;teste&lt;/strong&gt;.config assim:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt; &lt;br /&gt;&amp;lt;configuration xmlns:xdt=&amp;quot;http://schemas.microsoft.com/XML-Document-Transform&amp;quot;&amp;gt;&amp;#160;&amp;#160; &amp;lt;connectionStrings&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;add xdt:Transform=&amp;quot;RemoveAll&amp;quot; /&amp;gt;&amp;#160;&amp;#160; &amp;lt;/connectionStrings&amp;gt;&amp;#160;&amp;#160; &amp;lt;appSettings&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;add key=&amp;quot;Numero1&amp;quot; value=&amp;quot;2&amp;quot; xdt:Transform=&amp;quot;Replace&amp;quot; xdt:Locator=&amp;quot;Match(key)&amp;quot;/&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;add key=&amp;quot;Numero2&amp;quot; value=&amp;quot;3&amp;quot; xdt:Transform=&amp;quot;Replace&amp;quot; xdt:Locator=&amp;quot;Match(key)&amp;quot;/&amp;gt;&amp;#160;&amp;#160; &amp;lt;/appSettings&amp;gt;&amp;#160;&amp;#160; &amp;lt;system.web&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;compilation xdt:Transform=&amp;quot;RemoveAttributes(debug)&amp;quot; /&amp;gt;&amp;#160;&amp;#160; &amp;lt;/system.web&amp;gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/configuration&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Regras para o tranformation:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;Sempre respeite a hierarquia da tag, no exemplo das tags &amp;quot;Numero1&amp;quot; e &amp;quot;Numero2&amp;quot;, elas tem que estar dentro da tag &amp;quot;appSettings&amp;quot;.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;Para aplicar o transformation tem que usar o atributo &amp;quot;xdt:Transform&amp;quot;.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;Clique &lt;a href="http://msdn.microsoft.com/en-us/library/dd465326.aspx" target="_blank"&gt;aqui&lt;/a&gt; para obter vários exemplos de sua aplicação.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;No exemplo citado foram removidas qualquer connection string pelo &amp;quot;RemoveAll&amp;quot; e alteradas (&amp;quot;Replace&amp;quot;) algumas configurações do &amp;quot;appSettings&amp;quot;, que foram localizadas pelo atributo &amp;quot;key&amp;quot; (&amp;quot;Match(key)&amp;quot;).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Vamos gerar o build para ver se funciona? &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Então gere uma publicação:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/-5gTd1zKsu-k/Tisqo-ax6cI/AAAAAAAAA_M/0zTjN3ybx7g/s1600-h/9%25255B3%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="9" alt="9" src="http://lh4.ggpht.com/-TnZzqepB81s/TisqpdHj1AI/AAAAAAAAA_Q/FWZCPsHvcVM/9_thumb%25255B1%25255D.png?imgmax=800" width="275" height="149" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/-KAOJhPrwjQ8/Tisqp1WryVI/AAAAAAAAA_U/M0u8lul4E-A/s1600-h/10%25255B3%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="10" alt="10" src="http://lh6.ggpht.com/-NTy1kTdsUaw/Tisqqj8wxpI/AAAAAAAAA_Y/ixEsYSn3hG8/10_thumb%25255B1%25255D.png?imgmax=800" width="344" height="313" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Reparem na imagem acima, que a build configuration é a Teste, que acabamos de criar.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Após publicarmos, olhem o resultado:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh5.ggpht.com/-IkKK7GYreco/TisqrBPpw5I/AAAAAAAAA_c/hrhYfrsL1C0/s1600-h/11%25255B9%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="11" alt="11" src="http://lh3.ggpht.com/-L5Gkuf48fhg/TisqruxJv-I/AAAAAAAAA_g/bYtpBpKz_lM/11_thumb%25255B3%25255D.png?imgmax=800" width="332" height="238" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh5.ggpht.com/-JM3SwDWxHmY/TisqsAFBUbI/AAAAAAAAA_k/31lXKkejEvI/s1600-h/12%25255B7%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="12" alt="12" src="http://lh5.ggpht.com/-rI8uQKggFk4/TisqstKDqsI/AAAAAAAAA_o/XpznX3p7APw/12_thumb%25255B3%25255D.png?imgmax=800" width="292" height="197" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Temos um novo web.config transformado/mesclado.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;E isso se reproduz quando utilizamos o mecanismo de build do &lt;a href="http://msdn.microsoft.com/en-US/vstudio/ff637362" target="_blank"&gt;TFS&lt;/a&gt;. Mas esse caso fica para a próxima! &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-openmouthedsmile" alt="Smiley de boca aberta" src="http://lh5.ggpht.com/-1fzgt2kB0PE/TisqtIfV6KI/AAAAAAAAA_s/QqdnN2XPtnM/wlEmoticon-openmouthedsmile%25255B2%25255D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-4400144133116124812?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/4400144133116124812/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=4400144133116124812&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/4400144133116124812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/4400144133116124812'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2011/07/transformation-de-webconfig.html' title='Transformation de web.config'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-flZoLicsrE8/Tisqg9LyKFI/AAAAAAAAA-I/L-_F74SEkpA/s72-c/ultimate_bumblebee_thumb%25255B1%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-1420458175439707452</id><published>2011-07-21T22:36:00.001-03:00</published><updated>2011-07-21T22:44:02.182-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Fonética + SQL Server</title><content type='html'>&lt;p&gt;&lt;a href="http://lh4.ggpht.com/-8ZLbRSPOqk0/TijT2Zm-E8I/AAAAAAAAA8w/es4jNeWpU1Y/s1600-h/1%25255B3%25255D.png" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="1" alt="1" src="http://lh5.ggpht.com/-_yy1MQQanHI/TijT3S3HIaI/AAAAAAAAA80/k-A87kSA2Jc/1_thumb%25255B1%25255D.png?imgmax=800" width="317" height="220" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;b&gt;&lt;a href="http://www.priberam.pt/dlpo/default.aspx?pal=fon%C3%A9tica" target="_blank"&gt;fonética&lt;/a&gt;&lt;/b&gt;       &lt;br /&gt;(francês &lt;i&gt;phonétique&lt;/i&gt;)&lt;/p&gt;    &lt;p&gt;&lt;i&gt;s. f.&lt;/i&gt;&lt;/p&gt;    &lt;p&gt;1. [Linguística]&amp;#160; Parte da linguística que trata dos sons articulados, considerados do ponto de vista físico, acústico e articulatório, como elementos dos vocábulos.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Essa é a definição do dicionário, mas basicamente a fonética é um &amp;quot;ramo&amp;quot; que estuda a pronuncia de uma palavra, visto que há diferenças entre a escrita e a pronuncia. Por exemplo, quantas maneiras podemos escrever o nome Wilham?&lt;/p&gt;  &lt;p&gt;Wilian, Willian, Uyliam… Ainda mais no Brasil, e por falar nisso aqui há uma &amp;quot;limitação&amp;quot;, a fonética é fortemente vinculada a língua. No brasil o som da letra &amp;quot;i&amp;quot; é um, nos EUA é outro… &lt;em&gt;Ai&lt;/em&gt;!&lt;/p&gt;  &lt;p&gt;Voltando aos nomes, no exemplo citado o som pode ser &amp;quot;fielmente&amp;quot; definido como &amp;quot;uiliam&amp;quot;, então, na teoria, teríamos que bolar algum algoritmo para gerar o fonema da palavra, e nesse caso, independente da maneira como o nome for escrito, o resultado fonético seria o mesmo.&lt;/p&gt;  &lt;p&gt;Complicado não!? Mas a boa notícia é que existem inúmeros estudos para gerar essa solução. Um deles é o &lt;a href="http://en.wikipedia.org/wiki/Soundex" target="_blank"&gt;Soundex&lt;/a&gt;. Criado em 1918, por Robert C. Russell e Margaret K. Odell. Esse algoritmo gera uma chave baseada na primeira letra e três números, &amp;quot;calculados&amp;quot; pelas letras na sequencia. Nesse algoritmo, o nosso Willian, viraria W450, e suas variações também.&lt;/p&gt;  &lt;p&gt;O &lt;a href="http://msdn.microsoft.com/pt-br/sqlserver" target="_blank"&gt;SQL Server&lt;/a&gt; já implementa nativamente o &lt;a href="http://msdn.microsoft.com/pt-br/library/ms187384.aspx" target="_blank"&gt;Soundex&lt;/a&gt;. Veja os exemplos a seguir:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-1h6bSVsHz9U/TijT3q_uReI/AAAAAAAAA84/sr0eutj5yOo/s1600-h/2%25255B4%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="2" alt="2" src="http://lh3.ggpht.com/-2HTGDjXqcaE/TijT4fflhxI/AAAAAAAAA88/a4jhAGnp-I8/2_thumb%25255B2%25255D.png?imgmax=800" width="211" height="237" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Mas como &amp;quot;alegria de pobre dura pouco&amp;quot;… Há alguns poréns, primeiramente o Soundex é um algoritmo que funciona muito bem com a língua inglesa. Como disse anteriormente a fonética é extremamente ligada a sua língua. Palavras compostas e alguns casos da língua portuguesa não se dão muito bem com essa implementação do Soundex. Veja:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/--Gltbipd_44/TijT42ksZbI/AAAAAAAAA9A/ylS_wWVUEDo/s1600-h/3%25255B3%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="3" alt="3" src="http://lh4.ggpht.com/-9NlQ1MlYd9s/TijT5TKG-ZI/AAAAAAAAA9E/7R-iVBayO34/3_thumb%25255B1%25255D.png?imgmax=800" width="212" height="175" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Vamos superar esse #mimimi!? Primeiramente vamos implementar o Soundex em C# e depois implementar adaptações necessárias para a nossa língua.&lt;/p&gt;  &lt;p&gt;A base para isso foi tirada da revista &lt;a href="http://www.mundodotnet.com.br" target="_blank"&gt;Mundo .NET&lt;/a&gt; número 26, Casos de sucesso – Pesquisa Fonética em português; Tribunal de Justiça de Mato Grosso do Sul. Nesse caso o tribunal tinha problemas em localizar pessoas no sistema pelo nome. Antes da solução era preciso de informar o nome exato para o sistema buscar as informações. &lt;/p&gt;  &lt;p&gt;Vamos definir alguns métodos para a implementação básica do Soundex:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre class="csharpcode"&gt;    &lt;span class="rem"&gt;// -&amp;gt; Obtem o soudex de uma string&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetSoundex(&lt;span class="kwrd"&gt;string&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = &lt;span class="kwrd"&gt;value&lt;/span&gt;.ToUpper(); &lt;span class="rem"&gt;// -&amp;gt; Normaliza letras em Maiuscula&lt;/span&gt;&lt;br /&gt;        var result = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder();&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;char&lt;/span&gt; item &lt;span class="kwrd"&gt;in&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;)&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;char&lt;/span&gt;.IsLetter(item)) &lt;span class="rem"&gt;// -&amp;gt; Limpa String&lt;/span&gt;&lt;br /&gt;                AddCharacter(result, item); &lt;span class="rem"&gt;// -&amp;gt; Adiciona um char Soudex&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span class="rem"&gt;// -&amp;gt; Limpa as exceções geradas&lt;/span&gt;&lt;br /&gt;        result.Replace(&lt;span class="str"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty);&lt;br /&gt;        &lt;span class="rem"&gt;// -&amp;gt; Arruma o tamanho no padrão soudex &lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;//      4 caracteres.&lt;/span&gt;&lt;br /&gt;        FixLength(result);&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; result.ToString();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;// -&amp;gt; Preenche com 0 nos casos menor q quatro,&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;//      ou pega os 4 primeiros caracteres.&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; FixLength(StringBuilder result)&lt;br /&gt;    {&lt;br /&gt;        var length = result.Length;&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (length &amp;lt; 4)&lt;br /&gt;            result.Append(&lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;(&lt;span class="str"&gt;'0'&lt;/span&gt;, 4 - length));&lt;br /&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br /&gt;            result.Length = 4;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;// -&amp;gt; Adiciona o caractere soudex, cuidando para não repetir.&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; AddCharacter(StringBuilder result, &lt;span class="kwrd"&gt;char&lt;/span&gt; item)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (result.Length == 0)&lt;br /&gt;        {&lt;br /&gt;            result.Append(item);&lt;br /&gt;        }&lt;br /&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            var code = GetSoundexDigit(item);&lt;br /&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (code != result[result.Length - 1].ToString())&lt;br /&gt;                result.Append(code);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;// -&amp;gt; Algoritmo de substituição padrão Soudex.&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetSoundexDigit(&lt;span class="kwrd"&gt;char&lt;/span&gt; item)&lt;br /&gt;    {&lt;br /&gt;        var charString = item.ToString();&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="str"&gt;&amp;quot;BFPV&amp;quot;&lt;/span&gt;.Contains(charString))&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;;&lt;br /&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="str"&gt;&amp;quot;CGJKQSXZ&amp;quot;&lt;/span&gt;.Contains(charString))&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;2&amp;quot;&lt;/span&gt;;&lt;br /&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="str"&gt;&amp;quot;DT&amp;quot;&lt;/span&gt;.Contains(charString))&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;3&amp;quot;&lt;/span&gt;;&lt;br /&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="str"&gt;&amp;quot;L&amp;quot;&lt;/span&gt;.Contains(charString))&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;4&amp;quot;&lt;/span&gt;;&lt;br /&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="str"&gt;&amp;quot;MN&amp;quot;&lt;/span&gt;.Contains(charString))&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;5&amp;quot;&lt;/span&gt;;&lt;br /&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="str"&gt;&amp;quot;R&amp;quot;&lt;/span&gt;.Contains(charString))&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;6&amp;quot;&lt;/span&gt;;&lt;br /&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;;&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Como a língua portuguesa dispões de muita &lt;strike&gt;sujeira e quinquilharia&lt;/strike&gt; acentos e símbolos, temos de tratá-las com as funções a seguir:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;  &lt;pre class="csharpcode"&gt;    &lt;span class="rem"&gt;// -&amp;gt; Recebe várias letras, separadas por virgula, para serem substituídas por uma letra específica.&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; ReplaceMultiplo(&lt;span class="kwrd"&gt;string&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt; from, &lt;span class="kwrd"&gt;string&lt;/span&gt; to)&lt;br /&gt;    {&lt;br /&gt;        var fromPattern = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;({0})&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;.Join(&lt;span class="str"&gt;&amp;quot;)|(&amp;quot;&lt;/span&gt;, from.Split(&lt;span class="str"&gt;','&lt;/span&gt;))).Replace(&lt;span class="str"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;@&amp;quot;\.&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; Regex.Replace(&lt;span class="kwrd"&gt;value&lt;/span&gt;, fromPattern, to);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetSoundexBR(&lt;span class="kwrd"&gt;string&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = &lt;span class="kwrd"&gt;value&lt;/span&gt;.ToUpper();&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Á,À,Ã,Â,Ä&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;A&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;É,È,Ê,Ë&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;E&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Í,Ì,Î,Ï&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;I&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Ó,Ò,Ö,Õ,Ô&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;O&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Ú,Ù,Û,Ü&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;U&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;.,-,&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;0,1,2,3,4,5,6,7,8,9,0&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Y&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;I&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;PH&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;F&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;GE&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;JE&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;GI&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;JI&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;CA&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;KA&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;CE&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;SE&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;CI&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;SI&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;CO&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;KO&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;CU&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;KU&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Ç&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;S&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;WAS&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;WS&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;WA&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;VA&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;WO&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;VO&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;WU&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;VU&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;WI&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;UI&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;span class="rem"&gt;// -&amp;gt; Depois de tratar a lingua portuguesa&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;//      Geramos o soudex padrão.&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = GetSoundex(&lt;span class="kwrd"&gt;value&lt;/span&gt;); &lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Agora vem uma parte legal, vamos implementar isso diretamente no SQL Server, usando a &lt;a href="http://msdn.microsoft.com/en-us/library/ms254498(v=vs.80).aspx" target="_blank"&gt;CLR do SQL Server&lt;/a&gt;, ou seja, a vantagem do SQL Server utilizar o &lt;a href="http://www.microsoft.com/net/" target="_blank"&gt;.NET Framework&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Para tal, vamos habilitar a execução da CLR executando os comando a seguir no SQL Server:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;  &lt;pre class="csharpcode"&gt;sp_configure &lt;span class="str"&gt;'clr'&lt;/span&gt;, 1&lt;br /&gt;go&lt;br /&gt;RECONFIGURE&lt;br /&gt;go     &lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Em seguida crie no Visual Studio um projeto para o SQL Server:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/-C8CTBu19VJ8/TijT52zGnUI/AAAAAAAAA9I/K1Bz5G3dFaQ/s1600-h/4%25255B3%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="4" alt="4" src="http://lh4.ggpht.com/-xuiTY6ZSeg0/TijT66eYP9I/AAAAAAAAA9M/xnpKA4A_qOk/4_thumb%25255B1%25255D.png?imgmax=800" width="484" height="296" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Após isso o Visual Studio pede para se conectar a base onde a CLR será implantada:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/-pAhTDxwvEC8/TijT7VbVebI/AAAAAAAAA9Q/wr77AyD2FDg/s1600-h/SNAGHTML98a862%25255B4%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="SNAGHTML98a862" alt="SNAGHTML98a862" src="http://lh6.ggpht.com/-ow3igyZQBmU/TijT7wZ6apI/AAAAAAAAA9U/uMX8zeunuuw/SNAGHTML98a862_thumb%25255B1%25255D.png?imgmax=800" width="260" height="268" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;O projeto já vem estruturado para o SQL Server e com exemplos de teste:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/-rSRoePDd910/TijT8bm0hGI/AAAAAAAAA9Y/42AFBHmefhw/s1600-h/image%25255B3%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh4.ggpht.com/-bFNKBG0rTeQ/TijT85igLNI/AAAAAAAAA9c/4hxdloGjzSk/image_thumb%25255B1%25255D.png?imgmax=800" width="331" height="170" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Nesse projeto existem várias opções prontas para implementar muitas das funcionalidades do banco de dados. Aqui usaremos uma Function:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/-Go6XSW2P1EQ/TijT9WXyVbI/AAAAAAAAA9g/2jmRF4RLELA/s1600-h/image%25255B8%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh5.ggpht.com/-pn0fQwbnlhA/TijT-CgAZGI/AAAAAAAAA9k/hyVwDduw-G4/image_thumb%25255B4%25255D.png?imgmax=800" width="426" height="291" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Cada método que deverá ser função tem que ser decorado com o atributo &amp;quot;[Microsoft.SqlServer.Server.SqlFunction]&amp;quot;. Outro ponto importante é que é possível trabalhar com os tipos do SQL Server. Eles são fundamentais para receber entradas e devolver as saídas.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Resta fazer os métodos que serão reconhecidas pelo SQL Server, ou seja, decoradas com o atributo citado acima. A classe final fica assim:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Data.SqlTypes;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text.RegularExpressions;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; UserDefinedFunctions&lt;br /&gt;{&lt;br /&gt;    &lt;span class="rem"&gt;/*&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     para ligar o clr no sql server:&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;        sp_configure 'clr', 1&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;        go&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;        RECONFIGURE&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;        go     &lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;     */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    [Microsoft.SqlServer.Server.SqlFunction]&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; SqlString SoundexBR(SqlString &lt;span class="kwrd"&gt;value&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        StringBuilder palavras = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder();&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = NormalizarEspacos(&lt;span class="kwrd"&gt;value&lt;/span&gt;);&lt;br /&gt;        &lt;br /&gt;        var valorNormalizado = &lt;span class="kwrd"&gt;value&lt;/span&gt;.ToString();&lt;br /&gt;&lt;br /&gt;        &lt;span class="rem"&gt;// -&amp;gt; Gera o Soundex de cada palavra da string&lt;/span&gt;&lt;br /&gt;        valorNormalizado.Split(&lt;span class="str"&gt;' '&lt;/span&gt;).ToList().ForEach(palavra =&amp;gt; palavras.Append(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;{0} &amp;quot;&lt;/span&gt;, GetSoundexBR(palavra))));&lt;br /&gt;&lt;br /&gt;        &lt;span class="rem"&gt;// -&amp;gt; Retorna o tipo string do SQL Server&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; SqlString(palavras.ToString().Trim());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;// -&amp;gt; Retira espaços excedentes.&lt;/span&gt;&lt;br /&gt;    [Microsoft.SqlServer.Server.SqlFunction]&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; SqlString NormalizarEspacos(SqlString &lt;span class="kwrd"&gt;value&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        var result = &lt;span class="kwrd"&gt;value&lt;/span&gt;.ToString().Trim();&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;while&lt;/span&gt; (result.Contains(&lt;span class="str"&gt;&amp;quot;  &amp;quot;&lt;/span&gt;))&lt;br /&gt;            result = result.Replace(&lt;span class="str"&gt;&amp;quot;  &amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot; &amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; SqlString(result);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;// -&amp;gt; Recebe várias letras, separadas por virgula, para serem substituídas por uma letra específica.&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; ReplaceMultiplo(&lt;span class="kwrd"&gt;string&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt; from, &lt;span class="kwrd"&gt;string&lt;/span&gt; to)&lt;br /&gt;    {&lt;br /&gt;        var fromPattern = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;({0})&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;.Join(&lt;span class="str"&gt;&amp;quot;)|(&amp;quot;&lt;/span&gt;, from.Split(&lt;span class="str"&gt;','&lt;/span&gt;))).Replace(&lt;span class="str"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;@&amp;quot;\.&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; Regex.Replace(&lt;span class="kwrd"&gt;value&lt;/span&gt;, fromPattern, to);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetSoundexBR(&lt;span class="kwrd"&gt;string&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = &lt;span class="kwrd"&gt;value&lt;/span&gt;.ToUpper();&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Á,À,Ã,Â,Ä&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;A&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;É,È,Ê,Ë&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;E&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Í,Ì,Î,Ï&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;I&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Ó,Ò,Ö,Õ,Ô&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;O&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Ú,Ù,Û,Ü&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;U&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;.,-,&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;0,1,2,3,4,5,6,7,8,9,0&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Y&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;I&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;PH&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;F&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;GE&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;JE&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;GI&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;JI&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;CA&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;KA&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;CE&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;SE&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;CI&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;SI&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;CO&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;KO&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;CU&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;KU&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Ç&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;S&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;WAS&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;WS&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;WA&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;VA&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;WO&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;VO&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;WU&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;VU&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = ReplaceMultiplo(&lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;WI&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;UI&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;span class="rem"&gt;// -&amp;gt; Depois de tratar a lingua portuguesa&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;//      Geramos o soudex padrão.&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = GetSoundex(&lt;span class="kwrd"&gt;value&lt;/span&gt;); &lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;// -&amp;gt; Obtem o soudex de uma string&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetSoundex(&lt;span class="kwrd"&gt;string&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;value&lt;/span&gt; = &lt;span class="kwrd"&gt;value&lt;/span&gt;.ToUpper(); &lt;span class="rem"&gt;// -&amp;gt; Normaliza letras em Maiuscula&lt;/span&gt;&lt;br /&gt;        var result = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder();&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;char&lt;/span&gt; item &lt;span class="kwrd"&gt;in&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;)&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;char&lt;/span&gt;.IsLetter(item)) &lt;span class="rem"&gt;// -&amp;gt; Limpa String&lt;/span&gt;&lt;br /&gt;                AddCharacter(result, item); &lt;span class="rem"&gt;// -&amp;gt; Adiciona um char Soudex&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span class="rem"&gt;// -&amp;gt; Limpa as exceções geradas&lt;/span&gt;&lt;br /&gt;        result.Replace(&lt;span class="str"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty);&lt;br /&gt;        &lt;span class="rem"&gt;// -&amp;gt; Arruma o tamanho no padrão soudex &lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;//      4 caracteres.&lt;/span&gt;&lt;br /&gt;        FixLength(result);&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; result.ToString();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;// -&amp;gt; Preenche com 0 nos casos menor q quatro,&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;//      ou pega os 4 primeiros caracteres.&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; FixLength(StringBuilder result)&lt;br /&gt;    {&lt;br /&gt;        var length = result.Length;&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (length &amp;lt; 4)&lt;br /&gt;            result.Append(&lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;(&lt;span class="str"&gt;'0'&lt;/span&gt;, 4 - length));&lt;br /&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br /&gt;            result.Length = 4;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;// -&amp;gt; Adiciona o caractere soudex, cuidando para não repetir.&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; AddCharacter(StringBuilder result, &lt;span class="kwrd"&gt;char&lt;/span&gt; item)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (result.Length == 0)&lt;br /&gt;        {&lt;br /&gt;            result.Append(item);&lt;br /&gt;        }&lt;br /&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            var code = GetSoundexDigit(item);&lt;br /&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (code != result[result.Length - 1].ToString())&lt;br /&gt;                result.Append(code);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;// -&amp;gt; Algoritmo de substituição padrão Soudex.&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetSoundexDigit(&lt;span class="kwrd"&gt;char&lt;/span&gt; item)&lt;br /&gt;    {&lt;br /&gt;        var charString = item.ToString();&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="str"&gt;&amp;quot;BFPV&amp;quot;&lt;/span&gt;.Contains(charString))&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;;&lt;br /&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="str"&gt;&amp;quot;CGJKQSXZ&amp;quot;&lt;/span&gt;.Contains(charString))&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;2&amp;quot;&lt;/span&gt;;&lt;br /&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="str"&gt;&amp;quot;DT&amp;quot;&lt;/span&gt;.Contains(charString))&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;3&amp;quot;&lt;/span&gt;;&lt;br /&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="str"&gt;&amp;quot;L&amp;quot;&lt;/span&gt;.Contains(charString))&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;4&amp;quot;&lt;/span&gt;;&lt;br /&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="str"&gt;&amp;quot;MN&amp;quot;&lt;/span&gt;.Contains(charString))&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;5&amp;quot;&lt;/span&gt;;&lt;br /&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="str"&gt;&amp;quot;R&amp;quot;&lt;/span&gt;.Contains(charString))&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;6&amp;quot;&lt;/span&gt;;&lt;br /&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;};&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Pronto. Para testar coloque a chamada SQL no arquivo &amp;quot;Test.sql&amp;quot;, veja:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/-N7AZEZNr0Cc/TijT-ju8fwI/AAAAAAAAA9o/KHLvKXIE9R0/s1600-h/image%25255B12%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh6.ggpht.com/-Pw-Sj2MVsPw/TijT_WZw55I/AAAAAAAAA9s/HO2M4yPSsSo/image_thumb%25255B6%25255D.png?imgmax=800" width="359" height="119" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;quot;Dá o play macaco&amp;quot; #Cruj… E começa o deploy no banco de dados, veja o resultado:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/-ljPtlb1xrMY/TijUAP9CUlI/AAAAAAAAA9w/c-w6kzpep4s/s1600-h/image%25255B16%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh5.ggpht.com/-kjmQe8NhGFY/TijUAotqzbI/AAAAAAAAA90/dXFRTuifPog/image_thumb%25255B8%25255D.png?imgmax=800" width="187" height="156" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Como podemos observar na imagem acima, o fonema é apresentado na janela de output, e como a dll já está instalada no SQL Server podemos testar diretamente nele:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/-iRFqWEP2gsY/TijUBsS75mI/AAAAAAAAA94/1nkGmIz8gqU/s1600-h/image%25255B20%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh5.ggpht.com/-B-J-BEfKbtg/TijUCPLc5NI/AAAAAAAAA98/iSeiWP25o24/image_thumb%25255B10%25255D.png?imgmax=800" width="289" height="186" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Podemos aplicá-la em tabelas&amp;#160; e views normalmente! O desempenho é muito superior comparada a uma implementação onde os dados são recuperados e processados por uma aplicação externa. Códigos .NET rodando diretamente na CLR do SQL Server são muito eficazes.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;O Soundex é uma dos estudos disponíveis. Existe também o algoritmo &lt;a href="http://pt.scribd.com/doc/38615737/BuscaBR-Fonetica" target="_blank"&gt;BuscaBR&lt;/a&gt;, mas esse fica para uma outra oportunidade &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-openmouthedsmile" alt="Smiley de boca aberta" src="http://lh4.ggpht.com/-kEhxKSM6FtA/TijUCinV2fI/AAAAAAAAA-A/Vy2zU_7tZns/wlEmoticon-openmouthedsmile%25255B2%25255D.png?imgmax=800" /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Obrigado, abraços.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-1420458175439707452?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/1420458175439707452/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=1420458175439707452&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/1420458175439707452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/1420458175439707452'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2011/07/fonetica-sql-server.html' title='Fonética + SQL Server'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-_yy1MQQanHI/TijT3S3HIaI/AAAAAAAAA80/k-A87kSA2Jc/s72-c/1_thumb%25255B1%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-4402766551676552815</id><published>2011-07-20T22:06:00.001-03:00</published><updated>2011-07-20T22:06:03.457-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><title type='text'>Gerenciando Workspaces no TFS</title><content type='html'>&lt;p&gt;Pessoal, estou aproveitando essa minha volta ao blog para torná-lo mais constante, com mais postagens. Para fazer isso estou escrevendo dicas sobre o trabalho que executo como arquiteto de software na área de ALM com a plataforma do Microsoft Visual Studio Team Foundation (&lt;a href="http://msdn.microsoft.com/en-US/vstudio/ff637362" target="_blank"&gt;TFS&lt;/a&gt;). E estou escrevendo essas dicas de uma forma mais objetiva e resumida, com textos mais curtos e focados. &lt;/p&gt;  &lt;p&gt;Antes a perfeição pelos textos longos e complexos abatia meu entusiasmo, e como dizem: o perfeito é inimigo do bom. Agora que superei isso, lá vai:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms181383(VS.80).aspx" target="_blank"&gt;Workspace&lt;/a&gt;, como o nome já diz, são espaços de trabalho que o &lt;a href="http://msdn.microsoft.com/library/ms181368.aspx" target="_blank"&gt;Version Control&lt;/a&gt; vincula a um usuário e máquina. Assim quando o usuário &amp;quot;empresa\Astoufo&amp;quot; baixa um código fonte no computador com nome &amp;quot;EstacaoTrabalho22&amp;quot;, será criado esse workspace: &amp;quot;EstacaoTrabalho22;empresa\Astoufo&amp;quot;. É possível que um usuário tenha vários workspaces:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-mCu6ypOnMZA/Tid7YdeFtHI/AAAAAAAAA8E/Fx367eVjcbE/s1600-h/workspacedropdown_sce_thumb%25255B3%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="workspacedropdown_sce_thumb" alt="workspacedropdown_sce_thumb" src="http://lh4.ggpht.com/-u8IUN15x0AY/Tid7ZCMwTTI/AAAAAAAAA8I/LXDAhJj8PEg/workspacedropdown_sce_thumb_thumb%25255B1%25255D.png?imgmax=800" width="379" height="197" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-rPXmBQmpkuM/Tid7Z8J0oSI/AAAAAAAAA8M/RAY7sVkGdOs/s1600-h/edit_publiclimited_thumb%25255B7%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="edit_publiclimited_thumb" alt="edit_publiclimited_thumb" src="http://lh6.ggpht.com/-55KP3eoVHeA/Tid7at5cX8I/AAAAAAAAA8Q/cVjpgAeQEpE/edit_publiclimited_thumb_thumb%25255B2%25255D.png?imgmax=800" width="445" height="283" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Assim, toda vez que for necessário baixar um código do Source Control para uma máquina diferente, é criado esse espaço de mapeamento local, onde os arquivos estarão disponíveis para o trabalho, e depois de tudo pronto, as alterações serão sincronizadas com o servidor (&lt;a href="http://msdn.microsoft.com/en-us/library/bb668980.aspx" target="_blank"&gt;check-in&lt;/a&gt;). Esse local é um workspace.&lt;/p&gt;  &lt;p&gt;Hoje no trabalho, um colaborador da equipe de desenvolvimento me procurou. Ele me relatou que estava assumindo uma antiga máquina, de um desenvolvedor que já havia se desligado, e ao tentar baixar o código fonte do projeto para a máquina, houve um conflito de workspace, pois o workspace do antigo funcionário estava vinculado para aquela máquina. Algo como isso:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-rqSdmIgRxsY/Tid7bClMF7I/AAAAAAAAA8U/46KzkCIUe5g/s1600-h/clip_image001_2%25255B2%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="clip_image001_2" alt="clip_image001_2" src="http://lh3.ggpht.com/-mebT-vZAJWk/Tid7bt_tU-I/AAAAAAAAA8Y/YaaW8hu2J9A/clip_image001_2_thumb.png?imgmax=800" width="316" height="154" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Nessa hora entra em ação esses dois comandos do TFS: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;tf workspaces: mostra informações dos workspaces.&lt;/li&gt;    &lt;li&gt;tf workspace: manipula workspaces (cria, apaga etc.).&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;É necessário estar no prompt do Visual Studio para executar esses comandos, onde são carregados funcionalidades inerentes ao TFS.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-S0r94lfN-TI/Tid7cR0n-vI/AAAAAAAAA8c/NJpQCGSYzg4/s1600-h/image%25255B3%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh4.ggpht.com/-gN39f2XGMAQ/Tid7c8wtZaI/AAAAAAAAA8g/1rPpaocCQk0/image_thumb%25255B1%25255D.png?imgmax=800" width="242" height="311" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Então executamos o seguinte comando para listar os workspaces de um determinado login:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;tf workspaces /owner:domínio\usuário&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Após analisar a lista, exclua os workspaces necessários com esse comando:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;tf workspace /delete /collection:http://servidordotfs:8080/tfs/defaultcollection NOME_DO_COMPUTADOR;domínio\usuário&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Assim temos um usuário satisfeito, nesse caso o desenvolvedor, e a limpa do(s) workspace(s) necessário(s), como mostrado na próxima imagem:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-t5lsepTt4xU/Tid7dt8hAwI/AAAAAAAAA8k/1hkfX8_v_3w/s1600-h/20-07-2011%25252016-13-22%25255B3%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="20-07-2011 16-13-22" alt="20-07-2011 16-13-22" src="http://lh3.ggpht.com/-r6FwzN9uPF4/Tid7eT2WLgI/AAAAAAAAA8o/VmEAdv5nEQE/20-07-2011%25252016-13-22_thumb%25255B1%25255D.png?imgmax=800" width="465" height="236" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Repare pela seta na parte inferior da imagem, que é possível verificar se há pendencias (arquivos que ainda estão em &amp;quot;&lt;a href="http://blogs.msdn.com/b/jasonba/archive/2009/08/18/some-benefits-of-checkout-in-tfs-version-control.aspx" target="_blank"&gt;check-out&lt;/a&gt;&amp;quot;). Nesse caso não havia, mas caso houvesse é possível &amp;quot;liberar&amp;quot; as pendências… Mas isso fica para um futuro post &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Alegre" src="http://lh3.ggpht.com/-D6j4EFnDFVM/Tid7erRd4GI/AAAAAAAAA8s/HoVpLqqecck/wlEmoticon-smile%25255B2%25255D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-4402766551676552815?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/4402766551676552815/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=4402766551676552815&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/4402766551676552815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/4402766551676552815'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2011/07/gerenciando-workspaces-no-tfs.html' title='Gerenciando Workspaces no TFS'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-u8IUN15x0AY/Tid7ZCMwTTI/AAAAAAAAA8I/LXDAhJj8PEg/s72-c/workspacedropdown_sce_thumb_thumb%25255B1%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-3837676089694177940</id><published>2011-07-18T22:51:00.001-03:00</published><updated>2011-07-18T22:51:10.449-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='off-topic'/><title type='text'>Novidades</title><content type='html'>&lt;p align="center"&gt;&lt;a href="http://lh4.ggpht.com/-1K0iTa0oFss/TiTjCf76LmI/AAAAAAAAA74/gwKPOu9XuM0/s1600-h/news%25255B3%25255D.gif" target="_blank"&gt;&lt;img style="display: inline" title="news" alt="news" src="http://lh3.ggpht.com/-mcaxZj2tat8/TiTjC2rzAvI/AAAAAAAAA78/S7DJxwYKRHs/news_thumb%25255B1%25255D.gif?imgmax=800" width="126" height="136" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Pessoal, após um longo hiato, estou de volta com o blog, e espero que ele ganhe cada vez mais folego!&lt;/p&gt;  &lt;p&gt;Depois de postar meu currículo por aqui, grandes oportunidades surgiram e surgem a cada dia, e com tudo isso foi difícil conciliar todas as novidades.&lt;/p&gt;  &lt;p&gt;Ainda estou lidando com muitas transições, mas para quem acompanha a revista &lt;a href="http://www.mundodotnet.com.br" target="_blank"&gt;Mundo .NET&lt;/a&gt; já pode perceber que voltei a ativa na comunidade. Nela estou no grupo de revisores técnicos e volta e meia com artigos inovadores.&lt;/p&gt;  &lt;p&gt;Agora estou morando em Curitiba/PR. Saindo de Maringá/PR, após um agradável trabalho desenvolvido na &lt;a href="www.wra.com.br" target="_blank"&gt;WRA&lt;/a&gt;, e muitas aulas empolgantes no &lt;a href="www.cesumar.br" target="_blank"&gt;CESUMAR&lt;/a&gt;, agora busco novos desafios na &lt;a href="www.techresult.com.br" target="_blank"&gt;TechResult&lt;/a&gt;. Estou muito ligado nos trabalhos envolvendo Arquitetura de Software, ALM e a plataforma &lt;a href="http://msdn.microsoft.com/en-US/vstudio/ff637362" target="_blank"&gt;TFS&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Por uma lado &amp;quot;perdi&amp;quot; o mestrado da UEM. Acredito que na verdade foi um rumo que minha carreira tomou, onde o mercado exigiu o conhecimento que já tinha de imediato e me ofereceu boas oportunidades, recompensas e perspectivas por isso.&lt;/p&gt;  &lt;p&gt;Mas agora eu tenho novas ideias, estou estudando muito, e assuntos diferentes. O mais legal é que a minha maneira de estudar é justamente expondo o que aprendo, e como o intuito do blog é esse, tudo canalizará aqui. Por isso vou passar um tempo reformulando-o, agora com a &amp;quot;cara mais eduardo spaki&amp;quot;.&lt;/p&gt;  &lt;p&gt;É isso daí, vamos crescer juntos &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-openmouthedsmile" alt="Smiley de boca aberta" src="http://lh3.ggpht.com/-9kbhEGWgA9A/TiTjDeVFbHI/AAAAAAAAA8A/SgV_Ci1ZKXU/wlEmoticon-openmouthedsmile%25255B2%25255D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-3837676089694177940?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/3837676089694177940/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=3837676089694177940&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/3837676089694177940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/3837676089694177940'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2011/07/novidades.html' title='Novidades'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-mcaxZj2tat8/TiTjC2rzAvI/AAAAAAAAA78/S7DJxwYKRHs/s72-c/news_thumb%25255B1%25255D.gif?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-7542351282290817365</id><published>2011-07-18T20:58:00.001-03:00</published><updated>2011-07-19T23:54:55.093-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><title type='text'>Auditoria no TFS - PT I</title><content type='html'>&lt;p&gt;Um dos recursos e premissas mais interessantes do &lt;a href="http://msdn.microsoft.com/en-US/vstudio/ff637362" target="_blank"&gt;TFS&lt;/a&gt; é sua auditoria, pois maioria das operações sobre a plataforma são salvas e versionadas.&lt;/p&gt;  &lt;p&gt;O &lt;a href="http://msdn.microsoft.com/library/ms181368.aspx" target="_blank"&gt;Version Control&lt;/a&gt; é o pilar do TFS responsável pelo controle, versionamento e distribuição dos arquivos, principalmente códigos, dos projetos de software.&lt;/p&gt;  &lt;p&gt;Durante o dia-a-dia de administração de servidores TFS, as pessoas me abordam com perguntas similares a estas:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Quais são os arquivos que estão alocados/bloqueados de um projeto? &lt;/li&gt;    &lt;li&gt;Quais arquivos estão alocados/bloqueados para um determinado usuário? &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Geralmente para responder essas perguntas eu sigo os passos a seguir:&lt;/p&gt;  &lt;p&gt;Abrir o Source Control do projeto, pela janela do &lt;a href="http://msdn.microsoft.com/en-us/library/ms181304(v=VS.90).aspx" target="_blank"&gt;Team Explorer&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-QShPEwmqjz0/TiTImNXJHRI/AAAAAAAAA7I/5YZDfJpewws/s1600-h/1%25255B5%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="1" alt="1" src="http://lh4.ggpht.com/-1FnvCA00zHk/TiTImih9UgI/AAAAAAAAA7M/Bh3UKqqP5pQ/1_thumb%25255B3%25255D.png?imgmax=800" width="191" height="224" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Após encontrar a pasta do projeto, clico com o botão direito na mesma clico em &amp;quot;Find in Source Control&amp;quot; &amp;gt; &amp;quot;Status&amp;quot;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-3G3SzNUy1D8/TiTIngSXXJI/AAAAAAAAA7Q/jrq4IOpgjns/s1600-h/2%25255B5%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="2" alt="2" src="http://lh3.ggpht.com/-ZMnJJX9_9Ho/TiTIoVyBDfI/AAAAAAAAA7U/9XeHZjHE8Q8/2_thumb%25255B3%25255D.png?imgmax=800" width="312" height="374" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;As duas opções acima (Status e Wildcard) remetem a mesma tela.    &lt;br /&gt;Para exibir todos os arquivos que estão alocados para algum usuário, configuro a opção &amp;quot;Display all checked out&amp;quot;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-ZNWphCDZevs/TiTIo-QT7-I/AAAAAAAAA7Y/Ss7Q4TN9wWo/s1600-h/3%25255B5%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="3" alt="3" src="http://lh5.ggpht.com/-BNfvTPE5xH4/TiTIptbGNNI/AAAAAAAAA7c/a3JuqTxzfy0/3_thumb%25255B3%25255D.png?imgmax=800" width="334" height="207" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;O resultado aponta cinco arquivos com dois usuários. Todas as informações necessárias para &amp;quot;destravar&amp;quot; os arquivos, caso necessário, estão disponíveis no resultado dessa busca.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-zPjzVme9bPE/TiTIqP4qpSI/AAAAAAAAA7g/c5mS3oB-_7A/s1600-h/4%25255B4%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="4" alt="4" src="http://lh5.ggpht.com/-QZ4CP-WUKMI/TiTIq5yZyvI/AAAAAAAAA7k/DMGiMK1dspc/4_thumb%25255B2%25255D.png?imgmax=800" width="488" height="124" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para encontrar os arquivos alocados para um determinado usuário, e que contenha a sequencia de letras &amp;quot;pro&amp;quot; em seu nome, configure a tela de acordo com a figura a seguir. Observe que o usuário deve ser informado com o domínio.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-u0tyI5yi1MU/TiTIrqACedI/AAAAAAAAA7o/rELOFVOxuGc/s1600-h/5%25255B7%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="5" alt="5" src="http://lh3.ggpht.com/-GDWTY4oPxls/TiTIsJLWfHI/AAAAAAAAA7s/b-K5QymjIl4/5_thumb%25255B5%25255D.png?imgmax=800" width="347" height="215" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;E novamente temos o resultado filtrado.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-fIhNDe6SO9o/TiTIssUm7TI/AAAAAAAAA7w/pBypSLRYa28/s1600-h/6%25255B6%25255D.png" target="_blank"&gt;&lt;img style="display: inline" title="6" alt="6" src="http://lh4.ggpht.com/-vGiUBXOmmfA/TiTIteyWxwI/AAAAAAAAA70/LLFbwYSbQ0c/6_thumb%25255B4%25255D.png?imgmax=800" width="466" height="97" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Quando se administra um ambiente de desenvolvimento sobre o TFS é importante ter respostas para as perguntas acima, e espero ter explorado algumas formas de respondê-las.&lt;/p&gt;  &lt;p&gt;Até a próxima. &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Alegre" src="http://lh6.ggpht.com/-vQ3I3v14xcs/TiTIvBC9qQI/AAAAAAAAA7E/RQXaKQ_U-Lw/wlEmoticon-smile%25255B2%25255D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-7542351282290817365?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/7542351282290817365/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=7542351282290817365&amp;isPopup=true' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/7542351282290817365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/7542351282290817365'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2011/07/auditoria-no-tfs-pt-i.html' title='Auditoria no TFS - PT I'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-1FnvCA00zHk/TiTImih9UgI/AAAAAAAAA7M/Bh3UKqqP5pQ/s72-c/1_thumb%25255B3%25255D.png?imgmax=800' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-1042248195616398855</id><published>2011-01-10T16:02:00.001-02:00</published><updated>2011-01-10T16:02:07.541-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Portfólio'/><title type='text'>Currículo</title><content type='html'>&lt;p&gt;Aproveitando as novas oportunidade e o ano novo, segue meu currículo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://6incsa.bay.livefilestore.com/y1pzsb-u3E-gCpCNzIhL0IVV8rJifuRVppv9-eP2gQr0u_1L4sqMS6T97ZzFcMTEzup_aSwm64SZp6ZUZ-ioR3izouOhm0cVMHu/Curr%C3%ADculo%20Eduardo.pdf?download&amp;amp;psid=1" target="_blank"&gt;Download Aqui!&lt;/a&gt;&lt;/p&gt; &lt;a style="margin: 12px auto 6px; display: block; font: 14px helvetica,arial,sans-serif; text-decoration: underline; font-size-adjust: none; font-stretch: normal; -x-system-font: none" title="View Currículo Eduardo on Scribd" href="http://www.scribd.com/doc/46606499/Curriculo-Eduardo"&gt;Currículo Eduardo&lt;/a&gt; &lt;object id="doc_943264905026826" name="doc_943264905026826" height="600" width="100%" type="application/x-shockwave-flash" data="http://d1.scribdassets.com/ScribdViewer.swf" style="outline:none;" &gt;		&lt;param name="movie" value="http://d1.scribdassets.com/ScribdViewer.swf"&gt;		&lt;param name="wmode" value="opaque"&gt; 		&lt;param name="bgcolor" value="#ffffff"&gt; 		&lt;param name="allowFullScreen" value="true"&gt; 		&lt;param name="allowScriptAccess" value="always"&gt; 		&lt;param name="FlashVars" value="document_id=46606499&amp;amp;access_key=key-2dmrhwcvgzzoera3o8wh&amp;amp;page=1&amp;amp;viewMode=list"&gt; 		&lt;embed id="doc_943264905026826" name="doc_943264905026826" src="http://d1.scribdassets.com/ScribdViewer.swf?document_id=46606499&amp;amp;access_key=key-2dmrhwcvgzzoera3o8wh&amp;amp;page=1&amp;amp;viewMode=list" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="600" width="100%" wmode="opaque" bgcolor="#ffffff"&gt;&lt;/embed&gt; 	&lt;/object&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-1042248195616398855?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/1042248195616398855/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=1042248195616398855&amp;isPopup=true' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/1042248195616398855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/1042248195616398855'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2011/01/curriculo.html' title='Currículo'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-2501189577254644001</id><published>2010-10-19T20:22:00.001-02:00</published><updated>2010-10-19T20:22:49.636-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Estrutura de Dados'/><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>Árvores pt III: Teoria, Introdução, Binárias e AVL.</title><content type='html'>&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_a2CzM_HCl5c/TL4Z_qXE6dI/AAAAAAAAA1s/4KM59V9dGgM/s1600-h/image%5B9%5D.png" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TL4aBKUL0RI/AAAAAAAAA1w/gvOWT-wgH5k/image_thumb%5B4%5D.png?imgmax=800" width="196" height="292" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Continuando a abordagem da estrutura de dados “Árvore” (já abordadas &lt;a href="http://spokydev.blogspot.com/2010/08/arvores-pt-i-teoria-introducao-binarias.html" target="_blank"&gt;neste&lt;/a&gt; e &lt;a href="http://spokydev.blogspot.com/2010/09/arvores-pt-ii-teoria-introducao.html" target="_blank"&gt;neste&lt;/a&gt; &lt;em&gt;post&lt;/em&gt;), vamos explorar desta vez as árvores AVL.&lt;/p&gt;  &lt;p&gt;Ás árvores AVL, são árvores binarias, mas com um diferencial: Elas são &lt;u&gt;balanceadas&lt;/u&gt;!&lt;/p&gt;  &lt;p&gt;Mas o que vem a ser árvores balanceadas? São árvores que tendem a ter a mesma altura à direita e à esquerda! Formalmente, &lt;u&gt;considerasse que uma árvore é balanceada quando, para cada nó, a altura da sub-árvore da esquerda não difere da altura da sub-árvore direita em mais de uma unidade&lt;/u&gt;.&lt;/p&gt;  &lt;p&gt;Abaixo, um exemplos de árvores balanceadas e não balanceadas:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_a2CzM_HCl5c/TL4aBlqZdGI/AAAAAAAAA10/loyegxeV6Cw/s1600-h/clip_image00212.jpg" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="clip_image002" alt="clip_image002" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TL4aCWcDlmI/AAAAAAAAA14/vq8HDWj2baM/clip_image002_thumb9.jpg?imgmax=800" width="506" height="457" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Quais as vantagens de uma árvore balanceada? Bem, quando a árvore está balanceada, podemos dar menos saltos para atingir o item procurado. No último exemplo da figura acima, para encontrar o item “B”, precisaríamos de 4 saltos, enquanto no penúltimo exemplo apenas 1 salto seria necessário.&lt;/p&gt;  &lt;p&gt;Então pare e pense: As árvores de pesquisa são construídas de modo a tornar mais eficiente a tarefa de procura dos elementos, visando que o elemento deve ser procurado à esquerda (caso seja menor que o item atual), ou procurado à direita (caso seja maior do que o item atual), mas nunca em ambos os lados, nada melhor do que a árvore estar balanceada.&lt;/p&gt;  &lt;p&gt;Mas por que AVL? Isto é porque os matemáticos russos Adelson-Velskii e Landis que fizeram a proposta deste modelo.&lt;/p&gt;  &lt;p&gt;Várias são as estratégias de balanceamento, podemos balancear ao inserir um elemento, ao excluir um elemento, disparar um comando manualmente para balanceá-la etc.&lt;/p&gt;  &lt;p&gt;Para determinar a necessidade do balanceamento, teremos de calcular o &lt;u&gt;Fator de Balanceamento&lt;/u&gt;. Para uma árvore balanceada, o módulo deste fator não pode ser maior do que 1. Lembrando que cada vértice tem de ter seu Fator de Balanceamento calculado. Dizemos que:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Se o Fator de Balanceamento for igual a –1: Sub-árvore da esquerda é mais alta. &lt;/li&gt;    &lt;li&gt;Se o Fator de Balanceamento for igual a 0: Os dois lados tem a mesma altura. &lt;/li&gt;    &lt;li&gt;Se o Fator de Balanceamento for igual a 1: Sub-árvore da direita é mais alta. &lt;/li&gt;    &lt;li&gt;O Fator de Balanceamento de uma folha é sempre 0! &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;… E como dito anteriormente, dentro destes limites, ainda não é necessário balancear a árvore.&lt;/p&gt;  &lt;p&gt;Para calcular o Fator de Balanceamento (FB) de um vértice temos: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;FB(vértice v) = altura(sub-árvore direita v) - altura(sub-árvore esquerda v)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Observe a árvore (balanceada) abaixo com os fatores calculados:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TL4aClOGjLI/AAAAAAAAA18/SC4bDqGJ9XM/s1600-h/clip_image00213.jpg" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="clip_image002[1]" alt="clip_image002[1]" src="http://lh5.ggpht.com/_a2CzM_HCl5c/TL4aD63_cvI/AAAAAAAAA2A/Y7YDR2iIj8w/clip_image0021_thumb1.jpg?imgmax=800" width="357" height="224" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Se o fator extrapolar o intervalo (-1, 1) , significa que a árvore está desbalanceada! Então temos de dar início ao processo de balanceamento em árvores AVL.&lt;/p&gt;  &lt;p&gt;Vamos pensar em um processo para a inserção.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Inserimos um novo elemento na árvore. &lt;/li&gt;    &lt;li&gt;A inserção deste novo elemento pode ou não violar a propriedade de balanceamento. &lt;/li&gt;    &lt;li&gt;Se a inserção não violar a propriedade de balanceamento, podemos continuar inserindo novos elementos. &lt;/li&gt;    &lt;li&gt;Se a inserção violar temos de dar início nas &lt;u&gt;Rotações da Árvore&lt;/u&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;A &lt;strong&gt;Rotação da Árvore&lt;/strong&gt; é um algoritmo que visa ajustar o balanceamento, trocando elementos de posição em “girando os elementos pelos seus lugares”. Pode ser usado para qualquer caso de balanceamento AVL. Temos quatro tipos de rotação: Rotação simples à esquerda, rotação simples à direita, Rotação dupla à esquerda, Rotação dupla à direita.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Rotação Simples&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Observe a seguinte evolução da árvore, ao inserirmos o elemento “3” no exemplo a seguir:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TL4aEvDSkTI/AAAAAAAAA2E/2i1-k9VrsAQ/s1600-h/image4.png" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh4.ggpht.com/_a2CzM_HCl5c/TL4aFCJZZ7I/AAAAAAAAA2I/JDshpOVN5Tk/image_thumb7.png?imgmax=800" width="566" height="144" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Percebam que o elemento “2”, que inicialmente estava com FB (Fator de Balanceamento) igual a 0 no primeiro estágio, ganhou um FB de 1 por conta do elemento “3” inserido à direita. Calculando o FB do elemento “8”, temos que somar, &lt;u&gt;em módulo&lt;/u&gt;, o FB de &lt;strong&gt;suas sub-árvores&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Aqui vai um macete, quando tivermos o sinal negativo a rotação (ao menos a primeira) deve ser à direita (pois ó sinal negativo indica maior peso/altura para a esquerda). Se o sinal for positivo, então a rotação deve ser efetuada para a esquerda.&lt;/p&gt;  &lt;p&gt;Outro macete, quando os sinais dos FBs (pai e filho) são iguais (elemento “8” tem FB = –2 e o elemento “4” tem o FB = –1, ambos são negativos), a rotação é simples. Caso sejam diferente a rotação deverá ser dupla (seguindo o macete do sinal).&lt;/p&gt;  &lt;p&gt;Então, o elemento “4”, que está à esquerda do elemento “8” sobe para a &lt;u&gt;direita&lt;/u&gt;, só que isso faria com que ele tivesse três filhos (6, 8, 10), então passamos um filho, nesse caso o maior (da direita) para a sub-árvore do elemento “8”.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Rotação Dupla&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Observe a evolução dos exemplos a seguir quando inserimos o elemento “5” na primeira árvore da imagem abaixo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_a2CzM_HCl5c/TL4aFtq0HgI/AAAAAAAAA2M/pASQ-HawOcA/s1600-h/image19.png" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TL4aGJg3ciI/AAAAAAAAA2Q/pt-IvQII8nA/image_thumb26.png?imgmax=800" width="571" height="172" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Percebam que o vértice “8” ficou com FB = –2, porém o sinal do seu filho esquerdo é positivo, sendo assim, o sinal é inverso, resultando em rotação dupla. Porém tenha calma.&lt;/p&gt;  &lt;p&gt;Um terceiro macete: a rotação começa de baixo para cima! Nesse exemplo, o vértice desbalanceado é o “8”, como a rotação é dupla, vamos rotacionar primeiro o seu filho desbalanceado para a esquerda (jogando o elemento “4” para baixo).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_a2CzM_HCl5c/TL4aG9wqHgI/AAAAAAAAA2U/nJgFB0o5h60/s1600-h/image23.png" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh4.ggpht.com/_a2CzM_HCl5c/TL4aHX1AcZI/AAAAAAAAA2Y/--FVFZr8qiU/image_thumb30.png?imgmax=800" width="569" height="170" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para concluir, bastaria rotacionar, na posição oporta (direita) o vértice “8”.&lt;/p&gt;  &lt;p&gt;Para compreender: a rotação define qual lado o elemento com FB alterado deve prosseguir.&lt;/p&gt;  &lt;p&gt;Observe a generalização dos processos abaixo:&lt;/p&gt;  &lt;p&gt;Para tal, teremos dois vértices especiais:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;P – Vértice ancestral mais próximo do elemento inserido, cujo o FB fica fora do intervalo (-1, 1); &lt;/li&gt;    &lt;li&gt;Q – Filho de P na sub-árvore onde ocorreu a inserção. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Os triângulos representam as sub-árvores, eventualmente presentes na árvore.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Rotação simples à esquerda&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_a2CzM_HCl5c/TL4aIOTOnLI/AAAAAAAAA2c/Ty-epm-1j8k/s1600-h/clip_image00112.gif" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="clip_image001" alt="clip_image001" src="http://lh5.ggpht.com/_a2CzM_HCl5c/TL4aIpsYsdI/AAAAAAAAA2g/vO_I5CloEdQ/clip_image001_thumb1.gif?imgmax=800" width="521" height="286" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Neste caso o vértice Q sobe para a posição anteriormente ocupada pelo vértice P. A sub-árvore com o elemento 2 (estava à &lt;u&gt;esquerda&lt;/u&gt; de Q, portanto constituída de elementos menores), passa para a direita de P, cedendo assim o lugar à &lt;u&gt;esquerda&lt;/u&gt; de Q, para que P possa ser seu filho.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Rotação simples à direita&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TL4aJJaESDI/AAAAAAAAA2k/wz2Dl1zj-ew/s1600-h/clip_image001105.gif" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="clip_image001[10]" alt="clip_image001[10]" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TL4aJnbVyDI/AAAAAAAAA2o/bZo2Bgq8mMU/clip_image00110_thumb3.gif?imgmax=800" width="518" height="248" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Neste caso o vértice Q sobe para a posição anteriormente ocupada pelo vértice P. A sub-árvore com o elemento 2 (estava à &lt;u&gt;direita&lt;/u&gt; de Q, portanto é constituída de elementos maiores), passa para a esquerda de P, cedendo assim o lugar à &lt;u&gt;direita&lt;/u&gt; de Q, para que P possa ser seu filho.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Rotação dupla à esquerda&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_a2CzM_HCl5c/TL4aKH8vv8I/AAAAAAAAA2s/EtSK-xHyJUg/s1600-h/clip_image00234.jpg" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="clip_image002[3]" alt="clip_image002[3]" src="http://lh4.ggpht.com/_a2CzM_HCl5c/TL4aKmyXHHI/AAAAAAAAA2w/kBy-1efbjS8/clip_image0023_thumb2.jpg?imgmax=800" width="524" height="208" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;A rotação dupla à esquerda é constituída por duas rotações simples: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;a primeira, à direita, em torno do nodo Q, &lt;/li&gt;    &lt;li&gt;e a segunda, à &lt;u&gt;esquerda&lt;/u&gt;, em torno do nodo P.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;strong&gt;Rotação dupla à direita&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_a2CzM_HCl5c/TL4aLC7ZEgI/AAAAAAAAA20/HDNE2BfNTeE/s1600-h/clip_image00253.jpg" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="clip_image002[5]" alt="clip_image002[5]" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TL4aLmthHLI/AAAAAAAAA24/AF9V7vbbvtw/clip_image0025_thumb1.jpg?imgmax=800" width="523" height="203" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;A rotação dupla à direita é constituída por duas rotações simples: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;a primeira, à esquerda, em torno do nodo Q, &lt;/li&gt;    &lt;li&gt;e a segunda, à &lt;u&gt;direita&lt;/u&gt;, em torno do nodo P.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Então fica mais esse macete: quando há rotação dupla, a rotação principal é a ultima que será executada, pois começamos “de baixo para cima”.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Revisão&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Se o FB do vértice P for &lt;u&gt;positivo&lt;/u&gt;, a rotação deve ser feita para a &lt;u&gt;esquerda&lt;/u&gt;, se for negativo, para direita.&lt;/li&gt;    &lt;li&gt;Se o FB do vértice P e o FB do vértice Q tiverem o &lt;u&gt;mesmo sinal&lt;/u&gt;, a rotação deve ser &lt;u&gt;simples&lt;/u&gt;, se tiverem sinais contrários, a rotação deve ser dupla.&lt;/li&gt; &lt;/ul&gt;    &lt;p&gt;&lt;strong&gt;Pseudo-código&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; 1. Insira o novo vértice normalmente ;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; 2. Iniciando com o vértice pai do elemento recém-inserido, teste se a propriedade AVL      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; é violada, ou seja, teste se o FB deste é maior do que &lt;b&gt;abs(1)&lt;/b&gt;.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Temos aqui 2 possibilidades:&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2.1. A condição AVL foi violada&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2.1.1. Execute as operações de rotação conforme for o caso (Tipo 1 ou Tipo 2)&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2.1.2. Volte ao passo 1&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2.2. A condição AVL não foi violada.&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2.2.1. Se o vértice recém-testado não tem pai, ou seja, é a raiz da árvore,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; volte para inserir novo elemento (Passo 1)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;E agora o código em C (documentado)&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;#include &amp;lt;stdio.h&amp;gt;      &lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;       &lt;br /&gt;#include &amp;lt;conio.h&amp;gt;      &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160; &lt;br /&gt;struct Item       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int numero;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *esquerda;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *direita;       &lt;br /&gt;};      &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160; &lt;br /&gt;Item** Procurar(Item **itemAtual, int valor)       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if(*itemAtual == NULL)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return NULL;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else if((*itemAtual)-&amp;gt;numero == valor)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return itemAtual;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else if(valor &amp;lt; (*itemAtual)-&amp;gt;numero)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return Procurar(&amp;amp;(*itemAtual)-&amp;gt;esquerda, valor);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return Procurar(&amp;amp;(*itemAtual)-&amp;gt;direita, valor);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;}      &lt;br /&gt;&amp;#160; &lt;br /&gt;bool Remover(Item **itemAtual, int valor)       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item **itemProcurado = Procurar(itemAtual, valor);      &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if(itemProcurado == NULL) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;\nItem não encontrado!\n&amp;quot;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return false;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *temp = *itemProcurado;      &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if((*itemProcurado)-&amp;gt;direita == NULL)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Não tem filho a direita.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (*itemProcurado) = (*itemProcurado)-&amp;gt;esquerda;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else if((*itemProcurado)-&amp;gt;esquerda == NULL)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Não tem filho a esquerda.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (*itemProcurado) = (*itemProcurado)-&amp;gt;direita;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Tem os dois filhos.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Item *anterior = NULL;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; temp = (*itemProcurado)-&amp;gt;esquerda;      &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; while (temp-&amp;gt;direita != NULL)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; anterior = temp;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; temp = temp-&amp;gt;direita;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (*itemProcurado)-&amp;gt;numero = temp-&amp;gt;numero;      &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(anterior == NULL)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (*itemProcurado)-&amp;gt;esquerda = temp-&amp;gt;esquerda;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (*itemProcurado)-&amp;gt;direita = temp-&amp;gt;esquerda;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; free(temp);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return true;       &lt;br /&gt;}      &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160; &lt;br /&gt;void ListarPreOrdem(Item *itemAtual)       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (itemAtual != NULL)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;%i; &amp;quot;, itemAtual-&amp;gt;numero);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ListarPreOrdem(itemAtual-&amp;gt;esquerda);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ListarPreOrdem(itemAtual-&amp;gt;direita);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;}      &lt;br /&gt;&amp;#160; &lt;br /&gt;void ListarInOrdem(Item *itemAtual)       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (itemAtual != NULL)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ListarInOrdem(itemAtual-&amp;gt;esquerda);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;%i; &amp;quot;, itemAtual-&amp;gt;numero);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ListarInOrdem(itemAtual-&amp;gt;direita);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;}      &lt;br /&gt;&amp;#160; &lt;br /&gt;void ListarPosOrdem(Item *itemAtual)       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (itemAtual != NULL)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ListarPosOrdem(itemAtual-&amp;gt;esquerda);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ListarPosOrdem(itemAtual-&amp;gt;direita);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;%i; &amp;quot;, itemAtual-&amp;gt;numero);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;}      &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160; &lt;br /&gt;void Listar(Item *itemAtual)       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;Listando... \n\n&amp;quot;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ListarPreOrdem(itemAtual);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;\n\n&amp;quot;);       &lt;br /&gt;}      &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160; &lt;br /&gt;int CalcularAltura(Item *itemAtual)      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int esquerda;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int direita;      &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (itemAtual == NULL)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return 0;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; esquerda = CalcularAltura(itemAtual-&amp;gt;esquerda);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; direita = CalcularAltura(itemAtual-&amp;gt;direita);      &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (esquerda &amp;gt; direita)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return esquerda + 1;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return direita + 1;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;}      &lt;br /&gt;&amp;#160; &lt;br /&gt;int CalcularFatorDeBalanceamento(Item *itemAtual)      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (itemAtual == NULL)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return 0;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int fator = CalcularAltura(itemAtual-&amp;gt;direita) - CalcularAltura(itemAtual-&amp;gt;esquerda);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return fator;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;}      &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160; &lt;br /&gt;void RotacionarParaEsquerda(Item **itemAtual)       &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *temp;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf (&amp;quot;Rotacao para esquerda de %i\n&amp;quot;, (*itemAtual)-&amp;gt;numero);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; temp = *itemAtual;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; *itemAtual = (*itemAtual)-&amp;gt;direita;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; temp-&amp;gt;direita = (*itemAtual)-&amp;gt;esquerda;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (*itemAtual)-&amp;gt;esquerda = temp;      &lt;br /&gt;}      &lt;br /&gt;&amp;#160; &lt;br /&gt;void RotacionarParaDireita(Item **itemAtual)       &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *temp;      &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf (&amp;quot;Rotacao para direita de %i\n&amp;quot;, (*itemAtual)-&amp;gt;numero);      &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; temp = *itemAtual;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; *itemAtual = (*itemAtual)-&amp;gt;esquerda;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; temp-&amp;gt;esquerda = (*itemAtual)-&amp;gt;direita;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (*itemAtual)-&amp;gt;direita = temp;      &lt;br /&gt;}      &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160; &lt;br /&gt;bool InserirAVL(Item **itemAtual, int valor)       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Se o nó for nulo então o item alocado é colocado nele.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if(*itemAtual == NULL)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Aloca memória para o novo item       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Item *novo = (Item *)malloc(sizeof(Item));      &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Checa se foi alocado memória corretamente.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (novo != NULL)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Define e inicializa os valores.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; novo-&amp;gt;numero = valor;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; novo-&amp;gt;esquerda = NULL;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; novo-&amp;gt;direita = NULL;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return false;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; *itemAtual = novo;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else // -&amp;gt; Decisão: Esquerda ou Direita?      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; valor menor que o atual vai para a esquerda.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(valor &amp;lt; (*itemAtual)-&amp;gt;numero)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; InserirAVL(&amp;amp;(*itemAtual)-&amp;gt;esquerda, valor); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Após inserir, temos de verificar se há necessidade de balanceamento.     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Como inserimos na esquerda, vamos balancear apenas a direita, pois a esquerda pode pesar.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int fatorDeBalanceamentoItemAtual = CalcularFatorDeBalanceamento(*itemAtual);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(abs(fatorDeBalanceamentoItemAtual) &amp;gt; 1)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int fatorDeBalanceamentoItemEsquerda = CalcularFatorDeBalanceamento((*itemAtual)-&amp;gt;esquerda);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Define se vai ocorrer rotação dupla     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(fatorDeBalanceamentoItemAtual * fatorDeBalanceamentoItemEsquerda &amp;lt; 0)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;rotacao dupla (%i, %i)\n&amp;quot;, fatorDeBalanceamentoItemAtual, fatorDeBalanceamentoItemEsquerda);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RotacionarParaEsquerda(&amp;amp;(*itemAtual)-&amp;gt;esquerda);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RotacionarParaDireita(itemAtual);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;rotacao simples (%i, %i)\n&amp;quot;, fatorDeBalanceamentoItemAtual, fatorDeBalanceamentoItemEsquerda);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RotacionarParaDireita(itemAtual);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else // -&amp;gt; valor maior que o atual vai para a direita.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; InserirAVL(&amp;amp;(*itemAtual)-&amp;gt;direita, valor);       &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Após inserir, temos de verificar se há necessidade de balanceamento.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Como inserimos na direita, vamos balancear apenas a esquerda, pois a direita pode pesar.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int fatorDeBalanceamentoItemAtual = CalcularFatorDeBalanceamento(*itemAtual);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(abs(fatorDeBalanceamentoItemAtual) &amp;gt; 1)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int fatorDeBalanceamentoItemDireita = CalcularFatorDeBalanceamento((*itemAtual)-&amp;gt;direita);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Define se vai ocorrer rotação dupla     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(fatorDeBalanceamentoItemAtual * fatorDeBalanceamentoItemDireita &amp;lt; 0)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;rotacao dupla (%i, %i)\n&amp;quot;, fatorDeBalanceamentoItemAtual, fatorDeBalanceamentoItemDireita);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RotacionarParaDireita(&amp;amp;(*itemAtual)-&amp;gt;direita);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RotacionarParaEsquerda(itemAtual);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;rotacao simples (%i, %i)\n&amp;quot;, fatorDeBalanceamentoItemAtual, fatorDeBalanceamentoItemDireita);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RotacionarParaEsquerda(itemAtual);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return true;       &lt;br /&gt;}&amp;#160; &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160; &lt;br /&gt;void Menu() &lt;/p&gt;    &lt;p&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;Digite a sua escolha: \n&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;#160;&amp;#160;&amp;#160; 1 para inserir um elemento na arvore \n&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;#160;&amp;#160;&amp;#160; 2 para remover um elemento da arvore \n&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;#160;&amp;#160;&amp;#160; 3 para finalizar \n&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;? &amp;quot;);       &lt;br /&gt;}      &lt;br /&gt;&amp;#160; &lt;br /&gt;void main()       &lt;br /&gt;{&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *raiz = NULL; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; int opcao;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int numero;      &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Menu();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;%i&amp;quot;, &amp;amp;opcao);      &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; while (opcao != 3)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; switch (opcao)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case 1:       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;Digite um numero: &amp;quot;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;\n%i&amp;quot;, &amp;amp;numero);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; InserirAVL(&amp;amp;raiz, numero);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Listar(raiz);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case 2:      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot; Digite o numero a ser removido: &amp;quot;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; scanf( &amp;quot;\n%i&amp;quot;, &amp;amp;numero);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Remover(&amp;amp;raiz, numero);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Listar(raiz);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;      &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; default:       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;Escolha invalida.\n\n&amp;quot;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Menu();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;%i&amp;quot;, &amp;amp;opcao);&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;Fim do programa.\n&amp;quot;);       &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Resultado do código, listando em pré-ordem:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_a2CzM_HCl5c/TL4aMRA1yAI/AAAAAAAAA28/uPRaMAaubYg/s1600-h/image%5B17%5D.png" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TL4aNCu7jVI/AAAAAAAAA3A/v2sHdAildo0/image_thumb%5B16%5D.png?imgmax=800" width="567" height="532" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Bem, após todos estes ensinamentos, dicas e macetes, me resta deixar algumas tarefas:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Implementar o balanceamento na exclusão.&lt;/li&gt;    &lt;li&gt;Retirar o balanceamento automático (quando um elemento é inserido e/ou excluido) e implementar o balanceamento via comando.&lt;/li&gt;    &lt;li&gt;Após concluído os exercícios anteriores, implementá-los em uma árvore de alunos, se baseando no RA do aluno como indice para a árvore.&lt;/li&gt;    &lt;li&gt;Após concluído os exercícios anteriores, implementá-los em uma árvore de alunos, se baseando no Nome do aluno como indice para a árvore.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Espero que tenham, gostado &lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-openmouthedsmile" alt="Smiley de boca aberta" src="http://lh5.ggpht.com/_a2CzM_HCl5c/TL4aN4BTd5I/AAAAAAAAA3E/bBkzFf0nUpE/wlEmoticon-openmouthedsmile%5B2%5D.png?imgmax=800" /&gt; boa sorte!!!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-2501189577254644001?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/2501189577254644001/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=2501189577254644001&amp;isPopup=true' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/2501189577254644001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/2501189577254644001'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2010/10/arvores-pt-iii-teoria-introducao.html' title='Árvores pt III: Teoria, Introdução, Binárias e AVL.'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_a2CzM_HCl5c/TL4aBKUL0RI/AAAAAAAAA1w/gvOWT-wgH5k/s72-c/image_thumb%5B4%5D.png?imgmax=800' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-2714642073644411975</id><published>2010-10-07T11:59:00.000-03:00</published><updated>2010-10-07T11:59:00.352-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='off-topic'/><title type='text'>Zero é Par?</title><content type='html'>&lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://3.bp.blogspot.com/_YNkzNPTMTZo/SmoIv_KfoxI/AAAAAAAABuU/HBasFZiSwAQ/s320/classic_sub_zero.gif" /&gt;&lt;/p&gt;  &lt;p&gt;Sim!, más há alguns porém!&lt;/p&gt;  &lt;p&gt;Me preocupei em responder primeiro, para não ficar aquela coisa de ler tudo e ver a resposta, ou pior: leia e tire suas conclusões!&lt;/p&gt;  &lt;p&gt;Mas que fique claro que esta é minha opinião baseada no fato de que: na maioria dos experimentos e teorias a conclusão foi que o número Zero (0) é par! Porém, como demsontrarei abaixo, existem contextos em que isso não corresponde.&lt;/p&gt;  &lt;p&gt;E tudo começou ha tempos atrás. Mas se intensificou a discussão com alunos nas faculdades. &lt;/p&gt;  &lt;p&gt;Então venho conversando com físicos e matemáticos, e colhei basicamente as informações abaixo, mas descritas pelo site: &lt;a href="http://razaok.blogspot.com/2009/01/zero-nmero-par-pares-impares-e-neutros.html"&gt;http://razaok.blogspot.com/2009/01/zero-nmero-par-pares-impares-e-neutros.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Vamos para algumas explicações então:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Definição de Par e Ímpar:&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Par n = 2k     &lt;br /&gt;Impar n = 2k + 1&lt;/p&gt;    &lt;p&gt;Tal que n, k є I.&lt;/p&gt;    &lt;p&gt;Então, caso fosse impar:      &lt;br /&gt;0 = 2k + 1      &lt;br /&gt;k = - 1/2 (não é 0)&lt;/p&gt;    &lt;p&gt;Logo, k é par:     &lt;br /&gt;0 = 2k      &lt;br /&gt;k = 0&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Propriedade da Soma:&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;A soma de números iguais, em módulo, é sempre par.&lt;/p&gt;    &lt;p&gt;par1 + par2 = par&lt;/p&gt;    &lt;p&gt;I) -2k - 2k = 2(-2k) = 2n&lt;/p&gt;    &lt;p&gt;II) 2k + 2k = 4k = 2(2k) = 2n&lt;/p&gt;    &lt;p&gt;III) 2k - 2k = 2(k - k) = 2(0) = 2n = 0&lt;/p&gt;    &lt;p&gt;impar1 + impar2 = par&lt;/p&gt;    &lt;p&gt;I) -2k - 1 - 2k - 1 = -4k - 2 = 2(-2k - 1) = 2n&lt;/p&gt;    &lt;p&gt;II) 2k + 1 + 2k + 1 = 4k + 2 = 2(2k + 1) = 2n&lt;/p&gt;    &lt;p&gt;III) 2k + 1 - 2k - 1 = 2(k - k) = 2(0) = 2n = 0&lt;/p&gt;    &lt;p&gt;Não existe uma soma de resultado impar que se resulte em zero.&lt;/p&gt; &lt;/blockquote&gt; &lt;strong&gt;   &lt;p&gt;     &lt;br /&gt;Divisibilidade:&lt;/p&gt; &lt;/strong&gt;  &lt;blockquote&gt;   &lt;p&gt;Uma definição também para par é que o número é divisivel por 2.&lt;/p&gt;    &lt;p&gt;Pois n = 2k, logo n/2 = k&lt;/p&gt;    &lt;p&gt;0 = 2.0&lt;/p&gt;    &lt;p&gt;0/2 = 1.0 = 0&lt;/p&gt;    &lt;p&gt;ou seja:&lt;/p&gt;    &lt;p&gt;0/2 = 2.Inteiro + zero de resto&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;- Caso fosse impar isso se resulta em absurdo.&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;n = 2k + 1&lt;/p&gt;    &lt;p&gt;0/2 = 2. Inteiro + 1 de resto&lt;/p&gt;    &lt;p&gt;0 = 4.k + 2&lt;/p&gt;    &lt;p&gt;4k = -2&lt;/p&gt;    &lt;p&gt;k = -1/2 (não é 0)&lt;/p&gt; &lt;/blockquote&gt; &lt;strong&gt;   &lt;p&gt;     &lt;br /&gt;A Soma de 2 Números Pares&lt;/p&gt; &lt;/strong&gt;  &lt;blockquote&gt;   &lt;p&gt;Como já visto, a soma de dois números pares é sempre par.&lt;/p&gt;    &lt;p&gt;E a soma de dois números impares é sempre par também.&lt;/p&gt;    &lt;p&gt;2 números pares&lt;/p&gt;    &lt;p&gt;0 + 2k = 2k&lt;/p&gt;    &lt;p&gt;0 + 8 = 8&lt;/p&gt;    &lt;p&gt;2 números impares&lt;/p&gt;    &lt;p&gt;0 + 2k + 1 = 2k + 1&lt;/p&gt;    &lt;p&gt;0 + 1 = 1&lt;/p&gt;    &lt;p&gt;(logo é uma soma de um par com um impar)&lt;/p&gt;    &lt;p&gt;- aqui também fica a questão da propriedade do elemento neutro das aditivas.&lt;/p&gt;    &lt;p&gt;- consequencia dessa propriedade, multriplicação de pares por impares se resulta em par.&lt;/p&gt; &lt;/blockquote&gt; &lt;strong&gt;   &lt;p&gt;     &lt;br /&gt;Multiplicação Par x Impar:&lt;/p&gt; &lt;/strong&gt;  &lt;blockquote&gt;   &lt;p&gt;2k.(2y + 1) = 4ky + 2 = 2(ky + 1) = 2n&lt;/p&gt;    &lt;p&gt;Logo,&lt;/p&gt;    &lt;p&gt;0.impar ou 0.par = par&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;       &lt;br /&gt;Pares Perfeitos&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;Números pares são números que correspondem a uma associação igual entre dois números sem ter resto.&lt;/p&gt;    &lt;p&gt;Ou seja, podemos representar da seguinte forma:&lt;/p&gt;    &lt;p&gt;7 = | | | | | | |&lt;/p&gt;    &lt;p&gt;Pegando seus pares e os removendo, ou seja, dividindo por 2. Temos traço sem par, ou seja, houve o resto de 1.&lt;/p&gt;    &lt;p&gt;4= | | | |&lt;/p&gt;    &lt;p&gt;Assim, se tem 2 pares e com resto zero.&lt;/p&gt;    &lt;p&gt;0 = ?&lt;/p&gt;    &lt;p&gt;Aí entra um problema, pois não há pares em zero; &lt;u&gt;porém o resto é zero&lt;/u&gt;. Mas não há o par.&lt;/p&gt;    &lt;p&gt;Logo, nessa definição zero não é par. Ou seja, quando se tem o número associado como quantidade o zero é puramente neutro e não adquire propriedade como par, nem impar.&lt;/p&gt; &lt;/blockquote&gt; &lt;strong&gt;   &lt;p&gt;     &lt;br /&gt;Confusão de Conceitos&lt;/p&gt; &lt;/strong&gt;  &lt;blockquote&gt;   &lt;p&gt;Talvez a grande questão que leva a confusão seja um problema quanto alguns conceitos quanto as caracteristicas de um número.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Característica 1:&lt;/strong&gt; &lt;/p&gt;    &lt;p&gt;Conjunto - Um número pode ser Racional ou Irracional, num dominio Real.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Característica 2:&lt;/strong&gt; &lt;/p&gt;    &lt;p&gt;Primaridade - Número primo são os números que apenas são divisiveis por 1 e por ele mesmo. Até hoje não se encontrou uma equação ou formulação certa para isso.&lt;/p&gt;    &lt;p&gt;Quanto a isso, os números são classificados como primo ou não-primo.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Característica 3:&lt;/strong&gt; &lt;/p&gt;    &lt;p&gt;Opostos/Inversos e Neutros - Neutro = associação de opostos ou inversos &lt;/p&gt;    &lt;p&gt;0 = 1 + (-1)&lt;/p&gt;    &lt;p&gt;0 = 4 + (-4)&lt;/p&gt;    &lt;p&gt;1 = 2^0 = 2/2 = 1 = 2.(1/2)&lt;/p&gt;    &lt;p&gt;1 = 7^0 = 7/7 = 1 = 7.(1/7)&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Característica 4:&lt;/strong&gt; &lt;/p&gt;    &lt;p&gt;Pariedade - Números divisiveis por 2 são pares.&lt;/p&gt;    &lt;p&gt;Ou seja, um número pode possuir uma ou mais caracteristicas. E não se pode dizer assim, se ele tem a caracteristica de neutro então não pode possuir outra. Caso fosse assim. Se o (-2) é oposto de 2, então não podemos dizer que ele é par?&lt;/p&gt; &lt;/blockquote&gt; &lt;strong&gt;   &lt;p&gt;     &lt;br /&gt;Quocientes, númeradores e restos:&lt;/p&gt; &lt;/strong&gt;  &lt;blockquote&gt;   &lt;p&gt;Vamos pensar no 4,4 no 2,2 e no 1,1. Eles são pares?&lt;/p&gt;    &lt;p&gt;No conjunto dos racionais são, no dos inteiros não?&lt;/p&gt;    &lt;p&gt;4,4 : 2 = 2,2 + 0&lt;/p&gt;    &lt;p&gt;Ou seja, resto 0? Não. Pois 4,4 / 2 = 2 + 0,2&lt;/p&gt;    &lt;p&gt;2,2 / 2 = 1,1 + 0&lt;/p&gt;    &lt;p&gt;É assim? Ou é 2,2 / 2 = 1 + 0,1 ?&lt;/p&gt;    &lt;p&gt;1,1 / 2 = 0,55&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;Um dos problemas é que muitos esquecem que decimais são frações, não é um resto zero. Ou então, associam qualquer número com finais (a última casa à direita) 0, 2, 4, 6 e 8 como sendo par. Em geral, são alguns vicios de se trabalhar com tais algarismos pares, de modo a identificar o número como par devido a isso. E com isso, é comum olhar números pares com final zero, como 10, 50, 100, e, devido a isso, considerarem o zero como sendo um número par. Sim, se pode dizer que quando o ultimo algarismo do número for par, o número é par; mas afirmar que devido a isso o zero é par; é esquecer da propriedade do que define um número sendo par. Porém, esquecem de uma propriedade de dizima periódica: Qualquer número racional tem dizima periódica.&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;Tanto o 3 quanto o 3,3 quanto o 3,33...&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;3 = 3,0000000000000000000... (dizima em zero)&lt;/p&gt;    &lt;p&gt;3,3 = 3,3000000000000000000... (dizima em zero)&lt;/p&gt;    &lt;p&gt;3,33.... = 3,3333333333333333333... (dizima em 3)&lt;/p&gt;    &lt;p&gt;&lt;em&gt;- Algum deles é par? E os seguintes?&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;2 = 2,0000000000000000000... (dizima em zero)&lt;/p&gt;    &lt;p&gt;2,2 = 2,2222222222222222222222... (dizima em dois)&lt;/p&gt;    &lt;p&gt;2,22222222222222 = 2,222222222222220000000... (dizima em zero)&lt;/p&gt;    &lt;p&gt;Pois muitas vezes se faz uma confusão quanto a diferenciar o que é parte inteira e parte decimal.Exemplos:&lt;/p&gt;    &lt;p&gt;2,2 = (2 + 0,2) = 2 + 2.10^(-1) = 2 + 2/10&lt;/p&gt;    &lt;p&gt;&lt;em&gt;Tem a parte inteira e a parte decimal. A parte inteira pode ser classificada se é par ou impar. A parte decimal não, nela, apenas podemos dizer qual algarismo é par ou impar.&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;0,5 é par?&lt;/p&gt;    &lt;p&gt;e&lt;/p&gt;    &lt;p&gt;1/2 é par?&lt;/p&gt;    &lt;p&gt;e&lt;/p&gt;    &lt;p&gt;5/10?&lt;/p&gt;    &lt;p&gt;10/20?&lt;/p&gt;    &lt;p&gt;40/80?&lt;/p&gt;    &lt;p&gt;Percebeu qual é realmente o significado de número inteiro e de resto zero? O que se deve levar conta para considerar o zero como par?&lt;/p&gt; &lt;/blockquote&gt; &lt;strong&gt;   &lt;p&gt;     &lt;br /&gt;A Régua:&lt;/p&gt; &lt;/strong&gt;  &lt;blockquote&gt;   &lt;p&gt;Por fim, um exemplo simples. Numa reta, os pontos representam sua posição no espaço. Quanto as casas dos centimetros. Sempre segue uma ordem par, impar, par, impar... contatos a partir de uma referência. A regua começa normalmente com 0, 1, 2, 3, 4, ... (par, impar, par, impar...). Apenas no 1 se tem a unidade. Logo toda unidade tem tamanho 1. Como é impar, é uma associação de um par com um impar: par - impar = 1&lt;/p&gt;    &lt;p&gt;1 - 0 = 1&lt;/p&gt;    &lt;p&gt;2 - 1 = 1&lt;/p&gt;    &lt;p&gt;3 - 2 = 1&lt;/p&gt;    &lt;p&gt;Agora mude a régua. Arraste de modo que a régrua seja: -1, 0, 1, 2, 3, ... (e aí mudou alguma coisa?) Não, a propriedade continuou igual. Note que a ordem contiuna: (impar, par, impar, par...) É o algarismo que representa se é par ou imparO ponto zero representa a unidade 1. Ou seja, continua a mesma história, do tamanho, do módulo:&lt;/p&gt;    &lt;p&gt;0 - (-1) = 1&lt;/p&gt;    &lt;p&gt;par - impar = impar&lt;/p&gt;    &lt;p&gt;1 - 0 = 1&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Espero que tenham gostado de filosofar um pouco de matemática comigo &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-justkidding" alt="Brincadeira" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TKdJDpo0HsI/AAAAAAAAAx8/mZ4I2HEPGlU/wlEmoticon-justkidding%5B2%5D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;p&gt;Até mais.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-2714642073644411975?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/2714642073644411975/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=2714642073644411975&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/2714642073644411975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/2714642073644411975'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2010/10/zero-e-par.html' title='Zero é Par?'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_YNkzNPTMTZo/SmoIv_KfoxI/AAAAAAAABuU/HBasFZiSwAQ/s72-c/classic_sub_zero.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-7523091399770056370</id><published>2010-10-06T08:00:00.000-03:00</published><updated>2010-10-06T08:00:09.721-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eventos'/><title type='text'>#TechEdBr 2010: Uma visão mais técnica</title><content type='html'>&lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://postai.com.br/blog/wp-content/uploads/2010/06/ms_teched2010.bmp" /&gt;&lt;/p&gt;  &lt;p&gt;Bem, já fiz &lt;a href="http://spokydev.blogspot.com/2010/09/techedbr-eu-fui.html" target="_blank"&gt;este &lt;em&gt;post&lt;/em&gt; sobre o TechEd Brasil 2010&lt;/a&gt;. Nele dei um overview sobre o evento. Agora vou compartilhar um pouco da minha visão de acordo com as trilhas técnicas que participei.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Desenvolvendo para Azure&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;Uma boa palestra que abriu minha mente para como grandes sistemas funcionam (facebook, twitter, meu blog etc.). Essa façanha se dá graças a algumas estratégias de armazenamento e replicação de informação. E foi mostrado como o Azure faz isso, através de seus storages (Drives, Blobs, Tables e Filas). Vejamos algumas anotações:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Windows Azure: SO que gerencia a grande malha de servidores dos Data Centers na Nuvem. Cuida do balanceamento, da seleção de máquinas e tolerância a falhas.&lt;/li&gt;    &lt;li&gt;Se paga pelo que usa (igual a conta de água e luz).&lt;/li&gt;    &lt;li&gt;App Fabric (Malha de aplicações)&lt;/li&gt;    &lt;li&gt;Web Role (uma aplicação web por exemplo)&lt;/li&gt;    &lt;li&gt;Work Role (Um processamento de enconding de vídeo por exemplo)&lt;/li&gt;    &lt;li&gt;A app fica pronta em +- 5min após o deploy.&lt;/li&gt;    &lt;li&gt;VS gerencia o Azure pelo Server Explorer&lt;/li&gt;    &lt;li&gt;Há um emulador de Azure para testes.&lt;/li&gt;    &lt;li&gt;Projeto Azure no VS descreve como executar uma app no Azure.&lt;/li&gt;    &lt;li&gt;É preciso uma SDK (baixar no site do Azure).&lt;/li&gt;    &lt;li&gt;Storages: &lt;u&gt;Blobs&lt;/u&gt; (Arquivos com metadados, nome únicos, acessíveis por URI, divisível em blocos e páginas; &lt;u&gt;Tables&lt;/u&gt; (Armazenamento estrutural, escalável, manipulável por LINQ e REST); &lt;u&gt;Drive&lt;/u&gt; (NTFS, Declarável, compartilhado, utiliza Blob por baixo dos panos, muito utilizado para migração de apps).&lt;/li&gt;    &lt;li&gt;Filas: Mensagens entre as apps.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Desenvolvendo para C# no Mundo Moderno&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;Palestra básica sobre novidades do C# 4. Basicamente tirei minha dúvida: Porque um objeto Anônimo, quando é passado como dynamic para outra camada, fica inacessível? Tipos anônimos são privados! &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-winkingsmile" alt="Smiley piscando" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TKdCxL5fZ7I/AAAAAAAAAx0/CuRVQfI1zP4/wlEmoticon-winkingsmile%5B2%5D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Tudo que você precisa saber sobre Scrum, ALM e Visual Studio&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://ronanlucio.files.wordpress.com/2010/02/cone_of_uncertainty.jpg?w=480" /&gt;&lt;/p&gt;  &lt;p&gt;Consegui extrair apenas alguns pontos interessantes dessa palestra:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Cone de incerteza da NASA (Imagem acima).&lt;/li&gt;    &lt;li&gt;Scrum: Transparência, inspeção, adaptação. Framework, não metodologia.&lt;/li&gt;    &lt;li&gt;“Nenhum planejamento de guerra vai além da primeira batalha”.&lt;/li&gt;    &lt;li&gt;Diagrama de dependência (VS 2010): Quanto mais larga a flecha, maior a dependência.&lt;/li&gt;    &lt;li&gt;VS 2010 trabalha com UML 2.1&lt;/li&gt;    &lt;li&gt;Existe uma extensão para o VS 2010 gerar código a partir do diagrama de classes da UML.&lt;/li&gt;    &lt;li&gt;Possibilidade de gerar testes de UI (“Macros”) no VS 2010.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;SQL Azure&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;Essa palestra deixou mais claro a forma transparente e as regras do SQL Server nas Nuvens. Anotações:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Usa Transact SQL Normalmente.&lt;/li&gt;    &lt;li&gt;Conecta normalmente pelo Server Explorer do VS.&lt;/li&gt;    &lt;li&gt;Não suporta manipular várias bases de uma vez (key word “USE”).&lt;/li&gt;    &lt;li&gt;Suporta o SQL Management Studio, mas para mudar de base é preciso desconectar e re-conectar.&lt;/li&gt;    &lt;li&gt;Duas versões: Web Edition (Mais “limitada”); Business Edition.&lt;/li&gt;    &lt;li&gt;Tem uma versão de teste gratuita.&lt;/li&gt;    &lt;li&gt;Tem uma ferramenta de TCO Calculator.&lt;/li&gt;    &lt;li&gt;Não é possível subir um backup local para a nuvem. Mas há um exportador de base.&lt;/li&gt;    &lt;li&gt;Somente SQL Authentication.&lt;/li&gt;    &lt;li&gt;Tem Firewall.&lt;/li&gt;    &lt;li&gt;BCP Upload.&lt;/li&gt;    &lt;li&gt;SQLCat.&lt;/li&gt;    &lt;li&gt;Suporta LINQ to SQL.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Meu site anda meio lento&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;Essa track foi show de bola, mostrou a estratégia dos principais players do mercado (Google, Yahoo, Microsoft, Twitter etc.). De cara uma coisa ficou evidente: temos que nos preocupar muito com detalhes no front-end (html gerado, css, javascript, imagens).&lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="https://encrypted.google.com/images/srpr/nav_logo14.png" /&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;A velocidade depende da expectativa e percepção do usuário.&lt;/li&gt;    &lt;li&gt;Deve ser levada uma experiência ao usuário, como uma barra de progresso de upload, para “acalmá-lo”.&lt;/li&gt;    &lt;li&gt;O Browser é relevante.&lt;/li&gt;    &lt;li&gt;Fiddler (Proxy Sniffer): coleta informações de rede sobre a requisição de um site.&lt;/li&gt;    &lt;li&gt;o IE tem 50mb de cache, o Chrome 200mb.&lt;/li&gt;    &lt;li&gt;Usar GZip.&lt;/li&gt;    &lt;li&gt;Usar Sprites (Imagem acima).&lt;/li&gt;    &lt;li&gt;Tomar cuidado com espaços em branco no HTML, javascript etc.&lt;/li&gt;    &lt;li&gt;Antecipar resolução de DNS~.&lt;/li&gt;    &lt;li&gt;Evitar o uso de &lt;a href="mailto:&amp;ldquo;@Import"&gt;“@Import&lt;/a&gt;” no CSS (é sequencial).&lt;/li&gt;    &lt;li&gt;Quando possível: Styles (CSS) no cabeçalho, Scripts no final da página (pois o seu processamento pode “travar momentaneamente” a renderização.&lt;/li&gt;    &lt;li&gt;Utilizar o “var” no javascript, assim o interpretador não vai varrer todo o código para localizar sua declaração inicial.&lt;/li&gt;    &lt;li&gt;Netmoon: analisador de pacotes.&lt;/li&gt;    &lt;li&gt;webpagetest.org&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Team Foundation Server&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;Palestra do meu amigo &lt;a href="http://www.ramonduraes.net/" target="_blank"&gt;Ramon Durães&lt;/a&gt;, basicamente muitos assuntos, e perguntas dos espectadores, que já eram do meu domínio. Mas foi legal ver a facilidade que o TFS trouxe, na parte de instalação e configuração, seja para grandes empresas ou apenas um usuário. Apenas uma questão ficou no ar que é “quando um grupo desenvolve sobre um usuário do proxy, eu perco a rastreabilidade!?”. No mais: Sharepoint e Reporting Services são opcionais para o TFS 2010. E o Firewall tem de ser muito bem configurado para o Home office.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Desenvolvendo uma app Silverlight em 75 minutos&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;Outra excelente trila, onde aprendi bastante coisa sobre o Blend, WCF Ria Services, Resolução de Timeline, Path Lista Box (Layout path (ex: Elipse)).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;WCF&lt;/strong&gt;:&lt;/p&gt;    &lt;p&gt;Basicamente só observei as estratégias de endpoint do WCF.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;MVVM&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;Pattern(Receita de bolo) super interessante para desenvolver com bind em WPF e Silverlight, onde separamos os dados da visualização.&lt;/p&gt;  &lt;p&gt;Model &amp;lt;-&amp;gt; ViewModel &amp;lt;-&amp;gt; View&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Não é um framework (embora exista alguns de apoio).&lt;/li&gt;    &lt;li&gt;Validação fica na view.&lt;/li&gt;    &lt;li&gt;Executa commands, e não eventos.&lt;/li&gt;    &lt;li&gt;ViewModel: ICommand; INotifyPropertyChanged; IDataErrorInfo; DataContext da View;&lt;/li&gt;    &lt;li&gt;Testável.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;MEF&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;Uma das melhores palestras que assisti, com uma didática fora do comum! &lt;/p&gt;  &lt;p&gt;MEF é um framework que ajuda a criar plug-ins para uma aplicação, e assim extendê-la. &lt;/p&gt;  &lt;p&gt;O Exemplo que foi dado foi de uma calculadora, onde cada operação era um plug-in/extensão/dll. Simplesmente era colocada a dll gerada na pasta de plug-ins &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-openmouthedsmile" alt="Smiley de boca aberta" src="http://lh5.ggpht.com/_a2CzM_HCl5c/TKdCxSq00VI/AAAAAAAAAx4/VZ0YT3Sqr-0/wlEmoticon-openmouthedsmile%5B2%5D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Funciona no .NET 4 e Silverlight 4&lt;/li&gt;    &lt;li&gt;Apps abertas para extensão, fechadas para modificação.&lt;/li&gt;    &lt;li&gt;Plug-in: componente de software para acrescentar funcionalidades. Assim reduzindo o tamanho da APP principal, mas é possível extendê-la conforme a necessidade (bastando um contrato/padrão de implementação).&lt;/li&gt;    &lt;li&gt;Carrega sobre descoberta e dinamicamente.&lt;/li&gt;    &lt;li&gt;Transforma apps estaticamente compiladas em &lt;u&gt;dinamicamente composta&lt;/u&gt;.&lt;/li&gt;    &lt;li&gt;Exportação + Importação = Composição&lt;/li&gt;    &lt;li&gt;Catálogos: Diretório, assembly, etc.&lt;/li&gt;    &lt;li&gt;Contratos por Interfaces.&lt;/li&gt;    &lt;li&gt;Suporta Lazy&amp;lt;&amp;gt;.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;RIA, Silverlight e WCF&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;Track onde foi demonstrada que Ria Services elimina um pouco da responsabilidade do desenvolvedor de lidar com as chamadas assíncronas no Silverlight. O WCF RIA Services suporta JSON e precisa dos namespaces:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;System.ServiceModel.DomainServices.Client&lt;/li&gt;    &lt;li&gt;System.ServiceModel.DataAnotation&lt;/li&gt;    &lt;li&gt;System.ServiceModel.Web&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Windows Phone 7&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;Nada muito técnico, apenas exemplos de apps e games rodando sobre um protótipo do aparelho, mesmo assim impressionante, principalmente o SO e seu HUB (Atividades, Conteúdos, Games, Social Network, etc.)&lt;/p&gt;  &lt;p&gt;Curiosidade sobre os botões, que na ordem são: Back, Start, Busca.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;WIF (Windows Identity Foudation)&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;E a última palestra, também sensacional, do &lt;a href="http://www.israelaece.com/" target="_blank"&gt;Israel Aece&lt;/a&gt;, sobre autenticação única com este framework de autenticação, que funciona sobre WCF, Web, Desktop etc. Foi mostrado um exemplo de dois sites distintos e uma única autenticação (+- como o Google faz com Orkut e Gmail). Porém ela foi bem complexa, segue anotações:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;1º Autenticação.&lt;/li&gt;    &lt;li&gt;2º Autorização (regras de acesso por exemplo).&lt;/li&gt;    &lt;li&gt;IdentityProvider (Security Token Service)&lt;/li&gt;    &lt;li&gt;Realying Party (Aplicação).&lt;/li&gt;    &lt;li&gt;Subject (Emissão de tokens).&lt;/li&gt;    &lt;li&gt;Claims (informações de autorizações).&lt;/li&gt;    &lt;li&gt;Microsoft.IdentityModel (Namespace).&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Conclusão&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;Bem, foi isso, tecnicamente peguei sim algumas poucas palestras fracas, mas consegui pegar muita coisa útil para trazer junto comigo na bagagem profissional, agora é estudar mais e aplicar &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-openmouthedsmile" alt="Smiley de boca aberta" src="http://lh5.ggpht.com/_a2CzM_HCl5c/TKdCxSq00VI/AAAAAAAAAx4/VZ0YT3Sqr-0/wlEmoticon-openmouthedsmile%5B2%5D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;p&gt;Espero que tenha gostado e quem sabe em breve estarei mais eventos, absorvendo mais conhecimento, e compartilhando-os com vocês.&lt;/p&gt;  &lt;p&gt;E como já disse no outro &lt;em&gt;post&lt;/em&gt; sobre o TechEd Brasil, o evento foi ótimo, correria total, mais ótimo!&lt;/p&gt;  &lt;p&gt;Até mais.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-7523091399770056370?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/7523091399770056370/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=7523091399770056370&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/7523091399770056370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/7523091399770056370'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2010/10/techedbr-2010-uma-visao-mais-tecnica.html' title='#TechEdBr 2010: Uma visão mais técnica'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_a2CzM_HCl5c/TKdCxL5fZ7I/AAAAAAAAAx0/CuRVQfI1zP4/s72-c/wlEmoticon-winkingsmile%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-2867591249408261383</id><published>2010-09-28T08:00:00.000-03:00</published><updated>2010-10-04T21:17:56.518-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Um pouco sobre ADO.NET</title><content type='html'>&lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://www.wispals.org/images/pbDatabase.gif" /&gt;&lt;/p&gt;  &lt;p&gt;Como se conectar a um banco de dados com o C# ou outra linguagem da plataforma .NET?&lt;/p&gt;  &lt;p&gt;Bem, a maioria das aplicações comerciais desenvolvidas precisam de interação com uma base de dados, para persistir informações, processá-las conforme a necessidade e disponibilizá-las posteriormente.&lt;/p&gt;  &lt;p&gt;Dentro do .NET Framework (Plataforma com bibliotecas por trás do C#), temos um subconjunto de bibliotecas, ou um outro framework conhecido como ADO.NET (ActiveX Data Objects). Ele é responsável pela comunicação com alguma base de dados, seja em nível mais primitivo ou robusto. &lt;/p&gt;  &lt;p&gt;Como ele faz isso? Através de classes simples e intuitivas, de fácil utilização. Também é possível plugar drivers de conexão com banco de dados nele. Isso o torna bem extensível, ou seja, é possível eu conectar com qualquer base de dados que tenha um driver escrito para o ADO.NET. Na maioria das vezes o fabricante da base de dados acaba fornecendo esse driver.&lt;/p&gt;  &lt;p&gt;O driver é o conjunto de bibliotecas necessárias para se comunicar com a base de dados. Apesar dos bancos de dados serem os mais variados possíveis, o ADO.NET impõe um padrão, então apenas alguns detalhes irão mudar nos acessos. No geral o padrão é o mesmo. Mas o ADO.NET expande bastante esse conceito de drivers, e pela imposição do padrão, dentro do .NET eles acabam se tornando nossos Provedores (Providers) de dados.&lt;/p&gt;  &lt;p&gt;Os provedores de dados ficam responsáveis por fornecer meio de conexão, leitura e “escrita” em um banco de dados.&lt;/p&gt;  &lt;p&gt;Há duas formas básicas (primitivas) de se obter dados de uma consulta a uma base de dados. Uma delas é com DataSet. A outra é com DataReader.&lt;/p&gt;  &lt;p&gt;O DataSet é um mapeamento em memória das tabelas, relacionamentos e linhas solicitada na consulta. Ele mantém um controle sobre o estado dos objetos na memória, logo ele tem a capacidade de persistir as mudanças no banco de dados.&lt;/p&gt;  &lt;p&gt;O DataReader é um leitor de item a item (linha a linha) retornada da consulta. Ele é mais rápido por não mantém todos os metadados que o DataSet mantém. Porém é somente leitura.&lt;/p&gt;  &lt;p&gt;No .NET temos alguns provedores nativos. São eles: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;SQL Server (System.Data.SqlClient), &lt;/li&gt;    &lt;li&gt;OLE DB (System.Data.OleDb), &lt;/li&gt;    &lt;li&gt;ODBC (System.Data.Odbc), &lt;/li&gt;    &lt;li&gt;Oracle (System.Data.OracleClient – Apenas até o VS 2008/.NET 3.5). &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Como já comentado antes, esse provedores são expansíveis, uma prova disso é que a própria Oracle tem um provedor para o ADO.NET (e como eles conhecem melhor o caminho das pedras da base de dados deles, acaba sendo mais eficiente o provedor nativo).&lt;/p&gt;  &lt;p&gt;Na figura abaixo é exposto a estrutura básica de um provedor:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://analistati.com/wp-content/uploads/2009/01/adonet.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;Os objetos principais de um provedor são:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Connection: Gerencia a conexão com a fonte de dados. &lt;/li&gt;    &lt;li&gt;Command: Executa comados na fonte de dados, podendo ser utilizado para recuperar um DataSet ou um DataReader. &lt;/li&gt;    &lt;li&gt;DataReader: Lê as informações (item a item) de uma consulta na fonte de dados. &lt;/li&gt;    &lt;li&gt;DataAdapter: Utilizado para preencher um DataSet após uma consulta. Como já dito anteriormente, ele também tem a capacidade de replicar a atualização dos dados (após as manipulações necessárias) na fonte de dados. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Observe que o DataSet não está citado acima, pois ele é o mesmo objeto para qualquer provedor. Como? Ele só mantem em memória os dados fornecidos pelo DataAdapter, desconhecendo assim o banco de dados, e deixando essa responsabilidade a cargo do DataAdapter.&lt;/p&gt;  &lt;p&gt;Vejamos alguns exemplos de conexão com banco de dados:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_a2CzM_HCl5c/TKpsv46k6jI/AAAAAAAAAyA/_soQwHXYb48/s1600-h/image51.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh5.ggpht.com/_a2CzM_HCl5c/TKpsxJxqfbI/AAAAAAAAAyE/omQUAu73g0Y/image_thumb6%5B1%5D.png?imgmax=800" width="450" height="313" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Importante observar três coisas na figura acima:&lt;/p&gt;  &lt;p&gt;A primeira são os namespaces que foram incluídos. Um para cada provedor.&lt;/p&gt;  &lt;p&gt;A segunda é a string de conexão. Esta é responsável por localizar o banco de dados e passar as credenciais de conexão. Para compreendermos melhor o conceito de string de conexão, imagine o seguinte: para você se conectar a um site, você tem de informar a URL do mesmo, talvez passar alguns parâmetros pela URL, e em algum momento se autenticar no site. A string de conexão faz isso! para saber mais sobre strings de conexão do ADO.NET acesse: &lt;a href="http://www.connectionstrings.com/"&gt;http://www.connectionstrings.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;A terceira é o fato do padrão de nomenclatura.&lt;/p&gt;  &lt;p&gt;Vamos trabalhar com um exemplo simples, porém mais concreto. Após instalar o Visual Studio e SQL server em uma máquina, abra o Visual Studio e localize a window “Server Explorer”:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TKpsx6Uxj3I/AAAAAAAAAyI/hqDopRQNcfY/s1600-h/image14%5B1%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TKpszSwCAeI/AAAAAAAAAyM/Z1lACa0lnq0/image_thumb17.png?imgmax=800" width="289" height="143" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Esta window do Visual Studio gerencia as conexões as bases de dados que você informar. Vamos criar uma nova base de dados no SQL Server, clicando com o Botão direito em “Data Connections” &amp;gt; “Create new SQL Server Database”:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TKps0UuXneI/AAAAAAAAAyQ/74zSkMYnT3A/s1600-h/image24.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh4.ggpht.com/_a2CzM_HCl5c/TKps1ZysisI/AAAAAAAAAyU/TNtoRPBDSI4/image_thumb261.png?imgmax=800" width="281" height="147" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TKps2Km8mWI/AAAAAAAAAyY/XkhxRPFeim8/s1600-h/image29.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh4.ggpht.com/_a2CzM_HCl5c/TKps2-uCGeI/AAAAAAAAAyc/UTNatyrhOO8/image_thumb29.png?imgmax=800" width="279" height="292" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Configure a janela que aparecer com o nome da sua instância de SQL Server, e o nome da base que será criada.&lt;/p&gt;  &lt;p&gt;Após criar a base vamos adicionar uma Tabela “Pessoa”. Clique com o botão direito na pasta “Table” &amp;gt; “Add New Table”.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TKps3qv-dXI/AAAAAAAAAyg/ecoGgbRHCxc/s1600-h/image39.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TKps4Ft7_II/AAAAAAAAAyk/xaf55dc7vgw/image_thumb36.png?imgmax=800" width="182" height="123" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Crie as colunas com os tipos da imagem abaixo. Na coluna “Codigo”, clique com o botão direito em Set Primary Key, para definir esta coluna como chave primária.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TKps4znRMXI/AAAAAAAAAyo/gVRQku5dSeE/s1600-h/image42.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh5.ggpht.com/_a2CzM_HCl5c/TKps5So5l5I/AAAAAAAAAys/46yQ4fRrn1I/image_thumb45.png?imgmax=800" width="432" height="125" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para tornar a coluna código Auto-Incremento, selecione-a e na window de “Column Properties”, defina “Is Identity = Yes”, como na imagem abaixo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TKps6pOSuhI/AAAAAAAAAyw/z5b_r1Nzaqc/s1600-h/image43.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TKps7ZkzLFI/AAAAAAAAAy0/amHTH36-haA/image_thumb46.png?imgmax=800" width="259" height="271" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Quando for salvar defina o nome “Pessoa”:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TKps73hRirI/AAAAAAAAAy4/1O--I-mNTLo/s1600-h/image461.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TKps8rUV0GI/AAAAAAAAAy8/qOXZF-bJoVo/image_thumb47.png?imgmax=800" width="200" height="74" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Vamos inserir algumas linhas nessa tabela, para isso, clique com o botão direito sobre a tabela e selecione “New Query”:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_a2CzM_HCl5c/TKps9GfJ7zI/AAAAAAAAAzA/BN71QwGt_W0/s1600-h/image53.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TKps-AQLLlI/AAAAAAAAAzE/VmZP2mAcv3Q/image_thumb55.png?imgmax=800" width="159" height="141" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Em seguida digite alguns comandos de “insert” e clique no ponto de exclamação em vermelho, como indicado na figura:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_a2CzM_HCl5c/TKps-mqU09I/AAAAAAAAAzI/o6GXZvwJtPU/image56.png?imgmax=800" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TKptDDzv3eI/AAAAAAAAAzM/ER1qxcmajsk/image_thumb62.png?imgmax=800" width="400" height="283" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Após inserir alguns dados, vamos criar uma aplicação de console que irá se conectar na base de dados. Neste primeiro exemplo, iremos listar os dados usando o objeto DataReader, observe:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_a2CzM_HCl5c/TKptD17z7rI/AAAAAAAAAzQ/bLWsLzp80zE/s1600-h/image66.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TKptEwKt1iI/AAAAAAAAAzU/E0FSgD-ufEk/image_thumb71.png?imgmax=800" width="604" height="330" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Explicando: &lt;/p&gt;  &lt;p&gt;Na linha 16 é definida a variável que representa a string de conexão com o SQL Server, ou seja, qual o caminho para eu conectar na base de dados, com suas devidas configurações e parâmetros de autenticação. Basicamente ela é composta de servidor (podendo ser um IP, assim, poderíamos ter o SQL server em outra máquina que não a de desenvolvimento) com instância do SQL Server, a base de dados inicial e o tipo de autenticação.&lt;/p&gt;  &lt;p&gt;Na linha 14 é criado o objeto de conexão com SQL Server passando a string de conexão no construtor. Perceba o uso da palavra reservada “using”. Ela faz o descarte automático do objeto de conexão quando o bloco que ela define for totalmente executado. Isso significa que ela desconecta da base de dados e retira todas as informações desnecessárias da memória, pois abrir e manter uma conexão com uma base de dados é muito custoso. E fica a dica: É possível utilizar o “using” em qualquer objeto que implementa a interface IDisposable, ou seja, todo objeto que pode ser descartado da memória.&lt;/p&gt;  &lt;p&gt;Chegou a hora de eu passar o comando SQL criado, para isso utilizamos a classe SqlCommand, passando a string com a instrução SQL, e o objeto de conexão, na linha 18.&lt;/p&gt;  &lt;p&gt;Agora que esta tudo pronto para executar o comando, vamos abrir a conexão com o método “Open()”, na linha 20, e resgatar o DataReader (linha 22).&lt;/p&gt;  &lt;p&gt;E, enquanto for possível ler linhas que a instrução retornou (linha 24), imprimimos isto na tela, obtendo os dados pelo tipo e índice da coluna (linha 26). Fica registrado que há várias formas de obter a coluna de um DataReader, fique à vontade para explorá-los.&lt;/p&gt;  &lt;p&gt;Sendo assim, eis nosso resultado:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_a2CzM_HCl5c/TKptFSMgU8I/AAAAAAAAAzY/jJi81diB0r0/s1600-h/image67.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TKptGGfT_yI/AAAAAAAAAzc/JrBS1MZ-pjA/image_thumb75.png?imgmax=800" width="224" height="90" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Agora um exemplo utilizando DataSet:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_a2CzM_HCl5c/TKptG65PakI/AAAAAAAAAzg/kdAJDFSKYz8/s1600-h/image73.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TKptHsft4wI/AAAAAAAAAzk/Xvny4KQ-fpc/image_thumb82.png?imgmax=800" width="613" height="422" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Antes de mais nada a classe DataSet fica no namespace “System.Data”, como na linha 3 indicada na figura acima.&lt;/p&gt;  &lt;p&gt;Agora, na linha 19, aparece o DataAdapter recebendo a instrução SQL e a conexão. Ele é que será responsável em recuperar as informações e preencher o DataSet.&lt;/p&gt;  &lt;p&gt;Na linha 21 é criado o DataSet, abaixo é aberta a conexão e o DataAdapter preenche o DataSet (linha 24).&lt;/p&gt;  &lt;p&gt;Para listar os dados no console, foi feito um “foreach”, obtendo um DataRow (objeto do DataSet que representa uma linha). Percebam que o DataSet tem a capacidade de gerenciar várias tabelas em memória, então, como só temos uma tabela mapeada, pegamos as linhas (Rows) da tabela de índice “0”.&lt;/p&gt;  &lt;p&gt;Recuperada a linha, para selecionar a coluna, da linha, é só passar o nome, por string entre colchetes, para o objeto que representa a linha (“item”).&lt;/p&gt;  &lt;p&gt;O resultado é o mesmo.&lt;/p&gt;  &lt;p&gt;Podemos disponibilizar estes dados facilmente na web. Para tal vamos adicionar uma ASP.NET Web Application na solução:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TKptIXvX5OI/AAAAAAAAAzo/dK2lWclWZj0/s1600-h/image9.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh5.ggpht.com/_a2CzM_HCl5c/TKptJWKFRfI/AAAAAAAAAzs/Js6EnwNNIcc/image_thumb10.png?imgmax=800" width="305" height="253" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_a2CzM_HCl5c/TKptLCjTXeI/AAAAAAAAAzw/h1P3e8bGnxY/s1600-h/image15.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh5.ggpht.com/_a2CzM_HCl5c/TKptMLW2RvI/AAAAAAAAAz0/B6NntOAQkJQ/image_thumb14.png?imgmax=800" width="530" height="331" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Agora, na pagina Default.aspx vamos adicionar um controle que esta apto para receber uma coleção de registros, proveniente da base de dados. Para tal, escolhi a &lt;em&gt;GridView&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_a2CzM_HCl5c/TKptM3Eub9I/AAAAAAAAAz4/mZ8hF2BoAqM/s1600-h/image21.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TKptNgDqaaI/AAAAAAAAAz8/owrpUBTdJvQ/image_thumb21.png?imgmax=800" width="536" height="271" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Basicamente, uma vez que fornecermos uma fonte de dados (coleção de registros) para a &lt;em&gt;GridView&lt;/em&gt;, ela irá renderizar uma tabela HTML com as informações. Para forneceremos as informações, vamos para o &lt;em&gt;code behind&lt;/em&gt; da página Default.aspx, e no evento Page_Load podemos conectar no banco de dados, resgatar os registros com um &lt;em&gt;select&lt;/em&gt;, e de alguma forma fornecer esta coleção para a &lt;em&gt;GridView&lt;/em&gt;. &lt;/p&gt;  &lt;p&gt;Com o DataSet é mais fácil, apenas atribuímos ele na propriedade DataSouce da &lt;em&gt;GridView&lt;/em&gt;, e realizar um DataBind(), método responsável por renderizar a informação vinculada. &lt;/p&gt;  &lt;p&gt;Alguns detalhes importantes, para acessar o &lt;em&gt;code behind&lt;/em&gt;, abra o arquivo Default.aspx.cs:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TKptOXBbKnI/AAAAAAAAA0A/OSgNhRAjNww/s1600-h/image25.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TKptPdEKxMI/AAAAAAAAA0E/006pVTX3J9g/image_thumb26.png?imgmax=800" width="151" height="148" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Temos de tornar esta aplicação a principal, pois o console não nos interessa mais, para isso clique com o botão direito no projeto web &amp;gt; “Set as StartUp Project”:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_a2CzM_HCl5c/TKptP3L_wxI/AAAAAAAAA0I/x6hEoAu2CLI/s1600-h/image301.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh4.ggpht.com/_a2CzM_HCl5c/TKptQwIq-aI/AAAAAAAAA0M/epPIeYsPcaU/image_thumb33.png?imgmax=800" width="234" height="253" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Após estes detalhes, resta a codificação. Vejamos o exemplo da codificação e seu resultado:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_a2CzM_HCl5c/TKptRZxgLpI/AAAAAAAAA0Q/o1OfUI2A3OI/s1600-h/image37.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TKptSuId3ZI/AAAAAAAAA0U/-3sTeSEaI5c/image_thumb41.png?imgmax=800" width="571" height="420" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_a2CzM_HCl5c/TKptT_NKhVI/AAAAAAAAA0Y/3t57dSTTVHM/s1600-h/image381.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh5.ggpht.com/_a2CzM_HCl5c/TKptU42zd7I/AAAAAAAAA0c/bKCO3oMkGIc/image38_thumb.png?imgmax=800" width="213" height="295" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Podemos trabalhar também com o DataReader, porém temos de criar uma lista de objetos. O papel da lista será armazenar os registros em memória e atribuí-la no DataSource da &lt;em&gt;GridView&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;Vamos adicionar uma classe “Pessoa” que modelará os objetos da lista,&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_a2CzM_HCl5c/TKptVYY5CaI/AAAAAAAAA0g/Bw9qC2NEqyo/s1600-h/image54.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TKptW-WNTaI/AAAAAAAAA0k/7tM8YRALa5I/image_thumb57.png?imgmax=800" width="496" height="265" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_a2CzM_HCl5c/TKptX3e2VLI/AAAAAAAAA0o/vIeuh8wUldU/s1600-h/image55.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TKptYwiJIiI/AAAAAAAAA0s/fn1EU6m8__w/image_thumb58.png?imgmax=800" width="496" height="306" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_a2CzM_HCl5c/TKptZUnquhI/AAAAAAAAA0w/jmCcUe-L3Lo/s1600-h/image57.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TKptaLBDXRI/AAAAAAAAA00/ueuUOcg_wFk/image_thumb63.png?imgmax=800" width="271" height="141" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Agora entramos em um conceito interessante: A interação de um sistema, &lt;u&gt;baseado em linguagem Orientada a Objetos&lt;/u&gt;, com uma &lt;u&gt;base de dados relacional&lt;/u&gt;.&lt;/p&gt;  &lt;p&gt;Já temos nossa classe, resta criar uma lista e os objetos para cada linha recuperada do banco de dados, e adicioná-los em uma Lista tipada (List&amp;lt;&amp;gt;). Vejamos:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TKptbFuUxfI/AAAAAAAAA04/WVQVfDUfMD0/s1600-h/image63.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TKptce2nOqI/AAAAAAAAA08/aonBjOrgGO4/image_thumb70.png?imgmax=800" width="434" height="423" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Visualmente, o resultado é o mesmo, mas lembrando que performaticamente o DataReader é mais ágil.&lt;/p&gt;  &lt;p&gt;Não foi muito diferente do exemplo no console, a diferença é que não utilizamos o Console.WriteLine().&lt;/p&gt;  &lt;p&gt;Para concluir, vamos voltar na aplicação console, pois agora é hora de explicar como efetuar um comando na base de dados, ganhando assim o poder de inserir, atualizar e apagar registros da base.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_a2CzM_HCl5c/TKptdbmcDfI/AAAAAAAAA1E/aN-3YG5zjmk/s1600-h/image5%5B1%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TKptei5ZvpI/AAAAAAAAA1I/yg0dth4boKU/image_thumb6.png?imgmax=800" width="252" height="229" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para qualquer que seja o comando que deverá ser executado na base de dados (&lt;em&gt;insert, delete, update&lt;/em&gt;), devemos utilizar um objeto SqlCommand e o seu método “ExecuteNonQuery()”, que retornará o número de linhas afetadas pelo comando.&lt;/p&gt;  &lt;p&gt;Acompanhe o exemplo abaixo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_a2CzM_HCl5c/TKptfEaz6JI/AAAAAAAAA1M/Yr7b8jz9t_I/s1600-h/image13.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TKptgH7oA2I/AAAAAAAAA1Q/nFHZWZs6wII/image_thumb22.png?imgmax=800" width="542" height="309" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TKptgvb-_JI/AAAAAAAAA1U/MrCHsZMMPDs/s1600-h/image17.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TKpthS76GbI/AAAAAAAAA1Y/zJVrwPMBnow/image_thumb27.png?imgmax=800" width="212" height="95" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Uma instrução de &lt;em&gt;insert&lt;/em&gt; esta definida na linha 17. Perceba que ela não recebe diretamente os valores que serão inseridos no banco de dados, pois ela esta recebendo &lt;u&gt;parâmetros&lt;/u&gt;. Estes são importantes para evitarmos problema de SQL Injection (injeção de comandos indesejados na string do comando). Então nas linhas 21 e 22 são adicionados parâmetros ao comando, provenientes da classe SqlParameter, passando, no construtor, o nome do parâmetro (com “@”, uma característica do SQL Server, podendo variar a maneira de passar parâmetro, dependendo do Provedor de Dados), e seu valor. O valor é tratado pelo parâmetro, assim evitando dados truncados (no caso de uma Data e Hora) e injeção indevida de SQL (SQL Injection). &lt;/p&gt;  &lt;p&gt;Finalmente, na linha 25 executamos o “&lt;em&gt;ExecuteNonQuery()&lt;/em&gt;”, inserindo assim mais um registro no SQL Server.&lt;/p&gt;  &lt;p&gt;Lembrando que o “&lt;em&gt;ExecuteNonQuery()&lt;/em&gt;” da suporte para os comandos de &lt;em&gt;delete&lt;/em&gt; e &lt;em&gt;update&lt;/em&gt; também.&lt;/p&gt;  &lt;p&gt;Para comprovar, podemos voltar no exemplo web, que está com o &lt;em&gt;select&lt;/em&gt;, e executar a aplicação.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TKptiMgkfII/AAAAAAAAA1c/20mmm8cyHK8/s1600-h/image23.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh4.ggpht.com/_a2CzM_HCl5c/TKptjE2hQBI/AAAAAAAAA1g/UhS2phBE2to/image_thumb35.png?imgmax=800" width="198" height="272" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Percebam que o registro inserido, no exemplo acima, esta na linha de Codigo 4.&lt;/p&gt;  &lt;p&gt;Espero que tenham gostado, pois o objetivo aqui, foi dar um overview do ADO.NET, focando na conectividade nativa e primitiva do mesmo.&lt;/p&gt;  &lt;p&gt;Para quem quiser se aprofundar no assunto, o ADO.NET suporta uma série de frameworks que ajudam a abstrair a camada de dados, e facilitar a interação com o mundo das linguagens Orientadas a Objeto, como o Entity Framework, LINQ to SQL, NHibernate etc… Inclusive DataSets Tipados.&lt;/p&gt;  &lt;p&gt;E fica a dica: pense como disponibilizar registros e conectividade com o banco de dados após explorar &lt;a href="http://spokydev.blogspot.com/2010/09/um-pouco-de-arquitetura-de-software.html" target="_blank"&gt;este artigo de arquitetura&lt;/a&gt;, seja de forma primitiva, ou explorando uma solução/framework mais robusto. Se achar que de primeira está difícil, tente criar funções ou classes com métodos que generalizam e o ajudariam com a base de dado.&lt;/p&gt;  &lt;p&gt;E este foi um grande overview sobre a base do ADO.NET… Abraços, até mais &lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smilewithtongueout" alt="Smiley mostrando a língua" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TKptj7tEclI/AAAAAAAAA1k/y8IYOA0JzZg/wlEmoticonsmilewithtongueout2.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-2867591249408261383?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/2867591249408261383/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=2867591249408261383&amp;isPopup=true' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/2867591249408261383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/2867591249408261383'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2010/09/um-pouco-sobre-adonet.html' title='Um pouco sobre ADO.NET'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_a2CzM_HCl5c/TKpsxJxqfbI/AAAAAAAAAyE/omQUAu73g0Y/s72-c/image_thumb6%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-53665597034642059</id><published>2010-09-27T08:00:00.000-03:00</published><updated>2010-09-27T08:56:20.889-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Arquitetura'/><title type='text'>Um pouco de Arquitetura de Software</title><content type='html'>&lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://api.ning.com/files/0W*FqI3*Lofij3b-K8MaafpFa85gKHN46JnmFzrB*sJk9IZmgn-cdtZI81g33pVCaCJpxuCUwOqGSeMqqaB-4bK12l2ijl8l/arquitetura.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;Muitas pessoas se perguntam o que é, ou se de fato existe a “Arquitetura de Software”. Para ajudar a compreender, é importante analisarmos alguns players na concepção de um software, bem como seus papéis:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Programador: Bem, este dispensa apresentações, é o criador de códigos, componentes, artefatos do software. Compreende e domina as linguagens de programação, frameworks, etc. Altamente técnico. &lt;/li&gt;    &lt;li&gt;Testador: Profissional responsável pelas rotinas de testes do software. Os testes, para os softwares modernos, são fundamentais. Estes profissionais tem de compreender um pouco de programação em algumas circunstancias, para escreverem programas que testam programas, macros e até mesmo códigos que testam códigos. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Até aqui é interessante observar uma perspectiva natural do mundo do Software: estes profissionais são muito técnicos e “estão em um mundo diferente” dos usuários do software. Pode parecer exagero meu. Mas ao pé da letra é assim! O que acontece é que em muitos casos, no desenvolvimento de um software, nós acabamos assumindo mais de um papel, e algum deles contém um contato maior com o usuário do software. E, tanto é verdade o que eu digo, que eu quero que tentem responder uma pergunta: vocês conhecem algum programador que fez parte da codificação do Windows? E do GMail?&lt;/p&gt;  &lt;p&gt;Continuando…&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Engenheiro de Software: Esse profissional é responsável em mapear o material coletado com o usuário (e pode não ser ele quem coleta o material) e transformar em documentação (técnica) para os desenvolvedores e testadores. &lt;/li&gt;    &lt;li&gt;Analista (de sistemas ou até mesmo de negócios): É um típico coletor de informações das necessidades do usuário com relação ao software. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Arquiteto de Software&lt;/strong&gt;: Profissional responsável por pegar as informações levantadas, requisitos do sistema e montar uma solução de software. Ele vai decidir como o software será concebido. Isso envolve linguagens, protocolos, requisitos de hardware e comunicação entre as partes do software. Ele tem a visão macro da coisa. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Vamos analisar um exemplo pratico: o Twitter.&lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://jornale.com.br/angel/wp-content/uploads/2009/12/twitter.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;Eu considero que o Twitter é um caso de sucesso em sua arquitetura. Isso porque ele é um sistema relativamente novo, e podemos usar o front-end que desejarmos (inclusive desenvolver um próprio) para ele. A arquitetura do Twitter é baseada em um core que se tornou uma API altamente difundida. Com isso vemos que o site oficial, o site mobile, apps Java para celular, apps desktop ,dentre outras, simplesmente consomem suas APIs. Se desejarmos desenvolver uma aplicação para o Twitter é só entrar no site deles e ler a documentação da API.&lt;/p&gt;  &lt;p&gt;Toda essa flexibilidade do Twitter só foi possível graças a sua concepção arquitetural.&lt;/p&gt;  &lt;p&gt;Agora me responda, seu software, é possível eu plugá-lo na web? E no celular? &lt;/p&gt;  &lt;p&gt;Deixa eu adivinhar, não é possível pois toda a regra de negócios está no “click” do botão salvar (com mais de 500 linhas, e alguns SQLs) do seu app desenvolvido em Delphi 7.&lt;/p&gt;  &lt;p&gt;Este é um dos benefícios expostos por um bom estudo de arquitetura de software. Já ouviram falar em Entity Framework? JPA? Hibernate?&lt;/p&gt;  &lt;p&gt;Agora me respondam, tentaram usar algum por que eles são orientados a objetos? Estão na moda? São fáceis? Não é preciso se preocupar com SQL?&lt;/p&gt;  &lt;p&gt;Pois bem, na verdade a premissa principal de frameworks como esses é: Abstração de banco de dados, ou seja, não é preciso se preocupar se a base de dados será Oracle, SQL Server, MySQL etc.&lt;/p&gt;  &lt;p&gt;Agora juntem as possibilidades: múltiplas interfaces, múltiplos bancos, e, com uma boa arquitetura, é fácil fazer módulos, plug-ins… enfim, tornar a aplicação bem extensível e plugável.&lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://wethinkbs.files.wordpress.com/2008/09/arquitetura.png" /&gt;&lt;/p&gt;  &lt;p&gt;O arquiteto de software tem de ser capaz de planejar, documentar e decidir quais tecnologias estarão envolvidas na concepção do software (isso inclui linguagem de programação e framework), e até mesmo a infra-estrutura necessária para abrigar e processar o software.&lt;/p&gt;  &lt;p&gt;Isso só representa benefícios ao software: o torna modular, testável, expansível. Ajuda a compreender seu funcionamento juntamente com a infra-estrutura e tecnologias envolvidas.&lt;/p&gt;  &lt;p&gt;Importante observar que o arquiteto de software não tem uma visão detalhista de software, pois não é do interesse dele saber como que o analista ou engenheiro definiram o cálculo de juros para o programador. Ele tem uma visão de cima, macro, de como o software passa as informações processadas de um lado para o outro. Por isso ele também é um dos primeiros na concepção do software (lembrando que concepção é diferente de planejamento). Ou seja, após feita a análise e levantado os requisitos, o arquiteto vai gerar um projeto (ou solução) de software que irá abrigar o software. Ele vai definir camadas, por exemplo: Camada visual, Camada de Banco de dados, Repositórios; e como elas devem se comunicar, e o que é preciso para elas funcionarem; Depois disso ele repassa essa carcaça/esqueleto montado para os desenvolvedores codificarem.&lt;/p&gt;  &lt;p&gt;Vamos ver isso um pouco na prática: Vamos fazer uma calculadora com as quatro operações básicas. Porém ela deve rodar na Web, Desktop e Console. Este projeto será concebido no Visual Studio.&lt;/p&gt;  &lt;p&gt;Para isso nós teremos o seguinte gráfico de camadas e dependências:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TJ6cttoyx4I/AAAAAAAAAwQ/vLx_0xgh1l4/s1600-h/image%5B9%5D.png" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TJ6cuIVP1fI/AAAAAAAAAwU/uqCbbZrC5bQ/image_thumb%5B5%5D.png?imgmax=800" width="461" height="144" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Crie no Visual Studio a seguinte solução com os seguintes projetos:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_a2CzM_HCl5c/TJ6cuuaZpzI/AAAAAAAAAwY/BJsGOiR9P08/s1600-h/image%5B13%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh5.ggpht.com/_a2CzM_HCl5c/TJ6cvM5OuKI/AAAAAAAAAwc/h-bVv0p2uEY/image_thumb%5B11%5D.png?imgmax=800" width="198" height="113" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;CalculadoraBase (Class Library) &lt;/li&gt;    &lt;li&gt;ConsoleCalculadora (Console) &lt;/li&gt;    &lt;li&gt;WindowsCalculadora (Windows Forms) &lt;/li&gt;    &lt;li&gt;WebCalculadora (Web Application) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Segundo o diagrama de dependência, os projetos de interface (web, windows e console) devem referenciar o projeto CalculadoraBase, para isso dê um “Add Reference” nos projetos:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_a2CzM_HCl5c/TJ6cvrBUqBI/AAAAAAAAAwg/bD5NU2FwKJY/s1600-h/image%5B20%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh5.ggpht.com/_a2CzM_HCl5c/TJ6cwKxG3gI/AAAAAAAAAwk/SOtPQzGo1vI/image_thumb%5B19%5D.png?imgmax=800" width="242" height="93" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_a2CzM_HCl5c/TJ6cwrFcmFI/AAAAAAAAAwo/bnS6ezLAarU/s1600-h/image%5B21%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh4.ggpht.com/_a2CzM_HCl5c/TJ6cxPwVCvI/AAAAAAAAAws/xWL6B5Z-dKs/image_thumb%5B25%5D.png?imgmax=800" width="170" height="130" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;No projeto CalculadoraBase, vamos adicionar e implementar a classe Calculadora:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TJ6cxieSrtI/AAAAAAAAAww/G2EqvADHmw4/s1600-h/image%5B26%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TJ6cyM0vfhI/AAAAAAAAAw0/kEzYH52gZx4/image_thumb%5B31%5D.png?imgmax=800" width="417" height="368" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Feito isso, podemos instanciá-la nos outros projetos e consumir suas regras, veja:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_a2CzM_HCl5c/TJ6cyt1RuUI/AAAAAAAAAw4/9L70VOJ_bvw/s1600-h/image%5B31%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TJ6czGNf8LI/AAAAAAAAAw8/IdK8VXdtL5w/image_thumb%5B37%5D.png?imgmax=800" width="202" height="224" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_a2CzM_HCl5c/TJ6czlKTqVI/AAAAAAAAAxA/L4DTKtzLWYg/s1600-h/image%5B36%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TJ6c0IeYLtI/AAAAAAAAAxE/JsUNbsfe4TA/image_thumb%5B44%5D.png?imgmax=800" width="321" height="332" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_a2CzM_HCl5c/TJ6c05R7JjI/AAAAAAAAAxI/u3SNcJCg7Qc/s1600-h/image%5B41%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh4.ggpht.com/_a2CzM_HCl5c/TJ6c1SVExmI/AAAAAAAAAxM/zk_emNwN2ac/image_thumb%5B50%5D.png?imgmax=800" width="243" height="190" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_a2CzM_HCl5c/TJ6c1zhn_xI/AAAAAAAAAxQ/LKPmbQbF8Fo/s1600-h/image%5B51%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TJ6c2ir6mSI/AAAAAAAAAxU/cOK6A-FuJ0s/image_thumb%5B63%5D.png?imgmax=800" width="403" height="406" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_a2CzM_HCl5c/TJ6c3HxxvpI/AAAAAAAAAxY/NBSV2ejtyyY/s1600-h/image%5B52%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TJ6c3xAQqpI/AAAAAAAAAxc/NveUFHsS_JM/image_thumb%5B64%5D.png?imgmax=800" width="289" height="334" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Pronto! temos aí uma prova de conceito. Centralizamos a regra em um projeto e distribuímos as funcionalidades (já prontas) em três frentes!&lt;/p&gt;  &lt;p&gt;Agora imagine que você pode fazer isso com sua aplicação… Comercial por exemplo. Vamos pensar: Uma aplicação comercial Orientada a Objetos, tem que ter objetos mapeados da base de dados. Além disso, ela tem as regras de negócio, o próprio banco de dados, e uma interface. Nessa linha de raciocínio, teríamos:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_a2CzM_HCl5c/TJ6c4NPHzJI/AAAAAAAAAxg/C_LNajo7QqM/s1600-h/image%5B56%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TJ6c4vgFdII/AAAAAAAAAxk/dgZHwilcJzw/image_thumb%5B66%5D.png?imgmax=800" width="226" height="204" /&gt;&lt;/a&gt;&amp;#160;&lt;a href="http://lh5.ggpht.com/_a2CzM_HCl5c/TJ6c5DLCNZI/AAAAAAAAAxo/cpYtQirZSsc/s1600-h/image%5B60%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh4.ggpht.com/_a2CzM_HCl5c/TJ6c55T2MmI/AAAAAAAAAxs/gYidVAchnVg/image_thumb%5B68%5D.png?imgmax=800" width="306" height="105" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Com esse modelo, caso fosse desejado/necessário plugar uma outra interface gráfica, bastaria referenciar a regra de negócios e o mapeamento do banco de dados. E outras possibilidades também podem ser viabilizadas. Além do que este é um modelo básico. A arquitetura pode ir muito além disso, como por exemplo rodar webservices em servidores externos com pré-requisitos de SO e Hardware. Enfim, não há receita de bolo, o arquiteto tem de planejar (para não dizer arquitetar).&lt;/p&gt;  &lt;p&gt;O arquiteto deve se preocupar com baixo acoplamento, se o desenvolvimento e a manutenção dos elementos também é facilitado, possibilitar o desenvolvimento independente, mudanças terem menor impacto.&lt;/p&gt;  &lt;p&gt;Vejamos mais alguns pontos/ideias da Arquitetura de Software:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Relacionamento com softwares externos &lt;/li&gt;    &lt;li&gt;Comunicação entre os envolvidos no software &lt;/li&gt;    &lt;li&gt;Reuso &lt;/li&gt;    &lt;li&gt;Confiabilidade &lt;/li&gt;    &lt;li&gt;Segurança &lt;/li&gt;    &lt;li&gt;Escalonamento &lt;/li&gt;    &lt;li&gt;Usabilidade &lt;/li&gt;    &lt;li&gt;Visão funcional/lógico. &lt;/li&gt;    &lt;li&gt;Visão organizacional de código &lt;/li&gt;    &lt;li&gt;Design Patterns &lt;/li&gt;    &lt;li&gt;Estrutura do software &lt;/li&gt;    &lt;li&gt;Melhor controle de concorrência/processo/thread &lt;/li&gt;    &lt;li&gt;Visão de protocolos &lt;/li&gt;    &lt;li&gt;Sincronização &lt;/li&gt;    &lt;li&gt;Geração de componentes de software, e até mesmo uso de componentes, adequados ao contexto, de terceiros. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;O arquiteto deve responder perguntas como:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;A solução é Web ou Windows? &lt;/li&gt;    &lt;li&gt;Qual linguagem usar? &lt;/li&gt;    &lt;li&gt;Qual impacto na atualização de uma tecnologia utilizada no software? &lt;/li&gt;    &lt;li&gt;Qual SO? &lt;/li&gt;    &lt;li&gt;E o servidor? &lt;/li&gt;    &lt;li&gt;Como o software deve ser atualizado? &lt;/li&gt;    &lt;li&gt;E a segurança? &lt;/li&gt;    &lt;li&gt;Como vai ocorrer a autenticação? &lt;/li&gt;    &lt;li&gt;Como vai ocorrer sincronizações? &lt;/li&gt;    &lt;li&gt;Quais os protocolos envolvidos? &lt;/li&gt;    &lt;li&gt;Quais os designs patterns envolvidos? &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Concluindo, um bom planejamento arquitetural de seu software é fundamental no mundo contemporâneo de software. Isso ajuda a modularizar, testar, manter e estender seu software. Além do que, &lt;strong&gt;fazer software vai além da escolha de algoritmos e estrutura de dados&lt;/strong&gt;. Pois essa questão envolverá também decisões sobre as estruturas que formarão o sistema, a estrutura global de controle será usada, protocolos de comunicação, sincronização e acesso a dados, atribuição de funcionalidade a elementos do sistema, ou ainda sobre distribuição física dos elementos do sistema.&lt;/p&gt;  &lt;p&gt;E finalmente, isso foi meio que uma visão geral de arquitetura, não disse tudo, a intensão nem é esta. apenas exemplifiquei algumas coisas, mas este é um universo bem maior.&lt;/p&gt;  &lt;p&gt;Espero que tenham gostado &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Alegre" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TJ6c6KrUQqI/AAAAAAAAAxw/uaKX6UZQ0p4/wlEmoticon-smile%5B2%5D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-53665597034642059?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/53665597034642059/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=53665597034642059&amp;isPopup=true' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/53665597034642059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/53665597034642059'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2010/09/um-pouco-de-arquitetura-de-software.html' title='Um pouco de Arquitetura de Software'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_a2CzM_HCl5c/TJ6cuIVP1fI/AAAAAAAAAwU/uqCbbZrC5bQ/s72-c/image_thumb%5B5%5D.png?imgmax=800' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-7922349927858629397</id><published>2010-09-23T09:56:00.001-03:00</published><updated>2010-09-23T09:56:38.150-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Linq to SQL com Transaction</title><content type='html'>&lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://programminglinq.com/images/0735624003.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;Para quem não se lembra, quando estamos trabalhando com banco de dados, há casos em que temos que realizar uma série de manipulações de dados (inserts, updates, deletes etc). Mas e se algo der errado no meio do caminho? Teríamos como “desfazer” as operações realizadas anteriormente?&lt;/p&gt;  &lt;p&gt;…Tendo em mente que um conjunto de operações em um banco de dados só fará sentido se todas as instruções forem executadas com sucesso.&lt;/p&gt;  &lt;p&gt;Imagine o caso da matricula de um aluno: temos de gravar o aluno no banco de dados, gerar parcelas, grade de aulas. E se na hora de gerara as parcelas ocorrer algum problema? Vou deixar o aluno cadastrado sem parcelas? Nesse caso seria interessante “voltar no tempo”, desfazer o cadastro do aluno para que o usuário tentasse novamente.&lt;/p&gt;  &lt;p&gt;Não é preciso fazer isso na mão. Os bancos de dados tem o recurso de transação. Quando abrimos uma transação, todos os dados manipulados só são efetivados no banco de dados após a confirmação de que tudo está ok. Para isso damos o nome de “commit”.&lt;/p&gt;  &lt;p&gt;Caso algo de errado dentro de uma transação nós temos a opção de “desfazer tudo” automaticamente. Para isso damos o nome de “rollback”.&lt;/p&gt;  &lt;p&gt;Mas isso é noção básica de banco de dados, caso se interessem mais é interessante estudar esse assunto. Ele é de extrema importância no desenvolvimento de software com banco de dados, e resolve uma boa quantidade de problemas de forma simples.&lt;/p&gt;  &lt;p&gt;No Linq to SQL, apesar de “não ocorrer uma interação direta” com os objetos nativos de interação com o banco de dados, é possível realizar transactions normalmente, acompanhe o código a seguir:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;dc.Connection.Open();&lt;/p&gt;    &lt;p&gt;using (DbTransaction transaction = dc.Connection.BeginTransaction(IsolationLevel.ReadCommitted))     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; dc.Transaction = transaction;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; try      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // do database things      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dc.SubmitChanges();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; transaction.Commit();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; catch (Exception ex)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; transaction.Rollback();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;Exception caught; transaction rolled back.&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(ex.ToString());      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;É importante lembrar que o try catch é um aliado imenso nesse tipo de situação.&lt;/p&gt;  &lt;p&gt;Espero ter ajudado, até mais &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Alegre" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TJtOhLsz-BI/AAAAAAAAAwM/cO55ZnDYqig/wlEmoticon-smile%5B2%5D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-7922349927858629397?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/7922349927858629397/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=7922349927858629397&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/7922349927858629397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/7922349927858629397'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2010/09/linq-to-sql-com-transaction.html' title='Linq to SQL com Transaction'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_a2CzM_HCl5c/TJtOhLsz-BI/AAAAAAAAAwM/cO55ZnDYqig/s72-c/wlEmoticon-smile%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-4022921707836808331</id><published>2010-09-21T13:43:00.001-03:00</published><updated>2010-09-21T13:43:13.199-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Estrutura de Dados'/><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>Árvores pt II: Teoria, Introdução, Binárias e AVL.</title><content type='html'>&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_a2CzM_HCl5c/TJjgQGFl23I/AAAAAAAAAvg/77ZbemdRTjU/s1600-h/image%5B2%5D.png" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TJjgSoa_dII/AAAAAAAAAvk/7pwiponfg4g/image_thumb.png?imgmax=800" width="240" height="160" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;No &lt;em&gt;post&lt;/em&gt; passado sobre árvores, foram explanados os conceitos que cercam uma árvore computacional, principalmente as árvores binárias e AVL.&lt;/p&gt;  &lt;p&gt;Neste &lt;em&gt;post&lt;/em&gt; pretendo explicar o código de uma árvore &lt;u&gt;binária&lt;/u&gt; de elementos inteiros, e principalmente as maneiras de listar os elementos de uma árvore (pré-ordem, in-ordem, pós-ordem).&lt;/p&gt;  &lt;p&gt;Vamos ao código:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;#include &amp;lt;stdio.h&amp;gt;     &lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;      &lt;br /&gt;#include &amp;lt;conio.h&amp;gt;&lt;/p&gt;    &lt;p&gt;     &lt;br /&gt;struct Item       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int numero;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *esquerda;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *direita;       &lt;br /&gt;};&lt;/p&gt;    &lt;p&gt;     &lt;br /&gt;bool Inserir(Item **itemAtual, int valor)       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *novo;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Aloca memória para o novo item      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; novo = (Item *)malloc(sizeof(Item));&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Checa se foi alocado memória corretamente.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (novo != NULL)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Define e inicializa os valores.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; novo-&amp;gt;numero = valor;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; novo-&amp;gt;esquerda = NULL;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; novo-&amp;gt;direita = NULL;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Se o nó for nulo então o item alocado é colocado nele.     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(*itemAtual == NULL)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; *itemAtual = novo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(valor &amp;lt; (*itemAtual)-&amp;gt;numero)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; valor menor que o atual vai para a esquerda.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Inserir(&amp;amp;(*itemAtual)-&amp;gt;esquerda, valor);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; valor maior que o atual vai para a direita.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Inserir(&amp;amp;(*itemAtual)-&amp;gt;direita, valor);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return true;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return false;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;}&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p&gt;     &lt;br /&gt;Item** Procurar(Item **itemAtual, int valor)      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if(*itemAtual == NULL)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return NULL;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else if((*itemAtual)-&amp;gt;numero == valor)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return itemAtual;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else if(valor &amp;lt; (*itemAtual)-&amp;gt;numero)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return Procurar(&amp;amp;(*itemAtual)-&amp;gt;esquerda, valor);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return Procurar(&amp;amp;(*itemAtual)-&amp;gt;direita, valor);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;bool Remover(Item **itemAtual, int valor)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item **itemProcurado = Procurar(itemAtual, valor); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; if(itemProcurado == NULL)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;\nItem não encontrado!\n&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return false;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Item *temp = *itemProcurado;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; if((*itemProcurado)-&amp;gt;direita == NULL)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Não tem filho a direita.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (*itemProcurado) = (*itemProcurado)-&amp;gt;esquerda;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else if((*itemProcurado)-&amp;gt;esquerda == NULL)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Não tem filho a esquerda.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (*itemProcurado) = (*itemProcurado)-&amp;gt;direita;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Tem os dois filhos.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Item *anterior = NULL;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; temp = (*itemProcurado)-&amp;gt;esquerda;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; while (temp-&amp;gt;direita != NULL)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; anterior = temp;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; temp = temp-&amp;gt;direita;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (*itemProcurado)-&amp;gt;numero = temp-&amp;gt;numero;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(anterior == NULL)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (*itemProcurado)-&amp;gt;esquerda = temp-&amp;gt;esquerda;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (*itemProcurado)-&amp;gt;direita = temp-&amp;gt;esquerda;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; free(temp);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return true;      &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;     &lt;br /&gt;void ListarPreOrdem(Item *itemAtual)       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (itemAtual != NULL)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;%i; &amp;quot;, itemAtual-&amp;gt;numero);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ListarPreOrdem(itemAtual-&amp;gt;esquerda);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ListarPreOrdem(itemAtual-&amp;gt;direita);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;void ListarInOrdem(Item *itemAtual)      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (itemAtual != NULL)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ListarInOrdem(itemAtual-&amp;gt;esquerda);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;%i; &amp;quot;, itemAtual-&amp;gt;numero);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ListarInOrdem(itemAtual-&amp;gt;direita);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;void ListarPosOrdem(Item *itemAtual)      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (itemAtual != NULL)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ListarPosOrdem(itemAtual-&amp;gt;esquerda);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ListarPosOrdem(itemAtual-&amp;gt;direita);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;%i; &amp;quot;, itemAtual-&amp;gt;numero);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;void Listar(Item *itemAtual)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;Listando... \n\n&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ListarPreOrdem(itemAtual);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;\n\n&amp;quot;);       &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;     &lt;br /&gt;void Menu()       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;Digite a sua escolha: \n&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;#160;&amp;#160;&amp;#160; 1 para inserir um elemento na arvore \n&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;#160;&amp;#160;&amp;#160; 2 para remover um elemento da arvore \n&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;#160;&amp;#160;&amp;#160; 3 para finalizar \n&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;? &amp;quot;);       &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;void main()      &lt;br /&gt;{&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *raiz = NULL;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int opcao;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int numero;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Menu();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;%i&amp;quot;, &amp;amp;opcao);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; while (opcao != 3)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; switch (opcao)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case 1:       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;Digite um numero: &amp;quot;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;\n%i&amp;quot;, &amp;amp;numero);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Inserir(&amp;amp;raiz, numero);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Listar(raiz);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case 2:       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot; Digite o numero a ser removido: &amp;quot;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; scanf( &amp;quot;\n%i&amp;quot;, &amp;amp;numero);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Remover(&amp;amp;raiz, numero);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Listar(raiz);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; default:      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;Escolha invalida.\n\n&amp;quot;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Menu();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;%i&amp;quot;, &amp;amp;opcao);&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;Fim do programa.\n&amp;quot;);       &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Resultado:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_a2CzM_HCl5c/TJjgUHZHqVI/AAAAAAAAAvo/OYEFnn4tgdI/s1600-h/image%5B7%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh5.ggpht.com/_a2CzM_HCl5c/TJjgXg3GdjI/AAAAAAAAAvs/aQwcbl0kHLI/image_thumb%5B3%5D.png?imgmax=800" width="503" height="294" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Começando pela &lt;em&gt;struct &lt;/em&gt;&lt;u&gt;Item&lt;/u&gt;: Ela contém o elemento inteiro que será armazenado, e um ponteiro “para a esquerda” e outro “para a direita”. Lembrando que, conceitualmente, uma árvore binária tem os elementos &lt;u&gt;menores (que o elemento atual) armazenados a esquerda do elemento atual&lt;/u&gt;, e &lt;u&gt;os maiores que o elemento atual à direita (do elemento atual)&lt;/u&gt;.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Inserir&lt;/u&gt;: Basicamente temos de seguir a regra para saber se o elemento que esta sendo inserido é maior ou menor que o atual. O atual começa pela raiz da árvore e se estende pelos filhos, até que se encontre um nó nulo. Imagine que temos uma árvore que só tem um elemento, o número 5. Esse elemento será a raiz, e ao inserirmos um número 3, por ele ser menor, terá de ser inserido no ponteiro da “esquerda”. ao inserirmos o elemento 4, ele irá verificar a raiz, sendo menor que ela, o número 4 terá de ir para a “esquerda” e encontrará o elemento 3. 4 é maior que o 3 ele e terá que ficar no ponteiro da “direita” de 3! Para isso é alocado um novo elemento, e é verificado se o item atual é nulo. Se for, ele é referenciado. Se não é verificado com o número do &lt;u&gt;Item&lt;/u&gt; atual se o item atual terá de ser o que está a esquerda ou a direita do nó.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Procurar&lt;/u&gt;: Faz um processo similar ao do &lt;u&gt;Inserir&lt;/u&gt;. Se o elemento atual for nulo, quer dizer que o elemento procurado não foi encontrado! Se o número for igual ao procurado então a referencia para o &lt;u&gt;Item&lt;/u&gt; é retornada. Se o elemento for maior do que o atual, devemos ir para a direita, caso contrário: esquerda neles! Usaremos para encontrar o nó que será removido.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Remover&lt;/u&gt;: Essa função é um pouco crítica, pois ao removermos um nó, temos que manter seus filhos vinculados na árvore. Após encontrar o elemento que será removido, verificamos se há filhos maiores (à direita). Se o elemento removido não tiver filhos à direita, o nó da esquerda é vinculado ao ponteiro de seu pai. O processo inverso, com a esquerda, também é feito caso tenha filhos à direita. Se o elemento tiver filho à esquerda e à direita, então é localizado o maior elemento (à direita) para substituí-lo. A última linha da função libera a memória do nó removido.&lt;/p&gt;  &lt;p&gt;As listagens eu vou explicar com imagens:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TJjgaGbSlXI/AAAAAAAAAvw/RpV0k-1wWZ0/s1600-h/image%5B13%5D.png" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TJjgcWQtk9I/AAAAAAAAAv0/dpgvPLR8Cv0/image_thumb%5B13%5D.png?imgmax=800" width="522" height="312" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_a2CzM_HCl5c/TJjgdvyW-CI/AAAAAAAAAv4/S0TFd8LTzHE/s1600-h/image%5B20%5D.png" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh4.ggpht.com/_a2CzM_HCl5c/TJjgfVA24FI/AAAAAAAAAv8/Q47ketZtEkM/image_thumb%5B23%5D.png?imgmax=800" width="522" height="425" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_a2CzM_HCl5c/TJjggCjYz2I/AAAAAAAAAwA/oOfPz9d_eww/s1600-h/image%5B30%5D.png" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh4.ggpht.com/_a2CzM_HCl5c/TJjgkcI6eII/AAAAAAAAAwE/TWTqiWJOepc/image_thumb%5B34%5D.png?imgmax=800" width="522" height="458" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Nas listagens, basicamente o que se muda é onde imprimimos o elemento. Lembrando que as funções são recursivas.&lt;/p&gt;  &lt;p&gt;Só para fixar melhor o conceito das “ordens”, para somarmos o número 2 no número 3, teríamos a seguinte notação:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Pré-Ordem: + 2 2&lt;/li&gt;    &lt;li&gt;In-Ordem: 2 + 2&lt;/li&gt;    &lt;li&gt;Pós-Ordem: 2 2 +&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Agora vamos à parte divertida da coisa, exercícios:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Fazer uma árvore para armazenar alunos (Nome, RA e Ano de Nascimento). O Índice da árvore deve ser baseado no ano do nascimento do aluno. Na listagem o usuário deve escolher qual ordem listar!&lt;/li&gt; &lt;/ol&gt;    &lt;p&gt;Boa sorte, e continuarei falando mais sobre árvores em outro &lt;em&gt;post&lt;/em&gt;! &lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-nerdsmile" alt="Smiley nerd" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TJjgnNIO2hI/AAAAAAAAAwI/kYxO7t481GU/wlEmoticon-nerdsmile%5B2%5D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-4022921707836808331?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/4022921707836808331/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=4022921707836808331&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/4022921707836808331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/4022921707836808331'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2010/09/arvores-pt-ii-teoria-introducao.html' title='Árvores pt II: Teoria, Introdução, Binárias e AVL.'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_a2CzM_HCl5c/TJjgSoa_dII/AAAAAAAAAvk/7pwiponfg4g/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-970243691062772992</id><published>2010-09-21T10:58:00.001-03:00</published><updated>2010-09-21T10:58:25.798-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eventos'/><category scheme='http://www.blogger.com/atom/ns#' term='off-topic'/><title type='text'>#CommunityZone: Eu Fui!</title><content type='html'>&lt;p&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" border="0" src="http://i.msdn.microsoft.com/ee402630.CommunityZone(pt-br,MSDN.10).png" /&gt;&lt;/p&gt;  &lt;p&gt;Um grande evento que propicia as pessoas mais influentes nas plataformas Microsoft se conhecerem e se divertirem, bem como conhecer mais as comunidades, se aproximar delas e planejar o futuro do conhecimento e tecnologia!&lt;/p&gt;  &lt;p&gt;Este é o &lt;a href="http://msdn.microsoft.com/pt-br/dd883291.aspx" target="_blank"&gt;Community Zone&lt;/a&gt;, que aconteceu dias 16 e 17 de Setembro, no &lt;a href="http://ranchosilvestre.com.br/" target="_blank"&gt;Hotel Rancho Silvestre&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;O lugar onde foi realizado o evento é show e as pessoas são gente fina! Quando chegamos na quinta-feira (dia 16) tivemos a oportunidade de descansar, após a correria do &lt;a href="http://spokydev.blogspot.com/2010/09/techedbr-eu-fui.html" target="_blank"&gt;TechEd&lt;/a&gt;, e nos divertir, com churrasco, piscina, ping-pong, sinuca, boliche, Rock Bando no Xbox, amigos… enfim, só alegria.&lt;/p&gt;  &lt;p&gt;Além disso, tive a oportunidade de novamente interagir com velhos amigos, e criar novas amizades com as pessoas mais influentes e inteligentes da comunidade.&lt;/p&gt;  &lt;p&gt;Parabéns pela Microsoft, pela iniciativa, e pelos que foram pro proporcionar mais conhecimento, interação diversão e excelentes papos &lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Alegre" src="http://lh4.ggpht.com/_a2CzM_HCl5c/TJi59MtPbkI/AAAAAAAAAvU/ptqxnxHmzMc/wlEmoticon-smile%5B2%5D.png?imgmax=800" /&gt;.&lt;/p&gt;  &lt;p&gt;Esse foi um verdadeiro upgrade no meu networking, e aguardo o &lt;a href="http://spokydev.blogspot.com/search/label/Contato" target="_blank"&gt;e-mail&lt;/a&gt; de vocês com nome e twitter para eu divulgar aqui em!&lt;/p&gt;  &lt;p&gt;Foi minha primeira vez em um evento deste e espero ir muitas vezes mais.&lt;/p&gt;  &lt;p&gt;Além disso tive a oportunidade de interagir em inglês com os gringos lá presentes.&lt;/p&gt;  &lt;p&gt;Fiquem com as fotos:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; padding-left: 0px; width: 420px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px" id="scid:66721397-FF69-4ca6-AEC4-17E6B3208830:6c531a4f-128d-4ba7-a26d-21a993ef306d" class="wlWriterEditableSmartContent"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a style="border:0px" target="_blank" href="http://cid-23b586fa915f2631.skydrive.live.com/redir.aspx?page=play&amp;amp;resid=23B586FA915F2631!1537&amp;amp;type=5&amp;amp;Bsrc=Photomail&amp;amp;Bpub=SDX.Photos"&gt;&lt;img style="border:0px" alt="Exibir &amp;aacute;lbum" title="Exibir &amp;aacute;lbum" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TJi5_K_dtzI/AAAAAAAAAvY/seylb_Tiulw/Community%20Zone%202010%5B2%5D.jpg?imgmax=800" /&gt;&lt;/a&gt;&lt;div style='width:410px;text-align:center;overflow:visible;'&gt;                                            &lt;div style='width:410px;overflow:visible;'&gt;&lt;a style="text-decoration:none;" href="http://cid-23b586fa915f2631.skydrive.live.com/redir.aspx?page=browse&amp;amp;resid=23B586FA915F2631!1537&amp;amp;type=5&amp;amp;Bsrc=Photomail&amp;amp;Bpub=SDX.Photos" target="_blank"&gt;&lt;span  style="line-height:1.26em;padding:0px;width:410px;font-size:26 pt;font-family:'Segoe UI', helvetica, arial, sans-serif;"  defaultText='Inserir nome do álbum aqui'&gt;Community Zone 2010&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;                                            &lt;div style="text-align:center;padding:9px 0px 0px 0px;margin:0px 0px 0px 0px;font-family:'Segoe UI', helvetica, arial, sans-serif;font-size:8 pt;"&gt;                                                &lt;table border=0 cellspacing=0 cellpadding=0 style="margin:0px;padding:0px;outline:none;border-style:none;border-collapse:collapse;"&gt;                                     &lt;tr&gt;                                       &lt;td style="outline:none;border-style:none;margin:0px;padding:6px 12px 6px 0px;"&gt;&lt;a href="http://cid-23b586fa915f2631.skydrive.live.com/redir.aspx?page=play&amp;amp;resid=23B586FA915F2631!1537&amp;amp;type=5&amp;amp;Bsrc=Photomail&amp;amp;Bpub=SDX.Photos" border="0" target="_blank" style="font-family:'Segoe UI', helvetica, arial, sans-serif;font-size:8 pt;outline:none;border-style:none;text-decoration: none;padding:0px;margin:0px;"&gt;EXIBIR APRESENTAÇÃO DE SLIDES&lt;/a&gt;&lt;/td&gt;                                       &lt;td style="outline:none;border-style:none;margin:0px;padding:6px 0px 6px 0px;"&gt;&lt;a href="http://cid-23b586fa915f2631.skydrive.live.com/redir.aspx?page=downloadphotos&amp;amp;resid=23B586FA915F2631!1537&amp;amp;type=5&amp;amp;Bsrc=Photomail&amp;amp;Bpub=SDX.Photos" border="0" target="_blank" style="font-family:'Segoe UI', helvetica, arial, sans-serif;font-size:8 pt;outline:none;border-style:none;text-decoration: none;padding:0px;margin:0px;"&gt;BAIXAR TUDO&lt;/a&gt;&lt;/td&gt;                                                                            &lt;/tr&gt;                                   &lt;/table&gt;                                                                                                                                &lt;/div&gt;                                                                                       &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;  &lt;p align="center"&gt;&lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-openmouthedsmile" alt="Smiley de boca aberta" src="http://lh5.ggpht.com/_a2CzM_HCl5c/TJi5_w45ZiI/AAAAAAAAAvc/GMulsDT6hMM/wlEmoticon-openmouthedsmile%5B2%5D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-970243691062772992?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/970243691062772992/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=970243691062772992&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/970243691062772992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/970243691062772992'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2010/09/communityzone-eu-fui.html' title='#CommunityZone: Eu Fui!'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_a2CzM_HCl5c/TJi59MtPbkI/AAAAAAAAAvU/ptqxnxHmzMc/s72-c/wlEmoticon-smile%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-5053018861575847848</id><published>2010-09-21T10:12:00.001-03:00</published><updated>2010-09-21T10:12:04.317-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eventos'/><category scheme='http://www.blogger.com/atom/ns#' term='off-topic'/><title type='text'>#TechEdBR: Eu Fui!</title><content type='html'>&lt;p&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" border="0" src="http://www.teched.com.br/2010/Library/images/botton_c_180x180.png" /&gt;&lt;/p&gt;  &lt;p&gt;Bem, minha vez de contar como foi este fascinante evento.Vou diferenciar um pouco meu &lt;em&gt;post&lt;/em&gt;, trazendo mais para o lado da aventura pessoal que ele representou. Foi realmente o evento dos feras! Apesar de prós e contras, foi meu primeiro evento deste porte e fiquei maravilhado em ir em um dos maiores eventos de tecnologia do país!&lt;/p&gt;  &lt;p&gt;obs: no final do &lt;em&gt;post&lt;/em&gt; esta uma compilação de fotos que juntei do TechEd.&lt;/p&gt;  &lt;p&gt;Gostaria de adiantar o quanto é importante um evento desse, não só pelas suas trilhas técnicas, mas também pelo networking, possibilidade de novas amizades e contatos com pessoas excepcionais, além de um contato direto e humano com MVPs, Evangelistas e outros profissionais tão brilhantes quanto, e re-encontrar velhos amigo é claro.&lt;/p&gt;  &lt;p&gt;Foi legal conhecer pessoalmente pessoas que mantenho contato no mundo virtual, pelas redes sociais, blogs e twitters da vida. Parabéns a todos!&lt;/p&gt;  &lt;div style="padding-bottom: 0px; padding-left: 0px; width: 420px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px" id="scid:66721397-FF69-4ca6-AEC4-17E6B3208830:d6b7b10d-15ca-40c5-b5c1-da8a4036f4d9" class="wlWriterEditableSmartContent"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a style="border:0px" target="_blank" href="http://cid-23b586fa915f2631.skydrive.live.com/redir.aspx?page=play&amp;amp;resid=23B586FA915F2631!1391&amp;amp;type=5&amp;amp;Bsrc=Photomail&amp;amp;Bpub=SDX.Photos"&gt;&lt;img style="border:0px" alt="Exibir &amp;aacute;lbum" title="Exibir &amp;aacute;lbum" src="http://lh4.ggpht.com/_a2CzM_HCl5c/TJivFZumF0I/AAAAAAAAAvA/5DDNUpe8bO8/Viagem%20TechEd%20-%20CommunityZone%202010%5B1%5D.jpg?imgmax=800" /&gt;&lt;/a&gt;&lt;div style='width:410px;text-align:center;overflow:visible;'&gt;                                            &lt;div style='width:410px;overflow:visible;'&gt;&lt;a style="text-decoration:none;" href="http://cid-23b586fa915f2631.skydrive.live.com/redir.aspx?page=browse&amp;amp;resid=23B586FA915F2631!1391&amp;amp;type=5&amp;amp;Bsrc=Photomail&amp;amp;Bpub=SDX.Photos" target="_blank"&gt;&lt;span  style="line-height:1.26em;padding:0px;width:410px;font-size:26 pt;font-family:'Segoe UI', helvetica, arial, sans-serif;"  defaultText='Inserir nome do álbum aqui'&gt;Viagem TechEd - CommunityZone 2010&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;                                            &lt;div style="text-align:center;padding:9px 0px 0px 0px;margin:0px 0px 0px 0px;font-family:'Segoe UI', helvetica, arial, sans-serif;font-size:8 pt;"&gt;                                                &lt;table border=0 cellspacing=0 cellpadding=0 style="margin:0px;padding:0px;outline:none;border-style:none;border-collapse:collapse;"&gt;                                     &lt;tr&gt;                                       &lt;td style="outline:none;border-style:none;margin:0px;padding:6px 12px 6px 0px;"&gt;&lt;a href="http://cid-23b586fa915f2631.skydrive.live.com/redir.aspx?page=play&amp;amp;resid=23B586FA915F2631!1391&amp;amp;type=5&amp;amp;Bsrc=Photomail&amp;amp;Bpub=SDX.Photos" border="0" target="_blank" style="font-family:'Segoe UI', helvetica, arial, sans-serif;font-size:8 pt;outline:none;border-style:none;text-decoration: none;padding:0px;margin:0px;"&gt;EXIBIR APRESENTAÇÃO DE SLIDES&lt;/a&gt;&lt;/td&gt;                                       &lt;td style="outline:none;border-style:none;margin:0px;padding:6px 0px 6px 0px;"&gt;&lt;a href="http://cid-23b586fa915f2631.skydrive.live.com/redir.aspx?page=downloadphotos&amp;amp;resid=23B586FA915F2631!1391&amp;amp;type=5&amp;amp;Bsrc=Photomail&amp;amp;Bpub=SDX.Photos" border="0" target="_blank" style="font-family:'Segoe UI', helvetica, arial, sans-serif;font-size:8 pt;outline:none;border-style:none;text-decoration: none;padding:0px;margin:0px;"&gt;BAIXAR TUDO&lt;/a&gt;&lt;/td&gt;                                                                            &lt;/tr&gt;                                   &lt;/table&gt;                                                                                                                                &lt;/div&gt;                                                                                       &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;  &lt;p&gt;A começar pela viagem, cheguei em São Paulo no domingo (dia 14) pela manhã, após viajar com o pessoal da &lt;a href="http://twitter.com/wrati" target="_blank"&gt;@wrati&lt;/a&gt;. Após tomar um maravilhoso café, na casa da tia do &lt;a href="http://twitter.com/wagner_kondo" target="_blank"&gt;@wagner_kondo&lt;/a&gt;, e almoçar no shopping. Fomos para um hotel, o qual não nos agradou… bem o que esperar de um hotel que a porta do banheiro sai na sua mão?&lt;/p&gt;  &lt;p&gt;No dia seguinte estava lá eu, com mala, mochila e tudo mais, no Expo Center Norte, uma estrutura imensa abrigando o excepcional TechEd. Tínhamos um regado café da manhã a disposição e dei inicio ao networking... e a comilança.&lt;/p&gt;  &lt;p&gt;Pouco depois das 9h da manhã, começou a general session, a abertura do evento, bem divertida por sinal. Particularmente gostei do Remote FX (Tecnologia de Remote Desktop com interação Rica de multimídia), que o pessoal jogou Guitar Hero remotamente sem delay!&lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://zonainfinita.files.wordpress.com/2009/05/guitar-hero-3-legend-rock-1593.jpg" width="240" height="180" /&gt;&lt;/p&gt;      &lt;p&gt;E nos finalmentes o tão esperado Kinect:&lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://fabriciosanchez.com.br/site/wp-content/uploads/2010/09/kinect_for_xbox_360.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;O que me surpreendeu foi o Kinect funcionar perfeitamente no palco, mesmo com toda a poluição visual e térmica que o ambiente gerava!&lt;/p&gt;  &lt;p&gt;Outro ponto importante e impressionante da general session, que foi reforçado em uma palestra que presenciei, foi o Windows Phone 7… e eu preciso disso!&lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" alt="Esse WP7 possui teclado." src="http://fasoaresbr.files.wordpress.com/2010/09/imag0114.jpg?w=800" width="240" height="180" /&gt;&lt;/p&gt;  &lt;p&gt;Depois disso, fui almoçar rapidão, e ir para a maratona de palestras. O almoço estava muito bom, era servido no local, e estava incluso no passaporte para o evento, com direito a sobremesa &lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Alegre" src="http://lh5.ggpht.com/_a2CzM_HCl5c/TJivGWTLB1I/AAAAAAAAAvE/OrcYb_32El4/wlEmoticon-smile%5B2%5D.png?imgmax=800" /&gt;.&lt;/p&gt;  &lt;p&gt;Enfim, toda a estrutura do evento é sensacional! A wireless oferecida de vez em quando tinha oscilações, e a Internet do meu celular pifou logo no inicio do evento, o que prejudicou minha cobertura sobre o mesmo.&lt;/p&gt;  &lt;p&gt;Nas palestras, mais um show de organização, slides, telão e som impecáveis. Agenda impressa no crachá, e TVs informando quais eram as palestras dos auditórios.&lt;/p&gt;  &lt;p&gt;Depois vou fazer um post, trilhando minha opinião sobre as palestras que presenciei.&lt;/p&gt;  &lt;p&gt;Um ponto quente do evento foi a noite de terça (dia 14) no Ask The Experts, onde dei uma apertada nos MVPs e Evangelistas com minhas dúvidas &lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-openmouthedsmile" alt="Smiley de boca aberta" src="http://lh5.ggpht.com/_a2CzM_HCl5c/TJivHJVUaJI/AAAAAAAAAvI/nUpwu011tpM/wlEmoticon-openmouthedsmile%5B2%5D.png?imgmax=800" /&gt;.&lt;/p&gt;  &lt;p&gt;Uma sugestão minha: os organizadores e patrocinadores não tem obrigação nenhuma de fornecer brindes, mas estes mimos só me fazem mais feliz e falar melhor ainda do evento. Achei fraco os agrados pelo tamanho do evento.&lt;/p&gt;  &lt;p&gt;De momento quero agradecer a &lt;a href="http://wra.com.br/" target="_blank"&gt;WRA gestão em TI&lt;/a&gt; e ao seu diretor &lt;a href="http://twitter.com/mrealprado" target="_blank"&gt;Mauricio Real Prado&lt;/a&gt; que viabilizaram para que eu ficasse uma semana em São Paulo para o Tech Ed e Community Zone.&lt;/p&gt;  &lt;p&gt;Gostaria de agradecer também à &lt;a href="http://www.microsoft.com/pt/br/default.aspx" target="_blank"&gt;Microsoft Brasil&lt;/a&gt; que viabilizou minha estadia no TechEd e CommunityZone. Bem como o pessoal da produção do evento, por mais este TechEd.&lt;/p&gt;  &lt;p&gt;Finalmente, obrigado a todos os profissionais que tive a oportunidade de conhecer e interagir. Gostaria que me mandassem um e-mail com nome e twitter para eu publicar aqui no blog essa fantástica networking e agradecê-los. (o e-mail está no menu do blog ou clicando &lt;a href="http://spokydev.blogspot.com/search/label/Contato" target="_blank"&gt;aqui&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;Fiquem com as fotos, obrigado… fui!&lt;/p&gt;  &lt;div style="padding-bottom: 0px; padding-left: 0px; width: 416px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px" id="scid:66721397-FF69-4ca6-AEC4-17E6B3208830:39231a64-084b-4e4b-8d18-37d11327c8de" class="wlWriterEditableSmartContent"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a style="border:0px" target="_blank" href="http://cid-23b586fa915f2631.skydrive.live.com/redir.aspx?page=play&amp;amp;resid=23B586FA915F2631!1410&amp;amp;type=5&amp;amp;Bsrc=Photomail&amp;amp;Bpub=SDX.Photos"&gt;&lt;img style="border:0px" alt="Exibir &amp;aacute;lbum" title="Exibir &amp;aacute;lbum" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TJivH_0aFmI/AAAAAAAAAvM/E_yXjFLN7go/TechEd%202010%5B7%5D.jpg?imgmax=800" /&gt;&lt;/a&gt;&lt;div style='width:410px;text-align:center;overflow:visible;'&gt;                                            &lt;div style='width:410px;overflow:visible;'&gt;&lt;a style="text-decoration:none;" href="http://cid-23b586fa915f2631.skydrive.live.com/redir.aspx?page=browse&amp;amp;resid=23B586FA915F2631!1410&amp;amp;type=5&amp;amp;Bsrc=Photomail&amp;amp;Bpub=SDX.Photos" target="_blank"&gt;&lt;span  style="line-height:1.26em;padding:0px;width:410px;font-size:26 pt;font-family:'Segoe UI', helvetica, arial, sans-serif;"  defaultText='Inserir nome do álbum aqui'&gt;TechEd 2010&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;                                            &lt;div style="text-align:center;padding:9px 0px 0px 0px;margin:0px 0px 0px 0px;font-family:'Segoe UI', helvetica, arial, sans-serif;font-size:8 pt;"&gt;                                                &lt;table border=0 cellspacing=0 cellpadding=0 style="margin:0px;padding:0px;outline:none;border-style:none;border-collapse:collapse;"&gt;                                     &lt;tr&gt;                                       &lt;td style="outline:none;border-style:none;margin:0px;padding:6px 12px 6px 0px;"&gt;&lt;a href="http://cid-23b586fa915f2631.skydrive.live.com/redir.aspx?page=play&amp;amp;resid=23B586FA915F2631!1410&amp;amp;type=5&amp;amp;Bsrc=Photomail&amp;amp;Bpub=SDX.Photos" border="0" target="_blank" style="font-family:'Segoe UI', helvetica, arial, sans-serif;font-size:8 pt;outline:none;border-style:none;text-decoration: none;padding:0px;margin:0px;"&gt;EXIBIR APRESENTAÇÃO DE SLIDES&lt;/a&gt;&lt;/td&gt;                                       &lt;td style="outline:none;border-style:none;margin:0px;padding:6px 0px 6px 0px;"&gt;&lt;a href="http://cid-23b586fa915f2631.skydrive.live.com/redir.aspx?page=downloadphotos&amp;amp;resid=23B586FA915F2631!1410&amp;amp;type=5&amp;amp;Bsrc=Photomail&amp;amp;Bpub=SDX.Photos" border="0" target="_blank" style="font-family:'Segoe UI', helvetica, arial, sans-serif;font-size:8 pt;outline:none;border-style:none;text-decoration: none;padding:0px;margin:0px;"&gt;BAIXAR TUDO&lt;/a&gt;&lt;/td&gt;                                                                            &lt;/tr&gt;                                   &lt;/table&gt;                                                                                                                                &lt;/div&gt;                                                                                       &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;  &lt;p&gt;&lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-rollingonthefloorlaughing" alt="Gargalhando" src="http://lh4.ggpht.com/_a2CzM_HCl5c/TJivIsHt7LI/AAAAAAAAAvQ/ury2e5gkfbc/wlEmoticon-rollingonthefloorlaughing%5B2%5D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-5053018861575847848?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/5053018861575847848/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=5053018861575847848&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/5053018861575847848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/5053018861575847848'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2010/09/techedbr-eu-fui.html' title='#TechEdBR: Eu Fui!'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_a2CzM_HCl5c/TJivFZumF0I/AAAAAAAAAvA/5DDNUpe8bO8/s72-c/Viagem%20TechEd%20-%20CommunityZone%202010%5B1%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-319179014035128414</id><published>2010-08-31T19:13:00.001-03:00</published><updated>2010-08-31T19:59:35.787-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Estrutura de Dados'/><title type='text'>Árvores pt I: Teoria, Introdução, Binárias e AVL.</title><content type='html'>&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_a2CzM_HCl5c/TH2Hi3AVldI/AAAAAAAAAtY/dfhxgjuNlKw/s1600-h/image%5B2%5D.png" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh5.ggpht.com/_a2CzM_HCl5c/TH2HjlXFtXI/AAAAAAAAAtc/lAQNXOsN5tU/image_thumb.png?imgmax=800" width="240" height="121" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Árvores são estruturas de dados que nos proporcionam controles otimizados sobre uma coleção de dados. Podemos usá-la para prover uma pesquisa mais rápida de um determinado elemento, bem como apresentações diferenciadas dos dados (listagens em pré-ordem, in-ordem e pós-ordem). Depois analisaremos isto com mais detalhes.&lt;/p&gt;  &lt;p&gt;As árvores proporcionam vantagens tanto na listagem, e em alguns casos na remoção e inserção de elementos também(quando a mesma não for balanceada a cada operação).&lt;/p&gt;  &lt;p&gt;Então, ela nada mais é do que um conjunto de elementos denominados vértices. Na verdade há muito o que conhecer sobre seus elementos e estrutura, e é isto que eu pretendo explicar neste post.&lt;/p&gt;  &lt;p&gt;Mas antes vejamos algumas aplicações da mesma:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Banco de Dados &lt;/li&gt;    &lt;li&gt;Inteligência Artificial &lt;/li&gt;    &lt;li&gt;Avaliação de expressões Lógicas e/ou Matemáticas &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TH2HkNsZUpI/AAAAAAAAAtg/qTXLF5PHddM/s1600-h/Slide2%5B2%5D.jpg" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="Slide2" alt="Slide2" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TH2HkwB9JgI/AAAAAAAAAtk/mGwkTQ3WIXo/Slide2_thumb.jpg?imgmax=800" width="240" height="180" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Seus elementos:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Raiz: Elemento mais ao alto, o primeiro elemento de referência da árvore. &lt;/li&gt;    &lt;li&gt;Nó ou Vértice: o elemento da árvore. &lt;/li&gt;    &lt;li&gt;Folha: últimos elementos, os mais profundos, e que não tem filhos. &lt;/li&gt;    &lt;li&gt;Aresta: Conector dos elementos, indicando sua relação. &lt;/li&gt;    &lt;li&gt;Pai: Elemento que contém vértices conectados a ele em profundidade mais elevada. &lt;/li&gt;    &lt;li&gt;Filho: Elemento que contém um vértice superior vinculado a ele. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Sua estrutura:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Sub-árvore: Um pedaço de uma árvore analisado separadamente. &lt;/li&gt;    &lt;li&gt;Floresta: Conjunto de árvores e/ou sub-árvores. &lt;/li&gt;    &lt;li&gt;Altura: Quantidade de nós máxima ao seguir por um caminho (se nos referirmos a altura de uma árvore, então considerasse o maior caminho da mesma). &lt;/li&gt;    &lt;li&gt;Profundidade: Quantidades de arestas até um determinado nó (se nos referirmos a uma árvore, então considerasse o maior caminho da mesma). &lt;/li&gt;    &lt;li&gt;Grau: quantidade de filhos de uma vértice. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_a2CzM_HCl5c/TH2HlthFHUI/AAAAAAAAAto/eAKfG9cWfFA/s1600-h/Slide3%5B2%5D.jpg" target="_blank"&gt;&lt;img style="display: inline" title="Slide3" alt="Slide3" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TH2HmMq4_OI/AAAAAAAAAts/RmR040RBpZ4/Slide3_thumb.jpg?imgmax=800" width="240" height="180" /&gt;&lt;/a&gt; &lt;a href="http://lh6.ggpht.com/_a2CzM_HCl5c/TH2HmhkCJLI/AAAAAAAAAtw/ADars96ZEKU/s1600-h/Slide4%5B2%5D.jpg" target="_blank"&gt;&lt;img style="display: inline" title="Slide4" alt="Slide4" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TH2HnCcZs_I/AAAAAAAAAt0/OEYN70o5pFQ/Slide4_thumb.jpg?imgmax=800" width="240" height="180" /&gt;&lt;/a&gt; &lt;a href="http://lh4.ggpht.com/_a2CzM_HCl5c/TH2Hno6U9MI/AAAAAAAAAt4/kc9m-2OtbOE/s1600-h/Slide5%5B2%5D.jpg" target="_blank"&gt;&lt;img style="display: inline" title="Slide5" alt="Slide5" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TH2HoAlRThI/AAAAAAAAAt8/h9OOcL28xLk/Slide5_thumb.jpg?imgmax=800" width="240" height="180" /&gt;&lt;/a&gt; &lt;a href="http://lh5.ggpht.com/_a2CzM_HCl5c/TH2HohoBQUI/AAAAAAAAAuA/xu2GEWUrwZI/s1600-h/Slide6%5B2%5D.jpg" target="_blank"&gt;&lt;img style="display: inline" title="Slide6" alt="Slide6" src="http://lh4.ggpht.com/_a2CzM_HCl5c/TH2HpRnthJI/AAAAAAAAAuE/c_5IyWVbA0E/Slide6_thumb.jpg?imgmax=800" width="240" height="180" /&gt;&lt;/a&gt; &lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TH2HpxcmttI/AAAAAAAAAuI/6whQX6-zctc/s1600-h/Slide7%5B2%5D.jpg" target="_blank"&gt;&lt;img style="display: inline" title="Slide7" alt="Slide7" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TH2Hqb10yRI/AAAAAAAAAuM/OCYwFXqtAc8/Slide7_thumb.jpg?imgmax=800" width="240" height="180" /&gt;&lt;/a&gt; &lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TH2Hq_sCsdI/AAAAAAAAAuQ/xKxja1ryfo4/s1600-h/Slide8%5B2%5D.jpg" target="_blank"&gt;&lt;img style="display: inline" title="Slide8" alt="Slide8" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TH2HrharstI/AAAAAAAAAuU/Qf8pb_FYaZI/Slide8_thumb.jpg?imgmax=800" width="240" height="180" /&gt;&lt;/a&gt; &lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TH2HtKgZW_I/AAAAAAAAAuY/BuofyIkgVyU/s1600-h/Slide9%5B2%5D.jpg" target="_blank"&gt;&lt;img style="display: inline" title="Slide9" alt="Slide9" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TH2HtutL7hI/AAAAAAAAAuc/GWOqhX_hkDk/Slide9_thumb.jpg?imgmax=800" width="240" height="180" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Árvore Binária: É caracterizada por vértices que podem ter no máximo dois filhos. Por padrão, se o filho for menor do que o pai ele deve ser alocado à esquerda. Se o filho for maior que o pai, então é alocado a direita. Com isso ganhamos agilidade ao procurar e inserir um elemento, pois temos um caminho mais otimizado para percorrer!&lt;/p&gt;  &lt;p&gt;Árvore AVL: É uma árvore binária, porém balanceada, ou seja, tentando fazer com que o caminho até suas folhas sejam menores possíveis e de alturas e profundidades parecidas.&lt;/p&gt;  &lt;p&gt;Ambas as árvores (Binária e AVL) tratarei mais detalhadamente em outro post.&lt;/p&gt;  &lt;p&gt;Por hora, fica o resumo da ópera em slides:&lt;/p&gt;  &lt;p&gt;&lt;a style="margin: 12px auto 6px; display: block; font: 14px helvetica,arial,sans-serif; text-decoration: underline; font-size-adjust: none; font-stretch: normal; -x-system-font: none" title="View Árvores por Eduardo Spaki on Scribd" href="http://www.scribd.com/doc/36700755/Arvores-por-Eduardo-Spaki"&gt;Árvores por Eduardo Spaki&lt;/a&gt; &lt;object id="doc_93343398309858" name="doc_93343398309858" height="500" width="100%" type="application/x-shockwave-flash" data="http://d1.scribdassets.com/ScribdViewer.swf" style="outline:none;" rel="media:presentation" resource="http://d1.scribdassets.com/ScribdViewer.swf?document_id=36700755&amp;access_key=key-1h1bm50i0qnusooc4f89&amp;page=1&amp;viewMode=slideshow" &gt;		&lt;param name="movie" value="http://d1.scribdassets.com/ScribdViewer.swf"&gt;		&lt;param name="wmode" value="opaque"&gt; 		&lt;param name="bgcolor" value="#ffffff"&gt; 		&lt;param name="allowFullScreen" value="true"&gt; 		&lt;param name="allowScriptAccess" value="always"&gt; 		&lt;param name="FlashVars" value="document_id=36700755&amp;amp;access_key=key-1h1bm50i0qnusooc4f89&amp;amp;page=1&amp;amp;viewMode=slideshow"&gt; 		&lt;embed id="doc_93343398309858" name="doc_93343398309858" src="http://d1.scribdassets.com/ScribdViewer.swf?document_id=36700755&amp;amp;access_key=key-1h1bm50i0qnusooc4f89&amp;amp;page=1&amp;amp;viewMode=slideshow" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="500" width="100%" wmode="opaque" bgcolor="#ffffff"&gt;&lt;/embed&gt; 	&lt;/object&gt;&lt;/p&gt;  &lt;p&gt;Ficam alguns exercícios conceituais:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_a2CzM_HCl5c/TH2HuC7PPwI/AAAAAAAAAug/fsaBNzsoPwM/s1600-h/image%5B5%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh5.ggpht.com/_a2CzM_HCl5c/TH2HuvgV4PI/AAAAAAAAAuk/3Dr30XMcyZM/image_thumb%5B1%5D.png?imgmax=800" width="240" height="164" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Dada a figura ao acima:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Qual a altura da árvore? &lt;/li&gt;    &lt;li&gt;Qual o filho à esquerda do nó “b” ? &lt;/li&gt;    &lt;li&gt;Qual o filho à direita do nó “a”? &lt;/li&gt;    &lt;li&gt;Qual a profundidade do nó “i”? &lt;/li&gt;    &lt;li&gt;Quem são as folhas? &lt;/li&gt;    &lt;li&gt;Quem nós são pais de que nós? &lt;/li&gt;    &lt;li&gt;Qual é o grau de cada nó? &lt;/li&gt;    &lt;li&gt;Qual é a altura da árvore? &lt;/li&gt;    &lt;li&gt;Admita que o vértice “e” é a raiz, e redesenhe a árvore com a raiz em cima. &lt;/li&gt;    &lt;li&gt;Admita que o vértice “f” é a raiz, e redesenhe a árvore com a raiz em cima. &lt;/li&gt;    &lt;li&gt;Esta árvore é binária? &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Espero que tenham gostado :)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-319179014035128414?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/319179014035128414/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=319179014035128414&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/319179014035128414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/319179014035128414'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2010/08/arvores-pt-i-teoria-introducao-binarias.html' title='Árvores pt I: Teoria, Introdução, Binárias e AVL.'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_a2CzM_HCl5c/TH2HjlXFtXI/AAAAAAAAAtc/lAQNXOsN5tU/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-4139918162205950682</id><published>2010-08-24T19:58:00.001-03:00</published><updated>2010-08-24T19:58:01.063-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Estrutura de Dados'/><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>BubbleSort com Strings no C/C++</title><content type='html'>&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_a2CzM_HCl5c/THROZudPn5I/AAAAAAAAAtA/bt_Lt32CU-4/s1600-h/image%5B3%5D.png" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh3.ggpht.com/_a2CzM_HCl5c/THROc9h3klI/AAAAAAAAAtI/skl6jLLVdLo/image_thumb%5B1%5D.png?imgmax=800" width="497" height="376" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Esta aqui o algoritmo base para o exercício proposto no post sobre &lt;a href="http://spokydev.blogspot.com/2010/08/bubble-sort.html" target="_blank"&gt;BubbleSort&lt;/a&gt;.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;#include &amp;lt;stdio.h&amp;gt;     &lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;      &lt;br /&gt;#include &amp;lt;conio.h&amp;gt;      &lt;br /&gt;#include &amp;lt;string.h&amp;gt;&lt;/p&gt;    &lt;p&gt;const int TAMANHO = 5;     &lt;br /&gt;const int TAMANHO_NOME = 50;&lt;/p&gt;    &lt;p&gt;void BubbleSort(char vetor[TAMANHO][TAMANHO_NOME])     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; for (int i = TAMANHO - 1; i &amp;gt; 0; i--)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (int j = 0; j &amp;lt; i; j++)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (strcmp(vetor[j], vetor[j + 1]) == 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; char aArray[TAMANHO];&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; strcpy(aArray, vetor[j]);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;\n\n%i&amp;quot;, *aArray);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; getch();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; strcpy(vetor[j], vetor[j + 1]);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; strcpy(vetor[j + 1], aArray);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; free(aArray);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;void Listar(char vetor[TAMANHO][TAMANHO_NOME])     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; for (int i = 0; i &amp;lt; TAMANHO; i++)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;%d - %s\n&amp;quot;, i + 1, vetor[i]);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;void main()     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; char vetor[TAMANHO][TAMANHO_NOME];&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; strcpy(vetor[0], &amp;quot;RUDSON&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; strcpy(vetor[1], &amp;quot;GUSTAVO&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; strcpy(vetor[2], &amp;quot;ERIK&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; strcpy(vetor[3], &amp;quot;ALAN&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; strcpy(vetor[4], &amp;quot;ZIDANE&amp;quot;);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Listar(vetor);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;__________________\n&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; BubbleSort(vetor);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Listar(vetor);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; getch();&lt;/p&gt;    &lt;p&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;A base das strings é que na linguagem C elas são vetores de &lt;em&gt;char&lt;/em&gt;, e vetores devem ser manipulados por funções, pois alguns operadores não se aplicam a eles.&lt;/p&gt;  &lt;p&gt;Então a sacada aqui é utilizar as funções:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;stcmp (string compare): compara strings, retornando -1 para o primeiro parâmetro menor do que o segundo, 0 para strings iguais, 1 para o primeiro parâmetro maior do que o segundo.&lt;/li&gt;    &lt;li&gt;strcpy (string copy): copia o conteúdo do segundo parâmetro para o primeiro parâmetro.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Espero ser de ajuda para os outros algoritmos também. &lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-justkidding" alt="Brincadeira" src="http://lh3.ggpht.com/_a2CzM_HCl5c/THROd95L1rI/AAAAAAAAAtM/9h9TMggWBOs/wlEmoticon-justkidding%5B2%5D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;p&gt;E só para complementar e fixar:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Implemente o mesmo algoritmo com strings, porém ordenando de forma decrescente.&lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-4139918162205950682?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/4139918162205950682/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=4139918162205950682&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/4139918162205950682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/4139918162205950682'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2010/08/bubblesort-com-strings-no-cc.html' title='BubbleSort com Strings no C/C++'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_a2CzM_HCl5c/THROc9h3klI/AAAAAAAAAtI/skl6jLLVdLo/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-6608252849567579614</id><published>2010-08-23T23:16:00.001-03:00</published><updated>2010-08-23T23:21:15.735-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Estrutura de Dados'/><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>Quick Sort – Faz da ordenação uma alegria :)</title><content type='html'>&lt;p align="center"&gt;e&lt;a href="http://lh6.ggpht.com/_a2CzM_HCl5c/THMraBeqscI/AAAAAAAAAsA/SK5rYYrIL9M/s1600-h/image%5B8%5D.png" target="_blank"&gt;&lt;img style="margin: 0px; display: inline" title="image" alt="image" src="http://lh5.ggpht.com/_a2CzM_HCl5c/THMrbPtNOvI/AAAAAAAAAsE/AJDz84Q0D8c/image_thumb%5B2%5D.png?imgmax=800" width="200" height="129" /&gt;&lt;/a&gt;    &lt;br /&gt;(Quik, faz do leite uma alegria!)&lt;/p&gt;  &lt;p&gt;É fazendo esse trocadilho com o produto da foto acima, antigo, que começo explicando o Quick Sort, pois o mesmo foi concebido aproximadamente em 1962, quando Charles Antony Richard Hoare visitou a Universidade de Moscovo. Naquela época, Hoare trabalhou em um projeto de tradução de máquina para o National Physical Laboratory. Ele criou o Quicksort ao tentar traduzir um dicionário de inglês para russo, ordenando as palavras, tendo como objetivo reduzir o problema original em subproblemas que possam ser resolvidos mais fácil e rapidamente. &lt;/p&gt;  &lt;p&gt;O QuickSort, como o &lt;a href="http://spokydev.blogspot.com/2010/08/merge-sort.html" target="_blank"&gt;MergeSort&lt;/a&gt;, é baseado em uma estratégia de dividir para conquistar e é um dos algoritmos de ordenação mais populares. Veja na figura abaixo um pouco de seu funcionamento.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_a2CzM_HCl5c/THMrcAqsutI/AAAAAAAAAsI/Zm_lZ3L5OAo/s1600-h/image%5B18%5D.png" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh6.ggpht.com/_a2CzM_HCl5c/THMrdXJZGCI/AAAAAAAAAsM/Jna8S5Fifdc/image_thumb%5B8%5D.png?imgmax=800" width="444" height="680" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;O método baseia-se na divisão da tabela em duas sub-tabelas, dependendo do pivô, normalmente o 1º elemento da tabela. Uma das sub-tabelas contém os elementos menores que o pivô enquanto a outra contém os maiores. O pivô é colocado entre ambas, ficando na posição correta. As duas sub-tabelas são ordenadas de forma idêntica, até que se chegue à tabela com um só elemento.&lt;/p&gt;  &lt;p&gt;Seus passos são:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Escolha um elemento da lista, denominado pivô;&lt;/li&gt;    &lt;li&gt;Rearranje a lista de forma que todos os elementos anteriores ao pivô sejam menores que ele, e todos os elementos posteriores ao pivô sejam maiores que ele. Ao fim do processo o pivô estará em sua posição final e haverá duas sub-listas não ordenadas. Essa operação é denominada partição;&lt;/li&gt;    &lt;li&gt;Recursivamente ordene a sub-lista dos elementos menores e a sub-lista dos elementos maiores;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Apesar de ser um dos métodos mais rápidos de ordenação, suas partições, às vezes, poderem conduzir a uma ordenação lenta., então cuidado com vetores pequenos e ordenados de forma inversa. É interessante notar o uso do conceito de recursividade.&lt;/p&gt;  &lt;p&gt;Reparem no vídeo a seguir como os pivôs delimitam as partições:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; padding-left: 0px; width: 480px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:48702e89-48ae-4875-ae14-3c8e34e9119d" class="wlWriterEditableSmartContent"&gt;&lt;div id="f1c9785a-8f42-46b1-8dce-a3db4dc5822a" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=qqA2slRGHa8?fs=1&amp;amp;hl=pt_BR&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01&amp;amp;hd=1" target="_new"&gt;&lt;img src="http://lh4.ggpht.com/_a2CzM_HCl5c/THMrd7DBcRI/AAAAAAAAAsw/zxaugJelgoc/video5cb21719cdc1%5B35%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('f1c9785a-8f42-46b1-8dce-a3db4dc5822a'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;480\&amp;quot; height=\&amp;quot;385\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/qqA2slRGHa8?fs=1&amp;amp;hl=pt_BR&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01&amp;amp;hd=1&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/qqA2slRGHa8?fs=1&amp;amp;hl=pt_BR&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01&amp;amp;hd=1&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;480\&amp;quot; height=\&amp;quot;385\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="width:480px;clear:both;font-size:.8em"&gt;QuickSort&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;Recomendo também, estudarem através do já citado aqui &lt;a href="http://spokydev.blogspot.com/2010/07/material-didatico-de-apoio-para-aulas.html" target="_blank"&gt;MDA&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Agora vamos a uma breve implementação:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;#include &amp;lt;stdio.h&amp;gt;     &lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;      &lt;br /&gt;#include &amp;lt;conio.h&amp;gt;      &lt;br /&gt;#include &amp;lt;time.h&amp;gt;&lt;/p&gt;    &lt;p&gt;const int tamanho = 5;&lt;/p&gt;    &lt;p&gt;void Trocar(int *a, int *b)      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int temp;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; temp = *a;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; *a = *b;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; *b = temp;      &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;int Repartir(int vetor[], int inicio, int fim)      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int k = inicio;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; for (int i = inicio + 1; i &amp;lt;= fim; i++)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (vetor[i] &amp;lt; vetor[inicio])       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; k++;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Trocar(&amp;amp;vetor[k], &amp;amp;vetor[i]);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Trocar(&amp;amp;vetor[inicio], &amp;amp;vetor[k]);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; return k;     &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;void QuickSort(int vetor[], int inicio, int fim)      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (fim &amp;gt; inicio)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int parte = Repartir(vetor, inicio, fim);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; QuickSort(vetor, inicio, parte - 1);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; QuickSort(vetor, parte + 1, fim);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;void Listar(int vetor[])     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; for (int i = 0; i &amp;lt; tamanho; i++)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;%i\n&amp;quot;, vetor[i]);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;void main()     &lt;br /&gt;{&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; srand(time(NULL));&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; int vetor[tamanho];&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; /*for(int i = 0; i &amp;lt; tamanho; i++)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; vetor[i] = rand() % 100;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }*/&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; vetor[0] = 3;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; vetor[1] = 2;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; vetor[2] = 7;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; vetor[3] = 1;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; vetor[4] = 4;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;Vetor Gerado:\n&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Listar(vetor);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; QuickSort(vetor, 0, tamanho - 1);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;__________________\n&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;Vetor Ordenado:\n&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Listar(vetor);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; system(&amp;quot;pause&amp;quot;);     &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/THMregIhCcI/AAAAAAAAAsU/BRLNUCxfiF4/s1600-h/image%5B22%5D.png" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh5.ggpht.com/_a2CzM_HCl5c/THMrfWCY8wI/AAAAAAAAAsY/j4c6VDlnJKU/image_thumb%5B10%5D.png?imgmax=800" width="497" height="256" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;E para exercitar a mesma ideia dos exercícios anteriores:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Implemente um programa, utilizando a linguagem C, que leia 5 ou 11 alunos (composto por: RA, Nome, Ano de Nascimento). Após ler, o usuário irá escolher um tipo de relatório/listagem em tela, podendo ser ordenado por cada um dos atributos do aluno de forma crescente ou decrescente.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-openmouthedsmile" alt="Smiley de boca aberta" src="http://lh3.ggpht.com/_a2CzM_HCl5c/THMrgEFbeqI/AAAAAAAAAsc/gg_kBSHqTxI/wlEmoticon-openmouthedsmile%5B2%5D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-6608252849567579614?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/6608252849567579614/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=6608252849567579614&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/6608252849567579614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/6608252849567579614'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2010/08/quick-sort.html' title='Quick Sort – Faz da ordenação uma alegria :)'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_a2CzM_HCl5c/THMrbPtNOvI/AAAAAAAAAsE/AJDz84Q0D8c/s72-c/image_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-5424780829419710149</id><published>2010-08-16T23:15:00.001-03:00</published><updated>2010-08-16T23:15:49.034-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Estrutura de Dados'/><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>Bubble Sort</title><content type='html'>&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_a2CzM_HCl5c/TGnwwQLb9fI/AAAAAAAAArk/OvTVfd6l_XM/s1600-h/image%5B2%5D.png" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" class="wlDisabledImage" title="image" alt="image" src="http://lh4.ggpht.com/_a2CzM_HCl5c/TGnwxb2VJyI/AAAAAAAAAro/-n-4XOpIlfQ/image_thumb.png?imgmax=800" width="177" height="133" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Bubble Sort, ou ordenação da bolha, é um algoritmo de ordenação, baseado em trocas. É de fácil implementação e relativo desempenho satisfatório em pequenas coleções de dados. Porém pode gerar muitas computações em grandes coleções de dados, pois ele tem que analisar elemento por elemento, de forma exponencial, para verificar se é necessário realizar a troca.&lt;/p&gt;  &lt;p&gt;Sua ideia consiste em analisar elemento a elemento de forma a colocar o extremo em seu lugar, e desconsiderá-lo na próxima varredura. Por exemplo, se a implementação tiver como base analisar pares de forma a descobrir o maior elemento, o maior elemento pode ser jogado para o fim da coleção, sendo desconsiderado na próxima iteração.&lt;/p&gt;  &lt;p&gt;“A ideia é percorrer um vetor diversas vezes,e a cada passagem fazer flutuar, para o topo, o maior elemento da sequência. Essa movimentação lembra a forma como as bolhas em um tanque de água procuram seu próprio nível, e disso vem o nome do algoritmo.”&lt;/p&gt; &lt;a href="http://lh5.ggpht.com/_a2CzM_HCl5c/TGnwyYhGOiI/AAAAAAAAArs/cLCYKdsOysg/s1600-h/image%5B5%5D.png" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" class="wlDisabledImage" title="image" alt="image" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TGnwzOYhlrI/AAAAAAAAArw/MWwBKnZzL4o/image_thumb%5B1%5D.png?imgmax=800" width="88" height="133" /&gt;&lt;/a&gt;   &lt;p&gt;Veja no vídeo a seguir um pouco da ilustração de seu funcionamento:&lt;/p&gt;  &lt;p align="center"&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/MtcrEhrt_K0?fs=1&amp;amp;hl=pt_BR&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01&amp;amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/MtcrEhrt_K0?fs=1&amp;amp;hl=pt_BR&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01&amp;amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;  &lt;p&gt;O bubble sort tem os seguintes passos: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Compara elementos adjacentes. Se o primeiro é maior do que o segundo, troca eles. &lt;/li&gt;    &lt;li&gt;Faz isto para cada par de elementos adjacentes, começando com os dois primeiros e terminando com os dois últimos. Neste ponto o último elemento deve ser o maior de todos. &lt;/li&gt;    &lt;li&gt;Repete os passos para todos os elementos exceto para o último. &lt;/li&gt;    &lt;li&gt;Continua repetindo, cada vez com um elemento a menso, até não existam mais pares para se comparar. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Uma breve implementação:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;#include &amp;lt;stdio.h&amp;gt;      &lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;       &lt;br /&gt;#include &amp;lt;conio.h&amp;gt;       &lt;br /&gt;#include &amp;lt;time.h&amp;gt;&lt;/p&gt;    &lt;p&gt;const int tamanho = 10;&lt;/p&gt;    &lt;p&gt;void BubbleSort(int vetor[])      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; for (int i = tamanho - 1; i &amp;gt; 0; i--)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (int j = 0; j &amp;lt; i; j++)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (vetor[j] &amp;gt; vetor[j + 1])       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int temp = vetor[j];       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; vetor[j] = vetor[j+1];       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; vetor[j+1] = temp;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;void Listar(int vetor[])      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; for (int i = 0; i &amp;lt; tamanho; i++)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;%i\n&amp;quot;, vetor[i]);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;void main()      &lt;br /&gt;{&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; srand(time(NULL));&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; int vetor[tamanho];&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; for(int i = 0; i &amp;lt; tamanho; i++)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; vetor[i] = rand();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;Vetor Gerado:\n&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Listar(vetor);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; BubbleSort(vetor);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;__________________\n&amp;quot;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;Vetor Ordenado:\n&amp;quot;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Listar(vetor);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; system(&amp;quot;pause&amp;quot;);      &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TGnwzsgrlBI/AAAAAAAAAr0/R8_LqmSoU30/s1600-h/image%5B8%5D.png" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" class="wlDisabledImage" title="image" alt="image" src="http://lh5.ggpht.com/_a2CzM_HCl5c/TGnw0JjHY4I/AAAAAAAAAr4/0hYE4QKXcqQ/image_thumb%5B2%5D.png?imgmax=800" width="200" height="101" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Percebam que é bem simples, sem recursividade, ponteiro ou qualquer outro artifício mais complexo. Bastam dois &lt;em&gt;for&lt;/em&gt;. O mais abrangente limita as comparações, deixando de fora sempre o ultimo item ordenado, tendo em vista que ele foi o maior. O &lt;em&gt;for&lt;/em&gt; de dentro compara os pares e faz a troca se necessário.&lt;/p&gt;  &lt;p&gt;E vamos ao exercícios:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Implemente um programa, utilizando a linguagem C, que leia 5 ou 11 alunos (composto por: RA, Nome, Ano de Nascimento). Após ler, o usuário irá escolher um tipo de relatório/listagem em tela, podendo ser ordenado por cada um dos atributos do aluno de forma crescente ou decrescente. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Espero que tenham gostado &lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Alegre" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TGnw0t_rvJI/AAAAAAAAAr8/jf2CO6X49xc/wlEmoticon-smile%5B2%5D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-5424780829419710149?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/5424780829419710149/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=5424780829419710149&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/5424780829419710149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/5424780829419710149'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2010/08/bubble-sort.html' title='Bubble Sort'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_a2CzM_HCl5c/TGnwxb2VJyI/AAAAAAAAAro/-n-4XOpIlfQ/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-8854290768146370571</id><published>2010-08-16T22:44:00.000-03:00</published><updated>2010-08-16T22:43:15.725-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Estrutura de Dados'/><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>Merge Sort</title><content type='html'>&lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://blogs.oracle.com/fusionecm/merge-700542.jpg" width="237" height="240" /&gt;&lt;/p&gt;  &lt;p&gt;O Merge Sort é um algoritmo de ordenação, onde sua fundamentação esta na junção, ou melhor, na possibilidade de mesclar vetores.&lt;/p&gt;  &lt;p&gt;Mas antes de mesclar vetores, temos de quebrar o vetor original no meio, e continuando a repartí-lo até chegarmos em vetores de uma única posição, isolando cada elemento. Uma vez com cada elemento isolado, temos de compará-los com o seu par e agrupá-los de forma ordenada em um vetor temporário. Então mesclamos os vetores, sempre comparando seus elementos, de forma que o novo vetor criado seja sempre ordenado.&lt;/p&gt;  &lt;p&gt;Antes de destruir o vetor temporário ordenado (que deve ser criado usando alocação dinâmica de memória com o &lt;em&gt;malloc()&lt;/em&gt;, e liberado com o &lt;em&gt;free()&lt;/em&gt;, pois não sabemos quantos e quais os tamanhos dos vetores temporários que serão criados), devemos copiar os itens para o vetor original.&lt;/p&gt;  &lt;p&gt;A vantagem deste método é que, ao criamos um vetor, garantimos que os elementos menores sempre sejam os últimos, gastando menos tempo na hora de mesclar dois vetores, gerando menos computação.&lt;/p&gt;  &lt;p&gt;Acompanhe seu funcionamento no vídeo a seguir:&lt;/p&gt;  &lt;p align="center"&gt;&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/L-E6KKmXR0o?fs=1&amp;amp;hl=pt_BR&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01&amp;amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/L-E6KKmXR0o?fs=1&amp;amp;hl=pt_BR&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01&amp;amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;  &lt;p&gt;Este algoritmo recursivo que é classificado como “dividir para conquistar”. Para essa afirmação temos:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="left"&gt;Dividir os dados em subseqüências pequenas.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="left"&gt;Conquistar, ou seja, classifica as duas metades recursivamente.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="left"&gt;Combinar as duas metades em um único conjunto ordenado.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Foi criado por Von Neumann em 1945.&lt;/p&gt;  &lt;p&gt;O Legal nele é que exploramos a alocação de memória e a recursividade.&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://lh4.ggpht.com/_a2CzM_HCl5c/TGnovXyNLuI/AAAAAAAAArQ/mTuPaOQT9sU/s1600-h/image%5B2%5D.png" target="_blank"&gt;&lt;img style="display: inline" class="wlDisabledImage" title="image" alt="image" src="http://lh5.ggpht.com/_a2CzM_HCl5c/TGnowbCe2PI/AAAAAAAAArU/HOLIK7wIfPU/image_thumb.png?imgmax=800" width="200" height="114" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;br /&gt;  &lt;p&gt;Veja um exemplo de sua implmentação:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;#include &amp;lt;stdio.h&amp;gt;     &lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;      &lt;br /&gt;#include &amp;lt;conio.h&amp;gt;      &lt;br /&gt;#include &amp;lt;time.h&amp;gt;&lt;/p&gt;    &lt;p&gt;void Merge(int vetor[], int tamanho)      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; cria um novo vetor com tamanho compatível      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int* temp = (int*) malloc(tamanho * sizeof(int));      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int meio = tamanho / 2;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int i = 0;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int j = meio;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int k = 0;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; troca os itens entre as metades     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; while (i &amp;lt; meio &amp;amp;&amp;amp; j &amp;lt; tamanho)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (vetor[i] &amp;lt; vetor[j])       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; temp[k] = vetor[i];      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ++i;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; temp[k] = vetor[j];      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ++j;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ++k;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; if (i == meio) // -&amp;gt; termina de copiar a segunda metade     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; while (j &amp;lt; tamanho)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; temp[k] = vetor[j];      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ++j;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ++k;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else // -&amp;gt; termina de copiar o início      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; while (i &amp;lt; meio)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; temp[k] = vetor[i];      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ++i;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ++k;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; copia os itens ordenados para o vetor original      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; for (i = 0; i &amp;lt; tamanho; ++i)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; vetor[i] = temp[i];      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Libera a mamórtia do vetor temporário     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; free(temp);      &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;void MergeSort(int vetor[], int tamanho)      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (tamanho &amp;gt; 1)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int meio = tamanho / 2; // -&amp;gt; divide o vetor no meio      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MergeSort(vetor, meio); // -&amp;gt; passa a primeira metade      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MergeSort(vetor + meio, tamanho - meio); // -&amp;gt; passa a segunda metade      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Merge(vetor, tamanho); // -&amp;gt; ordena e mescla      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;void Listar(int vetor[], int tamanho)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; for (int i = 0; i &amp;lt; tamanho; i++)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;%i\n&amp;quot;, vetor[i]);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;void main()     &lt;br /&gt;{&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; srand(time(NULL));&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; const int TAMANHO_TOTAL = 11;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int vetor[TAMANHO_TOTAL];&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; for(int i = 0; i &amp;lt; TAMANHO_TOTAL; i++)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; vetor[i] = rand();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;Vetor Gerado:\n&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Listar(vetor, TAMANHO_TOTAL);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; MergeSort(vetor, TAMANHO_TOTAL);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;__________________\n&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;Vetor Ordenado:\n&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Listar(vetor, TAMANHO_TOTAL);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; system(&amp;quot;pause&amp;quot;);     &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TGnoxD1ZNkI/AAAAAAAAArY/d4P1HCth7hY/s1600-h/image%5B5%5D.png" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" class="wlDisabledImage" title="image" alt="image" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TGnoxj1i3nI/AAAAAAAAArc/UM7CPAtXR7E/image_thumb%5B1%5D.png?imgmax=800" width="200" height="112" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Bem, agora fica o exercício&lt;u&gt;:&lt;/u&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Implemente um programa, utilizando a linguagem C, que leia 5 ou 11 alunos (composto por: RA, Nome, Ano de Nascimento). Após ler, o usuário irá escolher um tipo de relatório/listagem em tela, podendo ser ordenado por cada um dos atributos do aluno de forma crescente ou decrescente.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-openmouthedsmile" alt="Smiley de boca aberta" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TGnoyKDlNkI/AAAAAAAAArg/DtzKovF09Ms/wlEmoticon-openmouthedsmile%5B2%5D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-8854290768146370571?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/8854290768146370571/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=8854290768146370571&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/8854290768146370571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/8854290768146370571'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2010/08/merge-sort.html' title='Merge Sort'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_a2CzM_HCl5c/TGnowbCe2PI/AAAAAAAAArU/HOLIK7wIfPU/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-3889891945322153646</id><published>2010-08-05T14:19:00.001-03:00</published><updated>2010-08-05T14:19:37.458-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Redes'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Monitorando o Servidor com C#</title><content type='html'>&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TFrymLpUpDI/AAAAAAAAAq0/esMCafOg7Ys/s1600-h/image%5B2%5D.png" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TFrynI2IOuI/AAAAAAAAAq4/xA3cMO-EH-s/image_thumb.png?imgmax=800" width="170" height="240" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Um aluno me questionou se é possível fazer uma aplicação que monitore um servidor, através da resposta do mesmo a um ping.&lt;/p&gt;  &lt;p&gt;Aceitei o desafio, e escrevi uma simples e didática aplicação que realiza este monitoramento, utilizando, de maneira simples, as classes de rede do .NET Framework.&lt;/p&gt;  &lt;p&gt;1º temos de construir uma classe “Monitor”. ela conterá duas propriedades: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;IP: Uma string com o IP do servidor que será monitorado, ex: 10.1.1.5.&lt;/li&gt;    &lt;li&gt;Status: Um enumerador IPStatus, que contém todos os status do resultado de um ping, ex: Success, TimedOut, DestinationNetworkUnreachable, etc. Esta por sua vez é somente leitura, então só implementamos o “get” dela.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;E finalmente um metodo “Monitorar()”, que executará o ping, com espera de no máximo 4s (4000 milisegundos), com intervalos de 1 segundo (1000 milisegundos) entre um disparo e outro. A execução desse método se da enquanto o retorno do pingo for igual a “Success”.&lt;/p&gt;  &lt;p&gt;Acompanhe a classe implementada abaixo:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;// –&amp;gt; Utilizar o namespace: System.Net.NetworkInformation;&lt;/p&gt;    &lt;p&gt;public class Monitor     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; string ip; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public string IP     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get { return ip; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set { ip = value; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; IPStatus status; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public IPStatus Status     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get { return status; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public void Monitorar()     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Ping ping = new Ping();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PingReply resposta; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; do     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; resposta = ping.Send(ip, 4000);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(string.Format(&amp;quot;Ping: {0}; Tempo de Resposta: {1}; Status: {2};&amp;quot;, resposta.Address, resposta.RoundtripTime, resposta.Status));      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Thread.Sleep(1000);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } while (resposta.Status == IPStatus.Success); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; status = resposta.Status;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Agora que já temos um monitor, vamos implementar uma classe responsável pelo envio de e-mail. Esse e-mail será enviado quando o monitor parar de monitorar, ou seja, quando o ping parar de responder.&lt;/p&gt;  &lt;p&gt;Para esta classe “Email” temos três propriedades string, representando o e-mail de destino, título do e-mail e mensagem (corpo) do email. &lt;/p&gt;  &lt;p&gt;Ela contém também um método “Enviar()”. Este por sua vez, criará a mensagem de envio com as propriedades informadas, mais o e-mail de origem. Finalmente configurará um objeto de SMTP, com os dados de um servidor de e-mail SMTP. Depois é só disparar o email. Acompanhe:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;// –&amp;gt; Utilizar os namespaces: System.Net.Mail; System.Net;&lt;/p&gt;    &lt;p&gt;public class Email     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; private string emailDestino; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public string EmailDestino     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get { return emailDestino; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set { emailDestino = value; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; private string titulo; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public string Titulo     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get { return titulo; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set { titulo = value; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; private string mensagem; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public string Mensagem     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get { return mensagem; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set { mensagem = value; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public void Enviar()     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MailMessage email = new MailMessage();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; email.From = new MailAddress(&amp;quot;seuemail@seuprovedor.com&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; email.To.Add(emailDestino);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; email.Subject = titulo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; email.Body = mensagem; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SmtpClient smtp = new SmtpClient(&amp;quot;smtp.seuhostsmtp.com.br&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; smtp.Credentials = new NetworkCredential(&amp;quot;usuário&amp;quot;, &amp;quot;senha&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; smtp.Send(email);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Com tudo o que precisamos resgistrado na orientação a objetos, basta consumi-los, olhe o exemplo do uso das classes:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;class Program     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; static void Main(string[] args)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string ip; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;Informe o IP do servidor que será monitorado: &amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ip = Console.ReadLine(); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Monitor monitor = new Monitor();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; monitor.IP = ip;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; monitor.Monitorar(); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Email email = new Email();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; email.EmailDestino = &amp;quot;destino@email.com.br&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; email.Titulo = &amp;quot;Servidor Parou&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; email.Mensagem = string.Format(&amp;quot;O servidor {0} parou de responder: {1}&amp;quot;, ip, monitor.Status);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; email.Enviar(); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;Monitoramento encerrado...&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.ReadKey();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Neste programa, é lido um ip que irá ser monitorado, criamos um objeto “monitor”, informamos este ip na sua propriedade, e mandamos monitorar. Quando ele encerrar, é porque o ping já não foi bem sucedido, então criamos um objeto “email”, “escrevemos o e-mail” e enviamos.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_a2CzM_HCl5c/TFrynpZvoXI/AAAAAAAAAq8/CkGLvrPip78/s1600-h/image%5B5%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh5.ggpht.com/_a2CzM_HCl5c/TFryonFsraI/AAAAAAAAArA/LPRF6AbRZrE/image_thumb%5B1%5D.png?imgmax=800" width="240" height="121" /&gt;&lt;/a&gt; &lt;a href="http://lh6.ggpht.com/_a2CzM_HCl5c/TFrypEAXafI/AAAAAAAAArE/IR-3Cf9YYts/s1600-h/image%5B8%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TFrypwcFFSI/AAAAAAAAArI/XwZO3Esi94c/image_thumb%5B2%5D.png?imgmax=800" width="240" height="121" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Aproveitem! :)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-3889891945322153646?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/3889891945322153646/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=3889891945322153646&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/3889891945322153646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/3889891945322153646'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2010/08/monitorando-o-servidor-com-c.html' title='Monitorando o Servidor com C#'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_a2CzM_HCl5c/TFrynI2IOuI/AAAAAAAAAq4/xA3cMO-EH-s/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-3133489879253988781</id><published>2010-08-02T23:06:00.001-03:00</published><updated>2010-08-02T23:06:30.722-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>Resolução de Exercícios: Pilhas e Filas</title><content type='html'>&lt;p&gt;Nos posts anteriores sobre &lt;a href="http://spokydev.blogspot.com/2010/07/pilha-dinamica.html" target="_blank"&gt;pilhas&lt;/a&gt; e &lt;a href="http://spokydev.blogspot.com/2010/07/fila-dinamica.html" target="_blank"&gt;filas&lt;/a&gt; dinâmicas, foram propostos a implementação das estruturas com uma struct de Aluno.&lt;/p&gt;  &lt;p&gt;Pois bem, aqui esta com a resolução…&lt;/p&gt;  &lt;p&gt;Pilha:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;#include &amp;lt;stdio.h&amp;gt;     &lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;/p&gt;    &lt;p&gt;     &lt;br /&gt;struct Aluno       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int ra;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; char nome[50];      &lt;br /&gt;};&lt;/p&gt;    &lt;p&gt;struct Item      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Aluno aluno;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *proximo;      &lt;br /&gt;};&lt;/p&gt;    &lt;p&gt;     &lt;br /&gt;void Inicializar(Item **topo)      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160; *topo = NULL;      &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;bool EstaVazia(Item **topo)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160; if(*topo == NULL)&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return true;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160; else&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return false;&amp;#160;&amp;#160; &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;void Empilhar(Item **topo, Aluno elemento)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *novo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; novo = (Item *)malloc(sizeof(Item));&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; novo-&amp;gt;aluno = elemento;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; novo-&amp;gt;proximo = *topo; // -&amp;gt; próximo recebe o elemento que estava no topo.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; *topo = novo;      &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;Aluno Desempilhar(Item **topo)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160; Aluno result;      &lt;br /&gt;&amp;#160;&amp;#160; Item *auxiliar;      &lt;br /&gt;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160; if(EstaVazia(topo))      &lt;br /&gt;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;\n stack underflow! \n&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; exit(1);      &lt;br /&gt;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160; else // -&amp;gt; Elemento retirado do topo      &lt;br /&gt;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; result = (*topo)-&amp;gt;aluno;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; auxiliar = *topo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; *topo = (*topo)-&amp;gt;proximo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; free(auxiliar);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return result;      &lt;br /&gt;&amp;#160;&amp;#160; }&amp;#160;&amp;#160; &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;void MostrarPilha(Item *topo)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int i = 0;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *item;      &lt;br /&gt;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;\n\n Listando...\n\n&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;---------------------------------\n&amp;quot;);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; if (EstaVazia(&amp;amp;topo))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf (&amp;quot;A Pilha esta vazia!\n&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item = topo;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; while(item != NULL)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; i++;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;[%i] -&amp;gt; %i - %s\n&amp;quot;, i, item-&amp;gt;aluno.ra, item-&amp;gt;aluno.nome);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item = item-&amp;gt;proximo;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;---------------------------------\n&amp;quot;);     &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;     &lt;br /&gt;void Menu()      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;Digite a sua escolha: \n&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;#160;&amp;#160;&amp;#160; 1 empilhar elemento \n&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;#160;&amp;#160;&amp;#160; 2 desempilhar \n&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;#160;&amp;#160;&amp;#160; 3 para finalizar \n&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;? &amp;quot;);      &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;     &lt;br /&gt;void main()      &lt;br /&gt;{&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *topo = NULL;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int opcao;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Aluno aluno;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Menu();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;%i&amp;quot;, &amp;amp;opcao);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; while (opcao != 3)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; switch (opcao)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case 1:      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;Digite um RA: &amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;\n%i&amp;quot;, &amp;amp;aluno.ra);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;Digite um Nome: &amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;\n%s&amp;quot;, &amp;amp;aluno.nome);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Empilhar(&amp;amp;topo, aluno);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MostrarPilha(topo);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case 2:      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Desempilhar(&amp;amp;topo);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MostrarPilha(topo);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; default:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;Escolha invalida.\n\n&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Menu();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;%i&amp;quot;, &amp;amp;opcao);&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; system(&amp;quot;pause&amp;quot;);     &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_a2CzM_HCl5c/TFd5mxFFBzI/AAAAAAAAAqg/dNVW7_3GuIE/s1600-h/image%5B5%5D.png" target="_blank"&gt;&lt;img style="margin: 0px; display: inline" class="wlDisabledImage" title="image" alt="image" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TFd5nSVa6sI/AAAAAAAAAqk/3E63rfPyz-U/image_thumb%5B1%5D.png?imgmax=800" width="124" height="133" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Fila:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;#include &amp;lt;stdio.h&amp;gt;     &lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;      &lt;br /&gt;#include &amp;lt;conio.h&amp;gt;      &lt;br /&gt;#include &amp;lt;string.h&amp;gt;&lt;/p&gt;    &lt;p&gt;     &lt;br /&gt;struct Aluno       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int ra;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; char nome[50];      &lt;br /&gt;};&lt;/p&gt;    &lt;p&gt;struct Item      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Aluno aluno;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; struct Item *proximo;      &lt;br /&gt;};&lt;/p&gt;    &lt;p&gt;struct Fila     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *inicio;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *fim;      &lt;br /&gt;};&lt;/p&gt;    &lt;p&gt;     &lt;br /&gt;void Inicializar(Fila **fila)      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Recebe a fila por referencia      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; //&amp;#160;&amp;#160;&amp;#160; para inicializá-la      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; *fila = (Fila *) malloc(sizeof(Fila));      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (*fila)-&amp;gt;inicio = NULL;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (*fila)-&amp;gt;fim = NULL;      &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;int EstaVazia(Fila *fila)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return fila-&amp;gt;inicio == NULL;      &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;void Inserir(Fila *fila, Aluno elemento)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *novo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; novo = (Item *)malloc(sizeof(Item));&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Verifica se a memória foi alocada com sucesso     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (novo != NULL)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; strcpy(novo-&amp;gt;aluno.nome, elemento.nome);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; novo-&amp;gt;aluno.ra = elemento.ra;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; novo-&amp;gt;proximo = NULL;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(EstaVazia(fila))     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Primeiro Item da Fila.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fila-&amp;gt;inicio = novo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fila-&amp;gt;fim = novo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Ultimo item da Fila       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fila-&amp;gt;fim-&amp;gt;proximo = novo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fila-&amp;gt;fim=novo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;void Retirar(Fila *fila)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *item;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; if(!EstaVazia(fila))     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item = fila-&amp;gt;inicio;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fila-&amp;gt;inicio = item-&amp;gt;proximo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; free(item);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Se a fila acabou devemos atualizar o final     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (fila-&amp;gt;inicio == NULL)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fila-&amp;gt;fim = NULL;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;void MostrarFila(Fila *fila)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int i = 0;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *item;      &lt;br /&gt;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;\n\n Listando...\n\n&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;---------------------------------\n&amp;quot;);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; if (EstaVazia(fila))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf (&amp;quot;A Fila esta vazia!\n&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item = fila-&amp;gt;inicio;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; while(item != NULL)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; i++;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;[%i] -&amp;gt; %i - %s\n&amp;quot;, i, item-&amp;gt;aluno.ra, item-&amp;gt;aluno.nome);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item = item-&amp;gt;proximo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;---------------------------------\n&amp;quot;);     &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;     &lt;br /&gt;void Menu()      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;Digite a sua escolha: \n&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;#160;&amp;#160;&amp;#160; 1 enfileirar elemento \n&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;#160;&amp;#160;&amp;#160; 2 retirar da fila \n&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;#160;&amp;#160;&amp;#160; 3 para finalizar \n&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;? &amp;quot;);      &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;     &lt;br /&gt;void main()      &lt;br /&gt;{&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Fila *fila = NULL;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int opcao;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Aluno aluno;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Inicializar(&amp;amp;fila);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Menu();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;%i&amp;quot;, &amp;amp;opcao);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; while (opcao != 3)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; switch (opcao)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case 1:      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;Digite um RA: &amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;\n%i&amp;quot;, &amp;amp;aluno.ra);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;Digite um Nome: &amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;\n%s&amp;quot;, &amp;amp;aluno.nome);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Inserir(fila, aluno);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MostrarFila(fila);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case 2:      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Retirar(fila);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MostrarFila(fila);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; default:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;Escolha invalida.\n\n&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Menu();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;%i&amp;quot;, &amp;amp;opcao);&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; system(&amp;quot;pause&amp;quot;);     &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_a2CzM_HCl5c/TFd5oDrYEOI/AAAAAAAAAqo/yDuYM8GWKQg/s1600-h/image%5B2%5D.png" target="_blank"&gt;&lt;img style="margin: 0px; display: inline" class="wlDisabledImage" title="image" alt="image" src="http://lh4.ggpht.com/_a2CzM_HCl5c/TFd5oooKl-I/AAAAAAAAAqs/eW5APEe3VZs/image_thumb.png?imgmax=800" width="124" height="133" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Vale prestar atenção nos métodos de inserção. Na pilha é copiado o elemento de uma vez, na fila é copiado item a item da struct. Isso é só para exemplificar que das duas maneira é possível. Lembrem-se: para copiar strings utilizem a função da linguagem C &lt;em&gt;strcpy(destino, origem)&lt;/em&gt;. &lt;/p&gt;  &lt;p&gt;Agora fica o desafio:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Validem a inclusão na estrutura para que não contenha RA repetido. A busca deve ser feito com o método de retirar elementos da estrutura! &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Boa sorte &lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Alegre" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TFd5pOPD8JI/AAAAAAAAAqw/BpjD9zck2xE/wlEmoticon-smile%5B2%5D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-3133489879253988781?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/3133489879253988781/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=3133489879253988781&amp;isPopup=true' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/3133489879253988781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/3133489879253988781'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2010/08/resolucao-de-exercicios-pilhas-e-filas.html' title='Resolução de Exercícios: Pilhas e Filas'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_a2CzM_HCl5c/TFd5nSVa6sI/AAAAAAAAAqk/3E63rfPyz-U/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-6456834181756886661</id><published>2010-07-27T13:07:00.001-03:00</published><updated>2010-07-27T13:07:22.189-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>Fila Dinâmica</title><content type='html'>&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TE8ED3Voz9I/AAAAAAAAApc/RNoKMImMJkk/s1600-h/image%5B2%5D.png" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TE8EEog8ndI/AAAAAAAAApg/RM7i_rd5ZUw/image_thumb.png?imgmax=800" width="240" height="173" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Completando a &lt;a href="http://spokydev.blogspot.com/2010/06/listas-dinamicas-em-c.html" target="_blank"&gt;lista dinâmica&lt;/a&gt; e a &lt;a href="http://spokydev.blogspot.com/2010/07/pilha-dinamica.html" target="_blank"&gt;pilha dinâmica&lt;/a&gt;, vejamos esta estrutura dinâmica, a fila, explorando o potencial de alocação sob demana da memória de um computador.&lt;/p&gt;  &lt;p&gt;Lembrando: A fila é uma lista com restrição de entrada e saída, assim, só podemos retirar elementos de quem chegou primeiro (início), e os novos elementos devem ser inseridos no final.&lt;/p&gt;  &lt;p&gt;Para isso, ao codificarmos um exemplo, precisaremos de dois ponteiros: um que aponta para o início da fila e outro para o final. Podemos criar uma estrutura (&lt;a href="http://spokydev.blogspot.com/2010/06/trabalhando-com-structs-em-c.html" target="_blank"&gt;struct&lt;/a&gt;) para controlar estes ponteiros.&lt;/p&gt;  &lt;p&gt;Ainda assim será necessário ter uma estrutura com o elemento e o ponteiro para o próximo elemento.&lt;/p&gt;  &lt;p&gt;Vejamos através de imagens e vídeos a representação gráfica desta estrutura de dados:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_a2CzM_HCl5c/TE8EFguM_lI/AAAAAAAAApk/Ia58Ws9M088/s1600-h/image%5B5%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh4.ggpht.com/_a2CzM_HCl5c/TE8EGIggLnI/AAAAAAAAApo/RXpb71-2h1Y/image_thumb%5B1%5D.png?imgmax=800" width="240" height="199" /&gt;&lt;/a&gt; &lt;a href="http://lh6.ggpht.com/_a2CzM_HCl5c/TE8EGyTv2EI/AAAAAAAAAps/Rx5Q96PoBmA/s1600-h/image%5B11%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh4.ggpht.com/_a2CzM_HCl5c/TE8EHSnvvfI/AAAAAAAAApw/F0ekS-xMc28/image_thumb%5B3%5D.png?imgmax=800" width="240" height="199" /&gt;&lt;/a&gt; &lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TE8EIB6Xp9I/AAAAAAAAAp0/75SMKkNR8xw/s1600-h/image%5B14%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TE8EIpRxXUI/AAAAAAAAAp4/IDPgiaGs7TM/image_thumb%5B4%5D.png?imgmax=800" width="240" height="199" /&gt;&lt;/a&gt; &lt;a href="http://lh6.ggpht.com/_a2CzM_HCl5c/TE8EJlxwP-I/AAAAAAAAAp8/aVr8pmuP9V0/s1600-h/image%5B17%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TE8EKe9KHdI/AAAAAAAAAqA/GHIBa8-1X94/image_thumb%5B5%5D.png?imgmax=800" width="240" height="199" /&gt;&lt;/a&gt; &lt;a href="http://lh5.ggpht.com/_a2CzM_HCl5c/TE8ELW9c-4I/AAAAAAAAAqE/cRwaNOC9IV4/s1600-h/image%5B23%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh4.ggpht.com/_a2CzM_HCl5c/TE8EL3Z5Y1I/AAAAAAAAAqI/G6I5pC-UMG0/image_thumb%5B7%5D.png?imgmax=800" width="240" height="199" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;object width="640" height="505"&gt;&lt;param name="movie" value="http://www.youtube.com/v/_nj5IdDQxsA&amp;amp;hl=pt_BR&amp;amp;fs=1?color1=0xe1600f&amp;amp;color2=0xfebd01"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/_nj5IdDQxsA&amp;amp;hl=pt_BR&amp;amp;fs=1?color1=0xe1600f&amp;amp;color2=0xfebd01" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;  &lt;p&gt;Exemplos by: &lt;a href="http://mda.codeplex.com/"&gt;http://mda.codeplex.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Agora que já esta dominado este conceito, segue um breve exemplo de codificação de uma fila em C:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;#include &amp;lt;stdio.h&amp;gt;     &lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;      &lt;br /&gt;#include &amp;lt;conio.h&amp;gt; &lt;/p&gt;    &lt;p&gt;struct Item      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int numero;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; struct Item *proximo;      &lt;br /&gt;}; &lt;/p&gt;    &lt;p&gt;struct Fila     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *inicio;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *fim;      &lt;br /&gt;}; &lt;/p&gt;    &lt;p&gt;void Inicializar(Fila **fila)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Recebe a fila por referencia      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; //&amp;#160;&amp;#160;&amp;#160; para inicializá-la      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; *fila = (Fila *) malloc(sizeof(Fila));      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (*fila)-&amp;gt;inicio = NULL;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (*fila)-&amp;gt;fim = NULL;      &lt;br /&gt;} &lt;/p&gt;    &lt;p&gt;int EstaVazia(Fila *fila)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return fila-&amp;gt;inicio == NULL;      &lt;br /&gt;} &lt;/p&gt;    &lt;p&gt;void Inserir(Fila *fila, int elemento)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *novo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; novo = (Item *)malloc(sizeof(Item));&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Verifica se a memória foi alocada com sucesso     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (novo != NULL)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; novo-&amp;gt;numero = elemento;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; novo-&amp;gt;proximo = NULL; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(EstaVazia(fila))     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Primeiro Item da Fila.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fila-&amp;gt;inicio = novo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fila-&amp;gt;fim = novo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Ultimo item da Fila       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fila-&amp;gt;fim-&amp;gt;proximo = novo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fila-&amp;gt;fim=novo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;} &lt;/p&gt;    &lt;p&gt;void Retirar(Fila *fila)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *item; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; if(!EstaVazia(fila))     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item = fila-&amp;gt;inicio;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fila-&amp;gt;inicio = item-&amp;gt;proximo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; free(item); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Se a fila acabou devemos atualizar o final     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (fila-&amp;gt;inicio == NULL)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fila-&amp;gt;fim = NULL;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;} &lt;/p&gt;    &lt;p&gt;void MostrarFila(Fila *fila)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int i = 0;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *item;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;\n\n Listando...\n\n&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;---------------------------------\n&amp;quot;); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; if (EstaVazia(fila))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf (&amp;quot;A Fila esta vazia!\n&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item = fila-&amp;gt;inicio; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; while(item != NULL)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; i++;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;[%i] -&amp;gt; %i\n&amp;quot;, i, item-&amp;gt;numero);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item = item-&amp;gt;proximo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;---------------------------------\n&amp;quot;);     &lt;br /&gt;} &lt;/p&gt;    &lt;p&gt;void Menu()     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;Digite a sua escolha: \n&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;#160;&amp;#160;&amp;#160; 1 enfileirar elemento \n&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;#160;&amp;#160;&amp;#160; 2 retirar da fila \n&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;#160;&amp;#160;&amp;#160; 3 para finalizar \n&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;? &amp;quot;);      &lt;br /&gt;} &lt;/p&gt;    &lt;p&gt;void main()     &lt;br /&gt;{&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Fila *fila = NULL;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int opcao;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int numero; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Inicializar(&amp;amp;fila);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Menu();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;%i&amp;quot;, &amp;amp;opcao); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; while (opcao != 3)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; switch (opcao)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case 1:      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;Digite um numero: &amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;\n%i&amp;quot;, &amp;amp;numero); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Inserir(fila, numero);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MostrarFila(fila); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case 2:      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Retirar(fila);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MostrarFila(fila); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; default:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;Escolha invalida.\n\n&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Menu();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;%i&amp;quot;, &amp;amp;opcao);&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; system(&amp;quot;pause&amp;quot;);     &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_a2CzM_HCl5c/TE8EMWHrpII/AAAAAAAAAqM/w_9gm4E-0CE/s1600-h/image%5B26%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TE8ENB2DtoI/AAAAAAAAAqQ/HK7halejVFs/image_thumb%5B8%5D.png?imgmax=800" width="189" height="240" /&gt;&lt;/a&gt; &lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TE8ENqYdsfI/AAAAAAAAAqU/gnhT0PnMEVU/s1600-h/image%5B29%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh4.ggpht.com/_a2CzM_HCl5c/TE8EOIwgUeI/AAAAAAAAAqY/0EFOPQPF18M/image_thumb%5B9%5D.png?imgmax=800" width="189" height="240" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Também é uma estrutura simples, alguns acham ela mais complexa que a pilha, por conta de lidar com dois ponteiros: o inicio e o fim. - Mas como encapsulamos estes ponteiros em uma estrutura, fica fácil manter e compreender o código.&lt;/p&gt;  &lt;p&gt;Devemos ficar atento:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Devemos inserir os elementos no final da fila. Se for o primeiro elemento os dois ponteiros devem apontar para ele, caso contrário, o ponteiro “próximo” do ultimo elemento deve apontar para este novo elemento.&lt;/li&gt;    &lt;li&gt;Removemos elemento sempre do início da fila, se removermos todos, o ponteiro do último também deve ser “zerado”, se não, o ponteiro do inicio deve ser o “proximo” do item inicial atual.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Um pouco confuso, por isso testem.&lt;/p&gt;  &lt;p&gt;E para diversão fica:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Implemente a fila com uma estrutura de aluno, que tenha RA (inteiro), Nome (char de 50).&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Obrigado e bons estudos :D&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-6456834181756886661?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/6456834181756886661/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=6456834181756886661&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/6456834181756886661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/6456834181756886661'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2010/07/fila-dinamica.html' title='Fila Dinâmica'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_a2CzM_HCl5c/TE8EEog8ndI/AAAAAAAAApg/RM7i_rd5ZUw/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-5208061506702713562</id><published>2010-07-26T22:40:00.001-03:00</published><updated>2010-07-26T23:02:47.292-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>Pilha Dinâmica</title><content type='html'>&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TE443VIvxOI/AAAAAAAAAos/Pf9tPJ3vlIc/s1600-h/image%5B2%5D.png" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh4.ggpht.com/_a2CzM_HCl5c/TE444JmhJ0I/AAAAAAAAAow/0JYdNpSCpKE/image_thumb.png?imgmax=800" width="185" height="133" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Como já demonstrado antes &lt;a href="http://spokydev.blogspot.com/2010/06/listas-dinamicas-em-c.html" target="_blank"&gt;aqui&lt;/a&gt;, a linguagem C/C++ tem o potencial de alocar a memória do computador sobre demanda.&lt;/p&gt;  &lt;p&gt;Que tal aproveitarmos este potencial para criar uma pilha dinâmica?&lt;/p&gt;  &lt;p&gt;Para resolver isto vamos focar em alguns detalhes:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;A pilha é uma lista com restrição de entrada e saída, ou seja, é acessada pelo topo. &lt;/li&gt;    &lt;li&gt;Para inserir um elemento é necessário empilhar este elemento no topo da pilha. &lt;/li&gt;    &lt;li&gt;Para retirar um elemento, nos desempilhamos do topo da pilha. &lt;/li&gt;    &lt;li&gt;(… nem venham me falar que isto é redundante…) &lt;/li&gt;    &lt;li&gt;Então precisamos de manter um ponteiro para o topo da lista. &lt;/li&gt;    &lt;li&gt;Devemos criar uma estrutura (struct) que contenha o elemento, e um ponteiro para o próximo elemento (o que esta abaixo). &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Vejamos graficamente como funciona este conceito, acompanhe a imagem e o vídeo abaixo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TE444-plSYI/AAAAAAAAAo0/bPk9s6T8OuI/s1600-h/image%5B5%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TE445swS6VI/AAAAAAAAAo4/NhXuBdw4fCQ/image_thumb%5B1%5D.png?imgmax=800" width="200" height="127" /&gt;&lt;/a&gt; &lt;a href="http://lh4.ggpht.com/_a2CzM_HCl5c/TE446dK85jI/AAAAAAAAAo8/mejTFTEm8aM/s1600-h/image%5B8%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TE447NsUYvI/AAAAAAAAApA/_t2OzbGlBVs/image_thumb%5B2%5D.png?imgmax=800" width="200" height="127" /&gt;&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TE4478vxRAI/AAAAAAAAApE/p0cT485hl0M/s1600-h/image%5B11%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TE448TuHpnI/AAAAAAAAApI/IVqmgb2aGGM/image_thumb%5B3%5D.png?imgmax=800" width="200" height="127" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/7-9uR_Ox81k&amp;amp;hl=pt_BR&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/7-9uR_Ox81k&amp;amp;hl=pt_BR&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;  &lt;p&gt;Exemplos by: &lt;a href="http://mda.codeplex.com/"&gt;http://mda.codeplex.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Agora, com esta parte funcional esclarecida, vejamos um breve exemplo de código de uma pilha dinâmica em C, construída em cima da &lt;a href="http://spokydev.blogspot.com/2010/06/listas-dinamicas-em-c.html" target="_blank"&gt;lista dinâmica&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;#include &amp;lt;stdio.h&amp;gt;     &lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt; &lt;/p&gt;    &lt;p&gt;struct Item      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int numero;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; struct Item *proximo;      &lt;br /&gt;}; &lt;/p&gt;    &lt;p&gt;void Inicializar(Item **topo)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160; *topo = NULL;      &lt;br /&gt;} &lt;/p&gt;    &lt;p&gt;bool EstaVazia(Item **topo)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160; if(*topo == NULL)&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return true;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160; else&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return false;&amp;#160;&amp;#160; &lt;br /&gt;} &lt;/p&gt;    &lt;p&gt;void Empilhar(Item **topo, int elemento)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *novo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; novo = (Item *)malloc(sizeof(Item));&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; novo-&amp;gt;numero = elemento;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; novo-&amp;gt;proximo = *topo; // -&amp;gt; próximo recebe o elemento que estava no topo.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; *topo = novo;      &lt;br /&gt;} &lt;/p&gt;    &lt;p&gt;int Desempilhar(Item **topo)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160; int result;      &lt;br /&gt;&amp;#160;&amp;#160; Item *auxiliar;      &lt;br /&gt;&amp;#160;&amp;#160; if(EstaVazia(topo))      &lt;br /&gt;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;\n stack underflow! \n&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; exit(1);      &lt;br /&gt;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160; else // -&amp;gt; Elemento retirado do topo      &lt;br /&gt;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; result = (*topo)-&amp;gt;numero;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; auxiliar = *topo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; *topo = (*topo)-&amp;gt;proximo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; free(auxiliar);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return result;      &lt;br /&gt;&amp;#160;&amp;#160; }&amp;#160;&amp;#160; &lt;br /&gt;} &lt;/p&gt;    &lt;p&gt;void MostrarPilha(Item *topo)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int i = 0;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *item;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;\n\n Listando...\n\n&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;---------------------------------\n&amp;quot;); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; if (EstaVazia(&amp;amp;topo))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf (&amp;quot;A Pilha esta vazia!\n&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item = topo; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; while(item != NULL)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; i++;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;[%i] -&amp;gt; %i\n&amp;quot;, i, item-&amp;gt;numero);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item = item-&amp;gt;proximo;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;---------------------------------\n&amp;quot;);     &lt;br /&gt;} &lt;/p&gt;    &lt;p&gt;void Menu()     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;Digite a sua escolha: \n&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;#160;&amp;#160;&amp;#160; 1 empilhar elemento \n&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;#160;&amp;#160;&amp;#160; 2 desempilhar \n&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;#160;&amp;#160;&amp;#160; 3 para finalizar \n&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;? &amp;quot;);      &lt;br /&gt;} &lt;/p&gt;    &lt;p&gt;void main()     &lt;br /&gt;{&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *topo = NULL;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int opcao;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int numero; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Menu();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;%i&amp;quot;, &amp;amp;opcao); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; while (opcao != 3)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; switch (opcao)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case 1:      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;Digite um numero: &amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;\n%i&amp;quot;, &amp;amp;numero); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Empilhar(&amp;amp;topo, numero);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MostrarPilha(topo); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case 2:      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Desempilhar(&amp;amp;topo);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MostrarPilha(topo); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; default:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;Escolha invalida.\n\n&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Menu();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;%i&amp;quot;, &amp;amp;opcao);&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; system(&amp;quot;pause&amp;quot;);     &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_a2CzM_HCl5c/TE449EHTngI/AAAAAAAAApM/kAk0kl-vxhE/s1600-h/image%5B14%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TE4491zgOxI/AAAAAAAAApQ/F5wEXOIfepQ/image_thumb%5B4%5D.png?imgmax=800" width="124" height="133" /&gt;&lt;/a&gt; &lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TE44-Wn_psI/AAAAAAAAApU/6z0rrhTZp4M/s1600-h/image%5B17%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TE44-_oo4uI/AAAAAAAAApY/YyeclO1a36I/image_thumb%5B5%5D.png?imgmax=800" width="124" height="133" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Por ser uma lista com restrição, este exemplo chega a ser bem simples perto da lista dinâmica.&lt;/p&gt;  &lt;p&gt;Só vale ressaltar:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Para inserir, é necessário empilhar, ou seja: Alocar um novo item na memória, fazer com que o item do topo se torne o próximo do novo item, finalmente, o ponteiro do topo deve apontar para o novo elemento.&lt;/li&gt;    &lt;li&gt;Para remover, énecessário retirar o item do topo, assim: Criamos um ponteiro auxiliar que recebe o endereço de memória do conteúdo do topo, o topo deverá receber o próximo (dele mesmo), finalmente, liberamos a memória do conteúdo da variável auxiliar.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Hora da diversão:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Implemente a pilha com uma estrutura de aluno, que tenha RA (inteiro), Nome (char de 50).&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Obrigado, espero que tenha sido esclarecedor. :)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-5208061506702713562?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/5208061506702713562/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=5208061506702713562&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/5208061506702713562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/5208061506702713562'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2010/07/pilha-dinamica.html' title='Pilha Dinâmica'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_a2CzM_HCl5c/TE444JmhJ0I/AAAAAAAAAow/0JYdNpSCpKE/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-8944482412919219831</id><published>2010-07-22T08:54:00.001-03:00</published><updated>2010-07-22T08:55:18.234-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>Material Didático de Apoio para Aulas de Computação em C# e C++</title><content type='html'>&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_a2CzM_HCl5c/TEgxUgjG6eI/AAAAAAAAAoY/MpcM0oAgTjQ/s1600-h/MDA_myTree%5B2%5D.png" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="MDA_myTree" alt="MDA_myTree" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TEgxVIP9L4I/AAAAAAAAAoc/IGeZtKHXysE/MDA_myTree_thumb.png?imgmax=800" width="240" height="62" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Pesquisando um pouco para encontrar um material mais dinamico para minhas aulas, encontrei no codeplex este excelente material para aulas de algoritmos, principalmente de estrutura, pesquisa e ordenação de dados.&lt;/p&gt;  &lt;p&gt;Foi lembrado aos professores que a sala de aula hoje está munida de projetor e computador, e que o uso desse recurso traz uma dinamica melhor nas aulas.&lt;/p&gt;  &lt;p&gt;Tentando deixar um pouco de lado o giz, códigos, textos e desenhos maravilhosos de minha parte sobre pilhas, filhas, listas etc, tentei encontrar animações que mostrassem a dinamica destes algoritmos em seu funcionamento, trazendo uma compreensao mais visual e menos abstrata ao aluno.&lt;/p&gt;  &lt;p&gt;Procurando esse tipo de material eu encontrei isso:&lt;/p&gt;  &lt;p&gt;&lt;object width="640" height="505"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Tj0OIhmAUQo&amp;amp;hl=pt_BR&amp;amp;fs=1?color1=0xe1600f&amp;amp;color2=0xfebd01"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Tj0OIhmAUQo&amp;amp;hl=pt_BR&amp;amp;fs=1?color1=0xe1600f&amp;amp;color2=0xfebd01" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;  &lt;p&gt;Como vocês podem ver, é uma ferramenta que demonstra graficamente, juntamente com uma depuração de código do(C# e C++), o funcionamento de algoritmos de ordenação.&lt;/p&gt;  &lt;p&gt;Então, o MDA é um conjunto de ferramentas cujo objetivo é fornecer suporte ao ensino de alguns tópicos abordados em disciplinas de computação.    &lt;br /&gt;&lt;b&gt;Tópicos Abrangidos&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Estruturas de Dados      &lt;ul&gt;       &lt;li&gt;Árvores Binárias de Pesquisa &lt;/li&gt;        &lt;li&gt;Filas &lt;/li&gt;        &lt;li&gt;Listas Simplesmente Encadeadas &lt;/li&gt;        &lt;li&gt;Pilhas&lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;ul&gt;   &lt;li&gt;Algorítmos de Ordenação      &lt;ul&gt;       &lt;li&gt;Bubble Sort &lt;/li&gt;        &lt;li&gt;Heap Sort &lt;/li&gt;        &lt;li&gt;Insertion Sort &lt;/li&gt;        &lt;li&gt;Quick Sort &lt;/li&gt;        &lt;li&gt;Quick Sort Randômico &lt;/li&gt;        &lt;li&gt;Selection Sort &lt;/li&gt;        &lt;li&gt;Shell Sort&lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Desenvolvido por &lt;a href="http://ndos.codeplex.com/Wiki/View.aspx?title=B%u00e1rbara%20Bellaver&amp;amp;referringTitle=Home"&gt;Bárbara Bellaver&lt;/a&gt;, sob a orientação do Prof. &lt;a href="http://ndos.codeplex.com/Wiki/View.aspx?title=Manuel%20Menezes%20de%20Oliveira&amp;amp;referringTitle=Home"&gt;Manuel M. Oliveira&lt;/a&gt;, este projeto procura fornecer ferramentas que sejam de fácil utilização e que apresentem os tópicos acima de forma didática e clara.A linguagem utilizada para o desenvolvimento é a C#.&lt;/p&gt;  &lt;p&gt;Logo, para consegui-la, tive que entrar em contato com a Bárbara no Rio Grande do Sul, a qual me passou as informações da ferramenta e seu endereço no Codeplex: &lt;a title="http://mda.codeplex.com/" href="http://mda.codeplex.com/"&gt;http://mda.codeplex.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Lá é possível, baixar a ferramenta, testá-la e acompanhar a breve implementação dos códigos e seu funcionamento, além de um comparativo de vários algoritmos rodando ao mesmo tempo :)&lt;/p&gt;  &lt;p&gt;Parabéns pela iniciativa, estudem e divirtam-se!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TEgxWjboiBI/AAAAAAAAAok/h-3tbh66x6k/s1600-h/image%5B2%5D.png" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh3.ggpht.com/_a2CzM_HCl5c/TEgxXPuSwhI/AAAAAAAAAoo/AKoEkpgaM3g/image_thumb.png?imgmax=800" width="240" height="148" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-8944482412919219831?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/8944482412919219831/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=8944482412919219831&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/8944482412919219831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/8944482412919219831'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2010/07/material-didatico-de-apoio-para-aulas.html' title='Material Didático de Apoio para Aulas de Computação em C# e C++'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_a2CzM_HCl5c/TEgxVIP9L4I/AAAAAAAAAoc/IGeZtKHXysE/s72-c/MDA_myTree_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-4623781759558708296</id><published>2010-07-09T22:12:00.001-03:00</published><updated>2010-07-09T22:12:46.943-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Portfólio'/><title type='text'>Monografia – WebCrawlers: Ferramentas de Pesquisa, Catalogação e Indexação de Site</title><content type='html'>&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_a2CzM_HCl5c/TDfJCtfVFFI/AAAAAAAAAoQ/jv4rE40p_ZA/s1600-h/image%5B2%5D.png" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh5.ggpht.com/_a2CzM_HCl5c/TDfJDJxVz3I/AAAAAAAAAoU/EhtfH2CoRxw/image_thumb.png?imgmax=800" width="133" height="133" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Pessoal, como o prometido a muito tempo, estou abrindo minha monografia para pesquisa.&lt;/p&gt;  &lt;p&gt;Agora no mestrado pretendo aprimorá-la como nunca. Tenho grandes ideias e projetos… Basta eu concretizá-los.&lt;/p&gt;  &lt;p&gt;Em breve também abrirei o projeto com o código (que já está no apêndice).&lt;/p&gt;  &lt;p&gt;Espero que seja útil, e os animem com seus TCCs, Monografias e objetos de pesquisa. Espero o feedback também, para que eu possa sempre aprimorar meu trabalho.&lt;/p&gt;  &lt;p&gt;A monografia fala por si mesma, mas para os curiosos e ansiosos, ela explica o funcionamento do google, bing etc. Basicamente eu implementei e expliquei os crawlers, ou webcrawlers: que são programas que funcionam como um robozinho que fica visitando as páginas, colhendo seu conteúdo, e navegando pelos links da mesma.&lt;/p&gt;  &lt;p&gt;Um fato curioso e engraçado é que, quando eu rodava uma média de 100 crawlers, eu acabava derrubando a internet do lugar, seja laboratório de informática da faculdade, ou escritório de trabalho. :D Outra curiosidade é que, na época, quando eu rodava a aplicação em casa, demorava 1h para eu colher 40000 sites. Na faculdade foram poucos minutos, o que me deixou extasiado na apresentação… Foi bem hilário também :)&lt;/p&gt;  &lt;p&gt;Bem, agora me resta aprimorar, fazendo a catalogação do conteúdo, busca fonética e baseada na posição geográfica.&lt;/p&gt;  &lt;p&gt;Desejem-me sorte!&lt;/p&gt;  &lt;p&gt;&lt;a style="margin: 12px auto 6px; display: block; font: 14px helvetica,arial,sans-serif; text-decoration: underline; font-size-adjust: none; font-stretch: normal; -x-system-font: none" title="View Monografia - Eduardo Spaki - Final on Scribd" href="http://www.scribd.com/doc/34134196/Monografia-Eduardo-Spaki-Final"&gt;Monografia - Eduardo Spaki - Final&lt;/a&gt; &lt;object id="doc_104949616468767" name="doc_104949616468767" height="600" width="100%" type="application/x-shockwave-flash" data="http://d1.scribdassets.com/ScribdViewer.swf" style="outline:none;" &gt;		&lt;param name="movie" value="http://d1.scribdassets.com/ScribdViewer.swf"&gt;		&lt;param name="wmode" value="opaque"&gt; 		&lt;param name="bgcolor" value="#ffffff"&gt; 		&lt;param name="allowFullScreen" value="true"&gt; 		&lt;param name="allowScriptAccess" value="always"&gt; 		&lt;param name="FlashVars" value="document_id=34134196&amp;amp;access_key=key-bvp5a2fftijyaoo3qbq&amp;amp;page=1&amp;amp;viewMode=list"&gt; 		&lt;embed id="doc_104949616468767" name="doc_104949616468767" src="http://d1.scribdassets.com/ScribdViewer.swf?document_id=34134196&amp;amp;access_key=key-bvp5a2fftijyaoo3qbq&amp;amp;page=1&amp;amp;viewMode=list" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="600" width="100%" wmode="opaque" bgcolor="#ffffff"&gt;&lt;/embed&gt; 	&lt;/object&gt;&lt;/p&gt;  &lt;p&gt;&lt;a style="margin: 12px auto 6px; display: block; font: 14px helvetica,arial,sans-serif; text-decoration: underline; font-size-adjust: none; font-stretch: normal; -x-system-font: none" title="View Monografia - Eduardo Spaki - Final on Scribd" href="http://www.scribd.com/doc/34134419/Monografia-Eduardo-Spaki-Final"&gt;Monografia - Eduardo Spaki - Final&lt;/a&gt; &lt;object id="doc_181328013114306" name="doc_181328013114306" height="600" width="100%" type="application/x-shockwave-flash" data="http://d1.scribdassets.com/ScribdViewer.swf" style="outline:none;" &gt;		&lt;param name="movie" value="http://d1.scribdassets.com/ScribdViewer.swf"&gt;		&lt;param name="wmode" value="opaque"&gt; 		&lt;param name="bgcolor" value="#ffffff"&gt; 		&lt;param name="allowFullScreen" value="true"&gt; 		&lt;param name="allowScriptAccess" value="always"&gt; 		&lt;param name="FlashVars" value="document_id=34134419&amp;amp;access_key=key-1c3lqsasou9mkerh5djt&amp;amp;page=1&amp;amp;viewMode=list"&gt; 		&lt;embed id="doc_181328013114306" name="doc_181328013114306" src="http://d1.scribdassets.com/ScribdViewer.swf?document_id=34134419&amp;amp;access_key=key-1c3lqsasou9mkerh5djt&amp;amp;page=1&amp;amp;viewMode=list" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="600" width="100%" wmode="opaque" bgcolor="#ffffff"&gt;&lt;/embed&gt; 	&lt;/object&gt;&lt;/p&gt;  &lt;p&gt;;D&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1390797061973650137-4623781759558708296?l=eduardospaki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardospaki.blogspot.com/feeds/4623781759558708296/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1390797061973650137&amp;postID=4623781759558708296&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/4623781759558708296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1390797061973650137/posts/default/4623781759558708296'/><link rel='alternate' type='text/html' href='http://eduardospaki.blogspot.com/2010/07/monografia-webcrawlers-ferramentas-de.html' title='Monografia – WebCrawlers: Ferramentas de Pesquisa, Catalogação e Indexação de Site'/><author><name>Eduardo Spaki</name><uri>http://www.blogger.com/profile/14975879357234325617</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-ypZucBnXr48/TgUrhJ1glVI/AAAAAAAAA5c/QfRKWxv_Hyo/s220/203050_1647027338_52876_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_a2CzM_HCl5c/TDfJDJxVz3I/AAAAAAAAAoU/EhtfH2CoRxw/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1390797061973650137.post-6455856346513085434</id><published>2010-06-22T23:33:00.001-03:00</published><updated>2010-06-22T23:33:53.019-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>Listas Dinâmicas em C</title><content type='html'>&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_a2CzM_HCl5c/TCFyc4uXKSI/AAAAAAAAAnw/y8_0VRVw2pw/s1600-h/image%5B21%5D.png" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TCFye5EdsOI/AAAAAAAAAn0/jVHvY07iXvY/image_thumb%5B15%5D.png?imgmax=800" width="373" height="275" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Tendo em vista que a Linguagem C proporciona mecanismos de alocação dinâmica de memória, porque limitar a lista a um vetor de tamanho definido?&lt;/p&gt;  &lt;p&gt;Tornasse interessante o fato de utilizar a memória disponível do computador para montarmos uma lista.&lt;/p&gt;  &lt;p&gt;Para que isto seja possível temos que ter em mente algumas coisinhas:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Não vamos precisar de um vetor para a estrutura de dados da lista.&lt;/li&gt;    &lt;li&gt;Cada item da lista terá um ponteiro para o próximo item.&lt;/li&gt;    &lt;li&gt;Acessaremos a lista a partir do início dela (cabeça). Este item estará em um ponteiro.&lt;/li&gt;    &lt;li&gt;Para modificarmos a lista, devemos passar o primeiro item por referência, para que toda alteração nele reflita no contexto geral. Logo teremos um ponteiro de ponteiro.&lt;/li&gt;    &lt;li&gt;Se a lista esta vazia o ponteiro da cabeça será nulo.&lt;/li&gt;    &lt;li&gt;O último elemento terá o ponteiro nulo, pois não há próximo item. Para isso damos o nome de Terra.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Graficamente, podemos representar uma lista assim:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_a2CzM_HCl5c/TCFyfTKGPvI/AAAAAAAAAn4/pCbDqTssl4E/s1600-h/image%5B7%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh5.ggpht.com/_a2CzM_HCl5c/TCFygsPZGTI/AAAAAAAAAn8/K77Y8JB07uM/image_thumb%5B3%5D.png?imgmax=800" width="598" height="182" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Como havia dito, teremos apenas um ponteiro para a cabeça, sendo assim, observe a figura a seguir e acompanhe o raciocínio já proposto:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_a2CzM_HCl5c/TCFyhsEQFtI/AAAAAAAAAoA/7bb5gMSa3ew/s1600-h/image%5B12%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh6.ggpht.com/_a2CzM_HCl5c/TCFyiH_cX-I/AAAAAAAAAoE/gSRLmFu_P9k/image_thumb%5B6%5D.png?imgmax=800" width="492" height="469" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Então é fundamental estar bem afiado em ponteiros para implementar uma estrutura de dados desta. Vamos à uma breve implementação de uma lista dinâmica:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;#include &amp;lt;stdio.h&amp;gt;     &lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt; &lt;/p&gt;    &lt;p&gt;struct Item      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int numero;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; struct Item *proximo;      &lt;br /&gt;}; &lt;/p&gt;    &lt;p&gt;bool Inserir(Item **cabeca, int valor)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *novo, *anterior, *atual; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Aloca memória para o novo item     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; novo = (Item *)malloc(sizeof(Item)); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Checa se foi alocado memória corretamente.     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (novo != NULL)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Define e inicializa os valores.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; novo-&amp;gt;numero = valor;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; novo-&amp;gt;proximo = NULL;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; anterior = NULL;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; atual = *cabeca; // -&amp;gt; Atual é o ponteiro para o item da cabeça &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Ordenação     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //&amp;#160;&amp;#160;&amp;#160; Verifica se a posição atual não é nula (início ou fim)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //&amp;#160;&amp;#160;&amp;#160; Verifica se o valor é maior do que o número do item.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; while (atual != NULL &amp;amp;&amp;amp; valor &amp;gt; atual-&amp;gt;numero)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; anterior = atual;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; atual = atual-&amp;gt;proximo;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Se não há posição anterior, então o novo item será a cabeça.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (anterior == NULL)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; novo-&amp;gt;proximo = *cabeca; // -&amp;gt; recebe o que já tem na cabeça.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; *cabeca = novo; // -&amp;gt;&amp;#160; cabeça nova.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else // -&amp;gt; Arranjando posição no meio da lista... Remanejando.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Elemento anterior aponta para o novo.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; anterior-&amp;gt;proximo = novo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Novo elemento aponta para o resto da lista.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; novo-&amp;gt;proximo = atual;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return true;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return false;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;}&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p&gt;bool Remover(Item **cabeca, int valor)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *anterior, *atual, *itemRemover; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; anterior = NULL;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; atual = *cabeca; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Procura o valor.     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; while(atual != NULL &amp;amp;&amp;amp; atual-&amp;gt;numero != valor)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; anterior = atual;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; atual = atual-&amp;gt;proximo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Quando encontra o valor.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if(atual != NULL)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; itemRemover = atual; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(anterior != NULL)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Encurta o caminho.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; anterior-&amp;gt;proximo = atual-&amp;gt;proximo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else // -&amp;gt; Quando o item é a cabeça.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Ela recebe o próximo do primeiro item.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; *cabeca = (*cabeca)-&amp;gt;proximo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // -&amp;gt; Libera da memória o item excluído.     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; free(itemRemover); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return true;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; return false;     &lt;br /&gt;} &lt;/p&gt;    &lt;p&gt;bool EstaVazia(Item *cabeca)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return cabeca == NULL;      &lt;br /&gt;} &lt;/p&gt;    &lt;p&gt;void Listar(Item *cabeca)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (EstaVazia(cabeca))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot; A lista esta vazia.\n\n&amp;quot; );      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;Listando... \n&amp;quot;); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; while(cabeca != NULL)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;%i --&amp;gt; &amp;quot;, cabeca-&amp;gt;numero);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; cabeca = cabeca-&amp;gt;proximo;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;NULL\n\n&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;} &lt;/p&gt;    &lt;p&gt;void Menu()     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;Digite a sua escolha: \n&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;#160;&amp;#160;&amp;#160; 1 para inserir um elemento na lista \n&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;#160;&amp;#160;&amp;#160; 2 para remover um elemento da lista \n&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;#160;&amp;#160;&amp;#160; 3 para finalizar \n&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;? &amp;quot;);      &lt;br /&gt;} &lt;/p&gt;    &lt;p&gt;void main()     &lt;br /&gt;{&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item *cabeca = NULL;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int opcao;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int numero; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Menu();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;%i&amp;quot;, &amp;amp;opcao); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; while (opcao != 3)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; switch (opcao)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case 1:      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;Digite um numero: &amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;\n%i&amp;quot;, &amp;amp;numero); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Inserir(&amp;amp;cabeca, numero); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Listar(cabeca); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case 2:      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (!EstaVazia(cabeca))       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot; Digite o numero a ser removido: &amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; scanf( &amp;quot;\n%i&amp;quot;, &amp;amp;numero); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (Remover(&amp;amp;cabeca, numero))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;%i removido. \n&amp;quot;, numero); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Listar(cabeca);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot; %c não encontrado. \n\n&amp;quot;, numero);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;A Lista está vazia. \n\n&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; default:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;Escolha invalida.\n\n&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Menu();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;%i&amp;quot;, &amp;amp;opcao);&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;Fim do programa.\n&amp;quot;);      &lt;br /&gt;} &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_a2CzM_HCl5c/TCFyjHa0UbI/AAAAAAAAAoI/XwUuuyyHS98/s1600-h/image%5B17%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh4.ggpht.com/_a2CzM_HCl5c/TCFyjzyrbpI/AAAAAAAAAoM/2fTT6BR6O8M/image_thumb%5B13%5D.png?imgmax=800" width="375" height="336" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;OK, concordo que não foi tão breve assim…&lt;/p&gt;  &lt;p&gt;Mas, este é o exemplo de uma lista de inteiros ordenada!&lt;/p&gt;  &lt;p&gt;Antes de tudo temos um novo operador, o: –&amp;gt;&lt;/p&gt;  &lt;p&gt;Este operador é um indicador, ou seja, indica direto para o dado dentro do ponteiro, sem o uso do “*”. Ele é o equivalente a fazermos: (*novo).numero = valor;&lt;/p&gt;  &lt;p&gt;Explicando então este có
